diff --git a/src/plugins/analyzerbase/analyzersettings.cpp b/src/plugins/analyzerbase/analyzersettings.cpp
index 6244eda84ffd71c341b50901f709ce8296908238..41cb7752c3a7b87cabf2c60cfd7971b63f8b656b 100644
--- a/src/plugins/analyzerbase/analyzersettings.cpp
+++ b/src/plugins/analyzerbase/analyzersettings.cpp
@@ -46,6 +46,15 @@ static const char useGlobalC[] = "Analyzer.Project.UseGlobal";
 
 namespace Analyzer {
 
+ISettingsAspect *ISettingsAspect::clone() const
+{
+    ISettingsAspect *other = create();
+    QVariantMap data;
+    toMap(data);
+    other->fromMap(data);
+    return other;
+}
+
 AnalyzerRunConfigurationAspect::AnalyzerRunConfigurationAspect(ISettingsAspect *projectSettings,
     ISettingsAspect *globalSettings)
 {
diff --git a/src/plugins/analyzerbase/analyzersettings.h b/src/plugins/analyzerbase/analyzersettings.h
index 7b05bab8bd71aefcb25955bdb4f3e6afda3db3cd..948701b186fdd4dfca1f068c5a813ac41e9ec66f 100644
--- a/src/plugins/analyzerbase/analyzersettings.h
+++ b/src/plugins/analyzerbase/analyzersettings.h
@@ -59,8 +59,10 @@ public:
 
     /// Create a configuration widget for this settings aspect.
     virtual QWidget *createConfigWidget(QWidget *parent) = 0;
-    /// Clones the object.
-    virtual ISettingsAspect *clone() = 0;
+    /// "Virtual default constructor"
+    virtual ISettingsAspect *create() const = 0;
+    /// "Virtual copy constructor"
+    ISettingsAspect *clone() const;
 };
 
 
diff --git a/src/plugins/valgrind/valgrindsettings.cpp b/src/plugins/valgrind/valgrindsettings.cpp
index 058a975d3abb1b2697d5b63440000d9218e28e97..0756c561e648bf1a1afcd766488c34f53f256919 100644
--- a/src/plugins/valgrind/valgrindsettings.cpp
+++ b/src/plugins/valgrind/valgrindsettings.cpp
@@ -282,15 +282,6 @@ void ValgrindGlobalSettings::fromMap(const QVariantMap &map)
     setIfPresent(map, QLatin1String(callgrindShortenTemplates), &m_shortenTemplates);
 }
 
-ISettingsAspect  *ValgrindGlobalSettings::clone()
-{
-    ValgrindGlobalSettings *other = new ValgrindGlobalSettings;
-    QVariantMap data;
-    toMap(data);
-    other->fromMap(data);
-    return other;
-}
-
 void ValgrindGlobalSettings::toMap(QVariantMap &map) const
 {
     ValgrindBaseSettings::toMap(map);
@@ -461,15 +452,6 @@ void ValgrindProjectSettings::fromMap(const QVariantMap &map)
     setIfPresent(map, QLatin1String(removedSuppressionFilesC), &m_disabledGlobalSuppressionFiles);
 }
 
-ISettingsAspect  *ValgrindProjectSettings::clone()
-{
-    ValgrindProjectSettings *other = new ValgrindProjectSettings;
-    QVariantMap data;
-    toMap(data);
-    other->fromMap(data);
-    return other;
-}
-
 void ValgrindProjectSettings::toMap(QVariantMap &map) const
 {
     ValgrindBaseSettings::toMap(map);
diff --git a/src/plugins/valgrind/valgrindsettings.h b/src/plugins/valgrind/valgrindsettings.h
index 22ff1f6248c2021fb4d6b2f8a72e36aaa3537847..cd2494cced2a6f21e64ef4ea765770348c630a56 100644
--- a/src/plugins/valgrind/valgrindsettings.h
+++ b/src/plugins/valgrind/valgrindsettings.h
@@ -170,7 +170,8 @@ public:
     QWidget *createConfigWidget(QWidget *parent);
     void toMap(QVariantMap &map) const;
     void fromMap(const QVariantMap &map);
-    virtual ISettingsAspect  *clone();
+    ISettingsAspect *create() const { return new ValgrindGlobalSettings; }
+
 
     /*
      * Global memcheck settings
@@ -230,7 +231,7 @@ public:
     QWidget *createConfigWidget(QWidget *parent);
     void toMap(QVariantMap &map) const;
     void fromMap(const QVariantMap &map);
-    virtual ISettingsAspect  *clone();
+    ISettingsAspect *create() const { return new ValgrindProjectSettings; }
 
     /**
      * Per-project memcheck settings, saves a diff to the global suppression files list