diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp
index 9b8bde92e9c7d37b1d3ba2182de7e6936c7f096f..857d029cecfa3882d7fa300189db92b1e6edbb8b 100644
--- a/src/plugins/debugger/qml/qmlcppengine.cpp
+++ b/src/plugins/debugger/qml/qmlcppengine.cpp
@@ -83,10 +83,8 @@ QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp)
 
 QmlCppEngine::~QmlCppEngine()
 {
-    if (d->m_qmlEngine)
-        delete d->m_qmlEngine;
-    if (d->m_cppEngine)
-        delete d->m_cppEngine;
+    delete d->m_qmlEngine;
+    delete d->m_cppEngine;
 }
 
 void QmlCppEngine::editorChanged(Core::IEditor *editor)
@@ -483,7 +481,7 @@ void QmlCppEngine::shutdownInferior()
 {
     if (!checkErrorState(InferiorShutdownFailed)) {
         if (d->m_cppEngine->state() == InferiorStopOk) {
-            d->m_cppEngine->shutdownInferior();
+            d->m_cppEngine->quitDebugger();
         } else {
             notifyInferiorShutdownOk();
         }
@@ -499,13 +497,19 @@ void QmlCppEngine::initEngineShutdown()
         d->m_cppEngine->quitDebugger();
     } else
     if (state() == EngineSetupRequested) {
-        if (!checkErrorState(EngineSetupFailed)) {
+        if (!runControl() || d->m_errorState == EngineSetupFailed) {
+            notifyEngineSetupFailed();
+        } else {
             notifyEngineSetupOk();
         }
     } else
     if (state() == InferiorStopRequested) {
         checkErrorState(InferiorStopFailed);
-    } else {
+    } else
+    if (state() == InferiorShutdownRequested && !checkErrorState(InferiorShutdownFailed)) {
+        notifyInferiorShutdownOk();
+    } else
+    if (state() != DebuggerFinished) {
         quitDebugger();
     }
 }
@@ -518,11 +522,6 @@ void QmlCppEngine::shutdownEngine()
     }
 }
 
-void QmlCppEngine::setupSlaveEngineOnTimer()
-{
-    QTimer::singleShot(0, this, SLOT(setupSlaveEngine()));
-}
-
 void QmlCppEngine::setupSlaveEngine()
 {
     if (d->m_qmlEngine->state() == DebuggerNotReady)
@@ -620,6 +619,13 @@ void QmlCppEngine::engineStateChanged(const DebuggerState &newState)
         }
         break;
 
+    case EngineShutdownRequested:
+        // we have to abort the setup before the sub-engines die
+        // because we depend on an active runcontrol that will be shut down by the dying engine
+        if (state() == EngineSetupRequested)
+            notifyEngineSetupFailed();
+        break;
+
     case DebuggerFinished:
         initEngineShutdown();
         break;
diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h
index 70a54888be063d55b1e71a8dbd9e65548d52013e..947e464d47bef8d873351704d1de6aab9eda101f 100644
--- a/src/plugins/debugger/qml/qmlcppengine.h
+++ b/src/plugins/debugger/qml/qmlcppengine.h
@@ -107,7 +107,6 @@ private slots:
     void editorChanged(Core::IEditor *editor);
 
 private:
-    void setupSlaveEngineOnTimer();
     void initEngineShutdown();
     bool checkErrorState(const DebuggerState stateToCheck);
     void engineStateChanged(const DebuggerState &newState);