diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 1fd3adfef8579b0d670c4bdc4e3a6ab143c1d027..076602147a473062d881d59623e33b334f29bbcd 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -687,6 +687,7 @@ void GdbEngine::readGdbStandardOutput()
 
 void GdbEngine::interruptInferior()
 {
+    debugMessage(_("GDBENGINE INTERRUPT INFERIOR: %1").arg(m_gdbAdapter->state()));
     qq->notifyInferiorStopRequested();
 
     if (m_gdbAdapter->state() == QProcess::NotRunning) {
@@ -1478,6 +1479,7 @@ void GdbEngine::shutdown()
 void GdbEngine::detachDebugger()
 {
     postCommand(_("detach"));
+    // FIXME: use postCommand(_("detach"), CB(handleExitHelper)) ?
     postCommand(_("-gdb-exit"), CB(handleExit));
 }
 
@@ -1500,18 +1502,30 @@ void GdbEngine::exitDebugger()
             interruptInferior();
         }
         if (startMode() == AttachExternal || startMode() == AttachCrashedExternal)
-            postCommand(_("detach"));
+            postCommand(_("detach"), CB(handleExitHelper));
         else
-            postCommand(_("kill"));
-        postCommand(_("-gdb-exit"), CB(handleExit));
-        // 20s can easily happen when loading webkit debug information
-        if (!m_gdbAdapter->waitForFinished(20000)) {
-            debugMessage(_("FORCING TERMINATION: %1")
-                .arg(m_gdbAdapter->state()));
-            m_gdbAdapter->terminate();
-            m_gdbAdapter->waitForFinished(20000);
-        }
+            postCommand(_("kill"), CB(handleExitHelper));
+    } else {
+        exitDebugger2();
     }
+}
+
+void GdbEngine::handleExitHelper(const GdbResultRecord &, const QVariant &)
+{
+    exitDebugger2();
+}
+
+void GdbEngine::exitDebugger2()
+{
+    postCommand(_("-gdb-exit"), CB(handleExit));
+    // 20s can easily happen when loading webkit debug information
+    if (!m_gdbAdapter->waitForFinished(20000)) {
+        debugMessage(_("FORCING TERMINATION: %1")
+            .arg(m_gdbAdapter->state()));
+        m_gdbAdapter->terminate();
+        m_gdbAdapter->waitForFinished(20000);
+    }
+
     if (m_gdbAdapter->state() != QProcess::NotRunning) {
         debugMessage(_("PROBLEM STOPPING DEBUGGER: STATE %1")
             .arg(m_gdbAdapter->state()));
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 2498cfb2e3e09d739a2148ed6b3e8fd59246a9cd..97924e0efe3fd2acc0f4541c4cf265aaa7a036cb 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -147,6 +147,7 @@ private:
     void startDebugger(const QSharedPointer<DebuggerStartParameters> &sp);
     Q_SLOT void startDebugger2();
     void exitDebugger();
+    void exitDebugger2();
     void detachDebugger();
 
     void continueInferior();
@@ -284,6 +285,7 @@ private:
     void handleQuerySources(const GdbResultRecord &response, const QVariant &);
     void handleTargetCore(const GdbResultRecord &, const QVariant &);
     void handleExit(const GdbResultRecord &, const QVariant &);
+    void handleExitHelper(const GdbResultRecord &, const QVariant &);
     void handleSetTargetAsync(const GdbResultRecord &, const QVariant &);
     void handleTargetRemote(const GdbResultRecord &, const QVariant &);
     void handleWatchPoint(const GdbResultRecord &, const QVariant &);
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index d2bd274357d96830297de749a185a10ce6c7fe4d..b892167d27513199da943ba2ce55cbadda50f483 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -488,13 +488,12 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
     else if (cmd == "k" || cmd.startsWith("vKill")) {
         // Kill inferior process
         logMessage(msgGdbPacket(QLatin1String("kill")));
-        sendGdbServerAck();
         QByteArray ba;
         appendByte(&ba, 0); // ?
         appendByte(&ba, 0); // Sub-command: Delete Process
         appendInt(&ba, m_session.pid);
-        sendTrkMessage(0x41, TrkCallback(), ba, "Delete process"); // Delete Item
-        sendGdbServerMessageAfterTrkResponse("", "process killed");
+        sendTrkMessage(0x41, TrkCB(handleDeleteProcess),
+            ba, "Delete process"); // Delete Item
     }
 
     else if (cmd.startsWith("m")) {
@@ -935,6 +934,22 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
     startGdb();
 }
 
+void TrkGdbAdapter::handleDeleteProcess(const TrkResult &result)
+{
+    Q_UNUSED(result);
+    logMessage("TRK Process killed");
+    //sendTrkMessage(0x01, TrkCB(handleDeleteProcess2)); // Ping
+    sendTrkMessage(0x02, TrkCB(handleDeleteProcess2)); // Disconnect
+}
+
+void TrkGdbAdapter::handleDeleteProcess2(const TrkResult &result)
+{
+    Q_UNUSED(result);
+    logMessage("process killed");
+    sendGdbServerAck();
+    sendGdbServerMessage("", "process killed");
+}
+
 void TrkGdbAdapter::handleReadRegisters(const TrkResult &result)
 {
     logMessage("       RESULT: " + result.toString());
@@ -1269,7 +1284,7 @@ void TrkGdbAdapter::handleGdbStateChanged(QProcess::ProcessState newState)
 void TrkGdbAdapter::run()
 {
     emit output("### Starting TrkGdbAdapter");
-    m_rfcommProc.start("rfcomm listen " + m_rfcommDevice + " 1");
+    m_rfcommProc.start("rfcomm -r listen " + m_rfcommDevice + " 1");
     m_rfcommProc.waitForStarted();
     
     if (m_rfcommProc.state() != QProcess::Running) {
@@ -1369,16 +1384,26 @@ void TrkGdbAdapter::start(const QString &program, const QStringList &args,
 
 void TrkGdbAdapter::kill()
 {
+    m_rfcommProc.kill();
     m_gdbProc.kill();
 }
 
 void TrkGdbAdapter::terminate()
 {
+    m_rfcommProc.terminate();
     m_gdbProc.terminate();
 }
 
 bool TrkGdbAdapter::waitForFinished(int msecs)
 {
+    QByteArray ba;
+    ba.append(0x03);
+    m_rfcommProc.write(ba);
+    m_rfcommProc.terminate();
+    m_rfcommProc.waitForFinished();
+    QProcess proc;
+    proc.start("rfcomm release " + m_rfcommDevice.toLatin1());
+    proc.waitForFinished();
     return m_gdbProc.waitForFinished(msecs);
 }
 
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index ce9d9c5060860c8d585abf91a8e66c75ab8b44d2..953725b5a9442d1308bbf736aca0898f159628e6 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -156,6 +156,8 @@ public:
     void handleSupportMask(const TrkResult &result);
     void handleTrkVersions(const TrkResult &result);
     void handleDisconnect(const TrkResult &result);
+    void handleDeleteProcess(const TrkResult &result);
+    void handleDeleteProcess2(const TrkResult &result);
 
     void handleAndReportCreateProcess(const TrkResult &result);
     void handleAndReportReadRegistersAfterStop(const TrkResult &result);