diff --git a/src/plugins/debugger/tcfengine.cpp b/src/plugins/debugger/tcfengine.cpp
index 7cec45bb592c0b1b160a9488ad62845e0c8d9c2f..89b72cfd4fd7c6af73de76e94f690c84d1cdab47 100644
--- a/src/plugins/debugger/tcfengine.cpp
+++ b/src/plugins/debugger/tcfengine.cpp
@@ -75,6 +75,20 @@ using namespace Debugger::Constants;
 #define STRINGIFY(x) STRINGIFY_INTERNAL(x)
 #define CB(callback) &TcfEngine::callback, STRINGIFY(callback)
 
+QByteArray C(const QByteArray &ba1,
+    const QByteArray &ba2 = QByteArray(),
+    const QByteArray &ba3 = QByteArray(),
+    const QByteArray &ba4 = QByteArray(),
+    const QByteArray &ba5 = QByteArray())
+{
+    QByteArray result = ba1;
+    if (!ba2.isEmpty()) { result += '\0'; result += ba2; }
+    if (!ba3.isEmpty()) { result += '\0'; result += ba3; }
+    if (!ba4.isEmpty()) { result += '\0'; result += ba4; }
+    if (!ba5.isEmpty()) { result += '\0'; result += ba5; }
+    return result;
+}
+
 
 //#define USE_CONGESTION_CONTROL
 
@@ -159,7 +173,8 @@ void TcfEngine::socketReadyRead()
     m_inbuffer.append(m_socket->readAll());
     int pos = 0;
     while (1) {
-        int next = m_inbuffer.indexOf("\3\1", pos);
+        // the  "\3" is followed by either "\1" or "\2"
+        int next = m_inbuffer.indexOf("\3", pos);
         //qDebug() << "pos: " << pos << "next: " << next;
         if (next == -1)
             break;
@@ -191,8 +206,17 @@ void TcfEngine::socketError(QAbstractSocket::SocketError)
 
 void TcfEngine::executeDebuggerCommand(const QString &command)
 {
-    Q_UNUSED(command);
-    XSDEBUG("FIXME:  TcfEngine::executeDebuggerCommand()");
+    QByteArray cmd = command.toUtf8();
+    cmd = cmd.mid(cmd.indexOf(' ') + 1);
+    QByteArray null;
+    null.append('\0');
+    // FIXME: works for single-digit escapes only
+    cmd.replace("\\0", null);
+    cmd.replace("\\1", "\1");
+    cmd.replace("\\3", "\3");
+    TcfCommand tcf;
+    tcf.command = cmd;
+    enqueueCommand(tcf);
 }
 
 void TcfEngine::shutdown()
@@ -324,6 +348,8 @@ void TcfEngine::handleResponse(const QByteArray &response)
     QList<QByteArray> parts = response.split('\0');
     if (parts.size() < 2 || !parts.last().isEmpty()) {
         SDEBUG("WRONG RESPONSE PACKET LAYOUT" << parts);
+        //if (response.isEmpty())
+            acknowledgeResult();
         return;
     }
     parts.removeLast(); // always empty
@@ -376,25 +402,26 @@ void TcfEngine::handleResponse(const QByteArray &response)
 
 void TcfEngine::startDebugging()
 {
-    foreach (const QByteArray &service, m_services) {
-        postCommand(CB(handleRunControlGetChildren),
-            service, "getChildren", "\"\"");
-    }
-
-    postCommand(CB(handleRunControlGetChildren), "Diagnostics", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Streams", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Expressions", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "SysMonitor", "getChildren");
-    //postCommand(CB(handleRunControlGetChildren), "FileSystem", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Processes", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "LineNumbers", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Symbols", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "StackTrace", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Registers", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Memory", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Breakpoints", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "RunControl", "getChildren");
-    postCommand(CB(handleRunControlGetChildren), "Locator", "getChildren");
+    //foreach (const QByteArray &service, m_services) {
+    //    postCommand(CB(handleRunControlGetChildren),
+    //        service, "getChildren", "\"\"");
+    //}
+
+    postCommand(C("Diagnostics", "getChildren", "\"\""),
+        CB(handleRunControlGetChildren));
+    postCommand(C("Streams", "getChildren", "\"\""));
+    postCommand(C("Expressions", "getChildren", "\"\""));
+    postCommand(C("SysMonitor", "getChildren", "\"\""));
+    //postCommand(C("FileSystem", "getChildren", "\"\""));
+    //postCommand(C("Processes", "getChildren", "\"\""));
+    //postCommand(CB(handleRunControlGetChildren), "LineNumbers", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "Symbols", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "StackTrace", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "Registers", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "Memory", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "Breakpoints", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "RunControl", "getChildren");
+    //postCommand(CB(handleRunControlGetChildren), "Locator", "getChildren");
 
 
     //postCommand(CB(handleRunControlSuspend),
@@ -402,36 +429,33 @@ void TcfEngine::startDebugging()
     //postCommand(CB(handleRunControlSuspend),
     //    "RunControl", "getContext", "\"P12318\"");
 
-    //postCommand("Locator", "sync", "");
+    //postCommand(C("Locator", "sync"), CB(handleRunControlGetChildren));
     //postCommand("Locator", "redirect", "ID");
+
+    //postCommand(C("FileSystem", "open", "\"/bin/ls\"", "1", "2", "3"),
+    //    CB(handleRunControlGetChildren));
+    postCommand(C("FileSystem", "stat", "\"/bin/ls\""),
+        CB(handleRunControlGetChildren));
 }
 
-void TcfEngine::postCommand(TcfCommandCallback callback,
-    const char *callbackName,
-    const QByteArray &service,
-    const QByteArray &cmd,
-    const QByteArray &args)
+void TcfEngine::postCommand(const QByteArray &cmd,
+    TcfCommandCallback callback, const char *callbackName)
 {
     static int token = 20;
     ++token;
     
-    const char delim = 0;
     //const char marker_eom = -1;
     //const char marker_eos = -2;
     //const char marker_null = -3;
 
     QByteArray ba = "C";
-    ba.append(delim);
+    ba.append('\0');
     ba.append(QByteArray::number(token));
-    ba.append(delim);
-    ba.append(service);
-    ba.append(delim);
+    ba.append('\0');
     ba.append(cmd);
-    ba.append(delim);
-    ba.append(args);
-    ba.append(delim);
-    ba.append(3);
-    ba.append(1);
+    ba.append('\0');
+    ba.append('\3');
+    ba.append('\1');
 
     TcfCommand tcf;
     tcf.command = ba;
@@ -441,7 +465,7 @@ void TcfEngine::postCommand(TcfCommandCallback callback,
 
     m_cookieForToken[token] = tcf;
 
-    enqueueCommand(tcf);  // congestion based
+    enqueueCommand(tcf);
 }
 
 // Congestion control does not seem to work that way. Basically it's
@@ -485,10 +509,10 @@ void TcfEngine::sendCommandNow(const TcfCommand &cmd)
 {
     ++m_inAir;
     int result = m_socket->write(cmd.command);
+    Q_UNUSED(result);
     m_socket->flush();
-    emit tcfInputAvailable("send", QString::number(cmd.token)
-        + " " + cmd.toString() + " " + QString::number(result));
-    SDEBUG("SEND " <<  cmd.toString() << " " << QString::number(result));
+    emit tcfInputAvailable("send", QString::number(cmd.token) + " " + cmd.toString());
+    SDEBUG("SEND " <<  cmd.toString()); //<< " " << QString::number(result));
 }
 
 void TcfEngine::acknowledgeResult()
@@ -503,7 +527,7 @@ void TcfEngine::acknowledgeResult()
 
 void TcfEngine::handleRunControlSuspend(const TcfData &data, const QVariant &)
 {
-    SDEBUG("HANDLE RESULT");
+    SDEBUG("HANDLE RESULT" << data.toString());
 }
 
 void TcfEngine::handleRunControlGetChildren(const TcfData &data, const QVariant &)
@@ -559,6 +583,7 @@ void TcfEngine::updateWatchModel()
 
 void TcfEngine::updateSubItem(const WatchData &data0)
 {
+    Q_UNUSED(data0);
     QTC_ASSERT(false, return);
 }
 
diff --git a/src/plugins/debugger/tcfengine.h b/src/plugins/debugger/tcfengine.h
index 23dda9d56b57266de12ca9cde34e18c13e0bb9de..1eb29d7f92df4f4b6f17dc8c5f223569eb8b1c83 100644
--- a/src/plugins/debugger/tcfengine.h
+++ b/src/plugins/debugger/tcfengine.h
@@ -152,11 +152,8 @@ private:
         QVariant cookie;
     };
 
-    void postCommand(TcfCommandCallback callback,
-        const char *callbackName,
-        const QByteArray &service,
-        const QByteArray &cmd,
-        const QByteArray &args = "\"\"");
+    void postCommand(const QByteArray &cmd,
+        TcfCommandCallback callback = 0, const char *callbackName = 0);
     void sendCommandNow(const TcfCommand &command);
 
     QHash<int, TcfCommand> m_cookieForToken;