diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index ea1456e40dca4ad640c35a7da1c1b311adfff427..02776557d30579207b691c6ac6805e0b24837cb7 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2964,30 +2964,9 @@ void GdbEngine::handleThreadInfo(const GdbResponse &response)
 {
     int id = response.cookie.toInt();
     if (response.resultClass == GdbResultDone) {
-        // ^done,threads=[{id="1",target-id="Thread 0xb7fdc710 (LWP 4264)",
-        // frame={level="0",addr="0x080530bf",func="testQString",args=[],
-        // file="/.../app.cpp",fullname="/../app.cpp",line="1175"},
-        // state="stopped",core="0"}],current-thread-id="1"
-        const QList<GdbMi> items = response.data.findChild("threads").children();
-        Threads threads;
-        for (int index = 0, n = items.size(); index != n; ++index) {
-            bool ok = false;
-            const GdbMi item = items.at(index);
-            const GdbMi frame = item.findChild("frame");
-            ThreadData thread;
-            thread.id = item.findChild("id").data().toInt();
-            thread.targetId = QString::fromAscii(item.findChild("target-id").data());
-            thread.core = QString::fromLatin1(item.findChild("core").data());
-            thread.state = QString::fromLatin1(item.findChild("state").data());
-            thread.address = frame.findChild("addr").data().toULongLong(&ok, 0);
-            thread.function = QString::fromLatin1(frame.findChild("func").data());
-            thread.fileName = QString::fromLatin1(frame.findChild("fullname").data());
-            thread.lineNumber = frame.findChild("line").data().toInt();
-            threads.append(thread);
-        }
+        int currentThreadId;
+        const Threads threads= ThreadsHandler::parseGdbmiThreads(response.data, &currentThreadId);
         threadsHandler()->setThreads(threads);
-        const int currentThreadId =
-            response.data.findChild("current-thread-id").data().toInt();
         threadsHandler()->setCurrentThreadId(currentThreadId);
         updateViews(); // Adjust Threads combobox.
         if (m_hasInferiorThreadList) {
diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp
index a6e1ce328b0665c6257735811f13d1b633a07359..bc076c7b05b073d106c4154e63ecf9bc4f16d433 100644
--- a/src/plugins/debugger/threadshandler.cpp
+++ b/src/plugins/debugger/threadshandler.cpp
@@ -28,6 +28,7 @@
 **************************************************************************/
 
 #include "threadshandler.h"
+#include "gdb/gdbmi.h"
 
 #include "debuggerconstants.h"
 
@@ -254,5 +255,37 @@ void ThreadsHandler::notifyRunning()
         index(m_threads.size() - 1, ThreadData::ColumnCount - 1));
 }
 
+Threads ThreadsHandler::parseGdbmiThreads(const GdbMi &data, int *currentThread)
+{
+    // ^done,threads=[{id="1",target-id="Thread 0xb7fdc710 (LWP 4264)",
+    // frame={level="0",addr="0x080530bf",func="testQString",args=[],
+    // file="/.../app.cpp",fullname="/../app.cpp",line="1175"},
+    // state="stopped",core="0"}],current-thread-id="1"
+    const QList<GdbMi> items = data.findChild("threads").children();
+    const int n = items.size();
+    Threads threads;
+    threads.reserve(n);
+    for (int index = 0; index != n; ++index) {
+        bool ok = false;
+        const GdbMi item = items.at(index);
+        const GdbMi frame = item.findChild("frame");
+        ThreadData thread;
+        thread.id = item.findChild("id").data().toInt();
+        thread.targetId = QString::fromAscii(item.findChild("target-id").data());
+        thread.core = QString::fromLatin1(item.findChild("core").data());
+        thread.state = QString::fromLatin1(item.findChild("state").data());
+        thread.address = frame.findChild("addr").data().toULongLong(&ok, 0);
+        thread.function = QString::fromLatin1(frame.findChild("func").data());
+        thread.fileName = QString::fromLatin1(frame.findChild("fullname").data());
+        thread.lineNumber = frame.findChild("line").data().toInt();
+        // Non-GDB (Cdb2) output name here.
+        thread.name = frame.findChild("name").data().toInt();
+        threads.append(thread);
+    }
+    if (currentThread)
+        *currentThread = data.findChild("current-thread-id").data().toInt();
+    return threads;
+}
+
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/threadshandler.h b/src/plugins/debugger/threadshandler.h
index cb28d1ac7a1725ac6f7050e5b229a91dd158b141..f128dc0f1790e0ba05c97db7bd23ed2a65661821 100644
--- a/src/plugins/debugger/threadshandler.h
+++ b/src/plugins/debugger/threadshandler.h
@@ -39,7 +39,7 @@
 
 namespace Debugger {
 namespace Internal {
-
+class GdbMi;
 ////////////////////////////////////////////////////////////////////////
 //
 // ThreadsHandler
@@ -68,6 +68,8 @@ public:
     // Clear out all frame information
     void notifyRunning();
 
+    static Threads parseGdbmiThreads(const GdbMi &data, int *currentThread = 0);
+
 private:
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
     int columnCount(const QModelIndex &parent = QModelIndex()) const;
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index baf140bcca2e0299fec37106e4fea6dd4c1a3f0e..90251b2a790f2b3a2cad986bed5af61316c4479c 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -1522,10 +1522,19 @@ bool QtDumperHelper::parseValue(const char *data, QList<WatchData> *l)
 {
     l->clear();
     GdbMi root;
-    root.fromStringMultiple(QByteArray(data));
-    if (!root.isValid())
-        return false;
-    gbdMiToWatchData(root, GdbMiRecursionContext(), l);
+    // Array (CDB2)
+    if (*data == '[') {
+        root.fromString(data);
+        if (!root.isValid())
+            return false;
+        foreach(const GdbMi &child, root.children())
+            gbdMiToWatchData(child, GdbMiRecursionContext(), l);
+    } else {
+        root.fromStringMultiple(QByteArray(data));
+        if (!root.isValid())
+            return false;
+        gbdMiToWatchData(root, GdbMiRecursionContext(), l);
+    }
     return true;
 }