diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 608b2cdd4b6d434891ee1008a645c58fea2d630f..c22eacff98967f129af4518614402be8710830c0 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -387,7 +387,7 @@ void CdbEngine::startEngine()
         warning(QLatin1String("Internal error: Attempt to start debugger while another process is being debugged."));
         setState(EngineStartFailed, Q_FUNC_INFO, __LINE__);
         setState(DebuggerNotReady, Q_FUNC_INFO, __LINE__);
-        emit startFailed();
+        notifyEngineStartFailed();
         return;
     }
     switch (sp.startMode) {
@@ -396,7 +396,7 @@ void CdbEngine::startEngine()
         warning(QLatin1String("Internal error: Mode not supported."));
         setState(EngineStartFailed, Q_FUNC_INFO, __LINE__);
         setState(DebuggerNotReady, Q_FUNC_INFO, __LINE__);
-        emit startFailed();
+        notifyEngineStartFailed();
         break;
     default:
         break;
@@ -470,11 +470,11 @@ void CdbEngine::startEngine()
     if (rc) {
         if (needWatchTimer)
             m_d->startWatchTimer();
-        startSuccessful();
+        notifyEngineStarted();
     } else {
         warning(errorMessage);
         setState(InferiorStartFailed, Q_FUNC_INFO, __LINE__);
-        startFailed();
+        notifyEngineStartFailed();
     }
 }
 
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 6b4853e408ae7020691b2ddb62ab62b034a87413..619027a87d56d29eed53b165557ba86ae7c764ea 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -608,12 +608,12 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c
 
 void DebuggerEngine::startDebugger(DebuggerRunControl *runControl)
 {
-    QTC_ASSERT(runControl, startFailed(); return);
-    QTC_ASSERT(!d->m_runControl, startFailed(); return);
+    QTC_ASSERT(runControl, notifyEngineStartFailed(); return);
+    QTC_ASSERT(!d->m_runControl, notifyEngineStartFailed(); return);
 
     DebuggerEngine *sessionTemplate = plugin()->sessionTemplate();
-    QTC_ASSERT(sessionTemplate, startFailed(); return);
-    QTC_ASSERT(sessionTemplate != this, startFailed(); return);
+    QTC_ASSERT(sessionTemplate, notifyEngineStartFailed(); return);
+    QTC_ASSERT(sessionTemplate != this, notifyEngineStartFailed(); return);
 
     breakHandler()->initializeFromTemplate(sessionTemplate->breakHandler());
     watchHandler()->initializeFromTemplate(sessionTemplate->watchHandler());
@@ -956,6 +956,18 @@ static bool isAllowedTransition(int from, int to)
     return false;
 }
 
+void DebuggerEngine::notifyEngineStarted()
+{
+    QTC_ASSERT(state() == EngineStarting, /**/);
+    setState(EngineStarted);
+}
+
+void DebuggerEngine::notifyEngineStartFailed()
+{
+    QTC_ASSERT(state() == EngineStarting, /**/);
+    setState(EngineStartFailed);
+}
+
 void DebuggerEngine::setState(DebuggerState state, bool forced)
 {
     //qDebug() << "STATUS CHANGE: FROM " << stateName(d->m_state)
@@ -972,8 +984,16 @@ void DebuggerEngine::setState(DebuggerState state, bool forced)
     showMessage(msg, LogDebug);
     plugin()->updateState(this);
 
-    if (state != oldState && state == DebuggerNotReady)
-        d->m_runControl->debuggingFinished();
+    if (state != oldState) {
+        if (state == DebuggerNotReady) {
+            d->m_runControl->debuggingFinished();
+        } else if (state == EngineStarted) {
+            d->m_runControl->startSuccessful();
+        } else if (state == EngineStartFailed) {
+            d->m_runControl->debuggingFinished();
+            d->m_runControl->startFailed();
+        }
+    }
 }
 
 bool DebuggerEngine::debuggerActionsEnabled() const
@@ -1008,18 +1028,6 @@ bool DebuggerEngine::debuggerActionsEnabled(DebuggerState state)
     return false;
 }
 
-void DebuggerEngine::startFailed()
-{
-    // The concrete engines themselves are responsible for changing state.
-    QTC_ASSERT(state() == DebuggerNotReady, setState(DebuggerNotReady));
-    d->m_runControl->startFailed();
-}
-
-void DebuggerEngine::startSuccessful()
-{
-    d->m_runControl->startSuccessful();
-}
-
 void DebuggerEngine::notifyInferiorPid(qint64 pid)
 {
     if (d->m_inferiorPid == pid)
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index c542087c2514240d2093e7d6857ccfdb124648bc..69063ff276c7d7254261e62dab6276ecdd0f4a38 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -248,13 +248,13 @@ public slots:
     void openFile(const QString &fileName, int lineNumber = -1);
     void gotoLocation(const QString &fileName, int lineNumber, bool setMarker);
     void gotoLocation(const StackFrame &frame, bool setMarker);
-    void startSuccessful();
-    void startFailed();
     void raiseApplication();
     virtual void quitDebugger() { exitDebugger(); } // called by DebuggerRunControl
 
 protected:
     void setState(DebuggerState state, bool forced = false);
+    void notifyEngineStarted();
+    void notifyEngineStartFailed();
 
 private:
     void executeRunToLine();
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 0cd5b96f4ef88f8adbe9d82faa199ff95dda2687..1b1083fd6c35abc2c6ba86f38dc04f0ca379a5cc 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -4205,7 +4205,7 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg, const QString &sett
 
 void GdbEngine::handleAdapterStarted()
 {
-    setState(EngineStarted);
+    notifyEngineStarted();
     if (m_progress)
         m_progress->setProgressValue(25);
     showMessage(_("ADAPTER SUCCESSFULLY STARTED"));
@@ -4217,7 +4217,6 @@ void GdbEngine::handleAdapterStarted()
 
 void GdbEngine::handleInferiorPrepared()
 {
-    startSuccessful();
     const QByteArray qtInstallPath = startParameters().qtInstallPath.toLocal8Bit();
     if (!qtInstallPath.isEmpty()) {
         QByteArray qtBuildPath;
diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp
index 4c92eb09cd75fa9bf2b9bb88254b15e08fd8c157..fa732a44589ea99d6c997a361e251e26f44b159c 100644
--- a/src/plugins/debugger/pdb/pdbengine.cpp
+++ b/src/plugins/debugger/pdb/pdbengine.cpp
@@ -148,7 +148,7 @@ void PdbEngine::startEngine()
         //showMessage("STARTING " +m_scriptFileName + "FAILED");
         showMessage(QString::fromLatin1("Cannot open %1: %2").
                    arg(m_scriptFileName, scriptFile.errorString()), LogError);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
     m_pdbProc.disconnect(); // From any previous runs
@@ -188,9 +188,10 @@ void PdbEngine::startEngine()
             Core::ICore::instance()->showWarningWithOptions(title, msg);
         }
         shutdown();
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
+    notifyEngineStarted();
     attemptBreakpointSynchronization();
 
     showMessage(_("PDB STARTED, INITIALIZING IT"));
@@ -199,9 +200,7 @@ void PdbEngine::startEngine()
     postCommand("execfile('" + dumperSourcePath + "pdumper.py')",
         CB(handleLoadDumper));
 
-    setState(EngineStarted);
     setState(InferiorStarting);
-    emit startSuccessful();
     showStatusMessage(tr("Running requested..."), 5000);
     setState(InferiorRunningRequested);
     setState(InferiorRunning);
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index 4194733461cc6f11aaa8ef332f3f572bb4ec0ff3..eb47fa782b3a09d0f0d6fbbfa9f5af58330f427d 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -251,18 +251,13 @@ void QmlEngine::startEngine()
     m_proc.start(sp.executable, sp.processArgs);
 
     if (!m_proc.waitForStarted()) {
-        setState(EngineStartFailed);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
 #endif
-    setState(EngineStarted);
-    startSuccessful();
-    setState(InferiorStarting);
-
+    notifyEngineStarted();
     //m_frameRate = new CanvasFrameRate(0);
     //m_frameRate->show();
-    setState(InferiorRunning);
 }
 
 void QmlEngine::setupConnection()
@@ -300,12 +295,12 @@ void QmlEngine::setupConnection()
 
     if (!m_conn->waitForConnected()) {
         qDebug() << "CONNECTION FAILED";
-        setState(InferiorStartFailed);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
  #endif
 
+    notifyEngineStarted();
     qDebug() << "CONNECTION SUCCESSFUL";
     setState(InferiorRunningRequested);
     setState(InferiorRunning);
diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp
index 70ffe85190693cde5122e8b6446d5a512b16ea77..2109f0ba72123f45e93a834177af70c16f982f56 100644
--- a/src/plugins/debugger/script/scriptengine.cpp
+++ b/src/plugins/debugger/script/scriptengine.cpp
@@ -255,9 +255,10 @@ void ScriptEngine::startEngine()
     if (!scriptFile.open(QIODevice::ReadOnly|QIODevice::Text)) {
         showMessage(QString::fromLatin1("Cannot open %1: %2").
           arg(m_scriptFileName, scriptFile.errorString()), LogError);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
+    notifyEngineStarted();
     QTextStream stream(&scriptFile);
     m_scriptContents = stream.readAll();
     scriptFile.close();
@@ -266,7 +267,6 @@ void ScriptEngine::startEngine()
     showStatusMessage(tr("Running requested..."), 5000);
     showMessage(QLatin1String("Running: ") + m_scriptFileName, LogMisc);
     QTimer::singleShot(0, this, SLOT(runInferior()));
-    startSuccessful();
 }
 
 void ScriptEngine::continueInferior()
diff --git a/src/plugins/debugger/tcf/tcfengine.cpp b/src/plugins/debugger/tcf/tcfengine.cpp
index cd458ef48bb38df84db6ec652316b0b2c94761e6..01fa77bf67586ed102b33f58b326e59d59824635 100644
--- a/src/plugins/debugger/tcf/tcfengine.cpp
+++ b/src/plugins/debugger/tcf/tcfengine.cpp
@@ -155,8 +155,10 @@ void TcfEngine::socketReadyRead()
 void TcfEngine::socketConnected()
 {
     showStatusMessage("Socket connected.");
-    m_socket->waitForConnected(2000);
-    //sendCommand("Locator", "redirect", "ID");
+    if (m_socket->waitForConnected(2000))
+        notifyEngineStarted();
+    else
+        notifyEngineStartFailed();
 }
 
 void TcfEngine::socketDisconnected()
@@ -211,7 +213,6 @@ void TcfEngine::startEngine()
     const quint16 port = sp.remoteChannel.mid(pos + 1).toInt();
     //QTimer::singleShot(0, this, SLOT(runInferior()));
     m_socket->connectToHost(host, port);
-    emit startSuccessful();
 }
 
 void TcfEngine::continueInferior()