diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index 971a602741bb0c29e91ea591606f1994e71d1107..94a65e22249c699f16de2e0f9fe224eeb87d301d 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -95,7 +95,6 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
     m_bufferedMemoryRead(true),
     m_waitCount(0)
 {
-    setState(DebuggerNotReady);
 #ifdef Q_OS_WIN
     const DWORD portOffset = GetCurrentProcessId() % 100;
 #else
@@ -622,6 +621,8 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
         bool ok = false;
         const uint registerNumber = regName.toInt(&ok, 16);
         const uint value = swapEndian(valueName.toInt(&ok, 16));
+        // FIXME: Assume all goes well.
+        m_snapshot.registers[registerNumber] = value;
         QByteArray ba = trkWriteRegisterMessage(registerNumber, value);
         sendTrkMessage(0x13, TrkCB(handleWriteRegister), ba, "Write register");
         // Note that App TRK refuses to write registers 13 and 14
@@ -1605,6 +1606,20 @@ void TrkGdbAdapter::write(const QByteArray &data)
             sendTrkMessage(ba.at(0), TrkCB(handleDirectTrk), ba.mid(1));
         return;
     }
+    if (data.startsWith("@@")) {
+        QByteArray data1 = data.mid(2);
+        if (data1.endsWith(char(10)))
+            data1.chop(1);
+        if (data1.endsWith(char(13)))
+            data1.chop(1);
+        if (data1.endsWith(' '))
+            data1.chop(1);
+        bool ok;
+        uint addr = data1.toInt(&ok, 0);
+        qDebug() << "Writing: " << quoteUnprintableLatin1(data1) << addr;
+        directStep(addr);
+        return;
+    }
     m_gdbProc.write(data, data.size());
 }
 
@@ -1613,6 +1628,43 @@ void TrkGdbAdapter::handleDirectTrk(const TrkResult &result)
     logMessage("HANDLE DIRECT TRK: " + stringFromArray(result.data));
 }
 
+uint oldPC;
+
+void TrkGdbAdapter::directStep(uint addr)
+{
+    // Write PC:
+    qDebug() << "ADDR: " << addr;
+    oldPC = m_snapshot.registers[RegisterPC];
+    m_snapshot.registers[RegisterPC] = addr;
+    QByteArray ba = trkWriteRegisterMessage(RegisterPC, addr);
+    sendTrkMessage(0x13, TrkCB(handleDirectStep1), ba, "Write PC");
+}
+
+void TrkGdbAdapter::handleDirectStep1(const TrkResult &result)
+{
+    logMessage("HANDLE DIRECT STEP1: " + stringFromArray(result.data));
+    QByteArray ba;
+    appendByte(&ba, 0x11); // options "step over"
+    appendInt(&ba, m_snapshot.registers[RegisterPC]);
+    appendInt(&ba, m_snapshot.registers[RegisterPC]);
+    appendInt(&ba, m_session.pid);
+    appendInt(&ba, m_session.tid);
+    sendTrkMessage(0x19, TrkCB(handleDirectStep2), ba, "Direct step");
+}
+
+void TrkGdbAdapter::handleDirectStep2(const TrkResult &result)
+{
+    logMessage("HANDLE DIRECT STEP2: " + stringFromArray(result.data));
+    m_snapshot.registers[RegisterPC] = oldPC;
+    QByteArray ba = trkWriteRegisterMessage(RegisterPC, oldPC);
+    sendTrkMessage(0x13, TrkCB(handleDirectStep3), ba, "Write PC");
+}
+
+void TrkGdbAdapter::handleDirectStep3(const TrkResult &result)
+{
+    logMessage("HANDLE DIRECT STEP2: " + stringFromArray(result.data));
+}
+
 void TrkGdbAdapter::setWorkingDirectory(const QString &dir)
 {
     m_gdbProc.setWorkingDirectory(dir);
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 78653d02a8b9999c5e13e03d36cba1bb450406c4..8706e50a2f086498b511e0ce3ccd98f138f04e07 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -152,6 +152,11 @@ public:
     void handleDeleteProcess2(const TrkResult &result);
     void handleDirectTrk(const TrkResult &response);
 
+    void directStep(uint addr);
+    void handleDirectStep1(const TrkResult &response);
+    void handleDirectStep2(const TrkResult &response);
+    void handleDirectStep3(const TrkResult &response);
+
     void handleAndReportCreateProcess(const TrkResult &result);
     void handleAndReportReadRegistersAfterStop(const TrkResult &result);
     void reportRegisters();