diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index fa3d7ffa2a7871cdaaa8e28eaa433f28c52de593..8c3eb12c5f72b61f4107488ee9d28ec6a35cda4d 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -269,38 +269,41 @@ public:
     virtual void quitDebugger(); // called by DebuggerRunControl
 
 protected:
-    void notifyEngineSetupOk();
-    void notifyEngineSetupFailed();
-    void notifyEngineRunFailed();
+    // The base notify*() function implementation should be sufficient
+    // in most cases, but engines are free to override them to do some
+    // engine specific cleanup like stopping timers etc.
+    virtual void notifyEngineSetupOk();
+    virtual void notifyEngineSetupFailed();
+    virtual void notifyEngineRunFailed();
 
-    void notifyInferiorSetupOk();
-    void notifyInferiorSetupFailed();
+    virtual void notifyInferiorSetupOk();
+    virtual void notifyInferiorSetupFailed();
 
-    void notifyEngineRunAndInferiorRunOk();
-    void notifyEngineRunAndInferiorStopOk();
-    void notifyInferiorUnrunnable(); // Called by CoreAdapter.
+    virtual void notifyEngineRunAndInferiorRunOk();
+    virtual void notifyEngineRunAndInferiorStopOk();
+    virtual void notifyInferiorUnrunnable(); // Called by CoreAdapter.
 
     // Use notifyInferiorRunRequested() plus notifyInferiorRunOk() instead.
-    //void notifyInferiorSpontaneousRun();
+    //virtual void notifyInferiorSpontaneousRun();
 
-    void notifyInferiorRunRequested();
-    void notifyInferiorRunOk();
-    void notifyInferiorRunFailed();
+    virtual void notifyInferiorRunRequested();
+    virtual void notifyInferiorRunOk();
+    virtual void notifyInferiorRunFailed();
 
-    void notifyInferiorStopOk();
-    void notifyInferiorSpontaneousStop();
-    void notifyInferiorStopFailed();
-    void notifyInferiorExited();
+    virtual void notifyInferiorStopOk();
+    virtual void notifyInferiorSpontaneousStop();
+    virtual void notifyInferiorStopFailed();
+    virtual void notifyInferiorExited();
 
-    void notifyInferiorShutdownOk();
-    void notifyInferiorShutdownFailed();
+    virtual void notifyInferiorShutdownOk();
+    virtual void notifyInferiorShutdownFailed();
 
-    void notifyEngineSpontaneousShutdown();
-    void notifyEngineShutdownOk();
-    void notifyEngineShutdownFailed();
+    virtual void notifyEngineSpontaneousShutdown();
+    virtual void notifyEngineShutdownOk();
+    virtual void notifyEngineShutdownFailed();
 
-    void notifyInferiorIll();
-    void notifyEngineIll();
+    virtual void notifyInferiorIll();
+    virtual void notifyEngineIll();
 
     virtual void setupEngine() = 0;
     virtual void setupInferior() = 0;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index a5b9da7f82e2b6f4912ea6fc5b69457cb8b4d605..69179d64932ed603efb8fa8d8069380f44574401 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -4190,6 +4190,14 @@ void GdbEngine::setupInferior()
     m_gdbAdapter->setupInferior();
 }
 
+void GdbEngine::notifyInferiorSetupFailed()
+{
+    // FIXME: that's not enough to stop gdb from getting confused
+    // by a timeout of the adapter.
+    //resetCommandQueue();
+    DebuggerEngine::notifyInferiorSetupFailed();
+}
+
 void GdbEngine::handleInferiorPrepared()
 {
     QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
@@ -4289,6 +4297,19 @@ void GdbEngine::handleCreateFullBacktrace(const GdbResponse &response)
     }
 }
 
+void GdbEngine::resetCommandQueue()
+{
+    m_commandTimer->stop();
+    if (!m_cookieForToken.isEmpty()) {
+        QString msg;
+        QTextStream ts(&msg);
+        ts << "RESETING COMMAND QUEUE. LEFT OVER TOKENS: ";
+        foreach (const GdbCommand &cookie, m_cookieForToken)
+            ts << "CMD:" << cookie.command << cookie.callbackName;
+        m_cookieForToken.clear();
+        showMessage(msg);
+    }
+}
 
 //
 // Factory
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 3cf89306b2c830f6bcacb330771f1f1c845065ab..db257fcf78d72f8d6bb3d947ad1ad8fcf307e765 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -113,6 +113,7 @@ private: ////////// General Interface //////////
     virtual void detachDebugger();
     virtual void shutdownEngine();
     virtual void shutdownInferior();
+    virtual void notifyInferiorSetupFailed();
 
     virtual void executeDebuggerCommand(const QString &command);
     virtual QString qtNamespace() const { return m_dumperHelper.qtNamespace(); }
@@ -287,6 +288,7 @@ private: ////////// Gdb Output, State & Capability Handling //////////
     void handleStop1(const GdbResponse &response);
     void handleStop1(const GdbMi &data);
     StackFrame parseStackFrame(const GdbMi &mi, int level);
+    void resetCommandQueue();
 
     bool isSynchroneous() const { return hasPython(); }
     virtual bool hasPython() const;