diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
index e38cffcfa71557c7bb06317d9a86b689134131f0..cac3b255ac8b3e4bc44aa83c59b914741b41c008 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
@@ -78,24 +78,18 @@ AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fil
     setId(Constants::AUTOTOOLS_PROJECT_ID);
     setProjectManager(manager);
     setDocument(new AutotoolsProjectFile(fileName));
-    m_rootNode = new AutotoolsProjectNode(projectFilePath());
+    setRootProjectNode(new AutotoolsProjectNode(projectFilePath()));
     setProjectContext(Core::Context(Constants::PROJECT_CONTEXT));
     setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
 
     const QFileInfo fileInfo = projectFilePath().toFileInfo();
     m_projectName = fileInfo.absoluteDir().dirName();
-    m_rootNode->setDisplayName(fileInfo.absoluteDir().dirName());
+    rootProjectNode()->setDisplayName(m_projectName);
 }
 
 AutotoolsProject::~AutotoolsProject()
 {
-    // Although ProjectExplorer::ProjectNode is a QObject, the ctor
-    // does not allow to specify the parent. Manually setting the
-    // parent would be possible, but we use the same approach as in the
-    // other project managers and delete the node manually (TBD).
-    //
-    delete m_rootNode;
-    m_rootNode = 0;
+    setRootProjectNode(0);
 
     if (m_makefileParserThread != 0) {
         m_makefileParserThread->wait();
@@ -114,11 +108,6 @@ QString AutotoolsProject::defaultBuildDirectory(const QString &projectPath)
     return QFileInfo(projectPath).absolutePath();
 }
 
-ProjectNode *AutotoolsProject::rootProjectNode() const
-{
-    return m_rootNode;
-}
-
 QStringList AutotoolsProject::files(FilesMode fileMode) const
 {
     Q_UNUSED(fileMode);
@@ -261,7 +250,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
     // This allows to reuse existing nodes and to remove obsolete
     // nodes later.
     QHash<QString, Node *> nodeHash;
-    foreach (Node * node, nodes(m_rootNode))
+    foreach (Node *node, nodes(rootProjectNode()))
         nodeHash.insert(node->filePath().toString(), node);
 
     // Add the sources to the filenode project tree. Sources
@@ -291,7 +280,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
             parentFolder = insertFolderNode(QDir(subDir), nodeHash);
             if (parentFolder == 0) {
                 // No node gets created for the root folder
-                parentFolder = m_rootNode;
+                parentFolder = rootProjectNode();
             }
         }
         QTC_ASSERT(parentFolder, return);
@@ -332,7 +321,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
                 FolderNode *grandParent = parent->parentFolderNode();
                 grandParent->removeFolderNodes(QList<FolderNode *>() << parent);
                 parent = grandParent;
-                if (parent == m_rootNode)
+                if (parent == rootProjectNode())
                     break;
             }
         }
@@ -343,7 +332,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
 FolderNode *AutotoolsProject::insertFolderNode(const QDir &nodeDir, QHash<QString, Node *> &nodes)
 {
     const Utils::FileName nodePath = Utils::FileName::fromString(nodeDir.absolutePath());
-    QFileInfo rootInfo = m_rootNode->filePath().toFileInfo();
+    QFileInfo rootInfo = rootProjectNode()->filePath().toFileInfo();
     const Utils::FileName rootPath = Utils::FileName::fromString(rootInfo.absolutePath());
 
     // Do not create a folder for the root node
@@ -356,7 +345,7 @@ FolderNode *AutotoolsProject::insertFolderNode(const QDir &nodeDir, QHash<QStrin
 
     // Get parent-folder. If it does not exist, create it recursively.
     // Take care that the m_rootNode is considered as top folder.
-    FolderNode *parentFolder = m_rootNode;
+    FolderNode *parentFolder = rootProjectNode();
     if ((rootPath != folder->filePath()) && dir.cdUp()) {
         const QString parentDir = dir.absolutePath();
         if (!nodes.contains(parentDir)) {
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.h b/src/plugins/autotoolsprojectmanager/autotoolsproject.h
index d326202013f6730f12a4b6ae241796a61051ac11..00b13f33dfdef943bde0c151636c7e369abb1763 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsproject.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.h
@@ -74,7 +74,6 @@ public:
     ~AutotoolsProject() override;
 
     QString displayName() const override;
-    ProjectExplorer::ProjectNode *rootProjectNode() const override;
     QStringList files(FilesMode fileMode) const override;
     static QString defaultBuildDirectory(const QString &projectPath);
     QStringList buildTargets() const;
@@ -140,9 +139,6 @@ private:
     /// Return value for AutotoolsProject::files()
     QStringList m_files;
 
-    /// Return value for AutotoolsProject::rootProjectNode()
-    AutotoolsProjectNode *m_rootNode;
-
     /// Watches project files for changes.
     Utils::FileSystemWatcher *m_fileWatcher;
     QStringList m_watchedFiles;
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index a99f2abb598c80dc6f8782f9dc392d2795231314..ea60676f95f9852688b699a6f58825aea995b6b7 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -88,16 +88,16 @@ using namespace Utils;
   \class CMakeProject
 */
 CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName) :
-    m_rootNode(new CMakeProjectNode(fileName)),
     m_watcher(new QFileSystemWatcher(this))
 {
     setId(Constants::CMAKEPROJECT_ID);
     setProjectManager(manager);
     setDocument(new CMakeFile(fileName));
+    setRootProjectNode(new CMakeProjectNode(fileName));
     setProjectContext(Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT));
     setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
 
-    m_rootNode->setDisplayName(fileName.parentDir().fileName());
+    rootProjectNode()->setDisplayName(fileName.parentDir().fileName());
 
     connect(this, &CMakeProject::buildTargetsChanged, this, &CMakeProject::updateRunConfigurations);
     connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &CMakeProject::fileChanged);
@@ -106,7 +106,6 @@ CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName) :
 CMakeProject::~CMakeProject()
 {
     m_codeModelFuture.cancel();
-    delete m_rootNode;
 }
 
 void CMakeProject::fileChanged(const QString &fileName)
@@ -265,7 +264,7 @@ bool CMakeProject::parseCMakeLists()
     Kit *k = activeTarget()->kit();
 
     // setFolderName
-    m_rootNode->setDisplayName(QFileInfo(cbpFile).completeBaseName());
+    rootProjectNode()->setDisplayName(QFileInfo(cbpFile).completeBaseName());
     CMakeCbpParser cbpparser;
     // Parsing
     //qDebug()<<"Parsing file "<<cbpFile;
@@ -282,7 +281,7 @@ bool CMakeProject::parseCMakeLists()
     // how can we ensure that it is completely written?
     m_watcher->addPath(cbpFile);
 
-    m_rootNode->setDisplayName(cbpparser.projectName());
+    rootProjectNode()->setDisplayName(cbpparser.projectName());
 
     //qDebug()<<"Building Tree";
     QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList();
@@ -306,7 +305,7 @@ bool CMakeProject::parseCMakeLists()
         m_files.append(fn->filePath().toString());
     m_files.sort();
 
-    buildTree(m_rootNode, fileList);
+    buildTree(static_cast<CMakeProjectNode *>(rootProjectNode()), fileList);
 
     //qDebug()<<"Adding Targets";
     m_buildTargets = cbpparser.buildTargets();
@@ -506,15 +505,9 @@ ProjectExplorer::FolderNode *CMakeProject::findOrCreateFolder(CMakeProjectNode *
 
 QString CMakeProject::displayName() const
 {
-    return m_rootNode->displayName();
+    return rootProjectNode()->displayName();
 }
 
-ProjectExplorer::ProjectNode *CMakeProject::rootProjectNode() const
-{
-    return m_rootNode;
-}
-
-
 QStringList CMakeProject::files(FilesMode fileMode) const
 {
     Q_UNUSED(fileMode)
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 91be36110078f7219770b2203806ccf229445332..b2477e8b545424f5f95b05d9dcf2b7acc3f8cb6c 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -100,8 +100,6 @@ public:
 
     QString displayName() const override;
 
-    ProjectExplorer::ProjectNode *rootProjectNode() const override;
-
     QStringList files(FilesMode fileMode) const override;
     QStringList buildTargetTitles(bool runnable = false) const;
     QList<CMakeBuildTarget> buildTargets() const;
@@ -149,7 +147,6 @@ private:
     ProjectExplorer::Target *m_activeTarget = 0;
 
     // TODO probably need a CMake specific node structure
-    Internal::CMakeProjectNode *m_rootNode;
     QStringList m_files;
     QList<CMakeBuildTarget> m_buildTargets;
     QFileSystemWatcher *m_watcher;
diff --git a/src/plugins/cpptools/modelmanagertesthelper.h b/src/plugins/cpptools/modelmanagertesthelper.h
index 5b85eedc8122631b9eeb7c0a4b7d936320870bb8..28aa6f32927b5bbf10b3b21c9086d63a775a6063 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; }
-    ProjectExplorer::ProjectNode *rootProjectNode() const override { return 0; }
 
     QStringList files(FilesMode fileMode) const override { Q_UNUSED(fileMode); return QStringList(); }
 
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 1e8667039bf35978f5715dcd8c6f88ecd2efa1e4..b527b36f874a700cf5c3bd5815fe18bfff5fab81 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -72,6 +72,7 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
     setId(Constants::GENERICPROJECT_ID);
     setProjectManager(manager);
     setDocument(new GenericProjectFile(this, fileName, GenericProject::Everything));
+    setRootProjectNode(new GenericProjectNode(this));
     setProjectContext(Context(GenericProjectManager::Constants::PROJECTCONTEXT));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
 
@@ -92,8 +93,6 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
     DocumentManager::addDocument(m_includesIDocument);
     DocumentManager::addDocument(m_configIDocument);
 
-    m_rootNode = new GenericProjectNode(this);
-
     FileNode *projectFilesNode = new FileNode(Utils::FileName::fromString(m_filesFileName),
                                               ProjectFileType,
                                               /* generated = */ false);
@@ -106,10 +105,8 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
                                                ProjectFileType,
                                                /* generated = */ false);
 
-    m_rootNode->addFileNodes(QList<FileNode *>()
-                             << projectFilesNode
-                             << projectIncludesNode
-                             << projectConfigNode);
+    rootProjectNode()->addFileNodes(QList<FileNode *>() << projectFilesNode
+                                    << projectIncludesNode << projectConfigNode);
 
     projectManager()->registerProject(this);
 }
@@ -118,8 +115,6 @@ GenericProject::~GenericProject()
 {
     m_codeModelFuture.cancel();
     projectManager()->unregisterProject(this);
-
-    delete m_rootNode;
 }
 
 QString GenericProject::filesFileName() const
@@ -281,7 +276,7 @@ void GenericProject::refresh(RefreshOptions options)
     parseProject(options);
 
     if (options & Files)
-        m_rootNode->refresh(oldFileList);
+        static_cast<GenericProjectNode *>(rootProjectNode())->refresh(oldFileList);
 
     refreshCppCodeModel();
 }
@@ -392,11 +387,6 @@ Manager *GenericProject::projectManager() const
     return static_cast<Manager *>(Project::projectManager());
 }
 
-GenericProjectNode *GenericProject::rootProjectNode() const
-{
-    return m_rootNode;
-}
-
 QStringList GenericProject::files(FilesMode fileMode) const
 {
     Q_UNUSED(fileMode);
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index f2cc2171f4dfffea9b5106dcde143d7b194d3a80..c0813c338d2c2fda517d1cc636c17603d4e39531 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -63,7 +63,6 @@ public:
     QString displayName() const override;
     Manager *projectManager() const override;
 
-    GenericProjectNode *rootProjectNode() const override;
     QStringList files(FilesMode fileMode) const override;
 
     QStringList buildTargets() const;
@@ -109,7 +108,6 @@ private:
     QStringList m_rawProjectIncludePaths;
     QStringList m_projectIncludePaths;
 
-    GenericProjectNode *m_rootNode;
     QFuture<void> m_codeModelFuture;
 };
 
diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp
index a37ada5c795778b46715f21816fa2c61e01f42fc..80920bba5766aae2267fa63382c48f242f0c4bef 100644
--- a/src/plugins/ios/iosrunconfiguration.cpp
+++ b/src/plugins/ios/iosrunconfiguration.cpp
@@ -207,7 +207,7 @@ QString IosRunConfiguration::applicationName() const
     QmakeProject *pro = qobject_cast<QmakeProject *>(target()->project());
     const QmakeProFileNode *node = 0;
     if (pro)
-        node = pro->rootQmakeProjectNode();
+        node = pro->rootProjectNode();
     if (node)
         node = node->findProFileFor(profilePath());
     if (node) {
@@ -233,7 +233,7 @@ FileName IosRunConfiguration::bundleDirectory() const
         QmakeProject *pro = qobject_cast<QmakeProject *>(target()->project());
         const QmakeProFileNode *node = 0;
         if (pro)
-            node = pro->rootQmakeProjectNode();
+            node = pro->rootProjectNode();
         if (node)
             node = node->findProFileFor(profilePath());
         if (node) {
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 5143a03b202cd5fe994e6fded15add8c9227945a..6fb3857a38a0f3b827f36ed4879f9186c35542cd 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -36,6 +36,7 @@
 #include "editorconfiguration.h"
 #include "kit.h"
 #include "projectexplorer.h"
+#include "projectnodes.h"
 #include "target.h"
 #include "session.h"
 #include "settingsaccessor.h"
@@ -95,6 +96,7 @@ public:
     Core::Id m_id;
     Core::IDocument *m_document = 0;
     IProjectManager *m_manager = 0;
+    ProjectNode *m_rootProjectNode = 0;
     QList<Target *> m_targets;
     Target *m_activeTarget = 0;
     EditorConfiguration m_editorConfiguration;
@@ -111,8 +113,13 @@ public:
 
 ProjectPrivate::~ProjectPrivate()
 {
-    delete m_accessor;
+    // Make sure our root node is 0 when deleting
+    ProjectNode *oldNode = m_rootProjectNode;
+    m_rootProjectNode = 0;
+    delete oldNode;
+
     delete m_document;
+    delete m_accessor;
 }
 
 Project::Project() : d(new ProjectPrivate)
@@ -432,6 +439,13 @@ void Project::setProjectManager(IProjectManager *manager)
     d->m_manager = manager;
 }
 
+void Project::setRootProjectNode(ProjectNode *root)
+{
+    ProjectNode *oldNode = d->m_rootProjectNode;
+    d->m_rootProjectNode = root;
+    delete oldNode;
+}
+
 Target *Project::restoreTarget(const QVariantMap &data)
 {
     Core::Id id = idFromMap(data);
@@ -522,6 +536,11 @@ IProjectManager *Project::projectManager() const
     return d->m_manager;
 }
 
+ProjectNode *Project::rootProjectNode() const
+{
+    return d->m_rootProjectNode;
+}
+
 Project::RestoreResult Project::fromMap(const QVariantMap &map, QString *errorMessage)
 {
     Q_UNUSED(errorMessage);
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index e5322b44a1e9febcb4f1b7ee392b1c47d1aabb78..92c440c5bc22a91948ac518df9f2916e5281e86b 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -88,6 +88,8 @@ public:
 
     virtual IProjectManager *projectManager() const;
 
+    virtual ProjectNode *rootProjectNode() const;
+
     bool hasActiveBuildSettings() const;
 
     // EditorConfiguration:
@@ -112,8 +114,6 @@ public:
     enum class RestoreResult { Ok, Error, UserAbort };
     RestoreResult restoreSettings(QString *errorMessage);
 
-    virtual ProjectNode *rootProjectNode() const = 0;
-
     enum FilesMode { AllFiles, ExcludeGeneratedFiles };
     virtual QStringList files(FilesMode fileMode) const = 0;
     // TODO: generalize to find source(s) of generated files?
@@ -175,6 +175,7 @@ protected:
     void setId(Core::Id id);
     void setDocument(Core::IDocument *doc); // takes ownership!
     void setProjectManager(IProjectManager *manager);
+    void setRootProjectNode(ProjectNode *root); // takes ownership!
     void setProjectContext(Core::Context context);
     void setProjectLanguages(Core::Context language);
     void addProjectLanguage(Core::Id id);
diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp
index 226d7e558b4b64db715b56e81ebed90c75d59145..ec6854bb6da20a3ae48608629b16fbdbe4426aa9 100644
--- a/src/plugins/pythoneditor/pythoneditorplugin.cpp
+++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp
@@ -251,7 +251,6 @@ public:
     QString displayName() const override { return m_projectName; }
     PythonProjectManager *projectManager() const override;
 
-    ProjectNode *rootProjectNode() const override;
     QStringList files(FilesMode) const override { return m_files; }
     QStringList files() const { return m_files; }
 
@@ -274,8 +273,6 @@ private:
     QStringList m_rawFileList;
     QStringList m_files;
     QHash<QString, QString> m_rawListEntries;
-
-    ProjectNode *m_rootNode;
 };
 
 class PythonProjectFile : public Core::IDocument
@@ -620,6 +617,7 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
     setProjectManager(manager);
     setDocument(new PythonProjectFile(this, fileName));
     DocumentManager::addDocument(document());
+    setRootProjectNode(new PythonProjectNode(this));
 
     setProjectContext(Context(PythonProjectContext));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
@@ -627,7 +625,6 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
     QFileInfo fileInfo = projectFilePath().toFileInfo();
 
     m_projectName = fileInfo.completeBaseName();
-    m_rootNode = new PythonProjectNode(this);
 
     projectManager()->registerProject(this);
 }
@@ -635,8 +632,6 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
 PythonProject::~PythonProject()
 {
     projectManager()->unregisterProject(this);
-
-    delete m_rootNode;
 }
 
 PythonProjectManager *PythonProject::projectManager() const
@@ -775,7 +770,7 @@ private:
 
 void PythonProject::refresh()
 {
-    m_rootNode->removeFileNodes(m_rootNode->fileNodes());
+    rootProjectNode()->removeFileNodes(rootProjectNode()->fileNodes());
     parseProject();
 
     QDir baseDir(projectDirectory().toString());
@@ -786,7 +781,7 @@ void PythonProject::refresh()
         fileNodes.append(new PythonFileNode(FileName::fromString(file), displayName));
     }
 
-    m_rootNode->addFileNodes(fileNodes);
+    rootProjectNode()->addFileNodes(fileNodes);
 }
 
 /**
@@ -844,11 +839,6 @@ QStringList PythonProject::processEntries(const QStringList &paths,
     return absolutePaths;
 }
 
-ProjectNode *PythonProject::rootProjectNode() const
-{
-    return m_rootNode;
-}
-
 Project::RestoreResult PythonProject::fromMap(const QVariantMap &map, QString *errorMessage)
 {
     Project::RestoreResult res = Project::fromMap(map, errorMessage);
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 9d870e80a3c1590a520b7cc0a652b7147a42f4a5..065cfa31090f846a7aaffaf3bc0b7d7d1ac798f3 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -101,7 +101,6 @@ static const char CONFIG_PRECOMPILEDHEADER[] = "precompiledHeader";
 
 QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
     m_projectName(QFileInfo(fileName).completeBaseName()),
-    m_rootProjectNode(0),
     m_qbsProjectParser(0),
     m_qbsUpdateFutureInterface(0),
     m_parsingScheduled(false),
@@ -112,9 +111,9 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
 
     setId(Constants::PROJECT_ID);
     setProjectManager(manager);
-
     setDocument(new QbsProjectFile(this, fileName));
     DocumentManager::addDocument(document());
+    setRootProjectNode(new QbsRootProjectNode(this));
 
     setProjectContext(Context(Constants::PROJECT_ID));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
@@ -126,9 +125,6 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
     connect(this, SIGNAL(environmentChanged()), this, SLOT(delayParsing()));
 
     connect(&m_parsingDelay, SIGNAL(timeout()), this, SLOT(startParsing()));
-
-    // NOTE: QbsProjectNode does not use this as a parent!
-    m_rootProjectNode = new QbsRootProjectNode(this); // needs documents to be initialized!
 }
 
 QbsProject::~QbsProject()
@@ -141,12 +137,6 @@ QbsProject::~QbsProject()
         delete m_qbsUpdateFutureInterface;
         m_qbsUpdateFutureInterface = 0;
     }
-
-    // Deleting the root node triggers a few things, make sure rootProjectNode
-    // returns 0 already
-    QbsProjectNode *root = m_rootProjectNode;
-    m_rootProjectNode = 0;
-    delete root;
 }
 
 QString QbsProject::displayName() const
@@ -159,9 +149,9 @@ QbsManager *QbsProject::projectManager() const
     return static_cast<QbsManager *>(Project::projectManager());
 }
 
-ProjectNode *QbsProject::rootProjectNode() const
+QbsRootProjectNode *QbsProject::rootProjectNode() const
 {
-    return m_rootProjectNode;
+    return static_cast<QbsRootProjectNode *>(Project::rootProjectNode());
 }
 
 static void collectFilesForProject(const qbs::ProjectData &project, QSet<QString> &result)
@@ -286,7 +276,7 @@ bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &
         m_projectData = m_qbsProject.projectData();
         QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData),
                                  allPaths, QFileInfo(productFilePath).absolutePath(), true);
-        m_rootProjectNode->update();
+        rootProjectNode()->update();
         emit fileListChanged();
     }
     return notAdded->isEmpty();
@@ -315,7 +305,7 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL
         m_projectData = m_qbsProject.projectData();
         QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths,
                                  QFileInfo(productFilePath).absolutePath(), true);
-        m_rootProjectNode->update();
+        rootProjectNode()->update();
         emit fileListChanged();
     }
     return notRemoved->isEmpty();
@@ -454,7 +444,7 @@ void QbsProject::handleQbsParsingDone(bool success)
 
         if (projectData != m_projectData) {
             m_projectData = projectData;
-            m_rootProjectNode->update();
+            rootProjectNode()->update();
 
             updateDocuments(m_qbsProject.isValid()
                             ? m_qbsProject.buildSystemFiles() : QSet<QString>() << projectFilePath().toString());
@@ -767,7 +757,7 @@ void QbsProject::updateCppCodeModel()
 
             foreach (const QString &file, grp.allFilePaths()) {
                 if (file.endsWith(QLatin1String(".ui"))) {
-                    QStringList generated = m_rootProjectNode->qbsProject()
+                    QStringList generated = rootProjectNode()->qbsProject()
                             .generatedFiles(prd, file, QStringList(QLatin1String("hpp")));
                     if (generated.count() == 1)
                         uiFiles.insert(file, generated.at(0));
diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h
index 3524ab0b7a4afc0bd4772a997f093589a8480641..5380cc8861e92b3e415c020646ed48e1b0a8f623 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.h
+++ b/src/plugins/qbsprojectmanager/qbsproject.h
@@ -33,6 +33,8 @@
 
 #include "qbsprojectmanager.h"
 
+#include "qbsnodes.h"
+
 #include <cpptools/cppprojects.h>
 
 #include <projectexplorer/project.h>
@@ -53,7 +55,6 @@ namespace QbsProjectManager {
 namespace Internal {
 class QbsBaseProjectNode;
 class QbsProjectNode;
-class QbsRootProjectNode;
 class QbsProjectParser;
 class QbsBuildConfiguration;
 
@@ -67,8 +68,7 @@ public:
 
     QString displayName() const override;
     QbsManager *projectManager() const override;
-
-    ProjectExplorer::ProjectNode *rootProjectNode() const override;
+    QbsRootProjectNode *rootProjectNode() const override;
 
     QStringList files(FilesMode fileMode) const override;
 
@@ -149,7 +149,6 @@ private:
     qbs::Project m_qbsProject;
     qbs::ProjectData m_projectData;
     QSet<Core::IDocument *> m_qbsDocuments;
-    QbsRootProjectNode *m_rootProjectNode;
 
     QbsProjectParser *m_qbsProjectParser;
 
diff --git a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp b/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp
index 1e94cf0b5b75f370d6da44693ce1b23caea4297a..af7b8c3d591b3c703a8c8d41af80feb02ea47ce5 100644
--- a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp
+++ b/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp
@@ -123,7 +123,7 @@ QmakeProjectManager::QmakeProFileNode *AndroidExtraLibraryListModel::activeNode(
     if (!qarc)
         return 0;
     auto project = static_cast<QmakeProject *>(m_target->project());
-    return project->rootQmakeProjectNode()->findProFileFor(qarc->proFilePath());
+    return project->rootProjectNode()->findProFileFor(qarc->proFilePath());
 }
 
 void AndroidExtraLibraryListModel::proFileUpdated(QmakeProjectManager::QmakeProFileNode *node)
diff --git a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp b/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp
index 2ca4ab444957ff6433c47cfc52f4690e08f2b747..c67011b1b659bb0b09e081a126f9fbe427b9a677 100644
--- a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp
+++ b/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp
@@ -211,7 +211,7 @@ CreateAndroidManifestWizard::CreateAndroidManifestWizard(ProjectExplorer::Target
     const QmakeProFileNode *currentRunNode = 0;
     ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration();
     if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc))
-        currentRunNode = project->rootQmakeProjectNode()->findProFileFor(qrc->proFilePath());
+        currentRunNode = project->rootProjectNode()->findProFileFor(qrc->proFilePath());
 
     if (nodes.isEmpty()) {
         // oh uhm can't create anything
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp
index 7c18c4d2351126bc6b70b819db974258524dd500..803797239988b74b0fc32e9256870601270b9085 100644
--- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp
+++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp
@@ -158,7 +158,7 @@ Utils::FileName QmakeAndroidBuildApkStep::androidPackageSourceDir() const
 {
     QmakeProjectManager::QmakeProject *pro = static_cast<QmakeProjectManager::QmakeProject *>(project());
     const QmakeProjectManager::QmakeProFileNode *node
-            = pro->rootQmakeProjectNode()->findProFileFor(proFilePathForInputFile());
+            = pro->rootProjectNode()->findProFileFor(proFilePathForInputFile());
     if (!node)
         return Utils::FileName();
     return Utils::FileName::fromString(node->singleVariableValue(QmakeProjectManager::AndroidPackageSourceDir));
@@ -199,7 +199,7 @@ bool QmakeAndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps)
     QString outputDir = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString();
 
     const auto *pro = static_cast<QmakeProjectManager::QmakeProject *>(project());
-    const QmakeProjectManager::QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(proFilePathForInputFile());
+    const QmakeProjectManager::QmakeProFileNode *node = pro->rootProjectNode()->findProFileFor(proFilePathForInputFile());
     m_skipBuilding = !node;
     if (m_skipBuilding)
         return true;
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp
index 0eaaad3df5309a0903df4720882a5840953e5a58..e7c919aeb4669c597f21bc83f8e72598d5a23d39 100644
--- a/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp
+++ b/src/plugins/qmakeandroidsupport/qmakeandroidrunconfiguration.cpp
@@ -112,7 +112,7 @@ QVariantMap QmakeAndroidRunConfiguration::toMap() const
 QString QmakeAndroidRunConfiguration::defaultDisplayName()
 {
     auto project = static_cast<QmakeProject *>(target()->project());
-    const QmakeProjectManager::QmakeProFileNode *root = project->rootQmakeProjectNode();
+    const QmakeProjectManager::QmakeProFileNode *root = project->rootProjectNode();
     if (root) {
         const QmakeProjectManager::QmakeProFileNode *node = root->findProFileFor(m_proFilePath);
         if (node) // should always be found
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp
index 23b190c2c1a3307a119dcb6592dd0787b7103b2d..0ce2dc46f747c72e129d4a11ee7a41ec567e7821 100644
--- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp
+++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp
@@ -114,7 +114,7 @@ Utils::FileName QmakeAndroidSupport::androiddeployJsonPath(ProjectExplorer::Targ
         return Utils::FileName();
 
     const QmakeProFileNode *node =
-            pro->rootQmakeProjectNode()->findProFileFor(buildApkStep->proFilePathForInputFile());
+            pro->rootProjectNode()->findProFileFor(buildApkStep->proFilePathForInputFile());
     if (!node) // should never happen
         return Utils::FileName();
 
@@ -138,7 +138,7 @@ Utils::FileName QmakeAndroidSupport::manifestSourcePath(const ProjectExplorer::T
     if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc)) {
         Utils::FileName proFilePath = qrc->proFilePath();
         const auto project = static_cast<QmakeProjectManager::QmakeProject *>(target->project());
-        const QmakeProFileNode *node = project->rootQmakeProjectNode()->findProFileFor(proFilePath);
+        const QmakeProFileNode *node = project->rootProjectNode()->findProFileFor(proFilePath);
         if (node) {
             QString packageSource = node->singleVariableValue(AndroidPackageSourceDir);
             if (!packageSource.isEmpty()) {
diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp
index 3523f31da17f932fa63147d87bddb76fd6e2acc6..73d77b40f8ad54d391cea793d8e2a2b8cc529a45 100644
--- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp
+++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp
@@ -352,7 +352,7 @@ bool DesktopQmakeRunConfiguration::fromMap(const QVariantMap &map)
 QString DesktopQmakeRunConfiguration::executable() const
 {
     QmakeProject *pro = static_cast<QmakeProject *>(target()->project());
-    const QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(m_proFilePath);
+    const QmakeProFileNode *node = pro->rootProjectNode()->findProFileFor(m_proFilePath);
     return extractWorkingDirAndExecutable(node).second;
 }
 
@@ -399,7 +399,7 @@ QString DesktopQmakeRunConfiguration::workingDirectory() const
 QString DesktopQmakeRunConfiguration::baseWorkingDirectory() const
 {
     QmakeProject *pro = static_cast<QmakeProject *>(target()->project());
-    const QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(m_proFilePath);
+    const QmakeProFileNode *node = pro->rootProjectNode()->findProFileFor(m_proFilePath);
     return extractWorkingDirAndExecutable(node).first;
 }
 
@@ -416,7 +416,7 @@ void DesktopQmakeRunConfiguration::addToBaseEnvironment(Environment &env) const
     // The user could be linking to a library found via a -L/some/dir switch
     // to find those libraries while actually running we explicitly prepend those
     // dirs to the library search path
-    const QmakeProFileNode *node = static_cast<QmakeProject *>(target()->project())->rootQmakeProjectNode()->findProFileFor(m_proFilePath);
+    const QmakeProFileNode *node = static_cast<QmakeProject *>(target()->project())->rootProjectNode()->findProFileFor(m_proFilePath);
     if (m_isUsingLibrarySearchPath && node) {
         const QStringList libDirectories = node->variableValue(LibDirectoriesVar);
         if (!libDirectories.isEmpty()) {
@@ -444,7 +444,7 @@ Utils::FileName DesktopQmakeRunConfiguration::proFilePath() const
 QString DesktopQmakeRunConfiguration::defaultDisplayName()
 {
     auto project = static_cast<QmakeProject *>(target()->project());
-    const QmakeProFileNode *root = project->rootQmakeProjectNode();
+    const QmakeProFileNode *root = project->rootProjectNode();
     if (root) {
         const QmakeProFileNode *node = root->findProFileFor(m_proFilePath);
         if (node) // should always be found
diff --git a/src/plugins/qmakeprojectmanager/makestep.cpp b/src/plugins/qmakeprojectmanager/makestep.cpp
index f36d9d0bbfc089c4e1337be8697cb923d72e1af5..b0ba9fb4f4d3e317704bd3f5bd233c14bdf18a6c 100644
--- a/src/plugins/qmakeprojectmanager/makestep.cpp
+++ b/src/plugins/qmakeprojectmanager/makestep.cpp
@@ -264,7 +264,7 @@ bool MakeStep::init(QList<const BuildStep *> &earlierSteps)
     appendOutputParser(new QMakeParser); // make may cause qmake to be run, add last to make sure
                                          // it has a low priority.
 
-    m_scriptTarget = (static_cast<QmakeProject *>(bc->target()->project())->rootQmakeProjectNode()->projectType() == ScriptTemplate);
+    m_scriptTarget = (static_cast<QmakeProject *>(bc->target()->project())->rootProjectNode()->projectType() == ScriptTemplate);
 
     return AbstractProcessStep::init(earlierSteps);
 }
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
index 5afcbf2d70ccbe29dda5ecf4c01e9bd2fba1cbee..e6e63adacb8093660b945ee017077196103b497f 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
@@ -238,7 +238,7 @@ void QmakeBuildConfiguration::setBuildDirectory(const FileName &directory)
 
 QString QmakeBuildConfiguration::makefile() const
 {
-    return static_cast<QmakeProject *>(target()->project())->rootQmakeProjectNode()->makefile();
+    return static_cast<QmakeProject *>(target()->project())->rootProjectNode()->makefile();
 }
 
 BaseQtVersion::QmakeBuildConfigs QmakeBuildConfiguration::qmakeBuildConfiguration() const
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index 126c3c7aa4c556486303e780c31c45d47cd32aac..64a49cc3c33bbad5547fa80ea848e45d092b5502 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -2538,7 +2538,7 @@ QString QmakeProFileNode::sourceDir() const
 
 QString QmakeProFileNode::buildDir(QmakeBuildConfiguration *bc) const
 {
-    const QDir srcDirRoot = m_project->rootQmakeProjectNode()->sourceDir();
+    const QDir srcDirRoot = m_project->rootProjectNode()->sourceDir();
     const QString relativeDir = srcDirRoot.relativeFilePath(m_projectDir);
     if (!bc && m_project->activeTarget())
         bc = static_cast<QmakeBuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index 7c3019ea833f5b300975ae2c084ac9e2cb5e253f..3eca1333fb4691bba8a97fad2445771a60179628 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -337,11 +337,6 @@ QmakeProject::~QmakeProject()
     projectManager()->unregisterProject(this);
     delete m_projectFiles;
     m_cancelEvaluate = true;
-    // Deleting the root node triggers a few things, make sure rootProjectNode
-    // returns 0 already
-    QmakeProFileNode *root = m_rootProjectNode;
-    m_rootProjectNode = 0;
-    delete root;
     Q_ASSERT(m_qmakeGlobalsRefCnt == 0);
     delete m_qmakeVfs;
 }
@@ -349,7 +344,7 @@ QmakeProject::~QmakeProject()
 void QmakeProject::updateFileList()
 {
     QmakeProjectFiles newFiles;
-    ProjectFilesVisitor::findProjectFiles(m_rootProjectNode, &newFiles);
+    ProjectFilesVisitor::findProjectFiles(rootProjectNode(), &newFiles);
     if (newFiles != *m_projectFiles) {
         *m_projectFiles = newFiles;
         emit fileListChanged();
@@ -376,7 +371,7 @@ Project::RestoreResult QmakeProject::fromMap(const QVariantMap &map, QString *er
 
     projectManager()->registerProject(this);
 
-    m_rootProjectNode = new QmakeProFileNode(this, projectFilePath());
+    setRootProjectNode(new QmakeProFileNode(this, projectFilePath()));
 
     // On active buildconfiguration changes, reevaluate the .pro files
     m_activeTarget = activeTarget();
@@ -702,7 +697,7 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay)
         m_cancelEvaluate = true;
         m_asyncUpdateState = AsyncFullUpdatePending;
         enableActiveQmakeBuildConfiguration(activeTarget(), false);
-        m_rootProjectNode->setParseInProgressRecursive(true);
+        rootProjectNode()->setParseInProgressRecursive(true);
         return;
     }
 
@@ -710,7 +705,7 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay)
         qDebug()<<"  starting timer for full update, setting state to full update pending";
     m_partialEvaluate.clear();
     enableActiveQmakeBuildConfiguration(activeTarget(), false);
-    m_rootProjectNode->setParseInProgressRecursive(true);
+    rootProjectNode()->setParseInProgressRecursive(true);
     m_asyncUpdateState = AsyncFullUpdatePending;
 
     // Cancel running code model update
@@ -805,7 +800,7 @@ void QmakeProject::asyncUpdate()
     if (m_asyncUpdateState == AsyncFullUpdatePending) {
         if (debug)
             qDebug()<<"  full update, starting with root node";
-        m_rootProjectNode->asyncUpdate();
+        rootProjectNode()->asyncUpdate();
     } else {
         if (debug)
             qDebug()<<"  partial update,"<<m_partialEvaluate.size()<<"nodes to update";
@@ -883,8 +878,8 @@ QString QmakeProject::generatedUiHeader(const FileName &formFile) const
 {
     // Look in sub-profiles as SessionManager::projectForFile returns
     // the top-level project only.
-    if (m_rootProjectNode)
-        if (const QmakeProFileNode *pro = proFileNodeOf(m_rootProjectNode, FormType, formFile))
+    if (rootProjectNode())
+        if (const QmakeProFileNode *pro = proFileNodeOf(rootProjectNode(), FormType, formFile))
             return QmakeProFileNode::uiHeaderFile(
                         pro->uiDirectory(Utils::FileName::fromString(pro->buildDir())),
                         formFile, pro->singleVariableValue(QmakeVariable::UiHeaderExtensionVar));
@@ -927,14 +922,14 @@ QtSupport::ProFileReader *QmakeProject::createProFileReader(const QmakeProFileNo
             m_qmakeGlobals->qmake_abslocation = QDir::cleanPath(qtVersion->qmakeCommand().toString());
             m_qmakeGlobals->setProperties(qtVersion->versionInfo());
         }
-        m_qmakeGlobals->setDirectories(m_rootProjectNode->sourceDir(), m_rootProjectNode->buildDir());
+        m_qmakeGlobals->setDirectories(rootProjectNode()->sourceDir(), rootProjectNode()->buildDir());
         m_qmakeGlobals->sysroot = systemRoot;
 
         Environment::const_iterator eit = env.constBegin(), eend = env.constEnd();
         for (; eit != eend; ++eit)
             m_qmakeGlobals->environment.insert(env.key(eit), env.value(eit));
 
-        m_qmakeGlobals->setCommandLineArguments(m_rootProjectNode->buildDir(), qmakeArgs);
+        m_qmakeGlobals->setCommandLineArguments(rootProjectNode()->buildDir(), qmakeArgs);
 
         QtSupport::ProFileCacheManager::instance()->incRefCount();
 
@@ -986,29 +981,24 @@ void QmakeProject::destroyProFileReader(QtSupport::ProFileReader *reader)
     }
 }
 
-ProjectNode *QmakeProject::rootProjectNode() const
+QmakeProFileNode *QmakeProject::rootProjectNode() const
 {
-    return m_rootProjectNode;
-}
-
-QmakeProFileNode *QmakeProject::rootQmakeProjectNode() const
-{
-    return m_rootProjectNode;
+    return static_cast<QmakeProFileNode *>(Project::rootProjectNode());
 }
 
 bool QmakeProject::validParse(const FileName &proFilePath) const
 {
-    if (!m_rootProjectNode)
+    if (!rootProjectNode())
         return false;
-    const QmakeProFileNode *node = m_rootProjectNode->findProFileFor(proFilePath);
+    const QmakeProFileNode *node = rootProjectNode()->findProFileFor(proFilePath);
     return node && node->validParse();
 }
 
 bool QmakeProject::parseInProgress(const FileName &proFilePath) const
 {
-    if (!m_rootProjectNode)
+    if (!rootProjectNode())
         return false;
-    const QmakeProFileNode *node = m_rootProjectNode->findProFileFor(proFilePath);
+    const QmakeProFileNode *node = rootProjectNode()->findProFileFor(proFilePath);
     return node && node->parseInProgress();
 }
 
@@ -1035,7 +1025,7 @@ QList<QmakeProFileNode *> QmakeProject::allProFiles(const QList<QmakeProjectType
     QList<QmakeProFileNode *> list;
     if (!rootProjectNode())
         return list;
-    collectAllProFiles(list, rootQmakeProjectNode(), parse, projectTypes);
+    collectAllProFiles(list, rootProjectNode(), parse, projectTypes);
     return list;
 }
 
@@ -1116,7 +1106,7 @@ void QmakeProject::notifyChanged(const FileName &name)
 {
     if (files(QmakeProject::ExcludeGeneratedFiles).contains(name.toString())) {
         QList<QmakeProFileNode *> list;
-        findProFile(name, rootQmakeProjectNode(), list);
+        findProFile(name, rootProjectNode(), list);
         foreach (QmakeProFileNode *node, list) {
             QtSupport::ProFileCacheManager::instance()->discardFile(name.toString());
             node->scheduleUpdate(QmakeProFileNode::ParseNow);
@@ -1357,10 +1347,10 @@ QString QmakeProject::disabledReasonForRunConfiguration(const FileName &proFileP
         return tr("The .pro file \"%1\" does not exist.")
                 .arg(proFilePath.fileName());
 
-    if (!m_rootProjectNode) // Shutting down
+    if (!rootProjectNode()) // Shutting down
         return QString();
 
-    if (!m_rootProjectNode->findProFileFor(proFilePath))
+    if (!rootProjectNode()->findProFileFor(proFilePath))
         return tr("The .pro file \"%1\" is not part of the project.")
                 .arg(proFilePath.fileName());
 
@@ -1381,7 +1371,7 @@ void QmakeProject::updateBuildSystemData()
     Target * const target = activeTarget();
     if (!target)
         return;
-    const QmakeProFileNode * const rootNode = rootQmakeProjectNode();
+    const QmakeProFileNode * const rootNode = rootProjectNode();
     if (!rootNode || rootNode->parseInProgress())
         return;
 
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h
index 202f72b7cc32893104a90813ccfbefd4abf60407..ac7bd8652c48f7d62b0a7b5c08878b008372aefb 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.h
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.h
@@ -76,8 +76,7 @@ public:
 
     bool supportsKit(ProjectExplorer::Kit *k, QString *errorMesage) const override;
 
-    ProjectExplorer::ProjectNode *rootProjectNode() const override;
-    QmakeProFileNode *rootQmakeProjectNode() const;
+    QmakeProFileNode *rootProjectNode() const override;
     bool validParse(const Utils::FileName &proFilePath) const;
     bool parseInProgress(const Utils::FileName &proFilePath) const;
 
@@ -180,8 +179,6 @@ private:
     void startAsyncTimer(QmakeProFileNode::AsyncUpdateDelay delay);
     bool matchesKit(const ProjectExplorer::Kit *kit);
 
-    QmakeProFileNode *m_rootProjectNode = 0;
-
     // Current configuration
     QString m_oldQtIncludePath;
     QString m_oldQtLibsPath;
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
index 3ac0858f1737324f769ae20359d9f5a53c9668ad..71e3240c96d9747301fb710dd7c71311f92608d0 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
@@ -207,7 +207,7 @@ void QmakeProjectConfigWidget::updateProblemLabel()
     }
 
     QmakeProject *p = static_cast<QmakeProject *>(m_buildConfiguration->target()->project());
-    if (p->rootQmakeProjectNode()->parseInProgress() || !p->rootQmakeProjectNode()->validParse()) {
+    if (p->rootProjectNode()->parseInProgress() || !p->rootProjectNode()->validParse()) {
         setProblemLabel(QString());
         return;
     }
diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp
index cdddbfd3c1ed736f7e25899cbe85956ef5ae36ee..37a5566b3c9100ab3c684ab70696d331e6f80c12 100644
--- a/src/plugins/qmakeprojectmanager/qmakestep.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp
@@ -227,7 +227,7 @@ bool QMakeStep::init(QList<const BuildStep *> &earlierSteps)
 
     setOutputParser(new QMakeParser);
 
-    QmakeProFileNode *node = static_cast<QmakeProject *>(qt4bc->target()->project())->rootQmakeProjectNode();
+    QmakeProFileNode *node = static_cast<QmakeProject *>(qt4bc->target()->project())->rootProjectNode();
     if (qt4bc->subNodeBuild())
         node = qt4bc->subNodeBuild();
     QString proFile = node->filePath().toString();
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index ba60ebed9fe9e09fc9dbea141dfcea52dcbc5a0b..89d194d722710a44a00e3021fdce510415ec8893 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -65,14 +65,13 @@ QmlProject::QmlProject(Internal::Manager *manager, const Utils::FileName &fileNa
     setProjectManager(manager);
     setDocument(new Internal::QmlProjectFile(this, fileName));
     DocumentManager::addDocument(document(), true);
+    setRootProjectNode(new Internal::QmlProjectNode(this));
 
     setProjectContext(Context(QmlProjectManager::Constants::PROJECTCONTEXT));
     setProjectLanguages(Context(ProjectExplorer::Constants::LANG_QMLJS));
 
     m_projectName = projectFilePath().toFileInfo().completeBaseName();
 
-    m_rootNode = new Internal::QmlProjectNode(this);
-
     projectManager()->registerProject(this);
 }
 
@@ -81,7 +80,6 @@ QmlProject::~QmlProject()
     projectManager()->unregisterProject(this);
 
     delete m_projectItem.data();
-    delete m_rootNode;
 }
 
 void QmlProject::addedTarget(Target *target)
@@ -177,7 +175,7 @@ void QmlProject::parseProject(RefreshOptions options)
                 }
             }
         }
-        m_rootNode->refresh();
+        rootProjectNode()->refresh();
     }
 
     if (options & Configuration) {
@@ -193,7 +191,7 @@ void QmlProject::refresh(RefreshOptions options)
     parseProject(options);
 
     if (options & Files)
-        m_rootNode->refresh();
+        rootProjectNode()->refresh();
 
     if (!modelManager())
         return;
@@ -323,9 +321,9 @@ bool QmlProject::supportsKit(Kit *k, QString *errorMessage) const
     return true;
 }
 
-ProjectNode *QmlProject::rootProjectNode() const
+Internal::QmlProjectNode *QmlProject::rootProjectNode() const
 {
-    return m_rootNode;
+    return static_cast<Internal::QmlProjectNode *>(Project::rootProjectNode());
 }
 
 QStringList QmlProject::files(FilesMode) const
diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h
index d499a8aea959540034e85a61d58679d73b70fa1e..98d06e1767bcd9e974b9dbee52f6e2543371d7d4 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.h
+++ b/src/plugins/qmlprojectmanager/qmlproject.h
@@ -34,6 +34,7 @@
 #include "qmlprojectmanager_global.h"
 
 #include "qmlprojectmanager.h"
+#include "qmlprojectnodes.h"
 
 #include <projectexplorer/project.h>
 
@@ -47,10 +48,7 @@ namespace QmlProjectManager {
 
 class QmlProjectItem;
 
-namespace Internal {
-class QmlProjectFile;
-class QmlProjectNode;
-} // namespace Internal
+namespace Internal { class QmlProjectFile; }
 
 class QMLPROJECTMANAGER_EXPORT QmlProject : public ProjectExplorer::Project
 {
@@ -67,7 +65,7 @@ public:
 
     bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override;
 
-    ProjectExplorer::ProjectNode *rootProjectNode() const override;
+    Internal::QmlProjectNode *rootProjectNode() const override;
     QStringList files(FilesMode fileMode) const override;
 
     bool validProjectFile() const;
@@ -118,8 +116,6 @@ private:
     QStringList m_files;
 
     QPointer<QmlProjectItem> m_projectItem;
-
-    Internal::QmlProjectNode *m_rootNode;
 };
 
 } // namespace QmlProjectManager