diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 4cf0a7439195651ee548ff8037995ca35c9192fa..76c260b40acbcd1a90ca303c81143eed965e8c9c 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -33,14 +33,14 @@
 using namespace CMakeProjectManager;
 using namespace Internal;
 
-CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *pro, const QString &name)
-    : BuildConfiguration(pro, name)
+CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeProject *pro)
+    : BuildConfiguration(pro)
 {
 
 }
 
-CMakeBuildConfiguration::CMakeBuildConfiguration(const QString &name, BuildConfiguration *source)
-    : BuildConfiguration(name, source)
+CMakeBuildConfiguration::CMakeBuildConfiguration(BuildConfiguration *source)
+    : BuildConfiguration(source)
 {
 
 }
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
index 2152b8bb2383c108abcbc2e00c85f9fabdc51fde..3eb716007796f6956b62016f9b5241f499f97e5f 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
@@ -40,8 +40,8 @@ class CMakeProject;
 class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
 public:
-    CMakeBuildConfiguration(CMakeProject *pro, const QString &name);
-    CMakeBuildConfiguration(const QString &name, BuildConfiguration *source);
+    CMakeBuildConfiguration(CMakeProject *pro);
+    CMakeBuildConfiguration(BuildConfiguration *source);
 };
 
 
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp
index ecae63b84113badada6ea0652f77a5879e7d6688..5aa29db27324988a533d0be7ad7e6a1db0662d4a 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.cpp
@@ -41,7 +41,7 @@ using namespace CMakeProjectManager;
 using namespace CMakeProjectManager::Internal;
 
 CMakeBuildEnvironmentWidget::CMakeBuildEnvironmentWidget(CMakeProject *project)
-    : BuildConfigWidget(), m_pro(project)
+    : BuildConfigWidget(), m_pro(project), m_buildConfiguration(0)
 {
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setMargin(0);
@@ -63,29 +63,26 @@ QString CMakeBuildEnvironmentWidget::displayName() const
     return tr("Build Environment");
 }
 
-void CMakeBuildEnvironmentWidget::init(const QString &buildConfigurationName)
+void CMakeBuildEnvironmentWidget::init(ProjectExplorer::BuildConfiguration *bc)
 {
     if (debug)
         qDebug() << "Qt4BuildConfigWidget::init()";
 
-    m_buildConfiguration = buildConfigurationName;
+    m_buildConfiguration = bc;
 
-    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_clearSystemEnvironmentCheckBox->setChecked(!m_pro->useSystemEnvironment(m_buildConfiguration));
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(m_buildConfiguration));
+    m_buildEnvironmentWidget->setUserChanges(m_pro->userEnvironmentChanges(m_buildConfiguration));
     m_buildEnvironmentWidget->updateButtons();
 }
 
 void CMakeBuildEnvironmentWidget::environmentModelUserChangesUpdated()
 {
-    m_pro->setUserEnvironmentChanges(
-            m_pro->buildConfiguration(m_buildConfiguration), m_buildEnvironmentWidget->userChanges());
+    m_pro->setUserEnvironmentChanges(m_buildConfiguration, m_buildEnvironmentWidget->userChanges());
 }
 
 void CMakeBuildEnvironmentWidget::clearSystemEnvironmentCheckBoxClicked(bool checked)
 {
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    m_pro->setUseSystemEnvironment(bc, !checked);
-    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(bc));
+    m_pro->setUseSystemEnvironment(m_buildConfiguration, !checked);
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(m_buildConfiguration));
 }
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.h b/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.h
index e059783849aa26d2e9bc512ef08a27208339f901..c732044b9d479ecacb0583882f15c4de886034f2 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildenvironmentwidget.h
@@ -51,7 +51,7 @@ public:
     CMakeBuildEnvironmentWidget(CMakeProject *project);
 
     QString displayName() const;
-    void init(const QString &buildConfiguration);
+    void init(ProjectExplorer::BuildConfiguration *bc);
 
 private slots:
     void environmentModelUserChangesUpdated();
@@ -61,7 +61,7 @@ private:
     ProjectExplorer::EnvironmentWidget *m_buildEnvironmentWidget;
     QCheckBox *m_clearSystemEnvironmentCheckBox;
     CMakeProject *m_pro;
-    QString m_buildConfiguration;
+    ProjectExplorer::BuildConfiguration *m_buildConfiguration;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 9c42cbf1b128894e4223574c51f54475105c4c96..08ea3b45e996921f53508c9e5a778f693718db3e 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -104,7 +104,8 @@ BuildConfiguration *CMakeBuildConfigurationFactory::create(const QString &type)
                           &ok);
     if (!ok || buildConfigurationName.isEmpty())
         return false;
-    BuildConfiguration *bc = new CMakeBuildConfiguration(m_project, buildConfigurationName);
+    BuildConfiguration *bc = new CMakeBuildConfiguration(m_project);
+    bc->setDisplayName(buildConfigurationName);
 
     MakeStep *makeStep = new MakeStep(bc);
     bc->insertBuildStep(0, makeStep);
@@ -133,17 +134,17 @@ BuildConfiguration *CMakeBuildConfigurationFactory::create(const QString &type)
     return bc;
 }
 
-BuildConfiguration *CMakeBuildConfigurationFactory::clone(const QString &name, ProjectExplorer::BuildConfiguration *source) const
+BuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::BuildConfiguration *source) const
 {
     CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source);
-    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(name, old);
+    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(old);
     m_project->addBuildConfiguration(bc);
     return bc;
 }
 
-BuildConfiguration *CMakeBuildConfigurationFactory::restore(const QString &name) const
+BuildConfiguration *CMakeBuildConfigurationFactory::restore() const
 {
-    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(m_project, name);
+    CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(m_project);
     return bc;
 }
 
@@ -590,7 +591,7 @@ void CMakeProject::setUseSystemEnvironment(BuildConfiguration *configuration, bo
     if (b == useSystemEnvironment(configuration))
         return;
     configuration->setValue("clearSystemEnvironment", !b);
-    emit environmentChanged(configuration->name());
+    emit environmentChanged(configuration);
 }
 
 bool CMakeProject::useSystemEnvironment(BuildConfiguration *configuration) const
@@ -611,7 +612,7 @@ void CMakeProject::setUserEnvironmentChanges(BuildConfiguration *configuration,
     if (list == configuration->value("userEnvironmentChanges"))
         return;
     configuration->setValue("userEnvironmentChanges", list);
-    emit environmentChanged(configuration->name());
+    emit environmentChanged(configuration);
 }
 
 QString CMakeProject::buildDirectory(BuildConfiguration *configuration) const
@@ -664,7 +665,8 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
         if (copw.exec() != QDialog::Accepted)
             return false;
 
-        CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(this, "all");
+        CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(this);
+        bc->setDisplayName("all");
         addBuildConfiguration(bc);
         bc->setValue("msvcVersion", copw.msvcVersion());
         if (!copw.buildDirectory().isEmpty())
@@ -792,7 +794,7 @@ void CMakeFile::modified(ReloadBehavior *behavior)
 }
 
 CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeProject *project)
-    : m_project(project)
+    : m_project(project), m_buildConfiguration(0)
 {
     QFormLayout *fl = new QFormLayout(this);
     fl->setContentsMargins(20, -1, 0, -1);
@@ -821,10 +823,9 @@ QString CMakeBuildSettingsWidget::displayName() const
     return "CMake";
 }
 
-void CMakeBuildSettingsWidget::init(const QString &buildConfigurationName)
+void CMakeBuildSettingsWidget::init(BuildConfiguration *bc)
 {
-    m_buildConfiguration = buildConfigurationName;
-    BuildConfiguration *bc = m_project->buildConfiguration(buildConfigurationName);
+    m_buildConfiguration = bc;
     m_pathLineEdit->setText(m_project->buildDirectory(bc));
     if (m_project->buildDirectory(bc) == m_project->sourceDirectory())
         m_changeButton->setEnabled(false);
@@ -834,14 +835,13 @@ void CMakeBuildSettingsWidget::init(const QString &buildConfigurationName)
 
 void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog()
 {
-    BuildConfiguration *bc = m_project->buildConfiguration(m_buildConfiguration);
     CMakeOpenProjectWizard copw(m_project->projectManager(),
                                 m_project->sourceDirectory(),
-                                m_project->buildDirectory(bc),
-                                m_project->environment(bc));
+                                m_project->buildDirectory(m_buildConfiguration),
+                                m_project->environment(m_buildConfiguration));
     if (copw.exec() == QDialog::Accepted) {
-        m_project->changeBuildDirectory(bc, copw.buildDirectory());
-        m_pathLineEdit->setText(m_project->buildDirectory(bc));
+        m_project->changeBuildDirectory(m_buildConfiguration, copw.buildDirectory());
+        m_pathLineEdit->setText(m_project->buildDirectory(m_buildConfiguration));
     }
 }
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 6e61e7889f81604d86031d5ee43acda498f6d765..f9e694dc6af8a4fd0d0b38a5e5b9bde3804d17b0 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -74,8 +74,8 @@ public:
     QString displayNameForType(const QString &type) const;
 
     ProjectExplorer::BuildConfiguration *create(const QString &type) const;
-    ProjectExplorer::BuildConfiguration *clone(const QString &name, ProjectExplorer::BuildConfiguration *source) const;
-    ProjectExplorer::BuildConfiguration *restore(const QString &name) const;
+    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::BuildConfiguration *source) const;
+    ProjectExplorer::BuildConfiguration *restore() const;
 
 private:
     CMakeProject *m_project;
@@ -232,14 +232,14 @@ public:
 
     // This is called to set up the config widget before showing it
     // buildConfiguration is QString::null for the non buildConfiguration specific page
-    virtual void init(const QString &buildConfiguration);
+    virtual void init(ProjectExplorer::BuildConfiguration *bc);
 private slots:
     void openChangeBuildDirectoryDialog();
 private:
     CMakeProject *m_project;
     QLineEdit *m_pathLineEdit;
     QPushButton *m_changeButton;
-    QString m_buildConfiguration;
+    ProjectExplorer::BuildConfiguration *m_buildConfiguration;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
index da290d66a7199aeb1abc66379d29a05ffcb6cff0..fc4c5868adefdaf9e29a84722cd9be59e01d66d1 100644
--- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
@@ -58,7 +58,7 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeProject *pro, const QString &t
     connect(pro, SIGNAL(activeBuildConfigurationChanged()),
             this, SIGNAL(baseEnvironmentChanged()));
 
-    connect(pro, SIGNAL(environmentChanged(QString)),
+    connect(pro, SIGNAL(environmentChanged(ProjectExplorer::BuildConfiguration *)),
             this, SIGNAL(baseEnvironmentChanged()));
 }
 
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index e0ea03b4f92f791cbef8ab78ecdbb7277f0e9648..7e49f180c2d0ed30a8c57dfddec01f39e8ca8e89 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -202,7 +202,8 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep)
     fl->addRow(tr("Targets:"), m_targetsList);
 
     // TODO update this list also on rescans of the CMakeLists.txt
-    CMakeProject *pro = m_makeStep->project();
+    // TODO shouldn't be accessing project
+    CMakeProject *pro = static_cast<CMakeProject *>(m_makeStep->buildConfiguration()->project());
     foreach(const QString& target, pro->targets()) {
         QListWidgetItem *item = new QListWidgetItem(target, m_targetsList);
         item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
@@ -251,11 +252,10 @@ void MakeStepConfigWidget::updateDetails()
 {
     QStringList arguments = m_makeStep->m_buildTargets;
     arguments << m_makeStep->additionalArguments();
-    m_summaryText = tr("<b>Make:</b> %1 %2")
-                    .arg(m_makeStep->project()->toolChain(
-                            m_makeStep->buildConfiguration())
-                            ->makeCommand(),
-                         arguments.join(" "));
+
+    BuildConfiguration *bc = m_makeStep->buildConfiguration();
+    CMakeProject *pro = static_cast<CMakeProject *>(bc->project());
+    m_summaryText = tr("<b>Make:</b> %1 %2").arg(pro->toolChain(bc)->makeCommand(), arguments.join(" "));
     emit updateSummary();
 }
 
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index 9e1f05a7ea5cfe62e2ca007071a432192fb6f6cf..7a64c538536f13d690ee6cd53c52a910f0acb91e 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -34,14 +34,14 @@ using namespace GenericProjectManager;
 using namespace GenericProjectManager::Internal;
 using ProjectExplorer::BuildConfiguration;
 
-GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro, const QString &name)
-    : BuildConfiguration(pro, name)
+GenericBuildConfiguration::GenericBuildConfiguration(GenericProject *pro)
+    : BuildConfiguration(pro)
 {
 
 }
 
-GenericBuildConfiguration::GenericBuildConfiguration(const QString &name, GenericBuildConfiguration *source)
-    : BuildConfiguration(name, source)
+GenericBuildConfiguration::GenericBuildConfiguration(GenericBuildConfiguration *source)
+    : BuildConfiguration(source)
 {
 
 }
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
index 5cfd664032d9bb159de19a6c206a5f476823d5e2..aa812c396d5ec5b80d8487da7c69fd8719f1564a 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
@@ -41,8 +41,8 @@ class GenericProject;
 class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
 public:
-    GenericBuildConfiguration(GenericProject *pro, const QString &name);
-    GenericBuildConfiguration(const QString &name, GenericBuildConfiguration *source);
+    GenericBuildConfiguration(GenericProject *pro);
+    GenericBuildConfiguration(GenericBuildConfiguration *source);
 };
 
 } // namespace GenericProjectManager
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 676636e002069ed83e9e486861d71ad74aaf7796..fcbc50e7667c42af69e1c5d09e2665ce7be658a3 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -146,7 +146,8 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(const QString &type
                           &ok);
     if (!ok || buildConfigurationName.isEmpty())
         return false;
-    GenericBuildConfiguration *bc = new GenericBuildConfiguration(m_project, buildConfigurationName);
+    GenericBuildConfiguration *bc = new GenericBuildConfiguration(m_project);
+    bc->setDisplayName(buildConfigurationName);
     m_project->addBuildConfiguration(bc); // also makes the name unique...
 
     GenericMakeStep *makeStep = new GenericMakeStep(bc);
@@ -155,17 +156,17 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(const QString &type
     return bc;
 }
 
-BuildConfiguration *GenericBuildConfigurationFactory::clone(const QString &name, BuildConfiguration *source) const
+BuildConfiguration *GenericBuildConfigurationFactory::clone(BuildConfiguration *source) const
 {
     // TODO
-    GenericBuildConfiguration *bc = new GenericBuildConfiguration(name, static_cast<GenericBuildConfiguration *>(source));
+    GenericBuildConfiguration *bc = new GenericBuildConfiguration(static_cast<GenericBuildConfiguration *>(source));
     m_project->addBuildConfiguration(bc);
     return bc;
 }
 
-BuildConfiguration *GenericBuildConfigurationFactory::restore(const QString &name) const
+BuildConfiguration *GenericBuildConfigurationFactory::restore() const
 {
-    GenericBuildConfiguration *bc = new GenericBuildConfiguration(m_project, name);
+    GenericBuildConfiguration *bc = new GenericBuildConfiguration(m_project);
     return bc;
 }
 
@@ -533,7 +534,8 @@ bool GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead
     Project::restoreSettingsImpl(reader);
 
     if (buildConfigurations().isEmpty()) {
-        GenericBuildConfiguration *bc = new GenericBuildConfiguration(this, "all");
+        GenericBuildConfiguration *bc = new GenericBuildConfiguration(this);
+        bc->setDisplayName("all");
         addBuildConfiguration(bc);
 
         GenericMakeStep *makeStep = new GenericMakeStep(bc);
@@ -589,7 +591,7 @@ void GenericProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter
 ////////////////////////////////////////////////////////////////////////////////////
 
 GenericBuildSettingsWidget::GenericBuildSettingsWidget(GenericProject *project)
-    : m_project(project)
+    : m_project(project), m_buildConfiguration(0)
 {
     QFormLayout *fl = new QFormLayout(this);
     fl->setContentsMargins(0, -1, 0, -1);
@@ -625,15 +627,15 @@ GenericBuildSettingsWidget::~GenericBuildSettingsWidget()
 QString GenericBuildSettingsWidget::displayName() const
 { return tr("Generic Manager"); }
 
-void GenericBuildSettingsWidget::init(const QString &buildConfigurationName)
+void GenericBuildSettingsWidget::init(BuildConfiguration *bc)
 {
-    m_buildConfiguration = buildConfigurationName;
-    m_pathChooser->setPath(m_project->buildDirectory(m_project->buildConfiguration(buildConfigurationName)));
+    m_buildConfiguration = bc;
+    m_pathChooser->setPath(m_project->buildDirectory(bc));
 }
 
 void GenericBuildSettingsWidget::buildDirectoryChanged()
 {
-    m_project->buildConfiguration(m_buildConfiguration)->setValue("buildDirectory", m_pathChooser->path());
+    m_buildConfiguration->setValue("buildDirectory", m_pathChooser->path());
 }
 
 void GenericBuildSettingsWidget::toolChainSelected(int index)
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 6ad13b2bda81d09e20d90cb2274d60d2810e1d69..cba88fc4abead964bee7cf63ea34564ec7e89290 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -67,8 +67,8 @@ public:
     QString displayNameForType(const QString &type) const;
 
     ProjectExplorer::BuildConfiguration *create(const QString &type) const;
-    ProjectExplorer::BuildConfiguration *clone(const QString &name, ProjectExplorer::BuildConfiguration *source) const;
-    ProjectExplorer::BuildConfiguration *restore(const QString &name) const;
+    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::BuildConfiguration *source) const;
+    ProjectExplorer::BuildConfiguration *restore() const;
 
 private:
     GenericProject *m_project;
@@ -195,7 +195,7 @@ public:
 
     virtual QString displayName() const;
 
-    virtual void init(const QString &buildConfiguration);
+    virtual void init(ProjectExplorer::BuildConfiguration *bc);
 
 private Q_SLOTS:
     void buildDirectoryChanged();
@@ -204,7 +204,7 @@ private Q_SLOTS:
 private:
     GenericProject *m_project;
     Utils::PathChooser *m_pathChooser;
-    QString m_buildConfiguration;
+    ProjectExplorer::BuildConfiguration *m_buildConfiguration;
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 3c80b43b5d5f0335cbcd5910f0eaed6c35700c11..fe3b32f05bc09755f230cb6bd3ab522cd391a794 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -44,14 +44,14 @@ IBuildStepFactory *findFactory(const QString &name)
     return 0;
 }
 
-BuildConfiguration::BuildConfiguration(Project *pro, const QString &name)
-    : m_name(name), m_project(pro)
+BuildConfiguration::BuildConfiguration(Project *pro)
+    : m_project(pro)
 {
-    setDisplayName(name);
+
 }
 
-BuildConfiguration::BuildConfiguration(const QString &name, BuildConfiguration *source)
-    : m_values(source->m_values), m_name(name), m_project(source->m_project)
+BuildConfiguration::BuildConfiguration(BuildConfiguration *source)
+    : m_values(source->m_values), m_project(source->m_project)
 {
     foreach(BuildStep *originalbs, source->buildSteps()) {
         IBuildStepFactory *factory = findFactory(originalbs->name());
@@ -71,16 +71,6 @@ BuildConfiguration::~BuildConfiguration()
     qDeleteAll(m_cleanSteps);
 }
 
-void BuildConfiguration::setName(const QString &name)
-{
-    m_name = name;
-}
-
-QString BuildConfiguration::name() const
-{
-    return m_name;
-}
-
 QString BuildConfiguration::displayName() const
 {
     QVariant v = value("ProjectExplorer.BuildConfiguration.DisplayName");
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index 2f7f05c1cfc36571f767e4c9678951e0723f4afe..40cb5a4a787e98069038f3fde69c3f68167b0ad6 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -53,7 +53,6 @@ public:
     // ctors are protected
     virtual ~BuildConfiguration();
 
-    QString name() const;
     QString displayName() const;
     void setDisplayName(const QString &name);
 
@@ -77,19 +76,15 @@ public:
     Project *project() const;
 
 protected:
-    BuildConfiguration(Project * project, const QString &name);
-    BuildConfiguration(const QString &name, BuildConfiguration *source);
+    BuildConfiguration(Project * project);
+    BuildConfiguration(BuildConfiguration *source);
 
 private:
-    void setName(const QString &name);
-
     QList<BuildStep *> m_buildSteps;
     QList<BuildStep *> m_cleanSteps;
 
     QHash<QString, QVariant> m_values;
-    QString m_name;
     Project *m_project;
-    friend class Project; // for setName
 };
 
 class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory : public QObject
@@ -110,24 +105,21 @@ public:
     virtual BuildConfiguration *create(const QString &type) const = 0;
 
     // clones a given BuildConfiguration and adds it to the project
-    virtual BuildConfiguration *clone(const QString &name, BuildConfiguration *source) const = 0;
+    virtual BuildConfiguration *clone(BuildConfiguration *source) const = 0;
 
     // restores a BuildConfiguration with the name and adds it to the project
-    virtual BuildConfiguration *restore(const QString &name) const = 0;
+    virtual BuildConfiguration *restore() const = 0;
 
 
     // TODO All those methods make the internal name (and display name) unique,
     // but in different ways
 
-
-// to come:
-// restore
-// clone
-
 signals:
     void availableCreationTypesChanged();
 };
 
 } // namespace ProjectExplorer
 
+Q_DECLARE_METATYPE(ProjectExplorer::BuildConfiguration *);
+
 #endif // BUILDCONFIGURATION_H
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index 4f5a27a0192a058ad6306cfdb237c2be2b3468ff..dde844b1fb32539f91f8fa4f50ec9c8281bcf5f5 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -351,20 +351,12 @@ void BuildManager::buildQueueAppend(BuildStep * bs)
     incrementActiveBuildSteps(bs->buildConfiguration()->project());
 }
 
-void BuildManager::buildProjects(const QList<Project *> &projects, const QList<QString> &configurations)
+void BuildManager::buildProjects(const QList<BuildConfiguration *> &configurations)
 {
-    Q_ASSERT(projects.count() == configurations.count());
-    QList<QString>::const_iterator cit = configurations.constBegin();
-    QList<Project *>::const_iterator it, end;
-    end = projects.constEnd();
-
-    for (it = projects.constBegin(); it != end; ++it, ++cit) {
-        if (*cit != QString::null) {
-            BuildConfiguration *bc = (*it)->buildConfiguration(*cit);
-            QList<BuildStep *> buildSteps = bc->buildSteps();
-            foreach (BuildStep *bs, buildSteps) {
-                buildQueueAppend(bs);
-            }
+    foreach(BuildConfiguration *bc, configurations) {
+        QList<BuildStep *> buildSteps = bc->buildSteps();
+        foreach (BuildStep *bs, buildSteps) {
+            buildQueueAppend(bs);
         }
     }
     if (ProjectExplorerPlugin::instance()->projectExplorerSettings().showCompilerOutput)
@@ -372,20 +364,12 @@ void BuildManager::buildProjects(const QList<Project *> &projects, const QList<Q
     startBuildQueue();
 }
 
-void BuildManager::cleanProjects(const QList<Project *> &projects, const QList<QString> &configurations)
+void BuildManager::cleanProjects(const QList<BuildConfiguration *> &configurations)
 {
-    Q_ASSERT(projects.count() == configurations.count());
-    QList<QString>::const_iterator cit = configurations.constBegin();
-    QList<Project *>::const_iterator it, end;
-    end = projects.constEnd();
-
-    for (it = projects.constBegin(); it != end; ++it, ++cit) {
-        if (*cit != QString::null) {
-            BuildConfiguration *bc = (*it)->buildConfiguration(*cit);
-            QList<BuildStep *> cleanSteps = bc->cleanSteps();
-            foreach (BuildStep *bs, cleanSteps) {
-                buildQueueAppend(bs);
-            }
+    foreach(BuildConfiguration *bc, configurations) {
+        QList<BuildStep *> cleanSteps = bc->cleanSteps();
+        foreach (BuildStep *bs, cleanSteps) {
+            buildQueueAppend(bs);
         }
     }
     if (ProjectExplorerPlugin::instance()->projectExplorerSettings().showCompilerOutput)
@@ -393,14 +377,14 @@ void BuildManager::cleanProjects(const QList<Project *> &projects, const QList<Q
     startBuildQueue();
 }
 
-void BuildManager::buildProject(Project *p, const QString &configuration)
+void BuildManager::buildProject(BuildConfiguration *configuration)
 {
-    buildProjects(QList<Project *>() << p, QList<QString>() << configuration);
+    buildProjects(QList<BuildConfiguration *>() << configuration);
 }
 
-void BuildManager::cleanProject(Project *p, const QString &configuration)
+void BuildManager::cleanProject(BuildConfiguration *configuration)
 {
-    cleanProjects(QList<Project *>() << p, QList<QString>() << configuration);
+    cleanProjects(QList<BuildConfiguration *>() << configuration);
 }
 
 void BuildManager::appendStep(BuildStep *step)
diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h
index 1d2da54b5ec86b3f36e6788e0aa24b22d3ff9d31..47e59ec42b3e1d1d7cf8bd3a37962565697376ae 100644
--- a/src/plugins/projectexplorer/buildmanager.h
+++ b/src/plugins/projectexplorer/buildmanager.h
@@ -49,6 +49,7 @@ namespace Internal {
 class BuildStep;
 class Project;
 class ProjectExplorerPlugin;
+class BuildConfiguration;
 
 class PROJECTEXPLORER_EXPORT BuildManager
   : public QObject
@@ -70,10 +71,10 @@ public:
     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);
-    void cleanProjects(const QList<Project *> &projects, const QList<QString> &configurations);
+    void buildProject(BuildConfiguration *bc);
+    void buildProjects(const QList<BuildConfiguration *> &configurations);
+    void cleanProject(BuildConfiguration *configuration);
+    void cleanProjects(const QList<BuildConfiguration *> &configurations);
     bool isBuilding(Project *p);
 
     // Append any build step to the list of build steps (currently only used to add the QMakeStep)
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index bf2fcf13fd0ee3535849dd950b89b4d9f5decb03..d73e2c9790443f77899d929b893e260cfc41ccd8 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -153,7 +153,7 @@ BuildSettingsWidget::~BuildSettingsWidget()
 }
 
 BuildSettingsWidget::BuildSettingsWidget(Project *project)
-    : m_project(project)
+    : m_project(project), m_buildConfiguration(0)
 {
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setContentsMargins(0, -1, 0, -1);
@@ -189,7 +189,7 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
     m_addButton->setMenu(m_addButtonMenu);
     updateAddButtonMenu();
 
-    m_buildConfiguration = m_project->activeBuildConfiguration()->name();
+    m_buildConfiguration = m_project->activeBuildConfiguration();
 
     connect(m_makeActiveLabel, SIGNAL(linkActivated(QString)),
             this, SLOT(makeActive()));
@@ -200,8 +200,8 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
     connect(m_removeButton, SIGNAL(clicked()),
             this, SLOT(deleteConfiguration()));
 
-    connect(m_project, SIGNAL(buildConfigurationDisplayNameChanged(const QString &)),
-            this, SLOT(buildConfigurationDisplayNameChanged(const QString &)));
+    connect(m_project, SIGNAL(buildConfigurationDisplayNameChanged(ProjectExplorer::BuildConfiguration *)),
+            this, SLOT(buildConfigurationDisplayNameChanged(ProjectExplorer::BuildConfiguration *)));
 
     connect(m_project, SIGNAL(activeBuildConfigurationChanged()),
             this, SLOT(checkMakeActiveLabel()));
@@ -214,7 +214,7 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
 
 void BuildSettingsWidget::makeActive()
 {
-    m_project->setActiveBuildConfiguration(m_project->buildConfiguration(m_buildConfiguration));
+    m_project->setActiveBuildConfiguration(m_buildConfiguration);
 }
 
 void BuildSettingsWidget::updateAddButtonMenu()
@@ -231,11 +231,11 @@ void BuildSettingsWidget::updateAddButtonMenu()
     }
 }
 
-void BuildSettingsWidget::buildConfigurationDisplayNameChanged(const QString &buildConfiguration)
+void BuildSettingsWidget::buildConfigurationDisplayNameChanged(BuildConfiguration *bc)
 {
     for (int i=0; i<m_buildConfigurationComboBox->count(); ++i) {
-        if (m_buildConfigurationComboBox->itemData(i).toString() == buildConfiguration) {
-            m_buildConfigurationComboBox->setItemText(i, m_project->buildConfiguration(buildConfiguration)->displayName());
+        if (m_buildConfigurationComboBox->itemData(i).value<BuildConfiguration *>() == bc) {
+            m_buildConfigurationComboBox->setItemText(i, bc->displayName());
             break;
         }
     }
@@ -267,8 +267,8 @@ void BuildSettingsWidget::updateBuildSettings()
 
     // Add tree items
     foreach (const BuildConfiguration *bc, m_project->buildConfigurations()) {
-        m_buildConfigurationComboBox->addItem(bc->displayName(), bc->name());
-        if (bc->name() == m_buildConfiguration)
+        m_buildConfigurationComboBox->addItem(bc->displayName(), bc);
+        if (bc == m_buildConfiguration)
             m_buildConfigurationComboBox->setCurrentIndex(m_buildConfigurationComboBox->count() - 1);
     }
 
@@ -281,14 +281,14 @@ void BuildSettingsWidget::updateBuildSettings()
 
 void BuildSettingsWidget::currentIndexChanged(int index)
 {
-    m_buildConfiguration = m_buildConfigurationComboBox->itemData(index).toString();
+    m_buildConfiguration = (BuildConfiguration *) m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>();
     activeBuildConfigurationChanged();
 }
 
 void BuildSettingsWidget::activeBuildConfigurationChanged()
 {
     for (int i = 0; i < m_buildConfigurationComboBox->count(); ++i) {
-        if (m_buildConfigurationComboBox->itemData(i).toString() == m_buildConfiguration) {
+        if (m_buildConfigurationComboBox->itemData(i).value<BuildConfiguration *>() == m_buildConfiguration) {
             m_buildConfigurationComboBox->setCurrentIndex(i);
             break;
         }
@@ -304,10 +304,8 @@ void BuildSettingsWidget::activeBuildConfigurationChanged()
 void BuildSettingsWidget::checkMakeActiveLabel()
 {
     m_makeActiveLabel->setVisible(false);
-    if (!m_project->activeBuildConfiguration() || m_project->activeBuildConfiguration()->name() != m_buildConfiguration) {
-        BuildConfiguration *bc = m_project->buildConfiguration(m_buildConfiguration);
-        QTC_ASSERT(bc, return);
-        m_makeActiveLabel->setText(tr("<a href=\"#\">Make %1 active.</a>").arg(bc->displayName()));
+    if (!m_project->activeBuildConfiguration() || m_project->activeBuildConfiguration() != m_buildConfiguration) {
+        m_makeActiveLabel->setText(tr("<a href=\"#\">Make %1 active.</a>").arg(m_buildConfiguration->displayName()));
         m_makeActiveLabel->setVisible(true);
     }
 }
@@ -316,64 +314,55 @@ void BuildSettingsWidget::createConfiguration()
 {
     QAction *action = qobject_cast<QAction *>(sender());
     const QString &type = action->data().toString();
-    if (m_project->buildConfigurationFactory()->create(type)) {
-        // TODO switching to last buildconfiguration in list might not be what we want
-        m_buildConfiguration = m_project->buildConfigurations().last()->name();
+    BuildConfiguration *bc = m_project->buildConfigurationFactory()->create(type);
+    if (bc) {
+        m_buildConfiguration = bc;
         updateBuildSettings();
     }
 }
 
 void BuildSettingsWidget::cloneConfiguration()
 {
-    const QString configuration = m_buildConfigurationComboBox->itemData(m_buildConfigurationComboBox->currentIndex()).toString();
-    cloneConfiguration(configuration);
+    int index = m_buildConfigurationComboBox->currentIndex();
+    BuildConfiguration *bc = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>();
+    cloneConfiguration(bc);
 }
 
 void BuildSettingsWidget::deleteConfiguration()
 {
-    const QString configuration = m_buildConfigurationComboBox->itemData(m_buildConfigurationComboBox->currentIndex()).toString();
-    deleteConfiguration(configuration);
+    int index = m_buildConfigurationComboBox->currentIndex();
+    BuildConfiguration *bc = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>();
+    deleteConfiguration(bc);
 }
 
-void BuildSettingsWidget::cloneConfiguration(const QString &sourceConfiguration)
+void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfiguration)
 {
-    if (sourceConfiguration.isEmpty())
+    if (!sourceConfiguration)
         return;
 
-    QString newBuildConfiguration = QInputDialog::getText(this, tr("Clone configuration"), tr("New Configuration Name:"));
-    if (newBuildConfiguration.isEmpty())
+    QString newDisplayName = QInputDialog::getText(this, tr("Clone configuration"), tr("New Configuration Name:"));
+    if (newDisplayName.isEmpty())
         return;
 
-    QString newDisplayName = newBuildConfiguration;
     QStringList buildConfigurationDisplayNames;
     foreach(BuildConfiguration *bc, m_project->buildConfigurations())
         buildConfigurationDisplayNames << bc->displayName();
     newDisplayName = Project::makeUnique(newDisplayName, buildConfigurationDisplayNames);
 
-    QStringList buildConfigurationNames;
-    foreach(BuildConfiguration *bc, m_project->buildConfigurations())
-        buildConfigurationNames << bc->name();
-
-    newBuildConfiguration = Project::makeUnique(newBuildConfiguration, buildConfigurationNames);
-
-    BuildConfiguration *sourceBc = m_project->buildConfiguration(sourceConfiguration);
+    m_buildConfiguration = m_project->buildConfigurationFactory()->clone(sourceConfiguration);
+    m_project->setDisplayNameFor(m_buildConfiguration, newDisplayName);
 
-    m_project->buildConfigurationFactory()->clone(newBuildConfiguration, sourceBc);
-
-    m_project->setDisplayNameFor(m_project->buildConfiguration(newBuildConfiguration), newDisplayName);
-
-    m_buildConfiguration = newBuildConfiguration;
     updateBuildSettings();
 }
 
-void BuildSettingsWidget::deleteConfiguration(const QString &deleteConfiguration)
+void BuildSettingsWidget::deleteConfiguration(BuildConfiguration *deleteConfiguration)
 {
-    if (deleteConfiguration.isEmpty() || m_project->buildConfigurations().size() <= 1)
+    if (!deleteConfiguration || m_project->buildConfigurations().size() <= 1)
         return;
 
-    if (m_project->activeBuildConfiguration()->name() == deleteConfiguration) {
+    if (m_project->activeBuildConfiguration() == deleteConfiguration) {
         foreach (BuildConfiguration *bc, m_project->buildConfigurations()) {
-            if (bc->name() != deleteConfiguration) {
+            if (bc != deleteConfiguration) {
                 m_project->setActiveBuildConfiguration(bc);
                 break;
             }
@@ -381,15 +370,15 @@ void BuildSettingsWidget::deleteConfiguration(const QString &deleteConfiguration
     }
 
     if (m_buildConfiguration == deleteConfiguration) {
-        foreach (const BuildConfiguration *bc, m_project->buildConfigurations()) {
-            if (bc->name() != deleteConfiguration) {
-                m_buildConfiguration = bc->name();
+        foreach (BuildConfiguration *bc, m_project->buildConfigurations()) {
+            if (bc != deleteConfiguration) {
+                m_buildConfiguration = bc;
                 break;
             }
         }
     }
 
-    m_project->removeBuildConfiguration(m_project->buildConfiguration(deleteConfiguration));
+    m_project->removeBuildConfiguration(deleteConfiguration);
 
     updateBuildSettings();
 }
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h
index 169feeedf7e01145868e4402675acdd0fc1e4dd8..0026553b77e21f5ef806ed697aa941d05da33692 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.h
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h
@@ -42,6 +42,7 @@
 namespace ProjectExplorer {
 
 class IBuildStepFactory;
+class BuildConfiguration;
 
 namespace Internal {
 
@@ -93,7 +94,7 @@ public:
     ~BuildSettingsWidget();
 
 private slots:
-    void buildConfigurationDisplayNameChanged(const QString &buildConfiguration);
+    void buildConfigurationDisplayNameChanged(ProjectExplorer::BuildConfiguration *bc);
     void updateBuildSettings();
     void currentIndexChanged(int index);
     void activeBuildConfigurationChanged();
@@ -106,15 +107,15 @@ private slots:
     void makeActive();
 
 private:
-    void cloneConfiguration(const QString &toClone);
-    void deleteConfiguration(const QString &toDelete);
+    void cloneConfiguration(ProjectExplorer::BuildConfiguration *toClone);
+    void deleteConfiguration(ProjectExplorer::BuildConfiguration *toDelete);
 
     Project *m_project;
     QPushButton *m_addButton;
     QPushButton *m_removeButton;
     QComboBox *m_buildConfigurationComboBox;
     BuildSettingsSubWidgets *m_subWidgets;
-    QString m_buildConfiguration;
+    BuildConfiguration *m_buildConfiguration;
     QMenu *m_addButtonMenu;
     QLabel *m_makeActiveLabel;
 };
diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp
index 360ad3dc4b2e6bd9875f15979a271639b55edcf5..9fd6925b5164aec3740485f4dec2c5de130c9949 100644
--- a/src/plugins/projectexplorer/buildstep.cpp
+++ b/src/plugins/projectexplorer/buildstep.cpp
@@ -44,7 +44,7 @@ BuildStep::BuildStep(BuildConfiguration *bc)
 BuildStep::BuildStep(BuildStep *bs, BuildConfiguration *bc)
     : m_buildConfiguration(bc)
 {
-
+    Q_UNUSED(bs);
 }
 
 BuildStep::~BuildStep()
diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h
index f8a481a556af3d47ea55e9ed4c5f814144adb65a..c210f6af019da61e98a07f28dc3be7530fb0b430 100644
--- a/src/plugins/projectexplorer/buildstep.h
+++ b/src/plugins/projectexplorer/buildstep.h
@@ -155,7 +155,7 @@ public:
     virtual QString displayName() const = 0;
 
     // This is called to set up the config widget before showing it
-    virtual void init(const QString &buildConfiguration) = 0;
+    virtual void init(BuildConfiguration *bc) = 0;
 };
 
 class PROJECTEXPLORER_EXPORT BuildStepConfigWidget
diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp
index 35d3ba8c2642b245f633a9905cbcdc4de6ed778f..fc1416000e6ee4379e0731f7b4d9fea98c310b12 100644
--- a/src/plugins/projectexplorer/buildstepspage.cpp
+++ b/src/plugins/projectexplorer/buildstepspage.cpp
@@ -110,7 +110,7 @@ QString BuildStepsPage::displayName() const
     return m_clean ? tr("Clean Steps") : tr("Build Steps");
 }
 
-void BuildStepsPage::init(const QString &buildConfiguration)
+void BuildStepsPage::init(BuildConfiguration *bc)
 {
     foreach(BuildStepsWidgetStruct s, m_buildSteps) {
         delete s.widget;
@@ -118,8 +118,7 @@ void BuildStepsPage::init(const QString &buildConfiguration)
     }
     m_buildSteps.clear();
 
-    m_configuration = buildConfiguration;
-    BuildConfiguration *bc = m_pro->buildConfiguration(m_configuration);
+    m_configuration = bc;
 
     const QList<BuildStep *> &steps = m_clean ? bc->cleanSteps() : bc->buildSteps();
     int i = 0;
@@ -214,7 +213,7 @@ void BuildStepsPage::addBuildStepWidget(int pos, BuildStep *step)
 void BuildStepsPage::addBuildStep()
 {
     if (QAction *action = qobject_cast<QAction *>(sender())) {
-        BuildConfiguration *bc = m_pro->buildConfiguration(m_configuration);
+        BuildConfiguration *bc = m_configuration;
         QPair<QString, IBuildStepFactory *> pair = m_addBuildStepHash.value(action);
         BuildStep *newStep = pair.second->create(bc, pair.first);
         int pos = m_clean ? bc->cleanSteps().count() : bc->buildSteps().count();
@@ -232,8 +231,7 @@ void BuildStepsPage::updateRemoveBuildStepMenu()
 {
     QMenu *menu = m_removeButton->menu();
     menu->clear();
-    BuildConfiguration *bc = m_pro->buildConfiguration(m_configuration);
-    const QList<BuildStep *> &steps = m_clean ? bc->cleanSteps() : bc->buildSteps();
+    const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
     foreach(BuildStep *step, steps) {
         QAction *action = menu->addAction(step->displayName());
         if (step->immutable())
@@ -248,8 +246,7 @@ void BuildStepsPage::removeBuildStep()
     QAction *action = qobject_cast<QAction *>(sender());
     if (action) {
         int pos = m_removeButton->menu()->actions().indexOf(action);
-        BuildConfiguration *bc = m_pro->buildConfiguration(m_configuration);
-        const QList<BuildStep *> &steps = m_clean ? bc->cleanSteps() : bc->buildSteps();
+        const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
         if (steps.at(pos)->immutable())
             return;
 
@@ -257,7 +254,7 @@ void BuildStepsPage::removeBuildStep()
         delete s.widget;
         delete s.detailsWidget;
         m_buildSteps.removeAt(pos);
-        m_clean ? bc->removeCleanStep(pos) : bc->removeBuildStep(pos);
+        m_clean ? m_configuration->removeCleanStep(pos) : m_configuration->removeBuildStep(pos);
     }
     updateBuildStepButtonsState();
 }
@@ -304,8 +301,7 @@ void BuildStepsPage::downBuildStep()
 
 void BuildStepsPage::stepMoveUp(int pos)
 {
-    BuildConfiguration *bc = m_pro->buildConfiguration(m_configuration);
-    m_clean ? bc->moveCleanStepUp(pos) : bc->moveBuildStepUp(pos);
+    m_clean ? m_configuration->moveCleanStepUp(pos) : m_configuration->moveBuildStepUp(pos);
 
     m_vbox->insertWidget(pos - 1, m_buildSteps.at(pos).detailsWidget);
 
@@ -316,8 +312,7 @@ void BuildStepsPage::stepMoveUp(int pos)
 
 void BuildStepsPage::updateBuildStepButtonsState()
 {
-    BuildConfiguration *bc = m_pro->buildConfiguration(m_configuration);
-    const QList<BuildStep *> &steps = m_clean ? bc->cleanSteps() : bc->buildSteps();
+    const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
     for(int i=0; i<m_buildSteps.count(); ++i) {
         BuildStepsWidgetStruct s = m_buildSteps.at(i);
         s.upButton->setEnabled((i>0) && !(steps.at(i)->immutable() && steps.at(i - 1)));
diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h
index b6c7e0ac099aa53cc35d2d610e1629eeadd97b6b..92e8180218b03de405f1fbfa64ed0f7aea2851ae 100644
--- a/src/plugins/projectexplorer/buildstepspage.h
+++ b/src/plugins/projectexplorer/buildstepspage.h
@@ -71,7 +71,7 @@ public:
     virtual ~BuildStepsPage();
 
     QString displayName() const;
-    void init(const QString &buildConfiguration);
+    void init(BuildConfiguration *bc);
 
 private slots:
     void updateAddBuildStepMenu();
@@ -88,7 +88,7 @@ private:
     void addBuildStepWidget(int pos, BuildStep *step);
 
     Project *m_pro;
-    QString m_configuration;
+    BuildConfiguration *m_configuration;
     QHash<QAction *, QPair<QString, ProjectExplorer::IBuildStepFactory *> > m_addBuildStepHash;
     bool m_clean;
 
diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp
index 8d6852d90b8a7d31bebd2fecc4c885bd9c875bf4..dc9caecf6993058f310fb67251f03ca75700e720 100644
--- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp
+++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp
@@ -251,7 +251,7 @@ CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Project *pro)
     connect(pro, SIGNAL(activeBuildConfigurationChanged()),
             this, SIGNAL(baseEnvironmentChanged()));
 
-    connect(pro, SIGNAL(environmentChanged(QString)),
+    connect(pro, SIGNAL(environmentChanged(ProjectExplorer::BuildConfiguration *)),
             this, SIGNAL(baseEnvironmentChanged()));
 
 }
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index a70faf4519b1f3f43ce57247675a0e8642e0a665..6a05b9264dda1193b35c7d5d508a24ff30eb1547 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -74,15 +74,6 @@ QString Project::makeUnique(const QString &preferedName, const QStringList &used
 
 void Project::addBuildConfiguration(BuildConfiguration *configuration)
 {
-    QStringList buildConfigurationNames;
-    foreach (const BuildConfiguration *bc, buildConfigurations())
-        buildConfigurationNames << bc->name();
-
-    // Check that the internal name is not taken and use a different one otherwise
-    QString configurationName = configuration->name();
-    configurationName = makeUnique(configurationName, buildConfigurationNames);
-    configuration->setName(configurationName);
-
     // Check that we don't have a configuration with the same displayName
     QString configurationDisplayName = configuration->displayName();
     QStringList displayNames;
@@ -94,7 +85,7 @@ void Project::addBuildConfiguration(BuildConfiguration *configuration)
     // add it
     m_buildConfigurationValues.push_back(configuration);
 
-    emit addedBuildConfiguration(this, configuration->name());
+    emit addedBuildConfiguration(this, configuration);
 }
 
 void Project::removeBuildConfiguration(BuildConfiguration *configuration)
@@ -105,7 +96,7 @@ void Project::removeBuildConfiguration(BuildConfiguration *configuration)
 
     m_buildConfigurationValues.removeOne(configuration);
 
-    emit removedBuildConfiguration(this, configuration->name());
+    emit removedBuildConfiguration(this, configuration);
     delete configuration;
 }
 
@@ -133,7 +124,7 @@ bool Project::restoreSettings()
     if (!restoreSettingsImpl(reader))
         return false;
 
-    if (m_activeBuildConfiguration.isEmpty() && !m_buildConfigurationValues.isEmpty())
+    if (m_activeBuildConfiguration && !m_buildConfigurationValues.isEmpty())
         setActiveBuildConfiguration(m_buildConfigurationValues.at(0));
 
     if (!m_activeRunConfiguration && !m_runConfigurations.isEmpty())
@@ -148,47 +139,50 @@ QList<BuildConfigWidget*> Project::subConfigWidgets()
 
 void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
 {
-    writer.saveValue("activebuildconfiguration", m_activeBuildConfiguration);
+    const QList<BuildConfiguration *> bcs = buildConfigurations();
+
+    // For compability with older versions the "name" is saved as a string instead of a number
+    writer.saveValue("activebuildconfiguration", QString::number(bcs.indexOf(m_activeBuildConfiguration)));
     //save m_values
     writer.saveValue("project", m_values);
 
     //save buildsettings
     QStringList buildConfigurationNames;
-    foreach (const BuildConfiguration *bc, buildConfigurations()) {
-        QMap<QString, QVariant> temp = bc->toMap();
-        writer.saveValue("buildConfiguration-" + bc->name(), temp);
-        buildConfigurationNames << bc->name();
+    for(int i=0; i < bcs.size(); ++i) {
+        QMap<QString, QVariant> temp = bcs.at(i)->toMap();
+        writer.saveValue("buildConfiguration-" + QString::number(i), temp);
+        buildConfigurationNames << QString::number(i);
     }
     writer.saveValue("buildconfigurations", buildConfigurationNames);
 
     // save each buildstep/buildConfiguration combination
-    foreach (const BuildConfiguration *bc, buildConfigurations()) {
+    for(int i=0; i < bcs.size(); ++i) {
         QStringList buildStepNames;
-        foreach (BuildStep *buildStep, bc->buildSteps())
+        foreach (BuildStep *buildStep, bcs.at(i)->buildSteps())
             buildStepNames << buildStep->name();
-        writer.saveValue("buildconfiguration-" + bc->name() + "-buildsteps", buildStepNames);
+        writer.saveValue("buildconfiguration-" + QString::number(i) + "-buildsteps", buildStepNames);
 
         int buildstepnr = 0;
-        foreach (BuildStep *buildStep, bc->buildSteps()) {
+        foreach (BuildStep *buildStep, bcs.at(i)->buildSteps()) {
             QMap<QString, QVariant> temp;
             buildStep->storeIntoLocalMap(temp);
-            writer.saveValue("buildconfiguration-" + bc->name() + "-buildstep" + QString().setNum(buildstepnr), temp);
+            writer.saveValue("buildconfiguration-" + QString::number(i) + "-buildstep" + QString().setNum(buildstepnr), temp);
             ++buildstepnr;
         }
     }
 
     // save each cleanstep/buildConfiguration combination
-    foreach (const BuildConfiguration *bc, buildConfigurations()) {
+    for(int i=0; i < bcs.size(); ++i) {
         QStringList cleanStepNames;
-        foreach (BuildStep *cleanStep, bc->cleanSteps())
+        foreach (BuildStep *cleanStep, bcs.at(i)->cleanSteps())
             cleanStepNames << cleanStep->name();
-        writer.saveValue("buildconfiguration-" + bc->name() + "-cleansteps", cleanStepNames);
+        writer.saveValue("buildconfiguration-" + QString::number(i) + "-cleansteps", cleanStepNames);
 
         int cleanstepnr = 0;
-        foreach (BuildStep *cleanStep, bc->cleanSteps()) {
+        foreach (BuildStep *cleanStep, bcs.at(i)->cleanSteps()) {
             QMap<QString, QVariant> temp;
             cleanStep->storeIntoLocalMap(temp);
-            writer.saveValue("buildconfiguration-" + bc->name() + "-cleanstep" + QString().setNum(cleanstepnr), temp);
+            writer.saveValue("buildconfiguration-" + QString::number(i) + "-cleanstep" + QString().setNum(cleanstepnr), temp);
             ++cleanstepnr;
         }
     }
@@ -212,8 +206,6 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
 
 bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
 {
-    m_activeBuildConfiguration = reader.restoreValue("activebuildconfiguration").toString();
-
     m_values = reader.restoreValue("project").toMap();
 
     const QList<IBuildStepFactory *> buildStepFactories =
@@ -221,15 +213,16 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
 
     // restoring BuldConfigurations from settings
     const QStringList buildConfigurationNames = reader.restoreValue("buildconfigurations").toStringList();
+
     foreach (const QString &buildConfigurationName, buildConfigurationNames) {
-        BuildConfiguration *bc = buildConfigurationFactory()->restore(buildConfigurationName);
+        BuildConfiguration *bc = buildConfigurationFactory()->restore();
 
         QMap<QString, QVariant> temp =
             reader.restoreValue("buildConfiguration-" + buildConfigurationName).toMap();
         bc->setValuesFromMap(temp);
 
         // Restore build steps
-        QVariant buildStepsValueVariant = reader.restoreValue("buildconfiguration-" + bc->name() + "-buildsteps");
+        QVariant buildStepsValueVariant = reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildsteps");
         if(buildStepsValueVariant.isValid()) {
             int pos = 0;
             QStringList buildStepNames = buildStepsValueVariant.toStringList();
@@ -248,7 +241,7 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
                     QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap();
                     buildStep->restoreFromGlobalMap(buildStepValues);
                     buildStepValues =
-                            reader.restoreValue("buildconfiguration-" + bc->name() + "-buildstep" + QString().setNum(buildstepnr)).toMap();
+                            reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr)).toMap();
                     buildStep->restoreFromLocalMap(buildStepValues);
                     bc->insertBuildStep(pos, buildStep);
                     ++pos;
@@ -256,7 +249,7 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
             }
         }
         // Restore clean steps
-        QVariant cleanStepsValueVariant = reader.restoreValue("buildconfiguration-" + bc->name() + "-cleansteps");
+        QVariant cleanStepsValueVariant = reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleansteps");
         if(cleanStepsValueVariant.isValid()) {
             int pos = 0;
             QStringList cleanStepNames = cleanStepsValueVariant.toStringList();
@@ -275,7 +268,7 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
                     QMap<QString, QVariant> buildStepValues = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap();
                     cleanStep->restoreFromGlobalMap(buildStepValues);
                     buildStepValues =
-                            reader.restoreValue("buildconfiguration-" + bc->name() + "-cleanstep" + QString().setNum(cleanstepnr)).toMap();
+                            reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr)).toMap();
                     cleanStep->restoreFromLocalMap(buildStepValues);
                     bc->insertCleanStep(pos, cleanStep);
                     ++pos;
@@ -284,6 +277,10 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
         }
     }
 
+    // Set Active Configuration
+    QString activeConfigurationName = reader.restoreValue("activebuildconfiguration").toString();
+    m_activeBuildConfiguration = buildConfigurations().at(buildConfigurationNames.indexOf(activeConfigurationName));
+
     //Build Settings
     QVariant buildStepsVariant = reader.restoreValue("buildsteps");
     if (buildStepsVariant.isValid()) {
@@ -302,13 +299,14 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
                 }
             }
             if (factory) {
-                foreach(BuildConfiguration *bc, buildConfigurations()) {
-                    buildStep = factory->create(bc, buildStepName);
-                    bc->insertBuildStep(pos, buildStep);
+                const QList<BuildConfiguration *> &bcs = buildConfigurations();
+                for(int i = 0; i < bcs.size(); ++i) {
+                    buildStep = factory->create(bcs.at(i), buildStepName);
+                    bcs.at(i)->insertBuildStep(pos, buildStep);
                     QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap();
                     buildStep->restoreFromGlobalMap(buildStepValues);
                     buildStepValues =
-                            reader.restoreValue("buildconfiguration-" + bc->name() + "-buildstep" + QString().setNum(buildstepnr)).toMap();
+                            reader.restoreValue("buildconfiguration-" + QString::number(i) + "-buildstep" + QString().setNum(buildstepnr)).toMap();
                     buildStep->restoreFromLocalMap(buildStepValues);
                 }
                 ++pos;
@@ -334,13 +332,14 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
             }
 
             if (factory) {
-                foreach(BuildConfiguration *bc, buildConfigurations()) {
-                    cleanStep = factory->create(bc, cleanStepName);
-                    bc->insertCleanStep(pos, cleanStep);
+                const QList<BuildConfiguration *> &bcs = buildConfigurations();
+                for (int i = 0; i < bcs.size(); ++i) {
+                    cleanStep = factory->create(bcs.at(i), cleanStepName);
+                    bcs.at(i)->insertCleanStep(pos, cleanStep);
                     QMap<QString, QVariant> cleanStepValues = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap();
                     cleanStep->restoreFromGlobalMap(cleanStepValues);
                     QMap<QString, QVariant> buildStepValues =
-                            reader.restoreValue("buildconfiguration-" + bc->name() + "-cleanstep" + QString().setNum(cleanstepnr)).toMap();
+                            reader.restoreValue("buildconfiguration-" + QString::number(i) + "-cleanstep" + QString().setNum(cleanstepnr)).toMap();
                     cleanStep->restoreFromLocalMap(buildStepValues);
                 }
                 ++pos;
@@ -396,23 +395,15 @@ QVariant Project::value(const QString &name) const
         return QVariant();
 }
 
-BuildConfiguration *Project::buildConfiguration(const QString &name) const
-{
-    for (int i = 0; i != m_buildConfigurationValues.size(); ++i)
-        if (m_buildConfigurationValues.at(i)->name() == name)
-            return m_buildConfigurationValues.at(i);
-    return 0;
-}
-
 BuildConfiguration *Project::activeBuildConfiguration() const
 {
-    return buildConfiguration(m_activeBuildConfiguration); //TODO
+    return m_activeBuildConfiguration; //TODO
 }
 
 void Project::setActiveBuildConfiguration(BuildConfiguration *configuration)
 {
-    if (m_activeBuildConfiguration != configuration->name() && m_buildConfigurationValues.contains(configuration)) {
-        m_activeBuildConfiguration = configuration->name();
+    if (m_activeBuildConfiguration != configuration && m_buildConfigurationValues.contains(configuration)) {
+        m_activeBuildConfiguration = configuration;
         emit activeBuildConfigurationChanged();
     }
 }
@@ -486,7 +477,7 @@ void Project::setDisplayNameFor(BuildConfiguration *configuration, const QString
 
     configuration->setDisplayName(displayName);
 
-    emit buildConfigurationDisplayNameChanged(configuration->name());
+    emit buildConfigurationDisplayNameChanged(configuration);
 }
 
 QByteArray Project::predefinedMacros(const QString &) const
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 2e7e43a6972806a66a38fedeb7cb4475c0e36554..f999527703f31f3f275cd6f9dd8f90eedbf30a93 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -87,7 +87,6 @@ public:
     void addBuildConfiguration(BuildConfiguration *configuration);
     void removeBuildConfiguration(BuildConfiguration *configuration);
 
-    BuildConfiguration *buildConfiguration(const QString & name) const;
     QList<BuildConfiguration *> buildConfigurations() const;
     // remove and add "QString uniqueConfigurationDisplayName(const QString &proposedName) const" instead
     void setDisplayNameFor(BuildConfiguration *configuration, const QString &displayName);
@@ -146,12 +145,12 @@ signals:
     void removedRunConfiguration(ProjectExplorer::Project *p, const QString &name);
     void addedRunConfiguration(ProjectExplorer::Project *p, const QString &name);
 
-    void removedBuildConfiguration(ProjectExplorer::Project *p, const QString &name);
-    void addedBuildConfiguration(ProjectExplorer::Project *p, const QString &name);
+    void removedBuildConfiguration(ProjectExplorer::Project *p, BuildConfiguration *bc);
+    void addedBuildConfiguration(ProjectExplorer::Project *p, BuildConfiguration *bc);
 
     // This signal is jut there for updating the tree list in the buildsettings wizard
-    void buildConfigurationDisplayNameChanged(const QString &buildConfiguration);
-    void environmentChanged(const QString &buildConfiguration);
+    void buildConfigurationDisplayNameChanged(BuildConfiguration *bc);
+    void environmentChanged(BuildConfiguration *bc);
 
 protected:
     /* This method is called when the project .user file is saved. Simply call
@@ -175,7 +174,7 @@ protected:
 private:
     QMap<QString, QVariant> m_values;
     QList<BuildConfiguration *> m_buildConfigurationValues;
-    QString m_activeBuildConfiguration;
+    BuildConfiguration *m_activeBuildConfiguration;
     QList<RunConfiguration *> m_runConfigurations;
     RunConfiguration* m_activeRunConfiguration;
     EditorConfiguration *m_editorConfiguration;
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 1693c398df759b4883b89b43d4716bc07ae339dd..2f2da8c6e0ad722dc988d4fee973f3a9814a532d 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1424,20 +1424,7 @@ void ProjectExplorerPlugin::buildProjectOnly()
         qDebug() << "ProjectExplorerPlugin::buildProjectOnly";
 
     if (saveModifiedFiles())
-        buildManager()->buildProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
-}
-
-static QStringList configurations(const QList<Project *> &projects)
-{
-    QStringList result;
-    foreach (const Project * pro, projects) {
-        if (BuildConfiguration *bc = pro->activeBuildConfiguration()) {
-            result << bc->name();
-        } else {
-            result << QString::null;
-        }
-    }
-    return result;
+        buildManager()->buildProject(d->m_currentProject->activeBuildConfiguration());
 }
 
 void ProjectExplorerPlugin::buildProject()
@@ -1446,8 +1433,11 @@ void ProjectExplorerPlugin::buildProject()
         qDebug() << "ProjectExplorerPlugin::buildProject";
 
     if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder(d->m_currentProject);
-        d->m_buildManager->buildProjects(projects, configurations(projects));
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, d->m_session->projectOrder(d->m_currentProject))
+            configurations << pro->activeBuildConfiguration();
+
+        d->m_buildManager->buildProjects(configurations);
     }
 }
 
@@ -1457,8 +1447,10 @@ void ProjectExplorerPlugin::buildSession()
         qDebug() << "ProjectExplorerPlugin::buildSession";
 
     if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder();
-        d->m_buildManager->buildProjects(projects, configurations(projects));
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, d->m_session->projectOrder())
+            configurations << pro->activeBuildConfiguration();
+        d->m_buildManager->buildProjects(configurations);
     }
 }
 
@@ -1468,8 +1460,8 @@ void ProjectExplorerPlugin::rebuildProjectOnly()
         qDebug() << "ProjectExplorerPlugin::rebuildProjectOnly";
 
     if (saveModifiedFiles()) {
-        d->m_buildManager->cleanProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
-        d->m_buildManager->buildProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
+        d->m_buildManager->cleanProject(d->m_currentProject->activeBuildConfiguration());
+        d->m_buildManager->buildProject(d->m_currentProject->activeBuildConfiguration());
     }
 }
 
@@ -1479,11 +1471,13 @@ void ProjectExplorerPlugin::rebuildProject()
         qDebug() << "ProjectExplorerPlugin::rebuildProject";
 
     if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder(d->m_currentProject);
-        const QStringList configs = configurations(projects);
+        const QList<Project *> &projects = d->m_session->projectOrder(d->m_currentProject);
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, projects)
+            configurations << pro->activeBuildConfiguration();
 
-        d->m_buildManager->cleanProjects(projects, configs);
-        d->m_buildManager->buildProjects(projects, configs);
+        d->m_buildManager->cleanProjects(configurations);
+        d->m_buildManager->buildProjects(configurations);
     }
 }
 
@@ -1494,10 +1488,12 @@ void ProjectExplorerPlugin::rebuildSession()
 
     if (saveModifiedFiles()) {
         const QList<Project *> & projects = d->m_session->projectOrder();
-        const QStringList configs = configurations(projects);
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, projects)
+            configurations << pro->activeBuildConfiguration();
 
-        d->m_buildManager->cleanProjects(projects, configs);
-        d->m_buildManager->buildProjects(projects, configs);
+        d->m_buildManager->cleanProjects(configurations);
+        d->m_buildManager->buildProjects(configurations);
     }
 }
 
@@ -1507,7 +1503,7 @@ void ProjectExplorerPlugin::cleanProjectOnly()
         qDebug() << "ProjectExplorerPlugin::cleanProjectOnly";
 
     if (saveModifiedFiles())
-        d->m_buildManager->cleanProject(d->m_currentProject, d->m_currentProject->activeBuildConfiguration()->name());
+        d->m_buildManager->cleanProject(d->m_currentProject->activeBuildConfiguration());
 }
 
 void ProjectExplorerPlugin::cleanProject()
@@ -1517,7 +1513,10 @@ void ProjectExplorerPlugin::cleanProject()
 
     if (saveModifiedFiles()) {
         const QList<Project *> & projects = d->m_session->projectOrder(d->m_currentProject);
-        d->m_buildManager->cleanProjects(projects, configurations(projects));
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, projects)
+            configurations << pro->activeBuildConfiguration();
+        d->m_buildManager->cleanProjects(configurations);
     }
 }
 
@@ -1528,21 +1527,24 @@ void ProjectExplorerPlugin::cleanSession()
 
     if (saveModifiedFiles()) {
         const QList<Project *> & projects = d->m_session->projectOrder();
-        d->m_buildManager->cleanProjects(projects, configurations(projects));
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, projects)
+            configurations << pro->activeBuildConfiguration();
+        d->m_buildManager->cleanProjects(configurations);
     }
 }
 
 void ProjectExplorerPlugin::runProject()
 {
-    runProjectImpl(startupProject());
+    runProjectImpl(startupProject(), ProjectExplorer::Constants::RUNMODE);
 }
 
 void ProjectExplorerPlugin::runProjectContextMenu()
 {
-    runProjectImpl(d->m_currentProject);
+    runProjectImpl(d->m_currentProject, ProjectExplorer::Constants::RUNMODE);
 }
 
-void ProjectExplorerPlugin::runProjectImpl(Project *pro)
+void ProjectExplorerPlugin::runProjectImpl(Project *pro, QString mode)
 {
     if (!pro)
         return;
@@ -1553,16 +1555,21 @@ void ProjectExplorerPlugin::runProjectImpl(Project *pro)
                 return;
         }
         if (saveModifiedFiles()) {
-            d->m_runMode = ProjectExplorer::Constants::RUNMODE;
+            d->m_runMode = mode;
             d->m_delayedRunConfiguration = pro->activeRunConfiguration();
 
             const QList<Project *> & projects = d->m_session->projectOrder(pro);
-            d->m_buildManager->buildProjects(projects, configurations(projects));
+            QList<BuildConfiguration *> configurations;
+            foreach(Project *pro, projects)
+                configurations << pro->activeBuildConfiguration();
+            d->m_buildManager->buildProjects(configurations);
+
+            updateRunAction();
         }
     } else {
         // TODO this ignores RunConfiguration::isEnabled()
         if (saveModifiedFiles())
-            executeRunConfiguration(pro->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE);
+            executeRunConfiguration(pro->activeRunConfiguration(), mode);
     }
 }
 
@@ -1572,25 +1579,7 @@ void ProjectExplorerPlugin::debugProject()
     if (!pro || d->m_debuggingRunControl )
         return;
 
-    if (d->m_projectExplorerSettings.buildBeforeRun && pro->hasBuildSettings()) {
-        if (!pro->activeRunConfiguration()->isEnabled()) {
-            if (!showBuildConfigDialog())
-                return;
-        }
-        if (saveModifiedFiles()) {
-            d->m_runMode = ProjectExplorer::Constants::DEBUGMODE;
-            d->m_delayedRunConfiguration = pro->activeRunConfiguration();
-
-            const QList<Project *> & projects = d->m_session->projectOrder(pro);
-            d->m_buildManager->buildProjects(projects, configurations(projects));
-
-            updateRunAction();
-        }
-    } else {
-        // TODO this ignores RunConfiguration::isEnabled()
-        if (saveModifiedFiles())
-            executeRunConfiguration(pro->activeRunConfiguration(), ProjectExplorer::Constants::DEBUGMODE);
-    }
+    runProjectImpl(pro, ProjectExplorer::Constants::DEBUGMODE);
 }
 
 bool ProjectExplorerPlugin::showBuildConfigDialog()
@@ -1965,14 +1954,14 @@ void ProjectExplorerPlugin::populateBuildConfigurationMenu()
     d->m_buildConfigurationMenu->clear();
     if (Project *pro = d->m_currentProject) {
         const BuildConfiguration *activeBC = pro->activeBuildConfiguration();
-        foreach (const BuildConfiguration *bc, pro->buildConfigurations()) {
+        foreach (BuildConfiguration *bc, pro->buildConfigurations()) {
             QString displayName = bc->displayName();
             QAction *act = new QAction(displayName, d->m_buildConfigurationActionGroup);
             if (debug)
-                qDebug() << "BuildConfiguration " << bc->name() << "active: " << activeBC->name();
+                qDebug() << "BuildConfiguration " << bc->displayName() << "active: " << activeBC->displayName();
             act->setCheckable(true);
             act->setChecked(bc == activeBC);
-            act->setData(bc->name());
+            act->setData(QVariant::fromValue(bc));
             d->m_buildConfigurationMenu->addAction(act);
         }
         d->m_buildConfigurationMenu->setEnabled(true);
@@ -1986,8 +1975,7 @@ void ProjectExplorerPlugin::buildConfigurationMenuTriggered(QAction *action)
     if (debug)
         qDebug() << "ProjectExplorerPlugin::buildConfigurationMenuTriggered";
 
-    d->m_currentProject->setActiveBuildConfiguration(d->m_currentProject->buildConfiguration(
-            action->data().toString()));
+    d->m_currentProject->setActiveBuildConfiguration(action->data().value<BuildConfiguration *>());
 }
 
 void ProjectExplorerPlugin::populateRunConfigurationMenu()
@@ -2136,9 +2124,6 @@ Internal::ProjectExplorerSettings ProjectExplorerPlugin::projectExplorerSettings
     return d->m_projectExplorerSettings;
 }
 
-// ---------- BuildConfigDialog -----------
-Q_DECLARE_METATYPE(BuildConfiguration*);
-
 BuildConfigDialog::BuildConfigDialog(Project *project, QWidget *parent)
     : QDialog(parent),
     m_project(project)
@@ -2173,7 +2158,7 @@ BuildConfigDialog::BuildConfigDialog(Project *project, QWidget *parent)
     RunConfiguration *activeRun = m_project->activeRunConfiguration();
     foreach (BuildConfiguration *config, m_project->buildConfigurations()) {
         if (activeRun->isEnabled(config)) {
-            m_configCombo->addItem(config->name(), qVariantFromValue(config));
+            m_configCombo->addItem(config->displayName(), QVariant::fromValue(config));
         }
     }
     if (m_configCombo->count() == 0) {
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index b8ea2d8d8b837a5adb326c24bab5a12eb85f1179..10dc691e737d57ce939d07a8c95769df1f9b625b 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -215,7 +215,7 @@ private slots:
     void currentModeChanged(Core::IMode *mode);
 
 private:
-    void runProjectImpl(Project *pro);
+    void runProjectImpl(Project *pro, QString mode);
     void executeRunConfiguration(RunConfiguration *, const QString &mode);
     bool showBuildConfigDialog();
 
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index 5fc16bafc32279903254c6db04b36421dc7746c2..b67f6be4f3042a9f1f0ca1ad30223d75f947fcb4 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -512,7 +512,7 @@ BuildConfigurationComboBox::BuildConfigurationComboBox(Project *p, QWidget *pare
 
     //m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
     foreach(const BuildConfiguration *buildConfiguration, p->buildConfigurations())
-        m_comboBox->addItem(buildConfiguration->displayName(), buildConfiguration->name());
+        m_comboBox->addItem(buildConfiguration->displayName(), buildConfiguration);
     if (p->buildConfigurations().count() == 1) {
         m_label->setText(m_comboBox->itemText(0));
         setCurrentWidget(m_label);
@@ -522,14 +522,14 @@ BuildConfigurationComboBox::BuildConfigurationComboBox(Project *p, QWidget *pare
     if (index != -1)
         m_comboBox->setCurrentIndex(index);
 
-    connect(p, SIGNAL(buildConfigurationDisplayNameChanged(QString)),
-            this, SLOT(nameChanged(QString)));
+    connect(p, SIGNAL(buildConfigurationDisplayNameChanged(ProjectExplorer::BuildConfiguration *)),
+            this, SLOT(nameChanged(ProjectExplorer::BuildConfiguration *)));
     connect(p, SIGNAL(activeBuildConfigurationChanged()),
             this, SLOT(activeConfigurationChanged()));
-    connect(p, SIGNAL(addedBuildConfiguration(ProjectExplorer::Project *, QString)),
-            this, SLOT(addedBuildConfiguration(ProjectExplorer::Project *, QString)));
-    connect(p, SIGNAL(removedBuildConfiguration(ProjectExplorer::Project *, QString)),
-            this, SLOT(removedBuildConfiguration(ProjectExplorer::Project *, QString)));
+    connect(p, SIGNAL(addedBuildConfiguration(ProjectExplorer::Project *, ProjectExplorer::BuildConfiguration *)),
+            this, SLOT(addedBuildConfiguration(ProjectExplorer::Project *, ProjectExplorer::BuildConfiguration *)));
+    connect(p, SIGNAL(removedBuildConfiguration(ProjectExplorer::Project *, ProjectExplorer::BuildConfiguration *)),
+            this, SLOT(removedBuildConfiguration(ProjectExplorer::Project *, ProjectExplorer::BuildConfiguration *)));
     connect(m_comboBox, SIGNAL(activated(int)),
             this, SLOT(changedIndex(int)));
 }
@@ -539,28 +539,28 @@ BuildConfigurationComboBox::~BuildConfigurationComboBox()
 
 }
 
-void BuildConfigurationComboBox::nameChanged(const QString &buildConfiguration)
+void BuildConfigurationComboBox::nameChanged(BuildConfiguration *bc)
 {
-    int index = nameToIndex(buildConfiguration);
+    int index = nameToIndex(bc);
     if (index == -1)
         return;
-    const QString &displayName = m_project->buildConfiguration(buildConfiguration)->displayName();
+    const QString &displayName = bc->displayName();
     m_comboBox->setItemText(index, displayName);
     if (m_comboBox->count() == 1)
         m_label->setText(displayName);
 }
 
-int BuildConfigurationComboBox::nameToIndex(const QString &buildConfiguration)
+int BuildConfigurationComboBox::nameToIndex(BuildConfiguration *bc)
 {
     for (int i=0; i < m_comboBox->count(); ++i)
-        if (m_comboBox->itemData(i) == buildConfiguration)
+        if (m_comboBox->itemData(i).value<BuildConfiguration *>() == bc)
             return i;
     return -1;
 }
 
 void BuildConfigurationComboBox::activeConfigurationChanged()
 {
-    int index = nameToIndex(m_project->activeBuildConfiguration()->name());
+    int index = nameToIndex(m_project->activeBuildConfiguration());
     if (index == -1)
         return;
     ignoreIndexChange = true;
@@ -568,20 +568,20 @@ void BuildConfigurationComboBox::activeConfigurationChanged()
     ignoreIndexChange = false;
 }
 
-void BuildConfigurationComboBox::addedBuildConfiguration(ProjectExplorer::Project *,const QString &buildConfiguration)
+void BuildConfigurationComboBox::addedBuildConfiguration(ProjectExplorer::Project *,BuildConfiguration *bc)
 {
     ignoreIndexChange = true;
-    m_comboBox->addItem(m_project->buildConfiguration(buildConfiguration)->displayName(), buildConfiguration);
+    m_comboBox->addItem(bc->displayName(), QVariant::fromValue(bc));
 
     if (m_comboBox->count() == 2)
         setCurrentWidget(m_comboBox);
     ignoreIndexChange = false;
 }
 
-void BuildConfigurationComboBox::removedBuildConfiguration(ProjectExplorer::Project *, const QString &buildConfiguration)
+void BuildConfigurationComboBox::removedBuildConfiguration(ProjectExplorer::Project *, BuildConfiguration *bc)
 {
     ignoreIndexChange = true;
-    int index = nameToIndex(buildConfiguration);
+    int index = nameToIndex(bc);
     m_comboBox->removeItem(index);
     if (m_comboBox->count() == 1) {
         m_label->setText(m_comboBox->itemText(0));
@@ -594,8 +594,7 @@ void BuildConfigurationComboBox::changedIndex(int newIndex)
 {
     if (newIndex == -1)
         return;
-    m_project->setActiveBuildConfiguration(
-            m_project->buildConfiguration(m_comboBox->itemData(newIndex).toString()));
+    m_project->setActiveBuildConfiguration(m_comboBox->itemData(newIndex).value<BuildConfiguration *>());
 }
 
 ///
diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h
index a99e9fb66c6bb1d5e935bed0614b517fd0017894..70c58890b9ca626c12c9db867e19b0e200a1ce5c 100644
--- a/src/plugins/projectexplorer/projectwindow.h
+++ b/src/plugins/projectexplorer/projectwindow.h
@@ -56,6 +56,7 @@ class IPropertiesPanel;
 class Project;
 class ProjectExplorerPlugin;
 class SessionManager;
+class BuildConfiguration;
 
 namespace Internal {
 
@@ -100,13 +101,13 @@ public:
     BuildConfigurationComboBox(ProjectExplorer::Project *p, QWidget *parent = 0);
     ~BuildConfigurationComboBox();
 private slots:
-    void nameChanged(const QString &buildConfiguration);
+    void nameChanged(ProjectExplorer::BuildConfiguration *bc);
     void activeConfigurationChanged();
-    void addedBuildConfiguration(ProjectExplorer::Project *, const QString &buildConfiguration);
-    void removedBuildConfiguration(ProjectExplorer::Project *, const QString &buildConfiguration);
+    void addedBuildConfiguration(ProjectExplorer::Project *, ProjectExplorer::BuildConfiguration *bc);
+    void removedBuildConfiguration(ProjectExplorer::Project *, ProjectExplorer::BuildConfiguration *bc);
     void changedIndex(int newIndex);
 private:
-    int nameToIndex(const QString &buildConfiguration);
+    int nameToIndex(ProjectExplorer::BuildConfiguration *bc);
     bool ignoreIndexChange;
     ProjectExplorer::Project *m_project;
     QComboBox *m_comboBox;
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 05d90274633624921990a7e1f00975e5ad5934fb..91e4846f98774bb88039f1dd7548b6065d8b8c9f 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -34,14 +34,14 @@ using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 using ProjectExplorer::BuildConfiguration;
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro, const QString &name)
-    : BuildConfiguration(pro, name)
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro)
+    : BuildConfiguration(pro)
 {
 
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(const QString &name, Qt4BuildConfiguration *source)
-    : BuildConfiguration(name, source)
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BuildConfiguration *source)
+    : BuildConfiguration(source)
 {
 
 }
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 8ea2cd81160b03e0d996e0ded10f68f49449b050..ad66b4f177f0f782742f6417c305eebf1a2d97ee 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -41,9 +41,9 @@ namespace Internal {
 class Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
 public:
-    Qt4BuildConfiguration(Qt4Project *pro, const QString &name);
+    Qt4BuildConfiguration(Qt4Project *pro);
     // copy ctor
-    Qt4BuildConfiguration(const QString &name, Qt4BuildConfiguration *source);
+    Qt4BuildConfiguration(Qt4BuildConfiguration *source);
     ~Qt4BuildConfiguration();
 };
 
diff --git a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp
index 2edd8cfeb77c455d4ec94c407be89a8fafa7e226..16d64842ae76e5038f78dce2af1a779feed0a4f9 100644
--- a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.cpp
@@ -42,7 +42,7 @@ using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
 Qt4BuildEnvironmentWidget::Qt4BuildEnvironmentWidget(Qt4Project *project)
-    : BuildConfigWidget(), m_pro(project)
+    : BuildConfigWidget(), m_pro(project), m_buildConfiguration(0)
 {
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setMargin(0);
@@ -65,28 +65,25 @@ QString Qt4BuildEnvironmentWidget::displayName() const
     return tr("Build Environment");
 }
 
-void Qt4BuildEnvironmentWidget::init(const QString &buildConfiguration)
+void Qt4BuildEnvironmentWidget::init(ProjectExplorer::BuildConfiguration *bc)
 {
     if (debug)
         qDebug() << "Qt4BuildConfigWidget::init()";
 
-    m_buildConfiguration = 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_buildConfiguration = bc;
+    m_clearSystemEnvironmentCheckBox->setChecked(!m_pro->useSystemEnvironment(m_buildConfiguration));
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(m_buildConfiguration));
+    m_buildEnvironmentWidget->setUserChanges(m_pro->userEnvironmentChanges(m_buildConfiguration));
     m_buildEnvironmentWidget->updateButtons();
 }
 
 void Qt4BuildEnvironmentWidget::environmentModelUserChangesUpdated()
 {
-    m_pro->setUserEnvironmentChanges(m_pro->buildConfiguration(m_buildConfiguration),
-                                     m_buildEnvironmentWidget->userChanges());
+    m_pro->setUserEnvironmentChanges(m_buildConfiguration, m_buildEnvironmentWidget->userChanges());
 }
 
 void Qt4BuildEnvironmentWidget::clearSystemEnvironmentCheckBoxClicked(bool checked)
 {
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    m_pro->setUseSystemEnvironment(bc, !checked);
-    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(bc));
+    m_pro->setUseSystemEnvironment(m_buildConfiguration, !checked);
+    m_buildEnvironmentWidget->setBaseEnvironment(m_pro->baseEnvironment(m_buildConfiguration));
 }
diff --git a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.h b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.h
index c6c9d259e007cdbd958d177ce868d5d52a2c9ce3..7f565e73a28c987c486d7ea3d02cdc25328d6f8c 100644
--- a/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.h
+++ b/src/plugins/qt4projectmanager/qt4buildenvironmentwidget.h
@@ -53,7 +53,7 @@ public:
     Qt4BuildEnvironmentWidget(Qt4Project *project);
 
     QString displayName() const;
-    void init(const QString &buildConfiguration);
+    void init(ProjectExplorer::BuildConfiguration *bc);
 
 private slots:
     void environmentModelUserChangesUpdated();
@@ -63,7 +63,7 @@ private:
     ProjectExplorer::EnvironmentWidget *m_buildEnvironmentWidget;
     QCheckBox *m_clearSystemEnvironmentCheckBox;
     Qt4Project *m_pro;
-    QString m_buildConfiguration;
+    ProjectExplorer::BuildConfiguration *m_buildConfiguration;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index fdfa6ff5512f3175cc5628f1e7c73b0db1e7e9e1..d5f986e9dd82b3396aa5a280ac857313c5aa55aa 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -297,17 +297,17 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(const QString &type) co
     return bc;
 }
 
-BuildConfiguration *Qt4BuildConfigurationFactory::clone(const QString &name, BuildConfiguration *source) const
+BuildConfiguration *Qt4BuildConfigurationFactory::clone(BuildConfiguration *source) const
 {
     Qt4BuildConfiguration *oldbc = static_cast<Qt4BuildConfiguration *>(source);
-    Qt4BuildConfiguration *newbc = new Qt4BuildConfiguration(name, oldbc);
+    Qt4BuildConfiguration *newbc = new Qt4BuildConfiguration(oldbc);
     m_project->addBuildConfiguration(newbc);
     return newbc;
 }
 
-BuildConfiguration *Qt4BuildConfigurationFactory::restore(const QString &name) const
+BuildConfiguration *Qt4BuildConfigurationFactory::restore() const
 {
-    Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(m_project, name);
+    Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(m_project);
     return bc;
 }
 
@@ -459,7 +459,8 @@ Qt4BuildConfiguration *Qt4Project::addQt4BuildConfiguration(QString buildConfigu
     bool debug = qmakeBuildConfiguration & QtVersion::DebugBuild;
 
     // Add the buildconfiguration
-    Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this, buildConfigurationName);
+    Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this);
+    bc->setDisplayName(buildConfigurationName);
     addBuildConfiguration(bc);
 
     QMakeStep *qmakeStep = new QMakeStep(bc);
@@ -890,7 +891,7 @@ void Qt4Project::setUseSystemEnvironment(BuildConfiguration *configuration, bool
     if (useSystemEnvironment(configuration) == b)
         return;
     configuration->setValue("clearSystemEnvironment", !b);
-    emit environmentChanged(configuration->name());
+    emit environmentChanged(configuration);
 }
 
 bool Qt4Project::useSystemEnvironment(BuildConfiguration *configuration) const
@@ -911,7 +912,7 @@ void Qt4Project::setUserEnvironmentChanges(BuildConfiguration *configuration, co
     if (list == configuration->value("userEnvironmentChanges").toStringList())
         return;
     configuration->setValue("userEnvironmentChanges", list);
-    emit environmentChanged(configuration->name());
+    emit environmentChanged(configuration);
 }
 
 QString Qt4Project::qtDir(BuildConfiguration *configuration) const
@@ -931,7 +932,7 @@ int Qt4Project::qtVersionId(BuildConfiguration *configuration) const
 {
     QtVersionManager *vm = QtVersionManager::instance();
     if (debug)
-        qDebug()<<"Looking for qtVersion ID of "<<configuration->name();
+        qDebug()<<"Looking for qtVersion ID of "<<configuration->displayName();
     int id = 0;
     QVariant vid = configuration->value(KEY_QT_VERSION_ID);
     if (vid.isValid()) {
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index e0faac766c3156e0c2635357d0affdcac7f603f0..78494cde3f82aa923912005fc6db29fa952c3494 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -132,8 +132,8 @@ public:
     QString displayNameForType(const QString &type) const;
 
     ProjectExplorer::BuildConfiguration *create(const QString &type) const;
-    ProjectExplorer::BuildConfiguration *clone(const QString &name, ProjectExplorer::BuildConfiguration *source) const;
-    ProjectExplorer::BuildConfiguration *restore(const QString &name) const;
+    ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::BuildConfiguration *source) const;
+    ProjectExplorer::BuildConfiguration *restore() const;
 
     void update();
 
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index fdafc76416fe21493073626984e069aa4c972471..1a80dc1f1a7969d632ec639393b8bc58e0d70ba3 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -53,7 +53,8 @@ using namespace Qt4ProjectManager::Internal;
 
 Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Project *project)
     : BuildConfigWidget(),
-      m_pro(project)
+      m_pro(project),
+      m_buildConfiguration(0)
 {
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setMargin(0);
@@ -111,10 +112,9 @@ Qt4ProjectConfigWidget::~Qt4ProjectConfigWidget()
 
 void Qt4ProjectConfigWidget::updateDetails()
 {
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    QtVersion *version = m_pro->qtVersion(bc);
+    QtVersion *version = m_pro->qtVersion(m_buildConfiguration);
     QString versionString;
-    if (m_pro->qtVersionId(bc) == 0) {
+    if (m_pro->qtVersionId(m_buildConfiguration) == 0) {
         versionString = tr("Default Qt Version (%1)").arg(version->name());
     } else if(version){
         versionString = version->name();
@@ -126,8 +126,8 @@ void Qt4ProjectConfigWidget::updateDetails()
                                  "with tool chain <b>%2</b><br>"
                                  "building in <b>%3</b>")
                               .arg(versionString,
-                                   ProjectExplorer::ToolChain::toolChainName(m_pro->toolChainType(bc)),
-                                   QDir::toNativeSeparators(m_pro->buildDirectory(bc))));
+                                   ProjectExplorer::ToolChain::toolChainName(m_pro->toolChainType(m_buildConfiguration)),
+                                   QDir::toNativeSeparators(m_pro->buildDirectory(m_buildConfiguration))));
 }
 
 void Qt4ProjectConfigWidget::manageQtVersions()
@@ -142,22 +142,21 @@ QString Qt4ProjectConfigWidget::displayName() const
     return tr("General");
 }
 
-void Qt4ProjectConfigWidget::init(const QString &buildConfiguration)
+void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
 {
     if (debug)
-        qDebug() << "Qt4ProjectConfigWidget::init() for"<<buildConfiguration;
+        qDebug() << "Qt4ProjectConfigWidget::init() for"<<bc->displayName();
 
-    m_buildConfiguration = buildConfiguration;
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
-    m_ui->nameLineEdit->setText(bc->displayName());
+    m_buildConfiguration = bc;
+    m_ui->nameLineEdit->setText(m_buildConfiguration->displayName());
 
     setupQtVersionsComboBox();
 
-    bool shadowBuild = bc->value("useShadowBuild").toBool();
+    bool shadowBuild = m_buildConfiguration->value("useShadowBuild").toBool();
     m_ui->shadowBuildCheckBox->setChecked(shadowBuild);
     m_ui->shadowBuildDirEdit->setEnabled(shadowBuild);
     m_browseButton->setEnabled(shadowBuild);
-    m_ui->shadowBuildDirEdit->setPath(m_pro->buildDirectory(bc));
+    m_ui->shadowBuildDirEdit->setPath(m_pro->buildDirectory(m_buildConfiguration));
     updateImportLabel();
     updateToolChainCombo();
     updateDetails();
@@ -165,12 +164,12 @@ void Qt4ProjectConfigWidget::init(const QString &buildConfiguration)
 
 void Qt4ProjectConfigWidget::changeConfigName(const QString &newName)
 {
-    m_pro->setDisplayNameFor(m_pro->buildConfiguration(m_buildConfiguration), newName);
+    m_pro->setDisplayNameFor(m_buildConfiguration, newName);
 }
 
 void Qt4ProjectConfigWidget::setupQtVersionsComboBox()
 {
-    if (m_buildConfiguration.isEmpty()) // not yet initialized
+    if (!m_buildConfiguration) // not yet initialized
         return;
 
     disconnect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(QString)),
@@ -181,7 +180,7 @@ void Qt4ProjectConfigWidget::setupQtVersionsComboBox()
     m_ui->qtVersionComboBox->clear();
     m_ui->qtVersionComboBox->addItem(tr("Default Qt Version (%1)").arg(vm->defaultVersion()->name()), 0);
 
-    int qtVersionId = m_pro->qtVersionId(m_pro->buildConfiguration(m_buildConfiguration));
+    int qtVersionId = m_pro->qtVersionId(m_buildConfiguration);
 
     if (qtVersionId == 0) {
         m_ui->qtVersionComboBox->setCurrentIndex(0);
@@ -215,12 +214,11 @@ void Qt4ProjectConfigWidget::shadowBuildCheckBoxClicked(bool checked)
     m_ui->shadowBuildDirEdit->setEnabled(checked);
     m_browseButton->setEnabled(checked);
     bool b = m_ui->shadowBuildCheckBox->isChecked();
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    bc->setValue("useShadowBuild", b);
+    m_buildConfiguration->setValue("useShadowBuild", b);
     if (b)
-        bc->setValue("buildDirectory", m_ui->shadowBuildDirEdit->path());
+        m_buildConfiguration->setValue("buildDirectory", m_ui->shadowBuildDirEdit->path());
     else
-        bc->setValue("buildDirectory", QVariant(QString::null));
+        m_buildConfiguration->setValue("buildDirectory", QVariant(QString::null));
     updateDetails();
     m_pro->invalidateCachedTargetInformation();
     updateImportLabel();
@@ -231,10 +229,9 @@ void Qt4ProjectConfigWidget::updateImportLabel()
     bool visible = false;
 
     // we only show if we actually have a qmake and makestep
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    if (m_pro->qmakeStep(bc) && m_pro->makeStep(bc)) {
-        QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(m_pro->buildDirectory(bc));
-        QtVersion *version = m_pro->qtVersion(bc);
+    if (m_pro->qmakeStep(m_buildConfiguration) && m_pro->makeStep(m_buildConfiguration)) {
+        QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(m_pro->buildDirectory(m_buildConfiguration));
+        QtVersion *version = m_pro->qtVersion(m_buildConfiguration);
         // check that there's a makefile
         if (!qmakePath.isEmpty()) {
             // and that the qmake path is different from the current version
@@ -243,7 +240,7 @@ void Qt4ProjectConfigWidget::updateImportLabel()
                 visible = true;
             } else {
                 // check that the qmake flags, arguments match
-                visible = !m_pro->compareBuildConfigurationToImportFrom(bc, m_pro->buildDirectory(bc));
+                visible = !m_pro->compareBuildConfigurationToImportFrom(m_buildConfiguration, m_pro->buildDirectory(m_buildConfiguration));
             }
         } else {
             visible = false;
@@ -255,10 +252,9 @@ void Qt4ProjectConfigWidget::updateImportLabel()
 
 void Qt4ProjectConfigWidget::shadowBuildLineEditTextChanged()
 {
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    if (bc->value("buildDirectory").toString() == m_ui->shadowBuildDirEdit->path())
+    if (m_buildConfiguration->value("buildDirectory").toString() == m_ui->shadowBuildDirEdit->path())
         return;
-    bc->setValue("buildDirectory", m_ui->shadowBuildDirEdit->path());
+    m_buildConfiguration->setValue("buildDirectory", m_ui->shadowBuildDirEdit->path());
     // if the directory already exists
     // check if we have a build in there and
     // offer to import it
@@ -270,10 +266,9 @@ void Qt4ProjectConfigWidget::shadowBuildLineEditTextChanged()
 
 void Qt4ProjectConfigWidget::importLabelClicked()
 {
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    if (!m_pro->qmakeStep(bc) || !m_pro->makeStep(bc))
+    if (!m_pro->qmakeStep(m_buildConfiguration) || !m_pro->makeStep(m_buildConfiguration))
         return;
-    QString directory = m_pro->buildDirectory(bc);
+    QString directory = m_pro->buildDirectory(m_buildConfiguration);
     if (!directory.isEmpty()) {
         QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(directory);
         if (!qmakePath.isEmpty()) {
@@ -298,14 +293,14 @@ void Qt4ProjectConfigWidget::importLabelClicked()
             }
 
             // So we got all the information now apply it...
-            m_pro->setQtVersion(bc, version->uniqueId());
+            m_pro->setQtVersion(m_buildConfiguration, version->uniqueId());
             // Combo box will be updated at the end
 
-            QMakeStep *qmakeStep = m_pro->qmakeStep(bc);
+            QMakeStep *qmakeStep = m_pro->qmakeStep(m_buildConfiguration);
             qmakeStep->setQMakeArguments(additionalArguments);
-            MakeStep *makeStep = m_pro->makeStep(bc);
+            MakeStep *makeStep = m_pro->makeStep(m_buildConfiguration);
 
-            bc->setValue("buildConfiguration", int(qmakeBuildConfig));
+            m_buildConfiguration->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"
@@ -340,8 +335,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_pro->buildConfiguration(m_buildConfiguration))) {
-        m_pro->setQtVersion(m_pro->buildConfiguration(m_buildConfiguration), newQtVersion);
+    if (newQtVersion != m_pro->qtVersionId(m_buildConfiguration)) {
+        m_pro->setQtVersion(m_buildConfiguration, newQtVersion);
         updateToolChainCombo();
         m_pro->update();
     }
@@ -351,14 +346,13 @@ void Qt4ProjectConfigWidget::qtVersionComboBoxCurrentIndexChanged(const QString
 void Qt4ProjectConfigWidget::updateToolChainCombo()
 {
     m_ui->toolChainComboBox->clear();
-    ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(m_buildConfiguration);
-    QList<ProjectExplorer::ToolChain::ToolChainType> toolchains = m_pro->qtVersion(bc)->possibleToolChainTypes();
+    QList<ProjectExplorer::ToolChain::ToolChainType> toolchains = m_pro->qtVersion(m_buildConfiguration)->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(bc)));
+    setToolChain(toolchains.indexOf(m_pro->toolChainType(m_buildConfiguration)));
 }
 
 void Qt4ProjectConfigWidget::selectToolChain(int index)
@@ -372,7 +366,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_pro->buildConfiguration(m_buildConfiguration), selectedToolChainType);
+    m_pro->setToolChainType(m_buildConfiguration, selectedToolChainType);
     if (m_ui->toolChainComboBox->currentIndex() != index)
         m_ui->toolChainComboBox->setCurrentIndex(index);
     updateDetails();
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
index 5590c29fd64616de521c7cb55605d454765d5937..4abbee93ed86f9ce18aabd2e397fdb0199256a83 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
@@ -52,7 +52,7 @@ public:
     ~Qt4ProjectConfigWidget();
 
     QString displayName() const;
-    void init(const QString &buildConfiguration);
+    void init(ProjectExplorer::BuildConfiguration *bc);
 
 private slots:
     void changeConfigName(const QString &newName);
@@ -72,8 +72,8 @@ private:
     void setToolChain(int index);
     Ui::Qt4ProjectConfigWidget *m_ui;
     QAbstractButton *m_browseButton;
-    Qt4Project *m_pro;
-    QString m_buildConfiguration;
+    Qt4Project *m_pro; // TODO remove
+    ProjectExplorer::BuildConfiguration *m_buildConfiguration;
     Utils::DetailsWidget *m_detailsContainer;
 };
 
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index 40759947d647c0648fbf2e0144565fb8531bb7d3..8994ee9bd2e6bc574301a84612662d6137e801a4 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -80,7 +80,7 @@ Qt4RunConfiguration::Qt4RunConfiguration(Qt4Project *pro, const QString &proFile
     connect(pro, SIGNAL(activeBuildConfigurationChanged()),
             this, SIGNAL(baseEnvironmentChanged()));
 
-    connect(pro, SIGNAL(environmentChanged(QString)),
+    connect(pro, SIGNAL(environmentChanged(ProjectExplorer::BuildConfiguration *)),
             this, SIGNAL(baseEnvironmentChanged()));
 }