diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
index a1ba19182e55d4f4509fb7e7e70817b919306888..9a456cb8ce6c056fbb5fe496a608a70ff0c0e721 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
@@ -484,7 +484,6 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep
         if (pc->isActive())
             updateDetails();
     });
-
 }
 
 void CMakeBuildStepConfigWidget::toolArgumentsEdited()
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index ef5fb47599865e4dc6876499f73ac9bd602e00d6..1ab555a35e8b0d4ab4fe3e2d59d11ad3f86a9b82 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -242,7 +242,6 @@ void Project::addTarget(Target *t)
     d->m_targets.push_back(t);
     connect(t, &Target::buildConfigurationEnabledChanged,
             this, &Project::changeBuildConfigurationEnabled);
-    connect(t, &Target::buildDirectoryChanged, this, &Project::onBuildDirectoryChanged);
     connect(t, &Target::addedProjectConfiguration, this, &Project::addedProjectConfiguration);
     connect(t, &Target::aboutToRemoveProjectConfiguration, this, &Project::aboutToRemoveProjectConfiguration);
     connect(t, &Target::removedProjectConfiguration, this, &Project::removedProjectConfiguration);
@@ -867,11 +866,4 @@ void Project::setPreferredKitPredicate(const Kit::Predicate &predicate)
     d->m_preferredKitPredicate = predicate;
 }
 
-void Project::onBuildDirectoryChanged()
-{
-    auto target = qobject_cast<Target *>(sender());
-    if (target && target == activeTarget())
-        emit buildDirectoryChanged();
-}
-
 } // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 2d6ee34401677113e2d3d98b3b2fff4259b9f869..ba33b565249b12f9812766bbad094a74c5b4ec05 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -209,8 +209,6 @@ signals:
 
     void buildConfigurationEnabledChanged();
 
-    void buildDirectoryChanged();
-
     void settingsLoaded();
     void aboutToSaveSettings();
 
@@ -245,7 +243,6 @@ protected:
 
 private:
     void changeBuildConfigurationEnabled();
-    void onBuildDirectoryChanged();
 
     void setActiveTarget(Target *target);
     ProjectPrivate *d;
diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp
index a62df235621f2a27ed1ef93a88c9ade57c4ae925..179b0edd5da4921a1b4573146e1ec124661a709a 100644
--- a/src/plugins/projectexplorer/target.cpp
+++ b/src/plugins/projectexplorer/target.cpp
@@ -174,13 +174,6 @@ void Target::changeRunConfigurationEnabled()
         emit runConfigurationEnabledChanged();
 }
 
-void Target::onBuildDirectoryChanged()
-{
-    auto bc = qobject_cast<BuildConfiguration *>(sender());
-    if (bc && activeBuildConfiguration() == bc)
-        emit buildDirectoryChanged();
-}
-
 void Target::handleKitUpdates(Kit *k)
 {
     if (k != d->m_kit)
@@ -241,8 +234,6 @@ void Target::addBuildConfiguration(BuildConfiguration *bc)
 
     connect(bc, &BuildConfiguration::enabledChanged,
             this, &Target::changeBuildConfigurationEnabled);
-    connect(bc, &BuildConfiguration::buildDirectoryChanged,
-            this, &Target::onBuildDirectoryChanged);
 
     if (!activeBuildConfiguration())
         setActiveBuildConfiguration(bc);
@@ -295,7 +286,6 @@ void Target::setActiveBuildConfiguration(BuildConfiguration *bc)
         emit activeProjectConfigurationChanged(d->m_activeBuildConfiguration);
         emit activeBuildConfigurationChanged(d->m_activeBuildConfiguration);
         emit buildConfigurationEnabledChanged();
-        emit buildDirectoryChanged();
     }
 }
 
diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h
index 548471093904878cfe2343e7fcd570a2b968a117..ff2ef088994b569ad4605f382362a9e8f019dfef 100644
--- a/src/plugins/projectexplorer/target.h
+++ b/src/plugins/projectexplorer/target.h
@@ -169,11 +169,6 @@ signals:
     void deploymentDataChanged();
     void applicationTargetsChanged();
 
-    // Remove all the signals below, they are stupid
-    /// Emitted whenever the current build configuartion changed or the build directory of the current
-    /// build configuration was changed.
-    void buildDirectoryChanged();
-
 private:
     Target(Project *parent, Kit *k);
     void setEnabled(bool);
@@ -181,7 +176,6 @@ private:
     bool fromMap(const QVariantMap &map) override;
 
     void updateDeviceState();
-    void onBuildDirectoryChanged();
 
     void changeBuildConfigurationEnabled();
     void changeDeployConfigurationEnabled();
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
index a229d05397c02013c6ab03af44dc1192dc09f9cd..063e6bf203b98c3d784613d2691ccf15f5b3dd2e 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
@@ -553,8 +553,11 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) :
             this, &QbsBuildStepConfigWidget::updateState);
     connect(&QbsProjectManagerSettings::instance(), &QbsProjectManagerSettings::settingsBaseChanged,
             this, &QbsBuildStepConfigWidget::updateState);
-    connect(step->buildConfiguration()->target(), &ProjectExplorer::Target::buildDirectoryChanged,
-            this, &QbsBuildStepConfigWidget::updateState);
+    step->target()->subscribeSignal(&ProjectExplorer::BuildConfiguration::buildDirectoryChanged,
+                                    this, [this]() {
+        if (m_step->target()->activeBuildConfiguration() == sender())
+            updateState();
+    });
 
     setContentsMargins(0, 0, 0, 0);
 
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 46e79f4d5d54077e800310a90717e30c2f4e8c9a..bd9f93ed2a8508331c34e085c235c692d8bbad9e 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -544,7 +544,10 @@ void QbsProject::targetWasAdded(Target *t)
 {
     m_qbsProjects.insert(t, qbs::Project());
     connect(t, &Target::activeBuildConfigurationChanged, this, &QbsProject::delayParsing);
-    connect(t, &Target::buildDirectoryChanged, this, &QbsProject::delayParsing);
+    t->subscribeSignal(&BuildConfiguration::buildDirectoryChanged, this, [this]() {
+        if (static_cast<BuildConfiguration *>(sender())->isActive())
+            delayParsing();
+    });
 }
 
 void QbsProject::targetWasRemoved(Target *t)