diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index ea6f6fea51e112615b1926bce53726de08ef6c53..e7780922f9c4406d36743212ca3d41fd722fd470 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1245,15 +1245,6 @@ void DebuggerManager::setStatus(int status)
     const bool ready = status == DebuggerInferiorStopped
             && startMode() != AttachCore;
 
-// FIXME
-//    m_startExternalAction->setEnabled(!started && !starting);
-//    m_attachExternalAction->setEnabled(!started && !starting);
-//#ifdef Q_OS_WIN
-//    m_attachCoreAction->setEnabled(false);
-//#else
-//    m_attachCoreAction->setEnabled(!started && !starting);
-//#endif
-//    m_attachRemoteAction->setEnabled(!started && !starting);
     m_watchAction->setEnabled(ready);
     m_breakAction->setEnabled(true);
 
@@ -1316,6 +1307,12 @@ void DebuggerManager::continueExec()
         m_engine->continueInferior();
 }
 
+void DebuggerManager::detachDebugger()
+{
+    if (m_engine)
+        m_engine->detachDebugger();
+}
+
 void DebuggerManager::interruptDebuggingRequest()
 {
     if (Debugger::Constants::Internal::debug)
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 78d73c2db2b998102ed5ba354995fb360233dc75..aeb253d030d6fef568b63ccbfedce2d6c2e785e0 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -242,6 +242,7 @@ public slots:
     void stepIExec();
     void nextIExec();
     void continueExec();
+    void detachDebugger();
 
     void addToWatchWindow();
     void updateWatchModel();
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index d8ac64217ad2e9a78b6d4b82cede095838b5ebc3..1382b67897438c7f3ec29e8329fae1da2c149580 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -100,6 +100,7 @@ const char * const STARTEXTERNAL        = "Debugger.StartExternal";
 const char * const ATTACHEXTERNAL       = "Debugger.AttachExternal";
 const char * const ATTACHCORE           = "Debugger.AttachCore";
 const char * const ATTACHREMOTE         = "Debugger.AttachRemote";
+const char * const DETACH               = "Debugger.Detach";
 
 const char * const RUN_TO_LINE          = "Debugger.RunToLine";
 const char * const RUN_TO_FUNCTION      = "Debugger.RunToFunction";
@@ -486,6 +487,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
         this, SLOT(startRemoteApplication()));
 
 
+    m_detachAction = new QAction(this);
+    m_detachAction->setText(tr("Detach debugger"));
+    connect(m_detachAction, SIGNAL(triggered()),
+        m_manager, SLOT(detachDebugger()));
+
     Core::ActionContainer *mdebug =
         am->actionContainer(ProjectExplorer::Constants::M_DEBUG);
 
@@ -508,6 +514,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
 
     cmd = am->registerAction(m_manager->m_continueAction,
         ProjectExplorer::Constants::DEBUG, QList<int>() << m_gdbRunningContext);
+    mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
+
+    cmd = am->registerAction(m_detachAction,
+        Constants::DETACH, globalcontext);
+    mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
 
     cmd = am->registerAction(m_manager->m_stopAction,
         Constants::INTERRUPT, globalcontext);
@@ -783,6 +794,9 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
         this, SLOT(activatePreviousMode()));
     connect(m_manager, SIGNAL(debugModeRequested()),
         this, SLOT(activateDebugMode()));
+    connect(m_manager, SIGNAL(statusChanged(int)),
+        this, SLOT(updateActions(int)));
+
 
     connect(theDebuggerAction(SettingsDialog), SIGNAL(triggered()),
         this, SLOT(showSettingsDialog()));
@@ -1095,6 +1109,28 @@ void DebuggerPlugin::startRemoteApplication()
         runControl->start();
 }
 
+void DebuggerPlugin::updateActions(int status)
+{
+    const bool started = status == DebuggerInferiorRunning
+        || status == DebuggerInferiorRunningRequested
+        || status == DebuggerInferiorStopRequested
+        || status == DebuggerInferiorStopped;
+
+    const bool starting = status == DebuggerProcessStartingUp;
+    //const bool running = status == DebuggerInferiorRunning;
+
+    const bool ready = status == DebuggerInferiorStopped
+            && m_manager->startMode() != AttachCore;
+    m_startExternalAction->setEnabled(!started && !starting);
+    m_attachExternalAction->setEnabled(!started && !starting);
+#ifdef Q_OS_WIN
+    m_attachCoreAction->setEnabled(false);
+#else
+    m_attachCoreAction->setEnabled(!started && !starting);
+#endif
+    m_startRemoteAction->setEnabled(!started && !starting);
+    m_detachAction->setEnabled(ready);
+}
 
 #include "debuggerplugin.moc"
 
diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h
index 78d228dc8e358e3b539bf42ad85b2009497de0e7..b9b6254d3bce321ef93c6820cbf6027eb075ce41 100644
--- a/src/plugins/debugger/debuggerplugin.h
+++ b/src/plugins/debugger/debuggerplugin.h
@@ -88,6 +88,8 @@ private slots:
     void setConfigValue(const QString &name, const QVariant &value);
     void requestContextMenu(TextEditor::ITextEditor *editor,
         int lineNumber, QMenu *menu);
+    void updateActions(int status);
+
 
     void resetLocation();
     void gotoLocation(const QString &fileName, int line, bool setMarker);
@@ -125,6 +127,7 @@ private:
     QAction *m_startRemoteAction;
     QAction *m_attachExternalAction;
     QAction *m_attachCoreAction;
+    QAction *m_detachAction;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 8214a4d04db7925e0a39a31f734cd0d36307fa60..583b9aa5c100f7d0485db4ebf84ec67c649344d8 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -1254,7 +1254,6 @@ void GdbEngine::handleExecRun(const GdbResultRecord &response, const QVariant &)
 {
     if (response.resultClass == GdbResultRunning) {
         qq->notifyInferiorRunning();
-        q->showStatusMessage(tr("Running..."));
     } else if (response.resultClass == GdbResultError) {
         const QByteArray &msg = response.data.findChild("msg").data();
         if (msg == "Cannot find bounds of current function") {
@@ -1323,6 +1322,12 @@ void GdbEngine::shutdown()
     exitDebugger();
 }
 
+void GdbEngine::detachDebugger()
+{
+    postCommand(_("detach"));
+    postCommand(_("-gdb-exit"), CB(handleExit));
+}
+
 void GdbEngine::exitDebugger()
 {
     debugMessage(_("GDBENGINE EXITDEBUFFER: %1").arg(m_gdbProc.state()));
@@ -1340,7 +1345,7 @@ void GdbEngine::exitDebugger()
                 qDebug() << "STATUS ON EXITDEBUGGER:" << q->status());
             interruptInferior();
         }
-        if (q->startMode() == AttachExternal || q->startMode() == StartRemote)
+        if (q->startMode() == AttachExternal)
             postCommand(_("detach"));
         else
             postCommand(_("kill"));
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index b1750fbfd820e4d9299f5f6b5dc3425b28b1a506..095c09a91e766bd2baa8cc2180ffe4c26225ad34 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -99,6 +99,7 @@ private:
     void setToolTipExpression(const QPoint &pos, const QString &exp);
     bool startDebugger();
     void exitDebugger();
+    void detachDebugger();
 
     void continueInferior();
     void interruptInferior();
diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h
index ececbe9aa7a74c65a91481c072677f878998b0e9..9d85ebace1055744754d0afc015ee3dcb2d6da85 100644
--- a/src/plugins/debugger/idebuggerengine.h
+++ b/src/plugins/debugger/idebuggerengine.h
@@ -52,6 +52,7 @@ public:
     virtual void setToolTipExpression(const QPoint &pos, const QString &exp) = 0;
     virtual bool startDebugger() = 0;
     virtual void exitDebugger() = 0;
+    virtual void detachDebugger() {}
     virtual void updateWatchModel() = 0;
 
     virtual void stepExec() = 0;