diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 1904c20f5787c96c13f5875db0ca4825cb19f64c..9a9251aa8d317a5e65d632d36c55dbe9175fe702 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -367,48 +367,48 @@ static inline bool isMsvcFlavor(Abi::OSFlavor osf)
       || osf == Abi::WindowsMsvc2012Flavor;
 }
 
-bool checkCdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check)
-{
-#ifdef Q_OS_WIN
-    const Abi abi = sp.toolChainAbi;
-    if (!isCdbEngineEnabled()) {
-        check->errorDetails.push_back(CdbEngine::tr("The CDB debug engine required for %1 is currently disabled.").
-                           arg(abi.toString()));
-        check->settingsCategory = QLatin1String(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY);
-        check->settingsPage = CdbOptionsPage::settingsId();
-        return false;
-    }
-
-    if (!validMode(sp.startMode)) {
-        check->errorDetails.push_back(CdbEngine::tr("The CDB engine does not support start mode %1.").arg(sp.startMode));
-        return false;
-    }
-
-    if (abi.binaryFormat() != Abi::PEFormat || abi.os() != Abi::WindowsOS) {
-        check->errorDetails.push_back(CdbEngine::tr("The CDB debug engine does not support the %1 ABI.").
-                                      arg(abi.toString()));
-        return false;
-    }
-
-    if (sp.startMode == AttachCore && !isMsvcFlavor(abi.osFlavor())) {
-        check->errorDetails.push_back(CdbEngine::tr("The CDB debug engine cannot debug gdb core files."));
-        return false;
-    }
-
-    if (sp.debuggerCommand.isEmpty()) {
-        check->errorDetails.push_back(msgNoCdbBinaryForToolChain(abi));
-        check->settingsCategory = QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-        check->settingsPage = QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-        return false;
-    }
-
-    return true;
-#else
-    Q_UNUSED(sp);
-    check->errorDetails.push_back(QString::fromLatin1("Unsupported debug mode"));
-    return false;
-#endif
-}
+//bool checkCdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check)
+//{
+//#ifdef Q_OS_WIN
+//    const Abi abi = sp.toolChainAbi;
+//    if (!isCdbEngineEnabled()) {
+//        check->errorDetails.push_back(CdbEngine::tr("The CDB debug engine required for %1 is currently disabled.").
+//                           arg(abi.toString()));
+//        check->settingsCategory = QLatin1String(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY);
+//        check->settingsPage = CdbOptionsPage::settingsId();
+//        return false;
+//    }
+
+//    if (!validMode(sp.startMode)) {
+//        check->errorDetails.push_back(CdbEngine::tr("The CDB engine does not support start mode %1.").arg(sp.startMode));
+//        return false;
+//    }
+
+//    if (abi.binaryFormat() != Abi::PEFormat || abi.os() != Abi::WindowsOS) {
+//        check->errorDetails.push_back(CdbEngine::tr("The CDB debug engine does not support the %1 ABI.").
+//                                      arg(abi.toString()));
+//        return false;
+//    }
+
+//    if (sp.startMode == AttachCore && !isMsvcFlavor(abi.osFlavor())) {
+//        check->errorDetails.push_back(CdbEngine::tr("The CDB debug engine cannot debug gdb core files."));
+//        return false;
+//    }
+
+//    if (sp.debuggerCommand.isEmpty()) {
+//        check->errorDetails.push_back(msgNoCdbBinaryForToolChain(abi));
+//        check->settingsCategory = QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+//        check->settingsPage = QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+//        return false;
+//    }
+
+//    return true;
+//#else
+//    Q_UNUSED(sp);
+//    check->errorDetails.push_back(QString::fromLatin1("Unsupported debug mode"));
+//    return false;
+//#endif
+//}
 
 void addCdbOptionPages(QList<Core::IOptionsPage *> *opts)
 {
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index b6c6ea574596e7b7a814039212267deb998e77e5..1ef98cb0427b9099f1904e934aa528d6ab51eb1f 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -815,9 +815,7 @@ public slots:
     void setConfigValue(const QString &name, const QVariant &value);
     QVariant configValue(const QString &name) const;
 
-    DebuggerRunControl *createDebugger(const DebuggerStartParameters &sp,
-        RunConfiguration *rc = 0);
-    void startDebugger(RunControl *runControl);
+    //void startDebugger(RunControl *runControl);
     void displayDebugger(DebuggerEngine *engine, bool updateEngine = true);
 
     void dumpLog();
@@ -1093,9 +1091,6 @@ public slots:
     DebuggerToolTipManager *toolTipManager() const { return m_toolTipManager; }
     QSharedPointer<GlobalDebuggerOptions> globalDebuggerOptions() const { return m_globalDebuggerOptions; }
 
-    // FIXME: Remove.
-    void maybeEnrichParameters(DebuggerStartParameters *sp);
-
     void updateQmlActions() {
         action(QmlUpdateOnSave)->setEnabled(boolSetting(ShowQmlObjectTree));
     }
@@ -1272,24 +1267,6 @@ static QString msgParameterMissing(const QString &a)
     return DebuggerPlugin::tr("Option '%1' is missing the parameter.").arg(a);
 }
 
-void DebuggerPluginPrivate::maybeEnrichParameters(DebuggerStartParameters *sp)
-{
-    if (!boolSetting(AutoEnrichParameters))
-        return;
-    const QString sysroot = sp->sysRoot;
-    if (sp->debugInfoLocation.isEmpty()) {
-        sp->debugInfoLocation = sysroot + QLatin1String("/usr/lib/debug");
-    }
-    if (sp->debugSourceLocation.isEmpty()) {
-        QString base = sysroot + QLatin1String("/usr/src/debug/");
-        sp->debugSourceLocation.append(base + QLatin1String("qt5base/src/corelib"));
-        sp->debugSourceLocation.append(base + QLatin1String("qt5base/src/gui"));
-        sp->debugSourceLocation.append(base + QLatin1String("qt5base/src/network"));
-        sp->debugSourceLocation.append(base + QLatin1String("qt5base/src/v8"));
-        sp->debugSourceLocation.append(base + QLatin1String("qt5declarative/src/qml"));
-    }
-}
-
 bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it,
     const QStringList::const_iterator &cend, QString *errorMessage)
 {
@@ -1477,10 +1454,8 @@ void DebuggerPluginPrivate::debugProjectBreakMain()
 void DebuggerPluginPrivate::startAndDebugApplication()
 {
     DebuggerStartParameters sp;
-    if (StartApplicationDialog::run(mainWindow(), m_coreSettings, &sp)) {
-        if (RunControl *rc = createDebugger(sp))
-            startDebugger(rc);
-    }
+    if (StartApplicationDialog::run(mainWindow(), m_coreSettings, &sp))
+        DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 void DebuggerPluginPrivate::attachCore()
@@ -1505,14 +1480,14 @@ void DebuggerPluginPrivate::attachCore()
     DebuggerStartParameters sp;
     QString display = dlg.isLocal() ? dlg.localCoreFile() : dlg.remoteCoreFile();
     fillParameters(&sp, dlg.profileId());
+    sp.masterEngineType = GdbEngineType;
     sp.executable = dlg.localExecutableFile();
     sp.coreFile = dlg.localCoreFile();
     sp.displayName = tr("Core file \"%1\"").arg(display);
     sp.startMode = AttachCore;
     sp.closeMode = DetachAtClose;
     sp.overrideStartScript = dlg.overrideStartScript();
-    if (DebuggerRunControl *rc = createDebugger(sp))
-        startDebugger(rc);
+    DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 struct RemoteCdbMatcher : ProfileMatcher
@@ -1557,8 +1532,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession()
         return;
     sp.remoteChannel = dlg.connection();
     setConfigValue(connectionKey, sp.remoteChannel);
-    if (RunControl *rc = createDebugger(sp))
-        startDebugger(rc);
+    DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 void DebuggerPluginPrivate::attachToRemoteServer()
@@ -1568,8 +1542,7 @@ void DebuggerPluginPrivate::attachToRemoteServer()
     if (StartApplicationDialog::run(mainWindow(), m_coreSettings, &sp)) {
         sp.closeMode = KillAtClose;
         sp.serverStartScript.clear();
-        if (RunControl *rc = createDebugger(sp))
-            startDebugger(rc);
+        DebuggerRunControlFactory::createAndScheduleRun(sp);
     }
 }
 
@@ -1629,8 +1602,7 @@ void DebuggerPluginPrivate::attachToProcess(bool startServerOnly)
         sp.executable = process.exe;
         sp.startMode = AttachExternal;
         sp.closeMode = DetachAtClose;
-        if (DebuggerRunControl *rc = createDebugger(sp))
-            startDebugger(rc);
+        DebuggerRunControlFactory::createAndScheduleRun(sp);
     } else {
         GdbServerStarter *starter = new GdbServerStarter(dlg, startServerOnly);
         starter->run();
@@ -1690,9 +1662,7 @@ void DebuggerPluginPrivate::attachToQmlPort()
         sourceFiles << project->files(Project::ExcludeGeneratedFiles);
 
     sp.projectSourceFiles = sourceFiles;
-
-    if (RunControl *rc = createDebugger(sp))
-        startDebugger(rc);
+    DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 void DebuggerPluginPrivate::startRemoteEngine()
@@ -1714,8 +1684,7 @@ void DebuggerPluginPrivate::startRemoteEngine()
     sp.executable = dlg.inferiorPath();
     sp.serverStartScript = dlg.enginePath();
     sp.startMode = StartRemoteEngine;
-    if (RunControl *rc = createDebugger(sp))
-        startDebugger(rc);
+    DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 void DebuggerPluginPrivate::enableReverseDebuggingTriggered(const QVariant &value)
@@ -1728,12 +1697,8 @@ void DebuggerPluginPrivate::enableReverseDebuggingTriggered(const QVariant &valu
 
 void DebuggerPluginPrivate::runScheduled()
 {
-    foreach (const DebuggerStartParameters &sp, m_scheduledStarts) {
-        RunControl *rc = createDebugger(sp);
-        QTC_ASSERT(rc, qDebug() << "CANNOT CREATE RUN CONTROL"; continue);
-        showStatusMessage(sp.startMessage);
-        startDebugger(rc);
-    }
+    foreach (const DebuggerStartParameters &sp, m_scheduledStarts)
+        DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 void DebuggerPluginPrivate::editorOpened(IEditor *editor)
@@ -1949,14 +1914,6 @@ void DebuggerPluginPrivate::requestMark(ITextEditor *editor,
     }
 }
 
-DebuggerRunControl *DebuggerPluginPrivate::createDebugger
-    (const DebuggerStartParameters &sp0, RunConfiguration *rc)
-{
-    DebuggerStartParameters sp = sp0;
-    maybeEnrichParameters(&sp);
-    return m_debuggerRunControlFactory->create(sp, rc);
-}
-
 // If updateEngine is set, the engine will update its threads/modules and so forth.
 void DebuggerPluginPrivate::displayDebugger(DebuggerEngine *engine, bool updateEngine)
 {
@@ -1968,12 +1925,11 @@ void DebuggerPluginPrivate::displayDebugger(DebuggerEngine *engine, bool updateE
     engine->updateViews();
 }
 
-void DebuggerPluginPrivate::startDebugger(RunControl *rc)
-{
-    QTC_ASSERT(rc, return);
-    ProjectExplorerPlugin::instance()->startRunControl(rc, DebugRunMode);
-}
-
+//void DebuggerPluginPrivate::startDebugger(RunControl *rc)
+//{
+//    QTC_ASSERT(rc, return);
+//    ProjectExplorerPlugin::instance()->startRunControl(rc, DebugRunMode);
+//}
 
 void DebuggerPluginPrivate::connectEngine(DebuggerEngine *engine)
 {
@@ -3362,15 +3318,15 @@ void DebuggerPlugin::remoteCommand(const QStringList &options,
     theDebuggerCore->remoteCommand(options, list);
 }
 
+//void DebuggerPlugin::startDebugger(RunControl *runControl)
+//{
+//    theDebuggerCore->startDebugger(runControl);
+//}
+
 DebuggerRunControl *DebuggerPlugin::createDebugger
     (const DebuggerStartParameters &sp, RunConfiguration *rc)
 {
-    return theDebuggerCore->createDebugger(sp, rc);
-}
-
-void DebuggerPlugin::startDebugger(RunControl *runControl)
-{
-    theDebuggerCore->startDebugger(runControl);
+    return DebuggerRunControlFactory::doCreate(sp, rc);
 }
 
 void DebuggerPlugin::extensionsInitialized()
@@ -3460,10 +3416,8 @@ static LocalApplicationRunConfiguration *activeLocalRunConfiguration()
 void DebuggerPluginPrivate::testRunProject(const DebuggerStartParameters &sp, const TestCallBack &cb)
 {
     m_testCallbacks.append(cb);
-    RunControl *rctl = createDebugger(sp);
-    QVERIFY(rctl);
-    connect(rctl, SIGNAL(finished()), this, SLOT(testRunControlFinished()));
-    ProjectExplorerPlugin::instance()->startRunControl(rctl, DebugRunMode);
+    RunControl *rc = DebuggerRunControlFactory::createAndScheduleRun(sp);
+    connect(rc, SIGNAL(finished()), this, SLOT(testRunControlFinished()));
 }
 
 void DebuggerPluginPrivate::testRunControlFinished()
diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h
index 93e6e80498a32d70b0f02ec2a7dc048a999b424b..6ef932add41fe45e569d2ff586ee50fcb4029f44 100644
--- a/src/plugins/debugger/debuggerplugin.h
+++ b/src/plugins/debugger/debuggerplugin.h
@@ -58,15 +58,16 @@ public:
     ~DebuggerPlugin();
 
     // Used by Maemo debugging support.
-    static DebuggerRunControl *createDebugger(const DebuggerStartParameters &sp,
-        ProjectExplorer::RunConfiguration *rc = 0);
-    static void startDebugger(ProjectExplorer::RunControl *runControl);
+    //static void startDebugger(ProjectExplorer::RunControl *runControl);
 
     // Used by QmlJSInspector.
     static bool isActiveDebugLanguage(int language);
     static DebuggerMainWindow *mainWindow();
     static QAction *visibleDebugAction();
 
+    static DebuggerRunControl *createDebugger(const DebuggerStartParameters &sp,
+                                              ProjectExplorer::RunConfiguration *rc);
+
 private:
     // IPlugin implementation.
     bool initialize(const QStringList &arguments, QString *errorMessage);
diff --git a/src/plugins/debugger/debuggerruncontrolfactory.h b/src/plugins/debugger/debuggerruncontrolfactory.h
index b429687bc8e2ca179429d6626b59f6aaf0b79268..b53bd94df48ef70623241713ec9d60b6d7738969 100644
--- a/src/plugins/debugger/debuggerruncontrolfactory.h
+++ b/src/plugins/debugger/debuggerruncontrolfactory.h
@@ -34,7 +34,11 @@
 #include <projectexplorer/runconfiguration.h>
 
 namespace Debugger {
+
 class DebuggerEngine;
+class DebuggerRunControl;
+class DebuggerStartParameters;
+
 namespace Internal {
 
 class DebuggerRunControlFactory
@@ -43,27 +47,30 @@ class DebuggerRunControlFactory
 public:
     explicit DebuggerRunControlFactory(QObject *parent);
 
-    // This is used by the "Non-Standard" scenarios, e.g. Attach to Core.
-    // FIXME: What to do in case of a 0 runConfiguration?
-    typedef ProjectExplorer::RunConfiguration RunConfiguration;
-    typedef ProjectExplorer::RunControl RunControl;
-    typedef ProjectExplorer::RunMode RunMode;
-    DebuggerRunControl *create(const DebuggerStartParameters &sp,
-        RunConfiguration *runConfiguration = 0);
-
-    // ProjectExplorer::IRunControlFactory
     // FIXME: Used by qmljsinspector.cpp:469
-    RunControl *create(RunConfiguration *runConfiguration, RunMode mode);
-    bool canRun(RunConfiguration *runConfiguration, RunMode mode) const;
+    ProjectExplorer::RunControl *create(
+        ProjectExplorer::RunConfiguration *runConfiguration,
+        ProjectExplorer::RunMode mode);
+
+    bool canRun(ProjectExplorer::RunConfiguration *runConfiguration,
+        ProjectExplorer::RunMode mode) const;
 
     static DebuggerEngine *createEngine(DebuggerEngineType et,
-                                        const DebuggerStartParameters &sp,
-                                        DebuggerEngine *masterEngine,
-                                        QString *errorMessage);
+        const DebuggerStartParameters &sp,
+        DebuggerEngine *masterEngine,
+        QString *errorMessage);
+
+    static DebuggerRunControl *createAndScheduleRun(
+        const DebuggerStartParameters &sp,
+        ProjectExplorer::RunConfiguration *runConfiguration = 0);
+
+    static DebuggerRunControl *doCreate(const DebuggerStartParameters &sp,
+        ProjectExplorer::RunConfiguration *rc);
 
 private:
     QString displayName() const;
-    ProjectExplorer::RunConfigWidget *createConfigurationWidget(RunConfiguration *runConfiguration);
+    ProjectExplorer::RunConfigWidget *createConfigurationWidget(
+        ProjectExplorer::RunConfiguration *runConfiguration);
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 59d745fe8ff096de2cabb365b6c91b99cccee0de..317d1ce0e8bd07c4c3747e08e6e6d8ac63093bca 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -50,12 +50,12 @@
 #endif
 
 #include <projectexplorer/abi.h>
+#include <projectexplorer/applicationrunconfiguration.h> // For LocalApplication*
+#include <projectexplorer/buildconfiguration.h>
 #include <projectexplorer/project.h>
-#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/target.h>
-#include <projectexplorer/buildconfiguration.h>
 #include <projectexplorer/toolchain.h>
-#include <projectexplorer/applicationrunconfiguration.h> // For LocalApplication*
 
 #include <utils/outputformat.h>
 #include <utils/synchronousprocess.h>
@@ -84,11 +84,11 @@ namespace Debugger {
 namespace Internal {
 
 bool isCdbEngineEnabled(); // Check the configuration page
-bool checkCdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check);
+//bool checkCdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check);
 DebuggerEngine *createCdbEngine(const DebuggerStartParameters &sp,
     DebuggerEngine *masterEngine, QString *error);
 
-bool checkGdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check);
+//bool checkGdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check);
 DebuggerEngine *createGdbEngine(const DebuggerStartParameters &sp,
     DebuggerEngine *masterEngine);
 
@@ -97,8 +97,7 @@ DebuggerEngine *createPdbEngine(const DebuggerStartParameters &sp);
 QmlEngine *createQmlEngine(const DebuggerStartParameters &sp,
     DebuggerEngine *masterEngine);
 DebuggerEngine *createQmlCppEngine(const DebuggerStartParameters &sp,
-                                   DebuggerEngineType slaveEngineType,
-                                   QString *errorMessage);
+    QString *errorMessage);
 DebuggerEngine *createLldbEngine(const DebuggerStartParameters &sp);
 
 extern QString msgNoBinaryForToolChain(const Abi &abi);
@@ -319,8 +318,7 @@ DebuggerRunControlPrivate::DebuggerRunControlPrivate(DebuggerRunControl *parent,
 } // namespace Internal
 
 DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfiguration,
-                                       const DebuggerStartParameters &sp,
-                                       const QPair<DebuggerEngineType, DebuggerEngineType> &masterSlaveEngineTypes)
+                                       const DebuggerStartParameters &sp)
     : RunControl(runConfiguration, DebugRunMode),
       d(new DebuggerRunControlPrivate(this, runConfiguration))
 {
@@ -328,10 +326,8 @@ DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfiguration,
     // Create the engine. Could arguably be moved to the factory, but
     // we still have a derived S60DebugControl. Should rarely fail, though.
     QString errorMessage;
-    d->m_engine = masterSlaveEngineTypes.first == QmlCppEngineType ?
-            createQmlCppEngine(sp, masterSlaveEngineTypes.second, &errorMessage) :
-            DebuggerRunControlFactory::createEngine(masterSlaveEngineTypes.first, sp,
-                                                    0, &errorMessage);
+    d->m_engine = DebuggerRunControlFactory::createEngine(sp.masterEngineType, sp, 0, &errorMessage);
+
     if (d->m_engine) {
         DebuggerToolTipManager::instance()->registerEngine(d->m_engine);
     } else {
@@ -493,311 +489,6 @@ RunConfiguration *DebuggerRunControl::runConfiguration() const
     return d->m_myRunConfiguration.data();
 }
 
-////////////////////////////////////////////////////////////////////////
-//
-// Engine detection logic: Detection functions depending on tool chain, binary,
-// etc. Return a list of possible engines (order of prefererence) without
-// consideration of configuration, etc.
-//
-////////////////////////////////////////////////////////////////////////
-
-static QList<DebuggerEngineType> enginesForToolChain(const Abi &toolChain,
-                                                     DebuggerLanguages languages)
-{
-    QList<DebuggerEngineType> result;
-    switch (toolChain.binaryFormat()) {
-    case Abi::ElfFormat:
-    case Abi::MachOFormat:
-        result.push_back(LldbEngineType);
-        result.push_back(GdbEngineType);
-        if (languages & QmlLanguage)
-            result.push_back(QmlEngineType);
-        break;
-   case Abi::PEFormat:
-        if (toolChain.osFlavor() == Abi::WindowsMSysFlavor) {
-            result.push_back(GdbEngineType);
-            result.push_back(CdbEngineType);
-        } else {
-            result.push_back(CdbEngineType);
-            //result.push_back(GdbEngineType);
-        }
-        if (languages & QmlLanguage)
-            result.push_back(QmlEngineType);
-        break;
-    case Abi::RuntimeQmlFormat:
-        result.push_back(QmlEngineType);
-        break;
-    default:
-        break;
-    }
-    return result;
-}
-
-static inline QList<DebuggerEngineType> enginesForScriptExecutables(const QString &executable)
-{
-    QList<DebuggerEngineType> result;
-    if (executable.endsWith(_(".js"))) {
-        result.push_back(ScriptEngineType);
-    } else if (executable.endsWith(_(".py"))) {
-        result.push_back(PdbEngineType);
-    }
-    return result;
-}
-
-static QList<DebuggerEngineType> enginesForExecutable(const QString &executable)
-{
-    QList<DebuggerEngineType> result = enginesForScriptExecutables(executable);
-    if (!result.isEmpty())
-        return result;
-#ifdef Q_OS_WIN
-    // A remote executable?
-    if (!executable.endsWith(_(".exe"), Qt::CaseInsensitive)) {
-        result.push_back(GdbEngineType);
-        return result;
-    }
-
-    // If a file has PDB files, it has been compiled by VS.
-    QStringList pdbFiles;
-    QString errorMessage;
-    if (getPDBFiles(executable, &pdbFiles, &errorMessage) && !pdbFiles.isEmpty()) {
-        result.push_back(CdbEngineType);
-        result.push_back(GdbEngineType);
-        return result;
-    }
-    // Fixme: Gdb should only be preferred if MinGW can positively be detected.
-    result.push_back(GdbEngineType);
-    result.push_back(CdbEngineType);
-#else
-    result.push_back(LldbEngineType);
-    result.push_back(GdbEngineType);
-#endif
-    return result;
-}
-
-// Debugger type for mode.
-static QList<DebuggerEngineType> enginesForMode(DebuggerStartMode startMode,
-                                                DebuggerLanguages languages,
-                                                bool hardConstraintsOnly)
-{
-    QList<DebuggerEngineType> result;
-
-    if (languages == QmlLanguage) {
-        QTC_ASSERT(startMode == StartInternal
-                   || startMode == AttachToRemoteServer
-                   || startMode == AttachToRemoteProcess,
-                   qDebug() << "qml debugging not supported for mode"
-                            << startMode);
-
-        // Qml language only
-        result.push_back(QmlEngineType);
-        return result;
-    }
-
-    switch (startMode) {
-    case NoStartMode:
-        break;
-    case StartInternal:
-    case StartExternal:
-    case AttachExternal:
-        if (!hardConstraintsOnly) {
-#ifdef Q_OS_WIN
-            result.push_back(CdbEngineType); // Preferably Windows debugger for attaching locally.
-#endif
-            result.push_back(GdbEngineType);
-
-            if (languages & QmlLanguage)
-                result.push_back(QmlEngineType);
-        }
-        break;
-    case LoadRemoteCore:
-        result.push_back(GdbEngineType);
-        break;
-    case AttachCore:
-#ifdef Q_OS_WIN
-        result.push_back(CdbEngineType);
-#endif
-        result.push_back(GdbEngineType);
-        break;
-    case StartRemoteProcess:
-    case StartRemoteGdb:
-        result.push_back(GdbEngineType);
-        if (languages & QmlLanguage)
-            result.push_back(QmlEngineType);
-        break;
-    case AttachToRemoteProcess:
-    case AttachToRemoteServer:
-        if (!hardConstraintsOnly) {
-#ifdef Q_OS_WIN
-            result.push_back(CdbEngineType);
-#endif
-            result.push_back(GdbEngineType);
-
-            if (languages & QmlLanguage)
-                result.push_back(QmlEngineType);
-        }
-        break;
-    case AttachCrashedExternal:
-        result.push_back(CdbEngineType); // Only CDB can do this
-        break;
-    case StartRemoteEngine:
-        // FIXME: Unclear IPC override. Someone please have a better idea.
-        // For now thats the only supported IPC engine.
-        result.push_back(LldbEngineType);
-        break;
-    }
-    return result;
-}
-
-// Engine detection logic: Call all detection functions in order.
-
-static QList<DebuggerEngineType> engineTypes(const DebuggerStartParameters &sp)
-{
-    // Script executables and certain start modes are 'hard constraints'.
-    QList<DebuggerEngineType> result = enginesForScriptExecutables(sp.executable);
-    if (!result.isEmpty())
-        return result;
-
-    result = enginesForMode(sp.startMode, sp.languages, true);
-    if (!result.isEmpty())
-        return result;
-
-    //  'hard constraints' done (with the exception of QML ABI checked here),
-    // further try to restrict available engines.
-    if (sp.toolChainAbi.isValid()) {
-        result = enginesForToolChain(sp.toolChainAbi, sp.languages);
-        if (!result.isEmpty())
-            return result;
-    }
-
-    if (sp.startMode != AttachToRemoteServer
-            && sp.startMode != AttachToRemoteProcess
-            && sp.startMode != LoadRemoteCore
-            && !sp.executable.isEmpty())
-        result = enginesForExecutable(sp.executable);
-    if (!result.isEmpty())
-        return result;
-
-    result = enginesForMode(sp.startMode, sp.languages, false);
-    return result;
-}
-
-// Engine detection logic: ConfigurationCheck.
-ConfigurationCheck::ConfigurationCheck() :
-    masterSlaveEngineTypes(NoEngineType, NoEngineType)
-{
-}
-
-ConfigurationCheck::operator bool() const
-{
-    return errorMessage.isEmpty()
-        && errorDetails.isEmpty()
-        && masterSlaveEngineTypes.first != NoEngineType;
-}
-
-QString ConfigurationCheck::errorDetailsString() const
-{
-    return errorDetails.join(QLatin1String("\n\n"));
-}
-
-// Convenience helper to check whether an engine is enabled and configured
-// correctly.
-static bool canUseEngine(DebuggerEngineType et,
-                                const DebuggerStartParameters &sp,
-                                ConfigurationCheck *result)
-{
-    switch (et) {
-    case CdbEngineType:
-        return checkCdbConfiguration(sp, result);
-    case GdbEngineType:
-        return checkGdbConfiguration(sp, result);
-    default:
-        break;
-    }
-    return true;
-}
-
-/*!
-    \fn Debugger::ConfigurationCheck Debugger::checkDebugConfiguration(const DebuggerStartParameters &sp)
-
-    This is the master engine detection function that returns the
-    engine types for a given set of start parameters and checks their
-    configuration.
-*/
-
-DEBUGGER_EXPORT ConfigurationCheck checkDebugConfiguration(const DebuggerStartParameters &sp)
-{
-    ConfigurationCheck result;
-    QString abi = sp.toolChainAbi.toString();
-    if (debug)
-        qDebug().nospace() << "checkDebugConfiguration " << abi
-                           << " Start mode=" << sp.startMode << " Executable=" << sp.executable
-                           << " Debugger command=" << sp.debuggerCommand;
-    // Get all applicable types.
-    QList<DebuggerEngineType> requiredTypes = engineTypes(sp);
-    if (requiredTypes.isEmpty()) {
-        result.errorMessage = QLatin1String("Internal error: Unable to determine "
-            "debugger engine type for this configuration");
-        return result;
-    }
-    if (debug)
-        qDebug() << " Required: " << engineTypeNames(requiredTypes);
-
-    DebuggerEngineType usableType = NoEngineType;
-    QList<DebuggerEngineType> unavailableTypes;
-    foreach (DebuggerEngineType et, requiredTypes) {
-        if (canUseEngine(et, sp, &result)) {
-            result.errorDetails.clear();
-            usableType = et;
-            break;
-        } else {
-            unavailableTypes.push_back(et);
-        }
-    }
-    if (usableType == NoEngineType) {
-        if (requiredTypes.size() == 1) {
-            result.errorMessage = DebuggerPlugin::tr(
-                "The debugger engine '%1' required for debugging binaries of the type '%2'"
-                " is not configured correctly.").
-                arg(QLatin1String(engineTypeName(requiredTypes.front())), abi);
-        } else {
-            result.errorMessage = DebuggerPlugin::tr(
-                "None of the debugger engines '%1' capable of debugging binaries of the type '%2'"
-                " is configured correctly.").
-                arg(engineTypeNames(requiredTypes), abi);
-        }
-        return result;
-    }
-    if (debug)
-        qDebug() << "Configured engine: " << engineTypeName(usableType);
-    // Inform verbosely about MinGW-gdb/CDB fallbacks. Do not complain about LLDB, for now.
-    if (!result.errorDetails.isEmpty() && unavailableTypes.count(LldbEngineType) != unavailableTypes.size()) {
-        const QString msg = DebuggerPlugin::tr(
-            "The preferred debugger engine for debugging binaries of type '%1' is not available.\n"
-            "The debugger engine '%2' will be used as a fallback.\nDetails: %3").
-                arg(abi, QLatin1String(engineTypeName(usableType)),
-                    result.errorDetails.join(QString(QLatin1Char('\n'))));
-        debuggerCore()->showMessage(msg, LogWarning);
-        showMessageBox(QMessageBox::Warning, DebuggerPlugin::tr("Warning"), msg);
-    }
-    // Anything left: Happy.
-    result.errorMessage.clear();
-    result.errorDetails.clear();
-
-
-    // Could we actually use a combined qml/cpp-engine?
-     if (usableType != QmlEngineType
-             && requiredTypes.contains(QmlEngineType)) {
-         result.masterSlaveEngineTypes.first = QmlCppEngineType;
-         result.masterSlaveEngineTypes.second = usableType;
-     } else {
-         result.masterSlaveEngineTypes.first = usableType;
-     }
-
-    if (debug)
-        qDebug() << engineTypeName(result.masterSlaveEngineTypes.first)
-                 << engineTypeName(result.masterSlaveEngineTypes.second);
-    return result;
-}
 
 ////////////////////////////////////////////////////////////////////////
 //
@@ -926,28 +617,144 @@ RunControl *DebuggerRunControlFactory::create
         return 0;
     if (mode == DebugRunModeWithBreakOnMain)
         sp.breakOnMain = true;
-    return create(sp, runConfiguration);
+
+    return doCreate(sp, runConfiguration);
 }
 
-RunConfigWidget *DebuggerRunControlFactory::createConfigurationWidget
-    (RunConfiguration *runConfiguration)
+static DebuggerEngineType guessUnixCppEngineType(const DebuggerStartParameters &sp)
 {
-    return new DebuggerRunConfigWidget(runConfiguration);
+    if (sp.debuggerCommand.contains(QLatin1String("lldb")))
+        return LldbEngineType;
+    return GdbEngineType;
 }
 
-DebuggerRunControl *DebuggerRunControlFactory::create
-    (const DebuggerStartParameters &sp, RunConfiguration *runConfiguration)
+static DebuggerEngineType guessCppEngineTypeForAbi(const DebuggerStartParameters &sp, const Abi &abi)
 {
-    const ConfigurationCheck check = checkDebugConfiguration(sp);
+    switch (abi.binaryFormat()) {
+        case Abi::ElfFormat:
+        case Abi::MachOFormat:
+            return guessUnixCppEngineType(sp) ;
+        case Abi::PEFormat:
+           if (abi.osFlavor() == Abi::WindowsMSysFlavor)
+               return guessUnixCppEngineType(sp);
+           return CdbEngineType;
+       default:
+           break;
+    }
+    return NoEngineType;
+}
 
-    if (!check) {
-        //appendMessage(errorMessage, true);
-        Core::ICore::showWarningWithOptions(DebuggerPlugin::tr("Debugger"),
-            check.errorMessage, check.errorDetailsString(), check.settingsCategory, check.settingsPage);
-        return 0;
+static DebuggerEngineType guessCppEngineType(const DebuggerStartParameters &sp, RunConfiguration *rc)
+{
+    if (rc) {
+        if (Target *target = rc->target()) {
+            Profile *profile = target->profile();
+            if (ToolChain *tc = ToolChainProfileInformation::toolChain(profile)) {
+                DebuggerEngineType et = guessCppEngineTypeForAbi(sp, tc->targetAbi());
+                if (et != NoEngineType)
+                    return et;
+            }
+        }
+    }
+
+    #ifdef Q_OS_WIN
+    // If a file has PDB files, it has been compiled by VS.
+    if (sp.executable.endsWith(_(".exe"), Qt::CaseInsensitive)) {
+        QStringList pdbFiles;
+        QString errorMessage;
+        if (getPDBFiles(sp.executable, &pdbFiles, &errorMessage) && !pdbFiles.isEmpty())
+            return CdbEngineType;
+    }
+    #endif
+
+    QList<Abi> abis = Abi::abisOfBinary(FileName::fromString(sp.executable));
+    foreach (const Abi &abi, abis) {
+        DebuggerEngineType et = guessCppEngineTypeForAbi(sp, abi);
+        if (et != NoEngineType)
+            return et;
+    }
+
+    return guessUnixCppEngineType(sp);
+}
+
+static void fixupEngineTypes(DebuggerStartParameters &sp, RunConfiguration *rc)
+{
+    if (sp.masterEngineType != NoEngineType)
+        return;
+
+    if (sp.executable.endsWith(_(".js"))) {
+        sp.masterEngineType = ScriptEngineType;
+        return;
+    }
+
+    if (sp.executable.endsWith(_(".py"))) {
+        sp.masterEngineType = PdbEngineType;
+        return;
+    }
+
+    if (rc) {
+        DebuggerRunConfigurationAspect *aspect = rc->debuggerAspect();
+        bool useCppDebugger = aspect->useCppDebugger();
+        bool useQmlDebugger = aspect->useQmlDebugger();
+        if (useQmlDebugger) {
+            if (useCppDebugger) {
+                sp.masterEngineType = QmlCppEngineType;
+                sp.firstSlaveEngineType = guessCppEngineType(sp, rc);
+                sp.secondSlaveEngineType = QmlCppEngineType;
+            } else {
+                sp.masterEngineType = QmlEngineType;
+            }
+        } else {
+            sp.masterEngineType = guessCppEngineType(sp, rc);
+        }
+        return;
+    }
+
+    sp.masterEngineType = guessCppEngineType(sp, rc);
+}
+
+DebuggerRunControl *DebuggerRunControlFactory::doCreate
+    (const DebuggerStartParameters &sp0, RunConfiguration *rc)
+{
+    DebuggerStartParameters sp = sp0;
+    if (!debuggerCore()->boolSetting(AutoEnrichParameters)) {
+        const QString sysroot = sp.sysRoot;
+        if (sp.debugInfoLocation.isEmpty()) {
+            sp.debugInfoLocation = sysroot + QLatin1String("/usr/lib/debug");
+        }
+        if (sp.debugSourceLocation.isEmpty()) {
+            QString base = sysroot + QLatin1String("/usr/src/debug/");
+            sp.debugSourceLocation.append(base + QLatin1String("qt5base/src/corelib"));
+            sp.debugSourceLocation.append(base + QLatin1String("qt5base/src/gui"));
+            sp.debugSourceLocation.append(base + QLatin1String("qt5base/src/network"));
+            sp.debugSourceLocation.append(base + QLatin1String("qt5base/src/v8"));
+            sp.debugSourceLocation.append(base + QLatin1String("qt5declarative/src/qml"));
+        }
     }
 
-    return new DebuggerRunControl(runConfiguration, sp, check.masterSlaveEngineTypes);
+    fixupEngineTypes(sp, rc);
+    if (!sp.masterEngineType)
+        return 0;
+
+    return new DebuggerRunControl(rc, sp);
+}
+
+DebuggerRunControl *DebuggerRunControlFactory::createAndScheduleRun
+    (const DebuggerStartParameters &sp, RunConfiguration *runConfiguration)
+{
+    DebuggerRunControl *rc = doCreate(sp, runConfiguration);
+    if (!rc)
+        return 0;
+    debuggerCore()->showMessage(sp.startMessage, 0);
+    ProjectExplorerPlugin::instance()->startRunControl(rc, DebugRunMode);
+    return rc;
+}
+
+
+RunConfigWidget *DebuggerRunControlFactory::createConfigurationWidget
+    (RunConfiguration *runConfiguration)
+{
+    return new DebuggerRunConfigWidget(runConfiguration);
 }
 
 DebuggerEngine *DebuggerRunControlFactory::createEngine
@@ -969,6 +776,8 @@ DebuggerEngine *DebuggerRunControlFactory::createEngine
         return createQmlEngine(sp, masterEngine);
     case LldbEngineType:
         return createLldbEngine(sp);
+    case QmlCppEngineType:
+        return createQmlCppEngine(sp, errorMessage);
     default:
         break;
     }
diff --git a/src/plugins/debugger/debuggerrunner.h b/src/plugins/debugger/debuggerrunner.h
index 08c385c26bde7d7cb990ea40876902e3edf90ef7..d8b9d4e4d90f0fc7b9658510e6cce78b865d7001 100644
--- a/src/plugins/debugger/debuggerrunner.h
+++ b/src/plugins/debugger/debuggerrunner.h
@@ -55,35 +55,14 @@ class DebuggerRunControlFactory;
 } // namespace Internal
 
 
-class DEBUGGER_EXPORT ConfigurationCheck
-{
-public:
-    ConfigurationCheck();
-    operator bool() const;
-    QString errorDetailsString() const;
-
-    QString errorMessage;
-    QStringList errorDetails;
-    QString settingsCategory;
-    QString settingsPage;
-    QPair<DebuggerEngineType, DebuggerEngineType> masterSlaveEngineTypes;
-};
-
-DEBUGGER_EXPORT ConfigurationCheck checkDebugConfiguration(const DebuggerStartParameters &sp);
-
-// This is a job description containing all data "local" to the jobs, including
-// the models of the individual debugger views.
 class DEBUGGER_EXPORT DebuggerRunControl
     : public ProjectExplorer::RunControl
 {
     Q_OBJECT
 
 public:
-    typedef ProjectExplorer::RunConfiguration RunConfiguration;
-    explicit DebuggerRunControl(RunConfiguration *runConfiguration,
-                                const DebuggerStartParameters &sp,
-                                const QPair<DebuggerEngineType, DebuggerEngineType> &masterSlaveEngineTypes);
-
+    DebuggerRunControl(ProjectExplorer::RunConfiguration *runConfiguration,
+                       const DebuggerStartParameters &sp);
     ~DebuggerRunControl();
 
     // ProjectExplorer::RunControl
@@ -97,7 +76,7 @@ public:
     void setCustomEnvironment(Utils::Environment env);
     void startFailed();
     void debuggingFinished();
-    RunConfiguration *runConfiguration() const;
+    ProjectExplorer::RunConfiguration *runConfiguration() const;
     DebuggerEngine *engine(); // FIXME: Remove. Only used by Maemo support.
 
     void showMessage(const QString &msg, int channel);
@@ -112,7 +91,7 @@ protected:
     const DebuggerStartParameters &startParameters() const;
 
 private:
-    friend class Internal::DebuggerRunControlFactory;
+    //friend class Internal::DebuggerRunControlFactory;
     Internal::DebuggerRunControlPrivate *d;
 };
 
diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h
index 7a2165f162bfa5e2af56379e899750f2d8c0bbda..dbda1c62f995d06f1406395af0285d0363992918 100644
--- a/src/plugins/debugger/debuggerstartparameters.h
+++ b/src/plugins/debugger/debuggerstartparameters.h
@@ -56,7 +56,9 @@ public:
     };
 
     DebuggerStartParameters()
-      : engineType(NoEngineType),
+      : masterEngineType(NoEngineType),
+        firstSlaveEngineType(NoEngineType),
+        secondSlaveEngineType(NoEngineType),
         isSnapshot(false),
         attachPID(-1),
         useTerminal(false),
@@ -78,7 +80,9 @@ public:
 
     //Core::Id profileId;
 
-    DebuggerEngineType engineType;
+    DebuggerEngineType masterEngineType;
+    DebuggerEngineType firstSlaveEngineType;
+    DebuggerEngineType secondSlaveEngineType;
     QString sysRoot;
     QString debuggerCommand;
     ProjectExplorer::Abi toolChainAbi;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 30da068c8c31676e6a513d4367ada2bcd4459f68..af672d8252f0132e1d42beb06b64ec42c6835e6a 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -34,6 +34,7 @@
 
 #include "debuggerstartparameters.h"
 #include "debuggerinternalconstants.h"
+#include "debuggerruncontrolfactory.h"
 #include "disassemblerlines.h"
 #include "attachgdbadapter.h"
 #include "coregdbadapter.h"
@@ -3724,8 +3725,7 @@ void GdbEngine::handleMakeSnapshot(const GdbResponse &response)
         }
         sp.displayName = function + _(": ") + QDateTime::currentDateTime().toString();
         sp.isSnapshot = true;
-        DebuggerRunControl *rc = DebuggerPlugin::createDebugger(sp);
-        DebuggerPlugin::startDebugger(rc);
+        DebuggerRunControlFactory::createAndScheduleRun(sp);
     } else {
         QByteArray msg = response.data.findChild("msg").data();
         showMessageBox(QMessageBox::Critical, tr("Snapshot Creation Error"),
@@ -4635,26 +4635,26 @@ static QString gdbBinary(const DebuggerStartParameters &sp)
     return sp.debuggerCommand;
 }
 
-bool checkGdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check)
-{
-    const QString binary = gdbBinary(sp);
-    const Abi abi = sp.toolChainAbi;
-    if (binary.isEmpty()) {
-        check->errorDetails.push_back(msgNoGdbBinaryForToolChain(abi));
-        check->settingsCategory = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-        check->settingsPage = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-        return false;
-    }
-    if (abi.os() == Abi::WindowsOS &&  !QFileInfo(binary).isAbsolute()) {
-    // See initialization below, we need an absolute path to be able to locate Python on Windows.
-        check->errorDetails.push_back(GdbEngine::tr("The gdb location must be given as an "
-                "absolute path in the debugger settings (%1).").arg(binary));
-        check->settingsCategory = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-        check->settingsPage = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-        return false;
-    }
-    return true;
-}
+//bool checkGdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck *check)
+//{
+//    const QString binary = gdbBinary(sp);
+//    const Abi abi = sp.toolChainAbi;
+//    if (binary.isEmpty()) {
+//        check->errorDetails.push_back(msgNoGdbBinaryForToolChain(abi));
+//        check->settingsCategory = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+//        check->settingsPage = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+//        return false;
+//    }
+//    if (abi.os() == Abi::WindowsOS &&  !QFileInfo(binary).isAbsolute()) {
+//    // See initialization below, we need an absolute path to be able to locate Python on Windows.
+//        check->errorDetails.push_back(GdbEngine::tr("The gdb location must be given as an "
+//                "absolute path in the debugger settings (%1).").arg(binary));
+//        check->settingsCategory = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+//        check->settingsPage = _(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+//        return false;
+//    }
+//    return true;
+//}
 
 //
 // Starting up & shutting down
diff --git a/src/plugins/debugger/gdb/startgdbserverdialog.cpp b/src/plugins/debugger/gdb/startgdbserverdialog.cpp
index 355b53e72e398d3451037dd31fda14d728c4e3be..2ee4370ef5dd1e0fa1c6a69f1bfd9e8a72f3da29 100644
--- a/src/plugins/debugger/gdb/startgdbserverdialog.cpp
+++ b/src/plugins/debugger/gdb/startgdbserverdialog.cpp
@@ -35,6 +35,7 @@
 #include "debuggerplugin.h"
 #include "debuggerprofileinformation.h"
 #include "debuggerrunner.h"
+#include "debuggerruncontrolfactory.h"
 #include "debuggerstartparameters.h"
 
 #include <coreplugin/icore.h>
@@ -205,22 +206,15 @@ void GdbServerStarter::attach(int port)
         return;
     }
 
-    QString channel = QString("%1:%2").arg(d->device->sshParameters().host).arg(port);
-
     DebuggerStartParameters sp;
-    sp.displayName = tr("Remote: \"%1\"").arg(channel);
-    sp.remoteChannel = channel;
+    fillParameters(&sp, d->profile->id());
+    sp.masterEngineType = GdbEngineType;
+    sp.connParams.port = port;
+    sp.displayName = tr("Remote: \"%1:%2\"").arg(sp.connParams.host).arg(port);
     sp.executable = localExecutable;
     sp.startMode = AttachToRemoteServer;
     sp.closeMode = KillAtClose;
-    sp.sysRoot = SysRootProfileInformation::sysRoot(d->profile).toString();
-    sp.debuggerCommand = DebuggerProfileInformation::debuggerCommand(d->profile).toString();
-    sp.connParams = d->device->sshParameters();
-    if (ToolChain *tc = ToolChainProfileInformation::toolChain(d->profile))
-        sp.toolChainAbi = tc->targetAbi();
-
-    if (RunControl *rc = DebuggerPlugin::createDebugger(sp))
-        DebuggerPlugin::startDebugger(rc);
+    DebuggerRunControlFactory::createAndScheduleRun(sp);
 }
 
 void GdbServerStarter::handleProcessClosed(int status)
diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp
index b3577998e424cf4f053f80a75a12b3a11f9b2848..5bbe39719c037dfd5883e2584f5024c45f1d8f93 100644
--- a/src/plugins/debugger/qml/qmlcppengine.cpp
+++ b/src/plugins/debugger/qml/qmlcppengine.cpp
@@ -58,10 +58,9 @@ QmlEngine *createQmlEngine(const DebuggerStartParameters &,
     DebuggerEngine *masterEngine);
 
 DebuggerEngine *createQmlCppEngine(const DebuggerStartParameters &sp,
-                                   DebuggerEngineType slaveEngineType,
                                    QString *errorMessage)
 {
-    QmlCppEngine *newEngine = new QmlCppEngine(sp, slaveEngineType, errorMessage);
+    QmlCppEngine *newEngine = new QmlCppEngine(sp, errorMessage);
     if (newEngine->cppEngine())
         return newEngine;
     delete newEngine;
@@ -107,13 +106,11 @@ QmlCppEnginePrivate::QmlCppEnginePrivate(QmlCppEngine *parent,
 //
 ////////////////////////////////////////////////////////////////////////
 
-QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp,
-                           DebuggerEngineType slaveEngineType,
-                           QString *errorMessage)
+QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp, QString *errorMessage)
     : DebuggerEngine(sp), d(new QmlCppEnginePrivate(this, sp))
 {
     setObjectName(QLatin1String("QmlCppEngine"));
-    d->m_cppEngine = DebuggerRunControlFactory::createEngine(slaveEngineType, sp, this, errorMessage);
+    d->m_cppEngine = DebuggerRunControlFactory::createEngine(sp.firstSlaveEngineType, sp, this, errorMessage);
     if (!d->m_cppEngine) {
         *errorMessage = tr("The slave debugging engine required for combined QML/C++-Debugging could not be created: %1").arg(*errorMessage);
         return;
diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h
index 7e70e4326b77c2cb956705abbc8f2dedc3078dbb..7891cdc80892434bd605dc612914d52e51217a71 100644
--- a/src/plugins/debugger/qml/qmlcppengine.h
+++ b/src/plugins/debugger/qml/qmlcppengine.h
@@ -43,9 +43,7 @@ class QmlCppEngine : public DebuggerEngine
     Q_OBJECT
 
 public:
-    explicit QmlCppEngine(const DebuggerStartParameters &sp,
-                          DebuggerEngineType slaveEngineType,
-                          QString *errorMessage);
+    QmlCppEngine(const DebuggerStartParameters &sp, QString *errorMessage);
     ~QmlCppEngine();
 
     bool canDisplayTooltip() const;
diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp
index d14c743ba35c5f95251330428510f601d94b6040..68dfb46f039c1149443074500d86d480a5330a17 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp
@@ -42,6 +42,7 @@
 #include <debugger/debuggerplugin.h>
 #include <debugger/debuggerconstants.h>
 #include <debugger/debuggerstartparameters.h>
+#include <debugger/debuggerruncontrolfactory.h>
 #include <qtsupport/baseqtversion.h>
 #include <qtsupport/qmlobservertool.h>
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp
index 42b424c52f2006a5fe422ccb529133a4d4832942..ebffb5b73ab221f07624f87b06599fe0b9ac9802 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.cpp
@@ -139,9 +139,8 @@ static Debugger::DebuggerStartParameters s60DebuggerStartParams(const S60DeviceR
 }
 
 S60DeviceDebugRunControl::S60DeviceDebugRunControl(S60DeviceRunConfiguration *rc,
-                                                   const Debugger::DebuggerStartParameters &sp,
-                                                   const QPair<Debugger::DebuggerEngineType, Debugger::DebuggerEngineType> &masterSlaveEngineTypes) :
-    Debugger::DebuggerRunControl(rc, sp, masterSlaveEngineTypes),
+                                                   const Debugger::DebuggerStartParameters &sp) :
+    Debugger::DebuggerRunControl(rc, sp),
     m_codaRunControl(NULL),
     m_codaState(ENotUsingCodaRunControl)
 {
@@ -150,7 +149,7 @@ S60DeviceDebugRunControl::S60DeviceDebugRunControl(S60DeviceRunConfiguration *rc
                                arg(rc->localExecutableFileName());
         appendMessage(msg, Utils::ErrorMessageFormat);
     }
-    if (masterSlaveEngineTypes.first == Debugger::QmlEngineType) {
+    if (sp.masterEngineType == Debugger::QmlEngineType) {
         connect(engine(), SIGNAL(requestRemoteSetup()), this, SLOT(remoteSetupRequested()));
         connect(engine(), SIGNAL(stateChanged(Debugger::DebuggerState)), this, SLOT(qmlEngineStateChanged(Debugger::DebuggerState)));
     }
@@ -239,14 +238,7 @@ ProjectExplorer::RunControl* S60DeviceDebugRunControlFactory::create(RunConfigur
 {
     S60DeviceRunConfiguration *rc = qobject_cast<S60DeviceRunConfiguration *>(runConfiguration);
     QTC_ASSERT(rc && mode == DebugRunMode, return 0);
-    const Debugger::DebuggerStartParameters startParameters = s60DebuggerStartParams(rc);
-    const Debugger::ConfigurationCheck check = Debugger::checkDebugConfiguration(startParameters);
-    if (!check) {
-        Core::ICore::showWarningWithOptions(S60DeviceDebugRunControl::tr("Debugger for Symbian Platform"),
-            check.errorMessage, check.errorDetailsString(), check.settingsCategory, check.settingsPage);
-        return 0;
-    }
-    return new S60DeviceDebugRunControl(rc, startParameters, check.masterSlaveEngineTypes);
+    return new S60DeviceDebugRunControl(rc, s60DebuggerStartParams(rc));
 }
 
 QString S60DeviceDebugRunControlFactory::displayName() const
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.h b/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.h
index ed995cd9d29b6cb1f42073a4db82f9320265f024..f01d4a13c2bfa3bef12648acfb6e583a33e8d98a 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicedebugruncontrol.h
@@ -46,8 +46,7 @@ class S60DeviceDebugRunControl : public Debugger::DebuggerRunControl
 
 public:
     explicit S60DeviceDebugRunControl(S60DeviceRunConfiguration *runConfiguration,
-                                      const Debugger::DebuggerStartParameters &sp,
-                                      const QPair<Debugger::DebuggerEngineType, Debugger::DebuggerEngineType> &masterSlaveEngineTypes);
+                                      const Debugger::DebuggerStartParameters &sp);
     virtual void start();
     virtual bool promptToStop(bool *optionalPrompt = 0) const;