diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index 1367cbeb5bd5da4305f9959dfcc5f2a35cb97338..5925f2df179ac9254e3921942e0fc3e6cf9645e8 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -134,6 +134,12 @@ enum DebuggerStartMode
     StartRemoteEngine      // Start ipc guest engine on other machine
 };
 
+enum DebuggerCloseMode
+{
+    KillAtClose,
+    DetachAtClose
+};
+
 enum DebuggerCapabilities
 {
     ReverseSteppingCapability = 0x1,
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 0eb329b346eb8f5f53e2b5b53d86eac19e0d6865..45e1e3e8243115904d5add13ff125bdc3bc58d90 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1339,6 +1339,7 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it,
         qulonglong pid = it->toULongLong();
         if (pid) {
             sp.startMode = AttachExternal;
+            sp.closeMode = DetachAtClose;
             sp.attachPID = pid;
             sp.displayName = tr("Process %1").arg(sp.attachPID);
             sp.startMessage = tr("Attaching to local process %1.").arg(sp.attachPID);
@@ -1560,6 +1561,7 @@ void DebuggerPluginPrivate::attachExternalApplication()
     sp.displayName = tr("Process %1").arg(dlg.attachPID());
     sp.executable = dlg.executable();
     sp.startMode = AttachExternal;
+    sp.closeMode = DetachAtClose;
     sp.toolChainAbi = dlg.abi();
     sp.debuggerCommand = dlg.debuggerCommand();
     if (DebuggerRunControl *rc = createDebugger(sp))
@@ -1572,6 +1574,7 @@ void DebuggerPluginPrivate::attachExternalApplication(RunControl *rc)
     sp.attachPID = rc->applicationProcessHandle().pid();
     sp.displayName = tr("Debugger attached to %1").arg(rc->displayName());
     sp.startMode = AttachExternal;
+    sp.closeMode = DetachAtClose;
     sp.toolChainAbi = rc->abi();
     if (DebuggerRunControl *rc = createDebugger(sp))
         startDebugger(rc);
@@ -1617,6 +1620,7 @@ void DebuggerPluginPrivate::attachToRemoteServer(const QString &spec)
     sp.remoteArchitecture = spec.section(QLatin1Char('@'), 2, 2);
     sp.displayName = tr("Remote: \"%1\"").arg(sp.remoteChannel);
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     sp.toolChainAbi = anyAbiOfBinary(sp.executable);
     if (DebuggerRunControl *rc = createDebugger(sp))
         startDebugger(rc);
@@ -1630,6 +1634,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession()
     sp.toolChainAbi = Abi(hostAbi.architecture(), Abi::WindowsOS,
         Abi::WindowsMsvc2010Flavor, Abi::PEFormat, hostAbi.wordWidth());
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     StartRemoteCdbDialog dlg(mainWindow());
     QString previousConnection = configValue(connectionKey).toString();
     if (previousConnection.isEmpty())
@@ -1666,6 +1671,7 @@ void DebuggerPluginPrivate::attachToRemoteServer()
     DebuggerStartParameters sp;
     if (StartRemoteDialog::run(mainWindow(), m_coreSettings, false, &sp)) {
         sp.startMode = AttachToRemoteServer;
+        sp.closeMode = KillAtClose;
         sp.useServerStartScript = false;
         sp.serverStartScript.clear();
         if (RunControl *rc = createDebugger(sp))
@@ -1742,6 +1748,7 @@ void DebuggerPluginPrivate::attachedToProcess(const QString &channel,
     sp.sysroot = sysroot;
     sp.executable = localExecutable;
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     sp.overrideStartScript.clear();
     sp.useServerStartScript = false;
     sp.serverStartScript.clear();
@@ -1785,6 +1792,7 @@ void DebuggerPluginPrivate::attachToQmlPort()
     sp.sysroot = dlg.sysroot();
 
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     sp.languages = QmlLanguage;
 
     //
diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h
index b5eef3f2262c7a335fb2a036852ae3fbad3cb8ea..4adc77a8d07bb2c38b9e5826c5d9028e023d38ce 100644
--- a/src/plugins/debugger/debuggerstartparameters.h
+++ b/src/plugins/debugger/debuggerstartparameters.h
@@ -67,6 +67,7 @@ public:
         useServerStartScript(false),
         requestRemoteSetup(false),
         startMode(NoStartMode),
+        closeMode(KillAtClose),
         executableUid(0),
         communicationChannel(CommunicationChannelTcpIp),
         serverPort(0),
@@ -125,6 +126,7 @@ public:
     QString dumperLibrary;
     QStringList dumperLibraryLocations;
     DebuggerStartMode startMode;
+    DebuggerCloseMode closeMode;
 
     // For Symbian debugging.
     quint32 executableUid;
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index 05410a9d61ec79b555f4717c1533d7cae2008c90..51ed0bf5c591bcc96cc60b16cea2d9ce3200494a 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -75,7 +75,6 @@ public:
     virtual void setupInferior() = 0;
     virtual void runEngine() = 0;
     virtual void interruptInferior() = 0;
-    virtual void shutdownInferior() = 0;
     virtual void shutdownAdapter() = 0;
     virtual AbstractGdbProcess *gdbProc() = 0;
 
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp
index 6e1f91f17552586f62b47dc690eda1fcd4829e04..28c722a4e085d6e038bb5557401c22d91d8f6db3 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp
@@ -116,11 +116,6 @@ void AttachGdbAdapter::interruptInferior()
     interruptLocalInferior(startParameters().attachPID);
 }
 
-void AttachGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("detach");
-}
-
 void AttachGdbAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h
index 01a6feb9fc786206147ec65b26058678693596c4..e9a41ac49d96764b0e17bcfbdf463e4a2f729099 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.h
+++ b/src/plugins/debugger/gdb/attachgdbadapter.h
@@ -59,7 +59,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
diff --git a/src/plugins/debugger/gdb/codagdbadapter.cpp b/src/plugins/debugger/gdb/codagdbadapter.cpp
index 1cc5135f5ebefeb9f28aedf8b8d258f36bd98811..1049e4a2f5f9d690afb9dab9b5c9921dbc9b4a3d 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.cpp
+++ b/src/plugins/debugger/gdb/codagdbadapter.cpp
@@ -1237,11 +1237,6 @@ void CodaGdbAdapter::cleanup()
     }
 }
 
-void CodaGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void CodaGdbAdapter::shutdownAdapter()
 {
     if (m_gdbProc.state() == QProcess::Running) {
diff --git a/src/plugins/debugger/gdb/codagdbadapter.h b/src/plugins/debugger/gdb/codagdbadapter.h
index d517cdedaf18a1c83ba36dc62cb8daa82aa8aff4..56efb451a8506a9bb23b3edb9fafe0a744975e9a 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.h
+++ b/src/plugins/debugger/gdb/codagdbadapter.h
@@ -114,7 +114,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
     void sendRunControlTerminateCommand();
     void handleRunControlTerminate(const Coda::CodaCommandResult &);
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 1bb0d94bec3de4a55fa4bf1cc125bb114fdeb99e..db8cb4bac1c7a7cfafe0a7b5dc86a6c067fa3e32 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1893,13 +1893,15 @@ void GdbEngine::shutdownInferior()
 {
     QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state());
     m_commandsToRunOnTemporaryBreak.clear();
-    m_gdbAdapter->shutdownInferior();
-}
-
-void GdbEngine::defaultInferiorShutdown(const char *cmd)
-{
-    QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state());
-    postCommand(cmd, NeedsStop | LosesChild, CB(handleInferiorShutdown));
+    switch (startParameters().closeMode) {
+        case KillAtClose:
+            postCommand("kill", NeedsStop | LosesChild, CB(handleInferiorShutdown));
+            break;
+        case DetachAtClose:
+            postCommand("detach", NeedsStop | LosesChild, CB(handleInferiorShutdown));
+            break;
+    }
+    QTC_ASSERT(false, notifyInferiorShutdownFailed());
 }
 
 void GdbEngine::handleInferiorShutdown(const GdbResponse &response)
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 96c828e64a61e2adda118299672ff1d9e5091246..0403bcd12bd1a0fce9962a1e86cf9384df26c5d4 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -264,7 +264,6 @@ private: ////////// Gdb Process Management //////////
     void handleNamespaceExtraction(const GdbResponse &response);
 
     void handleAdapterStarted();
-    void defaultInferiorShutdown(const char *cmd);
     void loadInitScript();
     void loadPythonDumpers();
     void pythonDumpersFailed();
diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.cpp b/src/plugins/debugger/gdb/localplaingdbadapter.cpp
index 0b0060ffa63384a426be73090584350cdda01079..1e0ad9ff24d1d22607ca89f6905936f22d29f1a6 100644
--- a/src/plugins/debugger/gdb/localplaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/localplaingdbadapter.cpp
@@ -114,11 +114,6 @@ void LocalPlainGdbAdapter::runEngine()
     AbstractPlainGdbAdapter::runEngine();
 }
 
-void LocalPlainGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void LocalPlainGdbAdapter::shutdownAdapter()
 {
     showMessage(_("PLAIN ADAPTER SHUTDOWN %1").arg(state()));
diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.h b/src/plugins/debugger/gdb/localplaingdbadapter.h
index ced097faac34d752aa66227ab4fde3542e222c38..39181bac7e629884158ed1ad0e978a2f56343e7d 100644
--- a/src/plugins/debugger/gdb/localplaingdbadapter.h
+++ b/src/plugins/debugger/gdb/localplaingdbadapter.h
@@ -58,7 +58,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     DumperHandling dumperHandling() const;
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index 0e3dd9e0ffafa9790e512c471dd5d3e0307bdd0a..daf20e3df0a3d8226197faa05390d81cb07d9eac 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -365,14 +365,6 @@ void RemoteGdbServerAdapter::handleInterruptInferior(const GdbResponse &response
     }
 }
 
-void RemoteGdbServerAdapter::shutdownInferior()
-{
-    if (m_engine->startParameters().startMode == AttachToRemoteServer)
-        m_engine->defaultInferiorShutdown("detach");
-    else
-        m_engine->defaultInferiorShutdown("kill");
-}
-
 void RemoteGdbServerAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h
index 9261797d6d406eb4daf7ed47dc23688f8f2f01c5..7a3f88d642e7773338481f6160aa2c2f4e0f6b3e 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.h
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h
@@ -59,7 +59,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
index 5913ade032161cd87ecc2c89c8e1fe4e3930c4d7..a3a7263b14aaaaf4e65d13721c724065eecbb816 100644
--- a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
@@ -98,11 +98,6 @@ void RemotePlainGdbAdapter::handleApplicationOutput(const QByteArray &output)
     showMessage(QString::fromUtf8(output), AppOutput);
 }
 
-void RemotePlainGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void RemotePlainGdbAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h
index b1e764457485c1ac7be1670973e0d2001873e7ae..7c19e10df893d32e7ef821f462d0efdfef805e6f 100644
--- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h
+++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h
@@ -55,7 +55,6 @@ private:
     void startAdapter();
     void setupInferior();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
     void handleRemoteSetupDone(int gdbServerPort, int qmlPort);
     void handleRemoteSetupFailed(const QString &reason);
diff --git a/src/plugins/debugger/gdb/termgdbadapter.cpp b/src/plugins/debugger/gdb/termgdbadapter.cpp
index 8acff6ede484be22c330bc3edc30bc991100c366..135630e8758785f244cfef65ce725240d9e8093a 100644
--- a/src/plugins/debugger/gdb/termgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/termgdbadapter.cpp
@@ -210,11 +210,6 @@ void TermGdbAdapter::stubExited()
     m_engine->notifyEngineIll();
 }
 
-void TermGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void TermGdbAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/termgdbadapter.h b/src/plugins/debugger/gdb/termgdbadapter.h
index d9ecee078d6075733096f895b6df7c882f03d83a..b56d969cd2d79e5a70ca32839be885b8cfe6b847 100644
--- a/src/plugins/debugger/gdb/termgdbadapter.h
+++ b/src/plugins/debugger/gdb/termgdbadapter.h
@@ -62,7 +62,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }