diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp
index e57110177dd6cc04126969244f816cc752855148..a994fd2f0657abaef4464801f83135f95793126d 100644
--- a/src/plugins/analyzerbase/analyzermanager.cpp
+++ b/src/plugins/analyzerbase/analyzermanager.cpp
@@ -41,6 +41,7 @@
 #include "analyzerstartparameters.h"
 #include "analyzerutils.h"
 #include "ianalyzertool.h"
+#include "analyzersettings.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/findplaceholder.h>
@@ -809,6 +810,7 @@ void AnalyzerManager::shutdown()
 void AnalyzerManager::addTool(IAnalyzerTool *tool, const StartModes &modes)
 {
     m_instance->d->addTool(tool, modes);
+    AnalyzerGlobalSettings::instance()->registerTool(tool);
 }
 
 QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QString &title,
@@ -829,6 +831,11 @@ IAnalyzerTool *AnalyzerManager::currentSelectedTool()
     return m_instance->d->m_currentTool;
 }
 
+QList<IAnalyzerTool *> AnalyzerManager::tools()
+{
+    return m_instance->d->m_tools;
+}
+
 void AnalyzerManager::selectTool(IAnalyzerTool *tool, StartMode mode)
 {
     m_instance->d->selectTool(tool, mode);
diff --git a/src/plugins/analyzerbase/analyzermanager.h b/src/plugins/analyzerbase/analyzermanager.h
index 5883304bcd6a223ab5120c34939aa84e47fcc634..a7453568e63fe505f1faf2eeef39e9a19a0aa6da 100644
--- a/src/plugins/analyzerbase/analyzermanager.h
+++ b/src/plugins/analyzerbase/analyzermanager.h
@@ -82,6 +82,7 @@ public:
 
     static void showMode();
     static IAnalyzerTool *currentSelectedTool();
+    static QList<IAnalyzerTool *> tools();
     static void selectTool(IAnalyzerTool *tool, StartMode mode);
     static void startTool(IAnalyzerTool *tool, StartMode mode);
     static void stopTool();
diff --git a/src/plugins/analyzerbase/analyzersettings.cpp b/src/plugins/analyzerbase/analyzersettings.cpp
index d32ee4fd27088c2e65fc8fd234c769a1d309ac29..e9cb39ee04179d70785b1e2e459398526e6308c9 100644
--- a/src/plugins/analyzerbase/analyzersettings.cpp
+++ b/src/plugins/analyzerbase/analyzersettings.cpp
@@ -95,6 +95,7 @@ QVariantMap AnalyzerSettings::toMap(const QList<AbstractAnalyzerSubConfig *> &su
     return map;
 }
 
+
 AnalyzerGlobalSettings::AnalyzerGlobalSettings(QObject *parent)
 : AnalyzerSettings(parent)
 {
@@ -143,30 +144,26 @@ void AnalyzerGlobalSettings::writeSettings() const
     settings->endGroup();
 }
 
-void AnalyzerGlobalSettings::registerSubConfigs
-    (AnalyzerSubConfigFactory globalCreator, AnalyzerSubConfigFactory projectCreator)
+void AnalyzerGlobalSettings::registerTool(IAnalyzerTool *tool)
 {
-    m_projectSubConfigFactories.append(projectCreator);
-
-    AbstractAnalyzerSubConfig *config = globalCreator();
-    m_subConfigs.append(config);
-    AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config));
-
-    readSettings();
+    AbstractAnalyzerSubConfig *config = tool->createGlobalSettings();
+    if (config) {
+        m_subConfigs.append(config);
+        AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config));
+        readSettings();
+    }
 }
 
-QList<AnalyzerSubConfigFactory> AnalyzerGlobalSettings::projectSubConfigFactories() const
-{
-    return m_projectSubConfigFactories;
-}
 
 AnalyzerProjectSettings::AnalyzerProjectSettings(QObject *parent)
     : AnalyzerSettings(parent), m_useGlobalSettings(true)
 {
+    QList<IAnalyzerTool*> tools = AnalyzerManager::tools();
     // add sub configs
-    foreach (AnalyzerSubConfigFactory factory, AnalyzerGlobalSettings::instance()->projectSubConfigFactories()) {
-        AbstractAnalyzerSubConfig *config = factory();
-        m_customConfigurations.append(config);
+    foreach (IAnalyzerTool *tool, tools) {
+        AbstractAnalyzerSubConfig *config = tool->createProjectSettings();
+        if (config)
+            m_customConfigurations.append(config);
     }
 
     m_subConfigs = AnalyzerGlobalSettings::instance()->subConfigs();
diff --git a/src/plugins/analyzerbase/analyzersettings.h b/src/plugins/analyzerbase/analyzersettings.h
index 8d462ac9ddf1af6902f005e434d426228c4bbb1e..baedfe5c0d7f45689b445f0ae05aeeb1ea136c3e 100644
--- a/src/plugins/analyzerbase/analyzersettings.h
+++ b/src/plugins/analyzerbase/analyzersettings.h
@@ -44,6 +44,8 @@
 
 namespace Analyzer {
 
+class IAnalyzerTool;
+
 /**
  * Utility function to set @p val if @p key is present in @p map.
  */
@@ -121,8 +123,6 @@ protected:
 };
 
 
-typedef AbstractAnalyzerSubConfig *(*AnalyzerSubConfigFactory)();
-
 // global and local settings are loaded and saved differently, and they also handle suppressions
 // differently.
 /**
@@ -144,13 +144,11 @@ public:
     void writeSettings() const;
     void readSettings();
 
-    void registerSubConfigs(AnalyzerSubConfigFactory globalFactory, AnalyzerSubConfigFactory projectFactory);
-    QList<AnalyzerSubConfigFactory> projectSubConfigFactories() const;
+    void registerTool(IAnalyzerTool *tool);
 
 private:
     AnalyzerGlobalSettings(QObject *parent);
     static AnalyzerGlobalSettings *m_instance;
-    QList<AnalyzerSubConfigFactory> m_projectSubConfigFactories;
 };
 
 /**
diff --git a/src/plugins/analyzerbase/ianalyzertool.cpp b/src/plugins/analyzerbase/ianalyzertool.cpp
index 7818a07146281629a1f5863946bd1df367874140..722defcea5d197b92294214d2d5832ff51ccf521 100644
--- a/src/plugins/analyzerbase/ianalyzertool.cpp
+++ b/src/plugins/analyzerbase/ianalyzertool.cpp
@@ -70,4 +70,14 @@ QString IAnalyzerTool::defaultActionName(const IAnalyzerTool *tool, StartMode mo
     return base;
 }
 
+AbstractAnalyzerSubConfig *IAnalyzerTool::createGlobalSettings()
+{
+    return 0;
+}
+
+AbstractAnalyzerSubConfig *IAnalyzerTool::createProjectSettings()
+{
+    return 0;
+}
+
 } // namespace Analyzer
diff --git a/src/plugins/analyzerbase/ianalyzertool.h b/src/plugins/analyzerbase/ianalyzertool.h
index 8ceafae63ed44415af05f876bbe89d26bf86c466..5f696546081ba1df8d8b2f683e50aa893f41c872 100644
--- a/src/plugins/analyzerbase/ianalyzertool.h
+++ b/src/plugins/analyzerbase/ianalyzertool.h
@@ -51,6 +51,7 @@ namespace Analyzer {
 
 class IAnalyzerOutputPaneAdapter;
 class IAnalyzerEngine;
+class AbstractAnalyzerSubConfig;
 
 
 /**
@@ -137,6 +138,12 @@ public:
 
     /// Called when tools gets deselected.
     virtual void toolDeselected() const {}
+
+    /// Factory method to create the global tool setting
+    virtual AbstractAnalyzerSubConfig *createGlobalSettings();
+
+    /// Factory method to create the project tool setting
+    virtual AbstractAnalyzerSubConfig *createProjectSettings();
 };
 
 } // namespace Analyzer
diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index ecd4082601a3a052210826f7d7cd313514acc011..437d4b979f84a9d03ff063a4bb304f5aa6e769f9 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -298,7 +298,17 @@ QString MemcheckTool::displayName() const
 QString MemcheckTool::description() const
 {
     return tr("Valgrind Analyze Memory uses the \"memcheck\" tool to find "
-        "memory leaks");
+              "memory leaks");
+}
+
+AbstractAnalyzerSubConfig *MemcheckTool::createGlobalSettings()
+{
+    return new ValgrindGlobalSettings();
+}
+
+AbstractAnalyzerSubConfig *MemcheckTool::createProjectSettings()
+{
+    return new ValgrindProjectSettings();
 }
 
 IAnalyzerTool::ToolMode MemcheckTool::toolMode() const
diff --git a/src/plugins/valgrind/memchecktool.h b/src/plugins/valgrind/memchecktool.h
index f5c1d3f48b4ee3030d6b8fade6fd0bb4aa701f21..1dcba3a34567e6beb2ba76e8034a7bde2ae2fa53 100644
--- a/src/plugins/valgrind/memchecktool.h
+++ b/src/plugins/valgrind/memchecktool.h
@@ -97,6 +97,10 @@ public:
     QString displayName() const;
     QString description() const;
 
+    // Create the valgrind settings (for all valgrind tools)
+    Analyzer::AbstractAnalyzerSubConfig *createGlobalSettings();
+    Analyzer::AbstractAnalyzerSubConfig *createProjectSettings();
+
 private slots:
     void settingsDestroyed(QObject *settings);
     void maybeActiveRunConfigurationChanged();
diff --git a/src/plugins/valgrind/valgrindplugin.cpp b/src/plugins/valgrind/valgrindplugin.cpp
index b083510412fbe748c28321b058aba6bb3e64c24e..5f4f97c0c533b1baae95c5b6558d55ef8d3647f4 100644
--- a/src/plugins/valgrind/valgrindplugin.cpp
+++ b/src/plugins/valgrind/valgrindplugin.cpp
@@ -36,7 +36,6 @@
 
 #include "callgrindtool.h"
 #include "memchecktool.h"
-#include "valgrindsettings.h"
 
 #include <analyzerbase/analyzerconstants.h>
 #include <analyzerbase/analyzermanager.h>
@@ -96,20 +95,8 @@ void ValgrindPlugin::startValgrindTool(IAnalyzerTool *tool, StartMode mode)
         startRemoteTool(tool);
 }
 
-static AbstractAnalyzerSubConfig *globalValgrindFactory()
-{
-    return new ValgrindGlobalSettings();
-}
-
-static AbstractAnalyzerSubConfig *projectValgrindFactory()
-{
-    return new ValgrindProjectSettings();
-}
-
 bool ValgrindPlugin::initialize(const QStringList &, QString *)
 {
-    AnalyzerGlobalSettings::instance()->registerSubConfigs(&globalValgrindFactory, &projectValgrindFactory);
-
     StartModes modes;
 #ifndef Q_OS_WIN
     modes.append(StartMode(StartLocal));