diff --git a/src/plugins/madde/maemopackagecreationstep.cpp b/src/plugins/madde/maemopackagecreationstep.cpp
index 20549fefc7f57db05b37aef6bf7c97fc6af9cb59..8542aa9c4f2dea3b46bb4d24ccd335286d4991aa 100644
--- a/src/plugins/madde/maemopackagecreationstep.cpp
+++ b/src/plugins/madde/maemopackagecreationstep.cpp
@@ -156,22 +156,22 @@ void AbstractMaemoPackageCreationStep::handleBuildOutput()
 
 const Qt4BuildConfiguration *AbstractMaemoPackageCreationStep::qt4BuildConfiguration() const
 {
-    return static_cast<Qt4BuildConfiguration *>(buildConfiguration());
+    return static_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration());
 }
 
 AbstractQt4MaemoTarget *AbstractMaemoPackageCreationStep::maemoTarget() const
 {
-    return qobject_cast<AbstractQt4MaemoTarget *>(buildConfiguration()->target());
+    return qobject_cast<AbstractQt4MaemoTarget *>(target());
 }
 
 AbstractDebBasedQt4MaemoTarget *AbstractMaemoPackageCreationStep::debBasedMaemoTarget() const
 {
-    return qobject_cast<AbstractDebBasedQt4MaemoTarget*>(buildConfiguration()->target());
+    return qobject_cast<AbstractDebBasedQt4MaemoTarget*>(target());
 }
 
 AbstractRpmBasedQt4MaemoTarget *AbstractMaemoPackageCreationStep::rpmBasedMaemoTarget() const
 {
-    return qobject_cast<AbstractRpmBasedQt4MaemoTarget*>(buildConfiguration()->target());
+    return qobject_cast<AbstractRpmBasedQt4MaemoTarget*>(target());
 }
 
 bool AbstractMaemoPackageCreationStep::isPackagingNeeded() const
@@ -293,7 +293,7 @@ bool MaemoDebianPackageCreationStep::init()
     if (!AbstractMaemoPackageCreationStep::init())
         return false;
     m_maddeRoot = MaemoGlobal::maddeRoot(qt4BuildConfiguration()->qtVersion()->qmakeCommand());
-    m_projectDirectory = buildConfiguration()->target()->project()->projectDirectory();
+    m_projectDirectory = project()->projectDirectory();
     m_pkgFileName = maemoTarget()->packageFileName();
     m_packageName = maemoTarget()->packageName();
     m_templatesDirPath = debBasedMaemoTarget()->debianDirPath();
@@ -364,7 +364,7 @@ bool MaemoDebianPackageCreationStep::isMetaDataNewerThan(const QDateTime &packag
 void MaemoDebianPackageCreationStep::checkProjectName()
 {
     const QRegExp legalName(QLatin1String("[0-9-+a-z\\.]+"));
-    if (!legalName.exactMatch(buildConfiguration()->target()->project()->displayName())) {
+    if (!legalName.exactMatch(project()->displayName())) {
         emit addTask(Task(Task::Warning,
             tr("Your project name contains characters not allowed in "
                "Debian packages.\nThey must only use lower-case letters, "
diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp
index b01460aef4f3d7c0fe39eaef22edaf37fdf7513b..1d4ee6e02ad6b8dc93c3fe63ba0af76a2090d785 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.cpp
+++ b/src/plugins/projectexplorer/abstractprocessstep.cpp
@@ -381,7 +381,7 @@ void AbstractProcessStep::taskAdded(const ProjectExplorer::Task &task)
 
         QList<QFileInfo> possibleFiles;
         QString fileName = QFileInfo(filePath).fileName();
-        foreach (const QString &file, buildConfiguration()->target()->project()->files(ProjectExplorer::Project::AllFiles)) {
+        foreach (const QString &file, project()->files(ProjectExplorer::Project::AllFiles)) {
             QFileInfo candidate(file);
             if (candidate.fileName() == fileName)
                 possibleFiles << candidate;
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index 0a5e2db5c3dae27541a289f2fd3ea34491ab4109..e0c57664239ed7a5ac0ac08c3c8bdf76b931c37f 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -42,7 +42,6 @@
 #include "target.h"
 #include "taskwindow.h"
 #include "taskhub.h"
-#include "buildconfiguration.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/progressmanager/progressmanager.h>
@@ -221,7 +220,7 @@ void BuildManager::cancel()
         QTimer::singleShot(0, this, SLOT(emitCancelMessage()));
 
         disconnectOutput(d->m_currentBuildStep);
-        decrementActiveBuildSteps(d->m_currentBuildStep->buildConfiguration()->target()->project());
+        decrementActiveBuildSteps(d->m_currentBuildStep->project());
 
         d->m_progressFutureInterface->setProgressValueAndText(d->m_progress*100, tr("Build canceled")); //TODO NBS fix in qtconcurrent
         clearBuildQueue();
@@ -256,7 +255,7 @@ void BuildManager::emitCancelMessage()
 void BuildManager::clearBuildQueue()
 {
     foreach (BuildStep *bs, d->m_buildQueue) {
-        decrementActiveBuildSteps(bs->buildConfiguration()->target()->project());
+        decrementActiveBuildSteps(bs->project());
         disconnectOutput(bs);
     }
 
@@ -382,13 +381,13 @@ void BuildManager::nextBuildQueue()
     disconnectOutput(d->m_currentBuildStep);
     ++d->m_progress;
     d->m_progressFutureInterface->setProgressValueAndText(d->m_progress*100, msgProgress(d->m_progress, d->m_maxProgress));
-    decrementActiveBuildSteps(d->m_currentBuildStep->buildConfiguration()->target()->project());
+    decrementActiveBuildSteps(d->m_currentBuildStep->project());
 
     bool result = d->m_watcher.result();
     if (!result) {
         // Build Failure
-        const QString projectName = d->m_currentBuildStep->buildConfiguration()->target()->project()->displayName();
-        const QString targetName = d->m_currentBuildStep->buildConfiguration()->target()->displayName();
+        const QString projectName = d->m_currentBuildStep->project()->displayName();
+        const QString targetName = d->m_currentBuildStep->target()->displayName();
         addToOutputWindow(tr("Error while building project %1 (target: %2)").arg(projectName, targetName), BuildStep::ErrorOutput);
         addToOutputWindow(tr("When executing build step '%1'").arg(d->m_currentBuildStep->displayName()), BuildStep::ErrorOutput);
         // NBS TODO fix in qtconcurrent
@@ -429,11 +428,11 @@ void BuildManager::nextStep()
         d->m_currentBuildStep = d->m_buildQueue.front();
         d->m_buildQueue.pop_front();
 
-        if (d->m_currentBuildStep->buildConfiguration()->target()->project() != d->m_previousBuildStepProject) {
-            const QString projectName = d->m_currentBuildStep->buildConfiguration()->target()->project()->displayName();
+        if (d->m_currentBuildStep->project() != d->m_previousBuildStepProject) {
+            const QString projectName = d->m_currentBuildStep->project()->displayName();
             addToOutputWindow(tr("Running build steps for project %1...")
                               .arg(projectName), BuildStep::MessageOutput);
-            d->m_previousBuildStepProject = d->m_currentBuildStep->buildConfiguration()->target()->project();
+            d->m_previousBuildStepProject = d->m_currentBuildStep->project();
         }
         if (d->m_currentBuildStep->runInGuiThread()) {
             connect (d->m_currentBuildStep, SIGNAL(finished()),
@@ -476,8 +475,8 @@ bool BuildManager::buildQueueAppend(QList<BuildStep *> steps)
 
         // cleaning up
         // print something for the user
-        const QString projectName = bs->buildConfiguration()->target()->project()->displayName();
-        const QString targetName = bs->buildConfiguration()->target()->displayName();
+        const QString projectName = bs->project()->displayName();
+        const QString targetName = bs->project()->displayName();
         addToOutputWindow(tr("Error while building project %1 (target: %2)").arg(projectName, targetName), BuildStep::ErrorOutput);
         addToOutputWindow(tr("When executing build step '%1'").arg(bs->displayName()), BuildStep::ErrorOutput);
 
@@ -491,7 +490,7 @@ bool BuildManager::buildQueueAppend(QList<BuildStep *> steps)
     for (i = 0; i < count; ++i) {
         ++d->m_maxProgress;
         d->m_buildQueue.append(steps.at(i));
-        incrementActiveBuildSteps(steps.at(i)->buildConfiguration()->target()->project());
+        incrementActiveBuildSteps(steps.at(i)->target()->project());
     }
     return true;
 }
diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp
index 2a5ddaa961a066b978b11d3e486d077394bb99ba..6316be37b3aba64e722723def38aa34573d22003 100644
--- a/src/plugins/projectexplorer/buildstep.cpp
+++ b/src/plugins/projectexplorer/buildstep.cpp
@@ -142,18 +142,12 @@ BuildStep::~BuildStep()
 
 BuildConfiguration *BuildStep::buildConfiguration() const
 {
-    BuildConfiguration *bc = qobject_cast<BuildConfiguration *>(parent()->parent());
-    if (!bc)
-        bc = target()->activeBuildConfiguration();
-    return bc;
+    return qobject_cast<BuildConfiguration *>(parent()->parent());
 }
 
 DeployConfiguration *BuildStep::deployConfiguration() const
 {
-    DeployConfiguration *dc = qobject_cast<DeployConfiguration *>(parent()->parent());
-    if (!dc)
-        dc = target()->activeDeployConfiguration();
-    return dc;
+    return qobject_cast<DeployConfiguration *>(parent()->parent());
 }
 
 Target *BuildStep::target() const
@@ -161,6 +155,11 @@ Target *BuildStep::target() const
     return qobject_cast<Target *>(parent()->parent()->parent());
 }
 
+Project *BuildStep::project() const
+{
+    return target()->project();
+}
+
 bool BuildStep::immutable() const
 {
     return false;
diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h
index a9b98a7ee26f45dfea297cfbc215b1a0f0b580f7..f253534ffaff5415c104307ce736e33cd57b588f 100644
--- a/src/plugins/projectexplorer/buildstep.h
+++ b/src/plugins/projectexplorer/buildstep.h
@@ -77,6 +77,7 @@ public:
     enum OutputFormat { NormalOutput, ErrorOutput, MessageOutput, ErrorMessageOutput };
     enum OutputNewlineSetting { DoAppendNewline, DontAppendNewline };
 
+    Project *project() const;
 signals:
     void addTask(const ProjectExplorer::Task &task);
 
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index 0c36f58bd17f913c5fd7cd2f6c40c9bea6f7e1db..3627082e0db0958ad260c296da21454d2d27d81d 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -132,10 +132,9 @@ QString QMakeStep::allArguments(bool shorted)
     if (bc->subNodeBuild())
         arguments << QDir::toNativeSeparators(bc->subNodeBuild()->path());
     else if (shorted)
-        arguments << QDir::toNativeSeparators(QFileInfo(
-                buildConfiguration()->target()->project()->file()->fileName()).fileName());
+        arguments << QDir::toNativeSeparators(QFileInfo(project()->file()->fileName()).fileName());
     else
-        arguments << QDir::toNativeSeparators(buildConfiguration()->target()->project()->file()->fileName());
+        arguments << QDir::toNativeSeparators(project()->file()->fileName());
 
     arguments << "-r";
     bool userProvidedMkspec = false;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
index 308fd1476b56cb7e32a838d74aa52fb0374498ce..1a7562d9c64722cf3252eb7597cecea7b0814fd3 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
@@ -175,12 +175,12 @@ bool S60CreatePackageStep::fromMap(const QVariantMap &map)
 
 Qt4BuildConfiguration *S60CreatePackageStep::qt4BuildConfiguration() const
 {
-    return static_cast<Qt4BuildConfiguration *>(buildConfiguration());
+    return static_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration());
 }
 
 bool S60CreatePackageStep::init()
 {
-    Qt4Project *pro = qobject_cast<Qt4Project *>(buildConfiguration()->target()->project());
+    Qt4Project *pro = qobject_cast<Qt4Project *>(project());
 
     QList<Qt4ProFileNode *> nodes = pro->allProFiles();
 
@@ -200,7 +200,7 @@ bool S60CreatePackageStep::init()
     m_makeCmd = qt4BuildConfiguration()->makeCommand();
     if (!QFileInfo(m_makeCmd).isAbsolute()) {
         // Try to detect command in environment
-        const QString tmp = buildConfiguration()->environment().searchInPath(m_makeCmd);
+        const QString tmp = qt4BuildConfiguration()->environment().searchInPath(m_makeCmd);
         if (tmp.isEmpty()) {
             emit addOutput(tr("Could not find make command '%1' in the build environment").arg(m_makeCmd), BuildStep::ErrorOutput);
             return false;
@@ -711,7 +711,7 @@ bool S60CreatePackageStep::createsSmartInstaller() const
 void S60CreatePackageStep::setCreatesSmartInstaller(bool value)
 {
     m_createSmartInstaller = value;
-    static_cast<Qt4BuildConfiguration *>(buildConfiguration())->emitS60CreatesSmartInstallerChanged();
+    qt4BuildConfiguration()->emitS60CreatesSmartInstallerChanged();
 }
 
 void S60CreatePackageStep::resetPassphrases()
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp
index 1e971ce0f9f7cf90d3660db8e82435b9cb737f90..ead6b8d8375f995a84dc3163e90fa0e38805c98c 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp
@@ -150,7 +150,7 @@ S60DeployStep::~S60DeployStep()
 
 bool S60DeployStep::init()
 {
-    Qt4BuildConfiguration *bc = static_cast<Qt4BuildConfiguration *>(buildConfiguration());
+    Qt4BuildConfiguration *bc = static_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration());
     S60DeployConfiguration *deployConfiguration = static_cast<S60DeployConfiguration *>(bc->target()->activeDeployConfiguration());
     if (!deployConfiguration)
         return false;
diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp
index 8c0fbcff0059e56d872f487ea86a3c060697e760..d20c03105ae728ad1ad6a26ef66b9047116a2189 100644
--- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp
+++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp
@@ -36,6 +36,7 @@
 #include "remotelinuxdeploystepwidget.h"
 
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/target.h>
 #include <qt4projectmanager/qt4buildconfiguration.h>
 
 using namespace ProjectExplorer;
@@ -88,7 +89,7 @@ bool AbstractRemoteLinuxDeployStep::init()
 bool AbstractRemoteLinuxDeployStep::isDeploymentPossible(QString *whyNot) const
 {
     deployService()->setDeviceConfiguration(deployConfiguration()->deviceConfiguration());
-    deployService()->setBuildConfiguration(qobject_cast<Qt4ProjectManager::Qt4BuildConfiguration *>(buildConfiguration()));
+    deployService()->setBuildConfiguration(qobject_cast<Qt4ProjectManager::Qt4BuildConfiguration *>(target()->activeBuildConfiguration()));
     return deployService()->isDeploymentPossible(whyNot);
 }
 
diff --git a/src/plugins/remotelinux/tarpackagecreationstep.cpp b/src/plugins/remotelinux/tarpackagecreationstep.cpp
index 8cdc2186fe8cb9818d6e59ca470f680be354692d..cb8bf1e11ff558afbc099c8b964cb0ab4577a1ba 100644
--- a/src/plugins/remotelinux/tarpackagecreationstep.cpp
+++ b/src/plugins/remotelinux/tarpackagecreationstep.cpp
@@ -297,7 +297,7 @@ bool TarPackageCreationStep::writeHeader(QFile &tarFile, const QFileInfo &fileIn
 
 QString TarPackageCreationStep::packageFileName() const
 {
-    return target()->project()->displayName() + QLatin1String(".tar");
+    return project()->displayName() + QLatin1String(".tar");
 }
 
 BuildStepConfigWidget *TarPackageCreationStep::createConfigWidget()