diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index 82e187367b6a11105a34ee1e448236a8c63c900e..3a422f834869661abd13b452f08f47bc691be816 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -306,13 +306,18 @@ void BuildSettingsWidget::cloneConfiguration(const QString &sourceConfiguration)
         return;
 
     QString newDisplayName = newBuildConfiguration;
-    // Check that the internal name is not taken and use a different one otherwise
-    if (m_project->buildConfiguration(newBuildConfiguration)) {
-        int i = 2;
-        while (m_project->buildConfiguration(newBuildConfiguration + QString::number(i)))
-            ++i;
-        newBuildConfiguration += QString::number(i);
-    }
+    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);
+
+    qDebug()<<"BuildSettingsWidget::cloneConfiguration source:"<<sourceConfiguration<<"to: "<<newBuildConfiguration;
 
     m_project->copyBuildConfiguration(sourceConfiguration, newBuildConfiguration);
     m_project->setDisplayNameFor(m_project->buildConfiguration(newBuildConfiguration), newDisplayName);
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 32d3fbdc4ff9da1124fcf0812c9ceb01dff0a19d..c556b5ad1e95748461f5940717b544b60266a50c 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -150,15 +150,10 @@ void Project::addBuildConfiguration(BuildConfiguration *configuration)
 void Project::removeBuildConfiguration(BuildConfiguration *configuration)
 {
     //todo: this might be error prone
-    if (!buildConfigurations().contains(configuration))
+    if (!m_buildConfigurationValues.contains(configuration))
         return;
 
-    for (int i = 0; i != m_buildConfigurationValues.size(); ++i)
-        if (m_buildConfigurationValues.at(i)->name() == configuration->name()) {
-            delete m_buildConfigurationValues.at(i);
-            m_buildConfigurationValues.removeAt(i);
-            break;
-        }
+    m_buildConfigurationValues.removeOne(configuration);
 
     for (int i = 0; i != m_buildSteps.size(); ++i)
         m_buildSteps.at(i)->removeBuildConfiguration(configuration->name());
@@ -166,6 +161,7 @@ void Project::removeBuildConfiguration(BuildConfiguration *configuration)
         m_cleanSteps.at(i)->removeBuildConfiguration(configuration->name());
 
     emit removedBuildConfiguration(this, configuration->name());
+    delete configuration;
 }
 
 void Project::copyBuildConfiguration(const QString &source, const QString &dest)
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 0df80346bbf1096623b923a4612896adf366b278..2740b17e49880ab6c34969ed2b6407d991f0fc0e 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -141,6 +141,7 @@ public:
     virtual QStringList includePaths(const QString &fileName) const;
     virtual QStringList frameworkPaths(const QString &fileName) const;
 
+    static QString makeUnique(const QString &preferedName, const QStringList &usedNames);
 signals:
     void fileListChanged();
 
@@ -183,7 +184,6 @@ protected:
     virtual bool restoreSettingsImpl(PersistentSettingsReader &reader);
 
 private:
-    static QString makeUnique(const QString &preferedName, const QStringList &usedNames);
     QList<BuildStep *> m_buildSteps;
     QList<BuildStep *> m_cleanSteps;
     QMap<QString, QVariant> m_values;