diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 47e67904c5927d04462b86b07c75967c28a8cc71..888f731a4d206d39c78394cd9ed423020adee2df 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -573,10 +573,9 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
 
         CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(this);
         bc->setDisplayName("all");
-        addBuildConfiguration(bc);
-        bc->setValue("msvcVersion", copw.msvcVersion());
+        bc->setMsvcVersion(copw.msvcVersion());
         if (!copw.buildDirectory().isEmpty())
-            bc->setValue("buildDirectory", copw.buildDirectory());
+            bc->setBuildDirectory(copw.buildDirectory());
 
         // Now create a standard build configuration
         makeStep = new MakeStep(bc);
@@ -586,12 +585,14 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
         MakeStep *cleanMakeStep = new MakeStep(bc);
         bc->insertCleanStep(0, cleanMakeStep);
         cleanMakeStep->setClean(true);
+
+        addBuildConfiguration(bc);
         setActiveBuildConfiguration(bc);
     } else {
         // We have a user file, but we could still be missing the cbp file
         // or simply run createXml with the saved settings
         QFileInfo sourceFileInfo(m_fileName);
-        BuildConfiguration *activeBC = activeBuildConfiguration();
+        CMakeBuildConfiguration *activeBC = activeCMakeBuildConfiguration();
         QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory()));
         QFileInfo cbpFileFi(cbpFile);
 
@@ -609,7 +610,7 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
                                         activeBC->environment());
             if (copw.exec() != QDialog::Accepted)
                 return false;
-            activeBC->setValue("msvcVersion", copw.msvcVersion());
+            activeBC->setMsvcVersion(copw.msvcVersion());
         }
     }
 
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index 3c1b38ec521cce67930d92fe93c3c06db86c69cc..4fbf07a01db9ad57b48fd91c12418596678eb0b6 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -64,6 +64,14 @@ QString GenericBuildConfiguration::buildDirectory() const
     return buildDirectory;
 }
 
+void GenericBuildConfiguration::setBuildDirectory(const QString &buildDirectory)
+{
+    if (value("buildDirectory").toString() == buildDirectory)
+        return;
+    setValue("buildDirectory", buildDirectory);
+    emit buildDirectoryChanged();
+}
+
 GenericProject *GenericBuildConfiguration::genericProject() const
 {
     return static_cast<GenericProject *>(project());
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
index b42d7ae062b8e457f2915f853c8ea24bb50f0aad..d360eea9293309026ff62e7378fbda59fe0e4a1c 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
@@ -49,6 +49,7 @@ public:
 
     virtual ProjectExplorer::Environment environment() const;
     virtual QString buildDirectory() const;
+    void setBuildDirectory(const QString &buildDirectory);
 };
 
 } // namespace GenericProjectManager
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 242e04c8c893a575bf36ca39961c74857e780cc7..2445acd0a133c8f2fd9b79f132399f7cfe8a3e93 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -525,7 +525,7 @@ bool GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead
         const QLatin1String buildDirectory("buildDirectory");
 
         const QFileInfo fileInfo(file()->fileName());
-        bc->setValue(buildDirectory, fileInfo.absolutePath());
+        bc->setBuildDirectory(fileInfo.absolutePath());
 
         setActiveBuildConfiguration(bc);
     }
@@ -614,7 +614,7 @@ void GenericBuildSettingsWidget::init(BuildConfiguration *bc)
 
 void GenericBuildSettingsWidget::buildDirectoryChanged()
 {
-    m_buildConfiguration->setValue("buildDirectory", m_pathChooser->path());
+    m_buildConfiguration->setBuildDirectory(m_pathChooser->path());
 }
 
 void GenericBuildSettingsWidget::toolChainSelected(int index)
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index 79d7cc6522342f25074836d76fcf335e994e18ef..b4651a807d49750b39eede6e65a2249e0dfe0fed 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -57,10 +57,6 @@ public:
     QString displayName() const;
     void setDisplayName(const QString &name);
 
-    // TODO remove those
-    QVariant value(const QString &key) const;
-    void setValue(const QString &key, QVariant value);
-
     QMap<QString, QVariant> toMap() const;
     void setValuesFromMap(QMap<QString, QVariant> map);
 
@@ -88,6 +84,10 @@ protected:
     BuildConfiguration(Project *project);
     BuildConfiguration(BuildConfiguration *source);
 
+    // TODO remove those
+    QVariant value(const QString &key) const;
+    void setValue(const QString &key, QVariant value);
+
 private:
     QList<BuildStep *> m_buildSteps;
     QList<BuildStep *> m_cleanSteps;
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index c3cbc89f0b98eb5e8a69be0e66406742a5bc0e5b..aa9c85bbfa84aaef814f4d72b252e0bf19708976 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -119,6 +119,7 @@ void Qt4BuildConfiguration::setUserEnvironmentChanges(const QList<ProjectExplore
     emit environmentChanged();
 }
 
+/// returns the build directory
 QString Qt4BuildConfiguration::buildDirectory() const
 {
     QString workingDirectory;
@@ -129,8 +130,27 @@ QString Qt4BuildConfiguration::buildDirectory() const
     return workingDirectory;
 }
 
+/// returns whether this is a shadow build configuration or not
+/// note, even if shadowBuild() returns true, it might be using the
+/// source directory as the shadow build directorys, thus not
+/// still be a insource build
+bool Qt4BuildConfiguration::shadowBuild() const
+{
+    return value("useShadowBuild").toBool();
+}
+
+/// returns the shadow build directory if set
+/// \note buildDirectory() is probably the function you want to call
+QString Qt4BuildConfiguration::shadowBuildDirectory() const
+{
+    return value("buildDirectory").toString();
+}
+
 void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory)
 {
+    if (value("useShadowBuild").toBool() == shadowBuild
+        && value("buildDirectory").toString() == buildDirectory)
+        return;
     setValue("useShadowBuild", shadowBuild);
     setValue("buildDirectory", buildDirectory);
     emit buildDirectoryChanged();
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 262e1cf2198eef702c546b53dd5d8df8278c9894..9ae35f8614e2f740984e328a7dd015932c20aa1e 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -63,6 +63,8 @@ public:
     void setUseSystemEnvironment(bool b);
 
     virtual QString buildDirectory() const;
+    bool shadowBuild() const;
+    QString shadowBuildDirectory() const;
     void setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory);
 
     //returns the qtVersion, if the project is set to use the default qt version, then
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index ac42bec16c75e0045eeb78b9aa7ba0c8f7338005..a6f4393a0b7701166e9552cc671b339a34e9296f 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -166,7 +166,7 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
 
     qtVersionsChanged();
 
-    bool shadowBuild = m_buildConfiguration->value("useShadowBuild").toBool();
+    bool shadowBuild = m_buildConfiguration->shadowBuild();
     m_ui->shadowBuildCheckBox->setChecked(shadowBuild);
     m_ui->shadowBuildDirEdit->setEnabled(shadowBuild);
     m_browseButton->setEnabled(shadowBuild);
@@ -225,7 +225,7 @@ void Qt4ProjectConfigWidget::qtVersionsChanged()
 
 void Qt4ProjectConfigWidget::buildDirectoryChanged()
 {
-    m_ui->shadowBuildDirEdit->setPath(m_buildConfiguration->value("buildDirectory").toString());
+    m_ui->shadowBuildDirEdit->setPath(m_buildConfiguration->shadowBuildDirectory());
     updateDetails();
     updateImportLabel();
 }
@@ -253,7 +253,7 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked)
 
 void Qt4ProjectConfigWidget::shadowBuildEdited()
 {
-    if (m_buildConfiguration->value("buildDirectory").toString() == m_ui->shadowBuildDirEdit->path())
+    if (m_buildConfiguration->shadowBuildDirectory() == m_ui->shadowBuildDirEdit->path())
         return;
     m_ignoreChange = true;
     m_buildConfiguration->setShadowBuildAndDirectory(true, m_ui->shadowBuildDirEdit->path());