diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
index 785afb159ef702bb18ccebe8f337f757064f1cf0..3e00ededb31d0315a6b7c5741ca9c6e8f1a080a9 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
@@ -74,14 +74,12 @@ using namespace ProjectExplorer;
 AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fileName) :
     m_manager(manager),
     m_fileName(fileName),
-    m_files(),
-    m_file(new AutotoolsProjectFile(this, m_fileName)),
-    m_rootNode(new AutotoolsProjectNode(m_file->filePath())),
     m_fileWatcher(new Utils::FileSystemWatcher(this)),
-    m_watchedFiles(),
     m_makefileParserThread(0)
 {
     setId(Constants::AUTOTOOLS_PROJECT_ID);
+    setDocument(new AutotoolsProjectFile(m_fileName));
+    m_rootNode = new AutotoolsProjectNode(projectFilePath());
     setProjectContext(Core::Context(Constants::PROJECT_CONTEXT));
     setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
 
@@ -112,11 +110,6 @@ QString AutotoolsProject::displayName() const
     return m_projectName;
 }
 
-Core::IDocument *AutotoolsProject::document() const
-{
-    return m_file;
-}
-
 IProjectManager *AutotoolsProject::projectManager() const
 {
     return m_manager;
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.h b/src/plugins/autotoolsprojectmanager/autotoolsproject.h
index 26d7bad76ed2bebcedce7dbe9dc2124df7132627..03787ecb981e5887ac3924c336840a106a2f1116 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsproject.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.h
@@ -74,10 +74,9 @@ public:
     ~AutotoolsProject() override;
 
     QString displayName() const override;
-    Core::IDocument *document() const override;
     ProjectExplorer::IProjectManager *projectManager() const override;
     ProjectExplorer::ProjectNode *rootProjectNode() const override;
-    QStringList files(FilesMode fileMode) const;
+    QStringList files(FilesMode fileMode) const override;
     static QString defaultBuildDirectory(const QString &projectPath);
     QStringList buildTargets() const;
 
@@ -147,9 +146,6 @@ private:
     /// Return value for AutotoolsProject::files()
     QStringList m_files;
 
-    /// Return value for AutotoolsProject::file()
-    AutotoolsProjectFile *m_file;
-
     /// Return value for AutotoolsProject::rootProjectNode()
     AutotoolsProjectNode *m_rootNode;
 
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
index 0669e4a752830f5ffb72fbf51221240ec4379e16..84a2790d76423ef04ab32d6c172a84f17ed2cb30 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
@@ -37,9 +37,7 @@
 using namespace AutotoolsProjectManager;
 using namespace AutotoolsProjectManager::Internal;
 
-AutotoolsProjectFile::AutotoolsProjectFile(AutotoolsProject *project, const QString &fileName) :
-    Core::IDocument(project),
-    m_project(project)
+AutotoolsProjectFile::AutotoolsProjectFile(const QString &fileName)
 {
     setId("Autotools.ProjectFile");
     setMimeType(QLatin1String(Constants::MAKEFILE_MIMETYPE));
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h
index d4ee86c6757ded869c44481df0f103beb4f49b2d..6e3bb27ec0b53f9ae8ffc42f811c04b5f5c5c3f9 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h
@@ -55,7 +55,7 @@ class AutotoolsProjectFile : public Core::IDocument
     Q_OBJECT
 
 public:
-    AutotoolsProjectFile(AutotoolsProject *project, const QString &fileName);
+    AutotoolsProjectFile(const QString &fileName);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave) override;
     QString defaultPath() const override;
@@ -63,9 +63,6 @@ public:
     bool isModified() const override;
     bool isSaveAsAllowed() const override;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type) override;
-
-private:
-    AutotoolsProject *m_project;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakefile.cpp b/src/plugins/cmakeprojectmanager/cmakefile.cpp
index 6812c3f2dfc6db170df03c80b8021beb725ac2c8..d0c49d237799f0ce375863a52b4e080c35495fe2 100644
--- a/src/plugins/cmakeprojectmanager/cmakefile.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakefile.cpp
@@ -39,8 +39,7 @@ using namespace Utils;
 namespace CMakeProjectManager {
 namespace Internal {
 
-CMakeFile::CMakeFile(CMakeProject *parent, const FileName &fileName)
-    : Core::IDocument(parent), m_project(parent)
+CMakeFile::CMakeFile(const FileName &fileName)
 {
     setId("Cmake.ProjectFile");
     setMimeType(QLatin1String(Constants::CMAKEPROJECTMIMETYPE));
diff --git a/src/plugins/cmakeprojectmanager/cmakefile.h b/src/plugins/cmakeprojectmanager/cmakefile.h
index 441cdadcc65dceb145b452eaabf147af03187640..76a65ba8fe5043da16fcf9be3ac4371858f7e5c2 100644
--- a/src/plugins/cmakeprojectmanager/cmakefile.h
+++ b/src/plugins/cmakeprojectmanager/cmakefile.h
@@ -42,7 +42,7 @@ class CMakeFile : public Core::IDocument
 {
     Q_OBJECT
 public:
-    CMakeFile(CMakeProject *parent, const Utils::FileName &fileName);
+    CMakeFile(const Utils::FileName &fileName);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave) override;
 
@@ -54,9 +54,6 @@ public:
 
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const override;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type) override;
-
-private:
-    CMakeProject *m_project;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index a508ac641868aee0b281bfeeab6270194ccaf097..ff9a747aed8efff0e651e34ddd1d2a1044188ea2 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -95,13 +95,12 @@ CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName)
       m_watcher(new QFileSystemWatcher(this))
 {
     setId(Constants::CMAKEPROJECT_ID);
+    setDocument(new CMakeFile(fileName));
     setProjectContext(Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT));
     setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
 
     m_rootNode->setDisplayName(fileName.parentDir().fileName());
 
-    m_file = new CMakeFile(this, fileName);
-
     connect(this, &CMakeProject::buildTargetsChanged, this, &CMakeProject::updateRunConfigurations);
     connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &CMakeProject::fileChanged);
 }
@@ -512,11 +511,6 @@ QString CMakeProject::displayName() const
     return m_rootNode->displayName();
 }
 
-Core::IDocument *CMakeProject::document() const
-{
-    return m_file;
-}
-
 IProjectManager *CMakeProject::projectManager() const
 {
     return m_manager;
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 3e8154ca72262f570471b276c12df976001298f6..a70a22db89c2156b302d36a2124605227319c3f7 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -99,7 +99,6 @@ public:
     ~CMakeProject() override;
 
     QString displayName() const override;
-    Core::IDocument *document() const override;
     ProjectExplorer::IProjectManager *projectManager() const override;
 
     ProjectExplorer::ProjectNode *rootProjectNode() const override;
@@ -151,7 +150,6 @@ private:
     Internal::CMakeManager *m_manager;
     ProjectExplorer::Target *m_activeTarget;
     Utils::FileName m_fileName;
-    Internal::CMakeFile *m_file;
 
     // TODO probably need a CMake specific node structure
     Internal::CMakeProjectNode *m_rootNode;
diff --git a/src/plugins/cpptools/modelmanagertesthelper.h b/src/plugins/cpptools/modelmanagertesthelper.h
index 255447b51aa63ff2b3488602fea61259fd6bfb1e..2c8b236d479ed938cfaa7d3ce124ada945c3ca68 100644
--- a/src/plugins/cpptools/modelmanagertesthelper.h
+++ b/src/plugins/cpptools/modelmanagertesthelper.h
@@ -50,7 +50,6 @@ public:
     ~TestProject() override;
 
     QString displayName() const override { return m_name; }
-    Core::IDocument *document() const override { return 0; }
     ProjectExplorer::IProjectManager *projectManager() const override { return 0; }
     ProjectExplorer::ProjectNode *rootProjectNode() const override { return 0; }
 
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 9cf55a6c3871d36d3b0bc0f876ad7f22c837dca6..cbee9bed08397d5ac5c4b1e52ac1b93b63231d72 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -72,6 +72,7 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
       m_fileName(fileName)
 {
     setId(Constants::GENERICPROJECT_ID);
+    setDocument(new GenericProjectFile(this, m_fileName, GenericProject::Everything));
     setProjectContext(Context(GenericProjectManager::Constants::PROJECTCONTEXT));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
 
@@ -83,12 +84,11 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
     m_includesFileName = QFileInfo(dir, m_projectName + QLatin1String(".includes")).absoluteFilePath();
     m_configFileName   = QFileInfo(dir, m_projectName + QLatin1String(".config")).absoluteFilePath();
 
-    m_creatorIDocument  = new GenericProjectFile(this, m_fileName, GenericProject::Everything);
     m_filesIDocument    = new GenericProjectFile(this, m_filesFileName, GenericProject::Files);
     m_includesIDocument = new GenericProjectFile(this, m_includesFileName, GenericProject::Configuration);
     m_configIDocument   = new GenericProjectFile(this, m_configFileName, GenericProject::Configuration);
 
-    DocumentManager::addDocument(m_creatorIDocument);
+    DocumentManager::addDocument(document());
     DocumentManager::addDocument(m_filesIDocument);
     DocumentManager::addDocument(m_includesIDocument);
     DocumentManager::addDocument(m_configIDocument);
@@ -388,11 +388,6 @@ QString GenericProject::displayName() const
     return m_projectName;
 }
 
-IDocument *GenericProject::document() const
-{
-    return m_creatorIDocument;
-}
-
 IProjectManager *GenericProject::projectManager() const
 {
     return m_manager;
@@ -451,8 +446,8 @@ Project::RestoreResult GenericProject::fromMap(const QVariantMap &map, QString *
 //
 ////////////////////////////////////////////////////////////////////////////////////
 
-GenericProjectFile::GenericProjectFile(GenericProject *parent, QString fileName, GenericProject::RefreshOptions options)
-    : IDocument(parent),
+GenericProjectFile::GenericProjectFile(GenericProject *parent, QString fileName,
+                                       GenericProject::RefreshOptions options) :
       m_project(parent),
       m_options(options)
 {
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 0d2f1827d0a47bc3be4c7a830548365023b27f7b..24f44041cab0e376ea57441adbaf7b7e41fa9073 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -61,7 +61,6 @@ public:
     QString configFileName() const;
 
     QString displayName() const override;
-    Core::IDocument *document() const override;
     ProjectExplorer::IProjectManager *projectManager() const override;
 
     GenericProjectNode *rootProjectNode() const override;
@@ -103,7 +102,6 @@ private:
     QString m_includesFileName;
     QString m_configFileName;
     QString m_projectName;
-    GenericProjectFile *m_creatorIDocument;
     GenericProjectFile *m_filesIDocument;
     GenericProjectFile *m_includesIDocument;
     GenericProjectFile *m_configIDocument;
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 30e1b18acc92a81ba1f06df0d066dd7bec40fd5f..f7dfbb55009673467a04c43cdd72edb1e03c44c7 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -90,17 +90,17 @@ namespace ProjectExplorer {
 class ProjectPrivate
 {
 public:
-    ProjectPrivate();
     ~ProjectPrivate();
 
     Core::Id m_id;
+    Core::IDocument *m_document = 0;
     QList<Target *> m_targets;
-    Target *m_activeTarget;
+    Target *m_activeTarget = 0;
     EditorConfiguration m_editorConfiguration;
     Core::Context m_projectContext;
     Core::Context m_projectLanguages;
     QVariantMap m_pluginSettings;
-    Internal::UserFileAccessor *m_accessor;
+    Internal::UserFileAccessor *m_accessor = 0;
 
     KitMatcher m_requiredKitMatcher;
     KitMatcher m_preferredKitMatcher;
@@ -108,13 +108,11 @@ public:
     Utils::MacroExpander m_macroExpander;
 };
 
-ProjectPrivate::ProjectPrivate() :
-    m_activeTarget(0),
-    m_accessor(0)
-{ }
-
 ProjectPrivate::~ProjectPrivate()
-{ delete m_accessor; }
+{
+    delete m_accessor;
+    delete m_document;
+}
 
 Project::Project() : d(new ProjectPrivate)
 {
@@ -135,8 +133,15 @@ Core::Id Project::id() const
     return d->m_id;
 }
 
+Core::IDocument *Project::document() const
+{
+    QTC_CHECK(d->m_document);
+    return d->m_document;
+}
+
 Utils::FileName Project::projectFilePath() const
 {
+    QTC_ASSERT(document(), return Utils::FileName());
     return document()->filePath();
 }
 
@@ -412,6 +417,13 @@ void Project::setId(Core::Id id)
     d->m_id = id;
 }
 
+void Project::setDocument(Core::IDocument *doc)
+{
+    QTC_ASSERT(doc, return);
+    QTC_ASSERT(!d->m_document, return);
+    d->m_document = doc;
+}
+
 Target *Project::restoreTarget(const QVariantMap &data)
 {
     Core::Id id = idFromMap(data);
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 6f08a7fe36f9534fc38f7a8056604bda2c3a2d6c..b8fbf1ac3f1265ec0c9842b4bff12dc1089057ae 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -79,10 +79,14 @@ public:
 
     virtual QString displayName() const = 0;
     Core::Id id() const;
-    virtual Core::IDocument *document() const = 0;
-    virtual IProjectManager *projectManager() const = 0;
 
+    Core::IDocument *document() const;
     Utils::FileName projectFilePath() const;
+    // The directory that holds the project. This includes the absolute path.
+    Utils::FileName projectDirectory() const;
+    static Utils::FileName projectDirectory(const Utils::FileName &top);
+
+    virtual IProjectManager *projectManager() const = 0;
 
     bool hasActiveBuildSettings() const;
 
@@ -119,10 +123,6 @@ public:
 
     virtual QVariantMap toMap() const;
 
-    // The directory that holds the project. This includes the absolute path.
-    Utils::FileName projectDirectory() const;
-    static Utils::FileName projectDirectory(const Utils::FileName &top);
-
     Core::Context projectContext() const;
     Core::Context projectLanguages() const;
 
@@ -173,6 +173,7 @@ protected:
     virtual bool setupTarget(Target *t);
 
     void setId(Core::Id id);
+    void setDocument(Core::IDocument *doc); // takes ownership!
     void setProjectContext(Core::Context context);
     void setProjectLanguages(Core::Context language);
     void addProjectLanguage(Core::Id id);
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 4636fea507ce9d489df87b97d7f3d553160fdc63..4968b065a88065a404d3ef1179f4b791e599ce09 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1282,8 +1282,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
         [this]() -> QString {
             Utils::FileName projectFilePath;
             if (Project *project = ProjectTree::currentProject())
-                if (IDocument *doc = project->document())
-                    projectFilePath = doc->filePath();
+                projectFilePath = project->projectFilePath();
             return projectFilePath.toString();
         });
 
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 8e9bcbc1bb0e3f020157d395a90bdca7753c2a5a..582f98b3491868d69ffb6206b3a03715e397ac7a 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -1027,7 +1027,7 @@ bool SessionManager::loadSession(const QString &session)
     auto end = oldProjects.end();
 
     while (it != end) {
-        int index = fileList.indexOf((*it)->document()->filePath().toString());
+        int index = fileList.indexOf((*it)->projectFilePath().toString());
         if (index != -1) {
             fileList.removeAt(index);
             it = oldProjects.erase(it);
diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp
index ce9dfe0193a8ac816f256ddc19ab53f2b8f7e5d6..d6485c6e8019451b476a84bc7c120daf6c62970f 100644
--- a/src/plugins/pythoneditor/pythoneditorplugin.cpp
+++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp
@@ -249,7 +249,6 @@ public:
     ~PythonProject() override;
 
     QString displayName() const override { return m_projectName; }
-    IDocument *document() const override;
     IProjectManager *projectManager() const override { return m_manager; }
 
     ProjectNode *rootProjectNode() const override;
@@ -274,7 +273,6 @@ private:
     PythonProjectManager *m_manager;
     QString m_projectFileName;
     QString m_projectName;
-    PythonProjectFile *m_document;
     QStringList m_rawFileList;
     QStringList m_files;
     QHash<QString, QString> m_rawListEntries;
@@ -285,9 +283,7 @@ private:
 class PythonProjectFile : public Core::IDocument
 {
 public:
-    PythonProjectFile(PythonProject *parent, QString fileName)
-        : IDocument(parent),
-          m_project(parent)
+    PythonProjectFile(PythonProject *parent, QString fileName) : m_project(parent)
     {
         setId("Generic.ProjectFile");
         setMimeType(QLatin1String(PythonMimeType));
@@ -626,16 +622,15 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
       m_projectFileName(fileName)
 {
     setId(PythonProjectId);
+    setDocument(new PythonProjectFile(this, m_projectFileName));
+    DocumentManager::addDocument(document());
+
     setProjectContext(Context(PythonProjectContext));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
 
     QFileInfo fileInfo(m_projectFileName);
 
     m_projectName = fileInfo.completeBaseName();
-    m_document = new PythonProjectFile(this, m_projectFileName);
-
-    DocumentManager::addDocument(m_document);
-
     m_rootNode = new PythonProjectNode(this);
 
     m_manager->registerProject(this);
@@ -648,11 +643,6 @@ PythonProject::~PythonProject()
     delete m_rootNode;
 }
 
-IDocument *PythonProject::document() const
-{
-    return m_document;
-}
-
 static QStringList readLines(const QString &absoluteFileName)
 {
     QStringList lines;
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index a6199608211cc6d43545e75f5ce7a0340be7e68b..c895b8097b05f29d8141112331ef44adb8e3abad 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -113,6 +113,10 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
     m_parsingDelay.setInterval(1000); // delay parsing by 1s.
 
     setId(Constants::PROJECT_ID);
+
+    setDocument(new QbsProjectFile(this, m_fileName));
+    DocumentManager::addDocument(document());
+
     setProjectContext(Context(Constants::PROJECT_ID));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
 
@@ -124,8 +128,6 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
 
     connect(&m_parsingDelay, SIGNAL(timeout()), this, SLOT(startParsing()));
 
-    updateDocuments(QSet<QString>() << fileName);
-
     // NOTE: QbsProjectNode does not use this as a parent!
     m_rootProjectNode = new QbsRootProjectNode(this); // needs documents to be initialized!
 }
@@ -153,15 +155,6 @@ QString QbsProject::displayName() const
     return m_projectName;
 }
 
-IDocument *QbsProject::document() const
-{
-    foreach (IDocument *doc, m_qbsDocuments) {
-        if (doc->filePath().toString() == m_fileName)
-            return doc;
-    }
-    QTC_ASSERT(false, return 0);
-}
-
 QbsManager *QbsProject::projectManager() const
 {
     return m_manager;
diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h
index 3558c2e81e5f528f6adaa57e75bfd065b053f668..a69fbce1ce159f9fc119a7e59a2d1ebdb56c501d 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.h
+++ b/src/plugins/qbsprojectmanager/qbsproject.h
@@ -66,7 +66,6 @@ public:
     ~QbsProject() override;
 
     QString displayName() const override;
-    Core::IDocument *document() const override;
     QbsManager *projectManager() const override;
 
     ProjectExplorer::ProjectNode *rootProjectNode() const override;
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index b5e81d30b0ef59fd8f861cdca6b4d936a04b6e79..53b244ef2fd3518c5beb88cf19bf125cddde242f 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -98,7 +98,7 @@ class QmakeProjectFile : public Core::IDocument
     Q_OBJECT
 
 public:
-    QmakeProjectFile(const QString &filePath, QObject *parent = 0);
+    QmakeProjectFile(const QString &filePath);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave) override;
 
@@ -251,8 +251,7 @@ void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode)
 
 // ----------- QmakeProjectFile
 namespace Internal {
-QmakeProjectFile::QmakeProjectFile(const QString &filePath, QObject *parent)
-    : Core::IDocument(parent)
+QmakeProjectFile::QmakeProjectFile(const QString &filePath)
 {
     setId("Qmake.ProFile");
     setMimeType(QLatin1String(QmakeProjectManager::Constants::PROFILE_MIMETYPE));
@@ -310,11 +309,11 @@ bool QmakeProjectFile::reload(QString *errorString, ReloadFlag flag, ChangeType
 
 QmakeProject::QmakeProject(QmakeManager *manager, const QString &fileName) :
     m_manager(manager),
-    m_fileInfo(new QmakeProjectFile(fileName, this)),
     m_projectFiles(new QmakeProjectFiles),
     m_qmakeVfs(new QMakeVfs)
 {
     setId(Constants::QMAKEPROJECT_ID);
+    setDocument(new QmakeProjectFile(fileName));
     setProjectContext(Core::Context(QmakeProjectManager::Constants::PROJECT_ID));
     setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
     setRequiredKitMatcher(QtSupport::QtKitInformation::qtVersionMatcher());
@@ -377,7 +376,7 @@ Project::RestoreResult QmakeProject::fromMap(const QVariantMap &map, QString *er
 
     m_manager->registerProject(this);
 
-    m_rootProjectNode = new QmakeProFileNode(this, m_fileInfo->filePath());
+    m_rootProjectNode = new QmakeProFileNode(this, projectFilePath());
 
     // On active buildconfiguration changes, reevaluate the .pro files
     m_activeTarget = activeTarget();
@@ -849,11 +848,6 @@ QString QmakeProject::displayName() const
     return projectFilePath().toFileInfo().completeBaseName();
 }
 
-Core::IDocument *QmakeProject::document() const
-{
-    return m_fileInfo;
-}
-
 QStringList QmakeProject::files(FilesMode fileMode) const
 {
     QStringList files;
@@ -986,7 +980,7 @@ void QmakeProject::destroyProFileReader(QtSupport::ProFileReader *reader)
 {
     delete reader;
     if (!--m_qmakeGlobalsRefCnt) {
-        QString dir = m_fileInfo->filePath().toFileInfo().absolutePath();
+        QString dir = projectFilePath().toString();
         if (!dir.endsWith(QLatin1Char('/')))
             dir += QLatin1Char('/');
         QtSupport::ProFileCacheManager::instance()->discardFiles(dir);
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h
index 80ffc0f6f15c9a4e4cbb3e58b86080ff1ad00c10..cfa28f879ddd54cba9389c1600d5b383ed4da1c5 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.h
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.h
@@ -58,9 +58,9 @@ class QmakeProFileNode;
 
 namespace Internal {
 class CentralizedFolderWatcher;
+class QmakeProjectFile;
 class QmakeProjectFiles;
 class QmakeProjectConfigWidget;
-class QmakeProjectFile;
 }
 
 class  QMAKEPROJECTMANAGER_EXPORT QmakeProject : public ProjectExplorer::Project
@@ -72,7 +72,6 @@ public:
     ~QmakeProject() override;
 
     QString displayName() const override;
-    Core::IDocument *document() const override;
     ProjectExplorer::IProjectManager *projectManager() const override;
     QmakeManager *qmakeProjectManager() const;
 
@@ -185,8 +184,6 @@ private:
     QmakeManager *m_manager;
     QmakeProFileNode *m_rootProjectNode = 0;
 
-    Internal::QmakeProjectFile *m_fileInfo = nullptr;
-
     // Current configuration
     QString m_oldQtIncludePath;
     QString m_oldQtLibsPath;
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index 3f7f4c9650faad72eb6056c59cc1c925d2465089..f2ec9503849c566ade27a6b625b4f656ab8cbebf 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -65,17 +65,17 @@ QmlProject::QmlProject(Internal::Manager *manager, const Utils::FileName &fileNa
       m_activeTarget(0)
 {
     setId("QmlProjectManager.QmlProject");
+    setDocument(new Internal::QmlProjectFile(this, fileName));
+    DocumentManager::addDocument(document(), true);
+
     setProjectContext(Context(QmlProjectManager::Constants::PROJECTCONTEXT));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_QMLJS));
 
     QFileInfo fileInfo = m_fileName.toFileInfo();
     m_projectName = fileInfo.completeBaseName();
 
-    m_file = new Internal::QmlProjectFile(this, fileName);
     m_rootNode = new Internal::QmlProjectNode(this);
 
-    DocumentManager::addDocument(m_file, true);
-
     m_manager->registerProject(this);
 }
 
@@ -83,8 +83,6 @@ QmlProject::~QmlProject()
 {
     m_manager->unregisterProject(this);
 
-    DocumentManager::removeDocument(m_file);
-
     delete m_projectItem.data();
     delete m_rootNode;
 }
@@ -292,11 +290,6 @@ QString QmlProject::displayName() const
     return m_projectName;
 }
 
-IDocument *QmlProject::document() const
-{
-    return m_file;
-}
-
 IProjectManager *QmlProject::projectManager() const
 {
     return m_manager;
diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h
index 9d3c48ca31748cabbf2f7207a643bb262c10f294..b3fe9a19b5d51bbe01d30c5c8aabf99b2c8b0f72 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.h
+++ b/src/plugins/qmlprojectmanager/qmlproject.h
@@ -62,7 +62,6 @@ public:
     Utils::FileName filesFileName() const;
 
     QString displayName() const override;
-    Core::IDocument *document() const override;
     ProjectExplorer::IProjectManager *projectManager() const override;
 
     bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override;
@@ -112,7 +111,6 @@ private:
 
     Internal::Manager *m_manager;
     Utils::FileName m_fileName;
-    Internal::QmlProjectFile *m_file;
     QString m_projectName;
     QmlImport m_defaultImport;
     ProjectExplorer::Target *m_activeTarget;
diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
index 89a08a84b932669f32d6daa23cbe3eaf09903dc9..61a36c025b274c85bd02abf7d74d0b47b127798d 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
@@ -36,9 +36,8 @@
 namespace QmlProjectManager {
 namespace Internal {
 
-QmlProjectFile::QmlProjectFile(QmlProject *parent, const Utils::FileName &fileName)
-    : Core::IDocument(parent),
-      m_project(parent)
+QmlProjectFile::QmlProjectFile(QmlProject *parent, const Utils::FileName &fileName) :
+    m_project(parent)
 {
     QTC_CHECK(m_project);
     QTC_CHECK(!fileName.isEmpty());
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index cf94ea9b06af62c22df38c9eaaf947350276f865..0b7a64b135f109f4410f519bc6c38e1d7c3ad7aa 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -676,7 +676,7 @@ void VcsBasePlugin::createRepository()
     // Find current starting directory
     QString directory;
     if (const Project *currentProject = ProjectTree::currentProject())
-        directory = currentProject->document()->filePath().toFileInfo().absolutePath();
+        directory = currentProject->projectFilePath().toString();
     // Prompt for a directory that is not under version control yet
     QWidget *mw = ICore::mainWindow();
     do {