diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp
index b09a1b156f891ea70a46aba6fe89738b437f95dc..11fe8afdcf51a5c0d2e923e48cbffb3d5a08ff55 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp
@@ -89,31 +89,28 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject *
 {
 }
 
-bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent) const
+int AutotoolsBuildConfigurationFactory::priority(const Target *parent) const
 {
-    return canHandle(parent);
+    return canHandle(parent) ? 0 : -1;
 }
 
 QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const
 {
     QList<BuildInfo *> result;
-    QTC_ASSERT(canCreate(parent), return result);
-
     result << createBuildInfo(parent->kit(),
                               Utils::FileName::fromString(parent->project()->projectDirectory()));
     return result;
 }
 
-bool AutotoolsBuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const
+int AutotoolsBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const
 {
-    return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
-            .matchesType(QLatin1String(Constants::MAKEFILE_MIMETYPE));
+    return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
+            .matchesType(QLatin1String(Constants::MAKEFILE_MIMETYPE))) ? 0 : -1;
 }
 
 QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const
 {
     QList<BuildInfo *> result;
-    QTC_ASSERT(canSetup(k, projectPath), return result);
     BuildInfo *info = createBuildInfo(k,
                                       Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath)));
     //: The name of the build configuration created by default for a autotools project.
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h
index 3375cd3428df7e2326b23f5bdd3525971d8fde0a..2aedd932460617e9105165e522e70bf497401b4d 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h
@@ -69,9 +69,9 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu
 public:
     explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0);
 
-    bool canCreate(const ProjectExplorer::Target *parent) const;
+    int priority(const ProjectExplorer::Target *parent) const;
     QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const;
-    bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const;
+    int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const;
     QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k,
                                                         const QString &projectPath) const;
     ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent,
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 9d7179dc6c7e4d230f8e3284b99445523eaa2758..9a63ccb8287097174d5f73ddd13ae35f47ea9dac 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -122,15 +122,14 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory()
 {
 }
 
-bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const
+int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const
 {
-    return canHandle(parent);
+    return canHandle(parent) ? 0 : -1;
 }
 
 QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canCreate(parent), return result);
 
     CMakeBuildInfo *info = createBuildInfo(parent->kit(),
                                            parent->project()->projectDirectory());
@@ -138,18 +137,16 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBui
     return result;
 }
 
-bool CMakeBuildConfigurationFactory::canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const
+int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const
 {
-    return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
-            .matchesType(QLatin1String(Constants::CMAKEMIMETYPE));
+    return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
+            .matchesType(QLatin1String(Constants::CMAKEMIMETYPE))) ? 0 : -1;
 }
 
 QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k,
                                                                                     const QString &projectPath) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canSetup(k, projectPath), return result);
-
     CMakeBuildInfo *info = createBuildInfo(k, ProjectExplorer::Project::projectDirectory(projectPath));
     //: The name of the build configuration created by default for a cmake project.
     info->displayName = tr("Default");
@@ -163,7 +160,6 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSet
 ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent,
                                                                             const ProjectExplorer::BuildInfo *info) const
 {
-    QTC_ASSERT(canCreate(parent), return 0);
     QTC_ASSERT(info->factory() == this, return 0);
     QTC_ASSERT(info->kitId == parent->kit()->id(), return 0);
     QTC_ASSERT(!info->displayName.isEmpty(), return 0);
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
index de7ab612d33a680e4427bb0702baa00f2b95c294..41de9c0bee393e7015de8f0c82eac40dc88a5964 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h
@@ -85,9 +85,9 @@ public:
     CMakeBuildConfigurationFactory(QObject *parent = 0);
     ~CMakeBuildConfigurationFactory();
 
-    bool canCreate(const ProjectExplorer::Target *parent) const;
+    int priority(const ProjectExplorer::Target *parent) const;
     QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const;
-    bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const;
+    int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const;
     QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k,
                                                         const QString &projectPath) const;
     ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent,
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index f130f327b4261f4433df1817bed8cf71e7c2c62f..b43b6505d99ed7fa661338dade71c173520d916f 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -87,31 +87,28 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory()
 {
 }
 
-bool GenericBuildConfigurationFactory::canCreate(const Target *parent) const
+int GenericBuildConfigurationFactory::priority(const Target *parent) const
 {
-    return canHandle(parent);
+    return canHandle(parent) ? 0 : -1;
 }
 
 QList<BuildInfo *> GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canCreate(parent), return result);
-
     BuildInfo *info = createBuildInfo(parent->kit(), Utils::FileName::fromString(parent->project()->projectDirectory()));
     result << info;
     return result;
 }
 
-bool GenericBuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const
+int GenericBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const
 {
-    return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
-            .matchesType(QLatin1String(Constants::GENERICMIMETYPE));
+    return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
+            .matchesType(QLatin1String(Constants::GENERICMIMETYPE))) ? 0 : -1;
 }
 
 QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const
 {
     QList<BuildInfo *> result;
-    QTC_ASSERT(canSetup(k, projectPath), return result);
     BuildInfo *info = createBuildInfo(k, Utils::FileName::fromString(ProjectExplorer::Project::projectDirectory(projectPath)));
     //: The name of the build configuration created by default for a generic project.
     info->displayName = tr("Default");
@@ -121,7 +118,6 @@ QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit *
 
 BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const
 {
-    QTC_ASSERT(canCreate(parent), return 0);
     QTC_ASSERT(info->factory() == this, return 0);
     QTC_ASSERT(info->kitId == parent->kit()->id(), return 0);
     QTC_ASSERT(!info->displayName.isEmpty(), return 0);
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
index aca2452d65803c97dd6f31546cbe24a027223795..d2f1880f48b39805d4cb1246973f5db7e473fca9 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h
@@ -72,9 +72,9 @@ public:
     explicit GenericBuildConfigurationFactory(QObject *parent = 0);
     ~GenericBuildConfigurationFactory();
 
-    bool canCreate(const ProjectExplorer::Target *parent) const;
+    int priority(const ProjectExplorer::Target *parent) const;
     QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const;
-    bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const;
+    int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const;
     QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k,
                                                         const QString &projectPath) const;
     ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent,
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 8366ff00f0f8b643f81dbfa418c5fd5439341103..fb1f5a32c62203a567162b7ef395c8ecd192edd0 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -346,11 +346,16 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(Kit *k, const QStri
 {
     QList<IBuildConfigurationFactory *> factories
             = ExtensionSystem::PluginManager::instance()->getObjects<IBuildConfigurationFactory>();
-    foreach (IBuildConfigurationFactory *factory, factories) {
-        if (factory->canSetup(k, projectPath))
-            return factory;
+    IBuildConfigurationFactory *factory = 0;
+    int priority = -1;
+    foreach (IBuildConfigurationFactory *i, factories) {
+        int iPriority = i->priority(k, projectPath);
+        if (iPriority > priority) {
+            factory = i;
+            priority = iPriority;
+        }
     }
-    return 0;
+    return factory;
 }
 
 // create
@@ -358,11 +363,16 @@ IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent)
 {
     QList<IBuildConfigurationFactory *> factories
             = ExtensionSystem::PluginManager::getObjects<IBuildConfigurationFactory>();
-    foreach (IBuildConfigurationFactory *factory, factories) {
-        if (factory->canCreate(parent))
-            return factory;
+    IBuildConfigurationFactory *factory = 0;
+    int priority = -1;
+    foreach (IBuildConfigurationFactory *i, factories) {
+        int iPriority = i->priority(parent);
+        if (iPriority > priority) {
+            factory = i;
+            priority = iPriority;
+        }
     }
-    return 0;
+    return factory;
 }
 
 // clone
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index 52bca21090a2bede29bce22493530b46f726245b..452a73f4857b50eb762a747b608df2c608c4828a 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -128,15 +128,15 @@ public:
     explicit IBuildConfigurationFactory(QObject *parent = 0);
     virtual ~IBuildConfigurationFactory();
 
-    // Used to see whether any BuildInfo is available on this factory for a given target.
-    virtual bool canCreate(const Target *parent) const = 0;
+    // The priority is negative if this factory can not create anything for the target.
+    // It is 0 for the "default" factory that wants to handle the target.
+    // Add 100 for each specialization.
+    virtual int priority(const Target *parent) const = 0;
     // List of build information that can be used to create a new build configuration via
     // "Add Build Configuration" button.
     virtual QList<BuildInfo *> availableBuilds(const Target *parent) const = 0;
 
-    // Used to see whether this factory can produce any BuildConfigurations for a kit when
-    // setting up the given project.
-    virtual bool canSetup(const Kit *k, const QString &projectPath) const = 0;
+    virtual int priority(const Kit *k, const QString &projectPath) const = 0;
     // List of build information that can be used to initially set up a new build configuration.
     virtual QList<BuildInfo *> availableSetups(const Kit *k, const QString &projectPath) const = 0;
 
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
index fd54f2d3e8cf7ef9f8af1b3fb2abff14b22729dc..bbde8ddbee3db74fab8243e32c8bed47e538dcfb 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
@@ -254,15 +254,14 @@ ProjectExplorer::BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const
     return info;
 }
 
-bool QbsBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const
+int QbsBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const
 {
-    return canHandle(parent);
+    return canHandle(parent) ? 0 : -1;
 }
 
 QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canCreate(parent), return result);
 
     const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(parent->project()->projectFilePath());
 
@@ -273,16 +272,15 @@ QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableBuild
     return result;
 }
 
-bool QbsBuildConfigurationFactory::canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const
+int QbsBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const
 {
-    return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
-            .matchesType(QLatin1String(Constants::MIME_TYPE));
+    return (k && Core::ICore::findByFile(QFileInfo(projectPath))
+            .matchesType(QLatin1String(Constants::MIME_TYPE))) ? 0 : -1;
 }
 
 QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canSetup(k, projectPath), return result);
 
     const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(projectPath);
 
@@ -302,7 +300,6 @@ QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableSetup
 ProjectExplorer::BuildConfiguration *QbsBuildConfigurationFactory::create(ProjectExplorer::Target *parent,
                                                                           const ProjectExplorer::BuildInfo *info) const
 {
-    QTC_ASSERT(canCreate(parent), return 0);
     QTC_ASSERT(info->factory() == this, return 0);
     QTC_ASSERT(info->kitId == parent->kit()->id(), return 0);
     QTC_ASSERT(!info->displayName.isEmpty(), return 0);
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
index 61bde2f9c3393b057342f0262a8d418f13af9c45..14c1efbbe1515bd11e0848d396455a724554fc40 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
@@ -112,9 +112,9 @@ public:
     explicit QbsBuildConfigurationFactory(QObject *parent = 0);
     ~QbsBuildConfigurationFactory();
 
-    bool canCreate(const ProjectExplorer::Target *parent) const;
+    int priority(const ProjectExplorer::Target *parent) const;
     QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const;
-    bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const;
+    int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const;
     QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k,
                                                         const QString &projectPath) const;
     ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent,
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 4b683b251762494bc1dbfbc9f8f5a3dec3c0b047..6e8b302dffbea72c9339d862ab3de8a4b721b453 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -569,16 +569,14 @@ QmakeBuildInfo *Qt4BuildConfigurationFactory::createBuildInfo(const Kit *k,
     return info;
 }
 
-bool Qt4BuildConfigurationFactory::canCreate(const Target *parent) const
+int Qt4BuildConfigurationFactory::priority(const Target *parent) const
 {
-    return canHandle(parent);
+    return canHandle(parent) ? 0 : -1;
 }
 
 QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *parent) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canCreate(parent), return result);
-
     QmakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectFilePath(),
                                            BuildConfiguration::Debug);
     info->displayName.clear(); // ask for a name
@@ -588,18 +586,15 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *p
     return result;
 }
 
-bool Qt4BuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const
+int Qt4BuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const
 {
-    return k && QtSupport::QtKitInformation::qtVersion(k)
-            && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
-            .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE));
+    return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath))
+            .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE))) ? 0 : -1;
 }
 
 QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const
 {
     QList<ProjectExplorer::BuildInfo *> result;
-    QTC_ASSERT(canSetup(k, projectPath), return result);
-
     result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Debug);
     result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Release);
 
@@ -608,7 +603,6 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, c
 
 BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const
 {
-    QTC_ASSERT(canCreate(parent), return 0);
     QTC_ASSERT(info->factory() == this, return 0);
     QTC_ASSERT(info->kitId == parent->kit()->id(), return 0);
     QTC_ASSERT(!info->displayName.isEmpty(), return 0);
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index a78d47d15d91a2fca7e76fa4ccca390b9169c6b6..17e519b530c3af9097fb64e4226bb67de4287d0c 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -163,9 +163,9 @@ public:
     explicit Qt4BuildConfigurationFactory(QObject *parent = 0);
     ~Qt4BuildConfigurationFactory();
 
-    bool canCreate(const ProjectExplorer::Target *parent) const;
+    int priority(const ProjectExplorer::Target *parent) const;
     QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const;
-    bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const;
+    int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const;
     QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k,
                                                         const QString &projectPath) const;
     ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent,