diff --git a/src/plugins/coreplugin/idocument.cpp b/src/plugins/coreplugin/idocument.cpp
index 1ed0804b1df430be9650d0e957d408bdbc63b8f2..4764802d74c6728efe11630528f9e5112ee912a6 100644
--- a/src/plugins/coreplugin/idocument.cpp
+++ b/src/plugins/coreplugin/idocument.cpp
@@ -150,6 +150,15 @@ IDocument::OpenResult IDocument::open(QString *errorString, const QString &fileN
     return OpenResult::CannotHandle;
 }
 
+/*!
+ * Returns the current contents of the document. The base implementation returns an empty
+ * QByteArray.
+ */
+QByteArray IDocument::contents() const
+{
+    return QByteArray();
+}
+
 /*!
     Used for example by EditorManager::openEditorWithContents() to set the contents
     of this document.
diff --git a/src/plugins/coreplugin/idocument.h b/src/plugins/coreplugin/idocument.h
index d173a6b0bb2c4717e739ae136e84afe063d1c77c..a2d250250fdb7b6aa2c64704debfd3472996abcf 100644
--- a/src/plugins/coreplugin/idocument.h
+++ b/src/plugins/coreplugin/idocument.h
@@ -95,6 +95,8 @@ public:
     virtual OpenResult open(QString *errorString, const QString &fileName, const QString &realFileName);
 
     virtual bool save(QString *errorString, const QString &fileName = QString(), bool autoSave = false) = 0;
+
+    virtual QByteArray contents() const;
     virtual bool setContents(const QByteArray &contents);
 
     const Utils::FileName &filePath() const;
@@ -133,7 +135,12 @@ public:
     InfoBar *infoBar();
 
 signals:
+    // For meta data changes: file name, modified state, ...
     void changed();
+
+    // For changes in the contents of the document
+    void contentsChanged();
+
     void mimeTypeChanged();
 
     void aboutToReload();