diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.cpp b/src/plugins/autotoolsprojectmanager/autogenstep.cpp
index f8afd63a02cc2bd2c13b0f9474ce8afeb3bc7baa..06071a228e40ae090521249097bb3665017def75 100644
--- a/src/plugins/autotoolsprojectmanager/autogenstep.cpp
+++ b/src/plugins/autotoolsprojectmanager/autogenstep.cpp
@@ -158,7 +158,7 @@ bool AutogenStep::init()
     ProcessParameters *pp = processParameters();
     pp->setMacroExpander(bc->macroExpander());
     pp->setEnvironment(bc->environment());
-    pp->setWorkingDirectory(bc->buildDirectory());
+    pp->setWorkingDirectory(bc->buildDirectory().toString());
     pp->setCommand(QLatin1String("autogen.sh"));
     pp->setArguments(additionalArguments());
     pp->resolveAll();
@@ -171,9 +171,10 @@ void AutogenStep::run(QFutureInterface<bool> &interface)
     BuildConfiguration *bc = buildConfiguration();
 
     // Check whether we need to run autogen.sh
-    const QFileInfo configureInfo(bc->buildDirectory() + QLatin1String("/configure"));
-    const QFileInfo configureAcInfo(bc->buildDirectory() + QLatin1String("/configure.ac"));
-    const QFileInfo makefileAmInfo(bc->buildDirectory() + QLatin1String("/Makefile.am"));
+    const QString buildDir = bc->buildDirectory().toString();
+    const QFileInfo configureInfo(buildDir + QLatin1String("/configure"));
+    const QFileInfo configureAcInfo(buildDir + QLatin1String("/configure.ac"));
+    const QFileInfo makefileAmInfo(buildDir + QLatin1String("/Makefile.am"));
 
     if (!configureInfo.exists()
         || configureInfo.lastModified() < configureAcInfo.lastModified()
@@ -275,7 +276,7 @@ void AutogenStepConfigWidget::updateDetails()
     ProcessParameters param;
     param.setMacroExpander(bc->macroExpander());
     param.setEnvironment(bc->environment());
-    param.setWorkingDirectory(bc->buildDirectory());
+    param.setWorkingDirectory(bc->buildDirectory().toString());
     param.setCommand(QLatin1String("autogen.sh"));
     param.setArguments(m_autogenStep->additionalArguments());
     m_summaryText = param.summary(displayName());
diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp
index adcb7b0096f1c2671f54d3f340225de561719dd8..1b8d7b8990a2c5f7ffe82a351c11abcb0aec0ca5 100644
--- a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp
+++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp
@@ -157,7 +157,7 @@ bool AutoreconfStep::init()
     ProcessParameters *pp = processParameters();
     pp->setMacroExpander(bc->macroExpander());
     pp->setEnvironment(bc->environment());
-    pp->setWorkingDirectory(bc->buildDirectory());
+    pp->setWorkingDirectory(bc->buildDirectory().toString());
     pp->setCommand(QLatin1String("autoreconf"));
     pp->setArguments(additionalArguments());
     pp->resolveAll();
@@ -170,7 +170,8 @@ void AutoreconfStep::run(QFutureInterface<bool> &interface)
     BuildConfiguration *bc = buildConfiguration();
 
     // Check whether we need to run autoreconf
-    const QFileInfo configureInfo(bc->buildDirectory() + QLatin1String("/configure"));
+    const QString buildDir = bc->buildDirectory().toString();
+    const QFileInfo configureInfo(buildDir + QLatin1String("/configure"));
 
     if (!configureInfo.exists())
         m_runAutoreconf = true;
@@ -269,7 +270,7 @@ void AutoreconfStepConfigWidget::updateDetails()
     ProcessParameters param;
     param.setMacroExpander(bc->macroExpander());
     param.setEnvironment(bc->environment());
-    param.setWorkingDirectory(bc->buildDirectory());
+    param.setWorkingDirectory(bc->buildDirectory().toString());
     param.setCommand(QLatin1String("autoreconf"));
     param.setArguments(m_autoreconfStep->additionalArguments());
     m_summaryText = param.summary(displayName());
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp
index bf07d5c593ef2b25a3f16cbf8cfc7125054dc72f..26bdc479b605ed86458aec69c2f78e8d5437d749 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp
@@ -59,11 +59,7 @@ using namespace ProjectExplorer::Constants;
 //////////////////////////////////////
 AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent)
     : BuildConfiguration(parent, Core::Id(AUTOTOOLS_BC_ID))
-{
-    AutotoolsProject *project = qobject_cast<AutotoolsProject *>(parent->project());
-    if (project)
-        m_buildDirectory = project->defaultBuildDirectory();
-}
+{ }
 
 NamedWidget *AutotoolsBuildConfiguration::createConfigWidget()
 {
@@ -72,46 +68,15 @@ NamedWidget *AutotoolsBuildConfiguration::createConfigWidget()
 
 AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id)
     : BuildConfiguration(parent, id)
-{
-}
+{ }
 
 AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent,
                                                          AutotoolsBuildConfiguration *source)
-    : BuildConfiguration(parent, source),
-      m_buildDirectory(source->m_buildDirectory)
+    : BuildConfiguration(parent, source)
 {
     cloneSteps(source);
 }
 
-QVariantMap AutotoolsBuildConfiguration::toMap() const
-{
-    QVariantMap map = BuildConfiguration::toMap();
-    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
-    return map;
-}
-
-bool AutotoolsBuildConfiguration::fromMap(const QVariantMap &map)
-{
-    if (!BuildConfiguration::fromMap(map))
-        return false;
-
-    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
-    return true;
-}
-
-QString AutotoolsBuildConfiguration::buildDirectory() const
-{
-    return m_buildDirectory;
-}
-
-void AutotoolsBuildConfiguration::setBuildDirectory(const QString &buildDirectory)
-{
-    if (m_buildDirectory == buildDirectory)
-        return;
-    m_buildDirectory = buildDirectory;
-    emit buildDirectoryChanged();
-}
-
 //////////////////////////////////////
 // AutotoolsBuildConfiguration class
 //////////////////////////////////////
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h
index 639efc305d9308bca3e572dc833f3c755437ef34..7fb3a04792bc5a86af8bb5bb6f187a47feab1ef1 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h
@@ -39,6 +39,7 @@ namespace Internal {
 
 class AutotoolsTarget;
 class AutotoolsBuildConfigurationFactory;
+class AutotoolsBuildSettingsWidget;
 
 class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
@@ -50,19 +51,13 @@ public:
 
     ProjectExplorer::NamedWidget *createConfigWidget();
 
-    QString buildDirectory() const;
-    void setBuildDirectory(const QString &buildDirectory);
-    QVariantMap toMap() const;
     BuildType buildType() const;
 
 protected:
     AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id);
     AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, AutotoolsBuildConfiguration *source);
 
-    bool fromMap(const QVariantMap &map);
-
-private:
-    QString m_buildDirectory;
+    friend class AutotoolsBuildSettingsWidget;
 };
 
 class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp
index e55079283b6d11c47747e3961c3d075ddf18b7f1..627510bb467367bb78f937d24c902c7ff1d70461 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.cpp
@@ -59,15 +59,24 @@ AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget(AutotoolsBuildConfigu
     m_pathChooser = new Utils::PathChooser(this);
     m_pathChooser->setEnabled(true);
     m_pathChooser->setExpectedKind(Utils::PathChooser::Directory);
+    m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory());
+    m_pathChooser->setEnvironment(bc->environment());
     fl->addRow(tr("Build directory:"), m_pathChooser);
     connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged()));
 
     m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory());
-    m_pathChooser->setPath(m_buildConfiguration->buildDirectory());
+    m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory().toString());
     setDisplayName(tr("Autotools Manager"));
+
+    connect(bc, SIGNAL(environmentChanged()), this, SLOT(environmentHasChanged()));
 }
 
 void AutotoolsBuildSettingsWidget::buildDirectoryChanged()
 {
-    m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath());
+    m_buildConfiguration->setBuildDirectory(Utils::FileName::fromString(m_pathChooser->rawPath()));
+}
+
+void AutotoolsBuildSettingsWidget::environmentHasChanged()
+{
+    m_pathChooser->setEnvironment(m_buildConfiguration->environment());
 }
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h
index 459fb2e2342af8ca05672b8f8f5c8b394758c779..183c2e4300c15cc16b8e93e5953ca2fa3212031b 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildsettingswidget.h
@@ -61,6 +61,7 @@ public:
 
 private slots:
     void buildDirectoryChanged();
+    void environmentHasChanged();
 
 private:
     Utils::PathChooser *m_pathChooser;
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h b/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h
index 382737e709da2dd09766db391a9c26db125f377d..44a0c21f6d8887e47e74896467bdea2882fbd28d 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectconstants.h
@@ -41,7 +41,6 @@ namespace Constants {
 
 //BuildConfiguration
     const char AUTOTOOLS_BC_ID[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration";
-    const char BUILD_DIRECTORY_KEY[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration.BuildDirectory";
 
 //Project
     const char AUTOTOOLS_PROJECT_ID[] = "AutotoolsProjectManager.AutotoolsProject";
diff --git a/src/plugins/autotoolsprojectmanager/configurestep.cpp b/src/plugins/autotoolsprojectmanager/configurestep.cpp
index 687fcc924e6d989ef636e97f4b15ae29eb92e724..8f0b13d818d01d962ff4b086c326c8e15c65ba27 100644
--- a/src/plugins/autotoolsprojectmanager/configurestep.cpp
+++ b/src/plugins/autotoolsprojectmanager/configurestep.cpp
@@ -158,7 +158,7 @@ bool ConfigureStep::init()
     ProcessParameters *pp = processParameters();
     pp->setMacroExpander(bc->macroExpander());
     pp->setEnvironment(bc->environment());
-    pp->setWorkingDirectory(bc->buildDirectory());
+    pp->setWorkingDirectory(bc->buildDirectory().toString());
     pp->setCommand(QLatin1String("configure"));
     pp->setArguments(additionalArguments());
     pp->resolveAll();
@@ -171,8 +171,9 @@ void ConfigureStep::run(QFutureInterface<bool>& interface)
     BuildConfiguration *bc = buildConfiguration();
 
     //Check whether we need to run configure
-    const QFileInfo configureInfo(bc->buildDirectory() + QLatin1String("/configure"));
-    const QFileInfo configStatusInfo(bc->buildDirectory() + QLatin1String("/config.status"));
+    QString buildDir = bc->buildDirectory().toString();
+    const QFileInfo configureInfo(buildDir +QLatin1String("/configure"));
+    const QFileInfo configStatusInfo(buildDir + QLatin1String("/config.status"));
 
     if (!configStatusInfo.exists()
         || configStatusInfo.lastModified() < configureInfo.lastModified()) {
@@ -273,7 +274,7 @@ void ConfigureStepConfigWidget::updateDetails()
     ProcessParameters param;
     param.setMacroExpander(bc->macroExpander());
     param.setEnvironment(bc->environment());
-    param.setWorkingDirectory(bc->buildDirectory());
+    param.setWorkingDirectory(bc->buildDirectory().toString());
     param.setCommand(QLatin1String("configure"));
     param.setArguments(m_configureStep->additionalArguments());
     m_summaryText = param.summary(displayName());
diff --git a/src/plugins/autotoolsprojectmanager/makestep.cpp b/src/plugins/autotoolsprojectmanager/makestep.cpp
index 248577999958501c8f4e947fd9effd77dc879cea..51206624c41c2024af3b46740d9db73702e1e114 100644
--- a/src/plugins/autotoolsprojectmanager/makestep.cpp
+++ b/src/plugins/autotoolsprojectmanager/makestep.cpp
@@ -186,7 +186,7 @@ bool MakeStep::init()
     // addToEnvironment() to not screw up the users run environment.
     env.set(QLatin1String("LC_ALL"), QLatin1String("C"));
     pp->setEnvironment(env);
-    pp->setWorkingDirectory(bc->buildDirectory());
+    pp->setWorkingDirectory(bc->buildDirectory().toString());
     pp->setCommand(tc ? tc->makeCommand(bc->environment()) : QLatin1String("make"));
     pp->setArguments(arguments);
     pp->resolveAll();
@@ -321,7 +321,7 @@ void MakeStepConfigWidget::updateDetails()
         ProcessParameters param;
         param.setMacroExpander(bc->macroExpander());
         param.setEnvironment(bc->environment());
-        param.setWorkingDirectory(bc->buildDirectory());
+        param.setWorkingDirectory(bc->buildDirectory().toString());
         param.setCommand(tc->makeCommand(bc->environment()));
         param.setArguments(arguments);
         m_summaryText = param.summary(displayName());
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index f460ec622203c04b0ecc5f241c76bf44f2483ff7..3af1ccf90153d53aa29105f3edb4bf2f6172000f 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -44,7 +44,6 @@ using namespace CMakeProjectManager;
 using namespace Internal;
 
 namespace {
-const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory";
 const char USE_NINJA_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.UseNinja";
 } // namespace
 
@@ -52,15 +51,14 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent
     BuildConfiguration(parent, Core::Id(Constants::CMAKE_BC_ID)), m_useNinja(false)
 {
     CMakeProject *project = static_cast<CMakeProject *>(parent->project());
-    m_buildDirectory = project->shadowBuildDirectory(project->projectFilePath(),
-                                                     parent->kit(),
-                                                     displayName());
+    setBuildDirectory(Utils::FileName::fromString(project->shadowBuildDirectory(project->projectFilePath(),
+                                                                                parent->kit(),
+                                                                                displayName())));
 }
 
 CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent,
                                                  CMakeBuildConfiguration *source) :
     BuildConfiguration(parent, source),
-    m_buildDirectory(source->m_buildDirectory),
     m_msvcVersion(source->m_msvcVersion),
     m_useNinja(false)
 {
@@ -71,7 +69,6 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent
 QVariantMap CMakeBuildConfiguration::toMap() const
 {
     QVariantMap map(ProjectExplorer::BuildConfiguration::toMap());
-    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
     map.insert(QLatin1String(USE_NINJA_KEY), m_useNinja);
     return map;
 }
@@ -81,7 +78,6 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map)
     if (!BuildConfiguration::fromMap(map))
         return false;
 
-    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
     m_useNinja = map.value(QLatin1String(USE_NINJA_KEY), false).toBool();
 
     return true;
@@ -108,20 +104,6 @@ ProjectExplorer::NamedWidget *CMakeBuildConfiguration::createConfigWidget()
     return new CMakeBuildSettingsWidget(this);
 }
 
-QString CMakeBuildConfiguration::buildDirectory() const
-{
-    return m_buildDirectory;
-}
-
-void CMakeBuildConfiguration::setBuildDirectory(const QString &buildDirectory)
-{
-    if (m_buildDirectory == buildDirectory)
-        return;
-    m_buildDirectory = buildDirectory;
-    emit buildDirectoryChanged();
-    emit environmentChanged();
-}
-
 /*!
   \class CMakeBuildConfigurationFactory
 */
@@ -205,7 +187,7 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer:
     cleanMakeStep->setAdditionalArguments(QLatin1String("clean"));
     cleanMakeStep->setClean(true);
 
-    bc->setBuildDirectory(copw.buildDirectory());
+    bc->setBuildDirectory(Utils::FileName::fromString(copw.buildDirectory()));
     bc->setUseNinja(copw.useNinja());
 
     // Default to all
@@ -254,7 +236,7 @@ bool CMakeBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t)
 ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildType() const
 {
     QString cmakeBuildType;
-    QFile cmakeCache(buildDirectory() + QLatin1String("/CMakeCache.txt"));
+    QFile cmakeCache(buildDirectory().toString() + QLatin1String("/CMakeCache.txt"));
     if (cmakeCache.open(QIODevice::ReadOnly)) {
         while (!cmakeCache.atEnd()) {
             QByteArray line = cmakeCache.readLine();
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
index 494c28ea2cfefe8ccdf02106dd55562d6b20a0bc..d4d7286988ac1992a9097a7c4b96d710cbca273d 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
@@ -39,6 +39,7 @@ class ToolChain;
 
 namespace CMakeProjectManager {
 namespace Internal {
+class CMakeProject;
 
 class CMakeBuildConfigurationFactory;
 
@@ -52,9 +53,6 @@ public:
     ~CMakeBuildConfiguration();
 
     ProjectExplorer::NamedWidget *createConfigWidget();
-    QString buildDirectory() const;
-
-    void setBuildDirectory(const QString &buildDirectory);
 
     QVariantMap toMap() const;
 
@@ -71,9 +69,10 @@ protected:
     bool fromMap(const QVariantMap &map);
 
 private:
-    QString m_buildDirectory;
     QString m_msvcVersion;
     bool m_useNinja;
+
+    friend class CMakeProject;
 };
 
 class CMakeBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h
index 90db12521262f96eb55f6c51e393fb6cfba92df6..5b1a7f6841064e75ea393998d9644a5abba646d8 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h
@@ -78,7 +78,7 @@ public:
 
         BuildInfo(CMakeBuildConfiguration *bc)
             : sourceDirectory(bc->target()->project()->projectDirectory())
-            , buildDirectory(bc->buildDirectory())
+            , buildDirectory(bc->buildDirectory().toString())
             , environment(bc->environment())
             , useNinja(bc->useNinja())
             , kit(bc->target()->kit())
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 3be2f5f483185b781b8e5bd0d23b1e7334c9835a..e0044282c164f9cf62076f9e15b16f3ddca4c406 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -135,7 +135,7 @@ void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfigur
     CMakeBuildConfiguration *cmakebc = static_cast<CMakeBuildConfiguration *>(bc);
 
     // Pop up a dialog asking the user to rerun cmake
-    QString cbpFile = CMakeManager::findCbpFile(QDir(bc->buildDirectory()));
+    QString cbpFile = CMakeManager::findCbpFile(QDir(bc->buildDirectory().toString()));
     QFileInfo cbpFileFi(cbpFile);
     CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing;
     if (!cbpFileFi.exists()) {
@@ -180,7 +180,7 @@ void CMakeProject::activeTargetWasChanged(Target *target)
 
 void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory)
 {
-    bc->setBuildDirectory(newBuildDirectory);
+    bc->setBuildDirectory(Utils::FileName::fromString(newBuildDirectory));
     parseCMakeLists();
 }
 
@@ -210,7 +210,7 @@ bool CMakeProject::parseCMakeLists()
             document->infoBar()->removeInfo(Core::Id("CMakeEditor.RunCMake"));
 
     // Find cbp file
-    QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory());
+    QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory().toString());
 
     if (cbpFile.isEmpty()) {
         emit buildTargetsChanged();
@@ -559,7 +559,7 @@ bool CMakeProject::fromMap(const QVariantMap &map)
         CMakeBuildConfiguration *bc(new CMakeBuildConfiguration(t));
         bc->setDefaultDisplayName(QLatin1String("all"));
         bc->setUseNinja(copw.useNinja());
-        bc->setBuildDirectory(copw.buildDirectory());
+        bc->setBuildDirectory(Utils::FileName::fromString(copw.buildDirectory()));
         ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
         ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
 
@@ -585,7 +585,7 @@ bool CMakeProject::fromMap(const QVariantMap &map)
         CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration());
         if (!activeBC)
             return false;
-        QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory()));
+        QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory().toString()));
         QFileInfo cbpFileFi(cbpFile);
 
         CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing;
@@ -669,7 +669,7 @@ QString CMakeProject::uiHeaderFile(const QString &uiFile)
 
     QDir srcDirRoot = QDir(project.toString());
     QString relativePath = srcDirRoot.relativeFilePath(baseDirectory.toString());
-    QDir buildDir = QDir(activeTarget()->activeBuildConfiguration()->buildDirectory());
+    QDir buildDir = QDir(activeTarget()->activeBuildConfiguration()->buildDirectory().toString());
     QString uiHeaderFilePath = buildDir.absoluteFilePath(relativePath);
     uiHeaderFilePath += QLatin1String("/ui_");
     uiHeaderFilePath += fi.completeBaseName();
@@ -839,8 +839,8 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
     fl->addRow(tr("Build directory:"), hbox);
 
     m_buildConfiguration = bc;
-    m_pathLineEdit->setText(m_buildConfiguration->buildDirectory());
-    if (m_buildConfiguration->buildDirectory() == bc->target()->project()->projectDirectory())
+    m_pathLineEdit->setText(m_buildConfiguration->rawBuildDirectory().toString());
+    if (m_buildConfiguration->buildDirectory().toString() == bc->target()->project()->projectDirectory())
         m_changeButton->setEnabled(false);
     else
         m_changeButton->setEnabled(true);
@@ -856,7 +856,7 @@ void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog()
     if (copw.exec() == QDialog::Accepted) {
         project->changeBuildDirectory(m_buildConfiguration, copw.buildDirectory());
         m_buildConfiguration->setUseNinja(copw.useNinja());
-        m_pathLineEdit->setText(m_buildConfiguration->buildDirectory());
+        m_pathLineEdit->setText(m_buildConfiguration->rawBuildDirectory().toString());
     }
 }
 
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index 9dad1172f6afd23d3f1b715531bd6ef52e2bda02..957f9cf069f67aaca6b39cf04c0d2ba4c7bfa3ed 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -192,7 +192,7 @@ bool MakeStep::init()
     if (m_useNinja && !env.value(QLatin1String("NINJA_STATUS")).startsWith(m_ninjaProgressString))
         env.set(QLatin1String("NINJA_STATUS"), m_ninjaProgressString + QLatin1String("%o/sec] "));
     pp->setEnvironment(env);
-    pp->setWorkingDirectory(bc->buildDirectory());
+    pp->setWorkingDirectory(bc->buildDirectory().toString());
     pp->setCommand(makeCommand(tc, bc->environment()));
     pp->setArguments(arguments);
     pp->resolveAll();
@@ -408,7 +408,7 @@ void MakeStepConfigWidget::updateDetails()
         ProcessParameters param;
         param.setMacroExpander(bc->macroExpander());
         param.setEnvironment(bc->environment());
-        param.setWorkingDirectory(bc->buildDirectory());
+        param.setWorkingDirectory(bc->buildDirectory().toString());
         param.setCommand(m_makeStep->makeCommand(tc, bc->environment()));
         param.setArguments(arguments);
         m_summaryText = param.summary(displayName());
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index ab172b5b22e90ccefdbce0d61da2f7e2d1dec43e..cc7588bd593bb681221fc973a11e56cac76f2cb5 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -359,7 +359,7 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu
         if (const Project *project = target->project()) {
             sp.projectSourceDirectory = project->projectDirectory();
             if (const BuildConfiguration *buildConfig = target->activeBuildConfiguration())
-                sp.projectBuildDirectory = buildConfig->buildDirectory();
+                sp.projectBuildDirectory = buildConfig->buildDirectory().toString();
             sp.projectSourceFiles = project->files(Project::ExcludeGeneratedFiles);
         }
     }
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index 663552a6357e6378774f42e2c35bc1473ac15600..3d451c6692b06a61c82b1fb28e84ed98572a70e9 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -48,7 +48,6 @@ namespace GenericProjectManager {
 namespace Internal {
 
 const char GENERIC_BC_ID[] = "GenericProjectManager.GenericBuildConfiguration";
-const char BUILD_DIRECTORY_KEY[] = "GenericProjectManager.GenericBuildConfiguration.BuildDirectory";
 
 GenericBuildConfiguration::GenericBuildConfiguration(Target *parent)
     : BuildConfiguration(parent, Core::Id(GENERIC_BC_ID))
@@ -61,50 +60,11 @@ GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, const Core:
 }
 
 GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, GenericBuildConfiguration *source) :
-    BuildConfiguration(parent, source),
-    m_buildDirectory(source->m_buildDirectory)
+    BuildConfiguration(parent, source)
 {
     cloneSteps(source);
 }
 
-QVariantMap GenericBuildConfiguration::toMap() const
-{
-    QVariantMap map(BuildConfiguration::toMap());
-    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
-    return map;
-}
-
-bool GenericBuildConfiguration::fromMap(const QVariantMap &map)
-{
-    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), target()->project()->projectDirectory()).toString();
-
-    return BuildConfiguration::fromMap(map);
-}
-
-QString GenericBuildConfiguration::buildDirectory() const
-{
-    // Convert to absolute path when necessary
-    const QDir projectDir(target()->project()->projectDirectory());
-    return projectDir.absoluteFilePath(m_buildDirectory);
-}
-
-/**
- * Returns the build directory unmodified, instead of making it absolute like
- * buildDirectory() does.
- */
-QString GenericBuildConfiguration::rawBuildDirectory() const
-{
-    return m_buildDirectory;
-}
-
-void GenericBuildConfiguration::setBuildDirectory(const QString &buildDirectory)
-{
-    if (m_buildDirectory == buildDirectory)
-        return;
-    m_buildDirectory = buildDirectory;
-    emit buildDirectoryChanged();
-}
-
 NamedWidget *GenericBuildConfiguration::createConfigWidget()
 {
     return new GenericBuildSettingsWidget(this);
@@ -244,13 +204,21 @@ GenericBuildSettingsWidget::GenericBuildSettingsWidget(GenericBuildConfiguration
 
     m_buildConfiguration = bc;
     m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory());
-    m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory());
+    m_pathChooser->setEnvironment(bc->environment());
+    m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory().toString());
     setDisplayName(tr("Generic Manager"));
+
+    connect(bc, SIGNAL(environmentChanged()), this, SLOT(environmentHasChanged()));
 }
 
 void GenericBuildSettingsWidget::buildDirectoryChanged()
 {
-    m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath());
+    m_buildConfiguration->setBuildDirectory(Utils::FileName::fromString(m_pathChooser->rawPath()));
+}
+
+void GenericBuildSettingsWidget::environmentHasChanged()
+{
+    m_pathChooser->setEnvironment(m_buildConfiguration->environment());
 }
 
 } // namespace Internal
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
index 996fa4ae4245e06398154926b3863c00088be575..38624547ab9f1937a7571d81d9f9aa669864e09d 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
@@ -40,6 +40,7 @@ namespace Internal {
 
 class GenericTarget;
 class GenericBuildConfigurationFactory;
+class GenericBuildSettingsWidget;
 
 class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
@@ -50,21 +51,14 @@ public:
     explicit GenericBuildConfiguration(ProjectExplorer::Target *parent);
 
     ProjectExplorer::NamedWidget *createConfigWidget();
-    QString buildDirectory() const;
 
-    QString rawBuildDirectory() const;
-    void setBuildDirectory(const QString &buildDirectory);
-
-    QVariantMap toMap() const;
     BuildType buildType() const;
 
 protected:
     GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source);
     GenericBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id);
-    virtual bool fromMap(const QVariantMap &map);
 
-private:
-    QString m_buildDirectory;
+    friend class GenericBuildSettingsWidget;
 };
 
 class GenericBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
@@ -98,6 +92,7 @@ public:
 
 private slots:
     void buildDirectoryChanged();
+    void environmentHasChanged();
 
 private:
     Utils::PathChooser *m_pathChooser;
diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp
index da24383a734fa4d6f6e2e5d6955cce3fefb7aeb9..4fcce35c1d4d42a7affd30cd63ba60620091e81d 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.cpp
+++ b/src/plugins/genericprojectmanager/genericmakestep.cpp
@@ -113,7 +113,7 @@ bool GenericMakeStep::init()
 
     ProcessParameters *pp = processParameters();
     pp->setMacroExpander(bc->macroExpander());
-    pp->setWorkingDirectory(bc->buildDirectory());
+    pp->setWorkingDirectory(bc->buildDirectory().toString());
     Utils::Environment env = bc->environment();
     // Force output to english for the parsers. Do this here and not in the toolchain's
     // addToEnvironment() to not screw up the users run environment.
@@ -301,7 +301,7 @@ void GenericMakeStepConfigWidget::updateDetails()
 
     ProcessParameters param;
     param.setMacroExpander(bc->macroExpander());
-    param.setWorkingDirectory(bc->buildDirectory());
+    param.setWorkingDirectory(bc->buildDirectory().toString());
     param.setEnvironment(bc->environment());
     param.setCommand(m_makeStep->makeCommand(bc->environment()));
     param.setArguments(m_makeStep->allArguments());
diff --git a/src/plugins/madde/maemoinstalltosysrootstep.cpp b/src/plugins/madde/maemoinstalltosysrootstep.cpp
index 00c918b71273865e4ec756936cd37bafabce1c6d..8352b291950b943509757282abfba70ca1bfe393 100644
--- a/src/plugins/madde/maemoinstalltosysrootstep.cpp
+++ b/src/plugins/madde/maemoinstalltosysrootstep.cpp
@@ -366,7 +366,7 @@ bool MaemoMakeInstallToSysrootStep::init()
     processParameters()->setCommand(command);
     processParameters()->setArguments(args.join(QLatin1String(" ")));
     processParameters()->setEnvironment(env);
-    processParameters()->setWorkingDirectory(bc->buildDirectory());
+    processParameters()->setWorkingDirectory(bc->buildDirectory().toString());
     return true;
 }
 
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 9c8c41d807d498d84b16ea38b728e7340d97a78a..72e52a69aa55a3bbdb7d33490a54147bfbb43b7b 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -49,6 +49,7 @@ static const char BUILD_STEP_LIST_COUNT[] = "ProjectExplorer.BuildConfiguration.
 static const char BUILD_STEP_LIST_PREFIX[] = "ProjectExplorer.BuildConfiguration.BuildStepList.";
 static const char CLEAR_SYSTEM_ENVIRONMENT_KEY[] = "ProjectExplorer.BuildConfiguration.ClearSystemEnvironment";
 static const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.BuildConfiguration.UserEnvironmentChanges";
+static const char BUILDDIRECTORY_KEY[] = "ProjectExplorer.BuildConfiguration.BuildDirectory";
 
 namespace ProjectExplorer {
 namespace Internal {
@@ -68,7 +69,7 @@ bool BuildConfigMacroExpander::resolveMacro(const QString &name, QString *ret)
         return true;
     }
     if (name == QLatin1String("buildDir")) {
-        *ret = QDir::toNativeSeparators(m_bc->buildDirectory());
+        *ret = m_bc->buildDirectory().toUserOutput();
         return true;
     }
     *ret = Core::VariableManager::value(name.toUtf8());
@@ -95,13 +96,15 @@ BuildConfiguration::BuildConfiguration(Target *target, const Core::Id id) :
 
     connect(target, SIGNAL(kitChanged()),
             this, SLOT(handleKitUpdate()));
+    connect(this, SIGNAL(environmentChanged()), this, SLOT(emitBuildDirectoryChanged()));
 }
 
 BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) :
     ProjectConfiguration(target, source),
     m_clearSystemEnvironment(source->m_clearSystemEnvironment),
     m_userEnvironmentChanges(source->m_userEnvironmentChanges),
-    m_macroExpander(0)
+    m_macroExpander(0),
+    m_buildDirectory(source->m_buildDirectory)
 {
     Q_ASSERT(target);
     // Do not clone stepLists here, do that in the derived constructor instead
@@ -119,6 +122,23 @@ BuildConfiguration::~BuildConfiguration()
     delete m_macroExpander;
 }
 
+Utils::FileName BuildConfiguration::buildDirectory() const
+{
+    QString path = QDir::cleanPath(environment().expandVariables(m_buildDirectory.toString()));
+    return Utils::FileName::fromString(QDir::cleanPath(QDir(target()->project()->projectDirectory()).absoluteFilePath(path)));
+}
+
+Utils::FileName BuildConfiguration::rawBuildDirectory() const
+{
+    return m_buildDirectory;
+}
+
+void BuildConfiguration::setBuildDirectory(const Utils::FileName &dir)
+{
+    m_buildDirectory = dir;
+    emitBuildDirectoryChanged();
+}
+
 QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets()
 {
     return QList<NamedWidget *>() << new ProjectExplorer::BuildEnvironmentWidget(this);
@@ -152,6 +172,7 @@ QVariantMap BuildConfiguration::toMap() const
     QVariantMap map(ProjectConfiguration::toMap());
     map.insert(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY), m_clearSystemEnvironment);
     map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), Utils::EnvironmentItem::toStringList(m_userEnvironmentChanges));
+    map.insert(QLatin1String(BUILDDIRECTORY_KEY), m_buildDirectory.toString());
 
     map.insert(QLatin1String(BUILD_STEP_LIST_COUNT), m_stepLists.count());
     for (int i = 0; i < m_stepLists.count(); ++i)
@@ -164,6 +185,7 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
 {
     m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool();
     m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
+    m_buildDirectory = Utils::FileName::fromString(map.value(QLatin1String(BUILDDIRECTORY_KEY)).toString());
 
     emitEnvironmentChanged();
 
@@ -204,7 +226,7 @@ void BuildConfiguration::emitEnvironmentChanged()
     if (env == m_cachedEnvironment)
         return;
     m_cachedEnvironment = env;
-    emit environmentChanged();
+    emit environmentChanged(); // might trigger buildDirectoryChanged signal!
 }
 
 void BuildConfiguration::handleKitUpdate()
@@ -212,6 +234,14 @@ void BuildConfiguration::handleKitUpdate()
     emitEnvironmentChanged();
 }
 
+void BuildConfiguration::emitBuildDirectoryChanged()
+{
+    if (buildDirectory() != m_lastEmmitedBuildDirectory) {
+        m_lastEmmitedBuildDirectory = buildDirectory();
+        emit buildDirectoryChanged();
+    }
+}
+
 Target *BuildConfiguration::target() const
 {
     return static_cast<Target *>(parent());
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index 975c23c04cf14d90356eb5d23d5464d95aed02f5..3f2cf3759dd5289018724287f259d4fae4f3db90 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -34,10 +34,9 @@
 #include "projectconfiguration.h"
 
 #include <utils/environment.h>
+#include <utils/fileutils.h>
 
-namespace Utils {
-class AbstractMacroExpander;
-}
+namespace Utils { class AbstractMacroExpander; }
 
 namespace ProjectExplorer {
 
@@ -56,7 +55,8 @@ public:
     // ctors are protected
     virtual ~BuildConfiguration();
 
-    virtual QString buildDirectory() const = 0;
+    Utils::FileName buildDirectory() const;
+    Utils::FileName rawBuildDirectory() const;
 
     virtual ProjectExplorer::NamedWidget *createConfigWidget() = 0;
     virtual QList<NamedWidget *> createSubConfigWidgets();
@@ -99,10 +99,12 @@ protected:
     BuildConfiguration(Target *target, const Core::Id id);
     BuildConfiguration(Target *target, BuildConfiguration *source);
 
+    virtual void setBuildDirectory(const Utils::FileName &dir);
     void cloneSteps(BuildConfiguration *source);
 
 private slots:
     void handleKitUpdate();
+    void emitBuildDirectoryChanged();
 
 private:
     void emitEnvironmentChanged();
@@ -111,6 +113,8 @@ private:
     QList<Utils::EnvironmentItem> m_userEnvironmentChanges;
     QList<BuildStepList *> m_stepLists;
     Utils::AbstractMacroExpander *m_macroExpander;
+    Utils::FileName m_buildDirectory;
+    Utils::FileName m_lastEmmitedBuildDirectory;
     mutable Utils::Environment m_cachedEnvironment;
 };
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index da31877809035d521440cde925c9a0d89e1faa6a..544e18b7cd6670ce9f78c81b08f1615594a1b093 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1129,7 +1129,7 @@ void ProjectExplorerPlugin::updateVariable(const QByteArray &variable)
     if (variable == Constants::VAR_CURRENTPROJECT_BUILDPATH) {
         if (currentProject() && currentProject()->activeTarget() && currentProject()->activeTarget()->activeBuildConfiguration()) {
             Core::VariableManager::insert(variable,
-                                                      currentProject()->activeTarget()->activeBuildConfiguration()->buildDirectory());
+                                          currentProject()->activeTarget()->activeBuildConfiguration()->buildDirectory().toUserOutput());
         } else {
             Core::VariableManager::remove(variable);
         }
diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp
index 84991e5652e8eae13e8d5fea3d4b96fe1e049e00..4c5f76347d88eb2659f1fe2f8c62aae09050b11d 100644
--- a/src/plugins/projectexplorer/settingsaccessor.cpp
+++ b/src/plugins/projectexplorer/settingsaccessor.cpp
@@ -421,6 +421,23 @@ public:
     QVariantMap update(Project *project, const QVariantMap &map);
 };
 
+// Version 14 Move builddir into BuildConfiguration
+class Version14Handler : public UserFileVersionHandler
+{
+public:
+    int userFileVersion() const
+    {
+         return 14;
+    }
+
+    QString displayUserFileVersion() const
+    {
+        return QLatin1String("3.0-pre1");
+    }
+
+    QVariantMap update(Project *project, const QVariantMap &map);
+};
+
 } // namespace
 
 //
@@ -513,6 +530,7 @@ SettingsAccessor::SettingsAccessor(Project *project) :
     addVersionHandler(new Version11Handler);
     addVersionHandler(new Version12Handler);
     addVersionHandler(new Version13Handler);
+    addVersionHandler(new Version14Handler);
 }
 
 SettingsAccessor::~SettingsAccessor()
@@ -2768,3 +2786,23 @@ QVariantMap Version13Handler::update(Project *project, const QVariantMap &map)
     }
     return result;
 }
+
+QVariantMap Version14Handler::update(Project *project, const QVariantMap &map)
+{
+    QVariantMap result;
+    QMapIterator<QString, QVariant> it(map);
+    while (it.hasNext()) {
+        it.next();
+        if (it.value().type() == QVariant::Map)
+            result.insert(it.key(), update(project, it.value().toMap()));
+        else if (it.key() == QLatin1String("AutotoolsProjectManager.AutotoolsBuildConfiguration.BuildDirectory")
+                 || it.key() == QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory")
+                 || it.key() == QLatin1String("GenericProjectManager.GenericBuildConfiguration.BuildDirectory")
+                 || it.key() == QLatin1String("Qbs.BuildDirectory")
+                 || it.key() == QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory"))
+            result.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildDirectory"), it.value());
+        else
+            result.insert(it.key(), it.value());
+    }
+    return result;
+}
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
index 7f8ed0cb6fe1e86f89085abe9405e1676507d66a..e08a616bd8526252258b643b24d8887c354cca7a 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
@@ -46,7 +46,6 @@
 #include <QInputDialog>
 
 static const char QBS_BC_ID[] = "Qbs.QbsBuildConfiguration";
-static const char QBS_BUILD_DIRECTORY_KEY[] = "Qbs.BuildDirectory";
 
 namespace QbsProjectManager {
 namespace Internal {
@@ -74,19 +73,11 @@ QbsBuildConfiguration::QbsBuildConfiguration(ProjectExplorer::Target *target, co
 { }
 
 QbsBuildConfiguration::QbsBuildConfiguration(ProjectExplorer::Target *target, QbsBuildConfiguration *source) :
-    BuildConfiguration(target, source),
-    m_buildDirectory(source->m_buildDirectory)
+    BuildConfiguration(target, source)
 {
     cloneSteps(source);
 }
 
-QVariantMap QbsBuildConfiguration::toMap() const
-{
-    QVariantMap map(BuildConfiguration::toMap());
-    map.insert(QLatin1String(QBS_BUILD_DIRECTORY_KEY), m_buildDirectory.toUserOutput());
-    return map;
-}
-
 bool QbsBuildConfiguration::fromMap(const QVariantMap &map)
 {
     if (!BuildConfiguration::fromMap(map))
@@ -101,8 +92,6 @@ bool QbsBuildConfiguration::fromMap(const QVariantMap &map)
             connect(bs, SIGNAL(qbsConfigurationChanged()), this, SIGNAL(qbsConfigurationChanged()));
     }
 
-    m_buildDirectory = Utils::FileName::fromUserInput(map.value(QLatin1String(QBS_BUILD_DIRECTORY_KEY)).toString());
-
     return true;
 }
 
@@ -139,12 +128,6 @@ QVariantMap QbsBuildConfiguration::qbsConfiguration() const
     return config;
 }
 
-QString QbsBuildConfiguration::buildDirectory() const
-{
-    QString path = QDir::cleanPath(environment().expandVariables(m_buildDirectory.toString()));
-    return QDir::cleanPath(QDir(target()->project()->projectDirectory()).absoluteFilePath(path));
-}
-
 Internal::QbsProject *QbsBuildConfiguration::project() const
 {
     return qobject_cast<Internal::QbsProject *>(target()->project());
@@ -239,14 +222,6 @@ QbsBuildConfiguration *QbsBuildConfiguration::setup(ProjectExplorer::Target *t,
     return bc;
 }
 
-void QbsBuildConfiguration::setBuildDirectory(const Utils::FileName &dir)
-{
-    if (m_buildDirectory == dir)
-        return;
-    m_buildDirectory = dir;
-    emit buildDirectoryChanged();
-}
-
 // ---------------------------------------------------------------------------
 // QbsBuildConfigurationFactory:
 // ---------------------------------------------------------------------------
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
index 022165b7fe69c37bdb1f30759be513bfdbee6ca3..7959137f8f6b57266863adb65b7a74f747fc15b2 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
@@ -57,12 +57,9 @@ public:
 
     QbsBuildStep *qbsStep() const;
     QVariantMap qbsConfiguration() const;
-    QString buildDirectory() const;
 
     Internal::QbsProject *project() const;
 
-    QVariantMap toMap() const;
-
     ProjectExplorer::IOutputParser *createOutputParser() const;
 
     bool isEnabled() const;
@@ -96,11 +93,9 @@ private:
                                         const QString &displayName,
                                         const QVariantMap &buildData,
                                         const Utils::FileName &directory);
-    void setBuildDirectory(const Utils::FileName &dir);
 
     bool m_isParsing;
     bool m_parsingError;
-    Utils::FileName m_buildDirectory;
     QStringList m_changedFiles;
     QStringList m_activeFileTags;
     QStringList m_products;
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp
index b6f6c907435c88b236e98b6da3d77d7537d625fd..45e6135718511234c0a05715d1c1a9de290c1bdc 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp
@@ -31,6 +31,8 @@
 
 #include "qbsbuildconfiguration.h"
 
+#include <projectexplorer/target.h>
+#include <projectexplorer/project.h>
 #include <utils/detailswidget.h>
 #include <utils/pathchooser.h>
 
@@ -45,8 +47,8 @@ QbsBuildConfigurationWidget::QbsBuildConfigurationWidget(QbsProjectManager::Inte
     m_buildConfiguration(bc),
     m_ignoreChange(false)
 {
-    connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()),
-            this, SLOT(buildDirectoryChanged()));
+    connect(bc, SIGNAL(buildDirectoryChanged()), this, SLOT(buildDirectoryChanged()));
+    connect(bc, SIGNAL(environmentChanged()), this, SLOT(environmentHasChanged()));
 
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setMargin(0);
@@ -63,6 +65,8 @@ QbsBuildConfigurationWidget::QbsBuildConfigurationWidget(QbsProjectManager::Inte
 
     m_buildDirChooser = new Utils::PathChooser;
     m_buildDirChooser->setExpectedKind(Utils::PathChooser::Directory);
+    m_buildDirChooser->setBaseDirectory(bc->target()->project()->projectDirectory());
+    m_buildDirChooser->setEnvironment(bc->environment());
     layout->addWidget(m_buildDirChooser, 0, 1);
 
     connect(m_buildDirChooser, SIGNAL(changed(QString)), this, SLOT(buildDirEdited()));
@@ -81,7 +85,12 @@ void QbsBuildConfigurationWidget::buildDirectoryChanged()
     if (m_ignoreChange)
         return;
 
-    m_buildDirChooser->setPath(m_buildConfiguration->buildDirectory());
+    m_buildDirChooser->setPath(m_buildConfiguration->rawBuildDirectory().toString());
+}
+
+void QbsBuildConfigurationWidget::environmentHasChanged()
+{
+    m_buildDirChooser->setEnvironment(m_buildConfiguration->environment());
 }
 
 } // namespace Internal
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h
index 0625e5ae39b2a0cd5aff4616d30b6253741e9f7a..b91e7d8e90886b6a41e35d08202a9057e3910833 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h
@@ -53,6 +53,7 @@ private slots:
 
     // Changes triggered from creator
     void buildDirectoryChanged();
+    void environmentHasChanged();
 
 private:
     Internal::QbsBuildConfiguration *m_buildConfiguration;
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 13d3ed8cf0973d8f4fc28f129eec8e9220f6020d..aa5e0156b3364e37a69dbbce2e8979cf8c55a7e2 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -349,7 +349,7 @@ void QbsProject::parseCurrentBuildConfiguration()
     QbsBuildConfiguration *bc = qobject_cast<QbsBuildConfiguration *>(activeTarget()->activeBuildConfiguration());
     if (!bc)
         return;
-    parse(bc->qbsConfiguration(), bc->environment(), bc->buildDirectory());
+    parse(bc->qbsConfiguration(), bc->environment(), bc->buildDirectory().toString());
 }
 
 bool QbsProject::fromMap(const QVariantMap &map)
diff --git a/src/plugins/qnx/blackberryabstractdeploystep.cpp b/src/plugins/qnx/blackberryabstractdeploystep.cpp
index 8931989b40577e138846309ed9cfc7b2b3487691..f97c56df8e07811e2f411d27010d795e5ae54302 100644
--- a/src/plugins/qnx/blackberryabstractdeploystep.cpp
+++ b/src/plugins/qnx/blackberryabstractdeploystep.cpp
@@ -81,7 +81,7 @@ bool BlackBerryAbstractDeployStep::init()
     m_processCounter = -1;
 
     m_environment = target()->activeBuildConfiguration()->environment();
-    m_buildDirectory = target()->activeBuildConfiguration()->buildDirectory();
+    m_buildDirectory = target()->activeBuildConfiguration()->buildDirectory().toString();
 
     return true;
 }
diff --git a/src/plugins/qnx/blackberrycreatepackagestep.cpp b/src/plugins/qnx/blackberrycreatepackagestep.cpp
index 4c21158323d1ffefd221f7ecbda9e93935fe2327..b8ef2f80110f07d52499cabd761de9438a57fb49 100644
--- a/src/plugins/qnx/blackberrycreatepackagestep.cpp
+++ b/src/plugins/qnx/blackberrycreatepackagestep.cpp
@@ -301,8 +301,8 @@ bool BlackBerryCreatePackageStep::prepareAppDescriptorFile(const QString &appDes
         }
     }
 
-    const QString buildDir = target()->activeBuildConfiguration()->buildDirectory();
     if (!preparedFile.open(QIODevice::WriteOnly)) {
+        const QString buildDir = target()->activeBuildConfiguration()->buildDirectory().toUserOutput();
         raiseError(tr("Could not create prepared application descriptor file in '%1'").arg(buildDir));
         return false;
     }
diff --git a/src/plugins/qnx/blackberrydeployinformation.cpp b/src/plugins/qnx/blackberrydeployinformation.cpp
index 5698bd8893e01485febdece732543c1fb1909a1a..ed4412593beb4e219c9c6124c9c36e4dd77a97a2 100644
--- a/src/plugins/qnx/blackberrydeployinformation.cpp
+++ b/src/plugins/qnx/blackberrydeployinformation.cpp
@@ -221,7 +221,9 @@ void BlackBerryDeployInformation::fromMap(const QVariantMap &map)
         const QString targetName = innerMap.value(QLatin1String(TARGET_KEY)).toString();
         const QString sourceDir = innerMap.value(QLatin1String(SOURCE_KEY)).toString();
 
-        BarPackageDeployInformation deployInformation(enabled, proFilePath, sourceDir, m_target->activeBuildConfiguration()->buildDirectory(), targetName);
+        BarPackageDeployInformation deployInformation(enabled, proFilePath, sourceDir,
+                                                      m_target->activeBuildConfiguration()->buildDirectory().toString(),
+                                                      targetName);
         deployInformation.userAppDescriptorPath = appDescriptorPath;
         deployInformation.userPackagePath = packagePath;
         m_deployInformation << deployInformation;
@@ -248,7 +250,7 @@ void BlackBerryDeployInformation::updateModel()
                         || !m_deployInformation[i].userPackagePath.isEmpty())) {
                 BarPackageDeployInformation deployInformation = m_deployInformation[i];
                 // In case the user resets the bar package path (or if it is empty already), we need the current build dir
-                deployInformation.buildDir = m_target->activeBuildConfiguration()->buildDirectory();
+                deployInformation.buildDir = m_target->activeBuildConfiguration()->buildDirectory().toString();
                 keep << deployInformation;
                 nodeFound = true;
                 break;
@@ -302,7 +304,7 @@ BarPackageDeployInformation BlackBerryDeployInformation::deployInformationFromNo
     Qt4ProjectManager::TargetInformation ti = node->targetInformation();
 
     QFileInfo fi(node->path());
-    const QString buildDir = m_target->activeBuildConfiguration()->buildDirectory();
+    const QString buildDir = m_target->activeBuildConfiguration()->buildDirectory().toString();
 
     return BarPackageDeployInformation(true, node->path(), fi.absolutePath(), buildDir, ti.target);
 }
diff --git a/src/plugins/qnx/blackberryruncontrolfactory.cpp b/src/plugins/qnx/blackberryruncontrolfactory.cpp
index 0e565353437087deaef69293b9c00c378eafc3b2..99ec7e33cbdec5fe411bfee3e45036596351747f 100644
--- a/src/plugins/qnx/blackberryruncontrolfactory.cpp
+++ b/src/plugins/qnx/blackberryruncontrolfactory.cpp
@@ -151,7 +151,7 @@ Debugger::DebuggerStartParameters BlackBerryRunControlFactory::startParameters(
     if (const ProjectExplorer::Project *project = runConfig->target()->project()) {
         params.projectSourceDirectory = project->projectDirectory();
         if (const ProjectExplorer::BuildConfiguration *buildConfig = runConfig->target()->activeBuildConfiguration())
-            params.projectBuildDirectory = buildConfig->buildDirectory();
+            params.projectBuildDirectory = buildConfig->buildDirectory().toString();
         params.projectSourceFiles = project->files(ProjectExplorer::Project::ExcludeGeneratedFiles);
     }
 
diff --git a/src/plugins/qnx/qnxruncontrolfactory.cpp b/src/plugins/qnx/qnxruncontrolfactory.cpp
index f979280ffa1cfcdebfbc656c474e293590780b82..39aa384e3771bc1bd18c886a45cfcf0bfcb9de39 100644
--- a/src/plugins/qnx/qnxruncontrolfactory.cpp
+++ b/src/plugins/qnx/qnxruncontrolfactory.cpp
@@ -102,7 +102,7 @@ static DebuggerStartParameters createDebuggerStartParameters(const QnxRunConfigu
     if (const ProjectExplorer::Project *project = runConfig->target()->project()) {
         params.projectSourceDirectory = project->projectDirectory();
         if (const ProjectExplorer::BuildConfiguration *buildConfig = runConfig->target()->activeBuildConfiguration())
-            params.projectBuildDirectory = buildConfig->buildDirectory();
+            params.projectBuildDirectory = buildConfig->buildDirectory().toString();
         params.projectSourceFiles = project->files(ProjectExplorer::Project::ExcludeGeneratedFiles);
     }
 
diff --git a/src/plugins/qt4projectmanager/librarydetailscontroller.cpp b/src/plugins/qt4projectmanager/librarydetailscontroller.cpp
index 8080054f6f8e4ba43b5a0cec9d1ff22f58d96c25..73a7d79af2d53c4f1c6d3a1f5fca305ce163ed08 100644
--- a/src/plugins/qt4projectmanager/librarydetailscontroller.cpp
+++ b/src/plugins/qt4projectmanager/librarydetailscontroller.cpp
@@ -1060,7 +1060,7 @@ QString InternalLibraryDetailsController::snippet() const
     QDir rootBuildDir = rootDir; // If the project is unconfigured use the project dir
     if (ProjectExplorer::Target *t = project->activeTarget())
         if (ProjectExplorer::BuildConfiguration *bc = t->activeBuildConfiguration())
-            rootBuildDir = bc->buildDirectory();
+            rootBuildDir = bc->buildDirectory().toString();
 
     // the project for which we insert the snippet inside build tree
     QFileInfo pfi(rootBuildDir.filePath(proRelavitePath));
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 02a76cdec3886abd9ef1ca6c3710b4ca20315e2c..c0b0fb81d0445c47cadf6433339eeebee89efc62 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -173,7 +173,7 @@ bool MakeStep::init()
     if (bc->subNodeBuild())
         workingDirectory = bc->subNodeBuild()->buildDir();
     else
-        workingDirectory = bc->buildDirectory();
+        workingDirectory = bc->buildDirectory().toString();
     pp->setWorkingDirectory(workingDirectory);
 
     QString makeCmd = tc->makeCommand(bc->environment());
@@ -415,7 +415,7 @@ void MakeStepConfigWidget::updateDetails()
 
     ProcessParameters param;
     param.setMacroExpander(bc->macroExpander());
-    param.setWorkingDirectory(bc->buildDirectory());
+    param.setWorkingDirectory(bc->buildDirectory().toString());
     QString makeCmd = tc->makeCommand(bc->environment());
     if (!m_makeStep->makeCommand().isEmpty())
         makeCmd = m_makeStep->makeCommand();
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index ec2108ef2735759cb51f1cc2acd9cc41f3b321c4..1cae7daf8862cf3e127219d49bf9e2b83228c3ce 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -248,7 +248,7 @@ bool QMakeStep::init()
     if (qt4bc->subNodeBuild())
         workingDirectory = qt4bc->subNodeBuild()->buildDir();
     else
-        workingDirectory = qt4bc->buildDirectory();
+        workingDirectory = qt4bc->buildDirectory().toString();
 
     FileName program = qtVersion->qmakeCommand();
 
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 81786a4a3fa328d6df22c2808f85ff956a5b9067..795d8c8aa95ac1f3d65048331c8c93cbcd57c1cc 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -38,6 +38,7 @@
 #include "buildconfigurationinfo.h"
 
 #include <utils/qtcprocess.h>
+#include <utils/qtcassert.h>
 #include <limits>
 #include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/projectexplorerconstants.h>
@@ -60,7 +61,6 @@ using namespace Utils;
 
 const char QT4_BC_ID[] = "Qt4ProjectManager.Qt4BuildConfiguration";
 const char USE_SHADOW_BUILD_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild";
-const char BUILD_DIRECTORY_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory";
 const char BUILD_CONFIGURATION_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration";
 
 enum { debug = 0 };
@@ -91,7 +91,6 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Target *target, Qt4BuildConfigurati
     BuildConfiguration(target, source),
     m_shadowBuild(source->m_shadowBuild),
     m_isEnabled(false),
-    m_buildDirectory(source->m_buildDirectory),
     m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration),
     m_subNodeBuild(0), // temporary value, so not copied
     m_fileNodeBuild(0)
@@ -108,7 +107,6 @@ QVariantMap Qt4BuildConfiguration::toMap() const
 {
     QVariantMap map(BuildConfiguration::toMap());
     map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild);
-    map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
     map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration));
     return map;
 }
@@ -120,9 +118,7 @@ bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
 
     m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool();
     m_qmakeBuildConfiguration = BaseQtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt());
-    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), defaultShadowBuildDirectory()).toString();
 
-    m_lastEmmitedBuildDirectory = buildDirectory();
     m_qtVersionSupportsShadowBuilds =  supportsShadowBuilds();
 
     m_lastKitState = LastKitState(target()->kit());
@@ -138,8 +134,6 @@ void Qt4BuildConfiguration::ctor()
 {
     m_buildDirectory = target()->project()->projectDirectory(); // default to in-source build!
 
-    connect(this, SIGNAL(environmentChanged()),
-            this, SLOT(emitBuildDirectoryChanged()));
     connect(this, SIGNAL(environmentChanged()),
             this, SLOT(emitProFileEvaluateNeeded()));
     connect(target(), SIGNAL(kitChanged()),
@@ -174,9 +168,7 @@ void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &,const QList<int
 bool Qt4BuildConfiguration::emitBuildDirectoryChanged()
 {
     // We also emit buildDirectoryChanged if the the Qt version's supportShadowBuild changed
-    if (buildDirectory() != m_lastEmmitedBuildDirectory
-            || supportsShadowBuilds() != m_qtVersionSupportsShadowBuilds) {
-        m_lastEmmitedBuildDirectory = buildDirectory();
+    if (supportsShadowBuilds() != m_qtVersionSupportsShadowBuilds) {
         m_qtVersionSupportsShadowBuilds = supportsShadowBuilds();
         emit buildDirectoryChanged();
         return true;
@@ -196,19 +188,6 @@ QString Qt4BuildConfiguration::defaultShadowBuildDirectory() const
                                             target()->kit(), displayName());
 }
 
-/// returns the unexpanded build directory
-QString Qt4BuildConfiguration::rawBuildDirectory() const
-{
-    return m_buildDirectory;
-}
-
-/// Returns the build directory.
-QString Qt4BuildConfiguration::buildDirectory() const
-{
-    QString path = QDir::cleanPath(environment().expandVariables(rawBuildDirectory()));
-    return QDir::cleanPath(QDir(target()->project()->projectDirectory()).absoluteFilePath(path));
-}
-
 bool Qt4BuildConfiguration::supportsShadowBuilds()
 {
     BaseQtVersion *version = QtKitInformation::qtVersion(target()->kit());
@@ -250,19 +229,15 @@ void Qt4BuildConfiguration::setFileNodeBuild(FileNode *node)
 /// still is a in-source build
 bool Qt4BuildConfiguration::isShadowBuild() const
 {
-    return buildDirectory() != target()->project()->projectDirectory();
+    return buildDirectory().toString() != target()->project()->projectDirectory();
 }
 
-void Qt4BuildConfiguration::setBuildDirectory(const QString &directory)
+void Qt4BuildConfiguration::setBuildDirectory(const FileName &directory)
 {
-    if (!supportsShadowBuilds()) {
-        m_buildDirectory = target()->project()->projectDirectory();
-    } else {
-        m_buildDirectory = directory;
-    }
-
-    if (emitBuildDirectoryChanged())
-        emitProFileEvaluateNeeded();
+    BuildConfiguration::setBuildDirectory(directory);
+    QTC_CHECK(supportsShadowBuilds()
+              || (!supportsShadowBuilds()
+                  && buildDirectory().toString() == target()->project()->projectDirectory()));
 }
 
 QString Qt4BuildConfiguration::makefile() const
@@ -726,9 +701,9 @@ Qt4BuildConfiguration *Qt4BuildConfiguration::setup(Target *t, QString defaultDi
     bc->setQMakeBuildConfiguration(qmakeBuildConfiguration);
 
     if (directory.isEmpty())
-        bc->setBuildDirectory(t->project()->projectDirectory());
+        bc->setBuildDirectory(Utils::FileName::fromString(t->project()->projectDirectory()));
     else
-        bc->setBuildDirectory(directory);
+        bc->setBuildDirectory(Utils::FileName::fromString(directory));
 
     return bc;
 }
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index e39e82c8d4dd67934874bc1439bb67333bef7e06..b12dcaa1326670749ac5b7442e2bed155e259b59 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -45,6 +45,8 @@ class Qt4BuildConfigurationFactory;
 class Qt4ProFileNode;
 class BuildConfigurationInfo;
 
+namespace Internal { class Qt4ProjectConfigWidget; }
+
 class QT4PROJECTMANAGER_EXPORT Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration
 {
     Q_OBJECT
@@ -55,10 +57,7 @@ public:
     ~Qt4BuildConfiguration();
 
     ProjectExplorer::NamedWidget *createConfigWidget();
-    QString buildDirectory() const;
-    QString rawBuildDirectory() const;
     bool isShadowBuild() const;
-    void setBuildDirectory(const QString &dir);
 
     void setSubNodeBuild(Qt4ProjectManager::Qt4ProFileNode *node);
     Qt4ProjectManager::Qt4ProFileNode *subNodeBuild() const;
@@ -136,6 +135,7 @@ protected:
 private:
     void ctor();
     QString defaultShadowBuildDirectory() const;
+    void setBuildDirectory(const Utils::FileName &directory);
 
     class LastKitState
     {
@@ -155,11 +155,12 @@ private:
     bool m_shadowBuild;
     bool m_isEnabled;
     QString m_buildDirectory;
-    QString m_lastEmmitedBuildDirectory;
     bool m_qtVersionSupportsShadowBuilds;
     QtSupport::BaseQtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration;
     Qt4ProjectManager::Qt4ProFileNode *m_subNodeBuild;
     ProjectExplorer::FileNode *m_fileNodeBuild;
+
+    friend class Internal::Qt4ProjectConfigWidget;
 };
 
 class QT4PROJECTMANAGER_EXPORT Qt4BuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 805ea32ae4cdab8b01413f966e83d79dfd5a531e..be3c7b4a21f2204097655f77356bb2c76bdd8a42 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -2246,7 +2246,7 @@ QString Qt4ProFileNode::buildDir(Qt4BuildConfiguration *bc) const
         bc = static_cast<Qt4BuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());
     if (!bc)
         return QString();
-    return QDir::cleanPath(QDir(bc->buildDirectory()).absoluteFilePath(relativeDir));
+    return QDir::cleanPath(QDir(bc->buildDirectory().toString()).absoluteFilePath(relativeDir));
 }
 
 QString Qt4ProFileNode::uiDirectory() const
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 0f862c329c6ca1afe17c628102def3b19f4e62a3..1468354cda066f3e4b80889651291beeec5408e9 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -67,9 +67,11 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BuildConfiguration *bc)
 
     m_ui->shadowBuildDirEdit->setPromptDialogTitle(tr("Shadow Build Directory"));
     m_ui->shadowBuildDirEdit->setExpectedKind(Utils::PathChooser::ExistingDirectory);
+    m_ui->shadowBuildDirEdit->setEnvironment(bc->environment());
+    m_ui->shadowBuildDirEdit->setBaseDirectory(bc->target()->project()->projectDirectory());
     bool isShadowBuild = bc->isShadowBuild();
     if (isShadowBuild) {
-        m_ui->shadowBuildDirEdit->setPath(bc->rawBuildDirectory());
+        m_ui->shadowBuildDirEdit->setPath(bc->rawBuildDirectory().toString());
         m_ui->inSourceBuildDirEdit->setVisible(false);
     } else {
         m_ui->shadowBuildDirEdit->setPath(m_defaultShadowBuildDir);
@@ -97,15 +99,11 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BuildConfiguration *bc)
 
     connect(bc->target(), SIGNAL(kitChanged()), this, SLOT(updateProblemLabel()));
 
-    m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment());
-
     connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()),
             this, SLOT(buildDirectoryChanged()));
     connect(m_buildConfiguration, SIGNAL(qmakeBuildConfigurationChanged()),
             this, SLOT(updateProblemLabel()));
 
-    m_ui->shadowBuildDirEdit->setBaseDirectory(m_buildConfiguration->target()->project()->projectDirectory());
-
     setDisplayName(tr("General"));
 
     updateDetails();
@@ -121,7 +119,7 @@ void Qt4ProjectConfigWidget::updateDetails()
 {
     m_detailsContainer->setSummaryText(
                 tr("building in <b>%1</b>")
-                .arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory())));
+                .arg(m_buildConfiguration->buildDirectory().toUserOutput()));
 }
 
 void Qt4ProjectConfigWidget::setProblemLabel(const QString &text)
@@ -148,7 +146,7 @@ void Qt4ProjectConfigWidget::buildDirectoryChanged()
     m_ui->shadowBuildDirEdit->setEnabled(shadowBuild);
     m_browseButton->setEnabled(shadowBuild);
 
-    m_ui->shadowBuildDirEdit->setPath(m_buildConfiguration->rawBuildDirectory());
+    m_ui->shadowBuildDirEdit->setPath(m_buildConfiguration->rawBuildDirectory().toString());
 
     updateDetails();
     updateProblemLabel();
@@ -171,9 +169,9 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked)
 
     m_ignoreChange = true;
     if (checked)
-        m_buildConfiguration->setBuildDirectory(m_ui->shadowBuildDirEdit->rawPath());
+        m_buildConfiguration->setBuildDirectory(Utils::FileName::fromString(m_ui->shadowBuildDirEdit->rawPath()));
     else
-        m_buildConfiguration->setBuildDirectory(m_ui->inSourceBuildDirEdit->rawPath());
+        m_buildConfiguration->setBuildDirectory(Utils::FileName::fromString(m_ui->inSourceBuildDirEdit->rawPath()));
     m_ignoreChange = false;
 
     updateDetails();
@@ -182,11 +180,11 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked)
 
 void Qt4ProjectConfigWidget::shadowBuildEdited()
 {
-    if (m_buildConfiguration->rawBuildDirectory() == m_ui->shadowBuildDirEdit->rawPath())
+    if (m_buildConfiguration->rawBuildDirectory().toString() == m_ui->shadowBuildDirEdit->rawPath())
         return;
 
     m_ignoreChange = true;
-    m_buildConfiguration->setBuildDirectory(m_ui->shadowBuildDirEdit->rawPath());
+    m_buildConfiguration->setBuildDirectory(Utils::FileName::fromString(m_ui->shadowBuildDirEdit->rawPath()));
     m_ignoreChange = false;
 }
 
@@ -214,7 +212,7 @@ void Qt4ProjectConfigWidget::updateProblemLabel()
     bool allGood = false;
     // we only show if we actually have a qmake and makestep
     if (m_buildConfiguration->qmakeStep() && m_buildConfiguration->makeStep()) {
-        QString makefile = m_buildConfiguration->buildDirectory() + QLatin1Char('/');
+        QString makefile = m_buildConfiguration->buildDirectory().toString() + QLatin1Char('/');
         if (m_buildConfiguration->makefile().isEmpty())
             makefile.append(QLatin1String("Makefile"));
         else
@@ -246,7 +244,7 @@ void Qt4ProjectConfigWidget::updateProblemLabel()
     if (allGood) {
         QString buildDirectory = m_buildConfiguration->target()->project()->projectDirectory();;
         if (m_buildConfiguration->isShadowBuild())
-            buildDirectory = m_buildConfiguration->buildDirectory();
+            buildDirectory = m_buildConfiguration->buildDirectory().toString();
         QList<ProjectExplorer::Task> issues;
         issues = version->reportIssues(proFileName, buildDirectory);
         qSort(issues);
@@ -278,12 +276,12 @@ void Qt4ProjectConfigWidget::updateProblemLabel()
     } else if (targetMismatch) {
         setProblemLabel(shadowBuildWarning + tr("A build for a different project exists in %1, which will be overwritten.",
                                                 "%1 build directory")
-                        .arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory())));
+                        .arg(m_buildConfiguration->buildDirectory().toUserOutput()));
         return;
     } else if (incompatibleBuild) {
         setProblemLabel(shadowBuildWarning +tr("An incompatible build exists in %1, which will be overwritten.",
                                                "%1 build directory")
-                        .arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory())));
+                        .arg(m_buildConfiguration->buildDirectory().toUserOutput()));
         return;
     } else if (!shadowBuildWarning.isEmpty()) {
         setProblemLabel(shadowBuildWarning);
diff --git a/src/plugins/remotelinux/abstractpackagingstep.cpp b/src/plugins/remotelinux/abstractpackagingstep.cpp
index 05612e0ccff6bf09c2de89ec7f654025da2899f8..ee3952747afca6ab8d381e1cab159f459e63fdc7 100644
--- a/src/plugins/remotelinux/abstractpackagingstep.cpp
+++ b/src/plugins/remotelinux/abstractpackagingstep.cpp
@@ -117,7 +117,7 @@ QString AbstractPackagingStep::cachedPackageDirectory() const
 QString AbstractPackagingStep::packageDirectory() const
 {
     return d->currentBuildConfiguration
-        ? d->currentBuildConfiguration->buildDirectory() : QString();
+            ? d->currentBuildConfiguration->buildDirectory().toString() : QString();
 }
 
 bool AbstractPackagingStep::isPackagingNeeded() const
diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
index 8448103e587e42f23632ad817d4a7b54c8499c86..9e53238bd3238ac0fc2ebc16b531097ffff2e9a3 100644
--- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
+++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
@@ -111,7 +111,7 @@ DebuggerStartParameters LinuxDeviceDebugSupport::startParameters(const RemoteLin
     if (const Project *project = target->project()) {
         params.projectSourceDirectory = project->projectDirectory();
         if (const BuildConfiguration *buildConfig = target->activeBuildConfiguration())
-            params.projectBuildDirectory = buildConfig->buildDirectory();
+            params.projectBuildDirectory = buildConfig->buildDirectory().toString();
         params.projectSourceFiles = project->files(Project::ExcludeGeneratedFiles);
     }
 
diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index 2eb6f8f2a3f17b9a33e83319ccaced3b731047ef..873840b079d273164584e72d382a4c8dff66b852 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -145,7 +145,7 @@ bool MemcheckErrorFilterProxyModel::filterAcceptsRow(int sourceRow, const QModel
             validFolders << project->projectDirectory();
             foreach (Target *target, project->targets()) {
                 foreach (BuildConfiguration *config, target->buildConfigurations())
-                    validFolders << config->buildDirectory();
+                    validFolders << config->buildDirectory().toString();
             }
         }