diff --git a/src/plugins/analyzerbase/analyzerplugin.cpp b/src/plugins/analyzerbase/analyzerplugin.cpp
index c349144ded4a666e77092452bbd38f67d76618ce..621e5f6d998b98fed9b1d9827717a34305143b81 100644
--- a/src/plugins/analyzerbase/analyzerplugin.cpp
+++ b/src/plugins/analyzerbase/analyzerplugin.cpp
@@ -66,8 +66,7 @@ bool AnalyzerPlugin::initialize(const QStringList &arguments, QString *errorStri
 
     // Task integration.
     //: Category under which Analyzer tasks are listed in Issues view
-    ProjectExplorer::ProjectExplorerPlugin::taskHub()
-            ->addCategory(Constants::ANALYZERTASK_ID, tr("Analyzer"));
+    ProjectExplorer::TaskHub::addCategory(Constants::ANALYZERTASK_ID, tr("Analyzer"));
 
     return true;
 }
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 4f037ca002dd658271b015833680c85e6ec5b88f..04607474a039521fc0d1f0cb4d7f2db0165b4168 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -167,8 +167,7 @@ public:
         m_watchHandler(engine),
         m_disassemblerAgent(engine),
         m_memoryAgent(engine),
-        m_isStateDebugging(false),
-        m_taskHub(0)
+        m_isStateDebugging(false)
     {
         connect(&m_locationTimer, SIGNAL(timeout()), SLOT(resetLocation()));
     }
@@ -255,8 +254,6 @@ public slots:
         m_disassemblerAgent.resetLocation();
     }
 
-    TaskHub *taskHub();
-
 public:
     DebuggerState state() const { return m_state; }
     RemoteSetupState remoteSetupState() const { return m_remoteSetupState; }
@@ -301,7 +298,6 @@ public:
     bool m_isStateDebugging;
 
     Utils::FileInProjectFinder m_fileFinder;
-    TaskHub *m_taskHub;
 };
 
 
@@ -1858,25 +1854,6 @@ void DebuggerEngine::checkForReleaseBuild(const DebuggerStartParameters &sp)
                       "Setting breakpoints by file name and line number may fail.\n").append(detailedWarning));
 }
 
-TaskHub *DebuggerEnginePrivate::taskHub()
-{
-    if (!m_taskHub) {
-        m_taskHub = ProjectExplorerPlugin::taskHub();
-        m_taskHub->addCategory(Debugger::Constants::TASK_CATEGORY_DEBUGGER_DEBUGINFO,
-                               tr("Debug Information"));
-        m_taskHub->addCategory(Debugger::Constants::TASK_CATEGORY_DEBUGGER_TEST,
-                               tr("Debugger Test"));
-        m_taskHub->addCategory(Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME,
-                               tr("Debugger Runtime"));
-    }
-    return m_taskHub;
-}
-
-TaskHub *DebuggerEngine::taskHub()
-{
-    return d->taskHub();
-}
-
 } // namespace Debugger
 
 #include "debuggerengine.moc"
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 4779e92cebcf94e1a991d7543e009ed1deb73a30..a92fae8d8c68db7a0e14bfbd8cab6c885b54ac34 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -83,6 +83,7 @@
 
 #include <projectexplorer/localapplicationrunconfiguration.h>
 #include <projectexplorer/buildmanager.h>
+#include <projectexplorer/taskhub.h>
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/devicesupport/deviceprocesslist.h>
 #include <projectexplorer/devicesupport/deviceprocessesdialog.h>
@@ -1504,6 +1505,13 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments,
     // Cpp/Qml ui setup
     m_mainWindow = new DebuggerMainWindow;
 
+    TaskHub::addCategory(Debugger::Constants::TASK_CATEGORY_DEBUGGER_DEBUGINFO,
+                         tr("Debug Information"));
+    TaskHub::addCategory(Debugger::Constants::TASK_CATEGORY_DEBUGGER_TEST,
+                         tr("Debugger Test"));
+    TaskHub::addCategory(Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME,
+                         tr("Debugger Runtime"));
+
     return true;
 }
 
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 664776e7baed96776bf7604c11e851b3c275c015..eb78ade14a7d65685f8a7e55ab1af4e6d7bfeb95 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -458,10 +458,9 @@ static bool fixupEngineTypes(DebuggerStartParameters &sp, RunConfiguration *rc,
 DebuggerRunControl *DebuggerRunControlFactory::doCreate
     (const DebuggerStartParameters &sp0, RunConfiguration *rc, QString *errorMessage)
 {
-    TaskHub *th = ProjectExplorerPlugin::taskHub();
-    th->clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_DEBUGINFO);
-    th->clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_TEST);
-    th->clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME);
+    TaskHub::clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_DEBUGINFO);
+    TaskHub::clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_TEST);
+    TaskHub::clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME);
 
     DebuggerStartParameters sp = sp0;
     if (!debuggerCore()->boolSetting(AutoEnrichParameters)) {
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index e312a17bef8d961f3a8b98e1440c803cbe35c1db..5ee8e22914d47142077fa1f0d3aca68c32dadd1e 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -32,8 +32,8 @@
 #include "buildprogress.h"
 #include "buildsteplist.h"
 #include "compileoutputwindow.h"
-#include "projectexplorer.h"
 #include "project.h"
+#include "projectexplorer.h"
 #include "projectexplorersettings.h"
 #include "target.h"
 #include "taskwindow.h"
@@ -126,8 +126,7 @@ BuildManager::BuildManager(ProjectExplorerPlugin *parent, QAction *cancelBuildAc
     d->m_outputWindow = new Internal::CompileOutputWindow(this, cancelBuildAction);
     ExtensionSystem::PluginManager::addObject(d->m_outputWindow);
 
-    d->m_taskHub = ProjectExplorerPlugin::taskHub();
-    d->m_taskWindow = new Internal::TaskWindow(d->m_taskHub);
+    d->m_taskWindow = new Internal::TaskWindow;
     ExtensionSystem::PluginManager::addObject(d->m_taskWindow);
 
     qRegisterMetaType<ProjectExplorer::BuildStep::OutputFormat>();
@@ -147,10 +146,10 @@ BuildManager::BuildManager(ProjectExplorerPlugin *parent, QAction *cancelBuildAc
 
 void BuildManager::extensionsInitialized()
 {
-    d->m_taskHub->addCategory(Core::Id(Constants::TASK_CATEGORY_COMPILE),
-        tr("Compile", "Category for compiler issues listed under 'Issues'"));
-    d->m_taskHub->addCategory(Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM),
-        tr("Build System", "Category for build system issues listed under 'Issues'"));
+    TaskHub::addCategory(Core::Id(Constants::TASK_CATEGORY_COMPILE),
+                         tr("Compile", "Category for compiler issues listed under 'Issues'"));
+    TaskHub::addCategory(Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM),
+                         tr("Build System", "Category for build system issues listed under 'Issues'"));
 }
 
 BuildManager::~BuildManager()
@@ -294,8 +293,8 @@ void BuildManager::startBuildQueue(const QStringList &preambleMessage)
         d->m_outputWindow->clearContents();
         foreach (const QString &str, preambleMessage)
             addToOutputWindow(str, BuildStep::MessageOutput, BuildStep::DontAppendNewline);
-        d->m_taskHub->clearTasks(Core::Id(Constants::TASK_CATEGORY_COMPILE));
-        d->m_taskHub->clearTasks(Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
+        TaskHub::clearTasks(Core::Id(Constants::TASK_CATEGORY_COMPILE));
+        TaskHub::clearTasks(Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
         progressManager->setApplicationLabel(QString());
         d->m_futureProgress = progressManager->addTask(d->m_progressFutureInterface->future(),
               QString(),
@@ -331,7 +330,7 @@ void BuildManager::addToTaskWindow(const ProjectExplorer::Task &task)
 {
     d->m_outputWindow->registerPositionOf(task);
     // Distribute to all others
-    d->m_taskHub->addTask(task);
+    TaskHub::addTask(task);
 }
 
 void BuildManager::addToOutputWindow(const QString &string, BuildStep::OutputFormat format,
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index ba31d98664c98de3cb743182a9746ed40a38a893..4cb0308ea8dbe90067eb90e120d76118b5456bb3 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -345,8 +345,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     addAutoReleasedObject(new Internal::ToolChainOptionsPage);
     addAutoReleasedObject(new KitOptionsPage);
 
-    d->m_taskHub = new TaskHub;
-    addAutoReleasedObject(d->m_taskHub);
+    addAutoReleasedObject(new TaskHub);
 
     connect(Core::ICore::instance(), SIGNAL(newItemsDialogRequested()), this, SLOT(loadCustomWizards()));
 
@@ -1656,11 +1655,6 @@ BuildManager *ProjectExplorerPlugin::buildManager() const
     return d->m_buildManager;
 }
 
-TaskHub *ProjectExplorerPlugin::taskHub()
-{
-    return m_instance->d->m_taskHub;
-}
-
 void ProjectExplorerPlugin::buildStateChanged(Project * pro)
 {
     if (debug) {
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index d64702070c7d65480b799630ead7599214258483..48ccc33c19ccf44328630ba10a1a44f5b6739bd8 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -92,7 +92,6 @@ public:
     Project *startupProject() const;
 
     BuildManager *buildManager() const;
-    static TaskHub *taskHub();
 
     bool saveModifiedFiles();
 
diff --git a/src/plugins/projectexplorer/removetaskhandler.cpp b/src/plugins/projectexplorer/removetaskhandler.cpp
index d652a64763a7410ef80550b264a11ef650d830ac..cf8f81c451ac7171cffb556ade389820ff091bf1 100644
--- a/src/plugins/projectexplorer/removetaskhandler.cpp
+++ b/src/plugins/projectexplorer/removetaskhandler.cpp
@@ -29,7 +29,6 @@
 
 #include "removetaskhandler.h"
 
-#include "projectexplorer.h"
 #include "task.h"
 #include "taskhub.h"
 
@@ -39,7 +38,7 @@ using namespace ProjectExplorer::Internal;
 
 void RemoveTaskHandler::handle(const ProjectExplorer::Task &task)
 {
-    ProjectExplorerPlugin::taskHub()->removeTask(task);
+    TaskHub::removeTask(task);
 }
 
 QAction *RemoveTaskHandler::createAction(QObject *parent) const
diff --git a/src/plugins/projectexplorer/taskhub.cpp b/src/plugins/projectexplorer/taskhub.cpp
index 6af95161157639e2caf2be725ae1ad8c4182e290..b82fcc72275a7edc23a7481dded3428948209f0e 100644
--- a/src/plugins/projectexplorer/taskhub.cpp
+++ b/src/plugins/projectexplorer/taskhub.cpp
@@ -28,11 +28,13 @@
 ****************************************************************************/
 
 #include "taskhub.h"
-#include "projectexplorer.h"
+
 #include <coreplugin/ioutputpane.h>
 
 using namespace ProjectExplorer;
 
+TaskHub *TaskHub::m_instance = 0;
+
 class TaskMark : public TextEditor::BaseTextMark
 {
 public:
@@ -54,19 +56,19 @@ private:
 
 void TaskMark::updateLineNumber(int lineNumber)
 {
-    ProjectExplorerPlugin::taskHub()->updateTaskLineNumber(m_id, lineNumber);
+    TaskHub::updateTaskLineNumber(m_id, lineNumber);
     BaseTextMark::updateLineNumber(lineNumber);
 }
 
 void TaskMark::updateFileName(const QString &fileName)
 {
-    ProjectExplorerPlugin::taskHub()->updateTaskFileName(m_id, fileName);
+    TaskHub::updateTaskFileName(m_id, fileName);
     BaseTextMark::updateFileName(fileName);
 }
 
 void TaskMark::removedFromEditor()
 {
-    ProjectExplorerPlugin::taskHub()->updateTaskLineNumber(m_id, -1);
+    TaskHub::updateTaskLineNumber(m_id, -1);
 }
 
 bool TaskMark::isClickable() const
@@ -76,25 +78,26 @@ bool TaskMark::isClickable() const
 
 void TaskMark::clicked()
 {
-    ProjectExplorerPlugin::taskHub()->taskMarkClicked(m_id);
+    TaskHub::taskMarkClicked(m_id);
 }
 
 TaskHub::TaskHub()
     : m_errorIcon(QLatin1String(":/projectexplorer/images/compile_error.png")),
       m_warningIcon(QLatin1String(":/projectexplorer/images/compile_warning.png"))
 {
+    m_instance = this;
     qRegisterMetaType<ProjectExplorer::Task>("ProjectExplorer::Task");
     qRegisterMetaType<QList<ProjectExplorer::Task> >("QList<ProjectExplorer::Task>");
 }
 
 TaskHub::~TaskHub()
 {
-
+    m_instance = 0;
 }
 
 void TaskHub::addCategory(Core::Id categoryId, const QString &displayName, bool visible)
 {
-    emit categoryAdded(categoryId, displayName, visible);
+    emit m_instance->categoryAdded(categoryId, displayName, visible);
 }
 
 void TaskHub::addTask(Task task)
@@ -105,60 +108,60 @@ void TaskHub::addTask(Task task)
         mark->setIcon(taskTypeIcon(task.type));
         mark->setPriority(TextEditor::ITextMark::LowPriority);
         task.addMark(mark);
-        emit taskAdded(task);
+        emit m_instance->taskAdded(task);
         mark->init();
     } else {
-        emit taskAdded(task);
+        emit m_instance->taskAdded(task);
     }
 }
 
 void TaskHub::clearTasks(Core::Id categoryId)
 {
-    emit tasksCleared(categoryId);
+    emit m_instance->tasksCleared(categoryId);
 }
 
 void TaskHub::removeTask(const Task &task)
 {
-    emit taskRemoved(task);
+    emit m_instance->taskRemoved(task);
 }
 
 void TaskHub::updateTaskFileName(unsigned int id, const QString &fileName)
 {
-    emit taskFileNameUpdated(id, fileName);
+    emit m_instance->taskFileNameUpdated(id, fileName);
 }
 
 void TaskHub::updateTaskLineNumber(unsigned int id, int line)
 {
-    emit taskLineNumberUpdated(id, line);
+    emit m_instance->taskLineNumberUpdated(id, line);
 }
 
 void TaskHub::taskMarkClicked(unsigned int id)
 {
-    emit showTask(id);
+    emit m_instance->showTask(id);
 }
 
 void TaskHub::showTaskInEditor(unsigned int id)
 {
-    emit openTask(id);
+    emit m_instance->openTask(id);
 }
 
 void TaskHub::setCategoryVisibility(const Core::Id &categoryId, bool visible)
 {
-    emit categoryVisibilityChanged(categoryId, visible);
+    emit m_instance->categoryVisibilityChanged(categoryId, visible);
 }
 
 void TaskHub::requestPopup()
 {
-    emit popupRequested(Core::IOutputPane::NoModeSwitch);
+    emit m_instance->popupRequested(Core::IOutputPane::NoModeSwitch);
 }
 
-QIcon TaskHub::taskTypeIcon(Task::TaskType t) const
+QIcon TaskHub::taskTypeIcon(Task::TaskType t)
 {
     switch (t) {
     case Task::Warning:
-        return m_warningIcon;
+        return m_instance->m_warningIcon;
     case Task::Error:
-        return m_errorIcon;
+        return m_instance->m_errorIcon;
     case Task::Unknown:
         break;
     }
diff --git a/src/plugins/projectexplorer/taskhub.h b/src/plugins/projectexplorer/taskhub.h
index 211f65783d76ca409f34e5e2ee5afa0911837b2e..d88fb0c60d45243cda97ac06e166e95093d9042c 100644
--- a/src/plugins/projectexplorer/taskhub.h
+++ b/src/plugins/projectexplorer/taskhub.h
@@ -36,31 +36,32 @@
 #include <QIcon>
 
 namespace ProjectExplorer {
+
+class ProjectExplorerPlugin;
 class Task;
 
 class PROJECTEXPLORER_EXPORT TaskHub : public QObject
 {
     Q_OBJECT
 public:
-    TaskHub();
-    virtual ~TaskHub();
+    static TaskHub *instance();
 
 public slots:
-    void addCategory(Core::Id categoryId, const QString &displayName, bool visible = true);
-    void addTask(ProjectExplorer::Task task);
-    void clearTasks(Core::Id categoryId = Core::Id());
-    void removeTask(const ProjectExplorer::Task &task);
+    static void addCategory(Core::Id categoryId, const QString &displayName, bool visible = true);
+    static void addTask(ProjectExplorer::Task task);
+    static void clearTasks(Core::Id categoryId = Core::Id());
+    static void removeTask(const ProjectExplorer::Task &task);
 
 public:
-    void updateTaskFileName(unsigned int id, const QString &fileName);
-    void updateTaskLineNumber(unsigned int id, int line);
-    void taskMarkClicked(unsigned int id);
-    void showTaskInEditor(unsigned int id);
-    void setCategoryVisibility(const Core::Id &categoryId, bool visible);
+    static void updateTaskFileName(unsigned int id, const QString &fileName);
+    static void updateTaskLineNumber(unsigned int id, int line);
+    static void taskMarkClicked(unsigned int id);
+    static void showTaskInEditor(unsigned int id);
+    static void setCategoryVisibility(const Core::Id &categoryId, bool visible);
 
-    void requestPopup();
+    static void requestPopup();
 
-    QIcon taskTypeIcon(ProjectExplorer::Task::TaskType t) const;
+    static QIcon taskTypeIcon(ProjectExplorer::Task::TaskType t);
 
 signals:
     void categoryAdded(Core::Id categoryId, const QString &displayName, bool visible);
@@ -73,9 +74,18 @@ signals:
     void popupRequested(int);
     void showTask(unsigned int id);
     void openTask(unsigned int id);
+
 private:
+    TaskHub();
+    ~TaskHub();
+
     const QIcon m_errorIcon;
     const QIcon m_warningIcon;
+
+    static TaskHub *m_instance;
+
+    friend class ProjectExplorerPlugin;
 };
+
 } // namespace ProjectExplorer
 #endif // TASKHUB_H
diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp
index d89e0a7aaef7ae8f83e9395a25a3fa0a6bf57d4f..38daf63728de49e9ce7a886806f1e201a6d8a678 100644
--- a/src/plugins/projectexplorer/taskwindow.cpp
+++ b/src/plugins/projectexplorer/taskwindow.cpp
@@ -198,7 +198,6 @@ public:
     QToolButton *m_filterWarningsButton;
     QToolButton *m_categoriesButton;
     QMenu *m_categoriesMenu;
-    TaskHub *m_taskHub;
     int m_badgeCount;
     QList<QAction *> m_actions;
 };
@@ -217,7 +216,7 @@ static QToolButton *createFilterButton(QIcon icon, const QString &toolTip,
     return button;
 }
 
-TaskWindow::TaskWindow(TaskHub *taskhub) : d(new TaskWindowPrivate)
+TaskWindow::TaskWindow() : d(new TaskWindowPrivate)
 {
     d->m_defaultHandler = 0;
 
@@ -236,7 +235,6 @@ TaskWindow::TaskWindow(TaskHub *taskhub) : d(new TaskWindowPrivate)
     d->m_listview->setAttribute(Qt::WA_MacShowFocusRect, false);
 
     d->m_taskWindowContext = new Internal::TaskWindowContext(d->m_listview);
-    d->m_taskHub = taskhub;
     d->m_badgeCount = 0;
 
     Core::ICore::addContextObject(d->m_taskWindowContext);
@@ -270,25 +268,26 @@ TaskWindow::TaskWindow(TaskHub *taskhub) : d(new TaskWindowPrivate)
 
     d->m_categoriesButton->setMenu(d->m_categoriesMenu);
 
-    connect(d->m_taskHub, SIGNAL(categoryAdded(Core::Id,QString,bool)),
+    TaskHub *hub = TaskHub::instance();
+    connect(hub, SIGNAL(categoryAdded(Core::Id,QString,bool)),
             this, SLOT(addCategory(Core::Id,QString,bool)));
-    connect(d->m_taskHub, SIGNAL(taskAdded(ProjectExplorer::Task)),
+    connect(hub, SIGNAL(taskAdded(ProjectExplorer::Task)),
             this, SLOT(addTask(ProjectExplorer::Task)));
-    connect(d->m_taskHub, SIGNAL(taskRemoved(ProjectExplorer::Task)),
+    connect(hub, SIGNAL(taskRemoved(ProjectExplorer::Task)),
             this, SLOT(removeTask(ProjectExplorer::Task)));
-    connect(d->m_taskHub, SIGNAL(taskLineNumberUpdated(uint,int)),
+    connect(hub, SIGNAL(taskLineNumberUpdated(uint,int)),
             this, SLOT(updatedTaskLineNumber(uint,int)));
-    connect(d->m_taskHub, SIGNAL(taskFileNameUpdated(uint,QString)),
+    connect(hub, SIGNAL(taskFileNameUpdated(uint,QString)),
             this, SLOT(updatedTaskFileName(uint,QString)));
-    connect(d->m_taskHub, SIGNAL(tasksCleared(Core::Id)),
+    connect(hub, SIGNAL(tasksCleared(Core::Id)),
             this, SLOT(clearTasks(Core::Id)));
-    connect(d->m_taskHub, SIGNAL(categoryVisibilityChanged(Core::Id,bool)),
+    connect(hub, SIGNAL(categoryVisibilityChanged(Core::Id,bool)),
             this, SLOT(setCategoryVisibility(Core::Id,bool)));
-    connect(d->m_taskHub, SIGNAL(popupRequested(int)),
+    connect(hub, SIGNAL(popupRequested(int)),
             this, SLOT(popup(int)));
-    connect(d->m_taskHub, SIGNAL(showTask(uint)),
+    connect(hub, SIGNAL(showTask(uint)),
             this, SLOT(showTask(uint)));
-    connect(d->m_taskHub, SIGNAL(openTask(uint)),
+    connect(hub, SIGNAL(openTask(uint)),
             this, SLOT(openTask(uint)));
 }
 
@@ -595,7 +594,7 @@ void TaskWindow::clearContents()
 {
     // clear all tasks in all displays
     // Yeah we are that special
-    d->m_taskHub->clearTasks();
+    TaskHub::clearTasks();
 }
 
 bool TaskWindow::hasFocus() const
diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h
index a9d8f45263e43ddfc71b1eb70249b5b6efa74f81..70ff0059d8d084a1ab8d6af3678eaecda1f1d4ab 100644
--- a/src/plugins/projectexplorer/taskwindow.h
+++ b/src/plugins/projectexplorer/taskwindow.h
@@ -52,7 +52,7 @@ class TaskWindow : public Core::IOutputPane
     Q_OBJECT
 
 public:
-    TaskWindow(ProjectExplorer::TaskHub *taskHub);
+    TaskWindow();
     virtual ~TaskWindow();
 
     void delayedInitialization();
diff --git a/src/plugins/qbsprojectmanager/qbslogsink.cpp b/src/plugins/qbsprojectmanager/qbslogsink.cpp
index c51a661461b2f7848b9376bfa76ab44add1586c4..901afc0622d16036bc6b95805046887a5c617f30 100644
--- a/src/plugins/qbsprojectmanager/qbslogsink.cpp
+++ b/src/plugins/qbsprojectmanager/qbslogsink.cpp
@@ -49,9 +49,9 @@ namespace Internal {
 
 QbsLogSink::QbsLogSink(QObject *parent) : QObject(parent)
 {
-    ProjectExplorer::TaskHub *hub = ProjectExplorer::ProjectExplorerPlugin::taskHub();
     connect(this, SIGNAL(newTask(ProjectExplorer::Task)),
-            hub, SLOT(addTask(ProjectExplorer::Task)), Qt::QueuedConnection);
+            ProjectExplorer::TaskHub::instance(),
+            SLOT(addTask(ProjectExplorer::Task)), Qt::QueuedConnection);
 }
 
 void QbsLogSink::sendMessages()
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 1d52701d66de168f95a6ef6a358f5bb080236d52..ee400cc2549600c2dfe2c555452bc7f3f7bf54cf 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -80,16 +80,6 @@ static const char CONFIG_PRECOMPILEDHEADER[] = "precompiledHeader";
 
 static const char CONFIGURATION_PATH[] = "<configuration>";
 
-// --------------------------------------------------------------------
-// HELPERS:
-// --------------------------------------------------------------------
-
-ProjectExplorer::TaskHub *taskHub()
-{
-    return ProjectExplorer::ProjectExplorerPlugin::taskHub();
-}
-
-
 namespace QbsProjectManager {
 namespace Internal {
 
@@ -382,11 +372,12 @@ bool QbsProject::fromMap(const QVariantMap &map)
 void QbsProject::generateErrors(const qbs::ErrorInfo &e)
 {
     foreach (const qbs::ErrorItem &item, e.items())
-        taskHub()->addTask(ProjectExplorer::Task(ProjectExplorer::Task::Error,
-                                                 item.description(),
-                                                 Utils::FileName::fromString(item.codeLocation().fileName()),
-                                                 item.codeLocation().line(),
-                                                 ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+        ProjectExplorer::TaskHub::addTask(
+                    ProjectExplorer::Task(ProjectExplorer::Task::Error,
+                                          item.description(),
+                                          Utils::FileName::fromString(item.codeLocation().fileName()),
+                                          item.codeLocation().line(),
+                                          ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
 }
 
 void QbsProject::parse(const QVariantMap &config, const Utils::Environment &env, const QString &dir)
@@ -394,7 +385,7 @@ void QbsProject::parse(const QVariantMap &config, const Utils::Environment &env,
     QTC_ASSERT(!dir.isNull(), return);
 
     // Clear buildsystem related tasks:
-    taskHub()->clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM);
+    ProjectExplorer::TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM);
 
     qbs::SetupProjectParameters params;
     params.setBuildConfiguration(config);
@@ -452,7 +443,7 @@ void QbsProject::prepareForParsing()
 {
     m_forceParsing = false;
 
-    taskHub()->clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_COMPILE);
+   ProjectExplorer::TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_COMPILE);
     if (m_qbsUpdateFutureInterface)
         m_qbsUpdateFutureInterface->reportCanceled();
     delete m_qbsUpdateFutureInterface;
diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp
index bfd7933822470d1dd4a0966d5ce0acd90caa5267..ba276026cb49b8bac5865cedae339f3ff8f73502 100644
--- a/src/plugins/qmljseditor/qmljseditorplugin.cpp
+++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp
@@ -60,7 +60,6 @@
 #include <coreplugin/actionmanager/command.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <projectexplorer/taskhub.h>
-#include <projectexplorer/projectexplorer.h>
 #include <texteditor/texteditorconstants.h>
 #include <texteditor/texteditorsettings.h>
 #include <texteditor/textfilewizard.h>
@@ -248,9 +247,8 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e
 
 void QmlJSEditorPlugin::extensionsInitialized()
 {
-    TaskHub *taskHub = ProjectExplorerPlugin::taskHub();
-    taskHub->addCategory(Constants::TASK_CATEGORY_QML, tr("QML"));
-    taskHub->addCategory(Constants::TASK_CATEGORY_QML_ANALYSIS, tr("QML Analysis"), false);
+    TaskHub::addCategory(Constants::TASK_CATEGORY_QML, tr("QML"));
+    TaskHub::addCategory(Constants::TASK_CATEGORY_QML_ANALYSIS, tr("QML Analysis"), false);
 }
 
 ExtensionSystem::IPlugin::ShutdownFlag QmlJSEditorPlugin::aboutToShutdown()
@@ -348,9 +346,8 @@ void QmlJSEditorPlugin::currentEditorChanged(Core::IEditor *editor)
 void QmlJSEditorPlugin::runSemanticScan()
 {
     m_qmlTaskManager->updateSemanticMessagesNow();
-    TaskHub *hub = ProjectExplorerPlugin::taskHub();
-    hub->setCategoryVisibility(Constants::TASK_CATEGORY_QML_ANALYSIS, true);
-    hub->requestPopup();
+    TaskHub::setCategoryVisibility(Constants::TASK_CATEGORY_QML_ANALYSIS, true);
+    TaskHub::requestPopup();
 }
 
 void QmlJSEditorPlugin::checkCurrentEditorSemanticInfoUpToDate()
diff --git a/src/plugins/qmljseditor/qmltaskmanager.cpp b/src/plugins/qmljseditor/qmltaskmanager.cpp
index 44ce4d0c1663e75409d9feae18b3ff473a69b701..42f78bec1981fbdc700ae81ac49ce5c9d29feca0 100644
--- a/src/plugins/qmljseditor/qmltaskmanager.cpp
+++ b/src/plugins/qmljseditor/qmltaskmanager.cpp
@@ -51,11 +51,8 @@ namespace Internal {
 
 QmlTaskManager::QmlTaskManager(QObject *parent) :
     QObject(parent),
-    m_taskHub(0),
     m_updatingSemantic(false)
 {
-    m_taskHub = ProjectExplorer::ProjectExplorerPlugin::taskHub();
-
     // displaying results incrementally leads to flickering
 //    connect(&m_messageCollector, SIGNAL(resultsReadyAt(int,int)),
 //            SLOT(displayResults(int,int)));
@@ -195,7 +192,7 @@ void QmlTaskManager::insertTask(const ProjectExplorer::Task &task)
     QList<ProjectExplorer::Task> tasks = m_docsWithTasks.value(task.file.toString());
     tasks.append(task);
     m_docsWithTasks.insert(task.file.toString(), tasks);
-    m_taskHub->addTask(task);
+    ProjectExplorer::TaskHub::addTask(task);
 }
 
 void QmlTaskManager::removeTasksForFile(const QString &fileName)
@@ -203,16 +200,16 @@ void QmlTaskManager::removeTasksForFile(const QString &fileName)
     if (m_docsWithTasks.contains(fileName)) {
         const QList<ProjectExplorer::Task> tasks = m_docsWithTasks.value(fileName);
         foreach (const ProjectExplorer::Task &task, tasks)
-            m_taskHub->removeTask(task);
+            ProjectExplorer::TaskHub::removeTask(task);
         m_docsWithTasks.remove(fileName);
     }
 }
 
 void QmlTaskManager::removeAllTasks(bool clearSemantic)
 {
-    m_taskHub->clearTasks(Constants::TASK_CATEGORY_QML);
+    ProjectExplorer::TaskHub::clearTasks(Constants::TASK_CATEGORY_QML);
     if (clearSemantic)
-        m_taskHub->clearTasks(Constants::TASK_CATEGORY_QML_ANALYSIS);
+        ProjectExplorer::TaskHub::clearTasks(Constants::TASK_CATEGORY_QML_ANALYSIS);
     m_docsWithTasks.clear();
 }
 
diff --git a/src/plugins/qmljseditor/qmltaskmanager.h b/src/plugins/qmljseditor/qmltaskmanager.h
index a03f19359357b49eb51b44b0cb457c26d8898f93..986a2e65f35aded8bfda44911ba72dcf59b9431c 100644
--- a/src/plugins/qmljseditor/qmltaskmanager.h
+++ b/src/plugins/qmljseditor/qmltaskmanager.h
@@ -89,7 +89,6 @@ private:
                                 bool updateSemantic);
 
 private:
-    ProjectExplorer::TaskHub *m_taskHub;
     QHash<QString, QList<ProjectExplorer::Task> > m_docsWithTasks;
     QFutureWatcher<FileErrorMessages> m_messageCollector;
     QTimer m_updateDelay;
diff --git a/src/plugins/qnx/bardescriptoreditor.cpp b/src/plugins/qnx/bardescriptoreditor.cpp
index 8f28abac302bf4986b21105b8361c69ab4ccb019..149956dae622d1b25d0c93ebc04e0c92139abdb5 100644
--- a/src/plugins/qnx/bardescriptoreditor.cpp
+++ b/src/plugins/qnx/bardescriptoreditor.cpp
@@ -35,7 +35,6 @@
 #include "bardescriptoreditorwidget.h"
 #include "bardescriptordocument.h"
 
-#include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/task.h>
 #include <projectexplorer/taskhub.h>
@@ -118,7 +117,6 @@ void BarDescriptorEditor::changeEditorPage(QAction *action)
 
 void BarDescriptorEditor::setActivePage(BarDescriptorEditor::EditorPage page)
 {
-    ProjectExplorer::TaskHub *taskHub = ProjectExplorer::ProjectExplorerPlugin::taskHub();
     BarDescriptorEditorWidget *editorWidget = qobject_cast<BarDescriptorEditorWidget *>(widget());
     QTC_ASSERT(editorWidget, return);
 
@@ -130,14 +128,14 @@ void BarDescriptorEditor::setActivePage(BarDescriptorEditor::EditorPage page)
     if (page == Source) {
         editorWidget->setXmlSource(m_file->xmlSource());
     } else if (prevPage == Source) {
-        taskHub->clearTasks(Constants::QNX_TASK_CATEGORY_BARDESCRIPTOR);
+        ProjectExplorer::TaskHub::clearTasks(Constants::QNX_TASK_CATEGORY_BARDESCRIPTOR);
         QString errorMsg;
         int errorLine;
         if (!m_file->loadContent(editorWidget->xmlSource(), &errorMsg, &errorLine)) {
             const ProjectExplorer::Task task(ProjectExplorer::Task::Error, errorMsg, Utils::FileName::fromString(m_file->filePath()),
                                        errorLine, Constants::QNX_TASK_CATEGORY_BARDESCRIPTOR);
-            taskHub->addTask(task);
-            taskHub->requestPopup();
+            ProjectExplorer::TaskHub::addTask(task);
+            ProjectExplorer::TaskHub::requestPopup();
 
             foreach (QAction *action, m_actionGroup->actions())
                 if (action->data().toInt() == Source)
diff --git a/src/plugins/qnx/qnxplugin.cpp b/src/plugins/qnx/qnxplugin.cpp
index d37a92ea04c85040d4cc75f707cd3bf2544d1d5e..745693604c86c084ec064992175ebf8a85cfa7d7 100644
--- a/src/plugins/qnx/qnxplugin.cpp
+++ b/src/plugins/qnx/qnxplugin.cpp
@@ -121,8 +121,8 @@ bool QNXPlugin::initialize(const QStringList &arguments, QString *errorString)
 
 void QNXPlugin::extensionsInitialized()
 {
-    ProjectExplorer::ProjectExplorerPlugin::taskHub()->addCategory(Constants::QNX_TASK_CATEGORY_BARDESCRIPTOR,
-                                                                               tr("Bar Descriptor"));
+    ProjectExplorer::TaskHub::addCategory(Constants::QNX_TASK_CATEGORY_BARDESCRIPTOR,
+                                          tr("Bar Descriptor"));
 }
 
 ExtensionSystem::IPlugin::ShutdownFlag QNXPlugin::aboutToShutdown()
diff --git a/src/plugins/tasklist/tasklistplugin.cpp b/src/plugins/tasklist/tasklistplugin.cpp
index 4f9ff86b07ecce0ef7cdc6e43629ba3d027863a4..6eb486769632437bf29873ec9da858ec6d5ad403 100644
--- a/src/plugins/tasklist/tasklistplugin.cpp
+++ b/src/plugins/tasklist/tasklistplugin.cpp
@@ -119,10 +119,10 @@ public:
             }
             description = unescape(description);
 
-            ProjectExplorer::ProjectExplorerPlugin::taskHub()
-                    ->addTask(ProjectExplorer::Task(type, description,
-                                                    Utils::FileName::fromUserInput(file), line,
-                                                    Core::Id(Constants::TASKLISTTASK_ID)));
+            ProjectExplorer::TaskHub::addTask(
+                        ProjectExplorer::Task(type, description,
+                                              Utils::FileName::fromUserInput(file), line,
+                                              Core::Id(Constants::TASKLISTTASK_ID)));
         }
         return true;
     }
@@ -187,8 +187,7 @@ bool TaskListPlugin::initialize(const QStringList &arguments, QString *errorMess
     Q_UNUSED(arguments)
 
     //: Category under which tasklist tasks are listed in Issues view
-    ProjectExplorer::ProjectExplorerPlugin::taskHub()
-            ->addCategory(Core::Id(Constants::TASKLISTTASK_ID), tr("My Tasks"));
+    ProjectExplorer::TaskHub::addCategory(Core::Id(Constants::TASKLISTTASK_ID), tr("My Tasks"));
 
     if (!Core::ICore::mimeDatabase()->addMimeTypes(QLatin1String(":tasklist/TaskList.mimetypes.xml"), errorMessage))
         return false;
@@ -220,7 +219,7 @@ void TaskListPlugin::stopMonitoring()
 
 void TaskListPlugin::clearTasks()
 {
-    ProjectExplorer::ProjectExplorerPlugin::taskHub()->clearTasks(Core::Id(Constants::TASKLISTTASK_ID));
+    ProjectExplorer::TaskHub::clearTasks(Core::Id(Constants::TASKLISTTASK_ID));
 }
 
 Q_EXPORT_PLUGIN(TaskListPlugin)
diff --git a/src/plugins/valgrind/memcheckengine.cpp b/src/plugins/valgrind/memcheckengine.cpp
index fe78deed69ce46fa97c0deb790732777f85de934..2a0f767f11c8b88f579fe2d725b2518b804ac993 100644
--- a/src/plugins/valgrind/memcheckengine.cpp
+++ b/src/plugins/valgrind/memcheckengine.cpp
@@ -78,7 +78,7 @@ bool MemcheckRunControl::startEngine()
     m_runner.setParser(&m_parser);
 
     // Clear about-to-be-outdated tasks.
-    ProjectExplorerPlugin::instance()->taskHub()->clearTasks(Analyzer::Constants::ANALYZERTASK_ID);
+    TaskHub::clearTasks(Analyzer::Constants::ANALYZERTASK_ID);
 
     appendMessage(tr("Analyzing memory of %1\n").arg(executable()),
                         Utils::NormalMessageFormat);
@@ -142,10 +142,9 @@ void MemcheckRunControl::receiveLogMessage(const QByteArray &b)
         line = suppressionError.cap(2).toInt();
     }
 
-    TaskHub *hub = ProjectExplorerPlugin::instance()->taskHub();
-    hub->addTask(Task(Task::Error, error, Utils::FileName::fromUserInput(file), line,
-                      Analyzer::Constants::ANALYZERTASK_ID));
-    hub->requestPopup();
+    TaskHub::addTask(Task(Task::Error, error, Utils::FileName::fromUserInput(file), line,
+                          Analyzer::Constants::ANALYZERTASK_ID));
+    TaskHub::requestPopup();
 }
 
 } // namespace Internal