diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index fa740f1e590560ea7a6bba63b4be787508ec7c95..213f6c81dc91c083dec522e50467863d1a0a3911 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -685,8 +685,6 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl)
 
     d->m_runControl = runControl;
 
-    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
-
     d->m_inferiorPid = d->m_startParameters.attachPID > 0
         ? d->m_startParameters.attachPID : 0;
 
@@ -700,7 +698,10 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl)
     theDebuggerAction(OperateByInstruction)
         ->setEnabled(engineCapabilities & DisassemblerCapability);
 
+    QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished,
+         qDebug() << state());
     setState(EngineSetupRequested);
+
     setupEngine();
 }
 
@@ -869,9 +870,16 @@ void DebuggerEngine::addToWatchWindow()
     watchHandler()->watchExpression(exp);
 }
 
+// Called from RunControl.
+void DebuggerEngine::handleStartFailed()
+{
+    d->m_runControl = 0;
+}
+
 // Called from RunControl.
 void DebuggerEngine::handleFinished()
 {
+    d->m_runControl = 0;
     modulesHandler()->removeAll();
     stackHandler()->removeAll();
     threadsHandler()->removeAll();
@@ -983,7 +991,7 @@ static bool isAllowedTransition(DebuggerState from, DebuggerState to)
     case EngineSetupRequested:
         return to == EngineSetupOk || to == EngineSetupFailed;
     case EngineSetupFailed:
-        // FIXME: In therory it's the engine's task to go into a 
+        // FIXME: In therory it's the engine's task to go into a
         // proper "Shutdown" state before calling notifyEngineSetupFailed
         //return to == DebuggerFinished;
         return to == EngineShutdownRequested;
@@ -1034,7 +1042,7 @@ static bool isAllowedTransition(DebuggerState from, DebuggerState to)
         return to == DebuggerFinished;
 
     case DebuggerFinished:
-        return false;
+        return to == EngineSetupRequested; // Happens on restart.
     }
 
     qDebug() << "UNKNOWN STATE:" << from;
@@ -1046,7 +1054,9 @@ void DebuggerEngine::notifyEngineSetupFailed()
     showMessage(_("NOTE: ENGINE SETUP FAILED"));
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
     setState(EngineSetupFailed);
-    d->m_runControl->startFailed();
+    QTC_ASSERT(d->m_runControl, /**/);
+    if (d->m_runControl)
+        d->m_runControl->startFailed();
     d->queueShutdownEngine();
 }
 
@@ -1055,7 +1065,9 @@ void DebuggerEngine::notifyEngineSetupOk()
     showMessage(_("NOTE: ENGINE SETUP OK"));
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
     setState(EngineSetupOk);
-    d->m_runControl->startSuccessful();
+    QTC_ASSERT(d->m_runControl, /**/);
+    if (d->m_runControl)
+        d->m_runControl->startSuccessful();
     showMessage(_("QUEUE: SETUP INFERIOR"));
     QTimer::singleShot(0, d, SLOT(doSetupInferior()));
 }
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 1d4845b1692a02c1f5073cdaa5ff0d333b1a2a96..6cd9fb8796c2fdb0695ca6e6ce15891f80bb5107 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -213,6 +213,7 @@ public:
     QAbstractItemModel *sourceFilesModel() const;
 
     void handleFinished();
+    void handleStartFailed();
     bool debuggerActionsEnabled() const;
     static bool debuggerActionsEnabled(DebuggerState state);
     void showModuleSymbols(const QString &moduleName, const Symbols &symbols);
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 182eff9c2df23fce78c6cb30e5c16684e2c1da92..fb49cba4f8dac7bf40498720fd343f69bc0e442b 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -470,6 +470,7 @@ void DebuggerRunControl::startFailed()
 {
     m_running = false;
     emit finished();
+    engine()->handleStartFailed();
 }
 
 void DebuggerRunControl::handleStarted()