From aadb6f16af94a2baff9d13772e9ddce33faa7650 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Thu, 5 Sep 2013 11:46:07 +0200
Subject: [PATCH] SessionManager: Apply 'static' pattern

Change-Id: I370f72fcf7a24216ee189979ce6b5c8bfc5f4140
Reviewed-by: David Schulz <david.schulz@digia.com>
---
 src/plugins/analyzerbase/analyzermanager.cpp  |   5 +-
 .../android/androidmanifesteditorwidget.cpp   |  10 +-
 src/plugins/bookmarks/bookmarkmanager.cpp     |  12 +-
 src/plugins/bookmarks/bookmarkmanager.h       |   9 -
 src/plugins/classview/classviewmanager.cpp    |   3 +-
 src/plugins/classview/classviewparser.cpp     |  29 +-
 src/plugins/classview/classviewparser.h       |   2 -
 .../cmakeprojectmanager/cmakeeditor.cpp       |   4 +-
 .../cmakelocatorfilter.cpp                    |  18 +-
 src/plugins/cpptools/cppmodelmanager.cpp      |  16 +-
 src/plugins/cpptools/cppmodelmanager_test.cpp |  13 +-
 src/plugins/cpptools/symbolsfindfilter.cpp    |   4 +-
 src/plugins/debugger/debuggermainwindow.cpp   |   4 +-
 src/plugins/debugger/debuggerplugin.cpp       |  45 +-
 src/plugins/designer/codemodelhelpers.cpp     |   3 +-
 src/plugins/designer/qtcreatorintegration.cpp |   6 +-
 src/plugins/designer/resourcehandler.cpp      |  14 +-
 src/plugins/madde/maemoqemumanager.cpp        |  23 +-
 .../projectexplorer/allprojectsfilter.cpp     |   7 +-
 .../projectexplorer/allprojectsfilter.h       |   7 +-
 .../projectexplorer/allprojectsfind.cpp       |  12 +-
 src/plugins/projectexplorer/allprojectsfind.h |   4 +-
 src/plugins/projectexplorer/appoutputpane.cpp |   2 +-
 src/plugins/projectexplorer/buildmanager.cpp  |   4 +-
 src/plugins/projectexplorer/buildmanager.h    |   2 +-
 .../projectexplorer/currentprojectfilter.cpp  |   6 +-
 .../projectexplorer/currentprojectfilter.h    |   4 +-
 .../projectexplorer/currentprojectfind.cpp    |  16 +-
 .../projectexplorer/currentprojectfind.h      |  10 +-
 .../projectexplorer/editorconfiguration.cpp   |  18 +-
 .../miniprojecttargetselector.cpp             |   6 +-
 .../projectexplorer/projectexplorer.cpp       |  91 ++--
 src/plugins/projectexplorer/projectexplorer.h |   5 -
 .../projectfilewizardextension.cpp            |   5 +-
 .../projectexplorer/projecttreewidget.cpp     |  22 +-
 .../projectexplorer/projectwelcomepage.cpp    |  47 +-
 .../projectexplorer/projectwelcomepage.h      |   6 +-
 src/plugins/projectexplorer/projectwindow.cpp |  17 +-
 src/plugins/projectexplorer/session.cpp       | 456 ++++++++++--------
 src/plugins/projectexplorer/session.h         | 122 ++---
 .../pythoneditor/wizard/pythonclasswizard.cpp |   4 +-
 .../qbsprojectmanagerplugin.cpp               |  15 +-
 src/plugins/qmljstools/qmljsmodelmanager.cpp  |   6 +-
 src/plugins/qmljstools/qmljsplugindumper.cpp  |   4 +-
 src/plugins/qmlprofiler/qmlprofilertool.cpp   |  12 +-
 .../qt4projectmanager/externaleditors.cpp     |   3 +-
 .../librarydetailscontroller.cpp              |  12 +-
 .../qt4projectmanager/qt4projectmanager.cpp   |  17 +-
 .../qt4projectmanagerplugin.cpp               |  14 +-
 .../unconfiguredprojectpanel.cpp              |   7 +-
 src/plugins/qtsupport/uicodemodelsupport.cpp  |   2 +-
 .../texteditor/generichighlighter/manager.h   |   1 +
 src/plugins/todo/todoitemsprovider.cpp        |  10 +-
 src/plugins/valgrind/memcheckerrorview.cpp    |   4 +-
 src/plugins/valgrind/memchecktool.cpp         |   6 +-
 src/plugins/valgrind/suppressiondialog.cpp    |   5 +-
 src/plugins/valgrind/valgrindtool.cpp         |   7 +-
 src/plugins/vcsbase/vcsbaseeditor.cpp         |   3 +-
 58 files changed, 543 insertions(+), 678 deletions(-)

diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp
index e5911b74750..6fe2f45a9f9 100644
--- a/src/plugins/analyzerbase/analyzermanager.cpp
+++ b/src/plugins/analyzerbase/analyzermanager.cpp
@@ -48,6 +48,7 @@
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/session.h>
 #include <projectexplorer/target.h>
 
 #include <utils/fancymainwindow.h>
@@ -425,7 +426,7 @@ bool AnalyzerManagerPrivate::isActionRunnable(AnalyzerAction *action) const
         return true;
 
     ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    return pe->canRun(pe->startupProject(), action->tool()->runMode());
+    return pe->canRun(SessionManager::startupProject(), action->tool()->runMode());
 }
 
 void AnalyzerManagerPrivate::startTool()
@@ -578,7 +579,7 @@ void AnalyzerManagerPrivate::saveToolSettings(AnalyzerAction *action)
 void AnalyzerManagerPrivate::updateRunActions()
 {
     ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    Project *project = pe->startupProject();
+    Project *project = SessionManager::startupProject();
 
     QString disabledReason;
     if (m_isRunning)
diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp
index ebbcb162154..751e703e152 100644
--- a/src/plugins/android/androidmanifesteditorwidget.cpp
+++ b/src/plugins/android/androidmanifesteditorwidget.cpp
@@ -65,6 +65,7 @@
 #include <QFileDialog>
 #include <QTimer>
 
+using namespace ProjectExplorer;
 using namespace Android;
 using namespace Android::Internal;
 
@@ -78,15 +79,14 @@ bool checkPackageName(const QString &packageName)
     return QRegExp(packageNameRegExp).exactMatch(packageName);
 }
 
-ProjectExplorer::Project *androidProject(const QString &file)
+Project *androidProject(const QString &file)
 {
-    ProjectExplorer::SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
     Utils::FileName fileName = Utils::FileName::fromString(file);
-    foreach (ProjectExplorer::Project *project, session->projects()) {
+    foreach (Project *project, SessionManager::projects()) {
         if (!project->activeTarget())
             continue;
-        ProjectExplorer::Kit *kit = project->activeTarget()->kit();
-        if (ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(kit) == Constants::ANDROID_DEVICE_TYPE
+        Kit *kit = project->activeTarget()->kit();
+        if (DeviceTypeKitInformation::deviceTypeId(kit) == Android::Constants::ANDROID_DEVICE_TYPE
                 && fileName.isChildOf(Utils::FileName::fromString(project->projectDirectory())))
             return project;
     }
diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp
index 55006257615..6d715c8d4f9 100644
--- a/src/plugins/bookmarks/bookmarkmanager.cpp
+++ b/src/plugins/bookmarks/bookmarkmanager.cpp
@@ -355,7 +355,7 @@ BookmarkManager::BookmarkManager() :
     connect(Core::ICore::instance(), SIGNAL(contextChanged(QList<Core::IContext*>,Core::Context)),
             this, SLOT(updateActionStatus()));
 
-    connect(ProjectExplorerPlugin::instance()->session(), SIGNAL(sessionLoaded(QString)),
+    connect(SessionManager::instance(), SIGNAL(sessionLoaded(QString)),
             this, SLOT(loadBookmarks()));
 
     updateActionStatus();
@@ -645,12 +645,6 @@ TextEditor::ITextEditor *BookmarkManager::currentTextEditor() const
     return qobject_cast<TextEditor::ITextEditor *>(currEditor);
 }
 
-/* Returns the current session. */
-SessionManager *BookmarkManager::sessionManager() const
-{
-    return ProjectExplorerPlugin::instance()->session();
-}
-
 BookmarkManager::State BookmarkManager::state() const
 {
     if (m_bookmarksMap.empty())
@@ -826,7 +820,7 @@ void BookmarkManager::saveBookmarks()
     foreach (const Bookmark *bookmark, m_bookmarksList)
             list << bookmarkToString(bookmark);
 
-    sessionManager()->setValue(QLatin1String("Bookmarks"), list);
+    SessionManager::setValue(QLatin1String("Bookmarks"), list);
 }
 
 void BookmarkManager::operateTooltip(TextEditor::ITextEditor *textEditor, const QPoint &pos, Bookmark *mark)
@@ -844,7 +838,7 @@ void BookmarkManager::operateTooltip(TextEditor::ITextEditor *textEditor, const
 void BookmarkManager::loadBookmarks()
 {
     removeAllBookmarks();
-    const QStringList &list = sessionManager()->value(QLatin1String("Bookmarks")).toStringList();
+    const QStringList &list = SessionManager::value(QLatin1String("Bookmarks")).toStringList();
     foreach (const QString &bookmarkString, list)
         addBookmark(bookmarkString);
 
diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h
index 7727dc49237..65ac7f21912 100644
--- a/src/plugins/bookmarks/bookmarkmanager.h
+++ b/src/plugins/bookmarks/bookmarkmanager.h
@@ -42,14 +42,6 @@
 #include <QPixmap>
 #include <QStyledItemDelegate>
 
-namespace ProjectExplorer {
-class SessionManager;
-}
-
-namespace Core {
-class IEditor;
-}
-
 namespace Bookmarks {
 namespace Internal {
 
@@ -124,7 +116,6 @@ private slots:
 
 private:
     TextEditor::ITextEditor *currentTextEditor() const;
-    ProjectExplorer::SessionManager* sessionManager() const;
 
     void documentPrevNext(bool next);
 
diff --git a/src/plugins/classview/classviewmanager.cpp b/src/plugins/classview/classviewmanager.cpp
index 71d6fea0a8c..5a87ff70db2 100644
--- a/src/plugins/classview/classviewmanager.cpp
+++ b/src/plugins/classview/classviewmanager.cpp
@@ -227,8 +227,7 @@ void Manager::initialize()
     connect(this, SIGNAL(stateChanged(bool)), SLOT(onStateChanged(bool)), Qt::QueuedConnection);
 
     // connections to enable/disable navi widget factory
-    ProjectExplorer::SessionManager *sessionManager =
-        ProjectExplorer::ProjectExplorerPlugin::instance()->session();
+    QObject *sessionManager = ProjectExplorer::SessionManager::instance();
     connect(sessionManager, SIGNAL(projectAdded(ProjectExplorer::Project*)),
             SLOT(onProjectListChanged()), Qt::QueuedConnection);
     connect(sessionManager, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
diff --git a/src/plugins/classview/classviewparser.cpp b/src/plugins/classview/classviewparser.cpp
index 09b02d9f9bc..a7dea53b66b 100644
--- a/src/plugins/classview/classviewparser.cpp
+++ b/src/plugins/classview/classviewparser.cpp
@@ -58,6 +58,8 @@
 
 enum { debug = false };
 
+using namespace ProjectExplorer;
+
 namespace ClassView {
 namespace Internal {
 
@@ -274,8 +276,7 @@ ParserTreeItem::ConstPtr Parser::parse()
     ParserTreeItem::Ptr rootItem(new ParserTreeItem());
 
     // check all projects
-    QList<ProjectExplorer::Project *> projects = getProjectList();
-    foreach (const ProjectExplorer::Project *prj, projects) {
+    foreach (const Project *prj, SessionManager::projects()) {
         if (!prj)
             continue;
 
@@ -293,7 +294,7 @@ ParserTreeItem::ConstPtr Parser::parse()
 
         if (d->flatMode) {
             // use prj path (prjType) as a project id
-//            addProject(item, prj->files(ProjectExplorer::Project::ExcludeGeneratedFiles), prjType);
+//            addProject(item, prj->files(Project::ExcludeGeneratedFiles), prjType);
             //! \todo return back, works too long
             ParserTreeItem::Ptr flatItem = createFlatTree(projectList);
             item.swap(flatItem);
@@ -673,10 +674,9 @@ void Parser::resetData(const CPlusPlus::Snapshot &snapshot)
     QStringList fileList;
 
     // check all projects
-    QList<ProjectExplorer::Project *> projects = getProjectList();
-    foreach (const ProjectExplorer::Project *prj, projects) {
+    foreach (const Project *prj, SessionManager::projects()) {
         if (prj)
-            fileList += prj->files(ProjectExplorer::Project::ExcludeGeneratedFiles);
+            fileList += prj->files(Project::ExcludeGeneratedFiles);
     }
     setFileList(fileList);
 
@@ -819,22 +819,5 @@ QStringList Parser::addProjectNode(const ParserTreeItem::Ptr &item,
     return projectList;
 }
 
-/*!
-    Returns the current project list.
-*/
-
-QList<ProjectExplorer::Project *> Parser::getProjectList() const
-{
-    QList<ProjectExplorer::Project *> list;
-
-    // check all projects
-    ProjectExplorer::SessionManager *sessionManager
-            = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-
-    list = sessionManager->projects();
-
-    return list;
-}
-
 } // namespace Internal
 } // namespace ClassView
diff --git a/src/plugins/classview/classviewparser.h b/src/plugins/classview/classviewparser.h
index a8151cb8d20..84ae7a84c13 100644
--- a/src/plugins/classview/classviewparser.h
+++ b/src/plugins/classview/classviewparser.h
@@ -118,8 +118,6 @@ protected:
 
     QStringList projectNodeFileList(const ProjectExplorer::FolderNode *node) const;
 
-    QList<ProjectExplorer::Project *> getProjectList() const;
-
     ParserTreeItem::Ptr createFlatTree(const QStringList &projectList);
 
 private:
diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
index e27e9f955d9..5b2a5273398 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
@@ -94,9 +94,7 @@ void CMakeEditor::markAsChanged()
 
 void CMakeEditor::build()
 {
-    QList<ProjectExplorer::Project *> projects =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects();
-    foreach (ProjectExplorer::Project *p, projects) {
+    foreach (ProjectExplorer::Project *p, ProjectExplorer::SessionManager::projects()) {
         CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(p);
         if (cmakeProject) {
             if (cmakeProject->isProjectFile(document()->filePath())) {
diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp
index 2e145b4261e..ab059a06396 100644
--- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp
@@ -41,6 +41,7 @@
 
 using namespace CMakeProjectManager;
 using namespace CMakeProjectManager::Internal;
+using namespace ProjectExplorer;
 using namespace Utils;
 
 CMakeLocatorFilter::CMakeLocatorFilter()
@@ -49,10 +50,9 @@ CMakeLocatorFilter::CMakeLocatorFilter()
     setDisplayName(tr("Build CMake target"));
     setShortcutString(QLatin1String("cm"));
 
-    ProjectExplorer::SessionManager *sm = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-    connect(sm, SIGNAL(projectAdded(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(projectAdded(ProjectExplorer::Project*)),
             this, SLOT(slotProjectListUpdated()));
-    connect(sm, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)),
             this, SLOT(slotProjectListUpdated()));
 
     // Initialize the filter
@@ -69,9 +69,7 @@ QList<Locator::FilterEntry> CMakeLocatorFilter::matchesFor(QFutureInterface<Loca
     Q_UNUSED(future)
     QList<Locator::FilterEntry> result;
 
-    QList<ProjectExplorer::Project *> projects =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects();
-    foreach (ProjectExplorer::Project *p, projects) {
+    foreach (Project *p, SessionManager::projects()) {
         CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(p);
         if (cmakeProject) {
             foreach (const CMakeBuildTarget &ct, cmakeProject->buildTargets()) {
@@ -93,9 +91,7 @@ void CMakeLocatorFilter::accept(Locator::FilterEntry selection) const
     // Get the project containing the target selected
     CMakeProject *cmakeProject = 0;
 
-    QList<ProjectExplorer::Project *> projects =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects();
-    foreach (ProjectExplorer::Project *p, projects) {
+    foreach (Project *p, SessionManager::projects()) {
         cmakeProject = qobject_cast<CMakeProject *>(p);
         if (cmakeProject && cmakeProject->projectFilePath() == selection.internalData.toString())
             break;
@@ -136,9 +132,7 @@ void CMakeLocatorFilter::slotProjectListUpdated()
 {
     CMakeProject *cmakeProject = 0;
 
-    QList<ProjectExplorer::Project *> projects =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects();
-    foreach (ProjectExplorer::Project *p, projects) {
+    foreach (Project *p, SessionManager::projects()) {
         cmakeProject = qobject_cast<CMakeProject *>(p);
         if (cmakeProject)
             break;
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 59b4b047191..ffaf06383d3 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -240,24 +240,18 @@ CppModelManager::CppModelManager(QObject *parent)
 
     m_dirty = true;
 
-    ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
-    QTC_ASSERT(pe, return);
-
     m_delayedGcTimer = new QTimer(this);
     m_delayedGcTimer->setSingleShot(true);
     connect(m_delayedGcTimer, SIGNAL(timeout()), this, SLOT(GC()));
 
-    ProjectExplorer::SessionManager *session = pe->session();
-    connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)),
+    QObject *sessionManager = ProjectExplorer::SessionManager::instance();
+    connect(sessionManager, SIGNAL(projectAdded(ProjectExplorer::Project*)),
             this, SLOT(onProjectAdded(ProjectExplorer::Project*)));
-
-    connect(session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
+    connect(sessionManager, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
             this, SLOT(onAboutToRemoveProject(ProjectExplorer::Project*)));
-
-    connect(session, SIGNAL(aboutToLoadSession(QString)),
+    connect(sessionManager, SIGNAL(aboutToLoadSession(QString)),
             this, SLOT(onAboutToLoadSession()));
-
-    connect(session, SIGNAL(aboutToUnloadSession(QString)),
+    connect(sessionManager, SIGNAL(aboutToUnloadSession(QString)),
             this, SLOT(onAboutToUnloadSession()));
 
     connect(Core::ICore::instance(), SIGNAL(coreAboutToClose()),
diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp
index bdcbf254190..8ffd9a93396 100644
--- a/src/plugins/cpptools/cppmodelmanager_test.cpp
+++ b/src/plugins/cpptools/cppmodelmanager_test.cpp
@@ -49,12 +49,12 @@
 #endif
 
 using namespace CppTools::Internal;
+using namespace ProjectExplorer;
 
 typedef CPlusPlus::Document Document;
 typedef CppTools::CppModelManagerInterface::ProjectInfo ProjectInfo;
 typedef CppTools::ProjectPart ProjectPart;
 typedef CppTools::ProjectFile ProjectFile;
-typedef ProjectExplorer::Project Project;
 
 Q_DECLARE_METATYPE(QList<ProjectFile>)
 
@@ -119,7 +119,7 @@ class ExampleProjectConfigurator
 {
 public:
     ExampleProjectConfigurator(const QString &projectFile,
-                               ProjectExplorer::ProjectExplorerPlugin *projectExplorer)
+                               ProjectExplorerPlugin *projectExplorer)
     {
         const QString projectUserFile = projectFile + QLatin1String(".user");
         QVERIFY(!QFileInfo(projectUserFile).exists());
@@ -142,13 +142,13 @@ public:
         QVERIFY(QFile::remove(m_fileToRemove));
     }
 
-    ProjectExplorer::Project *project() const
+    Project *project() const
     {
         return m_project;
     }
 
 private:
-    ProjectExplorer::Project *m_project;
+    Project *m_project;
     QString m_fileToRemove;
 };
 
@@ -661,7 +661,7 @@ void CppToolsPlugin::test_modelmanager_extraeditorsupport_uiFiles()
     const QString projectFile = testDataDirectory.file(QLatin1String("testdata_guiproject1.pro"));
 
     // Open project with *.ui file
-    ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
+    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
     ExampleProjectConfigurator exampleProjectConfigurator(projectFile, pe);
     Project *project = exampleProjectConfigurator.project();
 
@@ -698,8 +698,7 @@ void CppToolsPlugin::test_modelmanager_extraeditorsupport_uiFiles()
     QCOMPARE(QFileInfo(includedFiles.at(1)).fileName(), QLatin1String("ui_mainwindow.h"));
 
     // Close Project
-    ProjectExplorer::SessionManager *sm = pe->session();
-    sm->removeProject(project);
+    SessionManager::removeProject(project);
     helper.waitForFinishedGc();
 }
 
diff --git a/src/plugins/cpptools/symbolsfindfilter.cpp b/src/plugins/cpptools/symbolsfindfilter.cpp
index 1afc91e4e7b..ad15b7d6bc2 100644
--- a/src/plugins/cpptools/symbolsfindfilter.cpp
+++ b/src/plugins/cpptools/symbolsfindfilter.cpp
@@ -133,10 +133,8 @@ void SymbolsFindFilter::startSearch(Find::SearchResult *search)
     SymbolSearcher::Parameters parameters = search->userData().value<SymbolSearcher::Parameters>();
     QSet<QString> projectFileNames;
     if (parameters.scope == SymbolSearcher::SearchProjectsOnly) {
-        foreach (ProjectExplorer::Project *project,
-                 ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects()) {
+        foreach (ProjectExplorer::Project *project, ProjectExplorer::SessionManager::projects())
             projectFileNames += project->files(ProjectExplorer::Project::AllFiles).toSet();
-        }
     }
 
     QFutureWatcher<Find::SearchResultItem> *watcher = new QFutureWatcher<Find::SearchResultItem>();
diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp
index 076a9159c24..ab1fef45571 100644
--- a/src/plugins/debugger/debuggermainwindow.cpp
+++ b/src/plugins/debugger/debuggermainwindow.cpp
@@ -48,7 +48,6 @@
 #include <coreplugin/rightpane.h>
 
 #include <projectexplorer/project.h>
-#include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/runconfiguration.h>
 #include <projectexplorer/session.h>
 #include <projectexplorer/target.h>
@@ -469,8 +468,7 @@ void DebuggerMainWindow::addStagedMenuEntries()
 
 QWidget *DebuggerMainWindow::createContents(IMode *mode)
 {
-    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    connect(pe->session(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
         d, SLOT(updateUiForProject(ProjectExplorer::Project*)));
 
     d->m_viewsMenu = Core::ActionManager::actionContainer(Core::Id(Core::Constants::M_WINDOW_VIEWS));
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index b133e2594dd..7c8b74f50a6 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -425,11 +425,6 @@ void addTcfOptionPages(QList<IOptionsPage*> *opts);
 void addLldbOptionPages(QList<IOptionsPage*> *opts);
 #endif
 
-static SessionManager *sessionManager()
-{
-    return ProjectExplorerPlugin::instance()->session();
-}
-
 static QToolButton *toolButton(QAction *action)
 {
     QToolButton *button = new QToolButton;
@@ -1565,23 +1560,20 @@ void DebuggerPluginPrivate::languagesChanged()
 
 void DebuggerPluginPrivate::debugProject()
 {
-    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    if (Project *pro = pe->startupProject())
-        pe->runProject(pro, DebugRunMode);
+    if (Project *pro = SessionManager::startupProject())
+        ProjectExplorerPlugin::instance()->runProject(pro, DebugRunMode);
 }
 
 void DebuggerPluginPrivate::debugProjectWithoutDeploy()
 {
-    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    if (Project *pro = pe->startupProject())
-        pe->runProject(pro, DebugRunMode, true);
+    if (Project *pro = SessionManager::startupProject())
+        ProjectExplorerPlugin::instance()->runProject(pro, DebugRunMode, true);
 }
 
 void DebuggerPluginPrivate::debugProjectBreakMain()
 {
-    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    if (Project *pro = pe->startupProject())
-        pe->runProject(pro, DebugRunModeWithBreakOnMain);
+    if (Project *pro = SessionManager::startupProject())
+        ProjectExplorerPlugin::instance()->runProject(pro, DebugRunModeWithBreakOnMain);
 }
 
 void DebuggerPluginPrivate::startAndDebugApplication()
@@ -1776,11 +1768,10 @@ void DebuggerPluginPrivate::attachToQmlPort()
     //
     // get files from all the projects in the session
     //
-    SessionManager *sessionManager = ProjectExplorerPlugin::instance()->session();
-    QList<Project *> projects = sessionManager->projects();
-    if (Project *startupProject = ProjectExplorerPlugin::instance()->startupProject()) {
+    QList<Project *> projects = SessionManager::projects();
+    if (Project *startupProject = SessionManager::startupProject()) {
         // startup project first
-        projects.removeOne(ProjectExplorerPlugin::instance()->startupProject());
+        projects.removeOne(startupProject);
         projects.insert(0, startupProject);
     }
     QStringList sourceFiles;
@@ -2354,7 +2345,7 @@ void DebuggerPluginPrivate::updateDebugActions()
         return;
 
     ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    Project *project = pe->startupProject();
+    Project *project = SessionManager::startupProject();
     const bool canRun = pe->canRun(project, DebugRunMode);
     m_startAction->setEnabled(canRun);
     m_startAction->setToolTip(canRun ? QString() : pe->cannotRunReason(project, DebugRunMode));
@@ -2507,14 +2498,12 @@ const CPlusPlus::Snapshot &DebuggerPluginPrivate::cppCodeModelSnapshot() const
 
 void DebuggerCore::setSessionValue(const QByteArray &key, const QVariant &value)
 {
-    QTC_ASSERT(sessionManager(), return);
-    sessionManager()->setValue(QString::fromUtf8(key), value);
+    SessionManager::setValue(QString::fromUtf8(key), value);
 }
 
 QVariant DebuggerCore::sessionValue(const QByteArray &key)
 {
-    QTC_ASSERT(sessionManager(), return QVariant());
-    return sessionManager()->value(QString::fromUtf8(key));
+    return SessionManager::value(QString::fromUtf8(key));
 }
 
 void DebuggerPluginPrivate::openTextEditor(const QString &titlePattern0,
@@ -3198,11 +3187,11 @@ void DebuggerPluginPrivate::extensionsInitialized()
         SLOT(fontSettingsChanged(TextEditor::FontSettings)));
 
     // ProjectExplorer
-    connect(sessionManager(), SIGNAL(sessionLoaded(QString)),
+    connect(SessionManager::instance(), SIGNAL(sessionLoaded(QString)),
         SLOT(sessionLoaded()));
-    connect(sessionManager(), SIGNAL(aboutToSaveSession()),
+    connect(SessionManager::instance(), SIGNAL(aboutToSaveSession()),
         SLOT(aboutToSaveSession()));
-    connect(sessionManager(), SIGNAL(aboutToUnloadSession(QString)),
+    connect(SessionManager::instance(), SIGNAL(aboutToUnloadSession(QString)),
         SLOT(aboutToUnloadSession()));
     connect(ProjectExplorerPlugin::instance(), SIGNAL(updateRunActions()),
         SLOT(updateDebugActions()));
@@ -3273,7 +3262,7 @@ void DebuggerPluginPrivate::extensionsInitialized()
     setInitialState();
     connectEngine(0);
 
-    connect(sessionManager(),
+    connect(SessionManager::instance(),
         SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
         SLOT(onCurrentProjectChanged(ProjectExplorer::Project*)));
 
@@ -3370,7 +3359,7 @@ void DebuggerPluginPrivate::showModuleSections(const QString &moduleName,
 void DebuggerPluginPrivate::aboutToShutdown()
 {
     m_plugin->removeObject(this);
-    disconnect(sessionManager(),
+    disconnect(SessionManager::instance(),
         SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
         this, 0);
 }
diff --git a/src/plugins/designer/codemodelhelpers.cpp b/src/plugins/designer/codemodelhelpers.cpp
index ffb136080b6..5b26c45d1e4 100644
--- a/src/plugins/designer/codemodelhelpers.cpp
+++ b/src/plugins/designer/codemodelhelpers.cpp
@@ -50,8 +50,7 @@ static const char setupUiC[] = "setupUi";
 // Find the generated "ui_form.h" header of the form via project.
 static QString generatedHeaderOf(const QString &uiFileName)
 {
-    const ProjectExplorer::SessionManager *sessionMgr = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-    if (const ProjectExplorer::Project *uiProject = sessionMgr->projectForFile(uiFileName))
+    if (const ProjectExplorer::Project *uiProject = ProjectExplorer::SessionManager::projectForFile(uiFileName))
         return uiProject->generatedUiHeader(uiFileName);
     return QString();
 }
diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp
index 569e1a3a7a1..d792a259285 100644
--- a/src/plugins/designer/qtcreatorintegration.cpp
+++ b/src/plugins/designer/qtcreatorintegration.cpp
@@ -60,6 +60,7 @@ enum { indentation = 4 };
 using namespace Designer::Internal;
 using namespace CPlusPlus;
 using namespace TextEditor;
+using namespace ProjectExplorer;
 
 static QString msgClassNotFound(const QString &uiClassName, const QList<Document::Ptr> &docList)
 {
@@ -535,12 +536,11 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName,
     // Retrieve code model snapshot restricted to project of ui file or the working copy.
     Snapshot docTable = CppTools::CppModelManagerInterface::instance()->snapshot();
     Snapshot newDocTable;
-    ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
-    const ProjectExplorer::Project *uiProject = pe->session()->projectForFile(currentUiFile);
+    const Project *uiProject = SessionManager::projectForFile(currentUiFile);
     if (uiProject) {
         Snapshot::const_iterator end = docTable.end();
         for (Snapshot::iterator it = docTable.begin(); it != end; ++it) {
-            const ProjectExplorer::Project *project = pe->session()->projectForFile(it.key());
+            const Project *project = SessionManager::projectForFile(it.key());
             if (project == uiProject)
                 newDocTable.insert(it.value());
         }
diff --git a/src/plugins/designer/resourcehandler.cpp b/src/plugins/designer/resourcehandler.cpp
index bde77e5edba..b7e85dc067f 100644
--- a/src/plugins/designer/resourcehandler.cpp
+++ b/src/plugins/designer/resourcehandler.cpp
@@ -45,10 +45,7 @@
 
 #include <utils/qtcassert.h>
 
-using ProjectExplorer::NodesVisitor;
-using ProjectExplorer::ProjectNode;
-using ProjectExplorer::FolderNode;
-using ProjectExplorer::FileNode;
+using namespace ProjectExplorer;
 
 namespace Designer {
 namespace Internal {
@@ -100,8 +97,8 @@ void ResourceHandler::ensureInitialized()
 {
     if (m_sessionNode)
         return;
-    ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
-    m_sessionNode = pe->session()->sessionNode();
+
+    m_sessionNode = ProjectExplorer::SessionManager::sessionNode();
     m_sessionWatcher = new ProjectExplorer::NodesWatcher();
 
     connect(m_sessionWatcher, SIGNAL(filesAdded()), this, SLOT(updateResources()));
@@ -137,9 +134,8 @@ void ResourceHandler::updateResources()
     if (Designer::Constants::Internal::debug)
         qDebug() << "ResourceHandler::updateResources()" << fileName;
 
-    ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
-    // filename could change in the meantime.
-    ProjectExplorer::Project *project = pe->session()->projectForFile(fileName);
+    // Filename could change in the meantime.
+    Project *project = SessionManager::projectForFile(fileName);
 
     // Does the file belong to a project?
     if (project) {
diff --git a/src/plugins/madde/maemoqemumanager.cpp b/src/plugins/madde/maemoqemumanager.cpp
index 099328e9dd3..9a5ff3d6f31 100644
--- a/src/plugins/madde/maemoqemumanager.cpp
+++ b/src/plugins/madde/maemoqemumanager.cpp
@@ -107,12 +107,12 @@ MaemoQemuManager::MaemoQemuManager(QObject *parent)
         this, SLOT(qtVersionsChanged(QList<int>,QList<int>,QList<int>)));
 
     // listen to project add, remove and startup changes to udate start button
-    SessionManager *session = ProjectExplorerPlugin::instance()->session();
-    connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), this,
+    QObject *sessionManager = SessionManager::instance();
+    connect(sessionManager, SIGNAL(projectAdded(ProjectExplorer::Project*)), this,
         SLOT(projectAdded(ProjectExplorer::Project*)));
-    connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)), this,
+    connect(sessionManager, SIGNAL(projectRemoved(ProjectExplorer::Project*)), this,
         SLOT(projectRemoved(ProjectExplorer::Project*)));
-    connect(session, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
+    connect(sessionManager, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
         this, SLOT(projectChanged(ProjectExplorer::Project*)));
 
     connect(m_qemuProcess, SIGNAL(error(QProcess::ProcessError)), this,
@@ -283,10 +283,8 @@ void MaemoQemuManager::systemChanged()
 void MaemoQemuManager::environmentChanged()
 {
     // likely to happen when the Qt version changes the build config is using
-    if (ProjectExplorerPlugin *explorer = ProjectExplorerPlugin::instance()) {
-        if (Project *project = explorer->session()->startupProject())
-            toggleStarterButton(project->activeTarget());
-    }
+    if (Project *project = SessionManager::startupProject())
+        toggleStarterButton(project->activeTarget());
 }
 
 void MaemoQemuManager::deviceConfigurationChanged(ProjectExplorer::Target *target)
@@ -297,7 +295,7 @@ void MaemoQemuManager::deviceConfigurationChanged(ProjectExplorer::Target *targe
 void MaemoQemuManager::startRuntime()
 {
     m_userTerminated = false;
-    Project *p = ProjectExplorerPlugin::instance()->session()->startupProject();
+    Project *p = SessionManager::startupProject();
     if (!p)
         return;
     BaseQtVersion *version;
@@ -470,8 +468,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target)
     if (m_runningQtId == uniqueId)
         isRunning = false;
 
-    const Project * const p
-        = ProjectExplorerPlugin::instance()->session()->startupProject();
+    const Project * const p = SessionManager::startupProject();
     const bool qemuButtonEnabled
         = p && p->activeTarget() && MaemoGlobal::hasMaemoDevice(target->kit())
             && m_runtimes.value(uniqueId, MaemoQemuRuntime()).isValid()
@@ -482,9 +479,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target)
 
 bool MaemoQemuManager::sessionHasMaemoTarget() const
 {
-    ProjectExplorerPlugin *explorer = ProjectExplorerPlugin::instance();
-    const QList<Project*> &projects = explorer->session()->projects();
-    foreach (const Project *p, projects) {
+    foreach (const Project *p, SessionManager::projects()) {
         foreach (const Target * const target, p->targets()) {
             if (MaemoGlobal::hasMaemoDevice(target->kit()))
                 return true;
diff --git a/src/plugins/projectexplorer/allprojectsfilter.cpp b/src/plugins/projectexplorer/allprojectsfilter.cpp
index 4c858928651..32a0aeb7512 100644
--- a/src/plugins/projectexplorer/allprojectsfilter.cpp
+++ b/src/plugins/projectexplorer/allprojectsfilter.cpp
@@ -37,8 +37,7 @@ using namespace Locator;
 using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
-AllProjectsFilter::AllProjectsFilter(ProjectExplorerPlugin *pe)
-    : m_projectExplorer(pe), m_filesUpToDate(false)
+AllProjectsFilter::AllProjectsFilter() : m_filesUpToDate(false)
 {
     setId("Files in any project");
     setDisplayName(tr("Files in Any Project"));
@@ -46,7 +45,7 @@ AllProjectsFilter::AllProjectsFilter(ProjectExplorerPlugin *pe)
     setPriority(Low);
     setIncludedByDefault(true);
 
-    connect(m_projectExplorer, SIGNAL(fileListChanged()),
+    connect(ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()),
             this, SLOT(markFilesAsOutOfDate()));
 }
 
@@ -61,7 +60,7 @@ void AllProjectsFilter::updateFiles()
         return;
     m_filesUpToDate = true;
     files().clear();
-    foreach (Project *project, m_projectExplorer->session()->projects())
+    foreach (Project *project, SessionManager::projects())
         files().append(project->files(Project::AllFiles));
     qSort(files());
     generateFileNames();
diff --git a/src/plugins/projectexplorer/allprojectsfilter.h b/src/plugins/projectexplorer/allprojectsfilter.h
index fcab19fafc8..dbdbebe7f28 100644
--- a/src/plugins/projectexplorer/allprojectsfilter.h
+++ b/src/plugins/projectexplorer/allprojectsfilter.h
@@ -35,9 +35,6 @@
 #include <QFutureInterface>
 
 namespace ProjectExplorer {
-
-class ProjectExplorerPlugin;
-
 namespace Internal {
 
 class AllProjectsFilter : public Locator::BaseFileFilter
@@ -45,7 +42,7 @@ class AllProjectsFilter : public Locator::BaseFileFilter
     Q_OBJECT
 
 public:
-    explicit AllProjectsFilter(ProjectExplorerPlugin *pe);
+    AllProjectsFilter();
     void refresh(QFutureInterface<void> &future);
 
 protected:
@@ -53,8 +50,8 @@ protected:
 
 private slots:
     void markFilesAsOutOfDate();
+
 private:
-    ProjectExplorerPlugin *m_projectExplorer;
     bool m_filesUpToDate;
 };
 
diff --git a/src/plugins/projectexplorer/allprojectsfind.cpp b/src/plugins/projectexplorer/allprojectsfind.cpp
index 78615aa4b0d..27a9e14060a 100644
--- a/src/plugins/projectexplorer/allprojectsfind.cpp
+++ b/src/plugins/projectexplorer/allprojectsfind.cpp
@@ -48,11 +48,10 @@ using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 using namespace TextEditor;
 
-AllProjectsFind::AllProjectsFind(ProjectExplorerPlugin *plugin)
-    : m_plugin(plugin),
-      m_configWidget(0)
+AllProjectsFind::AllProjectsFind()
+    :  m_configWidget(0)
 {
-    connect(m_plugin, SIGNAL(fileListChanged()), this, SLOT(handleFileListChanged()));
+    connect(ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()), this, SLOT(handleFileListChanged()));
 }
 
 QString AllProjectsFind::id() const
@@ -67,15 +66,14 @@ QString AllProjectsFind::displayName() const
 
 bool AllProjectsFind::isEnabled() const
 {
-    return BaseFileFind::isEnabled()
-            && m_plugin->session()->projects().count() > 0;
+    return BaseFileFind::isEnabled() && SessionManager::hasProjects();
 }
 
 Utils::FileIterator *AllProjectsFind::files(const QStringList &nameFilters,
                                             const QVariant &additionalParameters) const
 {
     Q_UNUSED(additionalParameters)
-    return filesForProjects(nameFilters, m_plugin->session()->projects());
+    return filesForProjects(nameFilters, SessionManager::projects());
 }
 
 Utils::FileIterator *AllProjectsFind::filesForProjects(const QStringList &nameFilters,
diff --git a/src/plugins/projectexplorer/allprojectsfind.h b/src/plugins/projectexplorer/allprojectsfind.h
index e8f619231e1..7781e2fdef6 100644
--- a/src/plugins/projectexplorer/allprojectsfind.h
+++ b/src/plugins/projectexplorer/allprojectsfind.h
@@ -36,7 +36,6 @@
 
 namespace ProjectExplorer {
 
-class ProjectExplorerPlugin;
 class Project;
 
 namespace Internal {
@@ -46,7 +45,7 @@ class AllProjectsFind : public TextEditor::BaseFileFind
     Q_OBJECT
 
 public:
-    AllProjectsFind(ProjectExplorerPlugin *plugin);
+    AllProjectsFind();
 
     QString id() const;
     QString displayName() const;
@@ -71,7 +70,6 @@ private slots:
     void handleFileListChanged();
 
 private:
-    ProjectExplorerPlugin *m_plugin;
     QPointer<QWidget> m_configWidget;
 };
 
diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp
index e0969dc8df7..24aae9d3c3e 100644
--- a/src/plugins/projectexplorer/appoutputpane.cpp
+++ b/src/plugins/projectexplorer/appoutputpane.cpp
@@ -167,7 +167,7 @@ AppOutputPane::AppOutputPane() :
 
     m_mainWidget->setLayout(layout);
 
-    connect(ProjectExplorerPlugin::instance()->session(), SIGNAL(aboutToUnloadSession(QString)),
+    connect(SessionManager::instance(), SIGNAL(aboutToUnloadSession(QString)),
             this, SLOT(aboutToUnloadSession()));
     connect(ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()),
             this, SLOT(updateFromSettings()));
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index 2680222a418..bdfbbfa1468 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -111,7 +111,7 @@ BuildManagerPrivate::BuildManagerPrivate() :
 {
 }
 
-BuildManager::BuildManager(ProjectExplorerPlugin *parent, QAction *cancelBuildAction)
+BuildManager::BuildManager(QObject *parent, QAction *cancelBuildAction)
     : QObject(parent), d(new BuildManagerPrivate)
 {
     connect(&d->m_watcher, SIGNAL(finished()),
@@ -124,7 +124,7 @@ BuildManager::BuildManager(ProjectExplorerPlugin *parent, QAction *cancelBuildAc
     connect(&d->m_watcher, SIGNAL(progressRangeChanged(int,int)),
             this, SLOT(progressChanged()));
 
-    connect(parent->session(), SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
             this, SLOT(aboutToRemoveProject(ProjectExplorer::Project*)));
 
     d->m_outputWindow = new Internal::CompileOutputWindow(this, cancelBuildAction);
diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h
index 804e32fc22c..c900286cca6 100644
--- a/src/plugins/projectexplorer/buildmanager.h
+++ b/src/plugins/projectexplorer/buildmanager.h
@@ -48,7 +48,7 @@ class PROJECTEXPLORER_EXPORT BuildManager : public QObject
     Q_OBJECT
 
 public:
-    explicit BuildManager(ProjectExplorerPlugin *parent, QAction *cancelBuildAction);
+    explicit BuildManager(QObject *parent, QAction *cancelBuildAction);
     virtual ~BuildManager();
 
     void extensionsInitialized();
diff --git a/src/plugins/projectexplorer/currentprojectfilter.cpp b/src/plugins/projectexplorer/currentprojectfilter.cpp
index b86559ec94f..2ffe109d7aa 100644
--- a/src/plugins/projectexplorer/currentprojectfilter.cpp
+++ b/src/plugins/projectexplorer/currentprojectfilter.cpp
@@ -38,8 +38,8 @@ using namespace Locator;
 using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
-CurrentProjectFilter::CurrentProjectFilter(ProjectExplorerPlugin *pe)
-  : BaseFileFilter(), m_projectExplorer(pe), m_project(0), m_filesUpToDate(false)
+CurrentProjectFilter::CurrentProjectFilter()
+  : BaseFileFilter(), m_project(0), m_filesUpToDate(false)
 {
     setId("Files in current project");
     setDisplayName(tr("Files in Current Project"));
@@ -47,7 +47,7 @@ CurrentProjectFilter::CurrentProjectFilter(ProjectExplorerPlugin *pe)
     setShortcutString(QString(QLatin1Char('p')));
     setIncludedByDefault(false);
 
-    connect(m_projectExplorer, SIGNAL(currentProjectChanged(ProjectExplorer::Project*)),
+    connect(ProjectExplorerPlugin::instance(), SIGNAL(currentProjectChanged(ProjectExplorer::Project*)),
             this, SLOT(currentProjectChanged(ProjectExplorer::Project*)));
 }
 
diff --git a/src/plugins/projectexplorer/currentprojectfilter.h b/src/plugins/projectexplorer/currentprojectfilter.h
index 3738750fdd9..f47581e8257 100644
--- a/src/plugins/projectexplorer/currentprojectfilter.h
+++ b/src/plugins/projectexplorer/currentprojectfilter.h
@@ -36,7 +36,6 @@
 
 namespace ProjectExplorer {
 
-class ProjectExplorerPlugin;
 class Project;
 
 namespace Internal {
@@ -46,7 +45,7 @@ class CurrentProjectFilter : public Locator::BaseFileFilter
     Q_OBJECT
 
 public:
-    CurrentProjectFilter(ProjectExplorerPlugin *pe);
+    CurrentProjectFilter();
     void refresh(QFutureInterface<void> &future);
 
 protected:
@@ -57,7 +56,6 @@ private slots:
     void markFilesAsOutOfDate();
 
 private:
-    ProjectExplorerPlugin *m_projectExplorer;
     Project *m_project;
     bool m_filesUpToDate;
 };
diff --git a/src/plugins/projectexplorer/currentprojectfind.cpp b/src/plugins/projectexplorer/currentprojectfind.cpp
index 7409561685c..1cd81c07949 100644
--- a/src/plugins/projectexplorer/currentprojectfind.cpp
+++ b/src/plugins/projectexplorer/currentprojectfind.cpp
@@ -44,15 +44,13 @@ using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 using namespace TextEditor;
 
-CurrentProjectFind::CurrentProjectFind(ProjectExplorerPlugin *plugin)
-  : AllProjectsFind(plugin),
-    m_plugin(plugin)
+CurrentProjectFind::CurrentProjectFind()
 {
-    connect(m_plugin, SIGNAL(currentProjectChanged(ProjectExplorer::Project*)),
+    connect(ProjectExplorerPlugin::instance(), SIGNAL(currentProjectChanged(ProjectExplorer::Project*)),
             this, SLOT(handleProjectChanged()));
-    connect(m_plugin->session(), SIGNAL(projectRemoved(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)),
             this, SLOT(handleProjectChanged()));
-    connect(m_plugin->session(), SIGNAL(projectAdded(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(projectAdded(ProjectExplorer::Project*)),
             this, SLOT(handleProjectChanged()));
 }
 
@@ -83,9 +81,8 @@ Utils::FileIterator *CurrentProjectFind::files(const QStringList &nameFilters,
                            const QVariant &additionalParameters) const
 {
     QTC_ASSERT(additionalParameters.isValid(), return new Utils::FileIterator());
-    QList<Project *> allProjects = m_plugin->session()->projects();
     QString projectFile = additionalParameters.toString();
-    foreach (Project *project, allProjects) {
+    foreach (Project *project, SessionManager::projects()) {
         if (project->document() && projectFile == project->projectFilePath())
             return filesForProjects(nameFilters, QList<Project *>() << project);
     }
@@ -109,8 +106,7 @@ void CurrentProjectFind::recheckEnabled()
     if (!search)
         return;
     QString projectFile = getAdditionalParameters(search).toString();
-    QList<Project *> allProjects = m_plugin->session()->projects();
-    foreach (Project *project, allProjects) {
+    foreach (Project *project, SessionManager::projects()) {
         if (projectFile == project->projectFilePath()) {
             search->setSearchAgainEnabled(true);
             return;
diff --git a/src/plugins/projectexplorer/currentprojectfind.h b/src/plugins/projectexplorer/currentprojectfind.h
index 28c006018b4..a3e23f77c7f 100644
--- a/src/plugins/projectexplorer/currentprojectfind.h
+++ b/src/plugins/projectexplorer/currentprojectfind.h
@@ -32,13 +32,8 @@
 
 #include "allprojectsfind.h"
 
-QT_BEGIN_NAMESPACE
-class QWidget;
-QT_END_NAMESPACE
-
 namespace ProjectExplorer {
 
-class ProjectExplorerPlugin;
 class Project;
 
 namespace Internal {
@@ -48,7 +43,7 @@ class CurrentProjectFind : public AllProjectsFind
     Q_OBJECT
 
 public:
-    CurrentProjectFind(ProjectExplorerPlugin *plugin);
+    CurrentProjectFind();
 
     QString id() const;
     QString displayName() const;
@@ -67,9 +62,6 @@ protected:
 private slots:
     void handleProjectChanged();
     void recheckEnabled();
-
-private:
-    ProjectExplorerPlugin *m_plugin;
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp
index c3b47a1044e..6d60d43c868 100644
--- a/src/plugins/projectexplorer/editorconfiguration.cpp
+++ b/src/plugins/projectexplorer/editorconfiguration.cpp
@@ -248,12 +248,11 @@ void EditorConfiguration::setUseGlobalSettings(bool use)
     d->m_useGlobal = use;
     d->m_defaultCodeStyle->setCurrentDelegate(d->m_useGlobal
                     ? TextEditorSettings::instance()->codeStyle() : 0);
-    const SessionManager *session = ProjectExplorerPlugin::instance()->session();
     QList<Core::IEditor *> opened = Core::EditorManager::documentModel()->editorsForDocuments(
                 Core::EditorManager::documentModel()->openedDocuments());
     foreach (Core::IEditor *editor, opened) {
         if (BaseTextEditorWidget *baseTextEditor = qobject_cast<BaseTextEditorWidget *>(editor->widget())) {
-            Project *project = session->projectForFile(editor->document()->filePath());
+            Project *project = SessionManager::projectForFile(editor->document()->filePath());
             if (project && project->editorConfiguration() == this)
                 switchSettings(baseTextEditor);
         }
@@ -326,18 +325,13 @@ void EditorConfiguration::setTextCodec(QTextCodec *textCodec)
     d->m_textCodec = textCodec;
 }
 
-TabSettings actualTabSettings(const QString &fileName,
-                                     const BaseTextEditorWidget *baseTextEditor)
+TabSettings actualTabSettings(const QString &fileName, const BaseTextEditorWidget *baseTextEditor)
 {
-    if (baseTextEditor) {
+    if (baseTextEditor)
         return baseTextEditor->tabSettings();
-    } else {
-        const SessionManager *session = ProjectExplorerPlugin::instance()->session();
-        if (Project *project = session->projectForFile(fileName))
-            return project->editorConfiguration()->codeStyle()->tabSettings();
-        else
-            return TextEditorSettings::instance()->codeStyle()->tabSettings();
-    }
+    if (Project *project = SessionManager::projectForFile(fileName))
+        return project->editorConfiguration()->codeStyle()->tabSettings();
+    return TextEditorSettings::instance()->codeStyle()->tabSettings();
 }
 
 } // ProjectExplorer
diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp
index 706f8314eb0..ebdfcf5ef20 100644
--- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp
+++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp
@@ -267,7 +267,7 @@ void ProjectListWidget::addProject(Project *project)
     item->setText(displayName);
     insertItem(pos, item);
 
-    if (project == ProjectExplorerPlugin::instance()->startupProject())
+    if (project == SessionManager::startupProject())
         setCurrentItem(item);
 
     QFontMetrics fn(font());
@@ -1389,10 +1389,10 @@ void MiniProjectTargetSelector::updateActionAndSummary()
     QString runConfig;
     QIcon targetIcon = style()->standardIcon(QStyle::SP_ComputerIcon);
 
-    Project *project = ProjectExplorerPlugin::instance()->startupProject();
+    Project *project = SessionManager::startupProject();
     if (project) {
         projectName = project->displayName();
-        foreach (Project *p, ProjectExplorerPlugin::instance()->session()->projects()) {
+        foreach (Project *p, SessionManager::projects()) {
             if (p != project && p->displayName() == projectName) {
                 fileName = project->projectFilePath();
                 break;
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 10a2700d909..46ade8317d2 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -408,11 +408,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     connect(d->m_outputPane, SIGNAL(runControlFinished(ProjectExplorer::RunControl*)),
             this, SIGNAL(runControlFinished(ProjectExplorer::RunControl*)));
 
-    AllProjectsFilter *allProjectsFilter = new AllProjectsFilter(this);
-    addAutoReleasedObject(allProjectsFilter);
-
-    CurrentProjectFilter *currentProjectFilter = new CurrentProjectFilter(this);
-    addAutoReleasedObject(currentProjectFilter);
+    addAutoReleasedObject(new AllProjectsFilter);
+    addAutoReleasedObject(new CurrentProjectFilter);
 
     addAutoReleasedObject(new BuildSettingsPanelFactory);
     addAutoReleasedObject(new RunSettingsPanelFactory);
@@ -420,14 +417,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     addAutoReleasedObject(new CodeStyleSettingsPanelFactory);
     addAutoReleasedObject(new DependenciesPanelFactory(d->m_session));
 
-    ProcessStepFactory *processStepFactory = new ProcessStepFactory;
-    addAutoReleasedObject(processStepFactory);
-
-    AllProjectsFind *allProjectsFind = new AllProjectsFind(this);
-    addAutoReleasedObject(allProjectsFind);
+    addAutoReleasedObject(new ProcessStepFactory);
 
-    CurrentProjectFind *currentProjectFind = new CurrentProjectFind(this);
-    addAutoReleasedObject(currentProjectFind);
+    addAutoReleasedObject(new AllProjectsFind);
+    addAutoReleasedObject(new CurrentProjectFind);
 
     addAutoReleasedObject(new LocalApplicationRunControlFactory);
 
@@ -1353,7 +1346,7 @@ QList<Project *> ProjectExplorerPlugin::openProjects(const QStringList &fileName
         QFileInfo fi = QFileInfo(fileName);
         QString canonicalFilePath = fi.canonicalFilePath();
         bool found = false;
-        foreach (ProjectExplorer::Project *pi, session()->projects()) {
+        foreach (Project *pi, SessionManager::projects()) {
             if (canonicalFilePath == pi->projectFilePath()) {
                 found = true;
                 break;
@@ -1451,19 +1444,6 @@ void ProjectExplorerPlugin::setCurrentNode(Node *node)
     setCurrent(d->m_session->projectForNode(node), QString(), node);
 }
 
-SessionManager *ProjectExplorerPlugin::session() const
-{
-    return d->m_session;
-}
-
-Project *ProjectExplorerPlugin::startupProject() const
-{
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::startupProject";
-
-    return d->m_session->startupProject();
-}
-
 void ProjectExplorerPlugin::updateWelcomePage()
 {
     d->m_welcomePage->reloadWelcomeScreenData();
@@ -1848,11 +1828,12 @@ void ProjectExplorerPlugin::updateActions()
     if (debug)
         qDebug() << "ProjectExplorerPlugin::updateActions";
 
-    QPair<bool, QString> buildActionState = buildSettingsEnabled(startupProject());
+    Project *project = SessionManager::startupProject();
+
+    QPair<bool, QString> buildActionState = buildSettingsEnabled(project);
     QPair<bool, QString> buildActionContextState = buildSettingsEnabled(d->m_currentProject);
     QPair<bool, QString> buildSessionState = buildSettingsEnabledForSession();
 
-    Project *project = startupProject();
     QString projectName = project ? project->displayName() : QString();
     QString projectNameContextMenu = d->m_currentProject ? d->m_currentProject->displayName() : QString();
 
@@ -1875,7 +1856,7 @@ void ProjectExplorerPlugin::updateActions()
     // Context menu actions
     d->m_setStartupProjectAction->setParameter(projectNameContextMenu);
 
-    bool hasDependencies = session()->projectOrder(d->m_currentProject).size() > 1;
+    bool hasDependencies = SessionManager::projectOrder(d->m_currentProject).size() > 1;
     if (hasDependencies) {
         d->m_buildActionContextMenu->setText(tr("Build Without Dependencies"));
         d->m_rebuildActionContextMenu->setText(tr("Rebuild Without Dependencies"));
@@ -1929,9 +1910,10 @@ void ProjectExplorerPlugin::updateActions()
     }
     d->m_publishAction->setEnabled(canPublish);
 
-    d->m_projectSelectorAction->setEnabled(!session()->projects().isEmpty());
-    d->m_projectSelectorActionMenu->setEnabled(!session()->projects().isEmpty());
-    d->m_projectSelectorActionQuick->setEnabled(!session()->projects().isEmpty());
+    const bool hasProjects = SessionManager::hasProjects();
+    d->m_projectSelectorAction->setEnabled(hasProjects);
+    d->m_projectSelectorActionMenu->setEnabled(hasProjects);
+    d->m_projectSelectorActionQuick->setEnabled(hasProjects);
 
     updateDeployActions();
     updateRunWithoutDeployMenu();
@@ -1945,7 +1927,7 @@ QStringList ProjectExplorerPlugin::allFilesWithDependencies(Project *pro)
         qDebug() << "ProjectExplorerPlugin::allFilesWithDependencies(" << pro->projectFilePath() << ")";
 
     QStringList filesToSave;
-    foreach (Project *p, d->m_session->projectOrder(pro)) {
+    foreach (Project *p, SessionManager::projectOrder(pro)) {
         FindAllFilesVisitor filesVisitor;
         p->rootProjectNode()->accept(&filesVisitor);
         filesToSave << filesVisitor.filePaths();
@@ -2054,7 +2036,7 @@ int ProjectExplorerPlugin::queue(QList<Project *> projects, QList<Id> stepIds)
 
 void ProjectExplorerPlugin::buildProjectOnly()
 {
-    queue(QList<Project *>() << session()->startupProject(), QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
+    queue(QList<Project *>() << SessionManager::startupProject(), QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
 }
 
 void ProjectExplorerPlugin::buildProject(ProjectExplorer::Project *p)
@@ -2070,7 +2052,7 @@ void ProjectExplorerPlugin::requestProjectModeUpdate(Project *p)
 
 void ProjectExplorerPlugin::buildProject()
 {
-    queue(d->m_session->projectOrder(session()->startupProject()),
+    queue(SessionManager::projectOrder(SessionManager::startupProject()),
           QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
 }
 
@@ -2088,13 +2070,13 @@ void ProjectExplorerPlugin::buildSession()
 
 void ProjectExplorerPlugin::rebuildProjectOnly()
 {
-    queue(QList<Project *>() << session()->startupProject(),
+    queue(QList<Project *>() << SessionManager::startupProject(),
           QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
 }
 
 void ProjectExplorerPlugin::rebuildProject()
 {
-    queue(d->m_session->projectOrder(session()->startupProject()),
+    queue(SessionManager::projectOrder(SessionManager::startupProject()),
           QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
 }
 
@@ -2106,18 +2088,18 @@ void ProjectExplorerPlugin::rebuildProjectContextMenu()
 
 void ProjectExplorerPlugin::rebuildSession()
 {
-    queue(d->m_session->projectOrder(),
+    queue(SessionManager::projectOrder(),
           QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
 }
 
 void ProjectExplorerPlugin::deployProjectOnly()
 {
-    deploy(QList<Project *>() << session()->startupProject());
+    deploy(QList<Project *>() << SessionManager::startupProject());
 }
 
 void ProjectExplorerPlugin::deployProject()
 {
-    deploy(d->m_session->projectOrder(session()->startupProject()));
+    deploy(SessionManager::projectOrder(SessionManager::startupProject()));
 }
 
 void ProjectExplorerPlugin::deployProjectContextMenu()
@@ -2132,13 +2114,13 @@ void ProjectExplorerPlugin::deploySession()
 
 void ProjectExplorerPlugin::cleanProjectOnly()
 {
-    queue(QList<Project *>() << session()->startupProject(),
+    queue(QList<Project *>() << SessionManager::startupProject(),
           QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
 }
 
 void ProjectExplorerPlugin::cleanProject()
 {
-    queue(d->m_session->projectOrder(session()->startupProject()),
+    queue(SessionManager::projectOrder(SessionManager::startupProject()),
           QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
 }
 
@@ -2156,12 +2138,12 @@ void ProjectExplorerPlugin::cleanSession()
 
 void ProjectExplorerPlugin::runProject()
 {
-    runProject(startupProject(), NormalRunMode);
+    runProject(SessionManager::startupProject(), NormalRunMode);
 }
 
 void ProjectExplorerPlugin::runProjectWithoutDeploy()
 {
-    runProject(startupProject(), NormalRunMode, true);
+    runProject(SessionManager::startupProject(), NormalRunMode, true);
 }
 
 void ProjectExplorerPlugin::runProjectContextMenu()
@@ -2342,7 +2324,7 @@ void ProjectExplorerPlugin::projectAdded(ProjectExplorer::Project *pro)
 void ProjectExplorerPlugin::projectRemoved(ProjectExplorer::Project * pro)
 {
     if (d->m_projectsMode)
-        d->m_projectsMode->setEnabled(!session()->projects().isEmpty());
+        d->m_projectsMode->setEnabled(SessionManager::hasProjects());
     // more specific action en and disabling ?
     disconnect(pro, SIGNAL(buildConfigurationEnabledChanged()),
                this, SLOT(updateActions()));
@@ -2357,7 +2339,7 @@ void ProjectExplorerPlugin::projectDisplayNameChanged(Project *pro)
 void ProjectExplorerPlugin::startupProjectChanged()
 {
     static QPointer<Project> previousStartupProject = 0;
-    Project *project = startupProject();
+    Project *project = SessionManager::startupProject();
     if (project == previousStartupProject)
         return;
 
@@ -2381,8 +2363,9 @@ void ProjectExplorerPlugin::activeTargetChanged()
 {
     static QPointer<Target> previousTarget = 0;
     Target *target = 0;
-    if (startupProject())
-        target = startupProject()->activeTarget();
+    Project *startupProject = SessionManager::startupProject();
+    if (startupProject)
+        target = startupProject->activeTarget();
     if (target == previousTarget)
         return;
 
@@ -2404,8 +2387,9 @@ void ProjectExplorerPlugin::activeRunConfigurationChanged()
 {
     static QPointer<RunConfiguration> previousRunConfiguration = 0;
     RunConfiguration *rc = 0;
-    if (startupProject() && startupProject()->activeTarget())
-        rc = startupProject()->activeTarget()->activeRunConfiguration();
+    Project *startupProject = SessionManager::startupProject();
+    if (startupProject && startupProject->activeTarget())
+        rc = startupProject->activeTarget()->activeRunConfiguration();
     if (rc == previousRunConfiguration)
         return;
     if (previousRunConfiguration) {
@@ -2432,7 +2416,7 @@ IRunControlFactory *ProjectExplorerPlugin::findRunControlFactory(RunConfiguratio
 
 void ProjectExplorerPlugin::updateDeployActions()
 {
-    Project *project = startupProject();
+    Project *project = SessionManager::startupProject();
 
     bool enableDeployActions = project
             && ! (d->m_buildManager->isBuilding(project))
@@ -2451,8 +2435,7 @@ void ProjectExplorerPlugin::updateDeployActions()
     }
 
     const QString projectName = project ? project->displayName() : QString();
-    const QString projectNameContextMenu = d->m_currentProject ? d->m_currentProject->displayName() : QString();
-    bool hasProjects = !d->m_session->projects().isEmpty();
+    bool hasProjects = SessionManager::hasProjects();
 
     d->m_deployAction->setParameter(projectName);
     d->m_deployAction->setEnabled(enableDeployActions);
@@ -2547,7 +2530,7 @@ QString ProjectExplorerPlugin::cannotRunReason(Project *project, RunMode runMode
 
 void ProjectExplorerPlugin::slotUpdateRunActions()
 {
-    Project *project = startupProject();
+    Project *project = SessionManager::startupProject();
     const bool state = canRun(project, NormalRunMode);
     d->m_runAction->setEnabled(state);
     d->m_runAction->setToolTip(cannotRunReason(project, NormalRunMode));
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 48ccc33c19c..ebd46fcb2e9 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -51,7 +51,6 @@ class Id;
 namespace ProjectExplorer {
 class BuildManager;
 class RunControl;
-class SessionManager;
 class RunConfiguration;
 class IRunControlFactory;
 class Project;
@@ -81,16 +80,12 @@ public:
     Q_SLOT void openProjectWelcomePage(const QString &fileName);
     void unloadProject(Project *project);
 
-    SessionManager *session() const;
-
     static Project *currentProject();
     Node *currentNode() const;
 
     void setCurrentFile(Project *project, const QString &file);
     void setCurrentNode(Node *node);
 
-    Project *startupProject() const;
-
     BuildManager *buildManager() const;
 
     bool saveModifiedFiles();
diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp
index 6a858f6cb9d..f38e4bcb483 100644
--- a/src/plugins/projectexplorer/projectfilewizardextension.cpp
+++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp
@@ -107,7 +107,7 @@ private:
 ProjectNodeList AllProjectNodesVisitor::allProjects(ProjectNode::ProjectAction action)
 {
     AllProjectNodesVisitor visitor(action);
-    ProjectExplorerPlugin::instance()->session()->sessionNode()->accept(&visitor);
+    SessionManager::sessionNode()->accept(&visitor);
     return visitor.m_projectNodes;
 }
 
@@ -557,8 +557,7 @@ void ProjectFileWizardExtension::applyCodeStyle(Core::GeneratedFile *file) const
     if (projectIndex >= 0 && projectIndex < m_context->projects.size())
         project = m_context->projects.at(projectIndex).node;
 
-    ProjectExplorer::Project *baseProject
-            = ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForNode(project);
+    Project *baseProject = SessionManager::projectForNode(project);
 
     TextEditor::ICodeStylePreferencesFactory *factory
             = TextEditor::TextEditorSettings::instance()->codeStyleFactory(languageId);
diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp
index e7e72265f45..66e69cf8ff0 100644
--- a/src/plugins/projectexplorer/projecttreewidget.cpp
+++ b/src/plugins/projectexplorer/projecttreewidget.cpp
@@ -112,12 +112,12 @@ ProjectTreeWidget::ProjectTreeWidget(QWidget *parent)
           m_autoSync(false),
           m_autoExpand(true)
 {
-    m_model = new FlatModel(m_explorer->session()->sessionNode(), this);
-    Project *pro = m_explorer->session()->startupProject();
+    m_model = new FlatModel(SessionManager::sessionNode(), this);
+    Project *pro = SessionManager::startupProject();
     if (pro)
         m_model->setStartupProject(pro->rootProjectNode());
     NodesWatcher *watcher = new NodesWatcher(this);
-    m_explorer->session()->sessionNode()->registerWatcher(watcher);
+    SessionManager::sessionNode()->registerWatcher(watcher);
 
     connect(watcher, SIGNAL(foldersAboutToBeRemoved(FolderNode*,QList<FolderNode*>)),
             this, SLOT(foldersAboutToBeRemoved(FolderNode*,QList<FolderNode*>)));
@@ -154,16 +154,18 @@ ProjectTreeWidget::ProjectTreeWidget(QWidget *parent)
             this, SLOT(handleCurrentItemChange(QModelIndex)));
     connect(m_view, SIGNAL(customContextMenuRequested(QPoint)),
             this, SLOT(showContextMenu(QPoint)));
-    connect(m_explorer->session(), SIGNAL(singleProjectAdded(ProjectExplorer::Project*)),
+
+    QObject *sessionManager = SessionManager::instance();
+    connect(sessionManager, SIGNAL(singleProjectAdded(ProjectExplorer::Project*)),
             this, SLOT(handleProjectAdded(ProjectExplorer::Project*)));
-    connect(m_explorer->session(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
+    connect(sessionManager, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
             this, SLOT(startupProjectChanged(ProjectExplorer::Project*)));
 
-    connect(m_explorer->session(), SIGNAL(aboutToLoadSession(QString)),
+    connect(sessionManager, SIGNAL(aboutToLoadSession(QString)),
             this, SLOT(disableAutoExpand()));
-    connect(m_explorer->session(), SIGNAL(sessionLoaded(QString)),
+    connect(sessionManager, SIGNAL(sessionLoaded(QString)),
             this, SLOT(loadExpandData()));
-    connect(m_explorer->session(), SIGNAL(aboutToSaveSession()),
+    connect(sessionManager, SIGNAL(aboutToSaveSession()),
             this, SLOT(saveExpandData()));
 
     m_toggleSync = new QToolButton;
@@ -184,7 +186,7 @@ void ProjectTreeWidget::disableAutoExpand()
 void ProjectTreeWidget::loadExpandData()
 {
     m_autoExpand = true;
-    QStringList data = m_explorer->session()->value(QLatin1String("ProjectTree.ExpandData")).toStringList();
+    QStringList data = SessionManager::value(QLatin1String("ProjectTree.ExpandData")).toStringList();
     recursiveLoadExpandData(m_view->rootIndex(), data.toSet());
 }
 
@@ -203,7 +205,7 @@ void ProjectTreeWidget::saveExpandData()
     QStringList data;
     recursiveSaveExpandData(m_view->rootIndex(), &data);
     // TODO if there are multiple ProjectTreeWidgets, the last one saves the data
-    m_explorer->session()->setValue(QLatin1String("ProjectTree.ExpandData"), data);
+    SessionManager::setValue(QLatin1String("ProjectTree.ExpandData"), data);
 }
 
 void ProjectTreeWidget::recursiveSaveExpandData(const QModelIndex &index, QStringList *data)
diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp
index c27d603ab44..9578c88df92 100644
--- a/src/plugins/projectexplorer/projectwelcomepage.cpp
+++ b/src/plugins/projectexplorer/projectwelcomepage.cpp
@@ -49,8 +49,8 @@
 namespace ProjectExplorer {
 namespace Internal {
 
-SessionModel::SessionModel(SessionManager *manager, QObject *parent)
-    : QAbstractListModel(parent), m_manager(manager)
+SessionModel::SessionModel(QObject *parent)
+    : QAbstractListModel(parent)
 {
     QHash<int, QByteArray> roleNames;
     roleNames[Qt::DisplayRole] = "sessionName";
@@ -60,12 +60,12 @@ SessionModel::SessionModel(SessionManager *manager, QObject *parent)
     roleNames[ProjectsPathRole] = "projectsPath";
     roleNames[ProjectsDisplayRole] = "projectsName";
     setRoleNames(roleNames);
-    connect(manager, SIGNAL(sessionLoaded(QString)), SLOT(resetSessions()));
+    connect(SessionManager::instance(), SIGNAL(sessionLoaded(QString)), SLOT(resetSessions()));
 }
 
 int SessionModel::rowCount(const QModelIndex &) const
 {
-    return m_manager->sessions().count();
+    return SessionManager::sessions().count();
 }
 
 QStringList pathsToBaseNames(const QStringList &paths)
@@ -90,26 +90,26 @@ QVariant SessionModel::data(const QModelIndex &index, int role) const
 {
     if (role == Qt::DisplayRole || role == DefaultSessionRole ||
             role == LastSessionRole || role == ActiveSessionRole || role == ProjectsPathRole  || role == ProjectsDisplayRole) {
-        QString sessionName = m_manager->sessions().at(index.row());
+        QString sessionName = SessionManager::sessions().at(index.row());
         if (role == Qt::DisplayRole)
             return sessionName;
         else if (role == DefaultSessionRole)
-            return m_manager->isDefaultSession(sessionName);
+            return SessionManager::isDefaultSession(sessionName);
         else if (role == LastSessionRole)
-            return m_manager->lastSession() == sessionName;
+            return SessionManager::lastSession() == sessionName;
         else if (role == ActiveSessionRole)
-            return m_manager->activeSession() == sessionName;
+            return SessionManager::activeSession() == sessionName;
         else if (role == ProjectsPathRole)
-            return pathsWithTildeHomePath(m_manager->projectsForSessionName(sessionName));
+            return pathsWithTildeHomePath(SessionManager::projectsForSessionName(sessionName));
         else if (role == ProjectsDisplayRole)
-            return pathsToBaseNames(m_manager->projectsForSessionName(sessionName));
+            return pathsToBaseNames(SessionManager::projectsForSessionName(sessionName));
     }
     return QVariant();
 }
 
 bool SessionModel::isDefaultVirgin() const
 {
-    return m_manager->isDefaultVirgin();
+    return SessionManager::isDefaultVirgin();
 }
 
 void SessionModel::resetSessions()
@@ -120,48 +120,48 @@ void SessionModel::resetSessions()
 
 void SessionModel::cloneSession(const QString &session)
 {
-    SessionNameInputDialog newSessionInputDialog(m_manager->sessions(), 0);
+    SessionNameInputDialog newSessionInputDialog(SessionManager::sessions(), 0);
     newSessionInputDialog.setWindowTitle(tr("New session name"));
     newSessionInputDialog.setValue(session + QLatin1String(" (2)"));
 
     if (newSessionInputDialog.exec() == QDialog::Accepted) {
         QString newSession = newSessionInputDialog.value();
-        if (newSession.isEmpty() || m_manager->sessions().contains(newSession))
+        if (newSession.isEmpty() || SessionManager::sessions().contains(newSession))
             return;
         beginResetModel();
-        m_manager->cloneSession(session, newSession);
+        SessionManager::cloneSession(session, newSession);
         endResetModel();
 
         if (newSessionInputDialog.isSwitchToRequested())
-            m_manager->loadSession(newSession);
+            SessionManager::loadSession(newSession);
     }
 }
 
 void SessionModel::deleteSession(const QString &session)
 {
-    if (!m_manager->confirmSessionDelete(session))
+    if (!SessionManager::confirmSessionDelete(session))
         return;
     beginResetModel();
-    m_manager->deleteSession(session);
+    SessionManager::deleteSession(session);
     endResetModel();
 }
 
 void SessionModel::renameSession(const QString &session)
 {
-    SessionNameInputDialog newSessionInputDialog(m_manager->sessions(), 0);
+    SessionNameInputDialog newSessionInputDialog(SessionManager::sessions(), 0);
     newSessionInputDialog.setWindowTitle(tr("New session name"));
     newSessionInputDialog.setValue(session);
 
     if (newSessionInputDialog.exec() == QDialog::Accepted) {
         QString newSession = newSessionInputDialog.value();
-        if (newSession.isEmpty() || m_manager->sessions().contains(newSession))
+        if (newSession.isEmpty() || SessionManager::sessions().contains(newSession))
             return;
         beginResetModel();
-        m_manager->renameSession(session, newSession);
+        SessionManager::renameSession(session, newSession);
         endResetModel();
 
         if (newSessionInputDialog.isSwitchToRequested())
-            m_manager->loadSession(newSession);
+            SessionManager::loadSession(newSession);
     }
 }
 
@@ -214,9 +214,8 @@ ProjectWelcomePage::ProjectWelcomePage() :
 
 void ProjectWelcomePage::facilitateQml(QDeclarativeEngine *engine)
 {
-    ProjectExplorerPlugin *pePlugin = ProjectExplorer::ProjectExplorerPlugin::instance();
-    m_sessionModel = new SessionModel(pePlugin->session(), this);
-    m_projectModel = new ProjectModel(pePlugin, this);
+    m_sessionModel = new SessionModel(this);
+    m_projectModel = new ProjectModel(ProjectExplorerPlugin::instance(), this);
 
     QDeclarativeContext *ctx = engine->rootContext();
     ctx->setContextProperty(QLatin1String("sessionList"), m_sessionModel);
diff --git a/src/plugins/projectexplorer/projectwelcomepage.h b/src/plugins/projectexplorer/projectwelcomepage.h
index 01d6693774a..6ce2f856e35 100644
--- a/src/plugins/projectexplorer/projectwelcomepage.h
+++ b/src/plugins/projectexplorer/projectwelcomepage.h
@@ -41,7 +41,6 @@ QT_END_NAMESPACE
 namespace ProjectExplorer {
 
 class ProjectExplorerPlugin;
-class SessionManager;
 
 namespace Internal {
 
@@ -51,7 +50,7 @@ class SessionModel : public QAbstractListModel
 public:
     enum { DefaultSessionRole = Qt::UserRole+1, LastSessionRole, ActiveSessionRole, ProjectsPathRole, ProjectsDisplayRole };
 
-    SessionModel(SessionManager* manager, QObject* parent = 0);
+    explicit SessionModel(QObject *parent = 0);
     int rowCount(const QModelIndex &parent) const;
     QVariant data(const QModelIndex &index, int role) const;
 
@@ -62,9 +61,6 @@ public slots:
     void cloneSession(const QString &session);
     void deleteSession(const QString &session);
     void renameSession(const QString &session);
-
-private:
-    SessionManager *m_manager;
 };
 
 
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index 0d126852bf8..61d7289365d 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -228,8 +228,6 @@ ProjectWindow::ProjectWindow(QWidget *parent)
       m_currentWidget(0),
       m_previousTargetSubIndex(-1)
 {
-    ProjectExplorer::SessionManager *session = ProjectExplorerPlugin::instance()->session();
-
     // Setup overall layout:
     QVBoxLayout *viewLayout = new QVBoxLayout(this);
     viewLayout->setMargin(0);
@@ -242,19 +240,20 @@ ProjectWindow::ProjectWindow(QWidget *parent)
     m_centralWidget = new QStackedWidget(this);
     viewLayout->addWidget(m_centralWidget);
 
-    // connects:
+    // Connections
     connect(m_tabWidget, SIGNAL(currentIndexChanged(int,int)),
             this, SLOT(showProperties(int,int)));
 
-    connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)),
+    QObject *sessionManager = SessionManager::instance();
+    connect(sessionManager, SIGNAL(projectAdded(ProjectExplorer::Project*)),
             this, SLOT(registerProject(ProjectExplorer::Project*)));
-    connect(session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
+    connect(sessionManager, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
             this, SLOT(deregisterProject(ProjectExplorer::Project*)));
 
-    connect(session, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
+    connect(sessionManager, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
             this, SLOT(startupProjectChanged(ProjectExplorer::Project*)));
 
-    connect(session, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)),
+    connect(sessionManager, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)),
             this, SLOT(projectUpdated(ProjectExplorer::Project*)));
 
     // Update properties to empty project for now:
@@ -274,7 +273,7 @@ void ProjectWindow::aboutToShutdown()
 {
     showProperties(-1, -1); // that's a bit stupid, but otherwise stuff is still
                             // connected to the session
-    disconnect(ProjectExplorerPlugin::instance()->session(), 0, this, 0);
+    disconnect(SessionManager::instance(), 0, this, 0);
 }
 
 void ProjectWindow::removedTarget(Target *)
@@ -434,7 +433,7 @@ void ProjectWindow::showProperties(int index, int subIndex)
 
     }
 
-    ProjectExplorerPlugin::instance()->session()->setStartupProject(project);
+    SessionManager::setStartupProject(project);
 }
 
 void ProjectWindow::removeCurrentWidget()
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 87bb986a9ac..2d3f7d3b7e2 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -53,17 +53,14 @@
 #include <QMessageBox>
 #include <QPushButton>
 
-namespace {
-    bool debug = false;
-}
+namespace { bool debug = false; }
 
 using namespace Core;
-using Utils::PersistentSettingsReader;
-using Utils::PersistentSettingsWriter;
-
-using namespace ProjectExplorer;
+using namespace Utils;
 using namespace ProjectExplorer::Internal;
 
+namespace ProjectExplorer {
+
 /*!
      \class ProjectExplorer::SessionManager
 
@@ -75,15 +72,61 @@ using namespace ProjectExplorer::Internal;
      This could be improved.
 */
 
+class SessionManagerPrivate
+{
+public:
+    SessionManagerPrivate() :
+        m_sessionName(QLatin1String("default")),
+        m_virginSession(true),
+        m_loadingSession(false),
+        m_startupProject(0),
+        m_writer(0)
+    {}
+
+    bool projectContainsFile(Project *p, const QString &fileName) const;
+    void restoreValues(const PersistentSettingsReader &reader);
+    void restoreDependencies(const PersistentSettingsReader &reader);
+    void restoreStartupProject(const PersistentSettingsReader &reader);
+    void restoreEditors(const PersistentSettingsReader &reader);
+    void restoreProjects(const QStringList &fileList);
+    void askUserAboutFailedProjects();
+    void sessionLoadingProgress();
+
+    bool recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const;
+    QStringList dependencies(const QString &proName) const;
+    QStringList dependenciesOrder() const;
+    void dependencies(const QString &proName, QStringList &result) const;
+
+public:
+    SessionNode *m_sessionNode;
+    QString m_sessionName;
+    bool m_virginSession;
+
+    mutable QStringList m_sessions;
+
+    mutable QHash<Project *, QStringList> m_projectFileCache;
+    bool m_loadingSession;
+
+    Project *m_startupProject;
+    QList<Project *> m_projects;
+    QStringList m_failedProjects;
+    QMap<QString, QStringList> m_depMap;
+    QMap<QString, QVariant> m_values;
+    QFutureInterface<void> m_future;
+    PersistentSettingsWriter *m_writer;
+};
+
+static SessionManager *m_instance = 0;
+static SessionManagerPrivate *d = 0;
+
 SessionManager::SessionManager(QObject *parent)
-  : QObject(parent),
-    m_sessionNode(new SessionNode(this)),
-    m_sessionName(QLatin1String("default")),
-    m_virginSession(true),
-    m_loadingSession(false),
-    m_startupProject(0),
-    m_writer(0)
+  : QObject(parent)
 {
+    m_instance = this;
+    d = new SessionManagerPrivate;
+
+    d->m_sessionNode = new SessionNode(this);
+
     connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
             this, SLOT(saveActiveMode(Core::IMode*)));
 
@@ -99,18 +142,22 @@ SessionManager::SessionManager(QObject *parent)
 
 SessionManager::~SessionManager()
 {
-    emit aboutToUnloadSession(m_sessionName);
-    delete m_writer;
+    emit m_instance->aboutToUnloadSession(d->m_sessionName);
+    delete d->m_writer;
+    delete d;
 }
 
+QObject *SessionManager::instance()
+{
+   return m_instance;
+}
 
-bool SessionManager::isDefaultVirgin() const
+bool SessionManager::isDefaultVirgin()
 {
-    return isDefaultSession(m_sessionName)
-            && m_virginSession;
+    return isDefaultSession(d->m_sessionName) && d->m_virginSession;
 }
 
-bool SessionManager::isDefaultSession(const QString &session) const
+bool SessionManager::isDefaultSession(const QString &session)
 {
     return session == QLatin1String("default");
 }
@@ -125,22 +172,21 @@ void SessionManager::clearProjectFileCache()
 {
     // If triggered by the fileListChanged signal of one project
     // only invalidate cache for this project
-    Project *pro = qobject_cast<Project*>(sender());
+    Project *pro = qobject_cast<Project*>(m_instance->sender());
     if (pro)
-        m_projectFileCache.remove(pro);
+        d->m_projectFileCache.remove(pro);
     else
-        m_projectFileCache.clear();
+        d->m_projectFileCache.clear();
 }
 
-bool SessionManager::recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const
+bool SessionManagerPrivate::recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const
 {
     if (newDep == checkDep)
         return false;
 
-    foreach (const QString &dependency, m_depMap.value(checkDep)) {
+    foreach (const QString &dependency, m_depMap.value(checkDep))
         if (!recursiveDependencyCheck(newDep, dependency))
             return false;
-    }
 
     return true;
 }
@@ -152,10 +198,10 @@ bool SessionManager::recursiveDependencyCheck(const QString &newDep, const QStri
  * filenames when saving.
  */
 
-QList<Project *> SessionManager::dependencies(const Project *project) const
+QList<Project *> SessionManager::dependencies(const Project *project)
 {
-    const QString &proName = project->projectFilePath();
-    const QStringList &proDeps = m_depMap.value(proName);
+    const QString proName = project->projectFilePath();
+    const QStringList proDeps = d->m_depMap.value(proName);
 
     QList<Project *> projects;
     foreach (const QString &dep, proDeps) {
@@ -166,54 +212,54 @@ QList<Project *> SessionManager::dependencies(const Project *project) const
     return projects;
 }
 
-bool SessionManager::hasDependency(const Project *project, const Project *depProject) const
+bool SessionManager::hasDependency(const Project *project, const Project *depProject)
 {
-    const QString &proName = project->projectFilePath();
-    const QString &depName = depProject->projectFilePath();
+    const QString proName = project->projectFilePath();
+    const QString depName = depProject->projectFilePath();
 
-    const QStringList &proDeps = m_depMap.value(proName);
+    const QStringList proDeps = d->m_depMap.value(proName);
     return proDeps.contains(depName);
 }
 
-bool SessionManager::canAddDependency(const Project *project, const Project *depProject) const
+bool SessionManager::canAddDependency(const Project *project, const Project *depProject)
 {
-    const QString &newDep = project->projectFilePath();
-    const QString &checkDep = depProject->projectFilePath();
+    const QString newDep = project->projectFilePath();
+    const QString checkDep = depProject->projectFilePath();
 
-    return recursiveDependencyCheck(newDep, checkDep);
+    return d->recursiveDependencyCheck(newDep, checkDep);
 }
 
 bool SessionManager::addDependency(Project *project, Project *depProject)
 {
-    const QString &proName = project->projectFilePath();
-    const QString &depName = depProject->projectFilePath();
+    const QString proName = project->projectFilePath();
+    const QString depName = depProject->projectFilePath();
 
     // check if this dependency is valid
-    if (!recursiveDependencyCheck(proName, depName))
+    if (!d->recursiveDependencyCheck(proName, depName))
         return false;
 
-    QStringList proDeps = m_depMap.value(proName);
+    QStringList proDeps = d->m_depMap.value(proName);
     if (!proDeps.contains(depName)) {
         proDeps.append(depName);
-        m_depMap[proName] = proDeps;
+        d->m_depMap[proName] = proDeps;
     }
-    emit dependencyChanged(project, depProject);
+    emit m_instance->dependencyChanged(project, depProject);
 
     return true;
 }
 
 void SessionManager::removeDependency(Project *project, Project *depProject)
 {
-    const QString &proName = project->projectFilePath();
-    const QString &depName = depProject->projectFilePath();
+    const QString proName = project->projectFilePath();
+    const QString depName = depProject->projectFilePath();
 
-    QStringList proDeps = m_depMap.value(proName);
+    QStringList proDeps = d->m_depMap.value(proName);
     proDeps.removeAll(depName);
     if (proDeps.isEmpty())
-        m_depMap.remove(proName);
+        d->m_depMap.remove(proName);
     else
-        m_depMap[proName] = proDeps;
-    emit dependencyChanged(project, depProject);
+        d->m_depMap[proName] = proDeps;
+    emit m_instance->dependencyChanged(project, depProject);
 }
 
 void SessionManager::setStartupProject(Project *startupProject)
@@ -222,19 +268,19 @@ void SessionManager::setStartupProject(Project *startupProject)
         qDebug() << Q_FUNC_INFO << (startupProject ? startupProject->displayName() : QLatin1String("0"));
 
     if (startupProject) {
-        Q_ASSERT(m_projects.contains(startupProject));
+        Q_ASSERT(d->m_projects.contains(startupProject));
     }
 
-    if (m_startupProject == startupProject)
+    if (d->m_startupProject == startupProject)
         return;
 
-    m_startupProject = startupProject;
-    emit startupProjectChanged(startupProject);
+    d->m_startupProject = startupProject;
+    emit m_instance->startupProjectChanged(startupProject);
 }
 
-Project *SessionManager::startupProject() const
+Project *SessionManager::startupProject()
 {
-    return m_startupProject;
+    return d->m_startupProject;
 }
 
 void SessionManager::addProject(Project *project)
@@ -244,36 +290,35 @@ void SessionManager::addProject(Project *project)
 
 void SessionManager::addProjects(const QList<Project*> &projects)
 {
-    m_virginSession = false;
+    d->m_virginSession = false;
     QList<Project*> clearedList;
     foreach (Project *pro, projects) {
-        if (!m_projects.contains(pro)) {
+        if (!d->m_projects.contains(pro)) {
             clearedList.append(pro);
-            m_projects.append(pro);
-            m_sessionNode->addProjectNodes(QList<ProjectNode *>() << pro->rootProjectNode());
+            d->m_projects.append(pro);
+            d->m_sessionNode->addProjectNodes(QList<ProjectNode *>() << pro->rootProjectNode());
 
             connect(pro, SIGNAL(fileListChanged()),
-                    this, SLOT(clearProjectFileCache()));
+                    m_instance, SLOT(clearProjectFileCache()));
 
             connect(pro, SIGNAL(displayNameChanged()),
-                    this, SLOT(projectDisplayNameChanged()));
+                    m_instance, SLOT(projectDisplayNameChanged()));
 
             if (debug)
                 qDebug() << "SessionManager - adding project " << pro->displayName();
         }
     }
 
-    foreach (Project *pro, clearedList) {
-        emit projectAdded(pro);
-    }
+    foreach (Project *pro, clearedList)
+        emit m_instance->projectAdded(pro);
 
     if (clearedList.count() == 1)
-        emit singleProjectAdded(clearedList.first());
+        emit m_instance->singleProjectAdded(clearedList.first());
 }
 
 void SessionManager::removeProject(Project *project)
 {
-    m_virginSession = false;
+    d->m_virginSession = false;
     if (project == 0) {
         qDebug() << "SessionManager::removeProject(0) ... THIS SHOULD NOT HAPPEN";
         return;
@@ -283,28 +328,28 @@ void SessionManager::removeProject(Project *project)
 
 bool SessionManager::loadingSession()
 {
-    return m_loadingSession;
+    return d->m_loadingSession;
 }
 
 bool SessionManager::save()
 {
     if (debug)
-        qDebug() << "SessionManager - saving session" << m_sessionName;
+        qDebug() << "SessionManager - saving session" << d->m_sessionName;
 
-    emit aboutToSaveSession();
+    emit m_instance->aboutToSaveSession();
 
-    if (!m_writer || m_writer->fileName() != sessionNameToFileName(m_sessionName)) {
-        delete m_writer;
-        m_writer = new Utils::PersistentSettingsWriter(sessionNameToFileName(m_sessionName),
+    if (!d->m_writer || d->m_writer->fileName() != sessionNameToFileName(d->m_sessionName)) {
+        delete d->m_writer;
+        d->m_writer = new PersistentSettingsWriter(sessionNameToFileName(d->m_sessionName),
                                                        QLatin1String("QtCreatorSession"));
     }
 
     QVariantMap data;
     // save the startup project
-    if (m_startupProject)
-        data.insert(QLatin1String("StartupProject"), m_startupProject->projectFilePath());
+    if (d->m_startupProject)
+        data.insert(QLatin1String("StartupProject"), d->m_startupProject->projectFilePath());
 
-    QColor c = Utils::StyleHelper::requestedBaseColor();
+    QColor c = StyleHelper::requestedBaseColor();
     if (c.isValid()) {
         QString tmp = QString::fromLatin1("#%1%2%3")
                 .arg(c.red(), 2, 16, QLatin1Char('0'))
@@ -314,20 +359,20 @@ bool SessionManager::save()
     }
 
     QStringList projectFiles;
-    foreach (Project *pro, m_projects)
+    foreach (Project *pro, d->m_projects)
         projectFiles << pro->projectFilePath();
 
     // Restore infromation on projects that failed to load:
     // don't readd projects to the list, which the user loaded
-    foreach (const QString &failed, m_failedProjects)
+    foreach (const QString &failed, d->m_failedProjects)
         if (!projectFiles.contains(failed))
             projectFiles << failed;
 
     data.insert(QLatin1String("ProjectList"), projectFiles);
 
     QMap<QString, QVariant> depMap;
-    QMap<QString, QStringList>::const_iterator i = m_depMap.constBegin();
-    while (i != m_depMap.constEnd()) {
+    QMap<QString, QStringList>::const_iterator i = d->m_depMap.constBegin();
+    while (i != d->m_depMap.constEnd()) {
         QString key = i.key();
         QStringList values;
         foreach (const QString &value, i.value()) {
@@ -339,20 +384,19 @@ bool SessionManager::save()
     data.insert(QLatin1String("ProjectDependencies"), QVariant(depMap));
     data.insert(QLatin1String("EditorSettings"), EditorManager::saveState().toBase64());
 
-    QMap<QString, QVariant>::const_iterator it, end;
-    end = m_values.constEnd();
+    QMap<QString, QVariant>::const_iterator it, end = d->m_values.constEnd();
     QStringList keys;
-    for (it = m_values.constBegin(); it != end; ++it) {
+    for (it = d->m_values.constBegin(); it != end; ++it) {
         data.insert(QLatin1String("value-") + it.key(), it.value());
         keys << it.key();
     }
 
     data.insert(QLatin1String("valueKeys"), keys);
 
-    bool result = m_writer->save(data, Core::ICore::mainWindow());
+    bool result = d->m_writer->save(data, Core::ICore::mainWindow());
     if (!result) {
         QMessageBox::warning(0, tr("Error while saving session"),
-                                tr("Could not save session to file %1").arg(m_writer->fileName().toUserOutput()));
+            tr("Could not save session to file %1").arg(d->m_writer->fileName().toUserOutput()));
     }
 
     if (debug)
@@ -370,19 +414,24 @@ void SessionManager::closeAllProjects()
     removeProjects(projects());
 }
 
-const QList<Project *> &SessionManager::projects() const
+const QList<Project *> &SessionManager::projects()
+{
+    return d->m_projects;
+}
+
+bool SessionManager::hasProjects()
 {
-    return m_projects;
+    return !d->m_projects.isEmpty();
 }
 
-QStringList SessionManager::dependencies(const QString &proName) const
+QStringList SessionManagerPrivate::dependencies(const QString &proName) const
 {
     QStringList result;
     dependencies(proName, result);
     return result;
 }
 
-void SessionManager::dependencies(const QString &proName, QStringList &result) const
+void SessionManagerPrivate::dependencies(const QString &proName, QStringList &result) const
 {
     QStringList depends = m_depMap.value(proName);
 
@@ -393,16 +442,15 @@ void SessionManager::dependencies(const QString &proName, QStringList &result) c
         result.append(proName);
 }
 
-QStringList SessionManager::dependenciesOrder() const
+QStringList SessionManagerPrivate::dependenciesOrder() const
 {
     QList<QPair<QString, QStringList> > unordered;
     QStringList ordered;
 
     // copy the map to a temporary list
-    foreach (Project *pro, projects()) {
+    foreach (Project *pro, m_projects) {
         const QString &proName = pro->projectFilePath();
-        unordered << QPair<QString, QStringList>
-            (proName, m_depMap.value(proName));
+        unordered << QPair<QString, QStringList>(proName, m_depMap.value(proName));
     }
 
     while (!unordered.isEmpty()) {
@@ -427,15 +475,15 @@ QStringList SessionManager::dependenciesOrder() const
     return ordered;
 }
 
-QList<Project *> SessionManager::projectOrder(Project *project) const
+QList<Project *> SessionManager::projectOrder(Project *project)
 {
     QList<Project *> result;
 
     QStringList pros;
     if (project)
-        pros = dependencies(project->projectFilePath());
+        pros = d->dependencies(project->projectFilePath());
     else
-        pros = dependenciesOrder();
+        pros = d->dependenciesOrder();
 
     foreach (const QString &proFile, pros) {
         foreach (Project *pro, projects()) {
@@ -449,37 +497,33 @@ QList<Project *> SessionManager::projectOrder(Project *project) const
     return result;
 }
 
-Project *SessionManager::projectForNode(Node *node) const
+Project *SessionManager::projectForNode(Node *node)
 {
     if (!node)
         return 0;
 
-    Project *project = 0;
-
     FolderNode *rootProjectNode = qobject_cast<FolderNode*>(node);
     if (!rootProjectNode)
         rootProjectNode = node->parentFolderNode();
-    while (rootProjectNode && rootProjectNode->parentFolderNode() != m_sessionNode)
+
+    while (rootProjectNode && rootProjectNode->parentFolderNode() != d->m_sessionNode)
         rootProjectNode = rootProjectNode->parentFolderNode();
 
     Q_ASSERT(rootProjectNode);
 
-    QList<Project *> projectList = projects();
-    foreach (Project *p, projectList) {
-        if (p->rootProjectNode() == rootProjectNode) {
-            project = p;
-            break;
-        }
-    }
+    foreach (Project *p, d->m_projects)
+        if (p->rootProjectNode() == rootProjectNode)
+            return p;
 
-    return project;
+    return 0;
 }
 
-Node *SessionManager::nodeForFile(const QString &fileName, Project *project) const
+Node *SessionManager::nodeForFile(const QString &fileName, Project *project)
 {
     Node *node = 0;
     if (!project)
         project = projectForFile(fileName);
+
     if (project) {
         FindNodesForFileVisitor findNodes(fileName);
         project->rootProjectNode()->accept(&findNodes);
@@ -494,7 +538,7 @@ Node *SessionManager::nodeForFile(const QString &fileName, Project *project) con
     return node;
 }
 
-Project *SessionManager::projectForFile(const QString &fileName) const
+Project *SessionManager::projectForFile(const QString &fileName)
 {
     if (debug)
         qDebug() << "SessionManager::projectForFile(" << fileName << ")";
@@ -503,16 +547,17 @@ Project *SessionManager::projectForFile(const QString &fileName) const
 
     // Check current project first
     Project *currentProject = ProjectExplorerPlugin::currentProject();
-    if (currentProject && projectContainsFile(currentProject, fileName))
+    if (currentProject && d->projectContainsFile(currentProject, fileName))
         return currentProject;
 
     foreach (Project *p, projectList)
-        if (p != currentProject && projectContainsFile(p, fileName))
+        if (p != currentProject && d->projectContainsFile(p, fileName))
             return p;
+
     return 0;
 }
 
-bool SessionManager::projectContainsFile(Project *p, const QString &fileName) const
+bool SessionManagerPrivate::projectContainsFile(Project *p, const QString &fileName) const
 {
     if (!m_projectFileCache.contains(p))
         m_projectFileCache.insert(p, p->files(Project::AllFiles));
@@ -532,13 +577,13 @@ void SessionManager::configureEditor(Core::IEditor *editor, const QString &fileN
 
 void SessionManager::updateWindowTitle()
 {
-    if (isDefaultSession(m_sessionName)) {
+    if (isDefaultSession(d->m_sessionName)) {
         if (Project *currentProject = ProjectExplorerPlugin::currentProject())
             EditorManager::setWindowTitleAddition(currentProject->displayName());
         else
             EditorManager::setWindowTitleAddition(QString());
     } else {
-        QString sessionName = m_sessionName;
+        QString sessionName = d->m_sessionName;
         if (sessionName.isEmpty())
             sessionName = tr("Untitled");
         EditorManager::setWindowTitleAddition(sessionName);
@@ -552,7 +597,7 @@ void SessionManager::removeProjects(QList<Project *> remove)
     foreach (Project *pro, remove) {
         if (debug)
             qDebug() << "SessionManager - emitting aboutToRemoveProject(" << pro->displayName() << ")";
-        emit aboutToRemoveProject(pro);
+        emit m_instance->aboutToRemoveProject(pro);
     }
 
 
@@ -566,7 +611,7 @@ void SessionManager::removeProjects(QList<Project *> remove)
     QSet<QString>::const_iterator i = projectFiles.begin();
     while (i != projectFiles.end()) {
         QStringList dependencies;
-        foreach (const QString &dependency, m_depMap.value(*i)) {
+        foreach (const QString &dependency, d->m_depMap.value(*i)) {
             if (projectFiles.contains(dependency))
                 dependencies << dependency;
         }
@@ -575,32 +620,31 @@ void SessionManager::removeProjects(QList<Project *> remove)
         ++i;
     }
 
-    m_depMap = resMap;
+    d->m_depMap = resMap;
 
     // TODO: Clear m_modelProjectHash
 
     // Delete projects
     foreach (Project *pro, remove) {
         pro->saveSettings();
-        m_projects.removeOne(pro);
+        d->m_projects.removeOne(pro);
 
-        if (pro == m_startupProject)
+        if (pro == d->m_startupProject)
             setStartupProject(0);
 
-        disconnect(pro, SIGNAL(fileListChanged()),
-                this, SLOT(clearProjectFileCache()));
-        m_projectFileCache.remove(pro);
+        disconnect(pro, SIGNAL(fileListChanged()), m_instance, SLOT(clearProjectFileCache()));
+        d->m_projectFileCache.remove(pro);
 
         if (debug)
             qDebug() << "SessionManager - emitting projectRemoved(" << pro->displayName() << ")";
-        m_sessionNode->removeProjectNodes(QList<ProjectNode *>() << pro->rootProjectNode());
-        emit projectRemoved(pro);
+        d->m_sessionNode->removeProjectNodes(QList<ProjectNode *>() << pro->rootProjectNode());
+        emit m_instance->projectRemoved(pro);
         delete pro;
     }
 
     if (startupProject() == 0)
-        if (!m_projects.isEmpty())
-            setStartupProject(m_projects.first());
+        if (!d->m_projects.isEmpty())
+            setStartupProject(d->m_projects.first());
 }
 
 /*!
@@ -609,41 +653,41 @@ void SessionManager::removeProjects(QList<Project *> remove)
 
 void SessionManager::setValue(const QString &name, const QVariant &value)
 {
-    if (m_values.value(name) == value)
+    if (d->m_values.value(name) == value)
         return;
-    m_values.insert(name, value);
+    d->m_values.insert(name, value);
     markSessionFileDirty(false);
 }
 
 QVariant SessionManager::value(const QString &name)
 {
-    QMap<QString, QVariant>::const_iterator it = m_values.find(name);
-    return (it == m_values.constEnd()) ? QVariant() : *it;
+    QMap<QString, QVariant>::const_iterator it = d->m_values.find(name);
+    return (it == d->m_values.constEnd()) ? QVariant() : *it;
 }
 
-QString SessionManager::activeSession() const
+QString SessionManager::activeSession()
 {
-    return m_sessionName;
+    return d->m_sessionName;
 }
 
-QStringList SessionManager::sessions() const
+QStringList SessionManager::sessions()
 {
-    if (m_sessions.isEmpty()) {
+    if (d->m_sessions.isEmpty()) {
         // We are not initialized yet, so do that now
         QDir sessionDir(Core::ICore::userResourcePath());
         QList<QFileInfo> sessionFiles = sessionDir.entryInfoList(QStringList() << QLatin1String("*.qws"), QDir::NoFilter, QDir::Time);
-        Q_FOREACH(const QFileInfo& fileInfo, sessionFiles) {
+        foreach (const QFileInfo &fileInfo, sessionFiles) {
             if (fileInfo.completeBaseName() != QLatin1String("default"))
-                m_sessions << fileInfo.completeBaseName();
+                d->m_sessions << fileInfo.completeBaseName();
         }
-        m_sessions.prepend(QLatin1String("default"));
+        d->m_sessions.prepend(QLatin1String("default"));
     }
-    return m_sessions;
+    return d->m_sessions;
 }
 
-Utils::FileName SessionManager::sessionNameToFileName(const QString &session) const
+FileName SessionManager::sessionNameToFileName(const QString &session)
 {
-    return Utils::FileName::fromString(ICore::userResourcePath() + QLatin1Char('/') + session + QLatin1String(".qws"));
+    return FileName::fromString(ICore::userResourcePath() + QLatin1Char('/') + session + QLatin1String(".qws"));
 }
 
 /*!
@@ -654,8 +698,8 @@ bool SessionManager::createSession(const QString &session)
 {
     if (sessions().contains(session))
         return false;
-    Q_ASSERT(m_sessions.size() > 0);
-    m_sessions.insert(1, session);
+    Q_ASSERT(d->m_sessions.size() > 0);
+    d->m_sessions.insert(1, session);
     return true;
 }
 
@@ -685,9 +729,9 @@ bool SessionManager::confirmSessionDelete(const QString &session)
 */
 bool SessionManager::deleteSession(const QString &session)
 {
-    if (!m_sessions.contains(session))
+    if (!d->m_sessions.contains(session))
         return false;
-    m_sessions.removeOne(session);
+    d->m_sessions.removeOne(session);
     QFile fi(sessionNameToFileName(session).toString());
     if (fi.exists())
         return fi.remove();
@@ -696,29 +740,29 @@ bool SessionManager::deleteSession(const QString &session)
 
 bool SessionManager::cloneSession(const QString &original, const QString &clone)
 {
-    if (!m_sessions.contains(original))
+    if (!d->m_sessions.contains(original))
         return false;
 
     QFile fi(sessionNameToFileName(original).toString());
     // If the file does not exist, we can still clone
     if (!fi.exists() || fi.copy(sessionNameToFileName(clone).toString())) {
-        Q_ASSERT(m_sessions.size() > 0);
-        m_sessions.insert(1, clone);
+        Q_ASSERT(d->m_sessions.size() > 0);
+        d->m_sessions.insert(1, clone);
         return true;
     }
     return false;
 }
 
-void SessionManager::restoreValues(const Utils::PersistentSettingsReader &reader)
+void SessionManagerPrivate::restoreValues(const PersistentSettingsReader &reader)
 {
-    const QStringList &keys = reader.restoreValue(QLatin1String("valueKeys")).toStringList();
+    const QStringList keys = reader.restoreValue(QLatin1String("valueKeys")).toStringList();
     foreach (const QString &key, keys) {
         QVariant value = reader.restoreValue(QLatin1String("value-") + key);
         m_values.insert(key, value);
     }
 }
 
-void SessionManager::restoreDependencies(const Utils::PersistentSettingsReader &reader)
+void SessionManagerPrivate::restoreDependencies(const PersistentSettingsReader &reader)
 {
     QMap<QString, QVariant> depMap = reader.restoreValue(QLatin1String("ProjectDependencies")).toMap();
     QMap<QString, QVariant>::const_iterator i = depMap.constBegin();
@@ -736,18 +780,18 @@ void SessionManager::restoreDependencies(const Utils::PersistentSettingsReader &
     }
 }
 
-void SessionManager::askUserAboutFailedProjects()
+void SessionManagerPrivate::askUserAboutFailedProjects()
 {
     QStringList failedProjects = m_failedProjects;
     if (!failedProjects.isEmpty()) {
         QString fileList =
             QDir::toNativeSeparators(failedProjects.join(QLatin1String("<br>")));
         QMessageBox * box = new QMessageBox(QMessageBox::Warning,
-                                            tr("Failed to restore project files"),
-                                            tr("Could not restore the following project files:<br><b>%1</b>").
+                                            SessionManager::tr("Failed to restore project files"),
+                                            SessionManager::tr("Could not restore the following project files:<br><b>%1</b>").
                                             arg(fileList));
-        QPushButton * keepButton = new QPushButton(tr("Keep projects in Session"), box);
-        QPushButton * removeButton = new QPushButton(tr("Remove projects from Session"), box);
+        QPushButton * keepButton = new QPushButton(SessionManager::tr("Keep projects in Session"), box);
+        QPushButton * removeButton = new QPushButton(SessionManager::tr("Remove projects from Session"), box);
         box->addButton(keepButton, QMessageBox::AcceptRole);
         box->addButton(removeButton, QMessageBox::DestructiveRole);
 
@@ -758,27 +802,27 @@ void SessionManager::askUserAboutFailedProjects()
     }
 }
 
-void SessionManager::restoreStartupProject(const Utils::PersistentSettingsReader &reader)
+void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader &reader)
 {
     const QString startupProject = reader.restoreValue(QLatin1String("StartupProject")).toString();
     if (!startupProject.isEmpty()) {
-        foreach (Project *pro, m_projects) {
+        foreach (Project *pro, d->m_projects) {
             if (QDir::cleanPath(pro->projectFilePath()) == startupProject) {
-                setStartupProject(pro);
+                m_instance->setStartupProject(pro);
                 break;
             }
         }
     }
     if (!m_startupProject) {
         qWarning() << "Could not find startup project" << startupProject;
-        if (!projects().isEmpty())
-            setStartupProject(projects().first());
+        if (!m_projects.isEmpty())
+            m_instance->setStartupProject(m_projects.first());
     }
 }
 
-void SessionManager::restoreEditors(const Utils::PersistentSettingsReader &reader)
+void SessionManagerPrivate::restoreEditors(const PersistentSettingsReader &reader)
 {
-    const QVariant &editorsettings = reader.restoreValue(QLatin1String("EditorSettings"));
+    const QVariant editorsettings = reader.restoreValue(QLatin1String("EditorSettings"));
     if (editorsettings.isValid()) {
         EditorManager::restoreState(QByteArray::fromBase64(editorsettings.toByteArray()));
         sessionLoadingProgress();
@@ -788,7 +832,7 @@ void SessionManager::restoreEditors(const Utils::PersistentSettingsReader &reade
 /*!
      \brief Loads a session, takes a session name (not filename).
 */
-void SessionManager::restoreProjects(const QStringList &fileList)
+void SessionManagerPrivate::restoreProjects(const QStringList &fileList)
 {
     // indirectly adds projects to session
     // Keep projects that failed to load in the session!
@@ -797,7 +841,7 @@ void SessionManager::restoreProjects(const QStringList &fileList)
         QString errors;
         QList<Project *> projects = ProjectExplorerPlugin::instance()->openProjects(fileList, &errors);
         if (!errors.isEmpty())
-            QMessageBox::critical(Core::ICore::mainWindow(), tr("Failed to open project"), errors);
+            QMessageBox::critical(Core::ICore::mainWindow(), SessionManager::tr("Failed to open project"), errors);
         foreach (Project *p, projects)
             m_failedProjects.removeAll(p->projectFilePath());
     }
@@ -808,14 +852,14 @@ bool SessionManager::loadSession(const QString &session)
     // Do nothing if we have that session already loaded,
     // exception if the session is the default virgin session
     // we still want to be able to load the default session
-    if (session == m_sessionName && !isDefaultVirgin())
+    if (session == d->m_sessionName && !isDefaultVirgin())
         return true;
 
     if (!sessions().contains(session))
         return false;
 
     // Try loading the file
-    Utils::FileName fileName = sessionNameToFileName(session);
+    FileName fileName = sessionNameToFileName(session);
     PersistentSettingsReader reader;
     if (fileName.toFileInfo().exists()) {
         if (!reader.load(fileName)) {
@@ -825,68 +869,68 @@ bool SessionManager::loadSession(const QString &session)
         }
     }
 
-    m_loadingSession = true;
+    d->m_loadingSession = true;
 
     // Allow everyone to set something in the session and before saving
-    emit aboutToUnloadSession(m_sessionName);
+    emit m_instance->aboutToUnloadSession(d->m_sessionName);
 
     if (!isDefaultVirgin()) {
         if (!save()) {
-            m_loadingSession = false;
+            d->m_loadingSession = false;
             return false;
         }
     }
 
     // Clean up
     if (!EditorManager::closeAllEditors()) {
-        m_loadingSession = false;
+        d->m_loadingSession = false;
         return false;
     }
 
     setStartupProject(0);
     removeProjects(projects());
 
-    m_failedProjects.clear();
-    m_depMap.clear();
-    m_values.clear();
+    d->m_failedProjects.clear();
+    d->m_depMap.clear();
+    d->m_values.clear();
 
-    m_sessionName = session;
+    d->m_sessionName = session;
     updateWindowTitle();
 
     if (fileName.toFileInfo().exists()) {
-        m_virginSession = false;
+        d->m_virginSession = false;
 
-        ProgressManager::addTask(m_future.future(), tr("Session"),
+        ProgressManager::addTask(d->m_future.future(), tr("Session"),
            "ProjectExplorer.SessionFile.Load");
 
-        m_future.setProgressRange(0, 1);
-        m_future.setProgressValue(0);
+        d->m_future.setProgressRange(0, 1);
+        d->m_future.setProgressValue(0);
 
-        restoreValues(reader);
-        emit aboutToLoadSession(session);
+        d->restoreValues(reader);
+        emit m_instance->aboutToLoadSession(session);
 
         QColor c = QColor(reader.restoreValue(QLatin1String("Color")).toString());
         if (c.isValid())
-            Utils::StyleHelper::setBaseColor(c);
+            StyleHelper::setBaseColor(c);
 
         QStringList fileList =
             reader.restoreValue(QLatin1String("ProjectList")).toStringList();
 
-        m_future.setProgressRange(0, fileList.count() + 1/*initialization above*/ + 1/*editors*/);
-        m_future.setProgressValue(1);
+        d->m_future.setProgressRange(0, fileList.count() + 1/*initialization above*/ + 1/*editors*/);
+        d->m_future.setProgressValue(1);
 
         // if one processEvents doesn't get the job done
         // just use two!
         QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
         QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
-        restoreProjects(fileList);
-        sessionLoadingProgress();
-        restoreDependencies(reader);
-        restoreStartupProject(reader);
-        restoreEditors(reader);
+        d->restoreProjects(fileList);
+        d->sessionLoadingProgress();
+        d->restoreDependencies(reader);
+        d->restoreStartupProject(reader);
+        d->restoreEditors(reader);
 
-        m_future.reportFinished();
-        m_future = QFutureInterface<void>();
+        d->m_future.reportFinished();
+        d->m_future = QFutureInterface<void>();
 
         // restore the active mode
         Id modeId = Id::fromSetting(value(QLatin1String("ActiveMode")));
@@ -899,36 +943,36 @@ bool SessionManager::loadSession(const QString &session)
         ModeManager::activateMode(Id(Core::Constants::MODE_EDIT));
         ModeManager::setFocusToCurrentMode();
     }
-    emit sessionLoaded(session);
+    emit m_instance->sessionLoaded(session);
 
     // Starts a event loop, better do that at the very end
-    askUserAboutFailedProjects();
-    m_loadingSession = false;
+    d->askUserAboutFailedProjects();
+    d->m_loadingSession = false;
     return true;
 }
 
-QString SessionManager::lastSession() const
+QString SessionManager::lastSession()
 {
     return ICore::settings()->value(QLatin1String("ProjectExplorer/StartupSession")).toString();
 }
 
-SessionNode *SessionManager::sessionNode() const
+SessionNode *SessionManager::sessionNode()
 {
-    return m_sessionNode;
+    return d->m_sessionNode;
 }
 
 void SessionManager::reportProjectLoadingProgress()
 {
-    sessionLoadingProgress();
+    d->sessionLoadingProgress();
 }
 
 void SessionManager::markSessionFileDirty(bool makeDefaultVirginDirty)
 {
     if (makeDefaultVirginDirty)
-        m_virginSession = false;
+        d->m_virginSession = false;
 }
 
-void SessionManager::sessionLoadingProgress()
+void SessionManagerPrivate::sessionLoadingProgress()
 {
     m_future.setProgressValue(m_future.progressValue() + 1);
     QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
@@ -936,7 +980,7 @@ void SessionManager::sessionLoadingProgress()
 
 void SessionManager::projectDisplayNameChanged()
 {
-    Project *pro = qobject_cast<Project*>(sender());
+    Project *pro = qobject_cast<Project*>(m_instance->sender());
     if (pro) {
         Node *currentNode = 0;
         if (ProjectExplorerPlugin::currentProject() == pro)
@@ -945,19 +989,19 @@ void SessionManager::projectDisplayNameChanged()
         // Fix node sorting
         QList<ProjectNode *> nodes;
         nodes << pro->rootProjectNode();
-        m_sessionNode->removeProjectNodes(nodes);
-        m_sessionNode->addProjectNodes(nodes);
+        d->m_sessionNode->removeProjectNodes(nodes);
+        d->m_sessionNode->addProjectNodes(nodes);
 
         if (currentNode)
             ProjectExplorerPlugin::instance()->setCurrentNode(currentNode);
 
-        emit projectDisplayNameChanged(pro);
+        emit m_instance->projectDisplayNameChanged(pro);
     }
 }
 
-QStringList ProjectExplorer::SessionManager::projectsForSessionName(const QString &session) const
+QStringList SessionManager::projectsForSessionName(const QString &session)
 {
-    const Utils::FileName fileName = sessionNameToFileName(session);
+    const FileName fileName = sessionNameToFileName(session);
     PersistentSettingsReader reader;
     if (fileName.toFileInfo().exists()) {
         if (!reader.load(fileName)) {
@@ -967,3 +1011,5 @@ QStringList ProjectExplorer::SessionManager::projectsForSessionName(const QStrin
     }
     return reader.restoreValue(QLatin1String("ProjectList")).toStringList();
 }
+
+} // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h
index e983c2a1976..0348f33ed3f 100644
--- a/src/plugins/projectexplorer/session.h
+++ b/src/plugins/projectexplorer/session.h
@@ -66,62 +66,66 @@ public:
     explicit SessionManager(QObject *parent = 0);
     ~SessionManager();
 
+    static QObject *instance();
+
     // higher level session management
-    QString activeSession() const;
-    QString lastSession() const;
-    QStringList sessions() const;
+    static QString activeSession();
+    static QString lastSession();
+    static QStringList sessions();
 
-    bool createSession(const QString &session);
+    static bool createSession(const QString &session);
 
-    bool confirmSessionDelete(const QString &session);
-    bool deleteSession(const QString &session);
+    static bool confirmSessionDelete(const QString &session);
+    static bool deleteSession(const QString &session);
 
-    bool cloneSession(const QString &original, const QString &clone);
-    bool renameSession(const QString &original, const QString &newName);
+    static bool cloneSession(const QString &original, const QString &clone);
+    static bool renameSession(const QString &original, const QString &newName);
 
-    bool loadSession(const QString &session);
+    static bool loadSession(const QString &session);
 
-    bool save();
-    void closeAllProjects();
+    static bool save();
+    static void closeAllProjects();
 
-    void addProject(Project *project);
-    void addProjects(const QList<Project*> &projects);
-    void removeProject(Project *project);
-    void removeProjects(QList<Project *> remove);
+    static void addProject(Project *project);
+    static void addProjects(const QList<Project*> &projects);
+    static void removeProject(Project *project);
+    static void removeProjects(QList<Project *> remove);
 
-    void setStartupProject(Project *startupProject);
+    static void setStartupProject(Project *startupProject);
 
-    QList<Project *> dependencies(const Project *project) const;
-    bool hasDependency(const Project *project, const Project *depProject) const;
-    bool canAddDependency(const Project *project, const Project *depProject) const;
-    bool addDependency(Project *project, Project *depProject);
-    void removeDependency(Project *project, Project *depProject);
+    static QList<Project *> dependencies(const Project *project);
+    static bool hasDependency(const Project *project, const Project *depProject);
+    static bool canAddDependency(const Project *project, const Project *depProject);
+    static bool addDependency(Project *project, Project *depProject);
+    static void removeDependency(Project *project, Project *depProject);
 
-    Utils::FileName sessionNameToFileName(const QString &session) const;
-    Project *startupProject() const;
+    static Utils::FileName sessionNameToFileName(const QString &session);
+    static Project *startupProject();
 
-    const QList<Project *> &projects() const;
+    static const QList<Project *> &projects();
+    static bool hasProjects();
 
-    bool isDefaultVirgin() const;
-    bool isDefaultSession(const QString &session) const;
+    static bool isDefaultVirgin();
+    static bool isDefaultSession(const QString &session);
 
     // Let other plugins store persistent values within the session file
-    void setValue(const QString &name, const QVariant &value);
-    QVariant value(const QString &name);
+    static void setValue(const QString &name, const QVariant &value);
+    static QVariant value(const QString &name);
 
     // NBS rewrite projectOrder (dependency management)
-    QList<Project *> projectOrder(Project *project = 0) const;
+    static QList<Project *> projectOrder(Project *project = 0);
+
+    static SessionNode *sessionNode();
 
-    SessionNode *sessionNode() const;
+    static Project *projectForNode(ProjectExplorer::Node *node);
+    static Node *nodeForFile(const QString &fileName, Project *project = 0);
+    static Project *projectForFile(const QString &fileName);
 
-    Project *projectForNode(ProjectExplorer::Node *node) const;
-    Node *nodeForFile(const QString &fileName, Project *project = 0) const;
-    Project *projectForFile(const QString &fileName) const;
+    static QStringList projectsForSessionName(const QString &session);
 
-    QStringList projectsForSessionName(const QString &session) const;
+    static void reportProjectLoadingProgress();
+    static bool loadingSession();
 
-    void reportProjectLoadingProgress();
-    bool loadingSession();
 signals:
     void projectAdded(ProjectExplorer::Project *project);
     void singleProjectAdded(ProjectExplorer::Project *project);
@@ -138,46 +142,12 @@ signals:
     void dependencyChanged(ProjectExplorer::Project *a, ProjectExplorer::Project *b);
 
 private slots:
-    void saveActiveMode(Core::IMode *mode);
-    void clearProjectFileCache();
-    void configureEditor(Core::IEditor *editor, const QString &fileName);
-    void updateWindowTitle();
-
-    void markSessionFileDirty(bool makeDefaultVirginDirty = true);
-    void sessionLoadingProgress();
-
-    void projectDisplayNameChanged();
-
-private:
-    bool projectContainsFile(Project *p, const QString &fileName) const;
-    void restoreValues(const Utils::PersistentSettingsReader &reader);
-    void restoreDependencies(const Utils::PersistentSettingsReader &reader);
-    void restoreStartupProject(const Utils::PersistentSettingsReader &reader);
-    void restoreEditors(const Utils::PersistentSettingsReader &reader);
-    void restoreProjects(const QStringList &fileList);
-    void askUserAboutFailedProjects();
-
-    bool recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const;
-    QStringList dependencies(const QString &proName) const;
-    QStringList dependenciesOrder() const;
-    void dependencies(const QString &proName, QStringList &result) const;
-
-    SessionNode *m_sessionNode;
-    QString m_sessionName;
-    bool m_virginSession;
-
-    mutable QStringList m_sessions;
-
-    mutable QHash<Project *, QStringList> m_projectFileCache;
-    bool m_loadingSession;
-
-    Project *m_startupProject;
-    QList<Project *> m_projects;
-    QStringList m_failedProjects;
-    QMap<QString, QStringList> m_depMap;
-    QMap<QString, QVariant> m_values;
-    QFutureInterface<void> m_future;
-    Utils::PersistentSettingsWriter *m_writer;
+    static void saveActiveMode(Core::IMode *mode);
+    static void clearProjectFileCache();
+    static void configureEditor(Core::IEditor *editor, const QString &fileName);
+    static void updateWindowTitle();
+    static void markSessionFileDirty(bool makeDefaultVirginDirty = true);
+    static void projectDisplayNameChanged();
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/pythoneditor/wizard/pythonclasswizard.cpp b/src/plugins/pythoneditor/wizard/pythonclasswizard.cpp
index 34297f1743a..ca9619b6608 100644
--- a/src/plugins/pythoneditor/wizard/pythonclasswizard.cpp
+++ b/src/plugins/pythoneditor/wizard/pythonclasswizard.cpp
@@ -113,8 +113,8 @@ Kit *ClassWizard::kitForWizard(const ClassWizardDialog *wizard) const
     const QString nodePath = wizard->extraValues().value(key).toString();
 
     // projectForFile doesn't find project if project file path passed
-    Node *node = ProjectExplorerPlugin::instance()->session()->nodeForFile(nodePath);
-    Project *proj = ProjectExplorerPlugin::instance()->session()->projectForNode(node);
+    Node *node = SessionManager::nodeForFile(nodePath);
+    Project *proj = SessionManager::projectForNode(node);
     if (proj && proj->activeTarget())
         return proj->activeTarget()->kit();
 
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
index 311aa46e036..e8d38a09b75 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
@@ -60,6 +60,8 @@
 #include <QAction>
 #include <QtPlugin>
 
+using namespace ProjectExplorer;
+
 namespace QbsProjectManager {
 namespace Internal {
 
@@ -239,10 +241,8 @@ void QbsProjectManagerPlugin::updateBuildActions()
 
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
         file = currentDocument->filePath();
-        ProjectExplorer::SessionManager *session = m_projectExplorer->session();
-        ProjectExplorer::Node *node  = session->nodeForFile(file);
-        ProjectExplorer::Project *project
-                = qobject_cast<QbsProject *>(session->projectForFile(file));
+        Node *node  = SessionManager::nodeForFile(file);
+        Project *project = qobject_cast<QbsProject *>(SessionManager::projectForFile(file));
 
         m_buildFile->setParameter(QFileInfo(file).fileName());
         fileVisible = project && node && qobject_cast<QbsBaseProjectNode *>(node->projectNode());
@@ -310,7 +310,7 @@ void QbsProjectManagerPlugin::buildFile()
     QbsProject *project = 0;
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
         file = currentDocument->filePath();
-        project = qobject_cast<QbsProject *>(m_projectExplorer->session()->projectForFile(file));
+        project = qobject_cast<QbsProject *>(SessionManager::projectForFile(file));
     }
 
     if (!project || file.isEmpty())
@@ -333,10 +333,9 @@ void QbsProjectManagerPlugin::buildProduct()
     QbsProductNode *product = 0;
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
         const QString file = currentDocument->filePath();
-        ProjectExplorer::SessionManager *session = m_projectExplorer->session();
 
-        project = qobject_cast<QbsProject *>(session->projectForFile(file));
-        product = qobject_cast<QbsProductNode *>(session->nodeForFile(file)->projectNode());
+        project = qobject_cast<QbsProject *>(SessionManager::projectForFile(file));
+        product = qobject_cast<QbsProductNode *>(SessionManager::nodeForFile(file)->projectNode());
     }
 
     if (!project || !product)
diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp
index 5566dff68f1..2deef581827 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp
@@ -273,8 +273,7 @@ void ModelManager::delayedInitialization()
                 this, SLOT(maybeQueueCppQmlTypeUpdate(CPlusPlus::Document::Ptr)), Qt::DirectConnection);
     }
 
-    ProjectExplorer::SessionManager *sessionManager = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-    connect(sessionManager, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
+    connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)),
             this, SLOT(removeProjectInfo(ProjectExplorer::Project*)));
 }
 
@@ -1111,8 +1110,7 @@ ModelManager::CppDataHash ModelManager::cppData() const
 
 LibraryInfo ModelManager::builtins(const Document::Ptr &doc) const
 {
-    ProjectExplorer::SessionManager *sessionManager = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-    ProjectExplorer::Project *project = sessionManager->projectForFile(doc->fileName());
+    ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile(doc->fileName());
     if (!project)
         return LibraryInfo();
 
diff --git a/src/plugins/qmljstools/qmljsplugindumper.cpp b/src/plugins/qmljstools/qmljsplugindumper.cpp
index 5338220afcf..f4e88cf84be 100644
--- a/src/plugins/qmljstools/qmljsplugindumper.cpp
+++ b/src/plugins/qmljstools/qmljsplugindumper.cpp
@@ -31,7 +31,7 @@
 #include "qmljsmodelmanager.h"
 
 #include <qmljs/qmljsinterpreter.h>
-#include <projectexplorer/projectexplorer.h>
+#include <projectexplorer/session.h>
 #include <coreplugin/messagemanager.h>
 #include <utils/filesystemwatcher.h>
 #include <utils/fileutils.h>
@@ -437,7 +437,7 @@ void PluginDumper::dump(const Plugin &plugin)
         return;
     }
 
-    ProjectExplorer::Project *activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject();
+    ProjectExplorer::Project *activeProject = ProjectExplorer::SessionManager::startupProject();
     if (!activeProject)
         return;
 
diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp
index 5927d7caca5..444f536d6bb 100644
--- a/src/plugins/qmlprofiler/qmlprofilertool.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp
@@ -297,11 +297,10 @@ void QmlProfilerTool::populateFileFinder(QString projectDirectory, QString activ
 {
     // Initialize filefinder with some sensible default
     QStringList sourceFiles;
-    SessionManager *sessionManager = ProjectExplorerPlugin::instance()->session();
-    QList<Project *> projects = sessionManager->projects();
-    if (Project *startupProject = ProjectExplorerPlugin::instance()->startupProject()) {
+    QList<Project *> projects = SessionManager::projects();
+    if (Project *startupProject = SessionManager::startupProject()) {
         // startup project first
-        projects.removeOne(ProjectExplorerPlugin::instance()->startupProject());
+        projects.removeOne(startupProject);
         projects.insert(0, startupProject);
     }
     foreach (Project *project, projects)
@@ -459,10 +458,9 @@ void QmlProfilerTool::startTool(StartMode mode)
     AnalyzerManager::showMode();
 
     if (mode == StartLocal) {
-        ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
         // ### not sure if we're supposed to check if the RunConFiguration isEnabled
-        Project *pro = pe->startupProject();
-        pe->runProject(pro, runMode());
+        Project *pro = SessionManager::startupProject();
+        ProjectExplorerPlugin::instance()->runProject(pro, runMode());
     } else if (mode == StartRemote) {
         startRemoteTool(this, mode);
     }
diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp
index a39e0b1bf9b..27cc84a6359 100644
--- a/src/plugins/qt4projectmanager/externaleditors.cpp
+++ b/src/plugins/qt4projectmanager/externaleditors.cpp
@@ -54,8 +54,7 @@ namespace Internal {
 // Figure out the Qt4 project used by the file if any
 static Qt4Project *qt4ProjectFor(const QString &fileName)
 {
-    ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance();
-    if (ProjectExplorer::Project *baseProject = pe->session()->projectForFile(fileName))
+    if (ProjectExplorer::Project *baseProject = ProjectExplorer::SessionManager::projectForFile(fileName))
         if (Qt4Project *project = qobject_cast<Qt4Project*>(baseProject))
             return project;
     return 0;
diff --git a/src/plugins/qt4projectmanager/librarydetailscontroller.cpp b/src/plugins/qt4projectmanager/librarydetailscontroller.cpp
index 73a7d79af2d..e8a4bfb6c90 100644
--- a/src/plugins/qt4projectmanager/librarydetailscontroller.cpp
+++ b/src/plugins/qt4projectmanager/librarydetailscontroller.cpp
@@ -45,6 +45,7 @@
 #include <QDir>
 #include <QTextStream>
 
+using namespace ProjectExplorer;
 using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
@@ -83,7 +84,7 @@ LibraryDetailsController::LibraryDetailsController(
     if (!Utils::HostOsInfo::isLinuxHost()) {
         // project for which we are going to insert the snippet
         const ProjectExplorer::Project *project =
-                ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(proFile);
+                ProjectExplorer::SessionManager::projectForFile(proFile);
         // if its tool chain is maemo behave the same as we would be on linux
         ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(project->activeTarget()->kit());
         if (tc
@@ -816,8 +817,7 @@ QString PackageLibraryDetailsController::snippet() const
 
 bool PackageLibraryDetailsController::isLinkPackageGenerated() const
 {
-    const ProjectExplorer::Project *project =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(proFile());
+    const Project *project = SessionManager::projectForFile(proFile());
     if (!project)
         return false;
 
@@ -969,8 +969,7 @@ void InternalLibraryDetailsController::updateProFile()
     m_proFileNodes.clear();
     libraryDetailsWidget()->libraryComboBox->clear();
 
-    const ProjectExplorer::Project *project =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(proFile());
+    const Project *project = SessionManager::projectForFile(proFile());
     if (!project)
         return;
 
@@ -1053,8 +1052,7 @@ QString InternalLibraryDetailsController::snippet() const
     const QString proRelavitePath = rootDir.relativeFilePath(proFile());
 
     // project for which we insert the snippet
-    const ProjectExplorer::Project *project =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(proFile());
+    const Project *project = SessionManager::projectForFile(proFile());
 
     // the build directory of the active build configuration
     QDir rootBuildDir = rootDir; // If the project is unconfigured use the project dir
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
index 395fa9d4fbf..593afa3aff7 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
@@ -51,17 +51,10 @@
 #include <QVariant>
 #include <QMessageBox>
 
+using namespace ProjectExplorer;
 using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
-using ProjectExplorer::BuildStep;
-using ProjectExplorer::FileType;
-using ProjectExplorer::HeaderType;
-using ProjectExplorer::SourceType;
-using ProjectExplorer::FormType;
-using ProjectExplorer::ResourceType;
-using ProjectExplorer::UnknownFileType;
-
 // Known file types of a Qt 4 project
 static const char *qt4FileTypes[] = {
     "CppHeaderFiles",
@@ -198,7 +191,7 @@ void Qt4Manager::addLibrary(const QString &fileName, ProFileEditorWidget *editor
 
 void Qt4Manager::runQMake()
 {
-    runQMake(projectExplorer()->startupProject(), 0);
+    runQMake(SessionManager::startupProject(), 0);
 }
 
 void Qt4Manager::runQMakeContextMenu()
@@ -257,13 +250,11 @@ void Qt4Manager::buildFile()
 {
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
         QString file = currentDocument->filePath();
-        ProjectExplorer::SessionManager *session = projectExplorer()->session();
-        ProjectExplorer::FileNode *node  = qobject_cast<FileNode *>(session->nodeForFile(file));
-        ProjectExplorer::Project *project = session->projectForFile(file);
+        FileNode *node  = qobject_cast<FileNode *>(SessionManager::nodeForFile(file));
+        Project *project = SessionManager::projectForFile(file);
 
         if (project && node)
             handleSubDirContextMenu(BUILD, true, project, node->projectNode(), node);
-
     }
 }
 
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
index e44e004aede..06689630d36 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
@@ -81,7 +81,7 @@
 
 using namespace Qt4ProjectManager::Internal;
 using namespace Qt4ProjectManager;
-using ProjectExplorer::Project;
+using namespace ProjectExplorer;
 
 Qt4ProjectManagerPlugin::Qt4ProjectManagerPlugin()
     : m_previousStartupProject(0), m_previousTarget(0)
@@ -259,7 +259,7 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString *
 
     connect(m_projectExplorer->buildManager(), SIGNAL(buildStateChanged(ProjectExplorer::Project*)),
             this, SLOT(buildStateChanged(ProjectExplorer::Project*)));
-    connect(m_projectExplorer->session(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
+    connect(SessionManager::instance(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
             this, SLOT(startupProjectChanged()));
     connect(m_projectExplorer, SIGNAL(currentNodeChanged(ProjectExplorer::Node*,ProjectExplorer::Project*)),
             this, SLOT(updateContextActions(ProjectExplorer::Node*,ProjectExplorer::Project*)));
@@ -306,7 +306,7 @@ void Qt4ProjectManagerPlugin::startupProjectChanged()
         disconnect(m_previousStartupProject, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)),
                    this, SLOT(activeTargetChanged()));
 
-    m_previousStartupProject = qobject_cast<Qt4Project *>(m_projectExplorer->session()->startupProject());
+    m_previousStartupProject = qobject_cast<Qt4Project *>(SessionManager::startupProject());
 
     if (m_previousStartupProject)
         connect(m_previousStartupProject, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)),
@@ -415,12 +415,10 @@ void Qt4ProjectManagerPlugin::updateBuildFileAction()
     bool visible = false;
     bool enabled = false;
 
-    QString file;
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
-        file = currentDocument->filePath();
-        ProjectExplorer::SessionManager *session = m_projectExplorer->session();
-        ProjectExplorer::Node *node  = session->nodeForFile(file);
-        ProjectExplorer::Project *project = session->projectForFile(file);
+        QString file = currentDocument->filePath();
+        Node *node  = SessionManager::nodeForFile(file);
+        Project *project = SessionManager::projectForFile(file);
         m_buildFileAction->setParameter(QFileInfo(file).fileName());
         visible = qobject_cast<Qt4Project *>(project)
                 && node
diff --git a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp
index 366ae42568c..b5cf55dc820 100644
--- a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp
+++ b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp
@@ -45,6 +45,7 @@
 #include <QPushButton>
 #include <QDialogButtonBox>
 
+using namespace ProjectExplorer;
 using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
@@ -194,15 +195,15 @@ void TargetSetupPageWrapper::keyReleaseEvent(QKeyEvent *event)
 
 void TargetSetupPageWrapper::cancel()
 {
-    ProjectExplorer::ProjectExplorerPlugin::instance()->unloadProject(m_project);
-    if (ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects().isEmpty())
+    ProjectExplorerPlugin::instance()->unloadProject(m_project);
+    if (!SessionManager::hasProjects())
         Core::ModeManager::activateMode(Core::Constants::MODE_WELCOME);
 }
 
 void TargetSetupPageWrapper::done()
 {
     m_targetSetupPage->setupProject(m_project);
-    ProjectExplorer::ProjectExplorerPlugin::instance()->requestProjectModeUpdate(m_project);
+    ProjectExplorerPlugin::instance()->requestProjectModeUpdate(m_project);
     Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
 }
 
diff --git a/src/plugins/qtsupport/uicodemodelsupport.cpp b/src/plugins/qtsupport/uicodemodelsupport.cpp
index d81c5c5ac90..ee207d829a2 100644
--- a/src/plugins/qtsupport/uicodemodelsupport.cpp
+++ b/src/plugins/qtsupport/uicodemodelsupport.cpp
@@ -314,7 +314,7 @@ UiCodeModelManager::UiCodeModelManager() :
             = ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
     connect(bm, SIGNAL(buildStateChanged(ProjectExplorer::Project*)),
             this, SLOT(buildStateHasChanged(ProjectExplorer::Project*)));
-    connect(ProjectExplorer::ProjectExplorerPlugin::instance()->session(),
+    connect(ProjectExplorer::SessionManager::instance(),
             SIGNAL(projectRemoved(ProjectExplorer::Project*)),
             this, SLOT(projectWasRemoved(ProjectExplorer::Project*)));
 
diff --git a/src/plugins/texteditor/generichighlighter/manager.h b/src/plugins/texteditor/generichighlighter/manager.h
index 548ef118ee0..9c39d194ecb 100644
--- a/src/plugins/texteditor/generichighlighter/manager.h
+++ b/src/plugins/texteditor/generichighlighter/manager.h
@@ -95,6 +95,7 @@ private:
     Manager();
 
     void clear();
+    int foo();
 
     bool m_isDownloadingDefinitionsSpec;
     QList<DefinitionDownloader *> m_downloaders;
diff --git a/src/plugins/todo/todoitemsprovider.cpp b/src/plugins/todo/todoitemsprovider.cpp
index 670b126b0c8..d1fcf4dc41b 100644
--- a/src/plugins/todo/todoitemsprovider.cpp
+++ b/src/plugins/todo/todoitemsprovider.cpp
@@ -41,6 +41,8 @@
 
 #include <QTimer>
 
+using namespace ProjectExplorer;
+
 namespace Todo {
 namespace Internal {
 
@@ -150,12 +152,10 @@ void TodoItemsProvider::updateListTimeoutElapsed()
 
 void TodoItemsProvider::setupStartupProjectBinding()
 {
-    ProjectExplorer::ProjectExplorerPlugin *projectExplorerPlugin = ProjectExplorer::ProjectExplorerPlugin::instance();
-
-    m_startupProject = projectExplorerPlugin->startupProject();
-    connect(projectExplorerPlugin->session(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
+    m_startupProject = SessionManager::startupProject();
+    connect(SessionManager::instance(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
         SLOT(startupProjectChanged(ProjectExplorer::Project*)));
-    connect(projectExplorerPlugin, SIGNAL(fileListChanged()), SLOT(projectsFilesChanged()));
+    connect(ProjectExplorerPlugin::instance(), SIGNAL(fileListChanged()), SLOT(projectsFilesChanged()));
 }
 
 void TodoItemsProvider::setupCurrentEditorBinding()
diff --git a/src/plugins/valgrind/memcheckerrorview.cpp b/src/plugins/valgrind/memcheckerrorview.cpp
index adf38c7e125..83b9a7b4217 100644
--- a/src/plugins/valgrind/memcheckerrorview.cpp
+++ b/src/plugins/valgrind/memcheckerrorview.cpp
@@ -44,6 +44,7 @@
 #include <coreplugin/editormanager/editormanager.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/projectexplorer.h>
+#include <projectexplorer/session.h>
 #include <utils/qtcassert.h>
 
 #include <QDir>
@@ -185,8 +186,7 @@ static QString makeFrameName(const Frame &frame, const QString &relativeTo,
 static QString relativeToPath()
 {
     // The project for which we insert the snippet.
-    const ProjectExplorer::Project *project =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject();
+    const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
 
     QString relativeTo(project ? project->projectDirectory() : QDir::homePath());
     if (!relativeTo.endsWith(QDir::separator()))
diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index 873840b079d..622b44bfea8 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -139,9 +139,8 @@ bool MemcheckErrorFilterProxyModel::filterAcceptsRow(int sourceRow, const QModel
     if (m_filterExternalIssues && !error.stacks().isEmpty()) {
         // ALGORITHM: look at last five stack frames, if none of these is inside any open projects,
         // assume this error was created by an external library
-        SessionManager *session = ProjectExplorerPlugin::instance()->session();
         QSet<QString> validFolders;
-        foreach (Project *project, session->projects()) {
+        foreach (Project *project, SessionManager::projects()) {
             validFolders << project->projectDirectory();
             foreach (Target *target, project->targets()) {
                 foreach (BuildConfiguration *config, target->buildConfigurations())
@@ -227,8 +226,7 @@ void MemcheckTool::settingsDestroyed(QObject *settings)
 void MemcheckTool::maybeActiveRunConfigurationChanged()
 {
     ValgrindBaseSettings *settings = 0;
-    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-    if (Project *project = pe->startupProject())
+    if (Project *project = SessionManager::startupProject())
         if (Target *target = project->activeTarget())
             if (RunConfiguration *rc = target->activeRunConfiguration())
                 if (IRunConfigurationAspect *aspect = rc->extraAspect(ANALYZER_VALGRIND_SETTINGS))
diff --git a/src/plugins/valgrind/suppressiondialog.cpp b/src/plugins/valgrind/suppressiondialog.cpp
index 782428c5d14..cd19cd6e336 100644
--- a/src/plugins/valgrind/suppressiondialog.cpp
+++ b/src/plugins/valgrind/suppressiondialog.cpp
@@ -211,9 +211,8 @@ void SuppressionDialog::accept()
         return;
 
     // Add file to project if there is a project containing this file on the file system.
-    ProjectExplorer::SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-    if (!session->projectForFile(path)) {
-        foreach (ProjectExplorer::Project *p, session->projects()) {
+    if (!ProjectExplorer::SessionManager::projectForFile(path)) {
+        foreach (ProjectExplorer::Project *p, ProjectExplorer::SessionManager::projects()) {
             if (path.startsWith(p->projectDirectory())) {
                 p->rootProjectNode()->addFiles(QStringList() << path);
                 break;
diff --git a/src/plugins/valgrind/valgrindtool.cpp b/src/plugins/valgrind/valgrindtool.cpp
index 42fd0b6a8da..fd1f008b4cb 100644
--- a/src/plugins/valgrind/valgrindtool.cpp
+++ b/src/plugins/valgrind/valgrindtool.cpp
@@ -41,6 +41,7 @@
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/session.h>
 #include <projectexplorer/target.h>
 
 #include <utils/qtcassert.h>
@@ -83,10 +84,8 @@ static void startLocalTool(IAnalyzerTool *tool)
     // Make sure mode is shown.
     AnalyzerManager::showMode();
 
-    ProjectExplorerPlugin *pe = ProjectExplorerPlugin::instance();
-
     // ### not sure if we're supposed to check if the RunConFiguration isEnabled
-    Project *pro = pe->startupProject();
+    Project *pro = SessionManager::startupProject();
     BuildConfiguration::BuildType buildType = BuildConfiguration::Unknown;
     if (pro) {
         if (const Target *target = pro->activeTarget()) {
@@ -147,7 +146,7 @@ static void startLocalTool(IAnalyzerTool *tool)
             return;
     }
 
-    pe->runProject(pro, tool->runMode());
+    ProjectExplorerPlugin::instance()->runProject(pro, tool->runMode());
 }
 
 static void startRemoteTool(IAnalyzerTool *tool)
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 3b53ef2ffb6..62f862e881f 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -1206,8 +1206,7 @@ static QTextCodec *findProjectCodec(const QString &dir)
 {
     typedef  QList<ProjectExplorer::Project*> ProjectList;
     // Try to find a project under which file tree the file is.
-    const ProjectExplorer::SessionManager *sm = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
-    const ProjectList projects = sm->projects();
+    const ProjectList projects = ProjectExplorer::SessionManager::projects();
     if (!projects.empty()) {
         const ProjectList::const_iterator pcend = projects.constEnd();
         for (ProjectList::const_iterator it = projects.constBegin(); it != pcend; ++it)
-- 
GitLab