diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp
index b4e9f6fd67b90dfbcf0291fb7179ce46a735a2a2..c9caf069ff6db8de2dbf620a0507ff481f2ef255 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.cpp
+++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp
@@ -286,19 +286,18 @@ CdbComInterfaces::CdbComInterfaces() :
 
 // --- CdbDebugEnginePrivate
 
-CdbDebugEnginePrivate::CdbDebugEnginePrivate(DebuggerManager *parent,
+CdbDebugEnginePrivate::CdbDebugEnginePrivate(DebuggerManager *manager,
                                              const QSharedPointer<CdbOptions> &options,
                                              CdbDebugEngine* engine) :
     m_options(options),
     m_hDebuggeeProcess(0),
     m_hDebuggeeThread(0),
     m_breakEventMode(BreakEventHandle),
-    m_dumper(new CdbDumperHelper(parent, &m_cif)),
+    m_dumper(new CdbDumperHelper(manager, &m_cif)),
     m_watchTimer(-1),
     m_debugEventCallBack(engine),
     m_engine(engine),
-    m_debuggerManager(parent),
-    m_debuggerManagerAccess(parent->engineInterface()),
+    m_debuggerManagerAccess(manager->engineInterface()),
     m_currentStackTrace(0),
     m_firstActivatedFrame(true),
     m_mode(AttachCore)
@@ -369,11 +368,11 @@ bool CdbDebugEnginePrivate::init(QString *errorMessage)
     return true;
 }
 
-IDebuggerEngine *CdbDebugEngine::create(DebuggerManager *parent,
+IDebuggerEngine *CdbDebugEngine::create(DebuggerManager *manager,
                                         const QSharedPointer<CdbOptions> &options,
                                         QString *errorMessage)
 {
-    CdbDebugEngine *rc = new CdbDebugEngine(parent, options);
+    CdbDebugEngine *rc = new CdbDebugEngine(manager, options);
     if (rc->m_d->init(errorMessage)) {
         rc->syncDebuggerPaths();
         return rc;
@@ -446,7 +445,7 @@ void CdbDebugEnginePrivate::cleanStackTrace()
     }
 }
 
-CdbDebugEngine::CdbDebugEngine(DebuggerManager *parent, const QSharedPointer<CdbOptions> &options) :
+CdbDebugEngine::CdbDebugEngine(DebuggerManager *manager, const QSharedPointer<CdbOptions> &options) :
     IDebuggerEngine(parent),
     m_d(new CdbDebugEnginePrivate(parent, options, this))
 {
@@ -455,13 +454,13 @@ CdbDebugEngine::CdbDebugEngine(DebuggerManager *parent, const QSharedPointer<Cdb
     connect(&m_d->m_consoleStubProc, SIGNAL(processStarted()), this, SLOT(slotConsoleStubStarted()));
     connect(&m_d->m_consoleStubProc, SIGNAL(wrapperStopped()), this, SLOT(slotConsoleStubTerminated()));
     connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggerOutput(int,QString)),
-            m_d->m_debuggerManager, SLOT(showDebuggerOutput(int,QString)));
+            manager(), SLOT(showDebuggerOutput(int,QString)));
     connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggerInputPrompt(int,QString)),
-            m_d->m_debuggerManager, SLOT(showDebuggerInput(int,QString)));
+            manager(), SLOT(showDebuggerInput(int,QString)));
     connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggeeOutput(QString)),
-            m_d->m_debuggerManager, SLOT(showApplicationOutput(QString)));
+            manager(), SLOT(showApplicationOutput(QString)));
     connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggeeInputPrompt(QString)),
-            m_d->m_debuggerManager, SLOT(showApplicationOutput(QString)));
+            manager(), SLOT(showApplicationOutput(QString)));
 }
 
 CdbDebugEngine::~CdbDebugEngine()
@@ -588,7 +587,7 @@ void CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters>
         }
     }
     m_d->m_dumper->reset(dumperLibName, dumperEnabled);
-    m_d->m_debuggerManager->showStatusMessage("Starting Debugger", -1);
+    showStatusMessage("Starting Debugger", -1);
     QString errorMessage;
     bool rc = false;
     bool needWatchTimer = false;
@@ -621,7 +620,7 @@ void CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters>
         break;
     }
     if (rc) {
-        m_d->m_debuggerManager->showStatusMessage(tr("Debugger running"), -1);
+        showStatusMessage(tr("Debugger running"), -1);
         if (needWatchTimer)
             startWatchTimer();
     } else {
@@ -653,13 +652,13 @@ bool CdbDebugEngine::startAttachDebugger(qint64 pid, DebuggerStartMode sm, QStri
 
 bool CdbDebugEngine::startDebuggerWithExecutable(DebuggerStartMode sm, QString *errorMessage)
 {
-    m_d->m_debuggerManager->showStatusMessage("Starting Debugger", -1);
+    showStatusMessage("Starting Debugger", -1);
 
     DEBUG_CREATE_PROCESS_OPTIONS dbgopts;
     memset(&dbgopts, 0, sizeof(dbgopts));
     dbgopts.CreateFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS;
 
-    const QSharedPointer<DebuggerStartParameters> sp = m_d->m_debuggerManager->startParameters();
+    const QSharedPointer<DebuggerStartParameters> sp = manager()->startParameters();
     const QString filename(sp->executable);
     // Set image path
     const QFileInfo fi(filename);
@@ -728,7 +727,7 @@ void CdbDebugEnginePrivate::processCreatedAttached(ULONG64 processHandle, ULONG6
     // Attaching to crashed: This handshake (signalling an event) is required for
     // the exception to be delivered to the debugger
     if (m_mode == AttachCrashedExternal) {
-        const QString crashParameter = m_debuggerManager->startParameters()->crashParameter;
+        const QString crashParameter = manager()->startParameters()->crashParameter;
         if (!crashParameter.isEmpty()) {
             ULONG64 evtNr = crashParameter.toULongLong();
             const HRESULT hr = m_cif.debugControl->SetNotifyEventHandle(evtNr);
@@ -748,7 +747,7 @@ void CdbDebugEngine::processTerminated(unsigned long exitCode)
     m_d->clearForRun();
     m_d->setDebuggeeHandles(0, 0);
     m_d->m_debuggerManagerAccess->notifyInferiorExited();
-    m_d->m_debuggerManager->exitDebugger();
+    manager()->exitDebugger();
 }
 
 // End debugging using
@@ -1025,8 +1024,9 @@ bool CdbDebugEnginePrivate::continueInferior(QString *errorMessage)
     clearForRun();
     setCodeLevel();
     m_engine->killWatchTimer();
-    m_debuggerManager->resetLocation();
-    m_debuggerManagerAccess->notifyInferiorRunningRequested();
+    manager()->resetLocation();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Running requested..."), 5000);
 
     if (!continueInferiorProcess(errorMessage))
         return false;
@@ -1186,7 +1186,7 @@ void CdbDebugEngine::activateFrame(int frameIndex)
     if (debugCDB)
         qDebug() << Q_FUNC_INFO << frameIndex;
 
-    if (m_d->m_debuggerManager->status() != DebuggerInferiorStopped) {
+    if (state() != InferiorStopped) {
         qWarning("WARNING %s: invoked while debuggee is running\n", Q_FUNC_INFO);
         return;
     }
@@ -1215,7 +1215,7 @@ void CdbDebugEngine::activateFrame(int frameIndex)
             break;
         }
 
-        m_d->m_debuggerManager->gotoLocation(frame, true);
+        manager()->gotoLocation(frame, true);
 
         if (oldIndex != frameIndex || m_d->m_firstActivatedFrame) {
             watchHandler->beginCycle();
@@ -1235,7 +1235,7 @@ void CdbDebugEngine::selectThread(int index)
         qDebug() << Q_FUNC_INFO << index;
 
     //reset location arrow
-    m_d->m_debuggerManager->resetLocation();
+    manager()->resetLocation();
 
     ThreadsHandler *threadsHandler = m_d->m_debuggerManagerAccess->threadsHandler();
     threadsHandler->setCurrentThread(index);
@@ -1417,7 +1417,7 @@ void CdbDebugEngine::timerEvent(QTimerEvent* te)
     const HRESULT hr = m_d->m_cif.debugControl->WaitForEvent(0, 1);
     if (debugCDB)
         if (debugCDB > 1 || hr != S_FALSE)
-            qDebug() << Q_FUNC_INFO << "WaitForEvent" << m_d->m_debuggerManager->status() <<   msgDebugEngineComResult(hr);
+            qDebug() << Q_FUNC_INFO << "WaitForEvent" << state() << msgDebugEngineComResult(hr);
 
     switch (hr) {
         case S_OK:
@@ -1446,13 +1446,13 @@ void CdbDebugEngine::slotConsoleStubStarted()
         m_d->m_debuggerManagerAccess->notifyInferiorPidChanged(appPid);
         m_d->m_debuggerManagerAccess->notifyInferiorRunning();
     } else {
-        QMessageBox::critical(m_d->m_debuggerManager->mainWindow(), tr("Debugger Error"), errorMessage);
+        QMessageBox::critical(manager()->mainWindow(), tr("Debugger Error"), errorMessage);
     }
 }
 
 void CdbDebugEngine::slotConsoleStubError(const QString &msg)
 {
-    QMessageBox::critical(m_d->m_debuggerManager->mainWindow(), tr("Debugger Error"), msg);
+    QMessageBox::critical(manager()->mainWindow(), tr("Debugger Error"), msg);
 }
 
 void CdbDebugEngine::slotConsoleStubTerminated()
diff --git a/src/plugins/debugger/cdb/cdbdebugengine.h b/src/plugins/debugger/cdb/cdbdebugengine.h
index 18b660416520f01f54ffbf6d9cecba4aa65a4733..d6acfc1e3ad24ceb60ef7b491a07335abedbb183 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.h
+++ b/src/plugins/debugger/cdb/cdbdebugengine.h
@@ -100,6 +100,10 @@ public:
     virtual void reloadSourceFiles();
     virtual void reloadFullStack() {}
 
+    DebuggerState state() const; 
+    void setState(DebuggerState state);
+    void showStatusMessage(const QString &msg, int timeout = -1);
+
 public slots:
     void syncDebuggerPaths();
 
diff --git a/src/plugins/debugger/cdb/cdbdebugengine_p.h b/src/plugins/debugger/cdb/cdbdebugengine_p.h
index 5c5a375ef4e508fbf265bd3d7307352df3cb78bf..83b9f324068fb83baa75cfdf3452ab6105449cb4 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine_p.h
+++ b/src/plugins/debugger/cdb/cdbdebugengine_p.h
@@ -45,7 +45,6 @@ namespace Debugger {
 namespace Internal {
 
 class DebuggerManager;
-class IDebuggerManagerAccessForEngines;
 class WatchHandler;
 class CdbStackFrameContext;
 class CdbStackTraceContext;
@@ -161,9 +160,8 @@ struct CdbDebugEnginePrivate
     QSharedPointer<CdbDumperHelper> m_dumper;
     QString                 m_baseImagePath;
 
-    CdbDebugEngine* m_engine;
-    DebuggerManager *m_debuggerManager;
-    IDebuggerManagerAccessForEngines *m_debuggerManagerAccess;
+    CdbDebugEngine *m_engine;
+    DebuggerManager *manager() const { return m_engine->manager(); }
     CdbStackTraceContext *m_currentStackTrace;
     EditorToolTipCache m_editorToolTipCache;
 
diff --git a/src/plugins/debugger/cdb/cdbdebugeventcallback.cpp b/src/plugins/debugger/cdb/cdbdebugeventcallback.cpp
index 205ea50c4d2a5fef8b538ef2bddd7e777a631140..ebcc289c15393e58667d46191fb1036ca1c470ad 100644
--- a/src/plugins/debugger/cdb/cdbdebugeventcallback.cpp
+++ b/src/plugins/debugger/cdb/cdbdebugeventcallback.cpp
@@ -372,10 +372,9 @@ STDMETHODIMP CdbDebugEventCallback::SystemError(
 }
 
 // -----------ExceptionLoggerEventCallback
-CdbExceptionLoggerEventCallback::CdbExceptionLoggerEventCallback(int logChannel,
-                                                           IDebuggerManagerAccessForEngines *access) :
+CdbExceptionLoggerEventCallback::CdbExceptionLoggerEventCallback(int logChannel, DebuggerManager *manager) :
     m_logChannel(logChannel),
-    m_access(access)
+    m_manager(manager)
 {
 }
 
@@ -399,7 +398,7 @@ STDMETHODIMP CdbExceptionLoggerEventCallback::Exception(
     }
     if (debugCDB)
         qDebug() << Q_FUNC_INFO << '\n' << m_exceptionMessages.back();
-    m_access->showDebuggerOutput(m_logChannel, m_exceptionMessages.back());
+    m_manager->showDebuggerOutput(m_logChannel, m_exceptionMessages.back());
     return S_OK;
 }
 
diff --git a/src/plugins/debugger/cdb/cdbdebugeventcallback.h b/src/plugins/debugger/cdb/cdbdebugeventcallback.h
index 733700ddeb288ca0705fb22e6a053982bf4c115b..acb888d44de95c0fe0a1e5da74692ead45f5dc19 100644
--- a/src/plugins/debugger/cdb/cdbdebugeventcallback.h
+++ b/src/plugins/debugger/cdb/cdbdebugeventcallback.h
@@ -38,7 +38,6 @@ namespace Debugger {
 namespace Internal {
 
 class CdbDebugEngine;
-class IDebuggerManagerAccessForEngines;
 
 // Base class for event callbacks that takes care
 // Active X magic. Provides base implementations with
@@ -241,8 +240,7 @@ private:
 class CdbExceptionLoggerEventCallback : public CdbDebugEventCallbackBase
 {
 public:
-    explicit CdbExceptionLoggerEventCallback(int logChannel,
-                                             IDebuggerManagerAccessForEngines *access);
+    CdbExceptionLoggerEventCallback(int logChannel, DebuggerManager *access);
 
     STDMETHOD(GetInterestMask)(
         THIS_
@@ -261,7 +259,7 @@ public:
 
 private:
     const int m_logChannel;
-    IDebuggerManagerAccessForEngines *m_access;
+    DebuggerManager *m_manager;
     QList<ULONG> m_exceptionCodes;
     QStringList m_exceptionMessages;
 };
diff --git a/src/plugins/debugger/cdb/cdbdumperhelper.cpp b/src/plugins/debugger/cdb/cdbdumperhelper.cpp
index de6f3d1cd1662cb01df6e677c8c2385bcacf101f..b0757784e003a7b72c18a8d5d3c873611597f5bc 100644
--- a/src/plugins/debugger/cdb/cdbdumperhelper.cpp
+++ b/src/plugins/debugger/cdb/cdbdumperhelper.cpp
@@ -140,7 +140,7 @@ static bool createDebuggeeAscIIString(CdbComInterfaces *cif,
 // the QtCored4.pdb file to be present as we need "qstrdup"
 // as dummy symbol. This is ok ATM since dumpers only
 // make sense for Qt apps.
-static bool debuggeeLoadLibrary(IDebuggerManagerAccessForEngines *access,
+static bool debuggeeLoadLibrary(DebuggerManager *manager,
                                 CdbComInterfaces *cif,
                                 const QString &moduleName,
                                 QString *errorMessage)
@@ -148,7 +148,7 @@ static bool debuggeeLoadLibrary(IDebuggerManagerAccessForEngines *access,
     if (loadDebug > 1)
         qDebug() << Q_FUNC_INFO << moduleName;
     // Try to ignore the breakpoints
-    CdbExceptionLoggerEventCallback exLogger(LogWarning, access);
+    CdbExceptionLoggerEventCallback exLogger(LogWarning, manager);
     EventCallbackRedirector eventRedir(cif->debugClient, &exLogger);
     // Make a call to LoadLibraryA. First, reserve memory in debugger
     // and copy name over.
@@ -221,7 +221,6 @@ CdbDumperHelper::CdbDumperHelper(DebuggerManager *manager,
     m_tryInjectLoad(true),
     m_state(NotLoaded),
     m_manager(manager),
-    m_access(manager),
     m_cif(cif),
     m_inBufferAddress(0),
     m_inBufferSize(0),
@@ -240,7 +239,7 @@ void CdbDumperHelper::disable()
 {
     if (loadDebug)
         qDebug() << Q_FUNC_INFO;
-    m_access->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Disabling dumpers due to debuggee crash..."));
+    m_manager->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Disabling dumpers due to debuggee crash..."));
     m_state = Disabled;
 }
 
@@ -287,7 +286,7 @@ void CdbDumperHelper::moduleLoadHook(const QString &module, HANDLE debuggeeHandl
             } else {
                 m_state = InjectLoadFailed;
                 // Ok, try call loading...
-                m_access->showDebuggerOutput(LogMisc, msgLoadFailed(m_library, true, errorMessage));
+                m_manager->showDebuggerOutput(LogMisc, msgLoadFailed(m_library, true, errorMessage));
             }
         }
         break;
@@ -295,7 +294,7 @@ void CdbDumperHelper::moduleLoadHook(const QString &module, HANDLE debuggeeHandl
         // check if gdbmacros.dll loaded
         if (module.contains(QLatin1String(dumperModuleNameC), Qt::CaseInsensitive)) {
             m_state = Loaded;
-            m_access->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, true));
+            m_manager->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, true));
         }
         break;
     }
@@ -317,7 +316,7 @@ CdbDumperHelper::CallLoadResult CdbDumperHelper::initCallLoad(QString *errorMess
     if (modules.filter(QLatin1String(qtCoreModuleNameC), Qt::CaseInsensitive).isEmpty())
         return CallLoadNoQtApp;
     // Try to load
-    if (!debuggeeLoadLibrary(m_access, m_cif, m_library, errorMessage))
+    if (!debuggeeLoadLibrary(m_manager, m_cif, m_library, errorMessage))
         return CallLoadError;
     return CallLoadOk;
 }
@@ -342,17 +341,17 @@ bool CdbDumperHelper::ensureInitialized(QString *errorMessage)
         switch (initCallLoad(errorMessage)) {
             case CallLoadOk:
             case CallLoadAlreadyLoaded:
-                m_access->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, false));
+                m_manager->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, false));
                 m_state = Loaded;
                 break;
             case CallLoadError:
                 *errorMessage = msgLoadFailed(m_library, false, *errorMessage);
-                m_access->showDebuggerOutput(LogError, *errorMessage);
-                m_access->showQtDumperLibraryWarning(*errorMessage);
+                m_manager->showDebuggerOutput(LogError, *errorMessage);
+                m_manager->showQtDumperLibraryWarning(*errorMessage);
                 m_state = Disabled; // No message here, no point in retrying
                 return false;
             case CallLoadNoQtApp:
-                m_access->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The debuggee does not appear to be Qt application."));
+                m_manager->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The debuggee does not appear to be Qt application."));
                 m_state = Disabled; // No message here
                 return true;
             }
@@ -364,14 +363,14 @@ bool CdbDumperHelper::ensureInitialized(QString *errorMessage)
     m_manager->showStatusMessage(QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Initializing dumpers..."), 10000);
     const bool ok = initResolveSymbols(errorMessage) && initKnownTypes(errorMessage);
     if (ok) {
-        m_access->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Custom dumper library initialized."));
-        m_access->showDebuggerOutput(LogMisc, m_helper.toString());
+        m_manager->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Custom dumper library initialized."));
+        m_manager->showDebuggerOutput(LogMisc, m_helper.toString());
         m_state = Initialized;
     } else {
         m_state = Disabled; // No message here
         *errorMessage = QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The custom dumper library could not be initialized: %1").arg(*errorMessage);
-        m_access->showDebuggerOutput(LogMisc, *errorMessage);
-        m_access->showQtDumperLibraryWarning(*errorMessage);
+        m_manager->showDebuggerOutput(LogMisc, *errorMessage);
+        m_manager->showQtDumperLibraryWarning(*errorMessage);
     }
     return ok;
 }
@@ -479,7 +478,7 @@ bool CdbDumperHelper::callDumper(const QString &callCmd, const QByteArray &inBuf
                                  bool ignoreAccessViolation, QString *errorMessage)
 {
     *outDataPtr = 0;
-    CdbExceptionLoggerEventCallback exLogger(LogWarning, m_access);
+    CdbExceptionLoggerEventCallback exLogger(LogWarning, m_manager);
     EventCallbackRedirector eventRedir(m_cif->debugClient, &exLogger);
     // write input buffer
     if (!inBuffer.isEmpty()) {
@@ -574,7 +573,7 @@ CdbDumperHelper::DumpResult CdbDumperHelper::dumpType(const WatchData &wd, bool
     // Ensure types are parsed and known.
     if (!ensureInitialized(errorMessage)) {
         *errorMessage = msgDumpFailed(wd, errorMessage);
-        m_access->showDebuggerOutput(LogError, *errorMessage);
+        m_manager->showDebuggerOutput(LogError, *errorMessage);
         return DumpError;
     }
 
@@ -591,7 +590,7 @@ CdbDumperHelper::DumpResult CdbDumperHelper::dumpType(const WatchData &wd, bool
     const QString message = QCoreApplication::translate("Debugger::Internal::CdbDumperHelper",
                                                         "Querying dumpers for '%1'/'%2' (%3)").
                                                         arg(wd.name, wd.exp, wd.type);
-    m_access->showDebuggerOutput(LogMisc, message);
+    m_manager->showDebuggerOutput(LogMisc, message);
 
     const DumpExecuteResult der = executeDump(wd, td, dumpChildren, result, errorMessage);
     if (der == DumpExecuteOk)
@@ -604,7 +603,7 @@ CdbDumperHelper::DumpResult CdbDumperHelper::dumpType(const WatchData &wd, bool
         m_failedTypes.push_back(wd.type);
     // log error
     *errorMessage = msgDumpFailed(wd, errorMessage);
-    m_access->showDebuggerOutput(LogWarning, *errorMessage);
+    m_manager->showDebuggerOutput(LogWarning, *errorMessage);
     return DumpError;
 }
 
diff --git a/src/plugins/debugger/cdb/cdbdumperhelper.h b/src/plugins/debugger/cdb/cdbdumperhelper.h
index c9895e08d96b4c6f55141344ecc544d7da838d79..a1fc4a3be49383ffd20f498a5fcfa4744d5ace74 100644
--- a/src/plugins/debugger/cdb/cdbdumperhelper.h
+++ b/src/plugins/debugger/cdb/cdbdumperhelper.h
@@ -40,7 +40,6 @@ namespace Debugger {
 namespace Internal {
 
 struct CdbComInterfaces;
-class IDebuggerManagerAccessForEngines;
 class DebuggerManager;
 
 /* For code clarity, all the stuff related to custom dumpers goes here.
@@ -121,7 +120,6 @@ private:
     const bool m_tryInjectLoad;
     State m_state;
     DebuggerManager *m_manager;
-    IDebuggerManagerAccessForEngines *m_access;
     CdbComInterfaces *m_cif;
 
     QString m_library;
diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index 337ab8ba34245849f2a3646185741dd8cea38691..59bc87faa24b228ada7930a0964dc14851843a64 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -59,6 +59,66 @@ namespace Internal {
     enum { debug = 0 };
 }
 } // namespace Constants
+
+namespace Internal {
+
+enum DebuggerState
+{
+    DebuggerNotReady,          // Debugger not started
+
+    EngineStarting,            // Engine starts
+
+    AdapterStarting,
+    AdapterStarted,
+    AdapterStartFailed,
+    InferiorPreparing,
+    InferiorPrepared,
+    InferiorPreparationFailed,
+    InferiorStarting,
+    // InferiorStarted,    // That's either InferiorRunningRequested or InferiorStopped
+    InferiorStartFailed,
+
+    InferiorRunningRequested,   // Debuggee requested to run
+    InferiorRunning,            // Debuggee running
+
+    InferiorStopping,      // Debuggee running, stop requested
+    InferiorStopped,            // Debuggee stopped
+    InferiorStopFailed,            // Debuggee stopped
+
+    InferiorShuttingDown,
+    InferiorShutDown,
+    InferiorShutdownFailed,
+
+    AdapterShuttingDown,
+    //AdapterShutDown,  // use DebuggerNotReady
+    AdapterShutdownFailed,
+};
+
+enum DebuggerStartMode
+{
+    NoStartMode,
+    StartInternal,         // Start current start project's binary
+    StartExternal,         // Start binary found in file system
+    AttachExternal,        // Attach to running process by process id
+    AttachCrashedExternal, // Attach to crashed process by process id
+    AttachTcf,             // Attach to a running Target Communication Framework agent
+    AttachCore,            // Attach to a core file
+    StartRemote            // Start and attach to a remote process
+};
+
+enum LogChannel
+{
+    LogInput,   // Used for user input
+    LogOutput,
+    LogWarning,
+    LogError,
+    LogStatus,  // Used for status changed messages
+    LogTime,  // Used for time stamp messages
+    LogDebug,
+    LogMisc    
+};
+
+} // namespace Internal
 } // namespace Debugger
 
 #endif // DEBUGGERCONSTANTS_H
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 63b50dc4e4b70a02974ab31dde8d32e6ab4ccd81..07d991f71b6d8aa898a02cb735e45b044627a533 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -92,6 +92,48 @@
 #   define STATE_DEBUG(s)
 #endif
 
+// Note: the Debugger process itself is referred to as 'Debugger',
+// whereas the debugged process is referred to as 'Inferior'.
+//
+// 0 == DebuggerNotReady
+//          |
+//     EngineStarting
+//          |
+//     AdapterStarting --> AdapterStartFailed --> 0
+//          |
+//     AdapterStarted
+//          |
+//     InferiorStarting --> InferiorStartFailed --> 0
+//          |          |
+//          |          |
+//     InferiorStopped |
+//          |          |
+//          | <--------
+//          |  .------------------------------------.
+//          |  v                                    |
+//     InferiorRunningRequested                     |
+//          |                                       |
+//     InferiorRunning  --> 1 (normal exit)         |
+//          |                                       |
+//     InferiorStopping                             |
+//          |                                       |
+//     InferiorStopped --> 1                        |
+//          |                                       |
+//          `---------------------------------------'
+//          
+// 1 == InferiorShuttingDown  -> InferiorShutdownFailed
+//          |
+//     InferiorShutDown
+//          |
+//     AdapterShuttingDown  -> AdapterShutdownFailed --> 0
+//          |
+//          0
+//
+// Allowed actions:
+//    [R] :  Run
+//    [C] :  Continue
+//    [N] :  Step, Next
+
 namespace Debugger {
 namespace Internal {
 
@@ -134,21 +176,31 @@ static const QString tooltipIName = "tooltip";
 
 static const char *stateName(int s)
 {
+    #define SN(x) case x: return #x;
     switch (s) {
-    case DebuggerProcessNotReady:
-        return "DebuggerProcessNotReady";
-    case DebuggerProcessStartingUp:
-        return "DebuggerProcessStartingUp";
-    case DebuggerInferiorRunningRequested:
-        return "DebuggerInferiorRunningRequested";
-    case DebuggerInferiorRunning:
-        return "DebuggerInferiorRunning";
-    case DebuggerInferiorStopRequested:
-        return "DebuggerInferiorStopRequested";
-    case DebuggerInferiorStopped:
-        return "DebuggerInferiorStopped";
+        SN(DebuggerNotReady)
+        SN(EngineStarting)
+        SN(AdapterStarting)
+        SN(AdapterStarted)
+        SN(AdapterStartFailed)
+        SN(InferiorPreparing)
+        SN(InferiorPrepared)
+        SN(InferiorPreparationFailed)
+        SN(InferiorStarting)
+        SN(InferiorStartFailed)
+        SN(InferiorRunningRequested)
+        SN(InferiorRunning)
+        SN(InferiorStopping)
+        SN(InferiorStopped)
+        SN(InferiorStopFailed)
+        SN(InferiorShuttingDown)
+        SN(InferiorShutDown)
+        SN(InferiorShutdownFailed)
+        SN(AdapterShuttingDown)
+        SN(AdapterShutdownFailed)
     }
     return "<unknown>";
+    #undef SN
 }
 
 
@@ -214,7 +266,7 @@ DebuggerManager::~DebuggerManager()
 
 void DebuggerManager::init()
 {
-    m_status = -1;
+    m_state = DebuggerState(-1);
     m_busy = false;
 
     m_modulesHandler = 0;
@@ -443,7 +495,7 @@ void DebuggerManager::init()
     localsAndWatchers->setStretchFactor(2, 1);
     m_watchDock = m_mainWindow->addDockForWidget(localsAndWatchers);
 
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
 }
 
 QList<Core::IOptionsPage*> DebuggerManager::initializeEngines(unsigned enabledTypeFlags)
@@ -477,11 +529,6 @@ IDebuggerEngine *DebuggerManager::engine()
     return m_engine;
 }
 
-IDebuggerManagerAccessForEngines *DebuggerManager::engineInterface()
-{
-    return this;
-}
-
 void DebuggerManager::createNewDock(QWidget *widget)
 {
     QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow);
@@ -546,34 +593,22 @@ void DebuggerManager::showStatusMessage(const QString &msg, int timeout)
     }
 }
 
-void DebuggerManager::notifyInferiorStopRequested()
-{
-    setStatus(DebuggerInferiorStopRequested);
-    showStatusMessage(tr("Stop requested..."), 5000);
-}
-
 void DebuggerManager::notifyInferiorStopped()
 {
     resetLocation();
-    setStatus(DebuggerInferiorStopped);
+    setState(InferiorStopped);
     showStatusMessage(tr("Stopped."), 5000);
 }
 
-void DebuggerManager::notifyInferiorRunningRequested()
-{
-    setStatus(DebuggerInferiorRunningRequested);
-    showStatusMessage(tr("Running requested..."), 5000);
-}
-
 void DebuggerManager::notifyInferiorRunning()
 {
-    setStatus(DebuggerInferiorRunning);
+    setState(InferiorRunning);
     showStatusMessage(tr("Running..."), 5000);
 }
 
 void DebuggerManager::notifyInferiorExited()
 {
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
     showStatusMessage(tr("Exited."), 5000);
 }
 
@@ -649,9 +684,9 @@ void DebuggerManager::toggleBreakpoint(const QString &fileName, int lineNumber)
 {
     STATE_DEBUG(fileName << lineNumber);
     QTC_ASSERT(m_breakHandler, return);
-    if (status() != DebuggerInferiorRunning
-         && status() != DebuggerInferiorStopped
-         && status() != DebuggerProcessNotReady) {
+    if (state() != InferiorRunning
+         && state() != InferiorStopped
+         && state() != DebuggerNotReady) {
         showStatusMessage(tr("Changing breakpoint state requires either a "
             "fully running or fully stopped application."));
         return;
@@ -670,9 +705,9 @@ void DebuggerManager::toggleBreakpointEnabled(const QString &fileName, int lineN
 {
     STATE_DEBUG(fileName << lineNumber);
     QTC_ASSERT(m_breakHandler, return);
-    if (status() != DebuggerInferiorRunning
-         && status() != DebuggerInferiorStopped
-         && status() != DebuggerProcessNotReady) {
+    if (state() != InferiorRunning
+         && state() != InferiorStopped
+         && state() != DebuggerNotReady) {
         showStatusMessage(tr("Changing breakpoint state requires either a "
             "fully running or fully stopped application."));
         return;
@@ -862,7 +897,7 @@ void DebuggerManager::startNewDebugger(const DebuggerStartParametersPtr &sp)
 
     STATE_DEBUG(m_startParameters->executable << m_engine);
     setBusyCursor(false);
-    setStatus(DebuggerProcessStartingUp);
+    setState(EngineStarting);
     connect(m_engine, SIGNAL(startFailed()), this, SLOT(startFailed()));
     m_engine->startDebugger(m_startParameters);
 }
@@ -870,7 +905,7 @@ void DebuggerManager::startNewDebugger(const DebuggerStartParametersPtr &sp)
 void DebuggerManager::startFailed()
 {
     disconnect(m_engine, SIGNAL(startFailed()), this, SLOT(startFailed()));
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
     emit debuggingFinished();
 }
 
@@ -892,7 +927,7 @@ void DebuggerManager::exitDebugger()
     if (m_engine)
         m_engine->exitDebugger();
     cleanupViews();
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
     setBusyCursor(false);
     emit debuggingFinished();
 }
@@ -900,7 +935,7 @@ void DebuggerManager::exitDebugger()
 void DebuggerManager::notifyEngineFinished()
 {
     cleanupViews();
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
     setBusyCursor(false);
     emit debuggingFinished();
 }
@@ -1011,7 +1046,7 @@ void DebuggerManager::executeDebuggerCommand(const QString &command)
 void DebuggerManager::sessionLoaded()
 {
     cleanupViews();
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
     setBusyCursor(false);
     loadSessionData();
 }
@@ -1021,7 +1056,7 @@ void DebuggerManager::aboutToUnloadSession()
     cleanupViews();
     if (m_engine)
         m_engine->shutdown();
-    setStatus(DebuggerProcessNotReady);
+    setState(DebuggerNotReady);
     setBusyCursor(false);
 }
 
@@ -1094,79 +1129,6 @@ void DebuggerManager::breakByFunction(const QString &functionName)
     attemptBreakpointSynchronization();
 }
 
-static bool isAllowedTransition(int from, int to)
-{
-    return (from == -1)
-      || (from == DebuggerProcessNotReady && to == DebuggerProcessStartingUp)
-      || (from == DebuggerProcessStartingUp && to == DebuggerInferiorStopped)
-      || (from == DebuggerInferiorStopped && to == DebuggerInferiorRunningRequested)
-      || (from == DebuggerInferiorRunningRequested && to == DebuggerInferiorRunning)
-      || (from == DebuggerInferiorRunning && to == DebuggerInferiorStopRequested)
-      || (from == DebuggerInferiorRunning && to == DebuggerInferiorStopped)
-      || (from == DebuggerInferiorStopRequested && to == DebuggerInferiorStopped)
-      || (to == DebuggerProcessNotReady);
-}
-
-void DebuggerManager::setStatus(int status)
-{
-    STATE_DEBUG("STATUS CHANGE: FROM " << stateName(m_status)
-            << " TO " << stateName(status));
-
-    if (status == m_status)
-        return;
-
-    if (!isAllowedTransition(m_status, status)) {
-        const QString msg = QString::fromLatin1("%1: UNEXPECTED TRANSITION: %2 -> %3")
-            .arg(_(Q_FUNC_INFO), _(stateName(m_status)), _(stateName(status)));
-        qWarning("%s", qPrintable(msg));
-    }
-
-    m_status = status;
-
-    const bool started = status == DebuggerInferiorRunning
-        || status == DebuggerInferiorRunningRequested
-        || status == DebuggerInferiorStopRequested
-        || status == DebuggerInferiorStopped;
-
-    const bool running = status == DebuggerInferiorRunning;
-
-    const bool ready = status == DebuggerInferiorStopped
-            && m_startParameters->startMode != AttachCore;
-
-    STATE_DEBUG("STARTED: " << started << " RUNNING: " << running
-        << " READY: " << ready);
-
-    if (ready)
-        QApplication::alert(mainWindow(), 3000);
-
-    m_watchAction->setEnabled(ready);
-    m_breakAction->setEnabled(true);
-
-    bool interruptIsExit = !running;
-    if (interruptIsExit) {
-        m_stopAction->setIcon(QIcon(":/debugger/images/debugger_stop_small.png"));
-        m_stopAction->setText(tr("Stop Debugger"));
-    } else {
-        m_stopAction->setIcon(QIcon(":/debugger/images/debugger_interrupt_small.png"));
-        m_stopAction->setText(tr("Interrupt"));
-    }
-
-    m_stopAction->setEnabled(started);
-    m_resetAction->setEnabled(true);
-
-    m_stepAction->setEnabled(ready);
-    m_stepOutAction->setEnabled(ready);
-    m_runToLineAction->setEnabled(ready);
-    m_runToFunctionAction->setEnabled(ready);
-    m_jumpToLineAction->setEnabled(ready);
-    m_nextAction->setEnabled(ready);
-    //showStatusMessage(QString("started: %1, running: %2")
-    // .arg(started).arg(running));
-    emit statusChanged(m_status);
-    const bool notbusy = ready || status == DebuggerProcessNotReady;
-    setBusyCursor(!notbusy);
-}
-
 void DebuggerManager::setBusyCursor(bool busy)
 {
     //STATE_DEBUG("BUSY FROM: " << m_busy << " TO: " << m_busy);
@@ -1207,14 +1169,13 @@ void DebuggerManager::detachDebugger()
 
 void DebuggerManager::interruptDebuggingRequest()
 {
-    STATE_DEBUG(status());
+    STATE_DEBUG(state());
     if (!m_engine)
         return;
-    bool interruptIsExit = (status() != DebuggerInferiorRunning);
-    if (interruptIsExit)
+    bool interruptIsExit = (state() != InferiorRunning);
+    if (interruptIsExit) {
         exitDebugger();
-    else {
-        setStatus(DebuggerInferiorStopRequested);
+    } else {
         m_engine->interruptInferior();
     }
 }
@@ -1483,6 +1444,158 @@ void DebuggerManager::showMessageBox(int icon,
     mb->show();
 }
 
+DebuggerState DebuggerManager::state() const
+{
+    return m_state;
+}
+
+static bool isAllowedTransition(int from, int to)
+{
+    switch (from) {
+    case -1:
+        return to == DebuggerNotReady;
+
+    case DebuggerNotReady:
+        return to == EngineStarting || to == DebuggerNotReady;
+
+    case EngineStarting:
+        return to == AdapterStarting || to == DebuggerNotReady;
+
+    case AdapterStarting:
+        return to == AdapterStarted || to == AdapterStartFailed;
+    case AdapterStarted:
+        return to == InferiorPreparing;
+    case AdapterStartFailed:
+        return to == DebuggerNotReady;
+
+    case InferiorPreparing:
+        return to == InferiorPrepared || to == InferiorPreparationFailed;
+    case InferiorPrepared:
+        return to == InferiorStarting;
+    case InferiorPreparationFailed:
+        return to == DebuggerNotReady;
+
+    case InferiorStarting:
+        return to == InferiorRunningRequested || to == InferiorStopped
+            || to == InferiorStartFailed;
+    case InferiorStartFailed:
+        return to == DebuggerNotReady;
+
+    case InferiorRunningRequested:
+        return to == InferiorRunning;
+    case InferiorRunning:
+        return to == InferiorStopping || to == InferiorShuttingDown;
+
+    case InferiorStopping:
+        return to == InferiorStopped || to == InferiorStopFailed;
+    case InferiorStopped:
+        return to == InferiorRunningRequested || to == InferiorShuttingDown;
+    case InferiorStopFailed:
+        return to == DebuggerNotReady;
+
+    case InferiorShuttingDown:
+        return to == InferiorShutDown || to == InferiorShutdownFailed;
+    case InferiorShutDown:
+        return to == AdapterShuttingDown;
+
+    case AdapterShuttingDown:
+        return to == DebuggerNotReady;
+
+    default:
+        qDebug() << "UNKNOWN STATE: " << from;
+    }
+    return false;
+}
+
+void DebuggerManager::setState(DebuggerState state)
+{
+    //STATE_DEBUG("STATUS CHANGE: FROM " << stateName(m_state)
+    //        << " TO " << stateName(state));
+
+    QString msg = _("State changed from %1(%2) to %3(%4).")
+        .arg(stateName(m_state)).arg(m_state).arg(stateName(state)).arg(state);
+    qDebug() << msg;
+    if (!isAllowedTransition(m_state, state))
+        qDebug() << "UNEXPECTED STATE TRANSITION: " << msg;
+
+    showDebuggerOutput(LogDebug, msg);
+
+    resetLocation();
+    if (state == m_state)
+        return;
+
+    m_state = state;
+
+    if (m_state == InferiorStopped)
+        resetLocation();
+
+    const bool started = state == InferiorRunning
+        || state == InferiorRunningRequested
+        || state == InferiorStopping
+        || state == InferiorStopped;
+
+    const bool running = state == InferiorRunning;
+
+    const bool ready = state == InferiorStopped
+            && m_startParameters->startMode != AttachCore;
+
+    if (ready)
+        QApplication::alert(mainWindow(), 3000);
+
+    m_watchAction->setEnabled(ready);
+    m_breakAction->setEnabled(true);
+
+    bool interruptIsExit = !running;
+    if (interruptIsExit) {
+        m_stopAction->setIcon(QIcon(":/debugger/images/debugger_stop_small.png"));
+        m_stopAction->setText(tr("Stop Debugger"));
+    } else {
+        m_stopAction->setIcon(QIcon(":/debugger/images/debugger_interrupt_small.png"));
+        m_stopAction->setText(tr("Interrupt"));
+    }
+
+    m_stopAction->setEnabled(started);
+    m_resetAction->setEnabled(true);
+
+    m_stepAction->setEnabled(ready);
+    m_stepOutAction->setEnabled(ready);
+    m_runToLineAction->setEnabled(ready);
+    m_runToFunctionAction->setEnabled(ready);
+    m_jumpToLineAction->setEnabled(ready);
+    m_nextAction->setEnabled(ready);
+    //showStatusMessage(QString("started: %1, running: %2")
+    // .arg(started).arg(running));
+    emit stateChanged(m_state);
+    const bool notbusy = ready || state == DebuggerNotReady;
+    setBusyCursor(!notbusy);
+}
+
+QDebug operator<<(QDebug d, DebuggerState state)
+{
+    return d << stateName(state) << '(' << int(state) << ')';
+}
+
+//////////////////////////////////////////////////////////////////////
+//
+// AbstractDebuggerEngine
+//
+//////////////////////////////////////////////////////////////////////
+
+void IDebuggerEngine::showStatusMessage(const QString &msg, int timeout)
+{
+    m_manager->showStatusMessage(msg, timeout);
+}
+
+DebuggerState IDebuggerEngine::state() const
+{
+    return m_manager->state();
+}
+
+void IDebuggerEngine::setState(DebuggerState state)
+{
+    m_manager->setState(state);
+}
+
 //////////////////////////////////////////////////////////////////////
 //
 // Testing
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 4f68df9c8f9c4de0f41dc72a5cfa937c95db0c98..889904d129067a1255e05f6079bce28d1b8f226a 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -30,6 +30,8 @@
 #ifndef DEBUGGER_DEBUGGERMANAGER_H
 #define DEBUGGER_DEBUGGERMANAGER_H
 
+#include "debuggerconstants.h"
+
 #include <utils/fancymainwindow.h>
 
 #include <QtCore/QByteArray>
@@ -84,64 +86,6 @@ class ThreadsHandler;
 class WatchData;
 class WatchHandler;
 
-// Note: the Debugger process itself is referred to as 'Debugger',
-// whereas the debugged process is referred to as 'Inferior' or 'Debuggee'.
-
-//     DebuggerProcessNotReady
-//          |
-//     DebuggerProcessStartingUp
-//          | <-------------------------------------.
-//     DebuggerInferiorRunningRequested             |
-//          |                                       |
-//     DebuggerInferiorRunning                      |
-//          |                                       |
-//     DebuggerInferiorStopRequested                |
-//          |                                       |
-//     DebuggerInferiorStopped                      |
-//          |                                       |
-//          `---------------------------------------'
-//
-// Allowed actions:
-//    [R] :  Run
-//    [C] :  Continue
-//    [N] :  Step, Next
-
-
-enum DebuggerStatus
-{
-    DebuggerProcessNotReady,          // Debugger not started
-    DebuggerProcessStartingUp,        // Debugger starting up
-
-    DebuggerInferiorRunningRequested, // Debuggee requested to run
-    DebuggerInferiorRunning,          // Debuggee running
-    DebuggerInferiorStopRequested,    // Debuggee running, stop requested
-    DebuggerInferiorStopped,          // Debuggee stopped
-};
-
-enum DebuggerStartMode
-{
-    NoStartMode,
-    StartInternal,         // Start current start project's binary
-    StartExternal,         // Start binary found in file system
-    AttachExternal,        // Attach to running process by process id
-    AttachCrashedExternal, // Attach to crashed process by process id
-    AttachTcf,             // Attach to a running Target Communication Framework agent
-    AttachCore,            // Attach to a core file
-    StartRemote            // Start and attach to a remote process
-};
-
-enum LogChannel
-{
-    LogInput,   // Used for user input
-    LogOutput,
-    LogWarning,
-    LogError,
-    LogStatus,  // Used for status changed messages
-    LogTime,  // Used for time stamp messages
-    LogDebug,
-    LogMisc    
-};
-
 class DebuggerStartParameters
 {
 public:
@@ -190,26 +134,19 @@ enum DebuggerEngineTypeFlags
         | TcfEngineType
 };
 
-// The construct below is not nice but enforces a bit of order. The
-// DebuggerManager interfaces a lots of thing: The DebuggerPlugin,
-// the DebuggerEngines, the RunMode, the handlers and views.
-// Instead of making the whole interface public, we split in into
-// smaller parts and grant friend access only to the classes that
-// need it.
-
+QDebug operator<<(QDebug d, DebuggerState state);
 
 //
-// IDebuggerManagerAccessForEngines
+// DebuggerManager
 //
 
-class IDebuggerManagerAccessForEngines
+class DebuggerManager : public QObject
 {
-public:
-    virtual ~IDebuggerManagerAccessForEngines() {}
+    Q_OBJECT
 
-private:
-    // This is the part of the interface that's exclusively seen by the
-    // debugger engines
+public:
+    DebuggerManager();
+    ~DebuggerManager();
 
     friend class CdbDebugEngine;
     friend class CdbDebugEventCallback;
@@ -220,58 +157,8 @@ private:
     friend class TcfEngine;
     friend struct CdbDebugEnginePrivate;
 
-    // called from the engines after successful startup
-    virtual void notifyInferiorStopRequested() = 0;
-    virtual void notifyInferiorStopped() = 0;
-    virtual void notifyInferiorRunningRequested() = 0;
-    virtual void notifyInferiorRunning() = 0;
-    virtual void notifyInferiorExited() = 0;
-    virtual void notifyInferiorPidChanged(qint64) = 0;
-    virtual void notifyEngineFinished() {} // FIXME: make pure
-
-    virtual ModulesHandler *modulesHandler() = 0;
-    virtual BreakHandler *breakHandler() = 0;
-    virtual RegisterHandler *registerHandler() = 0;
-    virtual StackHandler *stackHandler() = 0;
-    virtual ThreadsHandler *threadsHandler() = 0;
-    virtual WatchHandler *watchHandler() = 0;
-    virtual SourceFilesWindow *sourceFileWindow() = 0;
-
-    virtual void showApplicationOutput(const QString &data) = 0;
-    virtual void showDebuggerOutput(int channel, const QString &msg) = 0;
-    virtual void showDebuggerInput(int channel, const QString &msg) = 0;
-
-    virtual void reloadModules() = 0;
-    virtual void reloadSourceFiles() = 0;
-    virtual void reloadRegisters() = 0;
-
-    virtual bool qtDumperLibraryEnabled() const = 0;
-    virtual QString qtDumperLibraryName() const = 0;
-    virtual QStringList qtDumperLibraryLocations() const = 0;
-    virtual void showQtDumperLibraryWarning(const QString &details = QString()) = 0;
-    virtual bool isReverseDebugging() const = 0;
-
-    virtual qint64 inferiorPid() const = 0;
-
-    virtual DebuggerStartParametersPtr startParameters() const = 0;
-};
-
-
-//
-// DebuggerManager
-//
-
-class DebuggerManager : public QObject, public IDebuggerManagerAccessForEngines
-{
-    Q_OBJECT
-
-public:
-    DebuggerManager();
     QList<Core::IOptionsPage*> initializeEngines(unsigned enabledTypeFlags);
 
-    ~DebuggerManager();
-
-    IDebuggerManagerAccessForEngines *engineInterface();
     Core::Utils::FancyMainWindow *mainWindow() const { return m_mainWindow; }
     QLabel *statusLabel() const { return m_statusLabel; }
     IDebuggerEngine *currentEngine() const { return m_engine; }
@@ -349,7 +236,6 @@ private slots:
 
     void reloadRegisters();
     void registerDockToggled(bool on);
-    void setStatus(int status);
     void clearStatusMessage();
     void attemptBreakpointSynchronization();
     void reloadFullStack();
@@ -357,9 +243,6 @@ private slots:
     void startFailed();
 
 private:
-    //
-    // Implementation of IDebuggerManagerAccessForEngines
-    //
     ModulesHandler *modulesHandler() { return m_modulesHandler; }
     BreakHandler *breakHandler() { return m_breakHandler; }
     RegisterHandler *registerHandler() { return m_registerHandler; }
@@ -370,8 +253,6 @@ private:
     QWidget *threadsWindow() const { return m_threadsWindow; }
 
     void notifyInferiorStopped();
-    void notifyInferiorRunningRequested();
-    void notifyInferiorStopRequested();
     void notifyInferiorRunning();
     void notifyInferiorExited();
     void notifyInferiorPidChanged(qint64);
@@ -379,6 +260,10 @@ private:
 
     void cleanupViews();
 
+    DebuggerState state() const;
+    void setState(DebuggerState state);
+    DebuggerState m_state;
+
     //
     // internal implementation
     //
@@ -402,7 +287,7 @@ public:
 signals:
     void debuggingFinished();
     void inferiorPidChanged(qint64 pid);
-    void statusChanged(int newstatus);
+    void stateChanged(int newstatus);
     void debugModeRequested();
     void previousModeRequested();
     void statusMessageRequested(const QString &msg, int timeout); // -1 for 'forever'
@@ -425,7 +310,8 @@ private:
     void toggleBreakpoint(const QString &fileName, int lineNumber);
     void toggleBreakpointEnabled(const QString &fileName, int lineNumber);
     BreakpointData *findBreakpoint(const QString &fileName, int lineNumber);
-    void setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos);
+    void setToolTipExpression(const QPoint &mousePos,
+        TextEditor::ITextEditor *editor, int cursorPos);
 
     // FIXME: Remove engine-specific state
     DebuggerStartParametersPtr m_startParameters;
@@ -454,6 +340,7 @@ private:
 
     /// Actions
     friend class DebuggerPlugin;
+    friend class IDebuggerEngine;
     QAction *m_continueAction;
     QAction *m_stopAction;
     QAction *m_resetAction; // FIXME: Should not be needed in a stable release
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index d8c203f22e2390eb8386eb7ce9b1452a99b05f28..6414c4e6e6f40cd834eb59e767d1db7a2cfbfcab 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -887,8 +887,8 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
         this, SLOT(resetLocation()));
     connect(m_manager, SIGNAL(gotoLocationRequested(StackFrame,bool)),
         this, SLOT(gotoLocation(StackFrame,bool)));
-    connect(m_manager, SIGNAL(statusChanged(int)),
-        this, SLOT(changeStatus(int)));
+    connect(m_manager, SIGNAL(stateChanged(int)),
+        this, SLOT(handleStateChanged(int)));
     connect(m_manager, SIGNAL(previousModeRequested()),
         this, SLOT(activatePreviousMode()));
     connect(m_manager, SIGNAL(debugModeRequested()),
@@ -1040,7 +1040,7 @@ void DebuggerPlugin::showToolTip(TextEditor::ITextEditor *editor,
     const QPoint &point, int pos)
 {
     if (!theDebuggerBoolSetting(UseToolTipsInMainEditor)
-            || m_manager->status() == DebuggerProcessNotReady)
+            || m_manager->state() == DebuggerNotReady)
         return;
 
     m_manager->setToolTipExpression(point, editor, pos);
@@ -1111,9 +1111,9 @@ void DebuggerPlugin::gotoLocation(const StackFrame &frame, bool setMarker)
     }
 }
 
-void DebuggerPlugin::changeStatus(int status)
+void DebuggerPlugin::handleStateChanged(int state)
 {
-    const bool startIsContinue = (status == DebuggerInferiorStopped);
+    const bool startIsContinue = (state == InferiorStopped);
     ICore *core = ICore::instance();
     if (startIsContinue) {
         core->addAdditionalContext(m_gdbRunningContext);
@@ -1123,15 +1123,15 @@ void DebuggerPlugin::changeStatus(int status)
         core->updateContext();
     }
 
-    const bool started = status == DebuggerInferiorRunning
-        || status == DebuggerInferiorRunningRequested
-        || status == DebuggerInferiorStopRequested
-        || status == DebuggerInferiorStopped;
+    const bool started = state == InferiorRunning
+        || state == InferiorRunningRequested
+        || state == InferiorStopping
+        || state == InferiorStopped;
 
-    const bool starting = status == DebuggerProcessStartingUp;
-    //const bool running = status == DebuggerInferiorRunning;
+    const bool starting = state == EngineStarting;
+    //const bool running = state == InferiorRunning;
 
-    const bool ready = status == DebuggerInferiorStopped
+    const bool ready = state == InferiorStopped
             && m_manager->startParameters()->startMode != AttachCore;
 
     m_startExternalAction->setEnabled(!started && !starting);
diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h
index 1beefb5631916c624b599ab735200fbf61929e2c..fb0e69b3012f9885c33d70f4fc4138ce2dcf9996 100644
--- a/src/plugins/debugger/debuggerplugin.h
+++ b/src/plugins/debugger/debuggerplugin.h
@@ -85,7 +85,7 @@ private slots:
     void queryCurrentTextEditor(QString *fileName, int *line, QObject **object);
     void editorOpened(Core::IEditor *);
     void editorAboutToClose(Core::IEditor *);
-    void changeStatus(int status);
+    void handleStateChanged(int state);
     void requestMark(TextEditor::ITextEditor *editor, int lineNumber);
     void showToolTip(TextEditor::ITextEditor *editor, const QPoint &pnt, int pos);
     void querySessionValue(const QString &name, QVariant *value);
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index ac5e9fecc91fe06d6537b395220307fa5c1b9c87..04f42ec75d57d40229f4d734009010aab549128a 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -88,9 +88,10 @@ signals:
     void readyReadStandardError();
 
 protected:
-    GdbAdapterState state() const
+    DebuggerState state() const
         { return m_engine->state(); }
-    void setState(GdbAdapterState state);
+    void setState(DebuggerState state)
+        { m_engine->setState(state); }
     const DebuggerStartParameters &startParameters() const
         { return m_engine->startParameters(); }
     void debugMessage(const QString &msg) const
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp
index 4350fc9cee27a6ca39e9fff7d233fe8bdd82d0ab..ad148f2289af8a2968ea1a1607527b5515a30946 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp
@@ -54,7 +54,7 @@ namespace Internal {
 AttachGdbAdapter::AttachGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
     connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
         this, SIGNAL(error(QProcess::ProcessError)));
     connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
@@ -69,7 +69,7 @@ AttachGdbAdapter::AttachGdbAdapter(GdbEngine *engine, QObject *parent)
 
 void AttachGdbAdapter::startAdapter()
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == EngineStarting, qDebug() << state());
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
 
@@ -125,16 +125,22 @@ void AttachGdbAdapter::handleAttach(const GdbResponse &response)
 
 void AttachGdbAdapter::startInferior()
 {
-    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
-    setState(InferiorStarting);
+    QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
+#if 0
+    // continue on attach
+    setState(InferiorRunningRequested);
     m_engine->postCommand(_("-exec-continue"), CB(handleContinue));
+#else
+    setState(InferiorStopped);
+    emit inferiorStarted();
+#endif
 }
 
 void AttachGdbAdapter::handleContinue(const GdbResponse &response)
 {
     QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
     if (response.resultClass == GdbResultRunning) {
-        setState(InferiorStarted);
+        setState(InferiorRunning);
         emit inferiorStarted();
     } else {
         QTC_ASSERT(response.resultClass == GdbResultError, /**/);
@@ -154,18 +160,21 @@ void AttachGdbAdapter::interruptInferior()
 
 void AttachGdbAdapter::shutdown()
 {
-    if (state() == InferiorStarted) {
+    switch (state()) {
+    
+    case InferiorStopped:
         setState(InferiorShuttingDown);
         m_engine->postCommand(_("detach"), CB(handleDetach));
         return;
-    }
 
-    if (state() == InferiorShutDown) {
+    case InferiorShutDown:
         setState(AdapterShuttingDown);
         m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
         return;
+
+    default:
+        QTC_ASSERT(false, qDebug() << state());
     }
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
 }
 
 void AttachGdbAdapter::handleDetach(const GdbResponse &response)
@@ -196,7 +205,7 @@ void AttachGdbAdapter::handleExit(const GdbResponse &response)
 void AttachGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus)
 {
     debugMessage(_("GDB PROESS FINISHED"));
-    setState(AdapterNotRunning);
+    setState(DebuggerNotReady);
     emit adapterShutDown();
 }
 
diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp
index e5934704726d3d733d084621ca50750819b82214..dd6b961c091aec81f0554a8ea55974b2069d1587 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.cpp
+++ b/src/plugins/debugger/gdb/coregdbadapter.cpp
@@ -54,7 +54,7 @@ namespace Internal {
 CoreGdbAdapter::CoreGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
     connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
         this, SIGNAL(error(QProcess::ProcessError)));
     connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
@@ -69,7 +69,7 @@ CoreGdbAdapter::CoreGdbAdapter(GdbEngine *engine, QObject *parent)
 
 void CoreGdbAdapter::startAdapter()
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == EngineStarting, qDebug() << state());
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
 
@@ -129,8 +129,7 @@ void CoreGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
 
 void CoreGdbAdapter::startInferior()
 {
-    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
-    setState(InferiorStarting);
+    QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
     QFileInfo fi(startParameters().executable);
     QString fileName = _c('"') + fi.absoluteFilePath() + _c('"');
     QFileInfo fi2(startParameters().coreFile);
@@ -143,7 +142,7 @@ void CoreGdbAdapter::handleTargetCore(const GdbResponse &response)
 {
     QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
     if (response.resultClass == GdbResultDone) {
-        setState(InferiorStarted);
+        setState(InferiorStopped);
         emit inferiorStarted();
         m_engine->updateAll();
     } else {
@@ -162,12 +161,12 @@ void CoreGdbAdapter::interruptInferior()
 
 void CoreGdbAdapter::shutdown()
 {
-    if (state() == InferiorStarted || state() == InferiorShutDown) {
+    if (state() == InferiorStopped || state() == InferiorShutDown) {
         setState(AdapterShuttingDown);
         m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
         return;
     }
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
 }
 
 void CoreGdbAdapter::handleExit(const GdbResponse &response)
@@ -184,7 +183,7 @@ void CoreGdbAdapter::handleExit(const GdbResponse &response)
 void CoreGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus)
 {
     debugMessage(_("GDB PROESS FINISHED"));
-    setState(AdapterNotRunning);
+    setState(DebuggerNotReady);
     emit adapterShutDown();
 }
 
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 4e94892bcbde43d19f634b7416e0826bf7cb2813..55dbc918ed58dda5c52d36bea318c25124bc7dca 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -106,13 +106,16 @@ namespace Internal {
 #define STRINGIFY(x) STRINGIFY_INTERNAL(x)
 #define CB(callback) &GdbEngine::callback, STRINGIFY(callback)
 
-static bool stateAcceptsGdbCommands(GdbAdapterState state)
+static bool stateAcceptsGdbCommands(DebuggerState state)
 {
     return state == AdapterStarted
         || state == InferiorPreparing
         || state == InferiorPrepared
         || state == InferiorStarting
-        || state == InferiorStarted
+        || state == InferiorRunningRequested
+        || state == InferiorRunning
+        || state == InferiorStopping
+        || state == InferiorStopped
         || state == InferiorShuttingDown
         || state == InferiorShutDown
         || state == AdapterShuttingDown;
@@ -166,17 +169,15 @@ static QByteArray parsePlainConsoleStream(const GdbResponse &response)
 //
 ///////////////////////////////////////////////////////////////////////
 
-GdbEngine::GdbEngine(DebuggerManager *parent) :
+GdbEngine::GdbEngine(DebuggerManager *manager) :
+    IDebuggerEngine(manager),
 #ifdef Q_OS_WIN // Do injection loading with MinGW (call loading does not work with 64bit)
-    m_dumperInjectionLoad(true),
+    m_dumperInjectionLoad(true)
 #else
-    m_dumperInjectionLoad(false),
+    m_dumperInjectionLoad(false)
 #endif
-    m_manager(parent),
-    qq(parent->engineInterface())
 {
     m_gdbAdapter = 0;
-    m_state = AdapterNotRunning;
     QSharedPointer<TrkOptions> options(new TrkOptions);
     options->fromSettings(Core::ICore::instance()->settings());
     m_plainAdapter = new PlainGdbAdapter(this);
@@ -551,7 +552,7 @@ void GdbEngine::handleResponse(const QByteArray &buff)
             // On Windows, the contents seem to depend on the debugger
             // version and/or OS version used.
             if (data.startsWith("warning:"))
-                qq->showApplicationOutput(_(data.mid(9))); // cut "warning: "
+                manager()->showApplicationOutput(_(data.mid(9))); // cut "warning: "
             break;
         }
 
@@ -657,15 +658,17 @@ void GdbEngine::readGdbStandardOutput()
 
 void GdbEngine::interruptInferior()
 {
-//    debugMessage(_("GDBENGINE INTERRUPT INFERIOR: %1").arg(m_gdbAdapter->state()));
-    qq->notifyInferiorStopRequested();
+    QTC_ASSERT(state() == InferiorRunning, qDebug() << state());
 
-    if (state() == AdapterNotRunning) {
+    if (state() == DebuggerNotReady) {
         debugMessage(_("TRYING TO INTERRUPT INFERIOR WITHOUT RUNNING GDB"));
         shutdown();
         return;
     }
 
+    setState(InferiorStopping);
+    showStatusMessage(tr("Stop requested..."), 5000);
+
     debugMessage(_("TRYING TO INTERUPT INFERIOR"));
     m_gdbAdapter->interruptInferior();
 }
@@ -681,7 +684,7 @@ void GdbEngine::maybeHandleInferiorPidChanged(const QString &pid0)
         return;
     debugMessage(_("FOUND PID %1").arg(pid));    
 
-    qq->notifyInferiorPidChanged(pid);
+    manager()->notifyInferiorPidChanged(pid);
     if (m_dumperInjectionLoad)
         tryLoadDebuggingHelpers();
 }
@@ -727,6 +730,8 @@ void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags,
 void GdbEngine::postCommandHelper(const GdbCommand &cmd)
 {
     if (!stateAcceptsGdbCommands(state())) {
+        qDebug() << _("NO GDB PROCESS RUNNING, CMD IGNORED: ") << cmd.command
+            << state();
         PENDING_DEBUG(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command);
         debugMessage(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command);
         return;
@@ -743,15 +748,20 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd)
             << m_gdbAdapter->state());
     }
 
-    if ((cmd.flags & NeedsStop) && status() != DebuggerInferiorStopped
-            && status() != DebuggerProcessStartingUp) {
-        // queue the commands that we cannot send at once
-        QTC_ASSERT(status() == DebuggerInferiorRunning,
-            qDebug() << "STATUS:" << status());
-        showStatusMessage(tr("Stopping temporarily."));
-        debugMessage(_("QUEUING COMMAND ") + cmd.command);
-        m_commandsToRunOnTemporaryBreak.append(cmd);
-        interruptInferior();
+    if (cmd.flags & NeedsStop) {
+        if (state() == InferiorStopped
+            || state() == EngineStarting
+            || state() == InferiorPrepared) {
+            // Can be safely sent now.
+            flushCommand(cmd);
+        } else {
+            // Queue the commands that we cannot send at once.
+            showStatusMessage(tr("Stopping temporarily."), 1000);
+            qDebug() << _("QUEUING COMMAND ") + cmd.command;
+            debugMessage(_("QUEUING COMMAND ") + cmd.command);
+            m_commandsToRunOnTemporaryBreak.append(cmd);
+            interruptInferior();
+        }
     } else if (!cmd.command.isEmpty()) {
         flushCommand(cmd);
     }
@@ -760,7 +770,7 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd)
 void GdbEngine::flushCommand(const GdbCommand &cmd0)
 {
     GdbCommand cmd = cmd0;
-    if (state() == AdapterNotRunning) {
+    if (state() == DebuggerNotReady) {
         emit gdbInputAvailable(LogInput, cmd.command);
         debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command);
         return;
@@ -863,7 +873,7 @@ void GdbEngine::handleResultRecord(const GdbResponse &response)
 
 void GdbEngine::executeDebuggerCommand(const QString &command)
 {
-    if (state() == AdapterNotRunning) {
+    if (state() == DebuggerNotReady) {
         debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + command);
         return;
     }
@@ -874,16 +884,15 @@ void GdbEngine::executeDebuggerCommand(const QString &command)
 // called from CoreAdapter and AttachAdapter
 void GdbEngine::updateAll()
 {
-    qq->notifyInferiorStopped();
-    showStatusMessage(tr("Core file loaded."));
-    m_manager->resetLocation();
+    QTC_ASSERT(state() == InferiorStopped, /**/);
+    manager()->resetLocation();
     tryLoadDebuggingHelpers();
-    qq->stackHandler()->setCurrentIndex(0);
+    manager()->stackHandler()->setCurrentIndex(0);
     updateLocals(); 
     reloadStack();
     if (supportsThreads())
         postCommand(_("-thread-list-ids"), WatchUpdate, CB(handleStackListThreads), 0);
-    qq->reloadRegisters();
+    manager()->reloadRegisters();
 }
 
 void GdbEngine::handleQuerySources(const GdbResponse &response)
@@ -908,7 +917,7 @@ void GdbEngine::handleQuerySources(const GdbResponse &response)
             }
         }
         if (m_shortToFullName != oldShortToFull)
-            qq->sourceFileWindow()->setSourceFiles(m_shortToFullName);
+            manager()->sourceFileWindow()->setSourceFiles(m_shortToFullName);
     }
 }
 
@@ -973,7 +982,7 @@ void GdbEngine::handleExecJumpToLine(const GdbResponse &response)
     // ~"run1 (argc=1, argv=0x7fffb213a478) at test1.cpp:242"
     // ~"242\t x *= 2;"
     //109^done"
-    qq->notifyInferiorStopped();
+    setState(InferiorStopped);
     showStatusMessage(tr("Jumped. Stopped."));
     QByteArray output = response.data.findChild("logstreamoutput").data();
     if (output.isEmpty())
@@ -998,8 +1007,8 @@ void GdbEngine::handleExecRunToFunction(const GdbResponse &response)
     // 14*stopped,thread-id="1",frame={addr="0x0000000000403ce4",
     // func="foo",args=[{name="str",value="@0x7fff0f450460"}],
     // file="main.cpp",fullname="/tmp/g/main.cpp",line="37"}
-    qq->notifyInferiorStopped();
-    showStatusMessage(tr("Run to Function finished. Stopped."));
+    setState(InferiorStopped);
+    showStatusMessage(tr("Function reached. Stopped."));
     GdbMi frame = response.data.findChild("frame");
     StackFrame f;
     f.file = QString::fromLocal8Bit(frame.findChild("fullname").data());
@@ -1079,11 +1088,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
     const QByteArray reason = data.findChild("reason").data();
 
     if (isExitedReason(reason)) {
-        // Give adapter a chance to take notice of regular exits.
-        QTC_ASSERT(state() == InferiorStarted, /**/);
-        setState(InferiorShuttingDown);
-        setState(InferiorShutDown);
-
+        QTC_ASSERT(state() == InferiorRunning, /**/);
         QString msg;
         if (reason == "exited") {
             msg = tr("Program exited with exit code %1.")
@@ -1095,14 +1100,16 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
             msg = tr("Program exited normally.");
         }
         showStatusMessage(msg);
+        setState(InferiorShuttingDown);
+        setState(InferiorShutDown);
         shutdown();
         return;
     }
 
     if (!m_commandsToRunOnTemporaryBreak.isEmpty()) {
-        QTC_ASSERT(status() == DebuggerInferiorStopRequested,
-            qDebug() << "STATUS:" << status())
-        qq->notifyInferiorStopped();
+        QTC_ASSERT(state() == InferiorStopping, qDebug() << state())
+        setState(InferiorStopped);
+        showStatusMessage(tr("Stopped."), 5000);
         // FIXME: racy
         while (!m_commandsToRunOnTemporaryBreak.isEmpty()) {
             GdbCommand cmd = m_commandsToRunOnTemporaryBreak.takeFirst();
@@ -1110,8 +1117,9 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
                 .arg(cmd.command).arg(_(cmd.callbackName)));
             flushCommand(cmd);
         }
-        showStatusMessage(tr("Processing queued commands."));
-// FIXME:        m_continuationAfterDone = true;
+        showStatusMessage(tr("Processing queued commands."), 1000);
+        QTC_ASSERT(m_continuationAfterDone == 0, /**/);
+        m_continuationAfterDone = &GdbEngine::continueInferior;
         return;
     }
 
@@ -1199,8 +1207,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
     // MAC yields sometimes:
     // >3661*stopped,time={wallclock="0.00658",user="0.00142",
     // system="0.00136",start="1218810678.805432",end="1218810678.812011"}
-    m_manager->resetLocation();
-    qq->notifyInferiorStopped();
+    setState(InferiorStopped);
     showStatusMessage(tr("Run to Function finished. Stopped."));
     GdbMi frame = data.findChild("frame");
     StackFrame f;
@@ -1303,7 +1310,8 @@ void GdbEngine::handleStop2(const GdbResponse &response)
 
 void GdbEngine::handleStop2(const GdbMi &data)
 {
-    qq->notifyInferiorStopped();
+    setState(InferiorStopped);
+    showStatusMessage(tr("Stopped."), 5000);
 
     // Sometimes we get some interesting extra information. Grab it.
     GdbMi frame = data.findChild("frame");
@@ -1330,7 +1338,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
     //
     // Stack
     //
-    qq->stackHandler()->setCurrentIndex(0);
+    manager()->stackHandler()->setCurrentIndex(0);
     updateLocals(); // Quick shot
 
     reloadStack();
@@ -1344,7 +1352,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
     //
     // Registers
     //
-    qq->reloadRegisters();
+    manager()->reloadRegisters();
 }
 
 void GdbEngine::handleShowVersion(const GdbResponse &response)
@@ -1394,7 +1402,7 @@ void GdbEngine::handleFileExecAndSymbols(const GdbResponse &response)
     } else if (response.resultClass == GdbResultError) {
         QString msg = __(response.data.findChild("msg").data());
         showMessageBox(QMessageBox::Critical, tr("Starting executable failed"), msg);
-        QTC_ASSERT(status() == DebuggerInferiorRunning, /**/);
+        QTC_ASSERT(state() == InferiorRunning, /**/);
         //interruptInferior();
         shutdown();
     }
@@ -1402,20 +1410,23 @@ void GdbEngine::handleFileExecAndSymbols(const GdbResponse &response)
 
 void GdbEngine::handleExecContinue(const GdbResponse &response)
 {
+    QTC_ASSERT(state() == InferiorRunningRequested, /**/);
     if (response.resultClass == GdbResultRunning) {
-        qq->notifyInferiorRunning();
+        setState(InferiorRunning);
+        showStatusMessage(tr("Running..."), 5000);
     } else {
         QTC_ASSERT(response.resultClass == GdbResultError, /**/);
         const QByteArray &msg = response.data.findChild("msg").data();
         if (msg == "Cannot find bounds of current function") {
-            qq->notifyInferiorStopped();
+            setState(InferiorStopped);
+            showStatusMessage(tr("Stopped."), 5000);
             //showStatusMessage(tr("No debug information available. "
             //  "Leaving function..."));
             //stepOutExec();
         } else {
             showMessageBox(QMessageBox::Critical, tr("Error"),
                 tr("Starting executable failed:\n") + QString::fromLocal8Bit(msg));
-            QTC_ASSERT(status() == DebuggerInferiorRunning, /**/);
+            QTC_ASSERT(state() == InferiorRunning, /**/);
             shutdown();
         }
     }
@@ -1481,11 +1492,12 @@ void GdbEngine::exitDebugger() // called from the manager
 
 int GdbEngine::currentFrame() const
 {
-    return qq->stackHandler()->currentIndex();
+    return manager()->stackHandler()->currentIndex();
 }
 
 void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp)
 {
+    QTC_ASSERT(state() == EngineStarting, qDebug() << state());
     // This should be set by the constructor or in exitDebugger() 
     // via initializeVariables()
     //QTC_ASSERT(m_debuggingHelperState == DebuggingHelperUninitialized,
@@ -1556,52 +1568,21 @@ void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp)
 
 void GdbEngine::continueInferior()
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     m_manager->resetLocation();
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Running requested..."), 5000);
     postCommand(_("-exec-continue"), CB(handleExecContinue));
 }
 
-#if 0
-void GdbEngine::handleSetTargetAsync(const GdbResponse &response)
-{
-    if (response.resultClass == GdbResultDone) {
-        qq->notifyInferiorRunningRequested();
-        postCommand(_("target remote %1")
-                .arg(m_manager->startParameters()->remoteChannel),
-            CB(handleTargetRemote));
-    } else if (response.resultClass == GdbResultError) {
-        // a typical response on "old" gdb is:
-        // &"set target-async on\n"
-        //&"No symbol table is loaded.  Use the \"file\" command.\n"
-        //^error,msg="No symbol table is loaded.  Use the \"file\" command."
-        postCommand(_("detach"));
-        postCommand(_("-gdb-exit"), CB(handleExit));
-    }
-}
-
-void GdbEngine::handleTargetRemote(const GdbResponse &response)
-{
-    if (response.resultClass == GdbResultDone) {
-        //postCommand(_("-exec-continue"), CB(handleExecContinue));
-        handleAqcuiredInferior();
-// FIXME        m_continuationAfterDone = true;
-    } else if (response.resultClass == GdbResultError) {
-        // 16^error,msg="hd:5555: Connection timed out."
-        QString msg = __(response.data.findChild("msg").data());
-        QString msg1 = tr("Connecting to remote server failed:");
-        showStatusMessage(msg1 + _c(' ') + msg);
-        showMessageBox(QMessageBox::Critical, tr("Error"), msg1 + _c('\n') + msg);
-        postCommand(_("-gdb-exit"), CB(handleExit));
-    }
-}
-#endif
-
 void GdbEngine::stepExec()
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
-    if (qq->isReverseDebugging())
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Step requested..."), 5000);
+    if (manager()->isReverseDebugging())
         postCommand(_("-reverse-step"), CB(handleExecContinue));
     else
         postCommand(_("-exec-step"), CB(handleExecContinue));
@@ -1609,9 +1590,11 @@ void GdbEngine::stepExec()
 
 void GdbEngine::stepIExec()
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
-    if (qq->isReverseDebugging())
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Step by instruction requested..."), 5000);
+    if (manager()->isReverseDebugging())
         postCommand(_("-reverse-stepi"), CB(handleExecContinue));
     else
         postCommand(_("-exec-step-instruction"), CB(handleExecContinue));
@@ -1619,16 +1602,20 @@ void GdbEngine::stepIExec()
 
 void GdbEngine::stepOutExec()
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Finish function requested..."), 5000);
     postCommand(_("-exec-finish"), CB(handleExecContinue));
 }
 
 void GdbEngine::nextExec()
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
-    if (qq->isReverseDebugging())
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Step next requested..."), 5000);
+    if (manager()->isReverseDebugging())
         postCommand(_("-reverse-next"), CB(handleExecContinue));
     else {
 #if 1
@@ -1643,9 +1630,11 @@ void GdbEngine::nextExec()
 
 void GdbEngine::nextIExec()
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
-    if (qq->isReverseDebugging())
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Step next instruction requested..."), 5000);
+    if (manager()->isReverseDebugging())
         postCommand(_("-reverse-nexti"), CB(handleExecContinue));
     else
         postCommand(_("-exec-next-instruction"), CB(handleExecContinue));
@@ -1653,16 +1642,20 @@ void GdbEngine::nextIExec()
 
 void GdbEngine::runToLineExec(const QString &fileName, int lineNumber)
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
-    qq->notifyInferiorRunningRequested();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Run to line %1 requested...").arg(lineNumber), 5000);
     postCommand(_("-exec-until %1:%2").arg(fileName).arg(lineNumber));
 }
 
 void GdbEngine::runToFunctionExec(const QString &functionName)
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     setTokenBarrier();
     postCommand(_("-break-insert -t ") + functionName);
-    qq->notifyInferiorRunningRequested();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Run to function %1 requested...").arg(functionName), 5000);
     // that should be "^running". We need to handle the resulting
     // "Stopped"
     postCommand(_("-exec-continue"), CB(handleExecContinue));
@@ -1671,6 +1664,7 @@ void GdbEngine::runToFunctionExec(const QString &functionName)
 
 void GdbEngine::jumpToLineExec(const QString &fileName, int lineNumber)
 {
+    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
     StackFrame frame;
     frame.file = fileName;
     frame.line = lineNumber;
@@ -1810,7 +1804,7 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
 
 void GdbEngine::sendInsertBreakpoint(int index)
 {
-    const BreakpointData *data = qq->breakHandler()->at(index);
+    const BreakpointData *data = manager()->breakHandler()->at(index);
     QString where;
     if (data->funcName.isEmpty()) {
         if (data->useFullPath) {
@@ -1845,7 +1839,7 @@ void GdbEngine::sendInsertBreakpoint(int index)
     //    cmd += _("-c ") + data->condition + ' ';
 #endif
     cmd += where;
-    emit gdbOutputAvailable(LogStatus, _("Current state: %1").arg(status()));
+    emit gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state()));
     postCommand(cmd, NeedsStop, CB(handleBreakInsert), index);
 }
 
@@ -1893,7 +1887,7 @@ void GdbEngine::handleBreakList(const GdbMi &table)
         //qDebug() << "LEFT" << bkpts.size() << "BREAKPOINTS";
     }
 
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     for (int index = 0; index != bkpts.size(); ++index) {
         BreakpointData temp(handler);
         breakpointDataFromOutput(&temp, bkpts.at(index));
@@ -1921,7 +1915,7 @@ void GdbEngine::handleBreakIgnore(const GdbResponse &response)
     // 29^done
     //
     // gdb 6.3 does not produce any console output
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     if (response.resultClass == GdbResultDone && index < handler->size()) {
         QString msg = _(response.data.findChild("consolestreamoutput").data());
         BreakpointData *data = handler->at(index);
@@ -1939,7 +1933,7 @@ void GdbEngine::handleBreakIgnore(const GdbResponse &response)
 void GdbEngine::handleBreakCondition(const GdbResponse &response)
 {
     int index = response.cookie.toInt();
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     if (response.resultClass == GdbResultDone) {
         // we just assume it was successful. otherwise we had to parse
         // the output stream data
@@ -1962,7 +1956,7 @@ void GdbEngine::handleBreakCondition(const GdbResponse &response)
 void GdbEngine::handleBreakInsert(const GdbResponse &response)
 {
     int index = response.cookie.toInt();
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     if (response.resultClass == GdbResultDone) {
         //qDebug() << "HANDLE BREAK INSERT" << index;
 //#if defined(Q_OS_MAC)
@@ -2047,7 +2041,7 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
 void GdbEngine::handleBreakInfo(const GdbResponse &response)
 {
     int bpNumber = response.cookie.toInt();
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     if (response.resultClass == GdbResultDone) {
         // Old-style output for multiple breakpoints, presumably in a
         // constructor
@@ -2064,7 +2058,7 @@ void GdbEngine::handleBreakInfo(const GdbResponse &response)
 void GdbEngine::handleBreakInsert1(const GdbResponse &response)
 {
     int index = response.cookie.toInt();
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     if (response.resultClass == GdbResultDone) {
         // Pending breakpoints in dylibs on Mac only?
         BreakpointData *data = handler->at(index);
@@ -2081,7 +2075,7 @@ void GdbEngine::handleBreakInsert1(const GdbResponse &response)
 
 void GdbEngine::attemptBreakpointSynchronization()
 {
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
 
     foreach (BreakpointData *data, handler->takeDisabledBreakpoints()) {
         QString bpNumber = data->bpNumber;
@@ -2240,7 +2234,7 @@ void GdbEngine::handleModulesList(const GdbResponse &response)
             }
         }
     }
-    qq->modulesHandler()->setModules(modules);
+    manager()->modulesHandler()->setModules(modules);
 }
 
 
@@ -2329,10 +2323,10 @@ void GdbEngine::handleStackListFrames(const GdbResponse &response)
         bool canExpand = !isFull 
             && (n >= theDebuggerAction(MaximalStackDepth)->value().toInt());
         theDebuggerAction(ExpandStack)->setEnabled(canExpand);
-        qq->stackHandler()->setFrames(stackFrames, canExpand);
+        manager()->stackHandler()->setFrames(stackFrames, canExpand);
 
         if (topFrame != -1 || theDebuggerBoolSetting(StepByInstruction)) {
-            const StackFrame &frame = qq->stackHandler()->currentFrame();
+            const StackFrame &frame = manager()->stackHandler()->currentFrame();
             gotoLocation(frame, true);
         }
     } else {
@@ -2348,7 +2342,7 @@ void GdbEngine::selectThread(int index)
     //reset location arrow
     m_manager->resetLocation();
 
-    ThreadsHandler *threadsHandler = qq->threadsHandler();
+    ThreadsHandler *threadsHandler = manager()->threadsHandler();
     threadsHandler->setCurrentThread(index);
 
     QList<ThreadData> threads = threadsHandler->threads();
@@ -2360,10 +2354,10 @@ void GdbEngine::selectThread(int index)
 
 void GdbEngine::activateFrame(int frameIndex)
 {
-    if (status() != DebuggerInferiorStopped)
+    if (state() != InferiorStopped)
         return;
 
-    StackHandler *stackHandler = qq->stackHandler();
+    StackHandler *stackHandler = manager()->stackHandler();
     int oldIndex = stackHandler->currentIndex();
     //qDebug() << "ACTIVATE FRAME:" << frameIndex << oldIndex
     //    << stackHandler->currentIndex();
@@ -2410,7 +2404,7 @@ void GdbEngine::handleStackListThreads(const GdbResponse &response)
             currentIndex = index;
         }
     }
-    ThreadsHandler *threadsHandler = qq->threadsHandler();
+    ThreadsHandler *threadsHandler = manager()->threadsHandler();
     threadsHandler->setThreads(threads);
     threadsHandler->setCurrentThread(currentIndex);
 }
@@ -2438,7 +2432,7 @@ void GdbEngine::reloadRegisters()
 
 void GdbEngine::setRegisterValue(int nr, const QString &value)
 {
-    Register reg = qq->registerHandler()->registers().at(nr);
+    Register reg = manager()->registerHandler()->registers().at(nr);
     //qDebug() << "NOT IMPLEMENTED: CHANGE REGISTER " << nr << reg.name << ":"
     //    << value;
     postCommand(_("-var-delete \"R@\""));
@@ -2459,7 +2453,7 @@ void GdbEngine::handleRegisterListNames(const GdbResponse &response)
     foreach (const GdbMi &item, response.data.findChild("register-names").children())
         registers.append(Register(_(item.data())));
 
-    qq->registerHandler()->setRegisters(registers);
+    manager()->registerHandler()->setRegisters(registers);
 }
 
 void GdbEngine::handleRegisterListValues(const GdbResponse &response)
@@ -2467,7 +2461,7 @@ void GdbEngine::handleRegisterListValues(const GdbResponse &response)
     if (response.resultClass != GdbResultDone)
         return;
 
-    QList<Register> registers = qq->registerHandler()->registers();
+    QList<Register> registers = manager()->registerHandler()->registers();
 
     // 24^done,register-values=[{number="0",value="0xf423f"},...]
     foreach (const GdbMi &item, response.data.findChild("register-values").children()) {
@@ -2480,7 +2474,7 @@ void GdbEngine::handleRegisterListValues(const GdbResponse &response)
                 reg.value = value;
         }
     }
-    qq->registerHandler()->setRegisters(registers);
+    manager()->registerHandler()->setRegisters(registers);
 }
 
 
@@ -2520,7 +2514,7 @@ static QString tooltipINameForExpression(const QString &exp)
 
 bool GdbEngine::showToolTip()
 {
-    WatchHandler *handler = qq->watchHandler();
+    WatchHandler *handler = manager()->watchHandler();
     WatchModel *model = handler->model(TooltipsWatch);
     QString iname = tooltipINameForExpression(m_toolTipExpression);
     model->setActiveData(iname);
@@ -2537,7 +2531,7 @@ bool GdbEngine::showToolTip()
 void GdbEngine::setToolTipExpression(const QPoint &mousePos,
     TextEditor::ITextEditor *editor, int cursorPos)
 {
-    if (status() != DebuggerInferiorStopped || !isCppEditor(editor)) {
+    if (state() != InferiorStopped || !isCppEditor(editor)) {
         //qDebug() << "SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED/Non Cpp editor";
         return;
     }
@@ -2612,8 +2606,8 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos,
     toolTip.exp = exp;
     toolTip.name = exp;
     toolTip.iname = tooltipINameForExpression(exp);
-    qq->watchHandler()->removeData(toolTip.iname);
-    qq->watchHandler()->insertData(toolTip);
+    manager()->watchHandler()->removeData(toolTip.iname);
+    manager()->watchHandler()->insertData(toolTip);
 }
 
 
@@ -2715,7 +2709,7 @@ bool GdbEngine::hasDebuggingHelperForType(const QString &type) const
     }
 
     if (theDebuggerBoolSetting(DebugDebuggingHelpers)
-            && qq->stackHandler()->isDebuggingDebuggingHelpers())
+            && manager()->stackHandler()->isDebuggingDebuggingHelpers())
         return false;
 
     if (m_debuggingHelperState != DebuggingHelperAvailable)
@@ -2887,7 +2881,7 @@ void GdbEngine::updateSubItem(const WatchData &data0)
         #if DEBUG_SUBITEM
         qDebug() << "UPDATE SUBITEM: CUSTOMVALUE";
         #endif
-        runDebuggingHelper(data, qq->watchHandler()->isExpandedIName(data.iname));
+        runDebuggingHelper(data, manager()->watchHandler()->isExpandedIName(data.iname));
         return;
     }
 
@@ -2952,7 +2946,7 @@ void GdbEngine::updateSubItem(const WatchData &data0)
         #if DEBUG_SUBITEM
         qDebug() << "UPDATE SUBITEM: CUSTOMVALUE WITH CHILDREN";
         #endif
-        runDebuggingHelper(data, qq->watchHandler()->isExpandedIName(data.iname));
+        runDebuggingHelper(data, manager()->watchHandler()->isExpandedIName(data.iname));
         return;
     }
 
@@ -3015,7 +3009,7 @@ void GdbEngine::rebuildModel()
     PENDING_DEBUG("REBUILDING MODEL" << count);
     emit gdbInputAvailable(LogStatus, _("<Rebuild Watchmodel %1>").arg(count));
     showStatusMessage(tr("Finished retrieving data."), 400);
-    qq->watchHandler()->endCycle();
+    manager()->watchHandler()->endCycle();
     showToolTip();
 }
 
@@ -3045,7 +3039,7 @@ void GdbEngine::handleQueryDebuggingHelper(const GdbResponse &response)
         // currently causes errors.
         const double dumperVersion = getDumperVersion(contents);
         if (dumperVersion < dumperVersionRequired) {
-            qq->showQtDumperLibraryWarning(
+            manager()->showQtDumperLibraryWarning(
                 QtDumperHelper::msgDumperOutdated(dumperVersionRequired, dumperVersion));
             m_debuggingHelperState = DebuggingHelperUnavailable;
             return;
@@ -3137,13 +3131,13 @@ void GdbEngine::handleVarCreate(const GdbResponse &response)
             // we do not trust gdb if we have a custom dumper
             if (response.data.findChild("children").isValid())
                 data.setChildrenUnneeded();
-            else if (qq->watchHandler()->isExpandedIName(data.iname))
+            else if (manager()->watchHandler()->isExpandedIName(data.iname))
                 data.setChildrenNeeded();
             insertData(data);
         } else {
             if (response.data.findChild("children").isValid())
                 data.setChildrenUnneeded();
-            else if (qq->watchHandler()->isExpandedIName(data.iname))
+            else if (manager()->watchHandler()->isExpandedIName(data.iname))
                 data.setChildrenNeeded();
             setWatchDataChildCount(data, response.data.findChild("numchild"));
             //if (data.isValueNeeded() && data.childCount > 0)
@@ -3238,7 +3232,7 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResponse &response)
     handleChildren(data, contents, &list);
     //for (int i = 0; i != list.size(); ++i)
     //    qDebug() << "READ: " << list.at(i).toString();
-    qq->watchHandler()->insertBulkData(list);
+    manager()->watchHandler()->insertBulkData(list);
 }
 
 void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item,
@@ -3246,18 +3240,18 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item,
 {
     //qDebug() << "HANDLE CHILDREN: " << data0.toString() << item.toString();
     WatchData data = data0;
-    if (!qq->watchHandler()->isExpandedIName(data.iname))
+    if (!manager()->watchHandler()->isExpandedIName(data.iname))
         data.setChildrenUnneeded();
 
     GdbMi children = item.findChild("children");
-    if (children.isValid() || !qq->watchHandler()->isExpandedIName(data.iname))
+    if (children.isValid() || !manager()->watchHandler()->isExpandedIName(data.iname))
         data.setChildrenUnneeded();
 
-    if (qq->watchHandler()->isDisplayedIName(data.iname)) {
+    if (manager()->watchHandler()->isDisplayedIName(data.iname)) {
         GdbMi editvalue = item.findChild("editvalue");
         if (editvalue.isValid()) {
             setWatchDataEditValue(data, editvalue);
-            qq->watchHandler()->showEditValue(data);
+            manager()->watchHandler()->showEditValue(data);
         }
     }
     setWatchDataType(data, item.findChild("type"));
@@ -3391,7 +3385,7 @@ void GdbEngine::updateLocals()
     PENDING_DEBUG("\nRESET PENDING");
     //m_toolTipCache.clear();
     m_toolTipExpression.clear();
-    qq->watchHandler()->beginCycle();
+    manager()->watchHandler()->beginCycle();
 
     QString level = QString::number(currentFrame());
     // '2' is 'list with type and value'
@@ -3445,7 +3439,7 @@ void GdbEngine::handleStackListLocals(const GdbResponse &response)
     locals += m_currentFunctionArgs;
 
     setLocals(locals);
-    qq->watchHandler()->updateWatchers();
+    manager()->watchHandler()->updateWatchers();
 }
 
 void GdbEngine::setLocals(const QList<GdbMi> &locals)
@@ -3507,7 +3501,7 @@ void GdbEngine::setLocals(const QList<GdbMi> &locals)
             //    if (!value.isEmpty() && value != "{...}")
             //        data.setValue(decodeData(value, 0));
             //}
-            if (!qq->watchHandler()->isExpandedIName(data.iname))
+            if (!manager()->watchHandler()->isExpandedIName(data.iname))
                 data.setChildrenUnneeded();
             if (isPointerType(data.type) || data.name == __("this"))
                 data.setHasChildren(true);
@@ -3518,7 +3512,7 @@ void GdbEngine::setLocals(const QList<GdbMi> &locals)
             list.append(data);
         }
     }
-    qq->watchHandler()->insertBulkData(list);
+    manager()->watchHandler()->insertBulkData(list);
 }
 
 void GdbEngine::insertData(const WatchData &data0)
@@ -3529,7 +3523,7 @@ void GdbEngine::insertData(const WatchData &data0)
         qDebug() << "BOGUS VALUE:" << data.toString();
         return;
     }
-    qq->watchHandler()->insertData(data);
+    manager()->watchHandler()->insertData(data);
 }
 
 void GdbEngine::handleVarListChildrenHelper(const GdbMi &item,
@@ -3586,7 +3580,7 @@ void GdbEngine::handleVarListChildrenHelper(const GdbMi &item,
         setWatchDataAddress(data, item.findChild("addr"));
         setWatchDataSAddress(data, item.findChild("saddr"));
         setWatchDataChildCount(data, item.findChild("numchild"));
-        if (!qq->watchHandler()->isExpandedIName(data.iname))
+        if (!manager()->watchHandler()->isExpandedIName(data.iname))
             data.setChildrenUnneeded();
 
         data.name = _(exp);
@@ -3708,10 +3702,10 @@ void GdbEngine::tryLoadDebuggingHelpers()
 
     PENDING_DEBUG("TRY LOAD CUSTOM DUMPERS");
     m_debuggingHelperState = DebuggingHelperUnavailable;
-    if (!qq->qtDumperLibraryEnabled())
+    if (!manager()->qtDumperLibraryEnabled())
         return;
-    const QString lib = qq->qtDumperLibraryName();
-    const QStringList &locations = qq->qtDumperLibraryLocations();
+    const QString lib = manager()->qtDumperLibraryName();
+    const QStringList &locations = manager()->qtDumperLibraryLocations();
     //qDebug() << "DUMPERLIB:" << lib;
     // @TODO: same in CDB engine...
     const QFileInfo fi(lib);
@@ -3719,7 +3713,7 @@ void GdbEngine::tryLoadDebuggingHelpers()
         const QString loc = locations.join(QLatin1String(", "));
         const QString msg = tr("The dumper library was not found at %1.").arg(loc);
         debugMessage(msg);
-        qq->showQtDumperLibraryWarning(msg);
+        manager()->showQtDumperLibraryWarning(msg);
         return;
     }
 
@@ -3734,7 +3728,7 @@ void GdbEngine::tryLoadDebuggingHelpers()
         } else {
             debugMessage(tr("Dumper loading (%1) failed: %2").arg(lib, errorMessage));
             debugMessage(errorMessage);
-            qq->showQtDumperLibraryWarning(errorMessage);
+            manager()->showQtDumperLibraryWarning(errorMessage);
             m_debuggingHelperState = DebuggingHelperUnavailable;
             return;
         }
@@ -4025,7 +4019,6 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg)
 void GdbEngine::handleAdapterStarted()
 {
     debugMessage(_("ADAPTER SUCCESSFULLY STARTED, PREPARING INFERIOR"));
-    qq->notifyInferiorStopped();
     m_gdbAdapter->prepareInferior();
 }
 
@@ -4039,9 +4032,9 @@ void GdbEngine::handleInferiorPreparationFailed(const QString &msg)
 
 void GdbEngine::handleInferiorPrepared()
 {
+    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
     debugMessage(_("INFERIOR PREPARED"));
     // FIXME: Check that inferior is in "stopped" state
-    qq->notifyInferiorStopped();
     showStatusMessage(tr("Inferior prepared for startup."));
 
     postCommand(_("show version"), CB(handleShowVersion));
@@ -4121,45 +4114,18 @@ void GdbEngine::handleInferiorPrepared()
         }
     }
 
-/*
-    if (startMode() == AttachExternal || startMode() == AttachCrashedExternal) {
-        postCommand(_("attach %1").arg(m_startParameters->attachPID), CB(handleAttach));
-        // Task 254674 does not want to remove them
-        //qq->breakHandler()->removeAllBreakpoints();
-    } else if (startMode() == StartRemote) {
-        postCommand(_("set architecture %1").arg(m_startParameters->remoteArchitecture));
-        qq->breakHandler()->setAllPending();
-        //QFileInfo fi(m_startParameters->executable);
-        //QString fileName = fi.absoluteFileName();
-        QString fileName = m_startParameters->executable;
-        postCommand(_("-file-exec-and-symbols \"%1\"").arg(fileName), CB(handleFileExecAndSymbols));
-        // works only for > 6.8
-        postCommand(_("set target-async on"), CB(handleSetTargetAsync));
-    } else if (m_startParameters->useTerminal) {
-        qq->breakHandler()->setAllPending();
-    } else if (startMode() == StartInternal || startMode() == StartExternal) {
-        qq->breakHandler()->setAllPending();
-        m_gdbAdapter->attach();
-        if (m_gdbAdapter->isTrkAdapter()) {
-            m_continuationAfterDone = true;
-            qq->notifyInferiorStopped();
-            attemptBreakpointSynchronization();
-            qq->notifyInferiorRunningRequested();
-        } [...]
-    }
-*/
-
-    // initial attempt to set breakpoints
+    // Initial attempt to set breakpoints
     QTC_ASSERT(m_continuationAfterDone == 0, /**/);
-    showStatusMessage(tr("Start initial breakpoint setting."));
-    m_continuationAfterDone = &GdbEngine::handleInitialBreakpointsSet;
+    showStatusMessage(tr("Setting breakpoints..."));
+    m_continuationAfterDone = &GdbEngine::startInferior;
     attemptBreakpointSynchronization();
 }
 
-void GdbEngine::handleInitialBreakpointsSet()
+void GdbEngine::startInferior()
 {
-    showStatusMessage(tr("Initial breakpoint setting finished."), 1000);
-    qq->notifyInferiorRunningRequested();
+    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
+    showStatusMessage(tr("Starting inferior..."));
+    setState(InferiorStarting);
     m_gdbAdapter->startInferior();
 }
 
@@ -4172,8 +4138,13 @@ void GdbEngine::handleInferiorStartFailed(const QString &msg)
 
 void GdbEngine::handleInferiorStarted()
 {
+    QTC_ASSERT(state() == InferiorRunningRequested
+        || state() == InferiorStopped, qDebug() << state());
     debugMessage(_("INFERIOR STARTED"));
-    qq->notifyInferiorRunning();
+    if (state() == InferiorStopped)
+        showStatusMessage(tr("Inferior stopped."));
+    else
+        showStatusMessage(tr("Inferior started."));
 }
 
 void GdbEngine::handleInferiorShutDown()
@@ -4198,14 +4169,14 @@ void GdbEngine::handleAdapterCrashed()
 void GdbEngine::handleAdapterShutDown()
 {
     debugMessage(_("ADAPTER SUCCESSFULLY SHUT DOWN"));
-    qq->notifyEngineFinished();
+    manager()->notifyEngineFinished();
 }
 
 void GdbEngine::handleAdapterShutdownFailed(const QString &msg)
 {
     debugMessage(_("ADAPTER SHUTDOWN FAILED"));
     showMessageBox(QMessageBox::Critical, tr("Inferior shutdown failed"), msg);
-    qq->notifyEngineFinished();
+    manager()->notifyEngineFinished();
 }
 
 void GdbEngine::addOptionPages(QList<Core::IOptionsPage*> *opts) const
@@ -4220,57 +4191,14 @@ void GdbEngine::showMessageBox(int icon, const QString &title, const QString &te
     m_manager->showMessageBox(icon, title, text);
 }
 
-static bool isAllowedTransition(int from, int to)
-{
-    return (from == -1)
-      || (from == AdapterNotRunning && to == AdapterNotRunning)
-      || (from == AdapterNotRunning && to == AdapterStarting)
-      || (from == AdapterStarting && to == AdapterStarted)
-      || (from == AdapterStarting && to == AdapterStartFailed)
-      || (from == AdapterStarted && to == InferiorPreparing)
-      || (from == InferiorPreparing && to == InferiorPrepared)
-      || (from == InferiorPreparing && to == InferiorPreparationFailed)
-      || (from == InferiorPrepared && to == InferiorStarting)
-      || (from == InferiorStarting && to == InferiorStarted)
-      || (from == InferiorStarting && to == InferiorStartFailed)
-      || (from == InferiorStarted && to == InferiorShuttingDown)
-      || (from == InferiorShuttingDown && to == InferiorShutDown)
-      || (from == InferiorShuttingDown && to == InferiorShutdownFailed)
-      || (from == InferiorShutDown && to == AdapterShuttingDown)
-      || (from == AdapterShuttingDown && to == AdapterNotRunning)
-    ;
-}
-
-GdbAdapterState GdbEngine::state() const
-{
-    return m_state;
-}
-
-void GdbEngine::setState(GdbAdapterState state)
-{
-    QString msg = _("Adapter state from %1 to state %2.").arg(m_state).arg(state);
-    if (!isAllowedTransition(m_state, state))
-        qDebug() << "UNEXPECTED ADAPTER TRANSITION: " << msg;
-    debugMessage(msg);
-    m_state = state;
-}
-
-//
-// AbstractGdbAdapter
-//
-
-void AbstractGdbAdapter::setState(GdbAdapterState state)
-{
-    m_engine->setState(state);
-}
 
 //
 // Factory
 //
 
-IDebuggerEngine *createGdbEngine(DebuggerManager *parent)
+IDebuggerEngine *createGdbEngine(DebuggerManager *manager)
 {
-    return new GdbEngine(parent);
+    return new GdbEngine(manager);
 }
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index b3c0dfa219eaba2157815e6e44a89f499d054158..0966a0a4fab3e657636a94ec823fe0f6e6d147a8 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -79,32 +79,12 @@ enum DebuggingHelperState
     DebuggingHelperUnavailable,
 };
 
-enum GdbAdapterState
-{
-    AdapterNotRunning,
-    AdapterStarting,
-    AdapterStarted,
-    AdapterStartFailed,
-    InferiorPreparing,
-    InferiorPrepared,
-    InferiorPreparationFailed,
-    InferiorStarting,
-    InferiorStarted,
-    InferiorStartFailed,
-    InferiorShuttingDown,
-    InferiorShutDown,
-    InferiorShutdownFailed,
-    AdapterShuttingDown,
-    //AdapterShutDown,  // use AdapterNotRunning
-    AdapterShutdownFailed,
-};
-
 class GdbEngine : public IDebuggerEngine
 {
     Q_OBJECT
 
 public:
-    explicit GdbEngine(DebuggerManager *parent);
+    explicit GdbEngine(DebuggerManager *manager);
     ~GdbEngine();
 
 signals:
@@ -292,10 +272,6 @@ private:
     bool showToolTip();
 
     // Convenience
-    DebuggerManager *manager() { return m_manager; }
-    void showStatusMessage(const QString &msg, int timeout = -1)
-        { m_manager->showStatusMessage(msg, timeout); }
-    int status() const { return m_manager->status(); }
     QMainWindow *mainWindow() const { return m_manager->mainWindow(); }
     DebuggerStartMode startMode() const;
     qint64 inferiorPid() const { return m_manager->inferiorPid(); }
@@ -438,14 +414,12 @@ private:
     typedef void (GdbEngine::*Continuation)();
     // function called after all previous responses have been received
     Continuation m_continuationAfterDone;
-    void handleInitialBreakpointsSet();
+    void startInferior();
 
     bool m_modulesListOutdated;
 
     QList<GdbCommand> m_commandsToRunOnTemporaryBreak;
 
-    DebuggerManager * const m_manager;
-    IDebuggerManagerAccessForEngines * const qq;
     DebuggerStartParametersPtr m_startParameters;
     // make sure to re-initialize new members in initializeVariables();
 
@@ -457,11 +431,7 @@ private:
     RemoteGdbAdapter *m_remoteAdapter; // owned
     TrkGdbAdapter *m_trkAdapter;       // owned
 
-    // State
     friend class AbstractGdbAdapter;
-    GdbAdapterState m_state;
-    void setState(GdbAdapterState state);
-    GdbAdapterState state() const;
 
 public:
     void showMessageBox(int icon, const QString &title, const QString &text);
diff --git a/src/plugins/debugger/gdb/plaingdbadapter.cpp b/src/plugins/debugger/gdb/plaingdbadapter.cpp
index f6e64f3a971bda7f20f9812d8e39182a7fead6a0..b87fc3fd4a92922272ba7090ed4b72074ab12733 100644
--- a/src/plugins/debugger/gdb/plaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/plaingdbadapter.cpp
@@ -57,7 +57,7 @@ namespace Internal {
 PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
     connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
         this, SIGNAL(error(QProcess::ProcessError)));
     connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
@@ -85,7 +85,7 @@ PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent)
 
 void PlainGdbAdapter::startAdapter()
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == EngineStarting, qDebug() << state());
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
 
@@ -159,7 +159,7 @@ void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
 
 void PlainGdbAdapter::handleInfoTarget(const GdbResponse &response)
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
 #if defined(Q_OS_MAC)
     Q_UNUSED(response)
 #else
@@ -187,6 +187,7 @@ void PlainGdbAdapter::handleInfoTarget(const GdbResponse &response)
             //debugMessage(_("STREAM: ") + msg + " " + needle.cap(1));
             m_engine->postCommand(_("tbreak *") + needle.cap(1));
 // FIXME:            m_waitingForFirstBreakpointToBeHit = true;
+            setState(InferiorRunningRequested);
             m_engine->postCommand(_("-exec-run"), CB(handleExecRun));
         } else {
             debugMessage(_("PARSING START ADDRESS FAILED: ") + msg);
@@ -201,14 +202,14 @@ void PlainGdbAdapter::handleInfoTarget(const GdbResponse &response)
 
 void PlainGdbAdapter::handleExecRun(const GdbResponse &response)
 {
-    QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
+    QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state());
     if (response.resultClass == GdbResultRunning) {
-        setState(InferiorStarted);
         emit inferiorStarted();
+        setState(InferiorRunning);
     } else {
         QTC_ASSERT(response.resultClass == GdbResultError, /**/);
         const QByteArray &msg = response.data.findChild("msg").data();
-        //QTC_ASSERT(status() == DebuggerInferiorRunning, /**/);
+        //QTC_ASSERT(status() == InferiorRunning, /**/);
         //interruptInferior();
         setState(InferiorStartFailed);
         emit inferiorStartFailed(msg);
@@ -217,8 +218,8 @@ void PlainGdbAdapter::handleExecRun(const GdbResponse &response)
 
 void PlainGdbAdapter::startInferior()
 {
-    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
-    setState(InferiorStarting);
+    QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
+    setState(InferiorRunningRequested);
     m_engine->postCommand(_("-exec-run"), CB(handleExecRun));
 }
 
@@ -237,26 +238,28 @@ void PlainGdbAdapter::interruptInferior()
 
 void PlainGdbAdapter::shutdown()
 {
-    if (state() == InferiorStarted) {
+    switch (state()) {
+    
+    case InferiorRunningRequested:
+    case InferiorRunning:
+    case InferiorStopping:
+    case InferiorStopped:
         setState(InferiorShuttingDown);
         m_engine->postCommand(_("kill"), CB(handleKill));
         return;
-    }
 
-    if (state() == InferiorShutDown) {
+    case InferiorShutDown:
         setState(AdapterShuttingDown);
         m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
         return;
-    }
 
 /*
-    if (state() == InferiorShutdownFailed) {
+    case InferiorShutdownFailed:
         m_gdbProc.terminate();
         // 20s can easily happen when loading webkit debug information
         m_gdbProc.waitForFinished(20000);
         setState(AdapterShuttingDown);
-        debugMessage(_("FORCING TERMINATION: %1")
-            .arg(state()));
+        debugMessage(_("FORCING TERMINATION: %1").arg(state()));
         if (state() != QProcess::NotRunning) {
             debugMessage(_("PROBLEM STOPPING DEBUGGER: STATE %1")
                 .arg(state()));
@@ -264,10 +267,10 @@ void PlainGdbAdapter::shutdown()
         }
         m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
         return;
-    }
-
 */
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    default:
+        QTC_ASSERT(false, qDebug() << state());
+    }
 }
 
 void PlainGdbAdapter::handleKill(const GdbResponse &response)
@@ -298,7 +301,7 @@ void PlainGdbAdapter::handleExit(const GdbResponse &response)
 void PlainGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus)
 {
     debugMessage(_("GDB PROESS FINISHED"));
-    setState(AdapterNotRunning);
+    setState(DebuggerNotReady);
     emit adapterShutDown();
 }
 
diff --git a/src/plugins/debugger/gdb/remotegdbadapter.cpp b/src/plugins/debugger/gdb/remotegdbadapter.cpp
index d364dfe83d7f8b5b72cb77762edff45defa5e6a4..1074bd60d4d59cadbbaefbc1d262a0f70f4fbc88 100644
--- a/src/plugins/debugger/gdb/remotegdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbadapter.cpp
@@ -55,7 +55,7 @@ namespace Internal {
 RemoteGdbAdapter::RemoteGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
     connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
         this, SIGNAL(error(QProcess::ProcessError)));
     connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
@@ -77,7 +77,7 @@ RemoteGdbAdapter::RemoteGdbAdapter(GdbEngine *engine, QObject *parent)
 
 void RemoteGdbAdapter::startAdapter()
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == EngineStarting, qDebug() << state());
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
 
@@ -234,20 +234,16 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
 
 void RemoteGdbAdapter::startInferior()
 {
-    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
-    setState(InferiorStarting);
+    QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
     m_engine->postCommand(_("attach"), CB(handleFirstContinue));
-    // FIXME: Is there a way to properly recognize a successful start?
-    setState(InferiorStarted);
-    emit inferiorStarted();
 }
 
 void RemoteGdbAdapter::handleFirstContinue(const GdbResponse &record)
 {
-    //QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
-    QTC_ASSERT(state() == InferiorStarted, qDebug() << state());
+    QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state());
     if (record.resultClass == GdbResultDone) {
-        // inferiorStarted already emitted above, see FIXME
+        setState(InferiorStopped);
+        emit inferiorStarted();
     } else if (record.resultClass == GdbResultError) {
         //QString msg = __(record.data.findChild("msg").data());
         QString msg1 = tr("Connecting to remote server failed:\n");
@@ -264,10 +260,8 @@ void RemoteGdbAdapter::shutdown()
 {
     switch (state()) {
 
-    case AdapterNotRunning:
-        return;
-
-    case InferiorStarted:
+    case InferiorRunning:
+    case InferiorStopped:
         setState(InferiorShuttingDown);
         m_engine->postCommand(_("kill"), CB(handleKill));
         return;
@@ -313,7 +307,7 @@ void RemoteGdbAdapter::handleExit(const GdbResponse &response)
 void RemoteGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus)
 {
     debugMessage(_("GDB PROESS FINISHED"));
-    setState(AdapterNotRunning);
+    setState(DebuggerNotReady);
     emit adapterShutDown();
 }
 
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index e0a78c6afcf8cd2b35660d9419e7d32391285e87..0b48483bc442d2b682a50a8d7018a7154829bd20 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -94,7 +94,7 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
     m_bufferedMemoryRead(true),
     m_waitCount(0)
 {
-    setState(AdapterNotRunning);
+    setState(DebuggerNotReady);
 #ifdef Q_OS_WIN
     const DWORD portOffset = GetCurrentProcessId() % 100;
 #else
@@ -246,7 +246,7 @@ void TrkGdbAdapter::startInferiorEarly()
             QString msg = QString::fromLatin1("Failed to connect to %1 after "
                 "%2 attempts").arg(device).arg(m_waitCount);
             logMessage(msg);
-            setState(AdapterNotRunning);
+            setState(DebuggerNotReady);
             emit adapterStartFailed(msg);
         }
         return;
@@ -1327,7 +1327,7 @@ void TrkGdbAdapter::handleGdbFinished(int exitCode, QProcess::ExitStatus exitSta
 {
     logMessage(QString("GDB: ProcessFinished %1 %2")
         .arg(exitCode).arg(exitStatus));
-    setState(AdapterNotRunning);
+    setState(DebuggerNotReady);
     emit adapterShutDown();
 }
 
@@ -1346,7 +1346,7 @@ void TrkGdbAdapter::handleGdbStateChanged(QProcess::ProcessState newState)
 
 void TrkGdbAdapter::startAdapter()
 {
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    QTC_ASSERT(state() == EngineStarting, qDebug() << state());
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
     logMessage(QLatin1String("### Starting TrkGdbAdapter"));
@@ -1406,18 +1406,16 @@ void TrkGdbAdapter::handleTargetRemote(const GdbResponse &record)
 
 void TrkGdbAdapter::startInferior()
 {
-    QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
-    setState(InferiorStarting);
+    QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
+    setState(InferiorRunningRequested);
     m_engine->postCommand(_("-exec-continue"), CB(handleFirstContinue));
     // FIXME: Is there a way to properly recognize a successful start?
-    setState(InferiorStarted);
     emit inferiorStarted();
 }
 
 void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record)
 {
-    //QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
-    QTC_ASSERT(state() == InferiorStarted, qDebug() << state());
+    QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state());
     if (record.resultClass == GdbResultDone) {
         // inferiorStarted already emitted above, see FIXME
     } else if (record.resultClass == GdbResultError) {
@@ -1457,7 +1455,7 @@ void TrkGdbAdapter::startGdb()
         QString msg = QString("Unable to start the gdb server at %1: %2.")
             .arg(m_gdbServerName).arg(m_gdbServer.errorString());
         logMessage(msg);
-        setState(AdapterNotRunning);
+        setState(DebuggerNotReady);
         emit adapterStartFailed(msg); 
         return;
     }
@@ -1590,22 +1588,26 @@ void TrkGdbAdapter::setEnvironment(const QStringList &env)
 
 void TrkGdbAdapter::shutdown()
 {
-    qDebug() << "ADAPTER SHUTDOWN " << state();
-    if (state() == InferiorStarted) {
+    switch (state()) {
+
+    case InferiorStopped:
+    case InferiorStopping:
+    case InferiorRunningRequested:
+    case InferiorRunning:
         setState(InferiorShuttingDown);
         qDebug() << "kill";
         m_engine->postCommand(_("kill"), CB(handleKill));
         return;
-    }
 
-    if (state() == InferiorShutDown) {
+    case InferiorShutDown:
         setState(AdapterShuttingDown);
         qDebug() << "gdb-exit";
         m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
         return;
-    }
 
-    QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
+    default:
+        QTC_ASSERT(false, qDebug() << state());
+    }
 }
 
 void TrkGdbAdapter::handleKill(const GdbResponse &response)
diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h
index 6724d0093511865dd59ab1aedba2dd47d357b487..d204dc5f6faf919b94f2ad60bbbc018c1505a0ef 100644
--- a/src/plugins/debugger/idebuggerengine.h
+++ b/src/plugins/debugger/idebuggerengine.h
@@ -30,6 +30,8 @@
 #ifndef DEBUGGER_IDEBUGGERENGINE_H
 #define DEBUGGER_IDEBUGGERENGINE_H
 
+#include "debuggerconstants.h"
+
 #include <QtCore/QObject>
 #include <QtCore/QList>
 #include <QtCore/QSharedPointer>
@@ -51,6 +53,7 @@ namespace Debugger {
 namespace Internal {
 
 class DebuggerStartParameters;
+class DebuggerManager;
 class DisassemblerViewAgent;
 class MemoryViewAgent;
 struct StackFrame;
@@ -63,7 +66,9 @@ class IDebuggerEngine : public QObject
     Q_OBJECT
 
 public:
-    IDebuggerEngine(QObject *parent = 0) : QObject(parent) {}
+    IDebuggerEngine(DebuggerManager *manager, QObject *parent = 0)
+        : QObject(parent), m_manager(manager)
+    {}
 
     virtual void shutdown() = 0;
     virtual void setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos) = 0;
@@ -111,6 +116,13 @@ public:
 
     virtual void addOptionPages(QList<Core::IOptionsPage*> *) const {}
 
+protected:
+    void showStatusMessage(const QString &msg, int timeout = -1);
+    DebuggerState state() const;
+    void setState(DebuggerState state);
+    DebuggerManager *manager() const { return m_manager; }
+    DebuggerManager *m_manager;
+
 signals:
     void startSuccessful();
     void startFailed();
diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp
index 7f1caec3560b8de532bb950c60af6cf920b5077b..b8436f1084cad207661ecad8ebc46e99e357631d 100644
--- a/src/plugins/debugger/script/scriptengine.cpp
+++ b/src/plugins/debugger/script/scriptengine.cpp
@@ -184,10 +184,9 @@ void ScriptAgent::scriptUnload(qint64 scriptId)
 //
 ///////////////////////////////////////////////////////////////////////
 
-ScriptEngine::ScriptEngine(DebuggerManager *parent)
+ScriptEngine::ScriptEngine(DebuggerManager *manager)
+    : IDebuggerEngine(manager)
 {
-    q = parent;
-    qq = parent->engineInterface();
     // created in startDebugger()
     m_scriptEngine = 0;
     m_scriptAgent = 0;
@@ -214,7 +213,7 @@ void ScriptEngine::exitDebugger()
     m_stopped = false;
     m_stopOnNextLine = false;
     m_scriptEngine->abortEvaluation();
-    qq->notifyInferiorExited();
+    manager()->notifyInferiorExited();
 }
 
 void ScriptEngine::startDebugger(const DebuggerStartParametersPtr &sp)
@@ -241,7 +240,8 @@ void ScriptEngine::startDebugger(const DebuggerStartParametersPtr &sp)
     m_scriptContents = stream.readAll();
     scriptFile.close();
     attemptBreakpointSynchronization();
-    qq->notifyInferiorRunningRequested();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Running requested..."), 5000);
     QTimer::singleShot(0, this, SLOT(runInferior()));
     emit startSuccessful();
 }
@@ -381,7 +381,7 @@ void ScriptEngine::selectThread(int index)
 
 void ScriptEngine::attemptBreakpointSynchronization()
 {
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
     bool updateNeeded = false;
     for (int index = 0; index != handler->size(); ++index) {
         BreakpointData *data = handler->at(index);
@@ -432,18 +432,20 @@ static WatchData m_toolTip;
 static QPoint m_toolTipPos;
 static QHash<QString, WatchData> m_toolTipCache;
 
-void ScriptEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos)
+void ScriptEngine::setToolTipExpression(const QPoint &mousePos,
+    TextEditor::ITextEditor *editor, int cursorPos)
 {
     Q_UNUSED(mousePos)
     Q_UNUSED(editor)
     Q_UNUSED(cursorPos)
 
-    if (q->status() != DebuggerInferiorStopped) {
+    if (state() != InferiorStopped) {
         //SDEBUG("SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED");
         return;
     }
     // Check mime type and get expression (borrowing some C++ - functions)
-    const QString javaScriptMimeType = QLatin1String(QtScriptEditor::Constants::C_QTSCRIPTEDITOR_MIMETYPE);
+    const QString javaScriptMimeType =
+        QLatin1String(QtScriptEditor::Constants::C_QTSCRIPTEDITOR_MIMETYPE);
     if (!editor->file() || editor->file()->mimeType() != javaScriptMimeType)
         return;
 
@@ -493,7 +495,7 @@ void ScriptEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITex
     }
 
 #if 0
-    //if (m_manager->status() != DebuggerInferiorStopped)
+    //if (m_manager->status() != InferiorStopped)
     //    return;
 
     // FIXME: 'exp' can contain illegal characters
@@ -534,7 +536,7 @@ void ScriptEngine::maybeBreakNow(bool byFunction)
     if (byFunction)
         lineNumber = info.functionStartLineNumber();
 
-    BreakHandler *handler = qq->breakHandler();
+    BreakHandler *handler = manager()->breakHandler();
 
     if (m_stopOnNextLine) {
         m_stopOnNextLine = false;
@@ -567,18 +569,20 @@ void ScriptEngine::maybeBreakNow(bool byFunction)
         data->updateMarker();
     }
 
-    qq->notifyInferiorStopped();
+    setState(InferiorStopped);
+    showStatusMessage(tr("Stopped."), 5000);
+
     StackFrame frame;
     frame.file = fileName;      
     frame.line = lineNumber;
-    q->gotoLocation(frame, true);
+    manager()->gotoLocation(frame, true);
     updateLocals();
 }
 
 void ScriptEngine::updateLocals()
 {
     QScriptContext *context = m_scriptEngine->currentContext();
-    qq->watchHandler()->beginCycle();
+    manager()->watchHandler()->beginCycle();
     //SDEBUG("UPDATE LOCALS");
 
     //
@@ -601,7 +605,7 @@ void ScriptEngine::updateLocals()
         //frame.address = ...;
         stackFrames.append(frame);
     }
-    qq->stackHandler()->setFrames(stackFrames);
+    manager()->stackHandler()->setFrames(stackFrames);
 
     //
     // Build locals
@@ -610,13 +614,13 @@ void ScriptEngine::updateLocals()
     data.iname = "local";
     data.name = "local";
     data.scriptValue = context->activationObject();
-    qq->watchHandler()->beginCycle();
+    manager()->watchHandler()->beginCycle();
     updateSubItem(data);
-    qq->watchHandler()->endCycle();
+    manager()->watchHandler()->endCycle();
 
     // FIXME: Use an extra thread. This here is evil
     m_stopped = true;
-    q->showStatusMessage(tr("Stopped."), 5000);
+    showStatusMessage(tr("Stopped."), 5000);
     while (m_stopped) {
         //SDEBUG("LOOPING");
         QApplication::processEvents();
@@ -627,7 +631,7 @@ void ScriptEngine::updateLocals()
 void ScriptEngine::updateWatchData(const WatchData &data)
 {
     updateSubItem(data);
-    //qq->watchHandler()->rebuildModel();
+    //manager()->watchHandler()->rebuildModel();
 }
 
 void ScriptEngine::updateSubItem(const WatchData &data0)
@@ -689,7 +693,7 @@ void ScriptEngine::updateSubItem(const WatchData &data0)
             data.setValue("<unknown>");
             data.setHasChildren(false);
         }
-        qq->watchHandler()->insertData(data);
+        manager()->watchHandler()->insertData(data);
         return;
     }
 
@@ -703,17 +707,17 @@ void ScriptEngine::updateSubItem(const WatchData &data0)
             data1.exp = it.name();
             data1.name = it.name();
             data1.scriptValue = it.value();
-            if (qq->watchHandler()->isExpandedIName(data1.iname))
+            if (manager()->watchHandler()->isExpandedIName(data1.iname))
                 data1.setChildrenNeeded();
             else
                 data1.setChildrenUnneeded();
-            qq->watchHandler()->insertData(data1);
+            manager()->watchHandler()->insertData(data1);
             ++numChild;
         }
         //SDEBUG("  ... CHILDREN: " << numChild);
         data.setHasChildren(numChild > 0);
         data.setChildrenUnneeded();
-        qq->watchHandler()->insertData(data);
+        manager()->watchHandler()->insertData(data);
         return;
     }
 
@@ -726,16 +730,16 @@ void ScriptEngine::updateSubItem(const WatchData &data0)
         }
         data.setHasChildren(numChild > 0);
         //SDEBUG("  ... CHILDCOUNT: " << numChild);
-        qq->watchHandler()->insertData(data);
+        manager()->watchHandler()->insertData(data);
         return;
     }
 
     QTC_ASSERT(false, return);
 }
 
-IDebuggerEngine *createScriptEngine(DebuggerManager *parent)
+IDebuggerEngine *createScriptEngine(DebuggerManager *manager)
 {
-    return new ScriptEngine(parent);
+    return new ScriptEngine(manager);
 }
 
 } // namespace Internal
diff --git a/src/plugins/debugger/script/scriptengine.h b/src/plugins/debugger/script/scriptengine.h
index 3340f13f83bae85f6b4261ba392b9365a415c97d..9eea2cf357968967da69e2c7d03bd249fa9426fe 100644
--- a/src/plugins/debugger/script/scriptengine.h
+++ b/src/plugins/debugger/script/scriptengine.h
@@ -52,8 +52,6 @@ QT_END_NAMESPACE
 namespace Debugger {
 namespace Internal {
 
-class DebuggerManager;
-class IDebuggerManagerAccessForEngines;
 class ScriptAgent;
 class WatchData;
 
@@ -62,7 +60,7 @@ class ScriptEngine : public IDebuggerEngine
     Q_OBJECT
 
 public:
-    ScriptEngine(DebuggerManager *parent);
+    ScriptEngine(DebuggerManager *manager);
     ~ScriptEngine();
 
 private:
@@ -74,7 +72,8 @@ private:
     void nextIExec();
 
     void shutdown();
-    void setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos);
+    void setToolTipExpression(const QPoint &mousePos,
+        TextEditor::ITextEditor *editor, int cursorPos);
     void startDebugger(const DebuggerStartParametersPtr &sp);
 
     void exitDebugger();
@@ -111,8 +110,6 @@ private:
 
 private:
     friend class ScriptAgent;
-    DebuggerManager *q;
-    IDebuggerManagerAccessForEngines *qq;
 
     QScriptEngine *m_scriptEngine;
     QString m_scriptContents;
diff --git a/src/plugins/debugger/tcf/tcfengine.cpp b/src/plugins/debugger/tcf/tcfengine.cpp
index cc88654ee2d717083922d4781810a11f9cd07e38..e274102d75a1c1193c88ee505e415586bac36e92 100644
--- a/src/plugins/debugger/tcf/tcfengine.cpp
+++ b/src/plugins/debugger/tcf/tcfengine.cpp
@@ -107,11 +107,9 @@ QString TcfEngine::TcfCommand::toString() const
 //
 ///////////////////////////////////////////////////////////////////////
 
-TcfEngine::TcfEngine(DebuggerManager *parent)
+TcfEngine::TcfEngine(DebuggerManager *manager)
+    : IDebuggerEngine(manager)
 {
-    q = parent;
-    qq = parent->engineInterface();
-
     m_congestion = 0;
     m_inAir = 0;
 
@@ -136,13 +134,13 @@ TcfEngine::TcfEngine(DebuggerManager *parent)
     //    thism SLOT(socketStateChanged(QAbstractSocket::SocketState)));
 
     connect(this, SIGNAL(tcfOutputAvailable(int,QString)),
-        q, SLOT(showDebuggerOutput(int,QString)),
+        m_manager, SLOT(showDebuggerOutput(int,QString)),
         Qt::QueuedConnection);
     connect(this, SIGNAL(tcfInputAvailable(int,QString)),
-        q, SLOT(showDebuggerInput(int,QString)),
+        m_manager, SLOT(showDebuggerInput(int,QString)),
         Qt::QueuedConnection);
     connect(this, SIGNAL(applicationOutputAvailable(QString)),
-        q, SLOT(showApplicationOutput(QString)),
+        m_manager, SLOT(showApplicationOutput(QString)),
         Qt::QueuedConnection);
 }
 
@@ -169,7 +167,7 @@ void TcfEngine::socketReadyRead()
 
 void TcfEngine::socketConnected()
 {
-    q->showStatusMessage("Socket connected.");
+    showStatusMessage("Socket connected.");
     m_socket->waitForConnected(2000);
     //sendCommand("Locator", "redirect", "ID");
 }
@@ -183,8 +181,8 @@ void TcfEngine::socketError(QAbstractSocket::SocketError)
 {
     QString msg = tr("%1.").arg(m_socket->errorString());
     //QMessageBox::critical(q->mainWindow(), tr("Error"), msg);
-    q->showStatusMessage(msg);
-    qq->notifyInferiorExited();
+    showStatusMessage(msg);
+    manager()->notifyInferiorExited();
 }
 
 void TcfEngine::executeDebuggerCommand(const QString &command)
@@ -213,12 +211,13 @@ void TcfEngine::shutdown()
 void TcfEngine::exitDebugger()
 {
     SDEBUG("TcfEngine::exitDebugger()");
-    qq->notifyInferiorExited();
+    manager()->notifyInferiorExited();
 }
 
 void TcfEngine::startDebugger(const DebuggerStartParametersPtr &sp)
 {
-    qq->notifyInferiorRunningRequested();
+    setState(InferiorRunningRequested);
+    showStatusMessage(tr("Running requested..."), 5000);
     const int pos = sp->remoteChannel.indexOf(QLatin1Char(':'));
     const QString host = sp->remoteChannel.left(pos);
     const quint16 port = sp->remoteChannel.mid(pos + 1).toInt();
@@ -558,7 +557,7 @@ void TcfEngine::updateLocals()
 void TcfEngine::updateWatchData(const WatchData &)
 {
     //qq->watchHandler()->rebuildModel();
-    q->showStatusMessage(tr("Stopped."), 5000);
+    showStatusMessage(tr("Stopped."), 5000);
 }
 
 void TcfEngine::updateSubItem(const WatchData &data0)
@@ -567,9 +566,9 @@ void TcfEngine::updateSubItem(const WatchData &data0)
     QTC_ASSERT(false, return);
 }
 
-IDebuggerEngine *createTcfEngine(DebuggerManager *parent)
+IDebuggerEngine *createTcfEngine(DebuggerManager *manager)
 {
-    return new TcfEngine(parent);
+    return new TcfEngine(manager);
 }
 
 } // namespace Internal
diff --git a/src/plugins/debugger/tcf/tcfengine.h b/src/plugins/debugger/tcf/tcfengine.h
index 11dcd866d75e7df6ad2b11c970a2394f2cb5ea84..8b3f661f5f635304ea8fe11436625b907e5376e9 100644
--- a/src/plugins/debugger/tcf/tcfengine.h
+++ b/src/plugins/debugger/tcf/tcfengine.h
@@ -54,8 +54,6 @@ QT_END_NAMESPACE
 namespace Debugger {
 namespace Internal {
 
-class DebuggerManager;
-class IDebuggerManagerAccessForEngines;
 class ScriptAgent;
 class WatchData;
 
@@ -163,8 +161,6 @@ private:
     void acknowledgeResult();
     int m_inAir;
 
-    DebuggerManager *q;
-    IDebuggerManagerAccessForEngines *qq;
     QTcpSocket *m_socket;
     QByteArray m_inbuffer;
     QList<QByteArray> m_services;