diff --git a/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp
index 22daabf9de76977b5c584b99c826e29376cea702..76afbc4ac520c670a7de9be1f6a9a5fae7a1ee03 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp
@@ -69,16 +69,17 @@ QString CMakeBuildEnvironmentWidget::displayName() const
     return tr("Build Environment");
 }
 
-void CMakeBuildEnvironmentWidget::init(const QString &buildConfiguration)
+void CMakeBuildEnvironmentWidget::init(const QString &buildConfigurationName)
 {
     if (debug)
         qDebug() << "Qt4BuildConfigWidget::init()";
 
-    m_buildConfiguration = buildConfiguration;
+    m_buildConfiguration = buildConfigurationName;
 
-    m_clearSystemEnvironmentCheckBox->setChecked(!m_pro->useSystemEnvironment(buildConfiguration));
-    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(buildConfiguration));
-    m_buildEnvironmentWidget->setUserChanges(m_pro->userEnvironmentChanges(buildConfiguration));
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfigurationName);
+    m_clearSystemEnvironmentCheckBox->setChecked(!m_pro->useSystemEnvironment(bc));
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(bc));
+    m_buildEnvironmentWidget->setUserChanges(m_pro->userEnvironmentChanges(bc));
     m_buildEnvironmentWidget->updateButtons();
 }
 
@@ -89,6 +90,7 @@ void CMakeBuildEnvironmentWidget::environmentModelUserChangesUpdated()
 
 void CMakeBuildEnvironmentWidget::clearSystemEnvironmentCheckBoxClicked(bool checked)
 {
-    m_pro->setUseSystemEnvironment(m_buildConfiguration, !checked);
-    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(m_buildConfiguration));
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
+    m_pro->setUseSystemEnvironment(bc, !checked);
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(bc));
 }
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 88d7ab13e59c31637016c8543274339497ce0fbb..8ed13b3a6d7d282d9c236f7a7d0fe8d4616913ca 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -48,9 +48,11 @@
 #include <QtCore/QProcess>
 #include <QtGui/QFormLayout>
 #include <QtGui/QMainWindow>
+#include <QtGui/QInputDialog>
 
 using namespace CMakeProjectManager;
 using namespace CMakeProjectManager::Internal;
+using namespace ProjectExplorer;
 using ProjectExplorer::Environment;
 using ProjectExplorer::EnvironmentItem;
 
@@ -63,10 +65,77 @@ using ProjectExplorer::EnvironmentItem;
 // Open Questions
 // Who sets up the environment for cl.exe ? INCLUDEPATH and so on
 
+/*!
+  \class CMakeBuildConfigurationFactory
+*/
 
+CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory(CMakeProject *project)
+    : IBuildConfigurationFactory(project),
+    m_project(project)
+{
+}
+
+CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory()
+{
+}
+
+QStringList CMakeBuildConfigurationFactory::availableCreationTypes() const
+{
+    return QStringList() << "Create";
+}
+
+QString CMakeBuildConfigurationFactory::displayNameForType(const QString &type) const
+{
+    return tr("Create");
+}
+
+QList<BuildConfiguration *> CMakeBuildConfigurationFactory::create(const QString &type) const
+{
+    QTC_ASSERT(type == "Create", return QList<BuildConfiguration*>());
+
+    //TODO configuration name should be part of the cmakeopenprojectwizard
+    bool ok;
+    QString buildConfigurationName = QInputDialog::getText(0,
+                          tr("New configuration"),
+                          tr("New Configuration Name:"),
+                          QLineEdit::Normal,
+                          QString(),
+                          &ok);
+    if (!ok || buildConfigurationName.isEmpty())
+        return QList<BuildConfiguration *>();
+    BuildConfiguration *bc = new BuildConfiguration(buildConfigurationName);
+
+    // Default to all
+    //TODO the buildConfigurationName has not been made unique yet
+    if (m_project->targets().contains("all"))
+        m_project->makeStep()->setBuildTarget(buildConfigurationName, "all", true);
+
+    CMakeOpenProjectWizard copw(m_project->projectManager(),
+                                m_project->sourceDirectory(),
+                                m_project->buildDirectory(bc),
+                                m_project->environment(bc));
+    if (copw.exec() != QDialog::Accepted) {
+        delete bc;
+        return QList<BuildConfiguration *>();
+    }
+    bc->setValue("buildDirectory", copw.buildDirectory());
+    bc->setValue("msvcVersion", copw.msvcVersion());
+    m_project->parseCMakeLists();
+    return QList<BuildConfiguration *>() << bc;
+}
+
+QList<BuildConfiguration *> CMakeBuildConfigurationFactory::createDefaultConfigurations() const
+{
+    return QList<BuildConfiguration *>() << new BuildConfiguration;
+}
+
+/*!
+  \class CMakeProject
+*/
 CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
     : m_manager(manager),
       m_fileName(fileName),
+      m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this)),
       m_rootNode(new CMakeProjectNode(m_fileName)),
       m_toolChain(0),
       m_insideFileChanged(false)
@@ -80,12 +149,18 @@ CMakeProject::~CMakeProject()
     delete m_toolChain;
 }
 
+IBuildConfigurationFactory *CMakeProject::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
 void CMakeProject::slotActiveBuildConfiguration()
 {
+    BuildConfiguration *activeBC = activeBuildConfiguration();
     // Pop up a dialog asking the user to rerun cmake
     QFileInfo sourceFileInfo(m_fileName);
 
-    QString cbpFile = CMakeManager::findCbpFile(QDir(buildDirectory(activeBuildConfiguration())));
+    QString cbpFile = CMakeManager::findCbpFile(QDir(buildDirectory(activeBC)));
     QFileInfo cbpFileFi(cbpFile);
     CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing;
     if (!cbpFileFi.exists()) {
@@ -102,11 +177,11 @@ void CMakeProject::slotActiveBuildConfiguration()
     if (mode != CMakeOpenProjectWizard::Nothing) {
         CMakeOpenProjectWizard copw(m_manager,
                                     sourceFileInfo.absolutePath(),
-                                    buildDirectory(activeBuildConfiguration()),
+                                    buildDirectory(activeBC),
                                     mode,
-                                    environment(activeBuildConfiguration()));
+                                    environment(activeBC));
         copw.exec();
-        setValue(activeBuildConfiguration(), "msvcVersion", copw.msvcVersion());
+        activeBC->setValue("msvcVersion", copw.msvcVersion());
     }
     // reparse
     parseCMakeLists();
@@ -133,7 +208,7 @@ void CMakeProject::updateToolChain(const QString &compiler)
         newToolChain = ProjectExplorer::ToolChain::createGccToolChain("gcc");
 #endif
     } else if (compiler == "msvc8") {
-        newToolChain = ProjectExplorer::ToolChain::createMSVCToolChain(value(activeBuildConfiguration(), "msvcVersion").toString(), false);
+        newToolChain = ProjectExplorer::ToolChain::createMSVCToolChain(activeBuildConfiguration()->value("msvcVersion").toString(), false);
     } else {
         // TODO other toolchains
         qDebug()<<"Not implemented yet!!! Qt Creator doesn't know which toolchain to use for"<<compiler;
@@ -148,16 +223,16 @@ void CMakeProject::updateToolChain(const QString &compiler)
     }
 }
 
-ProjectExplorer::ToolChain *CMakeProject::toolChain(const QString &buildConfiguration) const
+ProjectExplorer::ToolChain *CMakeProject::toolChain(BuildConfiguration *configuration) const
 {
-    if (buildConfiguration != activeBuildConfiguration())
+    if (configuration != activeBuildConfiguration())
         qWarning()<<"CMakeProject asked for toolchain of a not active buildconfiguration";
     return m_toolChain;
 }
 
-void CMakeProject::changeBuildDirectory(const QString &buildConfiguration, const QString &newBuildDirectory)
+void CMakeProject::changeBuildDirectory(BuildConfiguration *configuration, const QString &newBuildDirectory)
 {
-    setValue(buildConfiguration, "buildDirectory", newBuildDirectory);
+    configuration->setValue("buildDirectory", newBuildDirectory);
     parseCMakeLists();
 }
 
@@ -176,7 +251,7 @@ bool CMakeProject::parseCMakeLists()
     CMakeCbpParser cbpparser;
     // Parsing
     //qDebug()<<"Parsing file "<<cbpFile;
-    if (cbpparser.parseCbpFile(cbpFile)) {        
+    if (cbpparser.parseCbpFile(cbpFile)) {
         // ToolChain
         updateToolChain(cbpparser.compilerName());
 
@@ -317,11 +392,11 @@ bool CMakeProject::parseCMakeLists()
     return true;
 }
 
-QString CMakeProject::buildParser(const QString &buildConfiguration) const
+QString CMakeProject::buildParser(BuildConfiguration *configuration) const
 {
-    Q_UNUSED(buildConfiguration)
+    Q_UNUSED(configuration)
     // TODO this is actually slightly wrong, but do i care?
-    // this should call toolchain(buildConfiguration)
+    // this should call toolchain(configuration)
     if (!m_toolChain)
         return QString::null;
     if (m_toolChain->type() == ProjectExplorer::ToolChain::GCC
@@ -476,36 +551,37 @@ bool CMakeProject::isApplication() const
     return true;
 }
 
-ProjectExplorer::Environment CMakeProject::baseEnvironment(const QString &buildConfiguration) const
+ProjectExplorer::Environment CMakeProject::baseEnvironment(BuildConfiguration *configuration) const
 {
-    Environment env = useSystemEnvironment(buildConfiguration) ? Environment(QProcess::systemEnvironment()) : Environment();
+    Environment env = useSystemEnvironment(configuration) ? Environment(QProcess::systemEnvironment()) : Environment();
     return env;
 }
 
-ProjectExplorer::Environment CMakeProject::environment(const QString &buildConfiguration) const
+ProjectExplorer::Environment CMakeProject::environment(BuildConfiguration *configuration) const
 {
-    Environment env = baseEnvironment(buildConfiguration);
-    env.modify(userEnvironmentChanges(buildConfiguration));
+    Environment env = baseEnvironment(configuration);
+    env.modify(userEnvironmentChanges(configuration));
     return env;
 }
 
-void CMakeProject::setUseSystemEnvironment(const QString &buildConfiguration, bool b)
+void CMakeProject::setUseSystemEnvironment(BuildConfiguration *configuration, bool b)
 {
-    if (b == useSystemEnvironment(buildConfiguration))
+    if (b == useSystemEnvironment(configuration))
         return;
-    setValue(buildConfiguration, "clearSystemEnvironment", !b);
-    emit environmentChanged(buildConfiguration);
+    configuration->setValue("clearSystemEnvironment", !b);
+    emit environmentChanged(configuration->name());
 }
 
-bool CMakeProject::useSystemEnvironment(const QString &buildConfiguration) const
+bool CMakeProject::useSystemEnvironment(BuildConfiguration *configuration) const
 {
-    bool b = !(value(buildConfiguration, "clearSystemEnvironment").isValid() && value(buildConfiguration, "clearSystemEnvironment").toBool());
+    bool b = !(configuration->value("clearSystemEnvironment").isValid() &&
+               configuration->value("clearSystemEnvironment").toBool());
     return b;
 }
 
-QList<ProjectExplorer::EnvironmentItem> CMakeProject::userEnvironmentChanges(const QString &buildConfig) const
+QList<ProjectExplorer::EnvironmentItem> CMakeProject::userEnvironmentChanges(BuildConfiguration *configuration) const
 {
-    return EnvironmentItem::fromStringList(value(buildConfig, "userEnvironmentChanges").toStringList());
+    return EnvironmentItem::fromStringList(configuration->value("userEnvironmentChanges").toStringList());
 }
 
 void CMakeProject::setUserEnvironmentChanges(const QString &buildConfig, const QList<ProjectExplorer::EnvironmentItem> &diff)
@@ -517,9 +593,9 @@ void CMakeProject::setUserEnvironmentChanges(const QString &buildConfig, const Q
     emit environmentChanged(buildConfig);
 }
 
-QString CMakeProject::buildDirectory(const QString &buildConfiguration) const
+QString CMakeProject::buildDirectory(BuildConfiguration *configuration) const
 {
-    QString buildDirectory = value(buildConfiguration, "buildDirectory").toString();
+    QString buildDirectory = configuration->value("buildDirectory").toString();
     if (buildDirectory.isEmpty())
         buildDirectory = sourceDirectory() + "/qtcreator-build";
     return buildDirectory;
@@ -537,21 +613,21 @@ QList<ProjectExplorer::BuildConfigWidget*> CMakeProject::subConfigWidgets()
     return list;
 }
 
- bool CMakeProject::newBuildConfiguration(const QString &buildConfiguration)
- {
-     // Default to all
-     if (targets().contains("all"))
-         makeStep()->setBuildTarget(buildConfiguration, "all", true);
-
-    CMakeOpenProjectWizard copw(projectManager(), sourceDirectory(), buildDirectory(buildConfiguration), environment(buildConfiguration));
-    if (copw.exec() == QDialog::Accepted) {
-        setValue(buildConfiguration, "buildDirectory", copw.buildDirectory());
-        setValue(buildConfiguration, "msvcVersion", copw.msvcVersion());
-        parseCMakeLists();
-        return true;
-    }
-    return false;
- }
+// bool CMakeProject::newBuildConfiguration(const QString &buildConfiguration)
+// {
+//     // Default to all
+//     if (targets().contains("all"))
+//         makeStep()->setBuildTarget(buildConfiguration, "all", true);
+//
+//    CMakeOpenProjectWizard copw(projectManager(), sourceDirectory(), buildDirectory(buildConfiguration), environment(buildConfiguration));
+//    if (copw.exec() == QDialog::Accepted) {
+//        setValue(buildConfiguration, "buildDirectory", copw.buildDirectory());
+//        setValue(buildConfiguration, "msvcVersion", copw.msvcVersion());
+//        parseCMakeLists();
+//        return true;
+//    }
+//    return false;
+// }
 
 ProjectExplorer::ProjectNode *CMakeProject::rootProjectNode() const
 {
@@ -600,23 +676,25 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
 
         insertBuildStep(0, makeStep);
 
-        addBuildConfiguration("all");
-        setValue("all", "msvcVersion", copw.msvcVersion());
+        ProjectExplorer::BuildConfiguration *bc = new ProjectExplorer::BuildConfiguration("all");
+        addBuildConfiguration(bc);
+        setValue(bc->name(), "msvcVersion", copw.msvcVersion());
         if (!copw.buildDirectory().isEmpty())
-            setValue("all", "buildDirectory", copw.buildDirectory());
+            setValue(bc->name(), "buildDirectory", copw.buildDirectory());
         //TODO save arguments somewhere copw.arguments()
 
         MakeStep *cleanMakeStep = new MakeStep(this);
         insertCleanStep(0, cleanMakeStep);
         cleanMakeStep->setValue("clean", true);
-        setActiveBuildConfiguration("all");
+        setActiveBuildConfiguration(bc);
     } else {
         // We have a user file, but we could still be missing the cbp file
         // or simply run createXml with the saved settings
         QFileInfo sourceFileInfo(m_fileName);
         QStringList needToCreate;
         QStringList needToUpdate;
-        QString cbpFile = CMakeManager::findCbpFile(QDir(buildDirectory(activeBuildConfiguration())));
+        BuildConfiguration *activeBC = activeBuildConfiguration();
+        QString cbpFile = CMakeManager::findCbpFile(QDir(buildDirectory(activeBC)));
         QFileInfo cbpFileFi(cbpFile);
 
         CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing;
@@ -628,11 +706,11 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
         if (mode != CMakeOpenProjectWizard::Nothing) {
             CMakeOpenProjectWizard copw(m_manager,
                                         sourceFileInfo.absolutePath(),
-                                        buildDirectory(activeBuildConfiguration()),
+                                        buildDirectory(activeBC),
                                         mode,
-                                        environment(activeBuildConfiguration()));
+                                        environment(activeBC));
             copw.exec();
-            setValue(activeBuildConfiguration(), "msvcVersion", copw.msvcVersion());
+            activeBC->setValue("msvcVersion", copw.msvcVersion());
         }
     }
 
@@ -752,11 +830,12 @@ QString CMakeBuildSettingsWidget::displayName() const
     return "CMake";
 }
 
-void CMakeBuildSettingsWidget::init(const QString &buildConfiguration)
+void CMakeBuildSettingsWidget::init(const QString &buildConfigurationName)
 {
-    m_buildConfiguration = buildConfiguration;
-    m_pathLineEdit->setText(m_project->buildDirectory(buildConfiguration));
-    if (m_project->buildDirectory(buildConfiguration) == m_project->sourceDirectory())
+    m_buildConfiguration = buildConfigurationName;
+    BuildConfiguration *bc = m_project->buildConfiguration(buildConfigurationName);
+    m_pathLineEdit->setText(m_project->buildDirectory(bc));
+    if (m_project->buildDirectory(bc) == m_project->sourceDirectory())
         m_changeButton->setEnabled(false);
     else
         m_changeButton->setEnabled(true);
@@ -764,13 +843,14 @@ void CMakeBuildSettingsWidget::init(const QString &buildConfiguration)
 
 void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog()
 {
+    BuildConfiguration *bc = m_project->buildConfiguration(m_buildConfiguration);
     CMakeOpenProjectWizard copw(m_project->projectManager(),
                                 m_project->sourceDirectory(),
-                                m_project->buildDirectory(m_buildConfiguration),
-                                m_project->environment(m_buildConfiguration));
+                                m_project->buildDirectory(bc),
+                                m_project->environment(bc));
     if (copw.exec() == QDialog::Accepted) {
-        m_project->changeBuildDirectory(m_buildConfiguration, copw.buildDirectory());
-        m_pathLineEdit->setText(m_project->buildDirectory(m_buildConfiguration));
+        m_project->changeBuildDirectory(bc, copw.buildDirectory());
+        m_pathLineEdit->setText(m_project->buildDirectory(bc));
     }
 }
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index c9bbbfb903e5c175ffaf45650b5bf50a6e09b9f2..79b405e9f5f85c65f3e34208a262f3f04ec9bbb5 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -39,6 +39,7 @@
 #include <projectexplorer/buildstep.h>
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/filewatcher.h>
+#include <projectexplorer/buildconfiguration.h>
 #include <coreplugin/ifile.h>
 
 #include <QtCore/QXmlStreamReader>
@@ -49,6 +50,7 @@ namespace CMakeProjectManager {
 namespace Internal {
 
 class CMakeFile;
+class CMakeBuildSettingsWidget;
 
 struct CMakeTarget
 {
@@ -60,7 +62,23 @@ struct CMakeTarget
     void clear();
 };
 
-class CMakeBuildSettingsWidget;
+class CMakeBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
+{
+    Q_OBJECT
+
+public:
+    CMakeBuildConfigurationFactory(CMakeProject *project);
+    ~CMakeBuildConfigurationFactory();
+
+    QStringList availableCreationTypes() const;
+    QString displayNameForType(const QString &type) const;
+
+    QList<ProjectExplorer::BuildConfiguration *> create(const QString &type) const;
+    QList<ProjectExplorer::BuildConfiguration *> createDefaultConfigurations() const;
+
+private:
+    CMakeProject *m_project;
+};
 
 class CMakeProject : public ProjectExplorer::Project
 {
@@ -73,6 +91,7 @@ public:
 
     virtual QString name() const;
     virtual Core::IFile *file() const;
+    virtual ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const;
     virtual CMakeManager *projectManager() const;
 
     virtual QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn
@@ -80,47 +99,43 @@ public:
     virtual bool isApplication() const;
 
     //building environment
-    ProjectExplorer::Environment environment(const QString &buildConfiguration) const;
-    ProjectExplorer::Environment baseEnvironment(const QString &buildConfiguration) const;
+    ProjectExplorer::Environment environment(ProjectExplorer::BuildConfiguration *configuration) const;
+    ProjectExplorer::Environment baseEnvironment(ProjectExplorer::BuildConfiguration *configuration) const;
     void setUserEnvironmentChanges(const QString &buildConfig, const QList<ProjectExplorer::EnvironmentItem> &diff);
-    QList<ProjectExplorer::EnvironmentItem> userEnvironmentChanges(const QString &buildConfig) const;
-    bool useSystemEnvironment(const QString &buildConfiguration) const;
-    void setUseSystemEnvironment(const QString &buildConfiguration, bool b);
+    QList<ProjectExplorer::EnvironmentItem> userEnvironmentChanges(ProjectExplorer::BuildConfiguration *configuration) const;
+    bool useSystemEnvironment(ProjectExplorer::BuildConfiguration *configuration) const;
+    void setUseSystemEnvironment(ProjectExplorer::BuildConfiguration *configuration, bool b);
 
-    virtual QString buildDirectory(const QString &buildConfiguration) const;
+    virtual QString buildDirectory(ProjectExplorer::BuildConfiguration *configuration) const;
 
     virtual ProjectExplorer::BuildConfigWidget *createConfigWidget();
     virtual QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
 
-    // This method is called for new build configurations
-    // You should probably set some default values in this method
-    virtual bool newBuildConfiguration(const QString &buildConfiguration);
-
     virtual ProjectExplorer::ProjectNode *rootProjectNode() const;
 
     virtual QStringList files(FilesMode fileMode) const;
     MakeStep *makeStep() const;
     QStringList targets() const;
-    QString buildParser(const QString &buildConfiguration) const;
+    QString buildParser(ProjectExplorer::BuildConfiguration *configuration) const;
     CMakeTarget targetForTitle(const QString &title);
 
     QString sourceDirectory() const;
     ProjectExplorer::ToolChain::ToolChainType toolChainType() const;
-    ProjectExplorer::ToolChain *toolChain(const QString &buildConfiguration) const;
+    ProjectExplorer::ToolChain *toolChain(ProjectExplorer::BuildConfiguration *configuration) const;
 
+    bool parseCMakeLists();
 protected:
     virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer);
     virtual bool restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader);
 
     // called by CMakeBuildSettingsWidget
-    void changeBuildDirectory(const QString &buildConfiguration, const QString &newBuildDirectory);
+    void changeBuildDirectory(ProjectExplorer::BuildConfiguration *configuration, const QString &newBuildDirectory);
 
 private slots:
     void fileChanged(const QString &fileName);
     void slotActiveBuildConfiguration();
 
 private:
-    bool parseCMakeLists();
     void updateToolChain(const QString &compiler);
 
     void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list);
@@ -131,6 +146,7 @@ private:
     QString m_fileName;
     CMakeFile *m_file;
     QString m_projectName;
+    CMakeBuildConfigurationFactory *m_buildConfigurationFactory;
 
     // TODO probably need a CMake specific node structure
     CMakeProjectNode *m_rootNode;
diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
index 39b0b07e754460df06a7b9d84c2087c8a9608ba7..b3ea45a742fc160b32ad9f72a662b3d63b7eecf1 100644
--- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
@@ -187,7 +187,6 @@ ProjectExplorer::Environment CMakeRunConfiguration::baseEnvironment() const
     } else  if (m_baseEnvironmentBase == CMakeRunConfiguration::SystemEnvironmentBase) {
         env = ProjectExplorer::Environment::systemEnvironment();
     } else  if (m_baseEnvironmentBase == CMakeRunConfiguration::BuildEnvironmentBase) {
-        QString config = project()->activeBuildConfiguration();
         env = project()->environment(project()->activeBuildConfiguration());
     }
     return env;
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index 8db7559329a8c1d5cb08505ca8d3192079bafa63..1d88b4cddac5c9619c2298271031762163e38f5e 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -54,12 +54,13 @@ MakeStep::~MakeStep()
 
 bool MakeStep::init(const QString &buildConfiguration)
 {
-    setBuildParser(m_pro->buildParser(buildConfiguration));
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
+    setBuildParser(m_pro->buildParser(bc));
 
     setEnabled(buildConfiguration, true);
-    setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration));
+    setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(bc));
 
-    setCommand(buildConfiguration, m_pro->toolChain(buildConfiguration)->makeCommand());
+    setCommand(buildConfiguration, m_pro->toolChain(bc)->makeCommand());
 
     if (!value(buildConfiguration, "cleanConfig").isValid() &&value("clean").isValid() && value("clean").toBool()) {
         // Import old settings
@@ -70,7 +71,7 @@ bool MakeStep::init(const QString &buildConfiguration)
     QStringList arguments = value(buildConfiguration, "buildTargets").toStringList();
     arguments << additionalArguments(buildConfiguration);
     setArguments(buildConfiguration, arguments); // TODO
-    setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration));
+    setEnvironment(buildConfiguration, m_pro->environment(bc));
     setIgnoreReturnValue(buildConfiguration, value(buildConfiguration, "cleanConfig").isValid());
 
     return AbstractMakeStep::init(buildConfiguration);
@@ -225,7 +226,9 @@ void MakeStepConfigWidget::updateDetails()
     QStringList arguments = m_makeStep->value(m_buildConfiguration, "buildTargets").toStringList();
     arguments << m_makeStep->additionalArguments(m_buildConfiguration);
     m_summaryText = tr("<b>Make:</b> %1 %2")
-                    .arg(m_makeStep->project()->toolChain(m_buildConfiguration)->makeCommand(),
+                    .arg(m_makeStep->project()->toolChain(
+                            m_makeStep->project()->buildConfiguration(m_buildConfiguration))
+                            ->makeCommand(),
                          arguments.join(" "));
     emit updateSummary();
 }
diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp
index 9bc4320ff3377028b61dc7658a3676d55329e2ee..0ce416f2f5a71e5cdbea0fe51454616b18c50080 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.cpp
+++ b/src/plugins/genericprojectmanager/genericmakestep.cpp
@@ -56,23 +56,24 @@ GenericMakeStep::~GenericMakeStep()
 {
 }
 
-bool GenericMakeStep::init(const QString &buildConfiguration)
+bool GenericMakeStep::init(const QString &buildConfigurationName)
 {
-    const QString buildParser = m_pro->buildParser(buildConfiguration);
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfigurationName);
+    const QString buildParser = m_pro->buildParser(bc);
     setBuildParser(buildParser);
     qDebug() << "*** build parser:" << buildParser;
 
-    setEnabled(buildConfiguration, true);
+    setEnabled(buildConfigurationName, true);
     Core::VariableManager *vm = Core::VariableManager::instance();
-    const QString rawBuildDir = m_pro->buildDirectory(buildConfiguration);
+    const QString rawBuildDir = m_pro->buildDirectory(bc);
     const QString buildDir = vm->resolve(rawBuildDir);
-    setWorkingDirectory(buildConfiguration, buildDir);
+    setWorkingDirectory(buildConfigurationName, buildDir);
 
-    setCommand(buildConfiguration, makeCommand(buildConfiguration));
-    setArguments(buildConfiguration, replacedArguments(buildConfiguration));
+    setCommand(buildConfigurationName, makeCommand(buildConfigurationName));
+    setArguments(buildConfigurationName, replacedArguments(buildConfigurationName));
 
-    setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration));
-    return AbstractMakeStep::init(buildConfiguration);
+    setEnvironment(buildConfigurationName, m_pro->environment(bc));
+    return AbstractMakeStep::init(buildConfigurationName);
 }
 
 QStringList GenericMakeStep::replacedArguments(const QString &buildConfiguration) const
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 3b75a3f09c86e19fef3489cc3b0a61ab73125c39..2f9beb4b13583b3c74026951ff971d360cdcd89b 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -55,6 +55,7 @@
 
 using namespace GenericProjectManager;
 using namespace GenericProjectManager::Internal;
+using namespace ProjectExplorer;
 
 namespace {
 
@@ -105,6 +106,40 @@ public:
 
 } // end of anonymous namespace
 
+/*!
+  \class GenericBuildConfigurationFactory
+*/
+
+GenericBuildConfigurationFactory::GenericBuildConfigurationFactory(GenericProject *project)
+    : IBuildConfigurationFactory(project),
+    m_project(project)
+{
+}
+
+GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory()
+{
+}
+
+QStringList GenericBuildConfigurationFactory::availableCreationTypes() const
+{
+    return QStringList() << "Create";
+}
+
+QString GenericBuildConfigurationFactory::displayNameForType(const QString &type) const
+{
+    return tr("Create");
+}
+
+QList<BuildConfiguration *> GenericBuildConfigurationFactory::create(const QString &type) const
+{
+    return QList<BuildConfiguration *>() << new BuildConfiguration;
+}
+
+QList<BuildConfiguration *> GenericBuildConfigurationFactory::createDefaultConfigurations() const
+{
+    return QList<BuildConfiguration *>() << new BuildConfiguration;
+}
+
 ////////////////////////////////////////////////////////////////////////////////////
 // GenericProject
 ////////////////////////////////////////////////////////////////////////////////////
@@ -112,6 +147,7 @@ public:
 GenericProject::GenericProject(Manager *manager, const QString &fileName)
     : m_manager(manager),
       m_fileName(fileName),
+      m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this)),
       m_toolChain(0)
 {
     QFileInfo fileInfo(m_fileName);
@@ -136,6 +172,11 @@ GenericProject::~GenericProject()
     delete m_toolChain;
 }
 
+IBuildConfigurationFactory *GenericProject::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
 QString GenericProject::filesFileName() const
 { return m_filesFileName; }
 
@@ -355,9 +396,9 @@ void GenericProject::setToolChainType(ProjectExplorer::ToolChain::ToolChainType
     }
 }
 
-QString GenericProject::buildParser(const QString &buildConfiguration) const
+QString GenericProject::buildParser(BuildConfiguration *configuration) const
 {
-    Q_UNUSED(buildConfiguration)
+    Q_UNUSED(configuration)
     if (m_toolChain) {
         switch (m_toolChain->type()) {
         case ProjectExplorer::ToolChain::GCC:
@@ -410,14 +451,15 @@ bool GenericProject::isApplication() const
     return true;
 }
 
-ProjectExplorer::Environment GenericProject::environment(const QString &) const
+ProjectExplorer::Environment GenericProject::environment(BuildConfiguration *configuration) const
 {
+    Q_UNUSED(configuration)
     return ProjectExplorer::Environment::systemEnvironment();
 }
 
-QString GenericProject::buildDirectory(const QString &buildConfiguration) const
+QString GenericProject::buildDirectory(BuildConfiguration *configuration) const
 {
-    QString buildDirectory = value(buildConfiguration, "buildDirectory").toString();
+    QString buildDirectory = configuration->value("buildDirectory").toString();
 
     if (buildDirectory.isEmpty()) {
         QFileInfo fileInfo(m_fileName);
@@ -438,11 +480,11 @@ QList<ProjectExplorer::BuildConfigWidget*> GenericProject::subConfigWidgets()
     return QList<ProjectExplorer::BuildConfigWidget*>();
 }
 
- bool GenericProject::newBuildConfiguration(const QString &buildConfiguration)
- {
-     makeStep()->setBuildTarget(buildConfiguration, "all", true);
-     return true;
- }
+// bool GenericProject::newBuildConfiguration(const QString &buildConfiguration)
+// {
+//     makeStep()->setBuildTarget(buildConfiguration, "all", true);
+//     return true;
+// }
 
 GenericProjectNode *GenericProject::rootProjectNode() const
 {
@@ -482,14 +524,15 @@ bool GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead
 
         const QLatin1String all("all");
 
-        addBuildConfiguration(all);
-        setActiveBuildConfiguration(all);
+        ProjectExplorer::BuildConfiguration *bc = new BuildConfiguration(all);
+        addBuildConfiguration(bc);
+        setActiveBuildConfiguration(bc);
         makeStep->setBuildTarget(all, all, /* on = */ true);
 
         const QLatin1String buildDirectory("buildDirectory");
 
         const QFileInfo fileInfo(file()->fileName());
-        setValue(all, buildDirectory, fileInfo.absolutePath());
+        bc->setValue(buildDirectory, fileInfo.absolutePath());
     }
 
     using namespace ProjectExplorer;
@@ -568,10 +611,10 @@ GenericBuildSettingsWidget::~GenericBuildSettingsWidget()
 QString GenericBuildSettingsWidget::displayName() const
 { return tr("Generic Manager"); }
 
-void GenericBuildSettingsWidget::init(const QString &buildConfiguration)
+void GenericBuildSettingsWidget::init(const QString &buildConfigurationName)
 {
-    m_buildConfiguration = buildConfiguration;
-    m_pathChooser->setPath(m_project->buildDirectory(buildConfiguration));
+    m_buildConfiguration = buildConfigurationName;
+    m_pathChooser->setPath(m_project->buildDirectory(m_project->buildConfiguration(buildConfigurationName)));
 }
 
 void GenericBuildSettingsWidget::buildDirectoryChanged()
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 8ca62c83c5b76b80ed02f929b1d3ff231571055d..d5c0e8347bc9b5b101f1ca583ccf09c4d543aa2c 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -37,6 +37,7 @@
 #include <projectexplorer/projectnodes.h>
 #include <projectexplorer/buildstep.h>
 #include <projectexplorer/toolchain.h>
+#include <projectexplorer/buildconfiguration.h>
 #include <coreplugin/ifile.h>
 
 QT_BEGIN_NAMESPACE
@@ -52,10 +53,28 @@ class PathChooser;
 
 namespace GenericProjectManager {
 namespace Internal {
-
+class GenericProject;
 class GenericMakeStep;
 class GenericProjectFile;
 
+class GenericBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
+{
+    Q_OBJECT
+
+public:
+    GenericBuildConfigurationFactory(GenericProject *project);
+    ~GenericBuildConfigurationFactory();
+
+    QStringList availableCreationTypes() const;
+    QString displayNameForType(const QString &type) const;
+
+    QList<ProjectExplorer::BuildConfiguration *> create(const QString &type) const;
+    QList<ProjectExplorer::BuildConfiguration *> createDefaultConfigurations() const;
+
+private:
+    GenericProject *m_project;
+};
+
 class GenericProject : public ProjectExplorer::Project
 {
     Q_OBJECT
@@ -70,25 +89,25 @@ public:
 
     virtual QString name() const;
     virtual Core::IFile *file() const;
+    virtual ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const;
     virtual ProjectExplorer::IProjectManager *projectManager() const;
 
     virtual QList<ProjectExplorer::Project *> dependsOn();
 
     virtual bool isApplication() const;
 
-    virtual ProjectExplorer::Environment environment(const QString &buildConfiguration) const;
-    virtual QString buildDirectory(const QString &buildConfiguration) const;
+    virtual ProjectExplorer::Environment environment(ProjectExplorer::BuildConfiguration *configuration) const;
+    virtual QString buildDirectory(ProjectExplorer::BuildConfiguration *configuration) const;
 
     virtual ProjectExplorer::BuildConfigWidget *createConfigWidget();
     virtual QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
 
-    virtual bool newBuildConfiguration(const QString &buildConfiguration);
     virtual GenericProjectNode *rootProjectNode() const;
     virtual QStringList files(FilesMode fileMode) const;
 
     QStringList targets() const;
     GenericMakeStep *makeStep() const;
-    QString buildParser(const QString &buildConfiguration) const;
+    QString buildParser(ProjectExplorer::BuildConfiguration *configuration) const;
     ProjectExplorer::ToolChain *toolChain() const;
 
     bool setFiles(const QStringList &filePaths);
@@ -110,7 +129,7 @@ public:
     QStringList allIncludePaths() const;
     QStringList projectIncludePaths() const;
     QStringList files() const;
-    QStringList generated() const;    
+    QStringList generated() const;
     ProjectExplorer::ToolChain::ToolChainType toolChainType() const;
     void setToolChainType(ProjectExplorer::ToolChain::ToolChainType type);
 
@@ -129,6 +148,7 @@ private:
     QString m_configFileName;
     GenericProjectFile *m_file;
     QString m_projectName;
+    GenericBuildConfigurationFactory *m_buildConfigurationFactory;
 
     QStringList m_files;
     QStringList m_generated;
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 832bb81c96a65d88c0764a01a3aaefb21b2bd760..237198e72b88142b36b457cda3f91f0f5539657f 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -29,6 +29,8 @@
 
 #include "buildconfiguration.h"
 
+#include <utils/qtcassert.h>
+
 using namespace ProjectExplorer;
 
 BuildConfiguration::BuildConfiguration()
@@ -46,20 +48,21 @@ BuildConfiguration::BuildConfiguration(const QString &name, BuildConfiguration *
 {
 }
 
+void BuildConfiguration::setName(const QString &name)
+{
+    m_name = name;
+}
+
 QString BuildConfiguration::name() const
 {
     return m_name;
 }
 
-QString BuildConfiguration::displayName()
+QString BuildConfiguration::displayName() const
 {
     QVariant v = value("ProjectExplorer.BuildConfiguration.DisplayName");
-    if (v.isValid()) {
-        return v.toString();
-    } else {
-        setDisplayName(m_name);
-        return m_name;
-    }
+    QTC_ASSERT(v.isValid(), return QString());
+    return v.toString();
 }
 
 void BuildConfiguration::setDisplayName(const QString &name)
@@ -98,3 +101,14 @@ QMap<QString, QVariant> BuildConfiguration::toMap() const
         result.insert(it.key(), it.value());
     return result;
 }
+
+
+IBuildConfigurationFactory::IBuildConfigurationFactory(QObject *parent)
+    : QObject(parent)
+{
+}
+
+IBuildConfigurationFactory::~IBuildConfigurationFactory()
+{
+
+}
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index 257c2d9421af9a758f64675391b53e8aa31ee6f1..a38664c49c62cd857c1598394a6ab1125de3c265 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -35,6 +35,7 @@
 #include <QtCore/QHash>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
+#include <QtCore/QList>
 #include <QtCore/QObject>
 #include <QtCore/QVariant>
 
@@ -48,13 +49,13 @@ public:
     explicit BuildConfiguration();
     BuildConfiguration(const QString &name);
     BuildConfiguration(const QString &name, BuildConfiguration *source);
+    void setName(const QString &name);
     QString name() const;
-    QVariant value(const QString &key) const;
-    void setValue(const QString &key, QVariant value);
-
-    QString displayName();
+    QString displayName() const;
     void setDisplayName(const QString &name);
 
+    QVariant value(const QString &key) const;
+    void setValue(const QString &key, QVariant value);
     QMap<QString, QVariant> toMap() const;
     void setValuesFromMap(QMap<QString, QVariant> map);
 
@@ -63,6 +64,25 @@ private:
     QString m_name;
 };
 
+class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory : public QObject
+{
+    Q_OBJECT
+
+public:
+    IBuildConfigurationFactory(QObject *parent = 0);
+    virtual ~IBuildConfigurationFactory();
+
+    // used to show the list of possible additons to a project, returns a list of types
+    virtual QStringList availableCreationTypes() const = 0;
+    // used to translate the types to names to display to the user
+    virtual QString displayNameForType(const QString &type) const = 0;
+
+    virtual QList<BuildConfiguration *> create(const QString &type) const = 0;
+// restore
+// clone
+    virtual QList<BuildConfiguration *> createDefaultConfigurations() const = 0;
+};
+
 } // namespace ProjectExplorer
 
 #endif // BUILDCONFIGURATION_H
diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h
index 3278064e57779273e9b3d5a81bbc3f7d319f7afb..f201015e58e3cf924b268868ceeaa6a970de4a54 100644
--- a/src/plugins/projectexplorer/buildmanager.h
+++ b/src/plugins/projectexplorer/buildmanager.h
@@ -69,6 +69,7 @@ public:
     //shows with focus
     void gotoTaskWindow();
 
+    //TODO these should take buildconfiguration object
     void buildProject(Project *p, const QString &configuration);
     void buildProjects(const QList<Project *> &projects, const QList<QString> &configurations);
     void cleanProject(Project *p, const QString &configuration);
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index 3fa72afca65913c9a476f6b1284b69cd2b1d0899..35967d4159f992104bc43024d40192f5efc318fb 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -171,7 +171,7 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
                              this, SLOT(cloneConfiguration()));
     m_addButton->setMenu(addButtonMenu);
 
-    m_buildConfiguration = m_project->activeBuildConfiguration();
+    m_buildConfiguration = m_project->activeBuildConfiguration()->name();
 
     connect(m_buildConfigurationComboBox, SIGNAL(currentIndexChanged(int)),
             this, SLOT(currentIndexChanged(int)));
@@ -220,9 +220,9 @@ void BuildSettingsWidget::updateBuildSettings()
         m_subWidgets->addWidget(subConfigWidget->displayName(), subConfigWidget);
 
     // Add tree items
-    foreach (const QString &buildConfiguration, m_project->buildConfigurations()) {
-        m_buildConfigurationComboBox->addItem(m_project->buildConfiguration(buildConfiguration)->displayName(), buildConfiguration);
-        if (buildConfiguration == m_buildConfiguration)
+    foreach (const BuildConfiguration *bc, m_project->buildConfigurations()) {
+        m_buildConfigurationComboBox->addItem(bc->displayName(), bc->name());
+        if (bc->name() == m_buildConfiguration)
             m_buildConfigurationComboBox->setCurrentIndex(m_buildConfigurationComboBox->count() - 1);
     }
 
@@ -256,40 +256,40 @@ void BuildSettingsWidget::activeBuildConfigurationChanged()
 
 void BuildSettingsWidget::createConfiguration()
 {
-    bool ok;
-    QString newBuildConfiguration = QInputDialog::getText(this, tr("New configuration"), tr("New Configuration Name:"), QLineEdit::Normal, QString(), &ok);
-    if (!ok || newBuildConfiguration.isEmpty())
-        return;
-
-    QString newDisplayName = newBuildConfiguration;
-    // Check that the internal name is not taken and use a different one otherwise
-    const QStringList &buildConfigurations = m_project->buildConfigurations();
-    if (buildConfigurations.contains(newBuildConfiguration)) {
-        int i = 2;
-        while (buildConfigurations.contains(newBuildConfiguration + QString::number(i)))
-            ++i;
-        newBuildConfiguration += QString::number(i);
-    }
-
-    // Check that we don't have a configuration with the same displayName
-    QStringList displayNames;
-    foreach (const QString &bc, buildConfigurations)
-        displayNames << m_project->buildConfiguration(bc)->displayName();
-
-    if (displayNames.contains(newDisplayName)) {
-        int i = 2;
-        while (displayNames.contains(newDisplayName + QString::number(i)))
-            ++i;
-        newDisplayName += QString::number(i);
-    }
-
-    if (m_project->newBuildConfiguration(newBuildConfiguration)) {
-        m_project->addBuildConfiguration(newBuildConfiguration);
-        m_project->setDisplayNameFor(newBuildConfiguration, newDisplayName);
-        m_buildConfiguration = newBuildConfiguration;
-
-        updateBuildSettings();
-    }
+//    bool ok;
+//    QString newBuildConfiguration = QInputDialog::getText(this, tr("New configuration"), tr("New Configuration Name:"), QLineEdit::Normal, QString(), &ok);
+//    if (!ok || newBuildConfiguration.isEmpty())
+//        return;
+//
+//    QString newDisplayName = newBuildConfiguration;
+//    // Check that the internal name is not taken and use a different one otherwise
+//    const QStringList &buildConfigurations = m_project->buildConfigurations();
+//    if (buildConfigurations.contains(newBuildConfiguration)) {
+//        int i = 2;
+//        while (buildConfigurations.contains(newBuildConfiguration + QString::number(i)))
+//            ++i;
+//        newBuildConfiguration += QString::number(i);
+//    }
+//
+//    // Check that we don't have a configuration with the same displayName
+//    QStringList displayNames;
+//    foreach (const QString &bc, buildConfigurations)
+//        displayNames << m_project->buildConfiguration(bc)->displayName();
+//
+//    if (displayNames.contains(newDisplayName)) {
+//        int i = 2;
+//        while (displayNames.contains(newDisplayName + QString::number(i)))
+//            ++i;
+//        newDisplayName += QString::number(i);
+//    }
+//
+//    if (m_project->newBuildConfiguration(newBuildConfiguration)) {
+//        m_project->addBuildConfiguration(newBuildConfiguration);
+//        m_project->setDisplayNameFor(newBuildConfiguration, newDisplayName);
+//        m_buildConfiguration = newBuildConfiguration;
+//
+//        updateBuildSettings();
+//    }
 }
 
 void BuildSettingsWidget::cloneConfiguration()
@@ -315,18 +315,17 @@ void BuildSettingsWidget::cloneConfiguration(const QString &sourceConfiguration)
 
     QString newDisplayName = newBuildConfiguration;
     // Check that the internal name is not taken and use a different one otherwise
-    const QStringList &buildConfigurations = m_project->buildConfigurations();
-    if (buildConfigurations.contains(newBuildConfiguration)) {
+    if (m_project->buildConfiguration(newBuildConfiguration)) {
         int i = 2;
-        while (buildConfigurations.contains(newBuildConfiguration + QString::number(i)))
+        while (m_project->buildConfiguration(newBuildConfiguration + QString::number(i)))
             ++i;
         newBuildConfiguration += QString::number(i);
     }
 
     // Check that we don't have a configuration with the same displayName
     QStringList displayNames;
-    foreach (const QString &bc, buildConfigurations)
-        displayNames << m_project->buildConfiguration(bc)->displayName();
+    foreach (const BuildConfiguration *bc, m_project->buildConfigurations())
+        displayNames << bc->displayName();
 
     if (displayNames.contains(newDisplayName)) {
         int i = 2;
@@ -347,25 +346,25 @@ void BuildSettingsWidget::deleteConfiguration(const QString &deleteConfiguration
     if (deleteConfiguration.isEmpty() || m_project->buildConfigurations().size() <= 1)
         return;
 
-    if (m_project->activeBuildConfiguration() == deleteConfiguration) {
-        foreach (const QString &otherConfiguration, m_project->buildConfigurations()) {
-            if (otherConfiguration != deleteConfiguration) {
-                m_project->setActiveBuildConfiguration(otherConfiguration);
+    if (m_project->activeBuildConfiguration()->name() == deleteConfiguration) {
+        foreach (BuildConfiguration *bc, m_project->buildConfigurations()) {
+            if (bc->name() != deleteConfiguration) {
+                m_project->setActiveBuildConfiguration(bc);
                 break;
             }
         }
     }
 
     if (m_buildConfiguration == deleteConfiguration) {
-        foreach (const QString &otherConfiguration, m_project->buildConfigurations()) {
-            if (otherConfiguration != deleteConfiguration) {
-                m_buildConfiguration = otherConfiguration;
+        foreach (const BuildConfiguration *bc, m_project->buildConfigurations()) {
+            if (bc->name() != deleteConfiguration) {
+                m_buildConfiguration = bc->name();
                 break;
             }
         }
     }
 
-    m_project->removeBuildConfiguration(deleteConfiguration);
+    m_project->removeBuildConfiguration(m_project->buildConfiguration(deleteConfiguration));
 
     updateBuildSettings();
 }
diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp
index c1bf25b3dcbe2d9bf07775e0c7d9ac9f7b00d869..16d737f2ff2f6d88ed01815e89bebb0253ab1b52 100644
--- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp
+++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp
@@ -142,7 +142,7 @@ CustomExecutableConfigurationWidget::CustomExecutableConfigurationWidget(CustomE
     vbox->addWidget(m_environmentWidget);
 
     changed();
-    
+
     connect(m_userName, SIGNAL(textEdited(QString)),
             this, SLOT(setUserName(QString)));
     connect(m_executableChooser, SIGNAL(changed(QString)),
@@ -314,7 +314,7 @@ QString CustomExecutableRunConfiguration::executable() const
         QString oldExecutable = m_executable;
         QString oldWorkingDirectory = m_workingDirectory;
         QStringList oldCmdArguments = m_cmdArguments;
-        
+
         if (dialog.exec()) {
             return executable();
         } else {
@@ -359,7 +359,6 @@ ProjectExplorer::Environment CustomExecutableRunConfiguration::baseEnvironment()
     } else  if (m_baseEnvironmentBase == CustomExecutableRunConfiguration::SystemEnvironmentBase) {
         env = ProjectExplorer::Environment::systemEnvironment();
     } else  if (m_baseEnvironmentBase == CustomExecutableRunConfiguration::BuildEnvironmentBase) {
-        QString config = project()->activeBuildConfiguration();
         env = project()->environment(project()->activeBuildConfiguration());
     }
     return env;
diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp
index 08acdbf8ebbc7ade7c29c54a5f25085813a5925a..7e1f5afb827d24c4b8f091da9dd85daa04b0b07c 100644
--- a/src/plugins/projectexplorer/processstep.cpp
+++ b/src/plugins/projectexplorer/processstep.cpp
@@ -45,17 +45,18 @@ ProcessStep::ProcessStep(Project *pro)
 
 }
 
-bool ProcessStep::init(const QString &buildConfiguration)
+bool ProcessStep::init(const QString &buildConfigurationName)
 {
-    setEnvironment(buildConfiguration, project()->environment(buildConfiguration));
-    QVariant wd = value(buildConfiguration, "workingDirectory").toString();
+    BuildConfiguration *bc = project()->buildConfiguration(buildConfigurationName);
+    setEnvironment(buildConfigurationName, project()->environment(bc));
+    QVariant wd = value(buildConfigurationName, "workingDirectory").toString();
     QString workingDirectory;
     if (!wd.isValid() || wd.toString().isEmpty())
         workingDirectory = "$BUILDDIR";
     else
         workingDirectory = wd.toString();
-    setWorkingDirectory(buildConfiguration, workingDirectory.replace("$BUILDDIR", project()->buildDirectory(buildConfiguration)));
-    return AbstractProcessStep::init(buildConfiguration);
+    setWorkingDirectory(buildConfigurationName, workingDirectory.replace("$BUILDDIR", project()->buildDirectory(bc)));
+    return AbstractProcessStep::init(buildConfigurationName);
 }
 
 void ProcessStep::run(QFutureInterface<bool> & fi)
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 3cf7932814904c2c6127293a1fc3f9817e2277c2..26e06b50cc786da69861c9dc617a4d1b5f0b5846 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -66,9 +66,9 @@ void Project::insertBuildStep(int position, BuildStep *step)
 {
     m_buildSteps.insert(position, step);
     // check that the step has all the configurations
-    foreach (const QString &name, buildConfigurations())
-        if (!step->getBuildConfiguration(name))
-            step->addBuildConfiguration(name);
+    foreach (const BuildConfiguration *bc, buildConfigurations())
+        if (!step->getBuildConfiguration(bc->name()))
+            step->addBuildConfiguration(bc->name());
 }
 
 void Project::removeBuildStep(int position)
@@ -87,9 +87,9 @@ void Project::insertCleanStep(int position, BuildStep *step)
 {
     m_cleanSteps.insert(position, step);
     // check that the step has all the configurations
-    foreach (const QString &name, buildConfigurations())
-        if (!step->getBuildConfiguration(name))
-            step->addBuildConfiguration(name);
+    foreach (const BuildConfiguration *bc, buildConfigurations())
+        if (!step->getBuildConfiguration(bc->name()))
+            step->addBuildConfiguration(bc->name());
 }
 
 void Project::removeCleanStep(int position)
@@ -104,49 +104,75 @@ void Project::moveCleanStepUp(int position)
     m_cleanSteps.insert(position - 1, bs);
 }
 
-void Project::addBuildConfiguration(const QString &name)
+void Project::addBuildConfiguration(BuildConfiguration *configuration)
 {
-    if (buildConfigurations().contains(name) )
-        return;
+    QStringList buildConfigurationNames;
+    foreach (const BuildConfiguration *bc, buildConfigurations())
+        buildConfigurationNames << bc->name();
 
-    m_buildConfigurationValues.push_back(new BuildConfiguration(name));
+    // Check that the internal name is not taken and use a different one otherwise
+    QString configurationName = configuration->name();
+    if (buildConfigurationNames.contains(configurationName)) {
+        int i = 2;
+        while (buildConfigurationNames.contains(configurationName + QString::number(i)))
+            ++i;
+        configurationName += QString::number(i);
+    }
+    configuration->setName(configurationName);
 
-    for (int i = 0; i != m_buildSteps.size(); ++i)
-        m_buildSteps.at(i)->addBuildConfiguration(name);
+    // Check that we don't have a configuration with the same displayName
+    QString configurationDisplayName = configuration->displayName();
+    QStringList displayNames;
+    foreach (const BuildConfiguration *bc, m_buildConfigurationValues)
+        displayNames << bc->displayName();
+    if (displayNames.contains(configurationDisplayName)) {
+        int i = 2;
+        while (displayNames.contains(configurationDisplayName + QString::number(i)))
+            ++i;
+        configurationDisplayName += QString::number(i);
+    }
+    configuration->setDisplayName(configurationDisplayName);
+
+    // add it
+    m_buildConfigurationValues.push_back(configuration);
 
+    // update build steps
+    for (int i = 0; i != m_buildSteps.size(); ++i)
+        m_buildSteps.at(i)->addBuildConfiguration(configuration->name());
     for (int i = 0; i != m_cleanSteps.size(); ++i)
-        m_cleanSteps.at(i)->addBuildConfiguration(name);
-    emit addedBuildConfiguration(this, name);
+        m_cleanSteps.at(i)->addBuildConfiguration(configuration->name());
+
+    emit addedBuildConfiguration(this, configuration->name());
 }
 
-void Project::removeBuildConfiguration(const QString &name)
+void Project::removeBuildConfiguration(BuildConfiguration *configuration)
 {
-    if (!buildConfigurations().contains(name))
+    //todo: this might be error prone
+    if (!buildConfigurations().contains(configuration))
         return;
 
     for (int i = 0; i != m_buildConfigurationValues.size(); ++i)
-        if (m_buildConfigurationValues.at(i)->name() == name) {
+        if (m_buildConfigurationValues.at(i)->name() == configuration->name()) {
             delete m_buildConfigurationValues.at(i);
             m_buildConfigurationValues.removeAt(i);
             break;
         }
 
     for (int i = 0; i != m_buildSteps.size(); ++i)
-        m_buildSteps.at(i)->removeBuildConfiguration(name);
+        m_buildSteps.at(i)->removeBuildConfiguration(configuration->name());
     for (int i = 0; i != m_cleanSteps.size(); ++i)
-        m_cleanSteps.at(i)->removeBuildConfiguration(name);
+        m_cleanSteps.at(i)->removeBuildConfiguration(configuration->name());
 
-    emit removedBuildConfiguration(this, name);
+    emit removedBuildConfiguration(this, configuration->name());
 }
 
 void Project::copyBuildConfiguration(const QString &source, const QString &dest)
 {
-    if (!buildConfigurations().contains(source))
+    BuildConfiguration *sourceConfiguration = buildConfiguration(source);
+    if (!sourceConfiguration)
         return;
 
-    for (int i = 0; i != m_buildConfigurationValues.size(); ++i)
-        if (m_buildConfigurationValues.at(i)->name() == source)
-            m_buildConfigurationValues.push_back(new BuildConfiguration(dest, m_buildConfigurationValues.at(i)));
+    m_buildConfigurationValues.push_back(new BuildConfiguration(dest, sourceConfiguration));
 
     for (int i = 0; i != m_buildSteps.size(); ++i)
         m_buildSteps.at(i)->copyBuildConfiguration(source, dest);
@@ -156,12 +182,9 @@ void Project::copyBuildConfiguration(const QString &source, const QString &dest)
     emit addedBuildConfiguration(this, dest);
 }
 
-QStringList Project::buildConfigurations() const
+QList<BuildConfiguration *> Project::buildConfigurations() const
 {
-    QStringList result;
-    foreach (BuildConfiguration *bc, m_buildConfigurationValues)
-        result << bc->name();
-    return result;
+    return m_buildConfigurationValues;
 }
 
 bool Project::hasBuildSettings() const
@@ -194,7 +217,7 @@ bool Project::restoreSettings()
         return false;
 
     if (m_activeBuildConfiguration.isEmpty() && !m_buildConfigurations.isEmpty())
-        setActiveBuildConfiguration(m_buildConfigurations.at(0));
+        setActiveBuildConfiguration(m_buildConfigurationValues.at(0));
 
     if (!m_activeRunConfiguration && !m_runConfigurations.isEmpty())
         setActiveRunConfiguration(m_runConfigurations.at(0));
@@ -213,10 +236,11 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     writer.saveValue("project", m_values);
 
     //save buildsettings
-    foreach (const QString &buildConfigurationName, buildConfigurations()) {
-        QMap<QString, QVariant> temp =
-            buildConfiguration(buildConfigurationName)->toMap();
-        writer.saveValue("buildConfiguration-" + buildConfigurationName, temp);
+    QStringList buildConfigurationNames;
+    foreach (const BuildConfiguration *bc, buildConfigurations()) {
+        QMap<QString, QVariant> temp = bc->toMap();
+        writer.saveValue("buildConfiguration-" + bc->name(), temp);
+        buildConfigurationNames << bc->name();
     }
 
     QStringList buildStepNames;
@@ -228,7 +252,6 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     foreach (BuildStep *cleanStep, cleanSteps())
         cleanStepNames << cleanStep->name();
     writer.saveValue("cleansteps", cleanStepNames);
-    QStringList buildConfigurationNames = buildConfigurations();
     writer.saveValue("buildconfigurations", buildConfigurationNames );
 
     //save buildstep configuration
@@ -294,10 +317,11 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
     // restoring BuldConfigurations from settings
     const QStringList buildConfigurationNames = reader.restoreValue("buildconfigurations").toStringList();
     foreach (const QString &buildConfigurationName, buildConfigurationNames) {
-        addBuildConfiguration(buildConfigurationName);
+        BuildConfiguration *bc = new BuildConfiguration(buildConfigurationName);
+        addBuildConfiguration(bc);
         QMap<QString, QVariant> temp =
             reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap();
-        buildConfiguration(buildConfigurationName)->setValuesFromMap(temp);
+        bc->setValuesFromMap(temp);
     }
 
     const QList<IBuildStepFactory *> buildStepFactories =
@@ -434,20 +458,19 @@ QVariant Project::value(const QString &buildConfigurationName, const QString &na
         return QVariant();
 }
 
-QString Project::activeBuildConfiguration() const
+BuildConfiguration *Project::activeBuildConfiguration() const
 {
-    return m_activeBuildConfiguration;
+    return buildConfiguration(m_activeBuildConfiguration); //TODO
 }
 
-void Project::setActiveBuildConfiguration(const QString &config)
+void Project::setActiveBuildConfiguration(BuildConfiguration *configuration)
 {
-    if (m_activeBuildConfiguration != config && buildConfigurations().contains(config)) {
-        m_activeBuildConfiguration = config;
+    if (m_activeBuildConfiguration != configuration->name() && m_buildConfigurationValues.contains(configuration)) {
+        m_activeBuildConfiguration = configuration->name();
         emit activeBuildConfigurationChanged();
     }
 }
 
-
 QList<QSharedPointer<RunConfiguration> > Project::runConfigurations() const
 {
     return m_runConfigurations;
@@ -468,7 +491,7 @@ void Project::removeRunConfiguration(QSharedPointer<RunConfiguration> runConfigu
     if(!m_runConfigurations.contains(runConfiguration)) {
         qWarning()<<"Not removing runConfiguration"<<runConfiguration->name()<<"becasue it doesn't exist";
         return;
-    }   
+    }
 
     if (m_activeRunConfiguration == runConfiguration) {
         if (m_runConfigurations.size() <= 1)
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index d81867feb975bc1e85605928051286a7c605c5ce..19b2aa0ff69968037b69bcfad21de85522af203d 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -57,6 +57,7 @@ class ProjectNode;
 class PersistentSettingsWriter;
 class PersistentSettingsReader;
 class BuildConfiguration;
+class IBuildConfigurationFactory;
 
 class PROJECTEXPLORER_EXPORT Project
     : public QObject
@@ -95,22 +96,22 @@ public:
     void moveCleanStepUp(int position);
 
     // Build configuration
-    void addBuildConfiguration(const QString &name);
-    void removeBuildConfiguration(const QString  &name);
+    void addBuildConfiguration(BuildConfiguration *configuration);
+    void removeBuildConfiguration(BuildConfiguration *configuration);
     void copyBuildConfiguration(const QString &source, const QString &dest);
     BuildConfiguration *buildConfiguration(const QString & name) const;
-    QStringList buildConfigurations() const;
+    QList<BuildConfiguration *> buildConfigurations() const;
     void setDisplayNameFor(const QString &buildConfiguration, const QString &displayName);
+    BuildConfiguration *activeBuildConfiguration() const;
+    void setActiveBuildConfiguration(BuildConfiguration *configuration);
+    void setValue(const QString &buildConfiguration, const QString &name, const QVariant &value);
+    QVariant value(const QString &buildConfiguration, const QString &name) const;
 
-    QString activeBuildConfiguration() const;
-    void setActiveBuildConfiguration(const QString& config);
+    virtual IBuildConfigurationFactory *buildConfigurationFactory() const = 0;
 
     void setValue(const QString &name, const QVariant &value);
     QVariant value(const QString &name) const;
 
-    void setValue(const QString &buildConfiguration, const QString &name, const QVariant &value);
-    QVariant value(const QString &buildConfiguration, const QString &name) const;
-
     // Running
     QList<QSharedPointer<RunConfiguration> > runConfigurations() const;
     void addRunConfiguration(QSharedPointer<RunConfiguration> runConfiguration);
@@ -121,8 +122,8 @@ public:
 
     EditorConfiguration *editorConfiguration() const;
 
-    virtual Environment environment(const QString &buildConfiguration) const = 0;
-    virtual QString buildDirectory(const QString &buildConfiguration) const = 0;
+    virtual Environment environment(BuildConfiguration *configuration) const = 0;
+    virtual QString buildDirectory(BuildConfiguration *configuration) const = 0;
 
     void saveSettings();
     bool restoreSettings();
@@ -130,11 +131,6 @@ public:
     virtual BuildConfigWidget *createConfigWidget() = 0;
     virtual QList<BuildConfigWidget*> subConfigWidgets();
 
-    /* This method is called for new build configurations. You should probably
-     * set some default values in this method.
-     */
-    virtual bool newBuildConfiguration(const QString &buildConfiguration) = 0;
-
     virtual ProjectNode *rootProjectNode() const = 0;
 
     enum FilesMode { AllFiles, ExcludeGeneratedFiles };
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 0fe7d8c3d26d7173d4fb18d5747bc159a29f4d85..f5ba13661dbadaa5b76b3f0e78e6e13047b952f1 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1415,14 +1415,14 @@ void ProjectExplorerPlugin::buildProjectOnly()
         qDebug() << "ProjectExplorerPlugin::buildProjectOnly";
 
     if (saveModifiedFiles())
-        buildManager()->buildProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration());
+        buildManager()->buildProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
 }
 
 static QStringList configurations(const QList<Project *> &projects)
 {
     QStringList result;
     foreach (const Project * pro, projects)
-        result << pro->activeBuildConfiguration();
+        result << pro->activeBuildConfiguration()->name();
     return result;
 }
 
@@ -1454,8 +1454,8 @@ void ProjectExplorerPlugin::rebuildProjectOnly()
         qDebug() << "ProjectExplorerPlugin::rebuildProjectOnly";
 
     if (saveModifiedFiles()) {
-        d->m_buildManager->cleanProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration());
-        d->m_buildManager->buildProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration());
+        d->m_buildManager->cleanProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
+        d->m_buildManager->buildProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
     }
 }
 
@@ -1493,7 +1493,7 @@ void ProjectExplorerPlugin::cleanProjectOnly()
         qDebug() << "ProjectExplorerPlugin::cleanProjectOnly";
 
     if (saveModifiedFiles())
-        d->m_buildManager->cleanProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration());
+        d->m_buildManager->cleanProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
 }
 
 void ProjectExplorerPlugin::cleanProject()
@@ -1915,15 +1915,15 @@ void ProjectExplorerPlugin::populateBuildConfigurationMenu()
     d->m_buildConfigurationActionGroup = new QActionGroup(d->m_buildConfigurationMenu);
     d->m_buildConfigurationMenu->clear();
     if (Project *pro = d->m_currentProject) {
-        const QString &activeBuildConfiguration = pro->activeBuildConfiguration();
-        foreach (const QString &buildConfiguration, pro->buildConfigurations()) {
-            QString displayName = pro->buildConfiguration(buildConfiguration)->displayName();
+        const BuildConfiguration *activeBC = pro->activeBuildConfiguration();
+        foreach (const BuildConfiguration *bc, pro->buildConfigurations()) {
+            QString displayName = bc->displayName();
             QAction *act = new QAction(displayName, d->m_buildConfigurationActionGroup);
             if (debug)
-                qDebug() << "BuildConfiguration " << buildConfiguration << "active: " << activeBuildConfiguration;
+                qDebug() << "BuildConfiguration " << bc->name() << "active: " << activeBC->name();
             act->setCheckable(true);
-            act->setChecked(buildConfiguration == activeBuildConfiguration);
-            act->setData(buildConfiguration);
+            act->setChecked(bc == activeBC);
+            act->setData(bc->name());
             d->m_buildConfigurationMenu->addAction(act);
         }
         d->m_buildConfigurationMenu->setEnabled(true);
@@ -1937,7 +1937,8 @@ void ProjectExplorerPlugin::buildConfigurationMenuTriggered(QAction *action)
     if (debug)
         qDebug() << "ProjectExplorerPlugin::buildConfigurationMenuTriggered";
 
-    d->m_currentProject->setActiveBuildConfiguration(action->data().toString());
+    d->m_currentProject->setActiveBuildConfiguration(d->m_currentProject->buildConfiguration(
+            action->data().toString()));
 }
 
 void ProjectExplorerPlugin::populateRunConfigurationMenu()
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index 04ba236a100467a183497f14effdce8200ecc826..633e75c0a5e07768bddfa9bcf0b5f773823ace1c 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -322,7 +322,7 @@ void RunConfigurationComboBox::activeRunConfigurationChanged()
     Project *startupProject = session->startupProject();
     if (startupProject) {
         int projectIndex = session->projects().indexOf(startupProject);
-        int runConfigurationIndex = startupProject->runConfigurations().indexOf(startupProject->activeRunConfiguration());        
+        int runConfigurationIndex = startupProject->runConfigurations().indexOf(startupProject->activeRunConfiguration());
         setCurrentIndex(convertTreeIndexToInt(projectIndex, runConfigurationIndex));
     } else {
         setCurrentIndex(-1);
@@ -401,7 +401,7 @@ void RunConfigurationComboBox::rebuildTree()
 {
     m_ignoreChange = true;
     clear();
-    
+
     SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
     Project *startupProject = session->startupProject();
     foreach(Project *p, session->projects()) {
@@ -435,10 +435,9 @@ BuildConfigurationComboBox::BuildConfigurationComboBox(Project *p, QWidget *pare
     addWidget(m_label);
 
     //m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
-    QStringList buildConfigurations = p->buildConfigurations();
-    foreach(const QString &buildConfiguration, buildConfigurations)
-        m_comboBox->addItem(p->buildConfiguration(buildConfiguration)->displayName(), buildConfiguration);
-    if (buildConfigurations.count() == 1) {
+    foreach(const BuildConfiguration *buildConfiguration, p->buildConfigurations())
+        m_comboBox->addItem(buildConfiguration->displayName(), buildConfiguration->name());
+    if (p->buildConfigurations().count() == 1) {
         m_label->setText(m_comboBox->itemText(0));
         setCurrentWidget(m_label);
     }
@@ -485,7 +484,7 @@ int BuildConfigurationComboBox::nameToIndex(const QString &buildConfiguration)
 
 void BuildConfigurationComboBox::activeConfigurationChanged()
 {
-    int index = nameToIndex(m_project->activeBuildConfiguration());
+    int index = nameToIndex(m_project->activeBuildConfiguration()->name());
     if (index == -1)
         return;
     ignoreIndexChange = true;
@@ -519,7 +518,8 @@ void BuildConfigurationComboBox::changedIndex(int newIndex)
 {
     if (newIndex == -1)
         return;
-    m_project->setActiveBuildConfiguration(m_comboBox->itemData(newIndex).toString());
+    m_project->setActiveBuildConfiguration(
+            m_project->buildConfiguration(m_comboBox->itemData(newIndex).toString()));
 }
 
 ///
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index 2e1133a16693a3b8e9979449535bf7fd6119a479..c237698667f12c84ccd584488ca902ed3a02b9fc 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -59,6 +59,7 @@
 
 using namespace QmlProjectManager;
 using namespace QmlProjectManager::Internal;
+using namespace ProjectExplorer;
 
 ////////////////////////////////////////////////////////////////////////////////////
 // QmlProject
@@ -161,8 +162,9 @@ QStringList QmlProject::convertToAbsoluteFiles(const QStringList &paths) const
 QStringList QmlProject::files() const
 { return m_files; }
 
-QString QmlProject::buildParser(const QString &) const
+QString QmlProject::buildParser(BuildConfiguration *configuration) const
 {
+    Q_UNUSED(configuration)
     return QString();
 }
 
@@ -196,13 +198,15 @@ bool QmlProject::hasBuildSettings() const
     return false;
 }
 
-ProjectExplorer::Environment QmlProject::environment(const QString &) const
+ProjectExplorer::Environment QmlProject::environment(BuildConfiguration *configuration) const
 {
+    Q_UNUSED(configuration)
     return ProjectExplorer::Environment::systemEnvironment();
 }
 
-QString QmlProject::buildDirectory(const QString &) const
+QString QmlProject::buildDirectory(BuildConfiguration *configuration) const
 {
+    Q_UNUSED(configuration)
     return QString();
 }
 
@@ -216,9 +220,9 @@ QList<ProjectExplorer::BuildConfigWidget*> QmlProject::subConfigWidgets()
     return QList<ProjectExplorer::BuildConfigWidget*>();
 }
 
-bool QmlProject::newBuildConfiguration(const QString &)
+ProjectExplorer::IBuildConfigurationFactory *QmlProject::buildConfigurationFactory() const
 {
-    return true;
+    return 0;
 }
 
 QmlProjectNode *QmlProject::rootProjectNode() const
diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h
index 08ac9aab71fabf78417b1a656400b751741051da..9e81a04d1eee3c18dedf3bc3f9b8f00fa1fe1302 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.h
+++ b/src/plugins/qmlprojectmanager/qmlproject.h
@@ -64,25 +64,25 @@ public:
     virtual QString name() const;
     virtual Core::IFile *file() const;
     virtual Manager *projectManager() const;
+    virtual ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const;
 
     virtual QList<ProjectExplorer::Project *> dependsOn();
 
     virtual bool isApplication() const;
     virtual bool hasBuildSettings() const;
 
-    virtual ProjectExplorer::Environment environment(const QString &buildConfiguration) const;
-    virtual QString buildDirectory(const QString &buildConfiguration) const;
+    virtual ProjectExplorer::Environment environment(ProjectExplorer::BuildConfiguration *configuration) const;
+    virtual QString buildDirectory(ProjectExplorer::BuildConfiguration *configuration) const;
 
     virtual ProjectExplorer::BuildConfigWidget *createConfigWidget();
     virtual QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
 
-    virtual bool newBuildConfiguration(const QString &buildConfiguration);
     virtual QmlProjectNode *rootProjectNode() const;
     virtual QStringList files(FilesMode fileMode) const;
 
     QStringList targets() const;
     QmlMakeStep *makeStep() const;
-    QString buildParser(const QString &buildConfiguration) const;
+    QString buildParser(ProjectExplorer::BuildConfiguration *configuration) const;
 
     enum RefreshOptions {
         Files         = 0x01,
diff --git a/src/plugins/qt4projectmanager/deployhelper.cpp b/src/plugins/qt4projectmanager/deployhelper.cpp
index 1d635ce7ce3f8ae3b5ee43f8146cc0d6b77ce0ef..0e87844ba913a7387dbcf2d59ba73ba93ec55b03 100644
--- a/src/plugins/qt4projectmanager/deployhelper.cpp
+++ b/src/plugins/qt4projectmanager/deployhelper.cpp
@@ -50,8 +50,7 @@ DeployHelperRunStep::DeployHelperRunStep(Qt4Project *pro)
 
 bool DeployHelperRunStep::init(const QString &configuration)
 {
-    Q_UNUSED(configuration)
-    m_qtdir = m_pro->qtDir(configuration);
+    m_qtdir = m_pro->qtDir(m_pro->buildConfiguration(configuration));
     QFileInfo fi(m_pro->file()->fileName());
     m_appdir = fi.absolutePath();
     //find target
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index acc1db3a8fcb832e3d4f18cc1b1e87b7361af911..13f9d7c1e0fe8704eb13c1f27f7108db5d229743 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -58,18 +58,19 @@ MakeStep::~MakeStep()
 bool MakeStep::init(const QString &name)
 {
     m_buildConfiguration = name;
-    Environment environment = project()->environment(name);
+    ProjectExplorer::BuildConfiguration *bc = project()->buildConfiguration(name);
+    Environment environment = project()->environment(bc);
     setEnvironment(name, environment);
 
     QString workingDirectory;
-    if (project()->value(name, "useShadowBuild").toBool())
-        workingDirectory = project()->value(name, "buildDirectory").toString();
+    if (bc->value("useShadowBuild").toBool())
+        workingDirectory = bc->value("buildDirectory").toString();
     if (workingDirectory.isEmpty())
         workingDirectory = QFileInfo(project()->file()->fileName()).absolutePath();
     setWorkingDirectory(name, workingDirectory);
 
     Qt4Project *qt4project = qobject_cast<Qt4Project *>(project());
-    QString makeCmd = qt4project->makeCommand(name);
+    QString makeCmd = qt4project->makeCommand(bc);
     if (!value(name, "makeCmd").toString().isEmpty())
         makeCmd = value(name, "makeCmd").toString();
     if (!QFileInfo(makeCmd).isAbsolute()) {
@@ -95,15 +96,15 @@ bool MakeStep::init(const QString &name)
     setIgnoreReturnValue(name, value(name, "cleanConfig").isValid());
     QStringList args = value(name, "makeargs").toStringList();
     if (!value(name, "cleanConfig").isValid()) {
-        if (!qt4project->defaultMakeTarget(name).isEmpty())
-            args << qt4project->defaultMakeTarget(name);
+        if (!qt4project->defaultMakeTarget(bc).isEmpty())
+            args << qt4project->defaultMakeTarget(bc);
     }
     // -w option enables "Enter"/"Leaving directory" messages, which we need for detecting the
     // absolute file path
     // FIXME doing this without the user having a way to override this is rather bad
     // so we only do it for unix and if the user didn't override the make command
     // but for now this is the least invasive change
-    ProjectExplorer::ToolChain *toolchain = qobject_cast<Qt4Project *>(project())->toolChain(name);
+    ProjectExplorer::ToolChain *toolchain = qt4project->toolChain(bc);
 
     ProjectExplorer::ToolChain::ToolChainType t =  ProjectExplorer::ToolChain::UNKNOWN;
     if (toolchain)
@@ -116,7 +117,7 @@ bool MakeStep::init(const QString &name)
     setEnabled(name, true);
     setArguments(name, args);
 
-    ProjectExplorer::ToolChain::ToolChainType type = qobject_cast<Qt4Project *>(project())->toolChain(name)->type();
+    ProjectExplorer::ToolChain::ToolChainType type = qt4project->toolChain(bc)->type();
     if ( type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE)
         setBuildParser(ProjectExplorer::Constants::BUILD_PARSER_MSVC);
     else
@@ -186,7 +187,9 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep)
 
 void MakeStepConfigWidget::updateMakeOverrideLabel()
 {
-    m_ui.makeLabel->setText(tr("Override %1:").arg(static_cast<Qt4Project *>(m_makeStep->project())->makeCommand(m_buildConfiguration)));
+    Qt4Project *qt4project = qobject_cast<Qt4Project *>(m_makeStep->project());
+    m_ui.makeLabel->setText(tr("Override %1:").arg(qt4project->
+        makeCommand(qt4project->buildConfiguration(m_buildConfiguration))));
 }
 
 void MakeStepConfigWidget::updateDetails()
@@ -194,17 +197,17 @@ void MakeStepConfigWidget::updateDetails()
     // TODO reduce heavy code duplication
     QString workingDirectory;
     Qt4Project *pro = static_cast<Qt4Project *>(m_makeStep->project());
-    if (pro->value(m_buildConfiguration, "useShadowBuild").toBool())
-        workingDirectory = pro->value(m_buildConfiguration, "buildDirectory").toString();
+    ProjectExplorer::BuildConfiguration *bc = pro->buildConfiguration(m_buildConfiguration);
+    if (bc->value("useShadowBuild").toBool())
+        workingDirectory = bc->value("buildDirectory").toString();
     if (workingDirectory.isEmpty())
         workingDirectory = QFileInfo(pro->file()->fileName()).absolutePath();
 
-    Qt4Project *qt4project = qobject_cast<Qt4Project *>(pro);
-    QString makeCmd = qt4project->makeCommand(m_buildConfiguration);
+    QString makeCmd = pro->makeCommand(bc);
     if (!m_makeStep->value(m_buildConfiguration, "makeCmd").toString().isEmpty())
         makeCmd = m_makeStep->value(m_buildConfiguration, "makeCmd").toString();
     if (!QFileInfo(makeCmd).isAbsolute()) {
-        Environment environment = pro->environment(m_buildConfiguration);
+        Environment environment = pro->environment(bc);
         // Try to detect command in environment
         QString tmp = environment.searchInPath(makeCmd);
         if (tmp == QString::null) {
@@ -221,7 +224,7 @@ void MakeStepConfigWidget::updateDetails()
     // but for now this is the least invasive change
     QStringList args = m_makeStep->value(m_buildConfiguration, "makeargs").toStringList();
     ProjectExplorer::ToolChain::ToolChainType t = ProjectExplorer::ToolChain::UNKNOWN;
-    ProjectExplorer::ToolChain *toolChain = qobject_cast<Qt4Project *>(pro)->toolChain(m_buildConfiguration);
+    ProjectExplorer::ToolChain *toolChain = pro->toolChain(bc);
     if (toolChain)
         t = toolChain->type();
     if (t != ProjectExplorer::ToolChain::MSVC && t != ProjectExplorer::ToolChain::WINCE) {
diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp
index 74125f4a6ab19c31f887cc5e038cb5c1907c3dc4..7bcb6ea849ef789a80fb1ad3cfa3d33169677a4d 100644
--- a/src/plugins/qt4projectmanager/projectloadwizard.cpp
+++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp
@@ -118,30 +118,25 @@ void ProjectLoadWizard::addBuildConfiguration(QString buildConfigurationName, Qt
     MakeStep *makeStep = m_project->makeStep();
 
     bool debug = qmakeBuildConfiguration & QtVersion::DebugBuild;
-    // Check that bc.name is not already in use
-    if (m_project->buildConfigurations().contains(buildConfigurationName)) {
-        int i =1;
-        do {
-            ++i;
-        } while (m_project->buildConfigurations().contains(buildConfigurationName + " " + QString::number(i)));
-        buildConfigurationName.append(" " + QString::number(i));
-    }
 
     // Add the buildconfiguration
-    m_project->addBuildConfiguration(buildConfigurationName);
-    qmakeStep->setValue(buildConfigurationName, "qmakeArgs", additionalArguments);
+    ProjectExplorer::BuildConfiguration *bc = new ProjectExplorer::BuildConfiguration(buildConfigurationName);
+    m_project->addBuildConfiguration(bc);
+    const QString &finalBuildConfigurationName = bc->name();
+    qmakeStep->setValue(finalBuildConfigurationName, "qmakeArgs", additionalArguments);
+
     // set some options for qmake and make
     if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets
-        makeStep->setValue(buildConfigurationName, "makeargs", QStringList() << (debug ? "debug" : "release"));
+        makeStep->setValue(finalBuildConfigurationName, "makeargs", QStringList() << (debug ? "debug" : "release"));
 
-    m_project->setValue(buildConfigurationName, "buildConfiguration", int(qmakeBuildConfiguration));
+    bc->setValue("buildConfiguration", int(qmakeBuildConfiguration));
 
     // Finally set the qt version
     bool defaultQtVersion = (qtversion == 0);
     if (defaultQtVersion)
-        m_project->setQtVersion(buildConfigurationName, 0);
+        m_project->setQtVersion(bc, 0);
     else
-        m_project->setQtVersion(buildConfigurationName, qtversion->uniqueId());
+        m_project->setQtVersion(bc, qtversion->uniqueId());
 }
 
 void ProjectLoadWizard::done(int result)
@@ -176,7 +171,7 @@ void ProjectLoadWizard::done(int result)
         // Not importing
         if (m_temporaryVersion)
             delete m_importVersion;
-        // Create default   
+        // Create default
         bool buildAll = false;
         QtVersion *defaultVersion = vm->version(0);
         if (defaultVersion && defaultVersion->isValid() && (defaultVersion->defaultBuildConfig() & QtVersion::BuildAll))
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index 8ef04206e3ce45e084fe98dab5a767a595335df8..93ddd014699b6166dabecae993c230c548755c23 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -59,18 +59,19 @@ QMakeStep::~QMakeStep()
 QStringList QMakeStep::arguments(const QString &buildConfiguration)
 {
     QStringList additonalArguments = value(buildConfiguration, "qmakeArgs").toStringList();
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
     QStringList arguments;
     arguments << project()->file()->fileName();
     if (!additonalArguments.contains("-spec")) {
-        arguments << "-spec" << m_pro->qtVersion(buildConfiguration)->mkspec();
+        arguments << "-spec" << m_pro->qtVersion(bc)->mkspec();
     }
 
     arguments << "-r";
 
-    if (project()->value(buildConfiguration, "buildConfiguration").isValid()) {
+    if (bc->value("buildConfiguration").isValid()) {
         QStringList configarguments;
-        QtVersion::QmakeBuildConfig defaultBuildConfiguration = m_pro->qtVersion(buildConfiguration)->defaultBuildConfig();
-        QtVersion::QmakeBuildConfig projectBuildConfiguration = QtVersion::QmakeBuildConfig(project()->value(buildConfiguration, "buildConfiguration").toInt());
+        QtVersion::QmakeBuildConfig defaultBuildConfiguration = m_pro->qtVersion(bc)->defaultBuildConfig();
+        QtVersion::QmakeBuildConfig projectBuildConfiguration = QtVersion::QmakeBuildConfig(bc->value("buildConfiguration").toInt());
         if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(projectBuildConfiguration & QtVersion::BuildAll))
             configarguments << "CONFIG-=debug_and_release";
         if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (projectBuildConfiguration & QtVersion::BuildAll))
@@ -94,7 +95,8 @@ QStringList QMakeStep::arguments(const QString &buildConfiguration)
 bool QMakeStep::init(const QString &name)
 {
     m_buildConfiguration = name;
-    const QtVersion *qtVersion = m_pro->qtVersion(name);
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(name);
+    const QtVersion *qtVersion = m_pro->qtVersion(bc);
 
 
     if (!qtVersion->isValid()) {
@@ -107,7 +109,7 @@ bool QMakeStep::init(const QString &name)
     }
 
     QStringList args = arguments(name);
-    QString workingDirectory = m_pro->buildDirectory(name);
+    QString workingDirectory = m_pro->buildDirectory(bc);
 
     QString program = qtVersion->qmakeCommand();
 
@@ -116,7 +118,7 @@ bool QMakeStep::init(const QString &name)
     if (QDir(workingDirectory).exists(QLatin1String("Makefile"))) {
         QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory);
         if (qtVersion->qmakeCommand() == qmakePath) {
-            needToRunQMake = !m_pro->compareBuildConfigurationToImportFrom(name, workingDirectory);
+            needToRunQMake = !m_pro->compareBuildConfigurationToImportFrom(bc, workingDirectory);
         }
     }
 
@@ -129,7 +131,7 @@ bool QMakeStep::init(const QString &name)
     setWorkingDirectory(name, workingDirectory);
     setCommand(name, program);
     setArguments(name, args);
-    setEnvironment(name, m_pro->environment(name));
+    setEnvironment(name, m_pro->environment(bc));
     return AbstractProcessStep::init(name);
 }
 
@@ -139,7 +141,7 @@ void QMakeStep::run(QFutureInterface<bool> &fi)
         fi.reportResult(true);
         return;
     }
-    
+
     if (!enabled(m_buildConfiguration)) {
         emit addToOutputWindow(tr("<font color=\"#0000ff\">Configuration unchanged, skipping QMake step.</font>"));
         fi.reportResult(true);
@@ -216,7 +218,8 @@ QString QMakeStepConfigWidget::summaryText() const
 
 void QMakeStepConfigWidget::updateTitleLabel()
 {
-    const QtVersion *qtVersion = static_cast<Qt4Project *>(m_step->project())->qtVersion(m_buildConfiguration);
+    Qt4Project *qt4project = qobject_cast<Qt4Project *>(m_step->project());
+    const QtVersion *qtVersion = qt4project->qtVersion(qt4project->buildConfiguration(m_buildConfiguration));
     if (!qtVersion) {
         m_summaryText = tr("<b>QMake:</b> No Qt version set. QMake can not be run.");
         emit updateSummary();
@@ -284,7 +287,8 @@ void QMakeStepConfigWidget::init(const QString &buildConfiguration)
 
 void QMakeStepConfigWidget::updateEffectiveQMakeCall()
 {
-    const QtVersion *qtVersion = static_cast<Qt4Project *>(m_step->project())->qtVersion(m_buildConfiguration);
+    Qt4Project *qt4project = qobject_cast<Qt4Project *>(m_step->project());
+    const QtVersion *qtVersion = qt4project->qtVersion(qt4project->buildConfiguration(m_buildConfiguration));
     if (qtVersion) {
         QString program = QFileInfo(qtVersion->qmakeCommand()).fileName();
         m_ui.qmakeArgumentsEdit->setPlainText(program + QLatin1Char(' ') + ProjectExplorer::Environment::joinArgumentList(m_step->arguments(m_buildConfiguration)));
diff --git a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp
index be348ef350291429e66e6d233b39cb474a5d005d..2d1b9fca335ef1e033d98fb8a5b7fa78fb12a3be 100644
--- a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp
@@ -79,20 +79,22 @@ void Qt4BuildEnvironmentWidget::init(const QString &buildConfiguration)
         qDebug() << "Qt4BuildConfigWidget::init()";
 
     m_buildConfiguration = buildConfiguration;
-
-    m_clearSystemEnvironmentCheckBox->setChecked(!m_pro->useSystemEnvironment(buildConfiguration));
-    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(buildConfiguration));
-    m_buildEnvironmentWidget->setUserChanges(m_pro->userEnvironmentChanges(buildConfiguration));
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
+    m_clearSystemEnvironmentCheckBox->setChecked(!m_pro->useSystemEnvironment(bc));
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(bc));
+    m_buildEnvironmentWidget->setUserChanges(m_pro->userEnvironmentChanges(bc));
     m_buildEnvironmentWidget->updateButtons();
 }
 
 void Qt4BuildEnvironmentWidget::environmentModelUserChangesUpdated()
 {
-    m_pro->setUserEnvironmentChanges(m_buildConfiguration, m_buildEnvironmentWidget->userChanges());
+    m_pro->setUserEnvironmentChanges(m_pro->buildConfiguration(m_buildConfiguration),
+                                     m_buildEnvironmentWidget->userChanges());
 }
 
 void Qt4BuildEnvironmentWidget::clearSystemEnvironmentCheckBoxClicked(bool checked)
 {
-    m_pro->setUseSystemEnvironment(m_buildConfiguration, !checked);
-    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(m_buildConfiguration));
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
+    m_pro->setUseSystemEnvironment(bc, !checked);
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(bc));
 }
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 601de6f52612ae627f06aee1b031438847351088..72ee7ab034559646ff7a76d8ac0fbe9fb5d00fcf 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -55,10 +55,12 @@
 #include <projectexplorer/nodesvisitor.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/customexecutablerunconfiguration.h>
+#include <utils/qtcassert.h>
 
 #include <QtCore/QDebug>
 #include <QtCore/QDir>
 #include <QtGui/QFileDialog>
+#include <QtGui/QInputDialog>
 
 using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
@@ -223,6 +225,52 @@ void Qt4ProjectFile::modified(Core::IFile::ReloadBehavior *)
 {
 }
 
+
+/*!
+  \class Qt4BuildConfigurationFactory
+*/
+
+Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(Qt4Project *project)
+    : IBuildConfigurationFactory(project),
+    m_project(project)
+{
+}
+
+Qt4BuildConfigurationFactory::~Qt4BuildConfigurationFactory()
+{
+}
+
+QStringList Qt4BuildConfigurationFactory::availableCreationTypes() const
+{
+    return QStringList() << "Create";
+}
+
+QString Qt4BuildConfigurationFactory::displayNameForType(const QString &type) const
+{
+    return tr("Create");
+}
+
+QList<BuildConfiguration *> Qt4BuildConfigurationFactory::create(const QString &type) const
+{
+    QTC_ASSERT(type == "Create", return QList<BuildConfiguration*>());
+    bool ok;
+    QString buildConfigurationName = QInputDialog::getText(0,
+                          tr("New configuration"),
+                          tr("New Configuration Name:"),
+                          QLineEdit::Normal,
+                          QString(),
+                          &ok);
+    if (!ok || buildConfigurationName.isEmpty())
+        return QList<BuildConfiguration *>();
+    BuildConfiguration *bc = new BuildConfiguration(buildConfigurationName);
+    return QList<BuildConfiguration *>() << bc;
+}
+
+QList<BuildConfiguration *> Qt4BuildConfigurationFactory::createDefaultConfigurations() const
+{
+    return QList<BuildConfiguration *>() << new BuildConfiguration;
+}
+
 /*!
   \class Qt4Project
 
@@ -233,6 +281,7 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
     m_manager(manager),
     m_rootProjectNode(0),
     m_nodesWatcher(new Internal::Qt4NodesWatcher(this)),
+    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
     m_fileInfo(new Qt4ProjectFile(this, fileName, this)),
     m_isApplication(true),
     m_projectFiles(new Qt4ProjectFiles),
@@ -261,7 +310,7 @@ void Qt4Project::defaultQtVersionChanged()
 void Qt4Project::qtVersionsChanged()
 {
     QtVersionManager *vm = QtVersionManager::instance();
-    foreach (QString bc, buildConfigurations()) {
+    foreach (BuildConfiguration *bc, buildConfigurations()) {
         if (!vm->version(qtVersionId(bc))->isValid()) {
             setQtVersion(bc, 0);
             if (bc == activeBuildConfiguration())
@@ -290,7 +339,7 @@ bool Qt4Project::restoreSettingsImpl(PersistentSettingsReader &settingsReader)
 
     // Ensure that the qt version and tool chain in each build configuration is valid
     // or if not, is reset to the default
-    foreach (const QString &bc, buildConfigurations()) {
+    foreach (BuildConfiguration *bc, buildConfigurations()) {
         qtVersionId(bc);
         toolChainType(bc);
     }
@@ -357,6 +406,11 @@ void Qt4Project::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &wri
     Project::saveSettingsImpl(writer);
 }
 
+ProjectExplorer::IBuildConfigurationFactory *Qt4Project::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
 namespace {
     class FindQt4ProFiles: protected ProjectExplorer::NodesVisitor {
         QList<Qt4ProFileNode *> m_proFiles;
@@ -384,10 +438,10 @@ void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFile
     m_proFilesForCodeModelUpdate.append(pro);
 }
 
-ProjectExplorer::ToolChain *Qt4Project::toolChain(const QString &buildConfiguration) const
+ProjectExplorer::ToolChain *Qt4Project::toolChain(BuildConfiguration *configuration) const
 {
     ProjectExplorer::ToolChain *tempToolChain;
-    tempToolChain = qtVersion(buildConfiguration)->createToolChain(toolChainType(buildConfiguration));
+    tempToolChain = qtVersion(configuration)->createToolChain(toolChainType(configuration));
     if (!ProjectExplorer::ToolChain::equals(m_toolChain, tempToolChain)) {
         if (m_toolChain)
             delete m_toolChain;
@@ -399,13 +453,13 @@ ProjectExplorer::ToolChain *Qt4Project::toolChain(const QString &buildConfigurat
     return m_toolChain;
 }
 
-QString Qt4Project::makeCommand(const QString &buildConfiguration) const
+QString Qt4Project::makeCommand(BuildConfiguration *configuration) const
 {
-    ToolChain *tc = toolChain(buildConfiguration);
+    ToolChain *tc = toolChain(configuration);
     return tc ? tc->makeCommand() : "make";
 }
 
-QString Qt4Project::defaultMakeTarget(const QString &buildConfiguration) const
+QString Qt4Project::defaultMakeTarget(BuildConfiguration *configuration) const
 {
 #ifdef QTCREATOR_WITH_S60
     ToolChain *tc = toolChain(buildConfiguration);
@@ -425,7 +479,7 @@ QString Qt4Project::defaultMakeTarget(const QString &buildConfiguration) const
         return (buildConfig & QtVersion::DebugBuild ? "debug-" : "release-") + QLatin1String("armv6");
     }
 #else
-    Q_UNUSED(buildConfiguration);
+    Q_UNUSED(configuration);
 #endif
     return QString::null;
 }
@@ -731,33 +785,27 @@ void Qt4Project::addDefaultBuild()
     } else {
         // Migrate settings
         QMakeStep *qs = qmakeStep();
-        foreach (const QString &buildConfiguration, buildConfigurations()) {
-            QVariant v = qs ? qs->value(buildConfiguration, "buildConfiguration") : QVariant();
+        foreach (BuildConfiguration *bc, buildConfigurations()) {
+            QVariant v = qs ? qs->value(bc->name(), "buildConfiguration") : QVariant();
             if (v.isValid()) {
-                qs->setValue(buildConfiguration, "buildConfiguration", QVariant());
-                setValue(buildConfiguration, "buildConfiguration", v);
-            } else if (!value(buildConfiguration, "buildConfiguration").isValid()) {
-                if (QtVersion *version = qtVersion(buildConfiguration))
-                    setValue(buildConfiguration, "buildConfiguration", version->defaultBuildConfig());
+                qs->setValue(bc->name(), "buildConfiguration", QVariant());
+                bc->setValue("buildConfiguration", v);
+            } else if (!bc->value("buildConfiguration").isValid()) {
+                if (QtVersion *version = qtVersion(bc))
+                    bc->setValue("buildConfiguration", version->defaultBuildConfig());
                 else
-                    setValue(buildConfiguration, "buildConfiguration", int(QtVersion::BuildAll & QtVersion::DebugBuild));
+                    bc->setValue("buildConfiguration", int(QtVersion::BuildAll & QtVersion::DebugBuild));
             }
         }
 
 
         // Restoring configuration
-        foreach(const QString &bc, buildConfigurations()) {
-            setValue(bc, "addQDumper", QVariant());
+        foreach(BuildConfiguration *bc, buildConfigurations()) {
+            bc->setValue("addQDumper", QVariant());
         }
     }
 }
 
-bool Qt4Project::newBuildConfiguration(const QString &buildConfiguration)
-{
-    Q_UNUSED(buildConfiguration)
-    return true;
-}
-
 void Qt4Project::proFileParseError(const QString &errorMessage)
 {
     Core::ICore::instance()->messageManager()->printToOutputPane(errorMessage);
@@ -768,92 +816,93 @@ Qt4ProFileNode *Qt4Project::rootProjectNode() const
     return m_rootProjectNode;
 }
 
-QString Qt4Project::buildDirectory(const QString &buildConfiguration) const
+QString Qt4Project::buildDirectory(BuildConfiguration *configuration) const
 {
     QString workingDirectory;
-    if (value(buildConfiguration, "useShadowBuild").toBool())
-        workingDirectory = value(buildConfiguration, "buildDirectory").toString();
+    if (configuration->value("useShadowBuild").toBool())
+        workingDirectory = configuration->value("buildDirectory").toString();
     if (workingDirectory.isEmpty())
         workingDirectory = QFileInfo(file()->fileName()).absolutePath();
     return workingDirectory;
 }
 
-ProjectExplorer::Environment Qt4Project::baseEnvironment(const QString &buildConfiguration) const
+ProjectExplorer::Environment Qt4Project::baseEnvironment(BuildConfiguration *configuration) const
 {
-    Environment env = useSystemEnvironment(buildConfiguration) ? Environment::systemEnvironment() : Environment();
-    qtVersion(buildConfiguration)->addToEnvironment(env);
-    ToolChain *tc = toolChain(buildConfiguration);
+    Environment env = useSystemEnvironment(configuration) ? Environment::systemEnvironment() : Environment();
+    qtVersion(configuration)->addToEnvironment(env);
+    ToolChain *tc = toolChain(configuration);
     if (tc)
         tc->addToEnvironment(env);
     return env;
 }
 
-ProjectExplorer::Environment Qt4Project::environment(const QString &buildConfiguration) const
+ProjectExplorer::Environment Qt4Project::environment(BuildConfiguration *configuration) const
 {
-    Environment env = baseEnvironment(buildConfiguration);
-    env.modify(userEnvironmentChanges(buildConfiguration));
+    Environment env = baseEnvironment(configuration);
+    env.modify(userEnvironmentChanges(configuration));
     return env;
 }
 
-void Qt4Project::setUseSystemEnvironment(const QString &buildConfiguration, bool b)
+void Qt4Project::setUseSystemEnvironment(BuildConfiguration *configuration, bool b)
 {
-    if (useSystemEnvironment(buildConfiguration) == b)
+    if (useSystemEnvironment(configuration) == b)
         return;
-    setValue(buildConfiguration, "clearSystemEnvironment", !b);
-    emit environmentChanged(buildConfiguration);
+    configuration->setValue("clearSystemEnvironment", !b);
+    emit environmentChanged(configuration->name());
 }
 
-bool Qt4Project::useSystemEnvironment(const QString &buildConfiguration) const
+bool Qt4Project::useSystemEnvironment(BuildConfiguration *configuration) const
 {
-    bool b = !(value(buildConfiguration, "clearSystemEnvironment").isValid() && value(buildConfiguration, "clearSystemEnvironment").toBool());
+    bool b = !(configuration->value("clearSystemEnvironment").isValid()
+               && configuration->value("clearSystemEnvironment").toBool());
     return b;
 }
 
-QList<ProjectExplorer::EnvironmentItem> Qt4Project::userEnvironmentChanges(const QString &buildConfig) const
+QList<ProjectExplorer::EnvironmentItem> Qt4Project::userEnvironmentChanges(BuildConfiguration *configuration) const
 {
-    return EnvironmentItem::fromStringList(value(buildConfig, "userEnvironmentChanges").toStringList());
+    return EnvironmentItem::fromStringList(configuration->value("userEnvironmentChanges").toStringList());
 }
 
-void Qt4Project::setUserEnvironmentChanges(const QString &buildConfig, const QList<ProjectExplorer::EnvironmentItem> &diff)
+void Qt4Project::setUserEnvironmentChanges(BuildConfiguration *configuration, const QList<ProjectExplorer::EnvironmentItem> &diff)
 {
     QStringList list = EnvironmentItem::toStringList(diff);
-    if (list == value(buildConfig, "userEnvironmentChanges").toStringList())
+    if (list == configuration->value("userEnvironmentChanges").toStringList())
         return;
-    setValue(buildConfig, "userEnvironmentChanges", list);
-    emit environmentChanged(buildConfig);
+    configuration->setValue("userEnvironmentChanges", list);
+    emit environmentChanged(configuration->name());
 }
 
-QString Qt4Project::qtDir(const QString &buildConfiguration) const
+QString Qt4Project::qtDir(BuildConfiguration *configuration) const
 {
-    QtVersion *version = qtVersion(buildConfiguration);
+    QtVersion *version = qtVersion(configuration);
     if (version)
         return version->versionInfo().value("QT_INSTALL_DATA");
     return QString::null;
 }
 
-QtVersion *Qt4Project::qtVersion(const QString &buildConfiguration) const
+QtVersion *Qt4Project::qtVersion(BuildConfiguration *configuration) const
 {
-    return QtVersionManager::instance()->version(qtVersionId(buildConfiguration));
+    return QtVersionManager::instance()->version(qtVersionId(configuration));
 }
 
-int Qt4Project::qtVersionId(const QString &buildConfiguration) const
+int Qt4Project::qtVersionId(BuildConfiguration *configuration) const
 {
     QtVersionManager *vm = QtVersionManager::instance();
     if (debug)
-        qDebug()<<"Looking for qtVersion ID of "<<buildConfiguration;
+        qDebug()<<"Looking for qtVersion ID of "<<configuration->name();
     int id = 0;
-    QVariant vid = value(buildConfiguration, "QtVersionId");
+    QVariant vid = configuration->value("QtVersionId");
     if (vid.isValid()) {
         id = vid.toInt();
         if (vm->version(id)->isValid()) {
             return id;
         } else {
-            const_cast<Qt4Project *>(this)->setValue(buildConfiguration, "QtVersionId", 0);
+            configuration->setValue("QtVersionId", 0);
             return 0;
         }
     } else {
         // Backward compatibilty, we might have just the name:
-        QString vname = value(buildConfiguration, "QtVersion").toString();
+        QString vname = configuration->value("QtVersion").toString();
         if (debug)
             qDebug()<<"  Backward compatibility reading QtVersion"<<vname;
         if (!vname.isEmpty()) {
@@ -862,7 +911,7 @@ int Qt4Project::qtVersionId(const QString &buildConfiguration) const
                 if (version->name() == vname) {
                     if (debug)
                         qDebug()<<"found name in versions";
-                    const_cast<Qt4Project *>(this)->setValue(buildConfiguration, "QtVersionId", version->uniqueId());
+                    configuration->setValue("QtVersionId", version->uniqueId());
                     return version->uniqueId();
                 }
             }
@@ -871,19 +920,19 @@ int Qt4Project::qtVersionId(const QString &buildConfiguration) const
     if (debug)
         qDebug()<<"  using qtversion with id ="<<id;
     // Nothing found, reset to default
-    const_cast<Qt4Project *>(this)->setValue(buildConfiguration, "QtVersionId", id);
+    configuration->setValue("QtVersionId", id);
     return id;
 }
 
-void Qt4Project::setQtVersion(const QString &buildConfiguration, int id)
+void Qt4Project::setQtVersion(BuildConfiguration *configuration, int id)
 {
-    setValue(buildConfiguration, "QtVersionId", id);
+    configuration->setValue("QtVersionId", id);
     updateActiveRunConfiguration();
 }
 
-void Qt4Project::setToolChainType(const QString &buildConfiguration, ProjectExplorer::ToolChain::ToolChainType type)
+void Qt4Project::setToolChainType(BuildConfiguration *configuration, ProjectExplorer::ToolChain::ToolChainType type)
 {
-    setValue(buildConfiguration, "ToolChain", (int)type);
+    configuration->setValue("ToolChain", (int)type);
     updateActiveRunConfiguration();
 }
 
@@ -902,16 +951,16 @@ void Qt4Project::updateActiveRunConfiguration()
     emit invalidateCachedTargetInformation();
 }
 
-ProjectExplorer::ToolChain::ToolChainType Qt4Project::toolChainType(const QString &buildConfiguration) const
+ProjectExplorer::ToolChain::ToolChainType Qt4Project::toolChainType(BuildConfiguration *configuration) const
 {
     const ProjectExplorer::ToolChain::ToolChainType originalType =
-        (ProjectExplorer::ToolChain::ToolChainType)value(buildConfiguration, "ToolChain").toInt();
+        (ProjectExplorer::ToolChain::ToolChainType)configuration->value("ToolChain").toInt();
     ProjectExplorer::ToolChain::ToolChainType type = originalType;
-    const QtVersion *version = qtVersion(buildConfiguration);
+    const QtVersion *version = qtVersion(configuration);
     if (!version->possibleToolChainTypes().contains(type)) // use default tool chain
         type = version->defaultToolchainType();
     if (type != originalType)
-        const_cast<Qt4Project *>(this)->setToolChainType(buildConfiguration, type);
+        const_cast<Qt4Project *>(this)->setToolChainType(configuration, type);
     return type;
 }
 
@@ -1142,22 +1191,22 @@ QString Qt4Project::extractSpecFromArgumentList(const QStringList &list)
 }
 
 // returns true if both are equal
-bool Qt4Project::compareBuildConfigurationToImportFrom(const QString &buildConfiguration, const QString &workingDirectory)
+bool Qt4Project::compareBuildConfigurationToImportFrom(BuildConfiguration *configuration, const QString &workingDirectory)
 {
     QMakeStep *qs = qmakeStep();
     if (QDir(workingDirectory).exists(QLatin1String("Makefile")) && qs) {
         QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory);
-        QtVersion *version = qtVersion(buildConfiguration);
+        QtVersion *version = qtVersion(configuration);
         if (version->qmakeCommand() == qmakePath) {
             // same qtversion
             QPair<QtVersion::QmakeBuildConfig, QStringList> result =
                     QtVersionManager::scanMakeFile(workingDirectory, version->defaultBuildConfig());
-            if (QtVersion::QmakeBuildConfig(value(buildConfiguration, "buildConfiguration").toInt()) == result.first) {
+            if (QtVersion::QmakeBuildConfig(configuration->value("buildConfiguration").toInt()) == result.first) {
                 // The QMake Build Configuration are the same,
                 // now compare arguments lists
                 // we have to compare without the spec/platform cmd argument
                 // and compare that on its own
-                QString actualSpec = extractSpecFromArgumentList(qs->value(buildConfiguration, "qmakeArgs").toStringList());
+                QString actualSpec = extractSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList());
                 if (actualSpec.isEmpty())
                     actualSpec = version->mkspec();
 
@@ -1186,7 +1235,7 @@ bool Qt4Project::compareBuildConfigurationToImportFrom(const QString &buildConfi
                 if (QFileInfo(parsedSpec).isRelative())
                     parsedSpec = QDir::cleanPath(workingDirectory + "/" + parsedSpec);
 
-                QStringList actualArgs = removeSpecFromArgumentList(qs->value(buildConfiguration, "qmakeArgs").toStringList());
+                QStringList actualArgs = removeSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList());
                 QStringList parsedArgs = removeSpecFromArgumentList(result.second);
 
 #ifdef Q_OS_WIN
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index c9f4ae0f3034af685323fdb322182882b3b332f3..2d63fcc037153c6af0de81a514e2bab347e812b4 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -39,6 +39,7 @@
 #include <projectexplorer/applicationrunconfiguration.h>
 #include <projectexplorer/projectnodes.h>
 #include <projectexplorer/toolchain.h>
+#include <projectexplorer/buildconfiguration.h>
 #include <cpptools/cppmodelmanagerinterface.h>
 
 #include <QtCore/QObject>
@@ -116,6 +117,24 @@ private:
     QString m_filePath;
 };
 
+class Qt4BuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
+{
+    Q_OBJECT
+
+public:
+    Qt4BuildConfigurationFactory(Qt4Project *project);
+    ~Qt4BuildConfigurationFactory();
+
+    QStringList availableCreationTypes() const;
+    QString displayNameForType(const QString &type) const;
+
+    QList<ProjectExplorer::BuildConfiguration *> create(const QString &type) const;
+    QList<ProjectExplorer::BuildConfiguration *> createDefaultConfigurations() const;
+
+private:
+    Qt4Project *m_project;
+};
+
 class Qt4Project : public ProjectExplorer::Project
 {
     Q_OBJECT
@@ -128,6 +147,7 @@ public:
     Core::IFile *file() const;
     ProjectExplorer::IProjectManager *projectManager() const;
     Qt4Manager *qt4ProjectManager() const;
+    ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const;
 
     QList<Core::IFile *> dependencies();     //NBS remove
     QList<ProjectExplorer::Project *>dependsOn();
@@ -139,38 +159,37 @@ public:
     virtual QStringList files(FilesMode fileMode) const;
 
     //building environment
-    ProjectExplorer::Environment environment(const QString &buildConfiguration) const;
-    ProjectExplorer::Environment baseEnvironment(const QString &buildConfiguration) const;
-    void setUserEnvironmentChanges(const QString &buildConfig, const QList<ProjectExplorer::EnvironmentItem> &diff);
-    QList<ProjectExplorer::EnvironmentItem> userEnvironmentChanges(const QString &buildConfig) const;
-    bool useSystemEnvironment(const QString &buildConfiguration) const;
-    void setUseSystemEnvironment(const QString &buildConfiguration, bool b);
-
-    virtual QString buildDirectory(const QString &buildConfiguration) const;
+    ProjectExplorer::Environment environment(ProjectExplorer::BuildConfiguration *configuration) const;
+    ProjectExplorer::Environment baseEnvironment(ProjectExplorer::BuildConfiguration *configuration) const;
+    void setUserEnvironmentChanges(ProjectExplorer::BuildConfiguration *configuration, const QList<ProjectExplorer::EnvironmentItem> &diff);
+    QList<ProjectExplorer::EnvironmentItem> userEnvironmentChanges(ProjectExplorer::BuildConfiguration *configuration) const;
+    bool useSystemEnvironment(ProjectExplorer::BuildConfiguration *configuration) const;
+    void setUseSystemEnvironment(ProjectExplorer::BuildConfiguration *configuration, bool b);
+
+    virtual QString buildDirectory(ProjectExplorer::BuildConfiguration *configuration) const;
     // returns the CONFIG variable from the .pro file
     QStringList qmakeConfig() const;
     // returns the qtdir (depends on the current QtVersion)
-    QString qtDir(const QString &buildConfiguration) const;
+    QString qtDir(ProjectExplorer::BuildConfiguration *configuration) const;
     //returns the qtVersion, if the project is set to use the default qt version, then
     // that is returned
     // to check wheter the project uses the default qt version use qtVersionId
-    QtVersion *qtVersion(const QString &buildConfiguration) const;
+    QtVersion *qtVersion(ProjectExplorer::BuildConfiguration *configuration) const;
 
     // returns the id of the qt version, if the project is using the default qt version
     // this function returns 0
-    int qtVersionId(const QString &buildConfiguration) const;
+    int qtVersionId(ProjectExplorer::BuildConfiguration *configuration) const;
     //returns the name of the qt version, might be QString::Null, which means default qt version
     // qtVersion is in general the better method to use
-    QString qtVersionName(const QString &buildConfiguration) const;
-    ProjectExplorer::ToolChain *toolChain(const QString &buildConfiguration) const;
-    void setToolChainType(const QString &buildConfiguration, ProjectExplorer::ToolChain::ToolChainType type);
-    ProjectExplorer::ToolChain::ToolChainType toolChainType(const QString &buildConfiguration) const;
+    QString qtVersionName(ProjectExplorer::BuildConfiguration *configuration) const;
+    ProjectExplorer::ToolChain *toolChain(ProjectExplorer::BuildConfiguration *configuration) const;
+    void setToolChainType(ProjectExplorer::BuildConfiguration *configuration, ProjectExplorer::ToolChain::ToolChainType type);
+    ProjectExplorer::ToolChain::ToolChainType toolChainType(ProjectExplorer::BuildConfiguration *configuration) const;
 
     ProjectExplorer::BuildConfigWidget *createConfigWidget();
     QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
 
-    void setQtVersion(const QString &buildConfiguration, int id);
-    virtual bool newBuildConfiguration(const QString &buildConfiguration);
+    void setQtVersion(ProjectExplorer::BuildConfiguration *configuration, int id);
 
     QList<Internal::Qt4ProFileNode *> applicationProFiles() const;
 
@@ -184,8 +203,8 @@ public:
 
     void notifyChanged(const QString &name);
 
-    QString makeCommand(const QString &buildConfiguration) const;
-    QString defaultMakeTarget(const QString &buildConfiguration) const;
+    QString makeCommand(ProjectExplorer::BuildConfiguration *configuration) const;
+    QString defaultMakeTarget(ProjectExplorer::BuildConfiguration *configuration) const;
 
     // Is called by qmakestep qt4configurationwidget if the settings change
     // Informs all Qt4RunConfigurations that their cached values are now invalid
@@ -196,7 +215,7 @@ public:
     virtual QStringList includePaths(const QString &fileName) const;
     virtual QStringList frameworkPaths(const QString &fileName) const;
 
-    bool compareBuildConfigurationToImportFrom(const QString &buildConfiguration, const QString &workingDirectory);
+    bool compareBuildConfigurationToImportFrom(ProjectExplorer::BuildConfiguration *configuration, const QString &workingDirectory);
 
     static QStringList removeSpecFromArgumentList(const QStringList &old);
     static QString extractSpecFromArgumentList(const QStringList &list);
@@ -242,6 +261,7 @@ private:
     Qt4Manager *m_manager;
     Internal::Qt4ProFileNode *m_rootProjectNode;
     Internal::Qt4NodesWatcher *m_nodesWatcher;
+    Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
 
     Qt4ProjectFile *m_fileInfo;
     bool m_isApplication;
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 2105f0499638c0dcc33c1177b996b21f37f3ad5b..539cfd105bf6ca89b9cc5297e3656ac6a3d15d03 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -136,9 +136,10 @@ void Qt4ProjectConfigWidget::toggleDetails()
 
 void Qt4ProjectConfigWidget::updateDetails()
 {
-    QtVersion *version = m_pro->qtVersion(m_buildConfiguration);
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
+    QtVersion *version = m_pro->qtVersion(bc);
     QString versionString;
-    if (m_pro->qtVersionId(m_buildConfiguration) == 0) {
+    if (m_pro->qtVersionId(bc) == 0) {
         versionString = tr("Default Qt Version (%1)").arg(version->name());
     } else if(version){
         versionString = version->name();
@@ -150,8 +151,8 @@ void Qt4ProjectConfigWidget::updateDetails()
                                  "with tool chain <b>%2</b><br>"
                                  "building in <b>%3</b>")
                               .arg(versionString,
-                                   ProjectExplorer::ToolChain::toolChainName(m_pro->toolChainType(m_buildConfiguration)),
-                                   QDir::toNativeSeparators(m_pro->buildDirectory(m_buildConfiguration))));
+                                   ProjectExplorer::ToolChain::toolChainName(m_pro->toolChainType(bc)),
+                                   QDir::toNativeSeparators(m_pro->buildDirectory(bc))));
 }
 
 void Qt4ProjectConfigWidget::manageQtVersions()
@@ -172,16 +173,16 @@ void Qt4ProjectConfigWidget::init(const QString &buildConfiguration)
         qDebug() << "Qt4ProjectConfigWidget::init()";
 
     m_buildConfiguration = buildConfiguration;
-
-    m_ui->nameLineEdit->setText(m_pro->buildConfiguration(m_buildConfiguration)->displayName());
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
+    m_ui->nameLineEdit->setText(bc->displayName());
 
     setupQtVersionsComboBox();
 
-    bool shadowBuild = m_pro->value(buildConfiguration, "useShadowBuild").toBool();
+    bool shadowBuild = bc->value("useShadowBuild").toBool();
     m_ui->shadowBuildCheckBox->setChecked(shadowBuild);
     m_ui->shadowBuildDirEdit->setEnabled(shadowBuild);
     m_browseButton->setEnabled(shadowBuild);
-    m_ui->shadowBuildDirEdit->setPath(m_pro->buildDirectory(buildConfiguration));
+    m_ui->shadowBuildDirEdit->setPath(m_pro->buildDirectory(bc));
     updateImportLabel();
     updateToolChainCombo();
     updateDetails();
@@ -205,7 +206,8 @@ void Qt4ProjectConfigWidget::setupQtVersionsComboBox()
     m_ui->qtVersionComboBox->clear();
     m_ui->qtVersionComboBox->addItem(tr("Default Qt Version (%1)").arg(vm->defaultVersion()->name()), 0);
 
-    if (m_pro->qtVersionId(m_buildConfiguration) == 0) {
+    int qtVersionId = m_pro->qtVersionId(m_pro->buildConfiguration(m_buildConfiguration));
+    if (qtVersionId == 0) {
         m_ui->qtVersionComboBox->setCurrentIndex(0);
         m_ui->invalidQtWarningLabel->setVisible(false);
     }
@@ -214,7 +216,7 @@ void Qt4ProjectConfigWidget::setupQtVersionsComboBox()
     for (int i = 0; i < versions.size(); ++i) {
         m_ui->qtVersionComboBox->addItem(versions.at(i)->name(), versions.at(i)->uniqueId());
 
-        if (versions.at(i)->uniqueId() == m_pro->qtVersionId(m_buildConfiguration)) {
+        if (versions.at(i)->uniqueId() == qtVersionId) {
             m_ui->qtVersionComboBox->setCurrentIndex(i + 1);
             m_ui->invalidQtWarningLabel->setVisible(!versions.at(i)->isValid());
         }
@@ -251,8 +253,9 @@ void Qt4ProjectConfigWidget::updateImportLabel()
 
     // we only show if we actually have a qmake and makestep
     if (m_pro->qmakeStep() && m_pro->makeStep()) {
-        QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(m_pro->buildDirectory(m_buildConfiguration));
-        QtVersion *version = m_pro->qtVersion(m_buildConfiguration);
+        ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
+        QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(m_pro->buildDirectory(bc));
+        QtVersion *version = m_pro->qtVersion(bc);
         // check that there's a makefile
         if (!qmakePath.isEmpty()) {
             // and that the qmake path is different from the current version
@@ -261,7 +264,7 @@ void Qt4ProjectConfigWidget::updateImportLabel()
                 visible = true;
             } else {
                 // check that the qmake flags, arguments match
-                visible = !m_pro->compareBuildConfigurationToImportFrom(m_buildConfiguration, m_pro->buildDirectory(m_buildConfiguration));
+                visible = !m_pro->compareBuildConfigurationToImportFrom(bc, m_pro->buildDirectory(bc));
             }
         } else {
             visible = false;
@@ -289,7 +292,8 @@ void Qt4ProjectConfigWidget::importLabelClicked()
 {
     if (!m_pro->qmakeStep() || !m_pro->makeStep())
         return;
-    QString directory = m_pro->buildDirectory(m_buildConfiguration);
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
+    QString directory = m_pro->buildDirectory(bc);
     if (!directory.isEmpty()) {
         QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(directory);
         if (!qmakePath.isEmpty()) {
@@ -317,14 +321,14 @@ void Qt4ProjectConfigWidget::importLabelClicked()
             }
 
             // So we got all the information now apply it...
-            m_pro->setQtVersion(m_buildConfiguration, version->uniqueId());
+            m_pro->setQtVersion(bc, version->uniqueId());
             // Combo box will be updated at the end
 
             QMakeStep *qmakeStep = m_pro->qmakeStep();
             qmakeStep->setQMakeArguments(m_buildConfiguration, additionalArguments);
             MakeStep *makeStep = m_pro->makeStep();
 
-            m_pro->setValue(m_buildConfiguration, "buildConfiguration", int(qmakeBuildConfig));
+            bc->setValue("buildConfiguration", int(qmakeBuildConfig));
             // Adjust command line arguments, this is ugly as hell
             // If we are switching to BuildAll we want "release" in there and no "debug"
             // or "debug" in there and no "release"
@@ -358,8 +362,8 @@ void Qt4ProjectConfigWidget::qtVersionComboBoxCurrentIndexChanged(const QString
     QtVersionManager *vm = QtVersionManager::instance();
     bool isValid = vm->version(newQtVersion)->isValid();
     m_ui->invalidQtWarningLabel->setVisible(!isValid);
-    if (newQtVersion != m_pro->qtVersionId(m_buildConfiguration)) {
-        m_pro->setQtVersion(m_buildConfiguration, newQtVersion);
+    if (newQtVersion != m_pro->qtVersionId(m_pro->buildConfiguration(m_buildConfiguration))) {
+        m_pro->setQtVersion(m_pro->buildConfiguration(m_buildConfiguration), newQtVersion);
         updateToolChainCombo();
         m_pro->update();
     }
@@ -369,13 +373,14 @@ void Qt4ProjectConfigWidget::qtVersionComboBoxCurrentIndexChanged(const QString
 void Qt4ProjectConfigWidget::updateToolChainCombo()
 {
     m_ui->toolChainComboBox->clear();
-    QList<ProjectExplorer::ToolChain::ToolChainType> toolchains = m_pro->qtVersion(m_buildConfiguration)->possibleToolChainTypes();
+    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
+    QList<ProjectExplorer::ToolChain::ToolChainType> toolchains = m_pro->qtVersion(bc)->possibleToolChainTypes();
     using namespace ProjectExplorer;
     foreach (ToolChain::ToolChainType toolchain, toolchains) {
         m_ui->toolChainComboBox->addItem(ToolChain::toolChainName(toolchain), qVariantFromValue(toolchain));
     }
     m_ui->toolChainComboBox->setEnabled(toolchains.size() > 1);
-    setToolChain(toolchains.indexOf(m_pro->toolChainType(m_buildConfiguration)));
+    setToolChain(toolchains.indexOf(m_pro->toolChainType(bc)));
 }
 
 void Qt4ProjectConfigWidget::selectToolChain(int index)
@@ -389,7 +394,7 @@ void Qt4ProjectConfigWidget::setToolChain(int index)
     ProjectExplorer::ToolChain::ToolChainType selectedToolChainType =
         m_ui->toolChainComboBox->itemData(index,
             Qt::UserRole).value<ProjectExplorer::ToolChain::ToolChainType>();
-    m_pro->setToolChainType(m_buildConfiguration, selectedToolChainType);
+    m_pro->setToolChainType(m_pro->buildConfiguration(m_buildConfiguration), selectedToolChainType);
     if (m_ui->toolChainComboBox->currentIndex() != index)
         m_ui->toolChainComboBox->setCurrentIndex(index);
     updateDetails();
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
index f0e9c56a0b6269227720917a5d1ab77402e8c323..04d32a826baa7892d4e59c172f8ead1d5d844ec0 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
@@ -262,8 +262,7 @@ void Qt4Manager::runQMake(ProjectExplorer::Project *p)
         return;
     //found qmakeStep, now use it
     qs->setForced(true);
-    const QString &config = p->activeBuildConfiguration();
-    m_projectExplorer->buildManager()->appendStep(qs, config);
+    m_projectExplorer->buildManager()->appendStep(qs, p->activeBuildConfiguration()->name());
 }
 
 QString Qt4Manager::fileTypeId(ProjectExplorer::FileType type)
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index 249386e2eb096d5635dd372348cc8bcef755b89d..cd5e80664cc8965eea5c7ce17fb9f7a76bf8d058 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -491,7 +491,6 @@ ProjectExplorer::Environment Qt4RunConfiguration::baseEnvironment() const
     } else  if (m_baseEnvironmentBase == Qt4RunConfiguration::SystemEnvironmentBase) {
         env = ProjectExplorer::Environment::systemEnvironment();
     } else  if (m_baseEnvironmentBase == Qt4RunConfiguration::BuildEnvironmentBase) {
-        QString config = project()->activeBuildConfiguration();
         env = project()->environment(project()->activeBuildConfiguration());
     }
     if (m_isUsingDyldImageSuffix) {
@@ -582,7 +581,7 @@ void Qt4RunConfiguration::updateTarget()
 
     // Find out what flags we pass on to qmake, this code is duplicated in the qmake step
     QtVersion::QmakeBuildConfig defaultBuildConfiguration = pro->qtVersion(pro->activeBuildConfiguration())->defaultBuildConfig();
-    QtVersion::QmakeBuildConfig projectBuildConfiguration = QtVersion::QmakeBuildConfig(pro->value(pro->activeBuildConfiguration(), "buildConfiguration").toInt());
+    QtVersion::QmakeBuildConfig projectBuildConfiguration = QtVersion::QmakeBuildConfig(pro->activeBuildConfiguration()->value("buildConfiguration").toInt());
     QStringList addedUserConfigArguments;
     QStringList removedUserConfigArguments;
     if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(projectBuildConfiguration & QtVersion::BuildAll))