diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 807445858631e581256e7d142d26eddc082b61fc..8980ccec8384b0183741596cbe15a566a75a4498 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -225,7 +225,9 @@ QMainWindow *GdbEngine::mainWindow() const
 GdbEngine::~GdbEngine()
 {
     // prevent sending error messages afterwards
+    disconnect(&m_gdbProc);
     delete m_gdbAdapter;
+    m_gdbAdapter = 0;
 }
 
 void GdbEngine::connectAdapter()
@@ -1325,7 +1327,11 @@ void GdbEngine::shutdown()
         // fall-through
     case AdapterStartFailed: // Adapter "did something", but it did not help
         // FIXME set some timeout?
-        postCommand(_("-gdb-exit"), GdbEngine::ExitRequest, CB(handleGdbExit));
+        if (m_gdbProc.state() == QProcess::Running) {
+            postCommand(_("-gdb-exit"), GdbEngine::ExitRequest, CB(handleGdbExit));
+        } else {
+            setState(DebuggerNotReady);
+        }
         break;
     case InferiorRunningRequested:
     case InferiorRunning:
@@ -4099,7 +4105,7 @@ void GdbEngine::gotoLocation(const StackFrame &frame, bool setMarker)
 // Starting up & shutting down
 //
 
-bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
+bool GdbEngine::startGdb(const QStringList &args, const QString &gdb, const QString &settingsIdHint)
 {
     debugMessage(_("STARTING GDB ") + gdb);
 
@@ -4115,7 +4121,8 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
     m_gdbProc.start(location, gdbArgs);
 
     if (!m_gdbProc.waitForStarted()) {
-        handleAdapterStartFailed(m_gdbProc.errorString());
+        const QString msg = tr("Unable to start gdb '%1': %2").arg(gdb, m_gdbProc.errorString());
+        handleAdapterStartFailed(msg, settingsIdHint);
         return false;
     }
 
@@ -4166,7 +4173,6 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
     //  /build/buildd/gdb-6.8/gdb/valops.c:2069: internal-error:
     postCommand(_("set overload-resolution off"));
     //postCommand(_("set demangle-style none"));
-
     // From the docs:
     //  Stop means reenter debugger if this signal happens (implies print).
     //  Print means print a message if this signal happens.
@@ -4238,6 +4244,8 @@ void GdbEngine::handleGdbError(QProcess::ProcessError error)
 void GdbEngine::handleGdbFinished(int code, QProcess::ExitStatus type)
 {
     debugMessage(_("GDB PROCESS FINISHED, status %1, code %2").arg(type).arg(code));
+    if (!m_gdbAdapter)
+        return;
     if (state() == EngineShuttingDown) {
         m_gdbAdapter->shutdown();
     } else if (state() != AdapterStartFailed) {
@@ -4255,9 +4263,14 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg, const QString &sett
 {
     setState(AdapterStartFailed);
     debugMessage(_("ADAPTER START FAILED"));
-    Core::ICore::instance()->showWarningWithOptions(
-            tr("Adapter start failed"), msg, QString(),
-            _(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY), settingsIdHint);
+    const QString title = tr("Adapter start failed");
+    if (settingsIdHint.isEmpty()) {
+        Core::ICore::instance()->showWarningWithOptions(title, msg);
+    } else {
+        Core::ICore::instance()->showWarningWithOptions(title, msg, QString(),
+                    _(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY),
+                    settingsIdHint);
+    }
     shutdown();
 }
 
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 82e07981c2e6788c3bf25844b7bda6956ff034eb..786ac7696a66937d82c9cf78a76e28f8d847c69b 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -126,7 +126,9 @@ private: ////////// Gdb Process Management //////////
 
     AbstractGdbAdapter *createAdapter(const DebuggerStartParametersPtr &dp);
     void connectAdapter();
-    bool startGdb(const QStringList &args = QStringList(), const QString &gdb = QString());
+    bool startGdb(const QStringList &args = QStringList(),
+                  const QString &gdb = QString(),
+                  const QString &settingsIdHint = QString());
     void startInferiorPhase2();
 
     void handleInferiorShutdown(const GdbResponse &response);
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index c3604a803191f9641284f0521ed9b45ba2f44fb6..e954396c30aeb00ad7860778c229eecf570e332b 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -30,6 +30,8 @@
 #include "trkgdbadapter.h"
 #include "trkoptions.h"
 #include "trkoptionspage.h"
+#include "s60debuggerbluetoothstarter.h"
+#include "bluetoothlistener_gui.h"
 
 #include "debuggerstringutils.h"
 #ifndef STANDALONE_RUNNER
@@ -193,10 +195,10 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
     m_options(options),
     m_overrideTrkDeviceType(-1),
     m_running(false),
+    m_trkDevice(new trk::TrkDevice),
     m_gdbAckMode(true),
     m_verbose(2),
-    m_bufferedMemoryRead(true),
-    m_waitCount(0)
+    m_bufferedMemoryRead(true)
 {
     m_gdbServer = 0;
     m_gdbConnection = 0;
@@ -207,28 +209,15 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
 #endif
     m_gdbServerName = _("127.0.0.1:%1").arg(2222 + portOffset);
 
-    connect(&m_rfcommProc, SIGNAL(readyReadStandardError()),
-        this, SLOT(handleRfcommReadyReadStandardError()));
-    connect(&m_rfcommProc, SIGNAL(readyReadStandardOutput()),
-        this, SLOT(handleRfcommReadyReadStandardOutput()));
-    connect(&m_rfcommProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleRfcommError(QProcess::ProcessError)));
-    connect(&m_rfcommProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleRfcommFinished(int, QProcess::ExitStatus)));
-    connect(&m_rfcommProc, SIGNAL(started()),
-        this, SLOT(handleRfcommStarted()));
-    connect(&m_rfcommProc, SIGNAL(stateChanged(QProcess::ProcessState)),
-        this, SLOT(handleRfcommStateChanged(QProcess::ProcessState)));
-
-    connect(&m_trkDevice, SIGNAL(messageReceived(trk::TrkResult)),
+    connect(m_trkDevice.data(), SIGNAL(messageReceived(trk::TrkResult)),
         this, SLOT(handleTrkResult(trk::TrkResult)));
-    connect(&m_trkDevice, SIGNAL(error(QString)),
+    connect(m_trkDevice.data(), SIGNAL(error(QString)),
         this, SLOT(handleTrkError(QString)));
 
-    m_trkDevice.setVerbose(m_verbose);
-    m_trkDevice.setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth);
+    m_trkDevice->setVerbose(m_verbose);
+    m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth);
 
-    connect(&m_trkDevice, SIGNAL(logMessage(QString)),
+    connect(m_trkDevice.data(), SIGNAL(logMessage(QString)),
         this, SLOT(trkLogMessage(QString)));
 }
 
@@ -387,44 +376,6 @@ void TrkGdbAdapter::slotEmitDelayedInferiorStartFailed()
     emit inferiorStartFailed(m_adapterFailMessage);
 }
 
-void TrkGdbAdapter::waitForTrkConnect()
-{
-    QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
-    QString errorMessage;
-    const QString device = effectiveTrkDevice();
-    if (!m_trkDevice.open(device, &errorMessage)) {
-        logMessage(_("Waiting on %1 (%2)").arg(device, errorMessage));
-        if (errorMessage.contains(_("ermission denied"))) {
-            static int direction = 0;
-            direction = (direction + 1) % 4;
-            showStatusMessage(_("Please start TRK on your device! %1")
-                .arg(QChar("/-\\|"[direction])));
-        }
-        // Do not loop forever
-        if (m_waitCount++ < (effectiveTrkDeviceType() == TrkOptions::BlueTooth ? 60 : 5)) {
-            QTimer::singleShot(1000, this, SLOT(waitForTrkConnect()));
-        } else {
-            QString msg = _("Failed to connect to %1 after "
-                "%2 attempts").arg(device).arg(m_waitCount);
-            logMessage(msg);
-            emit adapterStartFailed(msg, TrkOptionsPage::settingsId());
-        }
-        return;
-    }
-
-    m_trkDevice.sendTrkInitialPing();
-    sendTrkMessage(0x02); // Disconnect, as trk might be still connected
-    sendTrkMessage(0x01); // Connect
-    sendTrkMessage(0x05, TrkCB(handleSupportMask));
-    sendTrkMessage(0x06, TrkCB(handleCpuType));
-    sendTrkMessage(0x04, TrkCB(handleTrkVersions)); // Versions
-    //sendTrkMessage(0x09); // Unrecognized command
-    //sendTrkMessage(0x4a, 0,
-    //    "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File
-    //sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File
-
-    emit adapterStarted();
-}
 
 void TrkGdbAdapter::logMessage(const QString &msg)
 {
@@ -981,13 +932,13 @@ i        */
 void TrkGdbAdapter::sendTrkMessage(byte code, TrkCallback callback,
     const QByteArray &data, const QVariant &cookie)
 {
-    m_trkDevice.sendTrkMessage(code, callback, data, cookie);
+    m_trkDevice->sendTrkMessage(code, callback, data, cookie);
 }
 
 void TrkGdbAdapter::sendTrkAck(byte token)
 {
     //logMessage(QString("SENDING ACKNOWLEDGEMENT FOR TOKEN %1").arg(int(token)));
-    m_trkDevice.sendTrkAck(token);
+    m_trkDevice->sendTrkAck(token);
 }
 
 void TrkGdbAdapter::handleTrkError(const QString &msg)
@@ -1495,7 +1446,7 @@ void TrkGdbAdapter::handleSupportMask(const TrkResult &result)
     logMessage("SUPPORTED: " + str);
  }
 
-void TrkGdbAdapter::handleTrkVersions(const TrkResult &result)
+void TrkGdbAdapter::handleTrkVersionsStartGdb(const TrkResult &result)
 {
     QString logMsg;
     QTextStream str(&logMsg);
@@ -1507,6 +1458,13 @@ void TrkGdbAdapter::handleTrkVersions(const TrkResult &result)
              << '.' << int(result.data.at(4));
     }
     logMessage(logMsg);
+    QStringList gdbArgs;
+    gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
+    if (!m_engine->startGdb(gdbArgs, m_options->gdb, TrkOptionsPage::settingsId())) {
+        cleanup();
+        return;
+    }
+    emit adapterStarted();
 }
 
 void TrkGdbAdapter::handleDisconnect(const TrkResult & /*result*/)
@@ -1553,30 +1511,32 @@ void TrkGdbAdapter::startAdapter()
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
     logMessage(QLatin1String("### Starting TrkGdbAdapter"));
-    m_trkDevice.setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth);
+    m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth);
+    // Prompt the user for a bluetooth connection
+    const QString device = effectiveTrkDevice();
+    QString message;    
     if (effectiveTrkDeviceType() == TrkOptions::BlueTooth) {
-        const QString device = effectiveTrkDevice();
-        const QString blueToothListener = QLatin1String("rfcomm");
-        QStringList blueToothListenerArguments;
-        blueToothListenerArguments.append(_("-r"));
-        blueToothListenerArguments.append(_("listen"));
-        blueToothListenerArguments.append(m_options->blueToothDevice);
-        blueToothListenerArguments.append(_("1"));
-        logMessage(_("### Starting BlueTooth listener %1 on %2: %3 %4")
-            .arg(blueToothListener).arg(device).arg(blueToothListener)
-            .arg(blueToothListenerArguments.join(" ")));
-        m_rfcommProc.start(blueToothListener, blueToothListenerArguments);
-        m_rfcommProc.waitForStarted();
-        if (m_rfcommProc.state() != QProcess::Running) {
-            QString msg = _("Failed to start BlueTooth "
-                "listener %1 on %2: %3\n");
-            msg = msg.arg(blueToothListener, device, m_rfcommProc.errorString());
-            msg += QString::fromLocal8Bit(m_rfcommProc.readAllStandardError());
-            emit adapterStartFailed(msg, TrkOptionsPage::settingsId());
+        S60DebuggerBluetoothStarter starter(m_trkDevice);
+        starter.setDevice(device);
+        const trk::StartBluetoothGuiResult src = trk::startBluetoothGui(starter, 0, &message);
+        switch (src) {
+        case trk::BluetoothGuiConnected:
+            break;
+        case trk::BluetoothGuiCanceled:
+            emit adapterStartFailed(message, QString());
+            return;
+        case trk::BluetoothGuiError:
+            emit adapterStartFailed(message, TrkOptionsPage::settingsId());
+            return;
+        };
+    } else {
+        if (!m_trkDevice->isOpen() && !m_trkDevice->open(device, &message)) {
+            message = tr("Failed to connect to %1: %2\nCheck whether TRK is running.").arg(device).arg(message);
+            logMessage(message);
+            emit adapterStartFailed(message, TrkOptionsPage::settingsId());
             return;
         }
     }
-    m_waitCount = 0;
 
     QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer);
     QTC_ASSERT(m_gdbConnection == 0, m_gdbConnection = 0);
@@ -1596,14 +1556,12 @@ void TrkGdbAdapter::startAdapter()
     connect(m_gdbServer, SIGNAL(newConnection()),
         this, SLOT(handleGdbConnection()));
 
-    QStringList gdbArgs;
-    gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
-    if (!m_engine->startGdb(gdbArgs, m_options->gdb)) {
-        cleanup();
-        return;
-    }
-
-    waitForTrkConnect();
+    m_trkDevice->sendTrkInitialPing();
+    sendTrkMessage(0x02); // Disconnect, as trk might be still connected
+    sendTrkMessage(0x01); // Connect
+    sendTrkMessage(0x05, TrkCB(handleSupportMask));
+    sendTrkMessage(0x06, TrkCB(handleCpuType));
+    sendTrkMessage(0x04, TrkCB(handleTrkVersionsStartGdb)); // Versions
 }
 
 void TrkGdbAdapter::startInferior()
@@ -1640,11 +1598,11 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
     m_session.tid = extractInt(data + 5);
     m_session.codeseg = extractInt(data + 9);
     m_session.dataseg = extractInt(data + 13);
+    const QString startMsg = tr("Process started, PID: 0x%1, thread id: 0x%2, code segment: 0x%3, data segment: 0x%4.")
+                             .arg(m_session.pid, 0, 16).arg(m_session.tid, 0, 16)
+                             .arg(m_session.codeseg, 0, 16).arg(m_session.dataseg, 0, 16);
 
-    logMessage("PID: " + hexxNumber(m_session.pid));
-    logMessage("TID: " + hexxNumber(m_session.tid));
-    logMessage("COD: " + hexxNumber(m_session.codeseg));
-    logMessage("DAT: " + hexxNumber(m_session.dataseg));
+    logMessage(startMsg);
 
     const QString fileName = m_symbolFile;
     if (m_symbolFile.isEmpty()) {
@@ -1675,45 +1633,6 @@ void TrkGdbAdapter::startInferiorPhase2()
     m_engine->continueInferiorInternal();
 }
 
-//
-// Rfcomm process handling
-//
-
-void TrkGdbAdapter::handleRfcommReadyReadStandardError()
-{
-    QByteArray ba = m_rfcommProc.readAllStandardError();
-    logMessage(QString("RFCONN stderr: %1").arg(_(ba)));
-}
-
-void TrkGdbAdapter::handleRfcommReadyReadStandardOutput()
-{
-    QByteArray ba = m_rfcommProc.readAllStandardOutput();
-    logMessage(QString("RFCONN stdout: %1").arg(_(ba)));
-}
-
-
-void TrkGdbAdapter::handleRfcommError(QProcess::ProcessError error)
-{
-    logMessage(QString("RFCOMM: Process Error %1: %2")
-        .arg(error).arg(m_rfcommProc.errorString()));
-}
-
-void TrkGdbAdapter::handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus)
-{
-    logMessage(QString("RFCOMM: ProcessFinished %1 %2")
-        .arg(exitCode).arg(exitStatus));
-}
-
-void TrkGdbAdapter::handleRfcommStarted()
-{
-    logMessage(QString("RFCOMM: Process Started"));
-}
-
-void TrkGdbAdapter::handleRfcommStateChanged(QProcess::ProcessState newState)
-{
-    logMessage(QString("RFCOMM: Process State %1").arg(newState));
-}
-
 //
 // AbstractGdbAdapter interface implementation
 //
@@ -1939,7 +1858,7 @@ void TrkGdbAdapter::handleDirectStep3(const TrkResult &result)
 
 void TrkGdbAdapter::cleanup()
 {
-    m_trkDevice.close();
+    m_trkDevice->close();
     delete m_gdbServer;
     m_gdbServer = 0;
 }
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 2f73b7fa76d0f00739340dfac46b1d7ab62707c5..a4e01f3258a6ab5bda1b3574b489f0eb64e9d6db 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -43,10 +43,12 @@
 #include <QtCore/QQueue>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
+#include <QtCore/QSharedPointer>
 
 #include <QtNetwork/QTcpServer>
 #include <QtNetwork/QTcpSocket>
 
+
 namespace Debugger {
 namespace Internal {
 
@@ -152,7 +154,6 @@ private:
 
     QString m_gdbServerName; // 127.0.0.1:(2222+uid)
 
-    QProcess m_rfcommProc;
     bool m_running;
 
 public:
@@ -176,7 +177,6 @@ private:
     void emitDelayedInferiorStartFailed(const QString &msg);
     Q_SLOT void slotEmitDelayedInferiorStartFailed();
 
-    Q_SLOT void waitForTrkConnect();
     void handleTargetRemote(const GdbResponse &response);
 
     //
@@ -198,7 +198,7 @@ private:
     void handleSignalContinue(const TrkResult &result);
     void handleStop(const TrkResult &result);
     void handleSupportMask(const TrkResult &result);
-    void handleTrkVersions(const TrkResult &result);
+    void handleTrkVersionsStartGdb(const TrkResult &result);
     void handleDisconnect(const TrkResult &result);
     void handleDeleteProcess(const TrkResult &result);
     void handleDeleteProcess2(const TrkResult &result);
@@ -248,7 +248,7 @@ private:
     QByteArray trkDeleteProcessMessage();    
     QByteArray trkInterruptMessage();
 
-    trk::TrkDevice m_trkDevice;
+    QSharedPointer<trk::TrkDevice> m_trkDevice;
     QString m_adapterFailMessage;
 
     //
@@ -288,16 +288,6 @@ private:
 
     QHash<int, GdbCommand> m_gdbCookieForToken;
 
-    //
-    // Rfcomm
-    //
-    Q_SLOT void handleRfcommReadyReadStandardError();
-    Q_SLOT void handleRfcommReadyReadStandardOutput();
-    Q_SLOT void handleRfcommError(QProcess::ProcessError error);
-    Q_SLOT void handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus);
-    Q_SLOT void handleRfcommStarted();
-    Q_SLOT void handleRfcommStateChanged(QProcess::ProcessState newState);
-
     QString effectiveTrkDevice() const;
     int effectiveTrkDeviceType() const;
 
@@ -308,7 +298,6 @@ private:
     QString m_symbolFile;
     int m_verbose;
     bool m_bufferedMemoryRead;
-    int m_waitCount;
 };
 
 } // namespace Internal