diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 8f5d8385e522d1f546666fcd8cc3c90d1f1eb2fa..5326b27c9b4ea5a73df9751feae72d049abf81d9 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -35,31 +35,48 @@
 #include "cmakeproject.h"
 #include "cmakeprojectconstants.h"
 
+#include <coreplugin/documentmanager.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
+
 #include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/kit.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 
 #include <utils/qtcassert.h>
 
 #include <QInputDialog>
 
-using namespace CMakeProjectManager;
-using namespace Internal;
+using namespace ProjectExplorer;
+using namespace Utils;
+
+namespace CMakeProjectManager {
+namespace Internal {
 
-namespace {
 const char USE_NINJA_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.UseNinja";
-} // namespace
+
+static QString shadowBuildDirectory(const QString &projectFilePath, const Kit *k, const QString &bcName)
+{
+    if (projectFilePath.isEmpty())
+        return QString();
+    QFileInfo info(projectFilePath);
+
+    const QString projectName = QFileInfo(info.absolutePath()).fileName();
+    ProjectMacroExpander expander(projectName, k, bcName);
+    QDir projectDir = QDir(Project::projectDirectory(FileName::fromString(projectFilePath)).toString());
+    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
+    return QDir::cleanPath(projectDir.absoluteFilePath(buildPath));
+}
 
 CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) :
     BuildConfiguration(parent, Core::Id(Constants::CMAKE_BC_ID)), m_useNinja(false)
 {
     CMakeProject *project = static_cast<CMakeProject *>(parent->project());
-    setBuildDirectory(Utils::FileName::fromString(project->shadowBuildDirectory(project->projectFilePath().toString(),
-                                                                                parent->kit(),
-                                                                                displayName())));
+    setBuildDirectory(Utils::FileName::fromString(shadowBuildDirectory(project->projectFilePath().toString(),
+                                                                       parent->kit(),
+                                                                       displayName())));
 }
 
 CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent,
@@ -156,9 +173,7 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSet
     CMakeBuildInfo *info = createBuildInfo(k, ProjectExplorer::Project::projectDirectory(Utils::FileName::fromString(projectPath)).toString());
     //: The name of the build configuration created by default for a cmake project.
     info->displayName = tr("Default");
-    info->buildDirectory
-            = Utils::FileName::fromString(CMakeProject::shadowBuildDirectory(projectPath, k,
-                                                                             info->displayName));
+    info->buildDirectory = FileName::fromString(shadowBuildDirectory(projectPath, k, info->displayName));
     result << info;
     return result;
 }
@@ -174,10 +189,9 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj
     CMakeProject *project = static_cast<CMakeProject *>(parent->project());
 
     if (copy.buildDirectory.isEmpty())
-        copy.buildDirectory
-                = Utils::FileName::fromString(project->shadowBuildDirectory(project->projectFilePath().toString(),
-                                                                            parent->kit(),
-                                                                            copy.displayName));
+        copy.buildDirectory = FileName::fromString(shadowBuildDirectory(project->projectFilePath().toString(),
+                                                                        parent->kit(),
+                                                                        copy.displayName));
 
     CMakeOpenProjectWizard copw(Core::ICore::mainWindow(), project->projectManager(), CMakeOpenProjectWizard::ChangeDirectory, &copy);
     if (copw.exec() != QDialog::Accepted)
@@ -295,3 +309,5 @@ ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildTyp
     return Unknown;
 }
 
+} // namespace Internal
+} // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index ef0d75f94b05d20d1a8a25ecfdfc65886bb13d1f..f260b6a24c065d365551b019085c41ab19737ce5 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -49,7 +49,6 @@
 #include <projectexplorer/target.h>
 #include <projectexplorer/deployconfiguration.h>
 #include <projectexplorer/deploymentdata.h>
-#include <projectexplorer/projectmacroexpander.h>
 #include <qtsupport/customexecutablerunconfiguration.h>
 #include <qtsupport/baseqtversion.h>
 #include <qtsupport/qtkitinformation.h>
@@ -62,7 +61,6 @@
 #include <utils/hostosinfo.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/infobar.h>
-#include <coreplugin/documentmanager.h>
 #include <coreplugin/editormanager/editormanager.h>
 
 #include <QDebug>
@@ -177,19 +175,6 @@ void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QStri
     parseCMakeLists();
 }
 
-QString CMakeProject::shadowBuildDirectory(const QString &projectFilePath, const Kit *k, const QString &bcName)
-{
-    if (projectFilePath.isEmpty())
-        return QString();
-    QFileInfo info(projectFilePath);
-
-    const QString projectName = QFileInfo(info.absolutePath()).fileName();
-    ProjectExplorer::ProjectMacroExpander expander(projectFilePath, projectName, k, bcName);
-    QDir projectDir = QDir(projectDirectory(Utils::FileName::fromString(projectFilePath)).toString());
-    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
-    return QDir::cleanPath(projectDir.absoluteFilePath(buildPath));
-}
-
 QStringList CMakeProject::getCXXFlagsFor(const CMakeBuildTarget &buildTarget)
 {
     QString makeCommand = QDir::fromNativeSeparators(buildTarget.makeCommand);
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 80a232e948a39bf5e2fb441e31e1474c06152d50..cfb3d176a793659e463ed4cbaefe6733716f054f 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -102,9 +102,6 @@ public:
 
     CMakeBuildTarget buildTargetForTitle(const QString &title);
 
-    static QString shadowBuildDirectory(const QString &projectFilePath, const ProjectExplorer::Kit *k,
-                                        const QString &bcName);
-
     bool isProjectFile(const QString &fileName);
 
     bool parseCMakeLists();
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index bc339d985436235844dd42653adc7efde4b51b9d..b48d21e7b3cc7d42a244051436e3380c95130d86 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -36,9 +36,9 @@
 #include "target.h"
 #include "project.h"
 #include "kit.h"
-#include "projectmacroexpander.h"
 
 #include <projectexplorer/buildenvironmentwidget.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <extensionsystem/pluginmanager.h>
 #include <coreplugin/idocument.h>
 
@@ -55,38 +55,6 @@ static const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.BuildConfigu
 static const char BUILDDIRECTORY_KEY[] = "ProjectExplorer.BuildConfiguration.BuildDirectory";
 
 namespace ProjectExplorer {
-namespace Internal {
-
-class BuildConfigMacroExpander : public ProjectMacroExpander
-{
-public:
-    explicit BuildConfigMacroExpander(const BuildConfiguration *bc)
-        : ProjectMacroExpander(bc->target()->project()->document()->filePath(),
-                               bc->target()->project()->displayName(),
-                               bc->target()->kit(),
-                               bc->displayName()),
-          m_bc(bc)
-    {}
-    virtual bool resolveMacro(const QString &name, QString *ret) const;
-private:
-    const BuildConfiguration *m_bc;
-};
-
-bool BuildConfigMacroExpander::resolveMacro(const QString &name, QString *ret) const
-{
-    // legacy variables
-    if (name == QLatin1String("sourceDir")) {
-        *ret = m_bc->target()->project()->projectDirectory().toUserOutput();
-        return true;
-    }
-    if (name == QLatin1String("buildDir")) {
-        *ret = m_bc->buildDirectory().toUserOutput();
-        return true;
-    }
-
-    return ProjectMacroExpander::resolveMacro(name, ret);
-}
-} // namespace Internal
 
 BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) :
     ProjectConfiguration(target, id),
@@ -157,8 +125,21 @@ QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets()
 
 Utils::MacroExpander *BuildConfiguration::macroExpander()
 {
-    if (!m_macroExpander)
-        m_macroExpander = new Internal::BuildConfigMacroExpander(this);
+    if (!m_macroExpander) {
+        m_macroExpander = new ProjectMacroExpander(target()->project()->displayName(),
+                                                   target()->kit(), displayName());
+
+        m_macroExpander->registerSubProvider(
+            [this]() { return target()->kit()->macroExpander(); });
+
+        // Legacy support.
+        m_macroExpander->registerVariable("sourceDir", tr("Source directory"),
+            [this]() { return target()->project()->projectDirectory().toUserOutput(); });
+
+        m_macroExpander->registerVariable("buildDir", tr("Build directory"),
+            [this]() { return buildDirectory().toUserOutput(); });
+    }
+
     return m_macroExpander;
 }
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index e5ade6852b2cf2279bc4036e7d712b3bc4ffa07b..aa1c75f4286acf646e9901a0440f150a807a604a 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -41,7 +41,6 @@
 #include "jsonwizard/jsonwizardpagefactory_p.h"
 #include "project.h"
 #include "projectexplorersettings.h"
-#include "projectmacroexpander.h"
 #include "removetaskhandler.h"
 #include "unconfiguredprojectpanel.h"
 #include "kitfeatureprovider.h"
diff --git a/src/plugins/projectexplorer/projectmacroexpander.cpp b/src/plugins/projectexplorer/projectmacroexpander.cpp
index bddd625062237f328b102db36063c3dcc568cbca..4a521b15fc935511cf3c66841679d2f4fa230209 100644
--- a/src/plugins/projectexplorer/projectmacroexpander.cpp
+++ b/src/plugins/projectexplorer/projectmacroexpander.cpp
@@ -38,9 +38,9 @@
 
 using namespace ProjectExplorer;
 
-ProjectMacroExpander::ProjectMacroExpander(const QString &projectFilePath, const QString &projectName,
-                                 const Kit *k, const QString &bcName)
-    : m_projectFile(projectFilePath), m_projectName(projectName), m_kit(k), m_bcName(bcName)
+ProjectMacroExpander::ProjectMacroExpander(const QString &projectName,
+                                           const Kit *k, const QString &bcName)
+    : m_projectName(projectName), m_kit(k), m_bcName(bcName)
 { }
 
 bool ProjectMacroExpander::resolveMacro(const QString &name, QString *ret) const
diff --git a/src/plugins/projectexplorer/projectmacroexpander.h b/src/plugins/projectexplorer/projectmacroexpander.h
index 365e9d2fa819baccde71664bbfb7b46b974bd1ff..b33df8eda197657caa1791c63eb6f0c32e26abce 100644
--- a/src/plugins/projectexplorer/projectmacroexpander.h
+++ b/src/plugins/projectexplorer/projectmacroexpander.h
@@ -41,7 +41,7 @@ class Kit;
 class PROJECTEXPLORER_EXPORT ProjectMacroExpander : public Utils::MacroExpander
 {
 public:
-    ProjectMacroExpander(const QString &projectFilePath, const QString &projectName, const Kit *k, const QString &bcName);
+    ProjectMacroExpander(const QString &projectName, const Kit *k, const QString &bcName);
     bool resolveMacro(const QString &name, QString *ret) const;
 
 private:
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
index dc55efcd43b88a7a36857b39ec1336cf73588412..b06731e3e9018b288abdf0a0dfd8c229197e523b 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
@@ -37,6 +37,7 @@
 #include "qbsproject.h"
 #include "qbsprojectmanagerconstants.h"
 
+#include <coreplugin/documentmanager.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
 #include <utils/qtcassert.h>
@@ -44,6 +45,7 @@
 #include <projectexplorer/kit.h>
 #include <projectexplorer/kitinformation.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/toolchain.h>
 
@@ -275,6 +277,16 @@ int QbsBuildConfigurationFactory::priority(const Kit *k, const QString &projectP
             .matchesType(QLatin1String(Constants::MIME_TYPE))) ? 0 : -1;
 }
 
+static Utils::FileName defaultBuildDirectory(const QString &projectFilePath, const Kit *k,
+                                             const QString &bcName)
+{
+    const QString projectName = QFileInfo(projectFilePath).completeBaseName();
+    ProjectMacroExpander expander(projectName, k, bcName);
+    QString projectDir = Project::projectDirectory(Utils::FileName::fromString(projectFilePath)).toString();
+    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
+    return Utils::FileName::fromString(Utils::FileUtils::resolvePath(projectDir, buildPath));
+}
+
 QList<BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const
 {
     QList<BuildInfo *> result;
@@ -282,13 +294,13 @@ QList<BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const Kit *k, c
     BuildInfo *info = createBuildInfo(k, BuildConfiguration::Debug);
     //: The name of the debug build configuration created by default for a qbs project.
     info->displayName = tr("Debug");
-    info->buildDirectory = QbsProject::defaultBuildDirectory(projectPath, k, info->displayName);
+    info->buildDirectory = defaultBuildDirectory(projectPath, k, info->displayName);
     result << info;
 
     info = createBuildInfo(k, BuildConfiguration::Release);
     //: The name of the release build configuration created by default for a qbs project.
     info->displayName = tr("Release");
-    info->buildDirectory = QbsProject::defaultBuildDirectory(projectPath, k, info->displayName);
+    info->buildDirectory = defaultBuildDirectory(projectPath, k, info->displayName);
     result << info;
 
     return result;
@@ -310,8 +322,8 @@ BuildConfiguration *QbsBuildConfigurationFactory::create(Target *parent, const B
 
     Utils::FileName buildDir = info->buildDirectory;
     if (buildDir.isEmpty())
-        buildDir = QbsProject::defaultBuildDirectory(parent->project()->projectDirectory().toString(),
-                                                     parent->kit(), info->displayName);
+        buildDir = defaultBuildDirectory(parent->project()->projectDirectory().toString(),
+                                         parent->kit(), info->displayName);
 
     BuildConfiguration *bc
             = QbsBuildConfiguration::setup(parent, info->displayName, info->displayName,
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 4399fa29c4bf12466513962afdebe65a143ebffd..ae4592b78912f4843fc8e3d03624589ed2b6ea2a 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -55,7 +55,6 @@
 #include <projectexplorer/kitinformation.h>
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/projectexplorerconstants.h>
-#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/taskhub.h>
 #include <projectexplorer/toolchain.h>
@@ -397,16 +396,6 @@ bool QbsProject::hasParseResult() const
     return qbsProject().isValid();
 }
 
-Utils::FileName QbsProject::defaultBuildDirectory(const QString &projectFilePath, const Kit *k,
-                                                  const QString &bcName)
-{
-    const QString projectName = QFileInfo(projectFilePath).completeBaseName();
-    ProjectExplorer::ProjectMacroExpander expander(projectFilePath, projectName, k, bcName);
-    QString projectDir = projectDirectory(Utils::FileName::fromString(projectFilePath)).toString();
-    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
-    return Utils::FileName::fromString(Utils::FileUtils::resolvePath(projectDir, buildPath));
-}
-
 qbs::Project QbsProject::qbsProject() const
 {
     return m_qbsProject;
diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h
index 902f80c9417620d43db460d059c78da0d8f621ff..2d77c8e77f00c2a6ca248642ddc62e54aaae1b93 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.h
+++ b/src/plugins/qbsprojectmanager/qbsproject.h
@@ -99,10 +99,6 @@ public:
 
     void registerQbsProjectParser(QbsProjectParser *p);
 
-    static Utils::FileName defaultBuildDirectory(const QString &projectFilePath,
-                                                 const ProjectExplorer::Kit *k,
-                                                 const QString &bcName);
-
     qbs::Project qbsProject() const;
     qbs::ProjectData qbsProjectData() const;
 
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
index 26ef059cb685a80e9b9f263bdfee9d2352159ea7..83063dc2282b30dfba63da122e2696af75ff186d 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
@@ -39,45 +39,67 @@
 #include "qmakestep.h"
 #include "makestep.h"
 
-#include <utils/qtcprocess.h>
-#include <utils/qtcassert.h>
-#include <limits>
+#include <coreplugin/documentmanager.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
+
 #include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/kit.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/toolchainmanager.h>
 #include <qtsupport/qtkitinformation.h>
 #include <qtsupport/qtversionmanager.h>
 #include <utils/qtcassert.h>
-#include <QDebug>
+#include <utils/qtcprocess.h>
+#include <utils/qtcassert.h>
 #include <android/androidmanager.h>
 
+#include <QDebug>
 #include <QInputDialog>
 
+#include <limits>
+
+using namespace ProjectExplorer;
+using namespace QtSupport;
+using namespace Utils;
+using namespace QmakeProjectManager::Internal;
+
 namespace QmakeProjectManager {
 
 // --------------------------------------------------------------------
 // Helpers:
 // --------------------------------------------------------------------
 
+QString QmakeBuildConfiguration::shadowBuildDirectory(const QString &proFilePath, const Kit *k, const QString &suffix)
+{
+    if (proFilePath.isEmpty())
+        return QString();
+    QFileInfo info(proFilePath);
+
+    BaseQtVersion *version = QtKitInformation::qtVersion(k);
+    if (version && !version->supportsShadowBuilds())
+        return info.absolutePath();
+
+    const QString projectName = QFileInfo(proFilePath).completeBaseName();
+    ProjectMacroExpander expander(projectName, k, suffix);
+    QString projectDir = Project::projectDirectory(FileName::fromString(proFilePath)).toString();
+    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
+    return FileUtils::resolvePath(projectDir, buildPath);
+}
+
 static Utils::FileName defaultBuildDirectory(bool supportsShadowBuild,
                                              const QString &projectPath,
                                              const ProjectExplorer::Kit *k,
                                              const QString &suffix)
 {
     if (supportsShadowBuild)
-        return Utils::FileName::fromString(QmakeProject::shadowBuildDirectory(projectPath, k, suffix));
+        return Utils::FileName::fromString(QmakeBuildConfiguration::shadowBuildDirectory(projectPath, k, suffix));
     return ProjectExplorer::Project::projectDirectory(Utils::FileName::fromString(projectPath));
 }
 
-using namespace Internal;
-using namespace ProjectExplorer;
-using namespace QtSupport;
-using namespace Utils;
-
 const char QMAKE_BC_ID[] = "Qt4ProjectManager.Qt4BuildConfiguration";
 const char USE_SHADOW_BUILD_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild";
 const char BUILD_CONFIGURATION_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration";
@@ -201,8 +223,8 @@ NamedWidget *QmakeBuildConfiguration::createConfigWidget()
 QString QmakeBuildConfiguration::defaultShadowBuildDirectory() const
 {
     // todo displayName isn't ideal
-    return QmakeProject::shadowBuildDirectory(target()->project()->projectFilePath().toString(),
-                                              target()->kit(), displayName());
+    return shadowBuildDirectory(target()->project()->projectFilePath().toString(),
+                                target()->kit(), displayName());
 }
 
 bool QmakeBuildConfiguration::supportsShadowBuilds()
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h
index 549d9d8c2e584265f9e360ceaaff56445cd5c3cc..3bb8758b49cb53106993a77fa28034d54b99e174 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h
@@ -68,6 +68,10 @@ public:
     QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration() const;
     void setQMakeBuildConfiguration(QtSupport::BaseQtVersion::QmakeBuildConfigs config);
 
+    /// suffix should be unique
+    static QString shadowBuildDirectory(const QString &profilePath, const ProjectExplorer::Kit *k,
+                                 const QString &suffix);
+
     /// \internal for qmakestep
     // used by qmake step to notify that the qmake args have changed
     // not really nice, the build configuration should save the arguments
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index c1de09cf08fe23982da6d081008bd812704485fc..945a8d814dc23cd643b28c54f88d44ee20dd47a1 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -45,7 +45,6 @@
 #include <coreplugin/icontext.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/progressmanager/progressmanager.h>
-#include <coreplugin/documentmanager.h>
 #include <cpptools/cppmodelmanager.h>
 #include <qmljs/qmljsmodelmanagerinterface.h>
 #include <projectexplorer/buildmanager.h>
@@ -55,7 +54,6 @@
 #include <projectexplorer/headerpath.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/projectexplorer.h>
-#include <projectexplorer/projectmacroexpander.h>
 #include <proparser/qmakevfs.h>
 #include <qtsupport/profilereader.h>
 #include <qtsupport/qtkitinformation.h>
@@ -1442,23 +1440,6 @@ QString QmakeProject::disabledReasonForRunConfiguration(const QString &proFilePa
             .arg(QFileInfo(proFilePath).fileName());
 }
 
-QString QmakeProject::shadowBuildDirectory(const QString &proFilePath, const Kit *k, const QString &suffix)
-{
-    if (proFilePath.isEmpty())
-        return QString();
-    QFileInfo info(proFilePath);
-
-    QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k);
-    if (version && !version->supportsShadowBuilds())
-        return info.absolutePath();
-
-    const QString projectName = QFileInfo(proFilePath).completeBaseName();
-    ProjectExplorer::ProjectMacroExpander expander(proFilePath, projectName, k, suffix);
-    QString projectDir = projectDirectory(Utils::FileName::fromString(proFilePath)).toString();
-    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
-    return Utils::FileUtils::resolvePath(projectDir, buildPath);
-}
-
 QString QmakeProject::buildNameFor(const Kit *k)
 {
     if (!k)
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h
index 7eafa30decb1aa1c32d1aa5e14f28c0889143348..2e0892a1aa6041216639f601f87945dbf695d351 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.h
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.h
@@ -132,9 +132,6 @@ public:
     /// \internal
     QString disabledReasonForRunConfiguration(const QString &proFilePath);
 
-    /// suffix should be unique
-    static QString shadowBuildDirectory(const QString &profilePath, const ProjectExplorer::Kit *k,
-                                 const QString &suffix);
     /// used by the default implementation of shadowBuildDirectory
     static QString buildNameFor(const ProjectExplorer::Kit *k);
 
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
index 4a32497ba021e24c17af61068bc78df0df5a82ad..dbaaca1812c44f73c9a73589cbe015bbc34cccad 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
@@ -51,9 +51,9 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc)
       m_ignoreChange(false)
 {
     m_defaultShadowBuildDir
-            = QmakeProject::shadowBuildDirectory(bc->target()->project()->projectFilePath().toString(),
-                                               bc->target()->kit(),
-                                               Utils::FileUtils::qmakeFriendlyName(bc->displayName()));
+            = QmakeBuildConfiguration::shadowBuildDirectory(bc->target()->project()->projectFilePath().toString(),
+                                                            bc->target()->kit(),
+                                                            Utils::FileUtils::qmakeFriendlyName(bc->displayName()));
 
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setMargin(0);
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
index 5417f95b2ceb4a721c27e4461aefe59ea9efea3d..6b846b401e824977c36276121eb230acdc873d1c 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
@@ -213,7 +213,7 @@ QStringList QmakeProjectImporter::importCandidates(const Utils::FileName &projec
 
     QList<ProjectExplorer::Kit *> kitList = ProjectExplorer::KitManager::kits();
     foreach (ProjectExplorer::Kit *k, kitList) {
-        QFileInfo fi(QmakeProject::shadowBuildDirectory(projectPath.toString(), k, QString()));
+        QFileInfo fi(QmakeBuildConfiguration::shadowBuildDirectory(projectPath.toString(), k, QString()));
         const QString baseDir = fi.absolutePath();
 
         foreach (const QString &dir, QDir(baseDir).entryList()) {