diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index f23d339a0426528582321a646218006ffda15188..3514883baf50a5eafde572d4cc2f138b6740696b 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -709,7 +709,9 @@ void CMakeProject::updateApplicationAndDeploymentTargets()
         deploymentData.addFile(ct.executable, deploymentPrefix + buildDir.relativeFilePath(QFileInfo(ct.executable).dir().path()), DeployableFile::TypeExecutable);
         if (!ct.library) {
             // TODO: Put a path to corresponding .cbp file into projectFilePath?
-            appTargetList.list << BuildTargetInfo(ct.executable, ct.executable);
+            appTargetList.list << BuildTargetInfo(ct.title,
+                                                  Utils::FileName::fromString(ct.executable),
+                                                  Utils::FileName::fromString(ct.executable));
         }
     }
 
diff --git a/src/plugins/projectexplorer/buildtargetinfo.h b/src/plugins/projectexplorer/buildtargetinfo.h
index fa59ca566e552305039fffcde1841c7f0fa9a78d..cbdab12f5c785f21990ca45d7b06d2d80b01835f 100644
--- a/src/plugins/projectexplorer/buildtargetinfo.h
+++ b/src/plugins/projectexplorer/buildtargetinfo.h
@@ -31,6 +31,7 @@
 
 #include "projectexplorer_export.h"
 
+#include <utils/algorithm.h>
 #include <utils/fileutils.h>
 
 #include <QList>
@@ -42,26 +43,24 @@ class PROJECTEXPLORER_EXPORT BuildTargetInfo
 {
 public:
     BuildTargetInfo() {}
-    BuildTargetInfo(const Utils::FileName &targetFilePath, const Utils::FileName &projectFilePath)
-        : targetFilePath(targetFilePath), projectFilePath(projectFilePath)
-    {
-    }
-
-    BuildTargetInfo(const QString &targetFilePath, const QString &projectFilePath)
-        : targetFilePath(Utils::FileName::fromUserInput(targetFilePath)),
-          projectFilePath(Utils::FileName::fromUserInput(projectFilePath))
+    BuildTargetInfo(const QString &targetName, const Utils::FileName &targetFilePath,
+                    const Utils::FileName &projectFilePath)
+        : targetName(targetName)
+        , targetFilePath(targetFilePath)
+        , projectFilePath(projectFilePath)
     {
     }
 
+    QString targetName;
     Utils::FileName targetFilePath;
     Utils::FileName projectFilePath;
 
-    bool isValid() const { return !targetFilePath.isEmpty(); }
+    bool isValid() const { return !targetName.isEmpty(); }
 };
 
 inline bool operator==(const BuildTargetInfo &ti1, const BuildTargetInfo &ti2)
 {
-    return ti1.targetFilePath == ti2.targetFilePath;
+    return ti1.targetName == ti2.targetName;
 }
 
 inline bool operator!=(const BuildTargetInfo &ti1, const BuildTargetInfo &ti2)
@@ -71,7 +70,7 @@ inline bool operator!=(const BuildTargetInfo &ti1, const BuildTargetInfo &ti2)
 
 inline uint qHash(const BuildTargetInfo &ti)
 {
-    return qHash(ti.targetFilePath);
+    return qHash(ti.targetName);
 }
 
 
@@ -92,6 +91,18 @@ public:
         return Utils::FileName();
     }
 
+    bool hasTarget(const QString &targetName) {
+        return Utils::anyOf(list, [&targetName](const BuildTargetInfo &ti) {
+            return ti.targetName == targetName;
+        });
+    }
+
+    Utils::FileName targetFilePath(const QString &targetName) {
+        return Utils::findOrDefault(list, [&targetName](const BuildTargetInfo &ti) {
+            return ti.targetName == targetName;
+        }).targetFilePath;
+    }
+
     QList<BuildTargetInfo> list;
 };
 
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index c3789249be501159c9c99c17d4e26f9efaa141c2..fdd48cb3e8e1af95783a31f12ce0d54dcef52382 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -769,7 +769,8 @@ void QbsProject::updateApplicationTargets(const qbs::ProjectData &projectData)
         if (!productData.isEnabled() || !productData.isRunnable())
             continue;
         if (productData.targetArtifacts().isEmpty()) { // No build yet.
-            applications.list << ProjectExplorer::BuildTargetInfo(Utils::FileName(),
+            applications.list << ProjectExplorer::BuildTargetInfo(productData.name(),
+                    Utils::FileName(),
                     Utils::FileName::fromString(productData.location().fileName()));
             continue;
         }
@@ -777,7 +778,8 @@ void QbsProject::updateApplicationTargets(const qbs::ProjectData &projectData)
             QTC_ASSERT(ta.isValid(), continue);
             if (!ta.isExecutable())
                 continue;
-            applications.list << ProjectExplorer::BuildTargetInfo(Utils::FileName::fromString(ta.filePath()),
+            applications.list << ProjectExplorer::BuildTargetInfo(productData.name(),
+                    Utils::FileName::fromString(ta.filePath()),
                     Utils::FileName::fromString(productData.location().fileName()));
         }
     }
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index 01010629052394dba7cf96841ee6c2a47fd70736..89eef3cc424aaae1692348bd5b09ead9a36b7942 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -1497,8 +1497,11 @@ void QmakeProject::updateBuildSystemData()
     target->setDeploymentData(deploymentData);
 
     BuildTargetInfoList appTargetList;
-    foreach (const QmakeProFileNode * const node, applicationProFiles())
-        appTargetList.list << BuildTargetInfo(executableFor(node), node->path());
+    foreach (const QmakeProFileNode * const node, applicationProFiles()) {
+        appTargetList.list << BuildTargetInfo(node->targetInformation().target,
+                                              Utils::FileName::fromString(executableFor(node)),
+                                              Utils::FileName::fromString(node->path()));
+    }
     target->setApplicationTargets(appTargetList);
 }
 
diff --git a/src/plugins/qnx/qnxrunconfiguration.cpp b/src/plugins/qnx/qnxrunconfiguration.cpp
index c52ef1720ccf611ded7d4a22748c25fedcfbdb2a..620ef2869dfc2535297102985c04ccd18a80586d 100644
--- a/src/plugins/qnx/qnxrunconfiguration.cpp
+++ b/src/plugins/qnx/qnxrunconfiguration.cpp
@@ -45,8 +45,8 @@ namespace {
 const char QtLibPathKey[] = "Qt4ProjectManager.QnxRunConfiguration.QtLibPath";
 }
 
-QnxRunConfiguration::QnxRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &proFilePath)
-    : RemoteLinux::RemoteLinuxRunConfiguration(parent, id, proFilePath)
+QnxRunConfiguration::QnxRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &targetName)
+    : RemoteLinux::RemoteLinuxRunConfiguration(parent, id, targetName)
 {
 }
 
diff --git a/src/plugins/qnx/qnxrunconfiguration.h b/src/plugins/qnx/qnxrunconfiguration.h
index 127af4c4efb536a6369ca2419a4748ddfc7de8b4..f46ef1c8da78e9806a3e9ac7639e87540540e6d6 100644
--- a/src/plugins/qnx/qnxrunconfiguration.h
+++ b/src/plugins/qnx/qnxrunconfiguration.h
@@ -44,7 +44,7 @@ class QnxRunConfiguration : public RemoteLinux::RemoteLinuxRunConfiguration
     Q_OBJECT
 public:
     QnxRunConfiguration(ProjectExplorer::Target *parent, Core::Id id,
-            const QString &projectFilePath);
+            const QString &targetName);
 
     Utils::Environment environment() const;
 
diff --git a/src/plugins/qnx/qnxrunconfigurationfactory.cpp b/src/plugins/qnx/qnxrunconfigurationfactory.cpp
index f05c0cf40b4ea0b3750a63bbf6848c6d9cee720b..8dc0f977c64a694dca00ea85447b70b444652d76 100644
--- a/src/plugins/qnx/qnxrunconfigurationfactory.cpp
+++ b/src/plugins/qnx/qnxrunconfigurationfactory.cpp
@@ -97,7 +97,17 @@ bool QnxRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, Core
 
 ProjectExplorer::RunConfiguration *QnxRunConfigurationFactory::doCreate(ProjectExplorer::Target *parent, Core::Id id)
 {
-    return new QnxRunConfiguration(parent, id, pathFromId(id));
+    const QString projectFilePath = pathFromId(id);
+    const QmakeProjectManager::QmakeProject * const qt4Project
+            = qobject_cast<QmakeProjectManager::QmakeProject *>(parent->project());
+    QTC_ASSERT(qt4Project, return 0);
+    foreach (const QmakeProjectManager::QmakeProFileNode * const node,
+             qt4Project->applicationProFiles()) {
+        if (node->path() == projectFilePath)
+            return new QnxRunConfiguration(parent, id, node->targetInformation().target);
+    }
+    QTC_CHECK(false);
+    return 0;
 }
 
 bool QnxRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp
index 162c1c4d57aa2efa5022bac87bee675cd02b8389..f2a9278543c0f4511d9f289929b6d88d05071b1c 100644
--- a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp
+++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp
@@ -46,7 +46,7 @@ namespace RemoteLinux {
 namespace Internal {
 namespace {
 const char ArgumentsKey[] = "Qt4ProjectManager.MaemoRunConfiguration.Arguments";
-const char ProFileKey[] = "Qt4ProjectManager.MaemoRunConfiguration.ProFile";
+const char TargetNameKey[] = "Qt4ProjectManager.MaemoRunConfiguration.TargetName";
 const char UseAlternateExeKey[] = "RemoteLinux.RunConfig.UseAlternateRemoteExecutable";
 const char AlternateExeKey[] = "RemoteLinux.RunConfig.AlternateRemoteExecutable";
 const char WorkingDirectoryKey[] = "RemoteLinux.RunConfig.WorkingDirectory";
@@ -55,14 +55,14 @@ const char WorkingDirectoryKey[] = "RemoteLinux.RunConfig.WorkingDirectory";
 
 class RemoteLinuxRunConfigurationPrivate {
 public:
-    RemoteLinuxRunConfigurationPrivate(const QString &projectFilePath)
-        : projectFilePath(projectFilePath),
+    RemoteLinuxRunConfigurationPrivate(const QString &targetName)
+        : targetName(targetName),
           useAlternateRemoteExecutable(false)
     {
     }
 
     RemoteLinuxRunConfigurationPrivate(const RemoteLinuxRunConfigurationPrivate *other)
-        : projectFilePath(other->projectFilePath),
+        : targetName(other->targetName),
           arguments(other->arguments),
           useAlternateRemoteExecutable(other->useAlternateRemoteExecutable),
           alternateRemoteExecutable(other->alternateRemoteExecutable),
@@ -70,7 +70,7 @@ public:
     {
     }
 
-    QString projectFilePath;
+    QString targetName;
     QStringList arguments;
     bool useAlternateRemoteExecutable;
     QString alternateRemoteExecutable;
@@ -82,9 +82,9 @@ public:
 using namespace Internal;
 
 RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *parent, Core::Id id,
-        const QString &proFilePath)
+        const QString &targetName)
     : AbstractRemoteLinuxRunConfiguration(parent, id),
-      d(new RemoteLinuxRunConfigurationPrivate(proFilePath))
+      d(new RemoteLinuxRunConfigurationPrivate(targetName))
 {
     init();
 }
@@ -135,7 +135,7 @@ QVariantMap RemoteLinuxRunConfiguration::toMap() const
     QVariantMap map(RunConfiguration::toMap());
     map.insert(QLatin1String(ArgumentsKey), d->arguments);
     const QDir dir = QDir(target()->project()->projectDirectory().toString());
-    map.insert(QLatin1String(ProFileKey), dir.relativeFilePath(d->projectFilePath));
+    map.insert(QLatin1String(TargetNameKey), d->targetName);
     map.insert(QLatin1String(UseAlternateExeKey), d->useAlternateRemoteExecutable);
     map.insert(QLatin1String(AlternateExeKey), d->alternateRemoteExecutable);
     map.insert(QLatin1String(WorkingDirectoryKey), d->workingDirectory);
@@ -149,8 +149,8 @@ bool RemoteLinuxRunConfiguration::fromMap(const QVariantMap &map)
 
     d->arguments = map.value(QLatin1String(ArgumentsKey)).toStringList();
     const QDir dir = QDir(target()->project()->projectDirectory().toString());
-    d->projectFilePath
-            = QDir::cleanPath(dir.filePath(map.value(QLatin1String(ProFileKey)).toString()));
+    d->targetName
+            = QDir::cleanPath(dir.filePath(map.value(QLatin1String(TargetNameKey)).toString()));
     d->useAlternateRemoteExecutable = map.value(QLatin1String(UseAlternateExeKey), false).toBool();
     d->alternateRemoteExecutable = map.value(QLatin1String(AlternateExeKey)).toString();
     d->workingDirectory = map.value(QLatin1String(WorkingDirectoryKey)).toString();
@@ -162,9 +162,9 @@ bool RemoteLinuxRunConfiguration::fromMap(const QVariantMap &map)
 
 QString RemoteLinuxRunConfiguration::defaultDisplayName()
 {
-    if (!d->projectFilePath.isEmpty())
+    if (!d->targetName.isEmpty())
         //: %1 is the name of a project which is being run on remote Linux
-        return tr("%1 (on Remote Device)").arg(QFileInfo(d->projectFilePath).completeBaseName());
+        return tr("%1 (on Remote Device)").arg(d->targetName);
     //: Remote Linux run configuration default display name
     return tr("Run on Remote Device");
 }
@@ -183,8 +183,7 @@ Environment RemoteLinuxRunConfiguration::environment() const
 
 QString RemoteLinuxRunConfiguration::localExecutableFilePath() const
 {
-    return target()->applicationTargets()
-            .targetForProject(Utils::FileName::fromString(d->projectFilePath)).toString();
+    return target()->applicationTargets().targetFilePath(d->targetName).toString();
 }
 
 QString RemoteLinuxRunConfiguration::defaultRemoteExecutableFilePath() const
@@ -241,11 +240,6 @@ void RemoteLinuxRunConfiguration::handleBuildSystemDataUpdated()
     updateEnabledState();
 }
 
-QString RemoteLinuxRunConfiguration::projectFilePath() const
-{
-    return d->projectFilePath;
-}
-
 const char *RemoteLinuxRunConfiguration::IdPrefix = "RemoteLinuxRunConfiguration:";
 
 } // namespace RemoteLinux
diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.h b/src/plugins/remotelinux/remotelinuxrunconfiguration.h
index 6829920c005a0fff3ff20cd6378b240b6b927657..1ce18fef92f704181f5d370aae9d864087351363 100644
--- a/src/plugins/remotelinux/remotelinuxrunconfiguration.h
+++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.h
@@ -60,7 +60,7 @@ class REMOTELINUX_EXPORT RemoteLinuxRunConfiguration : public AbstractRemoteLinu
 
 public:
     RemoteLinuxRunConfiguration(ProjectExplorer::Target *parent, Core::Id id,
-        const QString &projectFilePath);
+        const QString &targetName);
     ~RemoteLinuxRunConfiguration();
 
     bool isEnabled() const;
@@ -83,8 +83,6 @@ public:
 
     QVariantMap toMap() const;
 
-    QString projectFilePath() const;
-
     static const char *IdPrefix;
 
 signals:
diff --git a/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp b/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp
index 2acb0e12a50f0b527fa63b244367869f40a7ec83..5d787ff3997962d64166f23bf955bd956fb36aa9 100644
--- a/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp
+++ b/src/plugins/remotelinux/remotelinuxrunconfigurationfactory.cpp
@@ -38,7 +38,6 @@
 #include <projectexplorer/target.h>
 #include <utils/qtcassert.h>
 
-#include <QFileInfo>
 #include <QString>
 
 using namespace ProjectExplorer;
@@ -47,7 +46,7 @@ namespace RemoteLinux {
 namespace Internal {
 
 namespace {
-QString pathFromId(Core::Id id)
+QString stringFromId(Core::Id id)
 {
     QByteArray idStr = id.name();
     if (!idStr.startsWith(RemoteLinuxRunConfiguration::IdPrefix))
@@ -72,7 +71,7 @@ bool RemoteLinuxRunConfigurationFactory::canCreate(Target *parent, Core::Id id)
     if (!canHandle(parent))
         return false;
     return id == RemoteLinuxCustomRunConfiguration::runConfigId()
-            || !parent->applicationTargets().targetForProject(pathFromId(id)).isEmpty();
+            || parent->applicationTargets().hasTarget(stringFromId(id));
 }
 
 bool RemoteLinuxRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
@@ -100,7 +99,7 @@ QList<Core::Id> RemoteLinuxRunConfigurationFactory::availableCreationIds(Target
 
     const Core::Id base = Core::Id(RemoteLinuxRunConfiguration::IdPrefix);
     foreach (const BuildTargetInfo &bti, parent->applicationTargets().list)
-        result << base.withSuffix(bti.projectFilePath.toString());
+        result << base.withSuffix(bti.targetName);
     result << RemoteLinuxCustomRunConfiguration::runConfigId();
     return result;
 }
@@ -109,15 +108,14 @@ QString RemoteLinuxRunConfigurationFactory::displayNameForId(Core::Id id) const
 {
     if (id == RemoteLinuxCustomRunConfiguration::runConfigId())
         return RemoteLinuxCustomRunConfiguration::runConfigDefaultDisplayName();
-    return QFileInfo(pathFromId(id)).completeBaseName()
-        + QLatin1Char(' ') + tr("(on Remote Generic Linux Host)");
+    return stringFromId(id) + QLatin1Char(' ') + tr("(on Remote Generic Linux Host)");
 }
 
 RunConfiguration *RemoteLinuxRunConfigurationFactory::doCreate(Target *parent, Core::Id id)
 {
     if (id == RemoteLinuxCustomRunConfiguration::runConfigId())
         return new RemoteLinuxCustomRunConfiguration(parent);
-    return new RemoteLinuxRunConfiguration(parent, id, pathFromId(id));
+    return new RemoteLinuxRunConfiguration(parent, id, stringFromId(id));
 }
 
 RunConfiguration *RemoteLinuxRunConfigurationFactory::doRestore(Target *parent,