diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index d9c24e86443a05db8520997379076ab1348c62e9..ac5e9fecc91fe06d6537b395220307fa5c1b9c87 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -38,28 +38,6 @@
 namespace Debugger {
 namespace Internal {
 
-class GdbEngine;
-
-enum GdbAdapterState 
-{
-    AdapterNotRunning,
-    AdapterStarting,
-    AdapterStarted,
-    AdapterStartFailed,
-    InferiorPreparing,
-    InferiorPrepared,
-    InferiorPreparationFailed,
-    InferiorStarting,
-    InferiorStarted,
-    InferiorStartFailed,
-    InferiorShuttingDown,
-    InferiorShutDown,
-    InferiorShutdownFailed,
-    AdapterShuttingDown,
-    //AdapterShutDown,  // use AdapterNotRunning 
-    AdapterShutdownFailed,
-};
-
 // AbstractGdbAdapter is inherited by PlainGdbAdapter used for local
 // debugging and TrkGdbAdapter used for on-device debugging.
 // In the PlainGdbAdapter case it's just a wrapper around a QProcess running
@@ -71,7 +49,7 @@ class AbstractGdbAdapter : public QObject
 
 public:
     AbstractGdbAdapter(GdbEngine *engine, QObject *parent = 0)
-        : QObject(parent), m_engine(engine), m_state(AdapterNotRunning)
+        : QObject(parent), m_engine(engine)
     {}
 
     virtual QByteArray readAllStandardError() = 0;
@@ -109,12 +87,9 @@ signals:
     void readyReadStandardOutput();
     void readyReadStandardError();
 
-public:
-    GdbAdapterState state() const { return m_state; }
-    // Called by GdbEngine::handleAsyncOutput
-    void notifyInferiorExited();
-
 protected:
+    GdbAdapterState state() const
+        { return m_engine->state(); }
     void setState(GdbAdapterState state);
     const DebuggerStartParameters &startParameters() const
         { return m_engine->startParameters(); }
@@ -122,7 +97,6 @@ protected:
         { m_engine->debugMessage(msg); }
 
     GdbEngine * const m_engine;
-    GdbAdapterState m_state;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index b4e2bd7f68b77f7966ee56671c09cecf0c48179a..4e94892bcbde43d19f634b7416e0826bf7cb2813 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -176,6 +176,7 @@ GdbEngine::GdbEngine(DebuggerManager *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);
@@ -659,7 +660,7 @@ void GdbEngine::interruptInferior()
 //    debugMessage(_("GDBENGINE INTERRUPT INFERIOR: %1").arg(m_gdbAdapter->state()));
     qq->notifyInferiorStopRequested();
 
-    if (m_gdbAdapter->state() == AdapterNotRunning) {
+    if (state() == AdapterNotRunning) {
         debugMessage(_("TRYING TO INTERRUPT INFERIOR WITHOUT RUNNING GDB"));
         shutdown();
         return;
@@ -725,7 +726,7 @@ void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags,
 
 void GdbEngine::postCommandHelper(const GdbCommand &cmd)
 {
-    if (!stateAcceptsGdbCommands(m_gdbAdapter->state())) {
+    if (!stateAcceptsGdbCommands(state())) {
         PENDING_DEBUG(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command);
         debugMessage(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command);
         return;
@@ -759,7 +760,7 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd)
 void GdbEngine::flushCommand(const GdbCommand &cmd0)
 {
     GdbCommand cmd = cmd0;
-    if (m_gdbAdapter->state() == AdapterNotRunning) {
+    if (state() == AdapterNotRunning) {
         emit gdbInputAvailable(LogInput, cmd.command);
         debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command);
         return;
@@ -862,7 +863,7 @@ void GdbEngine::handleResultRecord(const GdbResponse &response)
 
 void GdbEngine::executeDebuggerCommand(const QString &command)
 {
-    if (m_gdbAdapter->state() == AdapterNotRunning) {
+    if (state() == AdapterNotRunning) {
         debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + command);
         return;
     }
@@ -1079,7 +1080,9 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
 
     if (isExitedReason(reason)) {
         // Give adapter a chance to take notice of regular exits.
-        m_gdbAdapter->notifyInferiorExited();
+        QTC_ASSERT(state() == InferiorStarted, /**/);
+        setState(InferiorShuttingDown);
+        setState(InferiorShutDown);
 
         QString msg;
         if (reason == "exited") {
@@ -4217,10 +4220,6 @@ void GdbEngine::showMessageBox(int icon, const QString &title, const QString &te
     m_manager->showMessageBox(icon, title, text);
 }
 
-//
-// AbstractGdbAdapter
-//
-
 static bool isAllowedTransition(int from, int to)
 {
     return (from == -1)
@@ -4242,20 +4241,27 @@ static bool isAllowedTransition(int from, int to)
     ;
 }
 
-void AbstractGdbAdapter::setState(GdbAdapterState state)
+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;
-    m_engine->debugMessage(msg);
+    debugMessage(msg);
     m_state = state;
 }
 
-void AbstractGdbAdapter::notifyInferiorExited()
+//
+// AbstractGdbAdapter
+//
+
+void AbstractGdbAdapter::setState(GdbAdapterState state)
 {
-    QTC_ASSERT(state() == InferiorStarted, /**/);
-    setState(InferiorShuttingDown);
-    setState(InferiorShutDown);
+    m_engine->setState(state);
 }
 
 //
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 79b078b5f449ba6557fde767b876942a9c44c316..b3c0dfa219eaba2157815e6e44a89f499d054158 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -79,6 +79,26 @@ 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
@@ -201,7 +221,7 @@ private:
 
     // type and cookie are sender-internal data, opaque for the "event
     // queue". resultNeeded == true increments m_pendingResults on
-    // send and decrements on receipt, effectively preventing 
+    // send and decrements on receipt, effectively preventing
     // watch model updates before everything is finished.
     void flushCommand(const GdbCommand &cmd);
     void postCommand(const QString &command,
@@ -302,7 +322,7 @@ private:
     int m_oldestAcceptableToken;
 
     int m_gdbVersion; // 6.8.0 is 680
-    int m_gdbBuildVersion; // MAC only? 
+    int m_gdbBuildVersion; // MAC only?
 
     // awful hack to keep track of used files
     QMap<QString, QString> m_shortToFullName;
@@ -331,7 +351,7 @@ private:
 
     //
     // Register specific stuff
-    // 
+    //
     Q_SLOT void reloadRegisters();
     void setRegisterValue(int nr, const QString &value);
     void handleRegisterListNames(const GdbResponse &response);
@@ -339,12 +359,12 @@ private:
 
     //
     // Source file specific stuff
-    // 
+    //
     void reloadSourceFiles();
 
     //
     // Stack specific stuff
-    // 
+    //
     void handleStackListFrames(const GdbResponse &response);
     void handleStackSelectThread(const GdbResponse &response);
     void handleStackListThreads(const GdbResponse &response);
@@ -354,7 +374,7 @@ private:
 
     //
     // Tooltip specific stuff
-    // 
+    //
     void sendToolTipCommand(const QString &command, const QString &cookie);
 
 
@@ -401,15 +421,15 @@ private:
     void setLocals(const QList<GdbMi> &locals);
     void connectDebuggingHelperActions();
     void disconnectDebuggingHelperActions();
-   
+
     bool startModeAllowsDumpers() const;
     QString parseDisassembler(const GdbMi &lines);
 
     int m_pendingRequests;
-    QSet<QString> m_processedNames; 
+    QSet<QString> m_processedNames;
 
     QtDumperHelper m_dumperHelper;
-    
+
     DebuggingHelperState m_debuggingHelperState;
     QList<GdbMi> m_currentFunctionArgs;
     QString m_currentFrame;
@@ -436,7 +456,13 @@ private:
     PlainGdbAdapter *m_plainAdapter;   // owned
     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);
     void debugMessage(const QString &msg);