diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 70509b02ffa3be7e4a9d3b81badaba03fc00a80b..f4c4ac800f532802922805e035c710d7e9af004d 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -40,47 +40,56 @@
 using namespace CMakeProjectManager;
 using namespace Internal;
 
-CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *pro)
-    : BuildConfiguration(pro),
+namespace {
+const char * const CMAKE_BC_ID("CMakeProjectManager.CMakeBuildConfiguration");
+
+const char * const USER_ENVIRONMENT_CHANGES_KEY("CMakeProjectManager.CMakeBuildConfiguration.UserEnvironmentChanges");
+const char * const MSVC_VERSION_KEY("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion");
+const char * const BUILD_DIRECTORY_KEY("CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory");
+
+}
+
+CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *project) :
+    BuildConfiguration(project, QLatin1String(CMAKE_BC_ID)),
     m_toolChain(0),
     m_clearSystemEnvironment(false)
 {
-
 }
 
-CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *pro, const QMap<QString, QVariant> &map)
-    : BuildConfiguration(pro, map),
-    m_toolChain(0)
+CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *project, const QString &id) :
+    BuildConfiguration(project, id),
+    m_toolChain(0),
+    m_clearSystemEnvironment(false)
 {
-
-    QMap<QString, QVariant>::const_iterator it = map.constFind("clearSystemEnvironment");
-    m_clearSystemEnvironment = (it != map.constEnd() && it.value().toBool());
-    m_userEnvironmentChanges =
-            ProjectExplorer::EnvironmentItem::fromStringList(
-                    map.value("userEnvironmentChanges").toStringList());
-    m_msvcVersion = map.value("msvcVersion").toString();
-    m_buildDirectory = map.value("buildDirectory").toString();
-
 }
 
-CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeBuildConfiguration *source)
-    : BuildConfiguration(source),
+CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *pro, CMakeBuildConfiguration *source) :
+    BuildConfiguration(pro, source),
     m_toolChain(0),
     m_clearSystemEnvironment(source->m_clearSystemEnvironment),
     m_userEnvironmentChanges(source->m_userEnvironmentChanges),
     m_buildDirectory(source->m_buildDirectory),
     m_msvcVersion(source->m_msvcVersion)
 {
-
 }
 
-void CMakeBuildConfiguration::toMap(QMap<QString, QVariant> &map) const
+QVariantMap CMakeBuildConfiguration::toMap() const
 {
-    map.insert("userEnvironmentChanges",
+    QVariantMap map(ProjectExplorer::BuildConfiguration::toMap());
+    map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY),
                ProjectExplorer::EnvironmentItem::toStringList(m_userEnvironmentChanges));
-    map.insert("msvcVersion", m_msvcVersion);
-    map.insert("buildDirectory", m_buildDirectory);
-    BuildConfiguration::toMap(map);
+    map.insert(QLatin1String(MSVC_VERSION_KEY), m_msvcVersion);
+    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
+    return map;
+}
+
+bool CMakeBuildConfiguration::fromMap(const QVariantMap &map)
+{
+    m_userEnvironmentChanges = ProjectExplorer::EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
+    m_msvcVersion = map.value(QLatin1String(MSVC_VERSION_KEY)).toString();
+    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
+
+    return BuildConfiguration::fromMap(map);
 }
 
 CMakeBuildConfiguration::~CMakeBuildConfiguration()
@@ -212,9 +221,8 @@ void CMakeBuildConfiguration::setMsvcVersion(const QString &msvcVersion)
   \class CMakeBuildConfigurationFactory
 */
 
-CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory(CMakeProject *project)
-    : IBuildConfigurationFactory(project),
-    m_project(project)
+CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory(QObject *parent) :
+    ProjectExplorer::IBuildConfigurationFactory(parent)
 {
 }
 
@@ -222,20 +230,36 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory()
 {
 }
 
-QStringList CMakeBuildConfigurationFactory::availableCreationIds() const
+QStringList CMakeBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const
 {
-    return QStringList() << "Create";
+    if (!qobject_cast<CMakeProject *>(parent))
+        return QStringList();
+    return QStringList() << QLatin1String(CMAKE_BC_ID);
 }
 
 QString CMakeBuildConfigurationFactory::displayNameForId(const QString &id) const
 {
-    QTC_ASSERT(id == "Create", return QString());
-    return tr("Create");
+    if (id == QLatin1String(CMAKE_BC_ID))
+        return tr("Build");
+    return QString();
 }
 
-ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(const QString &id) const
+bool CMakeBuildConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
 {
-    QTC_ASSERT(id == "Create", return 0);
+    if (!qobject_cast<CMakeProject *>(parent))
+        return false;
+    if (id == QLatin1String(CMAKE_BC_ID))
+        return true;
+    return false;
+}
+
+ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+
+    CMakeProject *cmProject = static_cast<CMakeProject *>(parent);
+    Q_ASSERT(cmProject);
 
     //TODO configuration name should be part of the cmakeopenprojectwizard
     bool ok;
@@ -247,7 +271,7 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(cons
                           &ok);
     if (!ok || buildConfigurationName.isEmpty())
         return false;
-    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(m_project);
+    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmProject);
     bc->setDisplayName(buildConfigurationName);
 
     MakeStep *makeStep = new MakeStep(bc);
@@ -258,35 +282,55 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(cons
     cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
     cleanMakeStep->setClean(true);
 
-    CMakeOpenProjectWizard copw(m_project->projectManager(),
-                                m_project->sourceDirectory(),
+    CMakeOpenProjectWizard copw(cmProject->projectManager(),
+                                cmProject->sourceDirectory(),
                                 bc->buildDirectory(),
                                 bc->environment());
     if (copw.exec() != QDialog::Accepted) {
         delete bc;
         return false;
     }
-    m_project->addBuildConfiguration(bc); // this also makes the name unique
+    cmProject->addBuildConfiguration(bc); // this also makes the name unique
 
     bc->setBuildDirectory(copw.buildDirectory());
     bc->setMsvcVersion(copw.msvcVersion());
-    m_project->parseCMakeLists();
+    cmProject->parseCMakeLists();
 
     // Default to all
-    if (m_project->hasTarget("all"))
+    if (cmProject->hasTarget("all"))
         makeStep->setBuildTarget("all", true);
+
     return bc;
 }
 
-ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::BuildConfiguration *source) const
+bool CMakeBuildConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const
+{
+    return canCreate(parent, source->id());
+}
+
+ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source)
 {
+    if (!canClone(parent, source))
+        return 0;
     CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source);
-    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(old);
-    return bc;
+    CMakeProject *cmProject(static_cast<CMakeProject *>(parent));
+    return new CMakeBuildConfiguration(cmProject, old);
 }
 
-ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::restore(const QVariantMap &map) const
+bool CMakeBuildConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
 {
-    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(m_project, map);
-    return bc;
+    QString id(ProjectExplorer::idFromMap(map));
+    return canCreate(parent, id);
+}
+
+ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+    CMakeProject *cmProject(static_cast<CMakeProject *>(parent));
+    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmProject);
+    if (bc->fromMap(map))
+        return bc;
+    delete bc;
+    return 0;
 }
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
index 7bf9fe9bd9d9d5d3e7b2dfd209bb515067a943ab..7e4f5c4206d92259a0028487dc8a35f6ba0c9cf4 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
@@ -37,14 +37,15 @@ namespace CMakeProjectManager {
 namespace Internal {
 
 class CMakeProject;
+class CMakeBuildConfigurationFactory;
 
 class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
     Q_OBJECT
+    friend class CMakeBuildConfigurationFactory;
+
 public:
     CMakeBuildConfiguration(CMakeProject *pro);
-    CMakeBuildConfiguration(CMakeProject *pro, const QMap<QString, QVariant> &map);
-    CMakeBuildConfiguration(CMakeBuildConfiguration *source);
     ~CMakeBuildConfiguration();
 
     CMakeProject *cmakeProject() const;
@@ -62,17 +63,21 @@ public:
     ProjectExplorer::ToolChain::ToolChainType toolChainType() const;
     ProjectExplorer::ToolChain *toolChain() const;
 
-
     void setBuildDirectory(const QString &buildDirectory);
 
     QString msvcVersion() const;
     void setMsvcVersion(const QString &msvcVersion);
 
-    void toMap(QMap<QString, QVariant> &map) const;
+    QVariantMap toMap() const;
 
 signals:
     void msvcVersionChanged();
 
+protected:
+    CMakeBuildConfiguration(CMakeProject *pro, const QString &id);
+    CMakeBuildConfiguration(CMakeProject *pro, CMakeBuildConfiguration *source);
+    virtual bool fromMap(const QVariantMap &map);
+
 private:
     void updateToolChain() const;
     mutable ProjectExplorer::ToolChain *m_toolChain;
@@ -87,18 +92,18 @@ class CMakeBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurati
     Q_OBJECT
 
 public:
-    CMakeBuildConfigurationFactory(CMakeProject *project);
+    CMakeBuildConfigurationFactory(QObject *parent = 0);
     ~CMakeBuildConfigurationFactory();
 
-    QStringList availableCreationIds() const;
+    QStringList availableCreationIds(ProjectExplorer::Project *project) const;
     QString displayNameForId(const QString &id) const;
 
-    ProjectExplorer::BuildConfiguration *create(const QString &id) const;
-    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::BuildConfiguration *source) const;
-    ProjectExplorer::BuildConfiguration *restore(const QVariantMap &map) const;
-
-private:
-    CMakeProject *m_project;
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Project *parent, const QString &id);
+    bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const;
+    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source);
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
 };
 
 } // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
index 8127ddeafb1aa00c1672f65354d1bff91e26f408..4d86ef0741d70be7d029572250de6746ed20025a 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
@@ -35,7 +35,6 @@ namespace Constants {
 
 const char * const PROJECTCONTEXT = "CMakeProject.ProjectContext";
 const char * const CMAKEMIMETYPE  = "text/x-cmake"; // TOOD check that this is correct
-const char * const MAKESTEP       = "CMakeProjectManager.MakeStep";
 const char * const CMAKERUNCONFIGURATION = "CMakeProjectManager.CMakeRunConfiguration";
 
 
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index 4cfde7339ba772cb39322a19b90ee3ae40833d01..32d64b01f11311e0154cd8a07c3b83a7618cebae 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -40,28 +40,44 @@ using namespace GenericProjectManager;
 using namespace GenericProjectManager::Internal;
 using ProjectExplorer::BuildConfiguration;
 
+namespace {
+const char * const GENERIC_BC_ID("GenericProjectManager.GenericBuildConfiguration");
+
+const char * const BUILD_DIRECTORY_KEY("GenericProjectManager.GenericBuildConfiguration.BuildDirectory");
+}
+
 GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro)
-    : BuildConfiguration(pro)
+    : BuildConfiguration(pro, QLatin1String(GENERIC_BC_ID))
 {
-
 }
 
-GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro, const QVariantMap &map)
-    : BuildConfiguration(pro, map)
+GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro, const QString &id)
+    : BuildConfiguration(pro, id)
 {
-    m_buildDirectory = map.value("buildDirectory").toString();
 }
 
-GenericBuildConfiguration::GenericBuildConfiguration(GenericBuildConfiguration *source)
-    : BuildConfiguration(source),
+GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro, GenericBuildConfiguration *source) :
+    BuildConfiguration(pro, source),
     m_buildDirectory(source->m_buildDirectory)
 {
+}
+
+GenericBuildConfiguration::~GenericBuildConfiguration()
+{
+}
 
+QVariantMap GenericBuildConfiguration::toMap() const
+{
+    QVariantMap map(BuildConfiguration::toMap());
+    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
+    return map;
 }
 
-void GenericBuildConfiguration::toMap(QVariantMap &map) const
+bool GenericBuildConfiguration::fromMap(const QVariantMap &map)
 {
-    map.insert("buildDirectory", m_buildDirectory);
+    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
+
+    return BuildConfiguration::fromMap(map);
 }
 
 ProjectExplorer::Environment GenericBuildConfiguration::environment() const
@@ -98,9 +114,8 @@ GenericProject *GenericBuildConfiguration::genericProject() const
   \class GenericBuildConfigurationFactory
 */
 
-GenericBuildConfigurationFactory::GenericBuildConfigurationFactory(GenericProject *project)
-    : IBuildConfigurationFactory(project),
-    m_project(project)
+GenericBuildConfigurationFactory::GenericBuildConfigurationFactory(QObject *parent) :
+    ProjectExplorer::IBuildConfigurationFactory(parent)
 {
 }
 
@@ -108,20 +123,34 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory()
 {
 }
 
-QStringList GenericBuildConfigurationFactory::availableCreationIds() const
+QStringList GenericBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const
 {
-    return QStringList() << "Create";
+    Q_UNUSED(parent);
+    return QStringList() << QLatin1String(GENERIC_BC_ID);
 }
 
 QString GenericBuildConfigurationFactory::displayNameForId(const QString &id) const
 {
-    QTC_ASSERT(id == "Create", return QString());
-    return tr("Create");
+    if (id == QLatin1String(GENERIC_BC_ID))
+        return tr("Build");
+    return QString();
 }
 
-BuildConfiguration *GenericBuildConfigurationFactory::create(const QString &id) const
+bool GenericBuildConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
 {
-    QTC_ASSERT(id == "Create", return false);
+    if (!qobject_cast<GenericProject *>(parent))
+        return false;
+    if (id == QLatin1String(GENERIC_BC_ID))
+        return true;
+    return false;
+}
+
+BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+    GenericProject *project(static_cast<GenericProject *>(parent));
+
     //TODO asking for name is duplicated everywhere, but maybe more
     // wizards will show up, that incorporate choosing the name
     bool ok;
@@ -133,9 +162,9 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(const QString &id)
                           &ok);
     if (!ok || buildConfigurationName.isEmpty())
         return false;
-    GenericBuildConfiguration *bc = new GenericBuildConfiguration(m_project);
+    GenericBuildConfiguration *bc = new GenericBuildConfiguration(project);
     bc->setDisplayName(buildConfigurationName);
-    m_project->addBuildConfiguration(bc); // also makes the name unique...
+    project->addBuildConfiguration(bc); // also makes the name unique...
 
     GenericMakeStep *makeStep = new GenericMakeStep(bc);
     bc->insertBuildStep(0, makeStep);
@@ -143,14 +172,33 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(const QString &id)
     return bc;
 }
 
-BuildConfiguration *GenericBuildConfigurationFactory::clone(BuildConfiguration *source) const
+bool GenericBuildConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const
 {
-    GenericBuildConfiguration *bc = new GenericBuildConfiguration(static_cast<GenericBuildConfiguration *>(source));
-    return bc;
+    return canCreate(parent, source->id());
 }
 
-BuildConfiguration *GenericBuildConfigurationFactory::restore(const QVariantMap &map) const
+BuildConfiguration *GenericBuildConfigurationFactory::clone(ProjectExplorer::Project *parent, BuildConfiguration *source)
 {
-    GenericBuildConfiguration *bc = new GenericBuildConfiguration(m_project, map);
-    return bc;
+    if (!canClone(parent, source))
+        return 0;
+    GenericProject *project(static_cast<GenericProject *>(parent));
+    return new GenericBuildConfiguration(project, qobject_cast<GenericBuildConfiguration *>(source));
+}
+
+bool GenericBuildConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
+{
+    QString id(ProjectExplorer::idFromMap(map));
+    return canCreate(parent, id);
+}
+
+BuildConfiguration *GenericBuildConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+    GenericProject *project(static_cast<GenericProject *>(parent));
+    GenericBuildConfiguration *bc(new GenericBuildConfiguration(project));
+    if (bc->fromMap(map))
+        return bc;
+    delete bc;
+    return 0;
 }
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
index 0ad81ca735524388abcbfa83716a494d155627ab..722ca2e217e7a3776d287b2aa23841e50c53471e 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
@@ -36,22 +36,29 @@ namespace GenericProjectManager {
 namespace Internal {
 
 class GenericProject;
-
+class GenericBuildConfigurationFactory;
 
 class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
     Q_OBJECT
+    friend class GenericBuildConfigurationFactory;
+
 public:
-    GenericBuildConfiguration(GenericProject *pro);
-    GenericBuildConfiguration(GenericProject *pro, const QVariantMap &map);
-    GenericBuildConfiguration(GenericBuildConfiguration *source);
+    explicit GenericBuildConfiguration(GenericProject *pro);
+    virtual ~GenericBuildConfiguration();
 
     GenericProject *genericProject() const;
 
     virtual ProjectExplorer::Environment environment() const;
     virtual QString buildDirectory() const;
     void setBuildDirectory(const QString &buildDirectory);
-    void toMap(QVariantMap &map) const;
+    QVariantMap toMap() const;
+
+protected:
+    GenericBuildConfiguration(GenericProject *pro, GenericBuildConfiguration *source);
+    GenericBuildConfiguration(GenericProject *pro, const QString &id);
+    virtual bool fromMap(const QVariantMap &map);
+
 private:
     QString m_buildDirectory;
 };
@@ -61,18 +68,18 @@ class GenericBuildConfigurationFactory : public ProjectExplorer::IBuildConfigura
     Q_OBJECT
 
 public:
-    GenericBuildConfigurationFactory(GenericProject *project);
-    ~GenericBuildConfigurationFactory();
+    explicit GenericBuildConfigurationFactory(QObject *parent = 0);
+    virtual ~GenericBuildConfigurationFactory();
 
-    QStringList availableCreationIds() const;
+    QStringList availableCreationIds(ProjectExplorer::Project *project) const;
     QString displayNameForId(const QString &id) const;
 
-    ProjectExplorer::BuildConfiguration *create(const QString &id) const;
-    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::BuildConfiguration *source) const;
-    ProjectExplorer::BuildConfiguration *restore(const QVariantMap &map) const;
-
-private:
-    GenericProject *m_project;
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Project *parent, const QString &id);
+    bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const;
+    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source);
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
 };
 
 } // namespace GenericProjectManager
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 847cf4251dc1c413f005f21e42caca277966bd3f..64ca6f1d78a7cf9623cd02f173a1f7e103984690 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -36,6 +36,7 @@
 using namespace ProjectExplorer;
 
 namespace {
+
 IBuildStepFactory *findCloneFactory(BuildConfiguration *parent, BuildStep *source)
 {
     QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
@@ -44,24 +45,35 @@ IBuildStepFactory *findCloneFactory(BuildConfiguration *parent, BuildStep *sourc
             return factory;
     return 0;
 }
-} // namespace
 
-BuildConfiguration::BuildConfiguration(Project *pro)
-    : m_project(pro)
+IBuildStepFactory *findRestoreFactory(BuildConfiguration *parent, const QVariantMap &map)
 {
-
+    QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
+    foreach(IBuildStepFactory *factory, factories)
+        if (factory->canRestore(parent, map))
+            return factory;
+    return 0;
 }
 
-BuildConfiguration::BuildConfiguration(Project *pro, const QVariantMap &map)
-    : m_project(pro)
+const char * const BUILD_STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.BuildStepsCount");
+const char * const BUILD_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.BuildSteps.");
+const char * const CLEAN_STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.CleanStepsCount");
+const char * const CLEAN_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.CleanSteps.");
+
+} // namespace
+
+BuildConfiguration::BuildConfiguration(Project *project, const QString &id) :
+    ProjectConfiguration(id),
+    m_project(project)
 {
-    m_displayName = map.value("ProjectExplorer.BuildConfiguration.DisplayName").toString();
+    Q_ASSERT(m_project);
 }
 
-BuildConfiguration::BuildConfiguration(BuildConfiguration *source)
-    : m_displayName(source->m_displayName),
-    m_project(source->m_project)
+BuildConfiguration::BuildConfiguration(Project *project, BuildConfiguration *source) :
+    ProjectConfiguration(source),
+    m_project(project)
 {
+    Q_ASSERT(m_project);
     foreach(BuildStep *originalbs, source->buildSteps()) {
         IBuildStepFactory *factory = findCloneFactory(this, originalbs);
         BuildStep *clonebs = factory->clone(this, originalbs);
@@ -82,22 +94,55 @@ BuildConfiguration::~BuildConfiguration()
     qDeleteAll(m_cleanSteps);
 }
 
-QString BuildConfiguration::displayName() const
+QVariantMap BuildConfiguration::toMap() const
 {
-    return m_displayName;
-}
+    QVariantMap map(ProjectConfiguration::toMap());
+    map.insert(QLatin1String(BUILD_STEPS_COUNT_KEY), m_buildSteps.count());
+    for (int i = 0; i < m_buildSteps.count(); ++i)
+        map.insert(QString::fromLatin1(BUILD_STEPS_PREFIX) + QString::number(i), m_buildSteps.at(i)->toMap());
+    map.insert(QLatin1String(CLEAN_STEPS_COUNT_KEY), m_cleanSteps.count());
+    for (int i = 0; i < m_cleanSteps.count(); ++i)
+        map.insert(QString::fromLatin1(CLEAN_STEPS_PREFIX) + QString::number(i), m_cleanSteps.at(i)->toMap());
 
-void BuildConfiguration::setDisplayName(const QString &name)
-{
-    if (m_displayName == name)
-        return;
-    m_displayName = name;
-    emit displayNameChanged();
+    return map;
 }
 
-void BuildConfiguration::toMap(QVariantMap &map) const
+
+bool BuildConfiguration::fromMap(const QVariantMap &map)
 {
-    map.insert("ProjectExplorer.BuildConfiguration.DisplayName", m_displayName);
+    int maxI(map.value(QLatin1String(BUILD_STEPS_COUNT_KEY), 0).toInt());
+    if (maxI < 0)
+        maxI = 0;
+    for (int i = 0; i < maxI; ++i) {
+        QVariantMap bsData(map.value(QString::fromLatin1(BUILD_STEPS_PREFIX) + QString::number(i)).toMap());
+        if (bsData.isEmpty())
+            continue;
+        IBuildStepFactory *factory(findRestoreFactory(this, bsData));
+        if (!factory)
+            continue;
+        BuildStep *bs(factory->restore(this, bsData));
+        if (!bs)
+            continue;
+        insertBuildStep(m_buildSteps.count(), bs);
+    }
+
+    maxI = map.value(QLatin1String(CLEAN_STEPS_COUNT_KEY), 0).toInt();
+    if (maxI < 0)
+        maxI = 0;
+    for (int i = 0; i < maxI; ++i) {
+        QVariantMap bsData(map.value(QString::fromLatin1(CLEAN_STEPS_PREFIX) + QString::number(i)).toMap());
+        if (bsData.isEmpty())
+            continue;
+        IBuildStepFactory *factory(findRestoreFactory(this, bsData));
+        if (!factory)
+            continue;
+        BuildStep *bs(factory->restore(this, bsData));
+        if (!bs)
+            continue;
+        insertCleanStep(m_cleanSteps.count(), bs);
+    }
+
+    return ProjectConfiguration::fromMap(map);
 }
 
 QList<BuildStep *> BuildConfiguration::buildSteps() const
@@ -152,17 +197,15 @@ Project *BuildConfiguration::project() const
     return m_project;
 }
 
-
 ///
 // IBuildConfigurationFactory
 ///
 
-IBuildConfigurationFactory::IBuildConfigurationFactory(QObject *parent)
-    : QObject(parent)
+IBuildConfigurationFactory::IBuildConfigurationFactory(QObject *parent) :
+    QObject(parent)
 {
 }
 
 IBuildConfigurationFactory::~IBuildConfigurationFactory()
 {
-
 }
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index 213934c37e2826a5f03ecc838e5db6432452c177..2c8e881d27b8a368e29e9e2ef7b1b4074363d412 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -33,20 +33,19 @@
 #include "projectexplorer_export.h"
 #include "environment.h"
 
-#include <QtCore/QHash>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
 #include <QtCore/QList>
 #include <QtCore/QObject>
-#include <QtCore/QVariant>
 
 #include "buildstep.h"
+#include "projectconfiguration.h"
 
 namespace ProjectExplorer {
 
 class Project;
 
-class PROJECTEXPLORER_EXPORT BuildConfiguration : public QObject
+class PROJECTEXPLORER_EXPORT BuildConfiguration : public ProjectConfiguration
 {
     Q_OBJECT
 
@@ -54,11 +53,6 @@ public:
     // ctors are protected
     virtual ~BuildConfiguration();
 
-    QString displayName() const;
-    void setDisplayName(const QString &name);
-
-    virtual void toMap(QMap<QString, QVariant> &map) const;
-
     QList<BuildStep *> buildSteps() const;
     void insertBuildStep(int position, BuildStep *step);
     void removeBuildStep(int position);
@@ -69,53 +63,50 @@ public:
     void removeCleanStep(int position);
     void moveCleanStepUp(int position);
 
-    Project *project() const;
-
     virtual Environment environment() const = 0;
     virtual QString buildDirectory() const = 0;
 
+    Project *project() const;
+
+    virtual QVariantMap toMap() const;
+
 signals:
     void environmentChanged();
     void buildDirectoryChanged();
-    void displayNameChanged();
 
 protected:
-    BuildConfiguration(Project *project);
-    BuildConfiguration(Project *project, const QMap<QString, QVariant> &map);
-    BuildConfiguration(BuildConfiguration *source);
+    BuildConfiguration(Project *project, const QString &id);
+    BuildConfiguration(Project *project, BuildConfiguration *source);
+
+    virtual bool fromMap(const QVariantMap &map);
 
 private:
     QList<BuildStep *> m_buildSteps;
     QList<BuildStep *> m_cleanSteps;
-    QString m_displayName;
     Project *m_project;
 };
 
-class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory : public QObject
+class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory :
+    public QObject
 {
     Q_OBJECT
 
 public:
-    IBuildConfigurationFactory(QObject *parent = 0);
+    explicit IBuildConfigurationFactory(QObject *parent = 0);
     virtual ~IBuildConfigurationFactory();
 
-    // Used to show the list of possible additons to a project.
-    // Returns a list of ids.
-    virtual QStringList availableCreationIds() const = 0;
+    // used to show the list of possible additons to a project, returns a list of types
+    virtual QStringList availableCreationIds(Project *parent) const = 0;
     // used to translate the types to names to display to the user
     virtual QString displayNameForId(const QString &id) const = 0;
 
-    // Creates build configuration(s) for the given id and adds them to
-    // the project.
-    // If successful it returns the BuildConfiguration that should be shown in
-    // project mode.
-    virtual BuildConfiguration *create(const QString &id) const = 0;
-
-    // Clones a given BuildConfiguration, should not add it to the project
-    virtual BuildConfiguration *clone(BuildConfiguration *source) const = 0;
-
-    // Restores a BuildConfiguration with the data given and adds it to the project.
-    virtual BuildConfiguration *restore(const QVariantMap &values) const = 0;
+    virtual bool canCreate(Project *parent, const QString &id) const = 0;
+    virtual BuildConfiguration *create(Project *parent, const QString &id) = 0;
+    // used to recreate the runConfigurations when restoring settings
+    virtual bool canRestore(Project *parent, const QVariantMap &map) const = 0;
+    virtual BuildConfiguration *restore(Project *parent, const QVariantMap &map) = 0;
+    virtual bool canClone(Project *parent, BuildConfiguration *product) const = 0;
+    virtual BuildConfiguration *clone(Project *parent, BuildConfiguration *product) = 0;
 
 signals:
     void availableCreationIdsChanged();
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index 7010413349d502e975a77f66246d7b39b0cecb49..e95e0429b705bb1fa861fa78474b64431c03e0b5 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -265,7 +265,7 @@ void BuildSettingsWidget::updateAddButtonMenu()
                                this, SLOT(cloneConfiguration()));
     IBuildConfigurationFactory *factory = m_project->buildConfigurationFactory();
     if (factory) {
-        foreach (const QString &id, factory->availableCreationIds()) {
+        foreach (const QString &id, factory->availableCreationIds(m_project)) {
             QAction *action = m_addButtonMenu->addAction(factory->displayNameForId(id), this, SLOT(createConfiguration()));
             action->setData(id);
         }
@@ -342,7 +342,7 @@ void BuildSettingsWidget::createConfiguration()
 {
     QAction *action = qobject_cast<QAction *>(sender());
     const QString &type = action->data().toString();
-    BuildConfiguration *bc = m_project->buildConfigurationFactory()->create(type);
+    BuildConfiguration *bc = m_project->buildConfigurationFactory()->create(m_project, type);
     if (bc) {
         m_buildConfiguration = bc;
         updateBuildSettings();
@@ -377,7 +377,9 @@ void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfigura
         buildConfigurationDisplayNames << bc->displayName();
     newDisplayName = Project::makeUnique(newDisplayName, buildConfigurationDisplayNames);
 
-    m_buildConfiguration = m_project->buildConfigurationFactory()->clone(sourceConfiguration);
+    m_buildConfiguration = m_project->buildConfigurationFactory()->clone(m_project, sourceConfiguration);
+    if (!m_buildConfiguration)
+        return;
     m_buildConfiguration->setDisplayName(newDisplayName);
     m_project->addBuildConfiguration(m_buildConfiguration);
 
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 27ee707efcfd72e9b6a0ae50f611d540e3c77632..9a46598d268de117e0f6c4e42221f27f5ce0c492 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -159,43 +159,11 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     //save buildsettings
     QStringList buildConfigurationNames;
     for(int i=0; i < bcs.size(); ++i) {
-        QMap<QString, QVariant> temp;
-        bcs.at(i)->toMap(temp);
-        writer.saveValue("buildConfiguration-" + QString::number(i), temp);
+        writer.saveValue("buildConfiguration-" + QString::number(i), bcs.at(i)->toMap());
         buildConfigurationNames << QString::number(i);
     }
     writer.saveValue("buildconfigurations", buildConfigurationNames);
 
-    // save each buildstep/buildConfiguration combination
-    for(int i=0; i < bcs.size(); ++i) {
-        QStringList buildStepNames;
-        foreach (BuildStep *buildStep, bcs.at(i)->buildSteps())
-            buildStepNames << buildStep->id();
-        writer.saveValue("buildconfiguration-" + QString::number(i) + "-buildsteps", buildStepNames);
-
-        int buildstepnr = 0;
-        foreach (BuildStep *buildStep, bcs.at(i)->buildSteps()) {
-            QVariantMap temp(buildStep->toMap());
-            writer.saveValue("buildconfiguration-" + QString::number(i) + "-buildstep" + QString().setNum(buildstepnr), temp);
-            ++buildstepnr;
-        }
-    }
-
-    // save each cleanstep/buildConfiguration combination
-    for(int i=0; i < bcs.size(); ++i) {
-        QStringList cleanStepNames;
-        foreach (BuildStep *cleanStep, bcs.at(i)->cleanSteps())
-            cleanStepNames << cleanStep->id();
-        writer.saveValue("buildconfiguration-" + QString::number(i) + "-cleansteps", cleanStepNames);
-
-        int cleanstepnr = 0;
-        foreach (BuildStep *cleanStep, bcs.at(i)->cleanSteps()) {
-            QVariantMap temp(cleanStep->toMap());
-            writer.saveValue("buildconfiguration-" + QString::number(i) + "-cleanstep" + QString().setNum(cleanstepnr), temp);
-            ++cleanstepnr;
-        }
-    }
-
     // Running
     int i = 0;
     int activeId = 0;
@@ -215,83 +183,15 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
 
 bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
 {
-    const QList<IBuildStepFactory *> buildStepFactories =
-          ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
-
     // restoring BuldConfigurations from settings
     const QStringList buildConfigurationNames = reader.restoreValue("buildconfigurations").toStringList();
 
     foreach (const QString &buildConfigurationName, buildConfigurationNames) {
-        QMap<QString, QVariant> temp =
-            reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap();
-
-        BuildConfiguration *bc = buildConfigurationFactory()->restore(temp);
-        // Restore build steps
-        QVariant buildStepsValueVariant = reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildsteps");
-        if(buildStepsValueVariant.isValid()) {
-            int pos = 0;
-            QStringList buildStepNames = buildStepsValueVariant.toStringList();
-            for (int buildstepnr = 0; buildstepnr < buildStepNames.size(); ++buildstepnr) {
-                // TODO remove restoreFromGlobalMap after 2.0
-                QVariantMap values(reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap());
-                QVariantMap localValues(reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr)).toMap());
-
-                // override (global)values with what is found in localValues:
-                for (QVariantMap::const_iterator i = localValues.constBegin();
-                     i != localValues.constEnd(); ++i)
-                    values.insert(i.key(), i.value());
-
-                values.insert("ProjectExplorer.ProjectConfiguration.Id",
-                              buildStepNames.at(buildstepnr));
-                BuildStep *buildStep  = 0;
-                foreach (IBuildStepFactory *factory, buildStepFactories) {
-                    if (factory->canRestore(bc, values)) {
-                        buildStep = factory->restore(bc, values);
-                        break;
-                    }
-                }
-                if (buildStep) {
-                    bc->insertBuildStep(pos, buildStep);
-                    ++pos;
-                }
-            }
-        }
-        // Restore clean steps
-        QVariant cleanStepsValueVariant = reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleansteps");
-        if(cleanStepsValueVariant.isValid()) {
-            int pos = 0;
-            QStringList cleanStepNames = cleanStepsValueVariant.toStringList();
-            for (int cleanstepnr = 0; cleanstepnr < cleanStepNames.size(); ++cleanstepnr) {
-                // TODO remove restoreFromGlobalMap after 2.0
-                QVariantMap values(reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap());
-                QVariantMap localValues(reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr)).toMap());
-
-                // override (global)values with what is found in localValues:
-                for (QVariantMap::const_iterator i = localValues.constBegin();
-                     i != localValues.constEnd(); ++i)
-                    values.insert(i.key(), i.value());
-
-                values.insert("ProjectExplorer.ProjectConfiguration.Id",
-                              cleanStepNames.at(cleanstepnr));
-
-                BuildStep *cleanStep = 0;
-                foreach (IBuildStepFactory *factory, buildStepFactories) {
-                    if (factory->canRestore(bc, values)) {
-                        cleanStep = factory->restore(bc, values);
-                        break;
-                    }
-                }
-                if (cleanStep) {
-                    // TODO remove restoreFromGlobalMap after 2.0
-                    bc->insertCleanStep(pos, cleanStep);
-                    ++pos;
-                }
-            }
-        }
+        QVariantMap temp(reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap());
+        BuildConfiguration *bc = buildConfigurationFactory()->restore(this, temp);
         addBuildConfiguration(bc);
     }
 
-    // Set Active Configuration
     { // Try restoring the active configuration
         QString activeConfigurationName = reader.restoreValue("activebuildconfiguration").toString();
         int index = buildConfigurationNames.indexOf(activeConfigurationName);
@@ -303,81 +203,6 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
             m_activeBuildConfiguration = 0;
     }
 
-    //Build Settings
-    QList<BuildConfiguration *> bcs(buildConfigurations());
-
-    QVariant buildStepsVariant = reader.restoreValue("buildsteps");
-    if (buildStepsVariant.isValid()) {
-        // Old code path for 1.3 compatibility
-        // restoring BuildSteps from settings
-        int pos = 0;
-        QStringList buildStepNames = buildStepsVariant.toStringList();
-        for (int buildstepnr = 0; buildstepnr < buildStepNames.size(); ++buildstepnr) {
-            QVariantMap values(reader.restoreValue("cleanstep" + QString().setNum(buildstepnr)).toMap());
-            for (int i = 0; i < bcs.size(); ++i) {
-                BuildConfiguration *bc = bcs.at(i);
-                BuildStep *buildStep = 0;
-
-                QVariantMap localValues(reader.restoreValue("buildconfiguration-" + QString::number(pos) + "-cleanstep" + QString().setNum(buildstepnr)).toMap());
-
-                // override (global)values with what is found in localValues:
-                for (QVariantMap::const_iterator i = localValues.constBegin();
-                     i != localValues.constEnd(); ++i)
-                    values.insert(i.key(), i.value());
-
-                values.insert("ProjectExplorer.ProjectConfiguration.Id",
-                              buildStepNames.at(buildstepnr));
-
-                foreach (IBuildStepFactory *factory, buildStepFactories) {
-                    if (factory->canRestore(bc, values)) {
-                        buildStep = factory->restore(bc, values);
-                        break;
-                    }
-                }
-                if (buildStep) {
-                    bc->insertBuildStep(pos, buildStep);
-                    ++pos;
-                }
-            }
-        }
-    }
-
-    QVariant cleanStepsVariant = reader.restoreValue("cleansteps");
-    if (cleanStepsVariant.isValid()) {
-        // Old code path for 1.3 compatibility
-        QStringList cleanStepNames = cleanStepsVariant.toStringList();
-        // restoring BuildSteps from settings
-        int pos = 0;
-        for (int cleanstepnr = 0; cleanstepnr < cleanStepNames.size(); ++cleanstepnr) {
-            QVariantMap values(reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap());
-            QVariantMap localValues(reader.restoreValue("buildconfiguration-" + QString::number(pos) + "-cleanstep" + QString().setNum(cleanstepnr)).toMap());
-
-            // override (global)values with what is found in localValues:
-            for (QVariantMap::const_iterator i = localValues.constBegin();
-                 i != localValues.constEnd(); ++i)
-                values.insert(i.key(), i.value());
-
-            values.insert("ProjectExplorer.ProjectConfiguration.Id",
-                          cleanStepNames.at(cleanstepnr));
-
-            for (int i = 0; i < bcs.size(); ++i) {
-                BuildConfiguration *bc = bcs.at(i);
-                BuildStep *cleanStep = 0;
-
-                foreach (IBuildStepFactory *factory, buildStepFactories) {
-                    if (factory->canRestore(bc, values)) {
-                        cleanStep = factory->restore(bc, values);
-                        break;
-                    }
-                }
-                if (cleanStep) {
-                    bc->insertCleanStep(pos, cleanStep);
-                    ++pos;
-                }
-            }
-        }
-    }
-
     // Running
     const int activeId = reader.restoreValue("activeRunConfiguration").toInt();
     int i = 0;
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index df22f9379cd78be4e9fad2bb283b2956bb223850..f9987e1f7837b773eeb1af51674b68d4191b22cd 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -40,15 +40,20 @@ using namespace Qt4ProjectManager::Internal;
 using namespace ProjectExplorer;
 
 namespace {
-    bool debug = false;
-}
+const char * const QT4_BC_ID_PREFIX("Qt4ProjectManager.Qt4BuildConfiguration.");
+const char * const QT4_BC_ID("Qt4ProjectManager.Qt4BuildConfiguration");
 
-namespace {
-    const char * const KEY_QT_VERSION_ID = "QtVersionId";
+const char * const CLEAR_SYSTEM_ENVIRONMENT_KEY("Qt4ProjectManager.Qt4BuildConfiguration.ClearSystemEnvironment");
+const char * const USER_ENVIRONMENT_CHANGES_KEY("Qt4ProjectManager.Qt4BuildConfiguration.UserEnvironmentChanges");
+const char * const USE_SHADOW_BUILD_KEY("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild");
+const char * const BUILD_DIRECTORY_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory");
+const char * const TOOLCHAIN_KEY("Qt4ProjectManager.Qt4BuildConfiguration.ToolChain");
+const char * const BUILD_CONFIGURATION_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration");
+const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId");
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro)
-    : BuildConfiguration(pro),
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro) :
+    BuildConfiguration(pro, QLatin1String(QT4_BC_ID)),
     m_clearSystemEnvironment(false),
     m_shadowBuild(false),
     m_qtVersion(0),
@@ -56,31 +61,23 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro)
     m_qmakeBuildConfiguration(0),
     m_subNodeBuild(0)
 {
-    init();
+    ctor();
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, const QMap<QString, QVariant> &map)
-    : BuildConfiguration(pro, map), m_subNodeBuild(0)
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, const QString &id) :
+    BuildConfiguration(pro, id),
+    m_clearSystemEnvironment(false),
+    m_shadowBuild(false),
+    m_qtVersion(0),
+    m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType
+    m_qmakeBuildConfiguration(0),
+    m_subNodeBuild(0)
 {
-    init();
-    QMap<QString, QVariant>::const_iterator it;
-    it = map.constFind("clearSystemEnvironment");
-    m_clearSystemEnvironment = (it != map.constEnd() && it.value().toBool());
-
-    m_userEnvironmentChanges =
-            EnvironmentItem::fromStringList(map.value("userEnvironmentChanges").toStringList());
-    m_shadowBuild = map.value("useShadowBuild").toBool();
-    m_buildDirectory = map.value("buildDirectory").toString();
-    m_qtVersion = map.value(KEY_QT_VERSION_ID).toInt();
-    if (!QtVersionManager::instance()->isValidId(m_qtVersion))
-        m_qtVersion = 0;
-
-    m_toolChainType = map.value("ToolChain").toInt();
-    m_qmakeBuildConfiguration = QtVersion::QmakeBuildConfigs(map.value("buildConfiguration").toInt());
+    ctor();
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BuildConfiguration *source)
-    : BuildConfiguration(source),
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, Qt4BuildConfiguration *source) :
+    BuildConfiguration(pro, source),
     m_clearSystemEnvironment(source->m_clearSystemEnvironment),
     m_userEnvironmentChanges(source->m_userEnvironmentChanges),
     m_shadowBuild(source->m_shadowBuild),
@@ -90,27 +87,41 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BuildConfiguration *source)
     m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration),
     m_subNodeBuild(0) // temporary value, so not copied
 {
-    init();
+    ctor();
 }
 
 Qt4BuildConfiguration::~Qt4BuildConfiguration()
 {
+}
 
+QVariantMap Qt4BuildConfiguration::toMap() const
+{
+    QVariantMap map(BuildConfiguration::toMap());
+    map.insert(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY), m_clearSystemEnvironment);
+    map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), EnvironmentItem::toStringList(m_userEnvironmentChanges));
+    map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild);
+    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
+    map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersion);
+    map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChainType);
+    map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration));
+    return map;
 }
 
-void Qt4BuildConfiguration::toMap(QMap<QString, QVariant> &map) const
+
+bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
 {
-    map.insert("clearSystemEnvironment", m_clearSystemEnvironment);
-    map.insert("userEnvironmentChanges", EnvironmentItem::toStringList(m_userEnvironmentChanges));
-    map.insert("useShadowBuild", m_shadowBuild);
-    map.insert("buildDirectory", m_buildDirectory);
-    map.insert(KEY_QT_VERSION_ID, m_qtVersion);
-    map.insert("ToolChain", m_toolChainType);
-    map.insert("buildConfiguration", int(m_qmakeBuildConfiguration));
-    BuildConfiguration::toMap(map);
+    m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool();
+    m_userEnvironmentChanges = EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
+    m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY)).toBool();
+    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
+    m_qtVersion = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt();
+    m_toolChainType = map.value(QLatin1String(TOOLCHAIN_KEY)).toInt();
+    m_qmakeBuildConfiguration = QtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt());
+
+    return BuildConfiguration::fromMap(map);
 }
 
-void Qt4BuildConfiguration::init()
+void Qt4BuildConfiguration::ctor()
 {
     QtVersionManager *vm = QtVersionManager::instance();
     connect(vm, SIGNAL(defaultQtVersionChanged()),
@@ -282,9 +293,14 @@ QtVersion *Qt4BuildConfiguration::qtVersion() const
 
 int Qt4BuildConfiguration::qtVersionId() const
 {
+    QtVersionManager *vm = QtVersionManager::instance();
+    if (!vm->version(m_qtVersion)->isValid())
+        m_qtVersion = 0;
+
     return m_qtVersion;
 }
 
+// TODO: This assumes there is always at least one Qt version... Is that valid?
 void Qt4BuildConfiguration::setQtVersion(int id)
 {
     if (m_qtVersion == id)
@@ -293,6 +309,10 @@ void Qt4BuildConfiguration::setQtVersion(int id)
     if (!QtVersionManager::instance()->isValidId(id))
         return;
 
+    QtVersionManager *vm = QtVersionManager::instance();
+    if (!vm->version(id)->isValid())
+        return;
+
     m_qtVersion = id;
     emit qtVersionChanged();
     emit targetInformationChanged();
@@ -535,9 +555,8 @@ QString Qt4BuildConfiguration::extractSpecFromArgumentList(const QStringList &li
   \class Qt4BuildConfigurationFactory
 */
 
-Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(Qt4Project *project)
-    : IBuildConfigurationFactory(project),
-    m_project(project)
+Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(QObject *parent) :
+    ProjectExplorer::IBuildConfigurationFactory(parent)
 {
     update();
 
@@ -554,36 +573,54 @@ Qt4BuildConfigurationFactory::~Qt4BuildConfigurationFactory()
 
 void Qt4BuildConfigurationFactory::update()
 {
-
     m_versions.clear();
-    m_versions.insert(QLatin1String("DefaultQt"), VersionInfo(tr("Using Default Qt Version"), 0));
+    m_versions.insert(QString::fromLatin1(QT4_BC_ID_PREFIX) + QLatin1String("DefaultQt"), VersionInfo(tr("Using Default Qt Version"), 0));
     QtVersionManager *vm = QtVersionManager::instance();
     foreach (const QtVersion *version, vm->versions()) {
-        m_versions.insert(QString::fromLatin1("Qt%1").arg(version->uniqueId()),
+        m_versions.insert(QString::fromLatin1(QT4_BC_ID_PREFIX) + QString::fromLatin1("Qt%1").arg(version->uniqueId()),
                           VersionInfo(tr("Using Qt Version \"%1\"").arg(version->displayName()), version->uniqueId()));
     }
     emit availableCreationIdsChanged();
 }
 
-QStringList Qt4BuildConfigurationFactory::availableCreationIds() const
+QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Project *parent) const
 {
+    if (!qobject_cast<Qt4Project *>(parent))
+        return QStringList();
     return m_versions.keys();
 }
 
 QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const
 {
-    if (m_versions.contains(id))
-        return m_versions.value(id).displayName;
-    return QString();
+    if (!m_versions.contains(id))
+        return QString();
+    return m_versions.value(id).displayName;
 }
 
-BuildConfiguration *Qt4BuildConfigurationFactory::create(const QString &id) const
+bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
 {
-    QTC_ASSERT(m_versions.contains(id), return false);
+    if (!qobject_cast<Qt4Project *>(parent))
+        return false;
+    if (!m_versions.contains(id))
+        return false;
     const VersionInfo &info = m_versions.value(id);
     QtVersion *version = QtVersionManager::instance()->version(info.versionId);
     if (!version)
         return false;
+    return true;
+}
+
+BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+
+    const VersionInfo &info = m_versions.value(id);
+    QtVersion *version = QtVersionManager::instance()->version(info.versionId);
+    Q_ASSERT(version);
+
+    Qt4Project *qt4project(static_cast<Qt4Project *>(parent));
+
     bool ok;
     QString buildConfigurationName = QInputDialog::getText(0,
                           tr("New configuration"),
@@ -594,26 +631,47 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(const QString &id) cons
     if (!ok || buildConfigurationName.isEmpty())
         return false;
 
-    m_project->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName),
-                                     version,
-                                     (version->defaultBuildConfig() | QtVersion::DebugBuild));
+    qt4project->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName),
+                                         version,
+                                         (version->defaultBuildConfig() | QtVersion::DebugBuild));
     BuildConfiguration *bc =
-    m_project->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName),
-                                     version,
-                                     (version->defaultBuildConfig() & ~QtVersion::DebugBuild));
+    qt4project->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName),
+                                         version,
+                                         (version->defaultBuildConfig() & ~QtVersion::DebugBuild));
     return bc;
 }
 
-BuildConfiguration *Qt4BuildConfigurationFactory::clone(BuildConfiguration *source) const
+bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const
 {
-    Qt4BuildConfiguration *oldbc = static_cast<Qt4BuildConfiguration *>(source);
-    Qt4BuildConfiguration *newbc = new Qt4BuildConfiguration(oldbc);
-    return newbc;
+    return canCreate(parent, source->id());
 }
 
-BuildConfiguration *Qt4BuildConfigurationFactory::restore(const QMap<QString, QVariant> &values) const
+BuildConfiguration *Qt4BuildConfigurationFactory::clone(ProjectExplorer::Project *parent, BuildConfiguration *source)
 {
-    Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(m_project, values);
-    return bc;
+    if (!canClone(parent, source))
+        return 0;
+    Qt4Project *project(static_cast<Qt4Project *>(parent));
+    Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source));
+    return new Qt4BuildConfiguration(project, oldbc);
+}
+
+bool Qt4BuildConfigurationFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
+{
+    QString id(ProjectExplorer::idFromMap(map));
+    if (!qobject_cast<Qt4Project *>(parent))
+        return false;
+    return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) ||
+           id == QLatin1String(QT4_BC_ID);
 }
 
+BuildConfiguration *Qt4BuildConfigurationFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+    Qt4Project *project(static_cast<Qt4Project *>(parent));
+    Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(project));
+    if (bc->fromMap(map))
+        return bc;
+    delete bc;
+    return 0;
+}
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 3593d917f404650971dc70ad19e2763b4b8f1546..a62f1e9b6187b39d5b225c0683961607331f2aa4 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -44,17 +44,16 @@ class MakeStep;
 
 namespace Internal {
 
+class Qt4BuildConfigurationFactory;
+
 class Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
     Q_OBJECT
+    friend class Qt4BuildConfigurationFactory;
+
 public:
-    // new buildconfiguration
-    Qt4BuildConfiguration(Qt4Project *pro);
-    // restore ctor
-    Qt4BuildConfiguration(Qt4Project *pro, const QMap<QString, QVariant> &values);
-    // copy ctor
-    Qt4BuildConfiguration(Qt4BuildConfiguration *source);
-    ~Qt4BuildConfiguration();
+    explicit Qt4BuildConfiguration(Qt4Project *pro);
+    virtual ~Qt4BuildConfiguration();
 
     Qt4Project *qt4Project() const;
 
@@ -114,7 +113,7 @@ public:
     static QStringList removeSpecFromArgumentList(const QStringList &old);
     static QString extractSpecFromArgumentList(const QStringList &list, QString directory, QtVersion *version);
 
-    void toMap(QMap<QString, QVariant> &map) const;
+    QVariantMap toMap() const;
 
 signals:
     /// emitted if the qt version changes (either directly, or because the default qt version changed
@@ -130,11 +129,18 @@ signals:
     /// a covenience signal, emitted if either the qtversion, the toolchainType or the qmake build
     /// configuration changed
     void targetInformationChanged();
+
 private slots:
     void defaultQtVersionChanged();
     void qtVersionsChanged(const QList<int> &changedVersions);
+
+protected:
+    Qt4BuildConfiguration(Qt4Project *pro, Qt4BuildConfiguration *source);
+    Qt4BuildConfiguration(Qt4Project *pro, const QString &id);
+    virtual bool fromMap(const QVariantMap &map);
+
 private:
-    void init();
+    void ctor();
     bool m_clearSystemEnvironment;
     QList<ProjectExplorer::EnvironmentItem> m_userEnvironmentChanges;
     bool m_shadowBuild;
@@ -150,15 +156,18 @@ class Qt4BuildConfigurationFactory : public ProjectExplorer::IBuildConfiguration
     Q_OBJECT
 
 public:
-    Qt4BuildConfigurationFactory(Qt4Project *project);
+    explicit Qt4BuildConfigurationFactory(QObject *parent = 0);
     ~Qt4BuildConfigurationFactory();
 
-    QStringList availableCreationIds() const;
+    QStringList availableCreationIds(ProjectExplorer::Project *parent) const;
     QString displayNameForId(const QString &id) const;
 
-    ProjectExplorer::BuildConfiguration *create(const QString &id) const;
-    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::BuildConfiguration *source) const;
-    ProjectExplorer::BuildConfiguration *restore(const QVariantMap &values) const;
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Project *parent, const QString &id);
+    bool canClone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source) const;
+    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Project *parent, ProjectExplorer::BuildConfiguration *source);
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
 
 private slots:
     void update();
@@ -172,7 +181,6 @@ private:
         int versionId;
     };
 
-    Qt4Project *m_project;
     QMap<QString, VersionInfo> m_versions;
 };