diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp
index af9da55976e7e768c3bcbc0b37e94f4ecce12f66..73d3953ffb3a51dc3a83ea0fa91bbe11917923a0 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.cpp
+++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp
@@ -34,6 +34,7 @@
 #include "breakhandler.h"
 #include "stackhandler.h"
 #include "watchhandler.h"
+#include "watchutils.h"
 
 #include <utils/qtcassert.h>
 #include <utils/winutils.h>
@@ -406,6 +407,49 @@ void CdbDebugEngine::exitDebugger()
     killWatchTimer();
 }
 
+// Retrieve a symbol
+static WatchData symbolToWatchData(ULONG index, const QString &namePrefix,
+                                   IDebugSymbolGroup2 *pDbgSymGroup)
+{
+    // retrieve symbol names and value strings
+    ULONG nameLength;
+    static WCHAR nameBuffer[MAX_PATH + 1];
+    // Name
+    pDbgSymGroup->GetSymbolNameWide(index, nameBuffer, MAX_PATH, &nameLength);
+    nameBuffer[nameLength] = 0;
+    const QString name = QString::fromUtf16(nameBuffer);
+    // Type name
+    pDbgSymGroup->GetSymbolTypeNameWide(index, nameBuffer, MAX_PATH, &nameLength);
+    nameBuffer[nameLength] = 0;
+    const QString type = QString::fromUtf16(nameBuffer);
+    // Value
+    QString value;
+    const HRESULT hr = pDbgSymGroup->GetSymbolValueTextWide(index, nameBuffer, MAX_PATH, &nameLength);
+    if (SUCCEEDED(hr)) {
+        nameBuffer[nameLength] = 0;
+        value = QString::fromUtf16(nameBuffer);
+    } else {
+        value = QLatin1String("<unknown>");
+    }
+    WatchData wd;
+    wd.iname =namePrefix + name;
+    wd.name = name;
+    wd.value = value;
+    wd.type = type;
+    if (isPointerType(type)) {
+        wd.setTypeUnneeded();
+        wd.setValueUnneeded();
+    } else {
+        wd.setAllUnneeded();
+    }
+    if (debugCDB) {
+        qDebug() << Q_FUNC_INFO << index << "state=0x" << QString::number(wd.state, 16)
+                << wd.name << " type=" << wd.type << " (" << type << ')'
+                << " value " << wd.value << " (" << value << ')';
+    }
+    return wd;
+}
+
 bool CdbDebugEnginePrivate::updateLocals(int frameIndex,
                                          WatchHandler *wh,
                                          QString *errorMessage)
@@ -459,36 +503,17 @@ bool CdbDebugEnginePrivate::updateLocals(int frameIndex,
             break;
         }
         wh->cleanup();
-        // retrieve symbol names and value strings
-        ULONG nameLength;
-        WCHAR nameBuffer[MAX_PATH + 1];
+        // retrieve symbol names and value strings.
+        // Add a dummy place holder in case children are needed
+        const QString localPrefix = QLatin1String("local.");
         for (ULONG s = 0 ; s < symbolCount ; s++ ) {
-            // Name
-            pDbgSymGroup->GetSymbolNameWide(s, nameBuffer, MAX_PATH, &nameLength);
-            nameBuffer[nameLength] = 0;
-            const QString name = QString::fromUtf16(nameBuffer);
-            // Type name
-            pDbgSymGroup->GetSymbolTypeNameWide(s, nameBuffer, MAX_PATH, &nameLength);
-            nameBuffer[nameLength] = 0;
-            const QString type = QString::fromUtf16(nameBuffer);
-            // Value
-            QString value;
-            hr = pDbgSymGroup->GetSymbolValueTextWide(s, nameBuffer, MAX_PATH, &nameLength);
-            if (SUCCEEDED(hr)) {
-                nameBuffer[nameLength] = 0;
-                value = QString::fromUtf16(nameBuffer);
-            } else {
-                value = QLatin1String("<unknown>");
+            WatchData wd = symbolToWatchData(s, localPrefix, pDbgSymGroup);
+            if (wd.isSomethingNeeded()) {
+                wh->insertData(wd.pointerChildPlaceHolder());
+                wd.setAllUnneeded();
+                wd.setChildCount(1);
             }
-            WatchData wd;
-            wd.iname = QLatin1String("local.") + name;
-            wd.name = name;
-            wd.value = value;
-            wd.type  = type;
-            wd.setAllUnneeded();
             wh->insertData(wd);
-            if (debugCDB)
-                qDebug() << ' '  << s << '/'<< symbolCount << name << type << value;
         }
         wh->rebuildModel();
         success = true;
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index b85b74e6c52fcc593ad64cfb8a896c889e7a614e..e34d8c50290cd7f4743895a9106e49b9d255eb22 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -3127,13 +3127,7 @@ void GdbEngine::updateSubItem(const WatchData &data0)
         qDebug() << "IT'S A POINTER";
         #endif
 #if 1
-        WatchData data1;
-        data1.iname = data.iname + ".*";
-        data1.name = "*" + data.name;
-        data1.exp = "(*(" + data.exp + "))";
-        data1.type = stripPointerType(data.type);
-        data1.setValueNeeded();
-        insertData(data1);
+        insertData(data.pointerChildPlaceHolder());
         data.setChildrenUnneeded();
         insertData(data);
 #else
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index e8bb8d5fe5e7957346a49b7fef903a44da951da3..88349072e4664c0b952e36e2450c46e11427c215 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -28,6 +28,7 @@
 **************************************************************************/
 
 #include "watchhandler.h"
+#include "watchutils.h"
 #include "debuggeractions.h"
 
 #if USE_MODEL_TEST
@@ -38,6 +39,7 @@
 
 #include <QtCore/QDebug>
 #include <QtCore/QEvent>
+#include <QtCore/QTextStream>
 
 #include <QtGui/QAction>
 #include <QtGui/QApplication>
@@ -45,6 +47,7 @@
 #include <QtGui/QToolTip>
 #include <QtGui/QTextEdit>
 
+
 #include <ctype.h>
 
 // creates debug output regarding pending watch data results
@@ -63,44 +66,21 @@ using namespace Debugger::Internal;
 
 static const QString strNotInScope = QLatin1String("<not in scope>");
 
-static bool isIntOrFloatType(const QString &type)
-{
-    static const QStringList types = QStringList()
-        << "char" << "int" << "short" << "float" << "double" << "long"
-        << "bool" << "signed char" << "unsigned" << "unsigned char"
-        << "unsigned int" << "unsigned long" << "long long";
-    return types.contains(type);
-}
-
-static bool isPointerType(const QString &type)
-{
-    return type.endsWith("*") || type.endsWith("* const");
-}
-
-static QString htmlQuote(const QString &str0)
-{
-    QString str = str0;
-    str.replace('&', "&amp;");
-    str.replace('<', "&lt;");
-    str.replace('>', "&gt;");
-    return str;
-}
-
 ////////////////////////////////////////////////////////////////////
 //
 // WatchData
 //
 ////////////////////////////////////////////////////////////////////
 
-WatchData::WatchData()
+WatchData::WatchData() :
+    childCount(-1),
+    valuedisabled(false),
+    state(InitialState),
+    parentIndex(-1),
+    row(-1),
+    level(-1),
+    changed(false)
 {
-    valuedisabled = false;
-    state = InitialState;
-    childCount = -1;
-    parentIndex = -1;
-    row = -1;
-    level = -1;
-    changed = false;
 }
 
 void WatchData::setError(const QString &msg)
@@ -170,21 +150,21 @@ void WatchData::setType(const QString &str)
     type = str.trimmed();
     bool changed = true;
     while (changed) {
-        if (type.endsWith("const"))
+        if (type.endsWith(QLatin1String("const")))
             type.chop(5);
-        else if (type.endsWith(" "))
+        else if (type.endsWith(QLatin1Char(' ')))
             type.chop(1);
-        else if (type.endsWith("&"))
+        else if (type.endsWith(QLatin1Char('&')))
             type.chop(1);
-        else if (type.startsWith("const "))
+        else if (type.startsWith(QLatin1String("const ")))
             type = type.mid(6);
-        else if (type.startsWith("volatile "))
+        else if (type.startsWith(QLatin1String("volatile ")))
             type = type.mid(9);
-        else if (type.startsWith("class "))
+        else if (type.startsWith(QLatin1String("class ")))
             type = type.mid(6);
-        else if (type.startsWith("struct "))
+        else if (type.startsWith(QLatin1String("struct ")))
             type = type.mid(6);
-        else if (type.startsWith(" "))
+        else if (type.startsWith(QLatin1Char(' ')))
             type = type.mid(1);
         else
             changed = false;
@@ -199,58 +179,67 @@ void WatchData::setAddress(const QString & str)
     addr = str;
 }
 
+WatchData WatchData::pointerChildPlaceHolder() const
+{
+    WatchData data1;
+    data1.iname = iname + QLatin1String(".*");
+    data1.name = QLatin1Char('*') + name;
+    data1.exp = QLatin1String("(*(") + exp + QLatin1String("))");
+    data1.type = stripPointerType(type);
+    data1.setValueNeeded();
+    return data1;
+}
+
 QString WatchData::toString() const
 {
-    QString res = "{";
-
-    res += "level=\"" + QString::number(level) + "\",";
-    res += "parent=\"" + QString::number(parentIndex) + "\",";
-    res += "row=\"" + QString::number(row) + "\",";
-    res += "child=\"";
-    foreach (int index, childIndex)
-        res += QString::number(index) + ",";
-    if (res.endsWith(','))
-        res[res.size() - 1] = '"';
-    else
-        res += '"';
-    res += ",";
-    
+    const char *doubleQuoteComma = "\",";
+    QString res;
+    QTextStream str(&res);
+    str  <<"{state=\"0x" << QString::number(state, 16) << doubleQuoteComma
+         << "level=\"" << level << doubleQuoteComma
+         << "parent=\"" << parentIndex << doubleQuoteComma
+         << "row=\"" << row << doubleQuoteComma
+         << "child=\"";
+    const int childCount = childIndex.size();
+    for (int i = 0; i < childCount; i++) {
+        if (i)
+            str << ',';
+        str << childIndex.at(i);
+    }
+    str << doubleQuoteComma;
 
     if (!iname.isEmpty())
-        res += "iname=\"" + iname + "\",";
+        str << "iname=\"" << iname << doubleQuoteComma;
     if (!exp.isEmpty())
-        res += "exp=\"" + exp + "\",";
+        str << "exp=\"" << exp << doubleQuoteComma;
 
     if (!variable.isEmpty())
-        res += "variable=\"" + variable + "\",";
+        str << "variable=\"" << variable << doubleQuoteComma;
 
     if (isValueNeeded())
-        res += "value=<needed>,";
+        str << "value=<needed>,";
     if (isValueKnown() && !value.isEmpty())
-        res += "value=\"" + value + "\",";
+        str << "value=\"" << value << doubleQuoteComma;
 
     if (!editvalue.isEmpty())
-        res += "editvalue=\"" + editvalue + "\",";
+        str << "editvalue=\"" << editvalue << doubleQuoteComma;
 
     if (isTypeNeeded())
-        res += "type=<needed>,";
+        str << "type=<needed>,";
     if (isTypeKnown() && !type.isEmpty())
-        res += "type=\"" + type + "\",";
+        str << "type=\"" << type << doubleQuoteComma;
 
     if (isChildCountNeeded())
-        res += "numchild=<needed>,";
+        str << "numchild=<needed>,";
     if (isChildCountKnown() && childCount == -1)
-        res += "numchild=\"" + QString::number(childCount) + "\",";
+        str << "numchild=\"" << childCount << doubleQuoteComma;
 
     if (isChildrenNeeded())
-        res += "children=<needed>,";
-
-    if (res.endsWith(','))
-        res[res.size() - 1] = '}';
-    else
-        res += '}';
-
-    return res;
+        str << "children=<needed>,";
+    str.flush();
+    if (res.endsWith(QLatin1Char(',')))
+        res.truncate(res.size() - 1);
+    return res + QLatin1Char('}');
 }
 
 static bool iNameSorter(const WatchData &d1, const WatchData &d2)
@@ -273,7 +262,7 @@ static bool iNameSorter(const WatchData &d1, const WatchData &d2)
 
 static QString parentName(const QString &iname)
 {
-    int pos = iname.lastIndexOf(".");
+    int pos = iname.lastIndexOf(QLatin1Char('.'));
     if (pos == -1)
         return QString();
     return iname.left(pos);
@@ -306,7 +295,6 @@ static WatchData take(const QString &iname, QList<WatchData> *list)
     return WatchData();
 }
 
-
 static QList<WatchData> initialSet()
 {
     QList<WatchData> result;
@@ -315,7 +303,7 @@ static QList<WatchData> initialSet()
     root.state = 0;
     root.level = 0;
     root.row = 0;
-    root.name = "Root";
+    root.name = QLatin1String("Root");
     root.parentIndex = -1;
     root.childIndex.append(1);
     root.childIndex.append(2);
@@ -323,8 +311,8 @@ static QList<WatchData> initialSet()
     result.append(root);
 
     WatchData local;
-    local.iname = "local";
-    local.name = "Locals";
+    local.iname = QLatin1String("local");
+    local.name = QLatin1String("Locals");
     local.state = 0;
     local.level = 1;
     local.row = 0;
@@ -332,8 +320,8 @@ static QList<WatchData> initialSet()
     result.append(local);
 
     WatchData tooltip;
-    tooltip.iname = "tooltip";
-    tooltip.name = "Tooltip";
+    tooltip.iname = QLatin1String("tooltip");
+    tooltip.name = QLatin1String("Tooltip");
     tooltip.state = 0;
     tooltip.level = 1;
     tooltip.row = 1;
@@ -341,8 +329,8 @@ static QList<WatchData> initialSet()
     result.append(tooltip);
 
     WatchData watch;
-    watch.iname = "watch";
-    watch.name = "Watchers";
+    watch.iname = QLatin1String("watch");
+    watch.name = QLatin1String("Watchers");
     watch.state = 0;
     watch.level = 1;
     watch.row = 2;
@@ -380,55 +368,55 @@ WatchHandler::WatchHandler()
 
 static QString niceType(QString type)
 {
-    if (type.contains("std::")) {
+    if (type.contains(QLatin1String("std::"))) {
         // std::string
-        type.replace("std::basic_string<char, std::char_traits<char>, "
-                     "std::allocator<char> >", "std::string");
+        type.replace(QLatin1String("std::basic_string<char, std::char_traits<char>, "
+                                   "std::allocator<char> >"), QLatin1String("std::string"));
 
         // std::wstring
-        type.replace("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
-                     "std::allocator<wchar_t> >", "std::wstring");
+        type.replace(QLatin1String("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
+                                   "std::allocator<wchar_t> >"), QLatin1String("std::wstring"));
 
         // std::vector
-        static QRegExp re1("std::vector<(.*), std::allocator<(.*)>\\s*>");
+        static QRegExp re1(QLatin1String("std::vector<(.*), std::allocator<(.*)>\\s*>"));
         re1.setMinimal(true);
         for (int i = 0; i != 10; ++i) {
             if (re1.indexIn(type) == -1 || re1.cap(1) != re1.cap(2)) 
                 break;
-            type.replace(re1.cap(0), "std::vector<" + re1.cap(1) + ">");
+            type.replace(re1.cap(0), QLatin1String("std::vector<") + re1.cap(1) + QLatin1Char('>'));
         }
 
         // std::list
-        static QRegExp re2("std::list<(.*), std::allocator<(.*)>\\s*>");
+        static QRegExp re2(QLatin1String("std::list<(.*), std::allocator<(.*)>\\s*>"));
         re2.setMinimal(true);
         for (int i = 0; i != 10; ++i) {
             if (re2.indexIn(type) == -1 || re2.cap(1) != re2.cap(2)) 
                 break;
-            type.replace(re2.cap(0), "std::list<" + re2.cap(1) + ">");
+            type.replace(re2.cap(0), QLatin1String("std::list<") + re2.cap(1) + QLatin1Char('>'));
         }
 
         // std::map
-        static QRegExp re3("std::map<(.*), (.*), std::less<(.*)\\s*>, "
-            "std::allocator<std::pair<const (.*), (.*)\\s*> > >");
+        static QRegExp re3(QLatin1String("std::map<(.*), (.*), std::less<(.*)\\s*>, "
+                                         "std::allocator<std::pair<const (.*), (.*)\\s*> > >"));
         re3.setMinimal(true);
         for (int i = 0; i != 10; ++i) {
             if (re3.indexIn(type) == -1 || re3.cap(1) != re3.cap(3)
                 || re3.cap(1) != re3.cap(4) || re3.cap(2) != re3.cap(5)) 
                 break;
-            type.replace(re3.cap(0), "std::map<" + re3.cap(1) + ", " + re3.cap(2) + ">");
+            type.replace(re3.cap(0), QLatin1String("std::map<") + re3.cap(1) + QLatin1String(", ") + re3.cap(2) + QLatin1Char('>'));
         }
 
         // std::set
-        static QRegExp re4("std::set<(.*), std::less<(.*)>, std::allocator<(.*)>\\s*>");
+        static QRegExp re4(QLatin1String("std::set<(.*), std::less<(.*)>, std::allocator<(.*)>\\s*>"));
         re1.setMinimal(true);
         for (int i = 0; i != 10; ++i) {
             if (re4.indexIn(type) == -1 || re4.cap(1) != re4.cap(2)
                 || re4.cap(1) != re4.cap(3)) 
                 break;
-            type.replace(re4.cap(0), "std::set<" + re4.cap(1) + ">");
+            type.replace(re4.cap(0), QLatin1String("std::set<") + re4.cap(1) + QLatin1Char('>'));
         }
 
-        type.replace(" >", ">");
+        type.replace(QLatin1String(" >"), QString(QLatin1Char('>')));
     }
     return type;
 }
@@ -456,31 +444,31 @@ QVariant WatchHandler::data(const QModelIndex &idx, int role) const
         case Qt::ToolTipRole: {
             QString val = data.value;
             if (val.size() > 1000)
-                val = val.left(1000) + " ... <cut off>";
-
-            QString tt = "<table>";
-            //tt += "<tr><td>internal name</td><td> : </td><td>";
-            //tt += htmlQuote(iname) + "</td></tr>";
-            tt += "<tr><td>expression</td><td> : </td><td>";
-            tt += htmlQuote(data.exp) + "</td></tr>";
-            tt += "<tr><td>type</td><td> : </td><td>";
-            tt += htmlQuote(data.type) + "</td></tr>";
+                val = val.left(1000) + QLatin1String(" ... <cut off>");
+
+            QString tt = QLatin1String("<table>");
+            //tt += QLatin1String("<tr><td>internal name</td><td> : </td><td>");
+            //tt += Qt::escape(iname) + QLatin1String("</td></tr>");
+            tt += QLatin1String("<tr><td>expression</td><td> : </td><td>");
+            tt += Qt::escape(data.exp) + QLatin1String("</td></tr>");
+            tt += QLatin1String("<tr><td>type</td><td> : </td><td>");
+            tt += Qt::escape(data.type) + QLatin1String("</td></tr>");
             //if (!valuetooltip.isEmpty())
             //    tt += valuetooltip;
             //else
-                tt += "<tr><td>value</td><td> : </td><td>"; 
-                tt += htmlQuote(data.value) + "</td></tr>";
-            tt += "<tr><td>object addr</td><td> : </td><td>";
-            tt += htmlQuote(data.addr) + "</td></tr>";
-            tt += "<tr><td>stored addr</td><td> : </td><td>";
-            tt += htmlQuote(data.saddr) + "</td></tr>";
-            tt += "<tr><td>iname</td><td> : </td><td>";
-            tt += htmlQuote(data.iname) + "</td></tr>";
-            tt += "</table>";
-            tt.replace("@value@", htmlQuote(data.value));
+                tt += QLatin1String("<tr><td>value</td><td> : </td><td>"); 
+                tt += Qt::escape(data.value) + QLatin1String("</td></tr>");
+            tt += QLatin1String("<tr><td>object addr</td><td> : </td><td>");
+            tt += Qt::escape(data.addr) + QLatin1String("</td></tr>");
+            tt += QLatin1String("<tr><td>stored addr</td><td> : </td><td>");
+            tt += Qt::escape(data.saddr) + QLatin1String("</td></tr>");
+            tt += QLatin1String("<tr><td>iname</td><td> : </td><td>");
+            tt += Qt::escape(data.iname) + QLatin1String("</td></tr>");
+            tt += QLatin1String("</table>");
+            tt.replace(QLatin1String("@value@"), Qt::escape(data.value));
 
             if (tt.size() > 10000)
-                tt = tt.left(10000) + " ... <cut off>";
+                tt = tt.left(10000) + QLatin1String(" ... <cut off>");
             return tt;
         }
 
@@ -555,9 +543,9 @@ QVariant WatchHandler::headerData(int section, Qt::Orientation orientation,
         return QVariant();
     if (role == Qt::DisplayRole) {
         switch (section) {
-            case 0: return tr("Name")  + "     ";
-            case 1: return tr("Value") + "     ";
-            case 2: return tr("Type")  + "     ";
+            case 0: return tr("Name")  + QLatin1String("     ");
+            case 1: return tr("Value") + QLatin1String("     ");
+            case 2: return tr("Type")  + QLatin1String("     ");
         }
     }
     return QVariant(); 
@@ -566,30 +554,21 @@ QVariant WatchHandler::headerData(int section, Qt::Orientation orientation,
 QString WatchHandler::toString() const
 {
     QString res;
-    res += "\nIncomplete:\n";
-    for (int i = 0, n = m_incompleteSet.size(); i != n; ++i) {
-        res += QString("%1: ").arg(i);
-        res += m_incompleteSet.at(i).toString();
-        res += '\n';
-    }
-    res += "\nComplete:\n";
-    for (int i = 0, n = m_completeSet.size(); i != n; ++i) {
-        res += QString("%1: ").arg(i);
-        res += m_completeSet.at(i).toString();
-        res += '\n';
-    }
-    res += "\nDisplay:\n";
-    for (int i = 0, n = m_displaySet.size(); i != n; ++i) {
-        res += QString("%1: ").arg(i);
-        res += m_displaySet.at(i).toString();
-        res += '\n';
-    }
+    QTextStream str(&res);
+    str << "\nIncomplete:\n";
+    for (int i = 0, n = m_incompleteSet.size(); i != n; ++i)
+        str << i << ' ' << m_incompleteSet.at(i).toString() << '\n';
+    str << "\nComplete:\n";
+    for (int i = 0, n = m_completeSet.size(); i != n; ++i)
+        str << i << ' ' << m_completeSet.at(i).toString() << '\n';
+    str << "\nDisplay:\n";
+    for (int i = 0, n = m_displaySet.size(); i != n; ++i)
+        str << i << ' ' << m_displaySet.at(i).toString() << '\n';
+
 #if 0
-    res += "\nOld:\n";
-    for (int i = 0, n = m_oldSet.size(); i != n; ++i) {
-        res += m_oldSet.at(i).toString();
-        res += '\n';
-    }
+    str << "\nOld:\n";
+    for (int i = 0, n = m_oldSet.size(); i != n; ++i)
+        str << m_oldSet.at(i).toString() <<  '\n';
 #endif
     return res;
 }
@@ -705,7 +684,7 @@ void WatchHandler::rebuildModel()
             WatchData dummy;
             dummy.state = 0;
             dummy.row = 0;
-            dummy.iname = data.iname + ".dummy";
+            dummy.iname = data.iname + QLatin1String(".dummy");
             //dummy.name = data.iname + ".dummy";
             //dummy.name  = "<loading>";
             dummy.level = data.level + 1;
@@ -720,9 +699,9 @@ void WatchHandler::rebuildModel()
     // Possibly append dummy items to prevent empty views
     bool ok = true;
     QTC_ASSERT(m_displaySet.size() >= 2, ok = false);
-    QTC_ASSERT(m_displaySet.at(1).iname == "local", ok = false);
-    QTC_ASSERT(m_displaySet.at(2).iname == "tooltip", ok = false);
-    QTC_ASSERT(m_displaySet.at(3).iname == "watch", ok = false);
+    QTC_ASSERT(m_displaySet.at(1).iname == QLatin1String("local"), ok = false);
+    QTC_ASSERT(m_displaySet.at(2).iname == QLatin1String("tooltip"), ok = false);
+    QTC_ASSERT(m_displaySet.at(3).iname == QLatin1String("watch"), ok = false);
     if (ok) {
         for (int i = 1; i <= 3; ++i) {
             WatchData &data = m_displaySet[i];
@@ -731,14 +710,14 @@ void WatchHandler::rebuildModel()
                 dummy.state = 0;
                 dummy.row = 0;
                 if (i == 1) {
-                    dummy.iname = "local.dummy";
-                    dummy.name  = "<No Locals>";
+                    dummy.iname = QLatin1String("local.dummy");
+                    dummy.name  = QLatin1String("<No Locals>");
                 } else if (i == 2) {
-                    dummy.iname = "tooltip.dummy";
-                    dummy.name  = "<No Tooltip>";
+                    dummy.iname = QLatin1String("tooltip.dummy");
+                    dummy.name  = QLatin1String("<No Tooltip>");
                 } else {
-                    dummy.iname = "watch.dummy";
-                    dummy.name  = "<No Watchers>";
+                    dummy.iname = QLatin1String("watch.dummy");
+                    dummy.name  = QLatin1String("<No Watchers>");
                 }
                 dummy.level = 2;
                 dummy.parentIndex = i;
@@ -903,7 +882,7 @@ void WatchHandler::watchExpression(const QString &exp)
     WatchData data;
     data.exp = exp;
     data.name = exp;
-    data.iname = "watch." + exp;
+    data.iname = QLatin1String("watch.") + exp;
     insertData(data);
     m_watchers.append(exp);
     saveWatchers();
@@ -935,7 +914,7 @@ void WatchHandler::showEditValue(const WatchData &data)
     QWidget *w = m_editWindows.value(data.iname);
     qDebug() << "SHOW_EDIT_VALUE " << data.toString() << data.type
             << data.iname << w;
-    if (data.type == "QImage") {
+    if (data.type == QLatin1String("QImage")) {
         if (!w) {
             w = new QLabel;
             m_editWindows[data.iname] = w;
@@ -947,7 +926,7 @@ void WatchHandler::showEditValue(const WatchData &data)
         QImage im = v.value<QImage>();
         if (QLabel *l = qobject_cast<QLabel *>(w))
             l->setPixmap(QPixmap::fromImage(im));
-    } else if (data.type == "QPixmap") {
+    } else if (data.type == QLatin1String("QPixmap")) {
         if (!w) {
             w = new QLabel;
             m_editWindows[data.iname] = w;
@@ -959,7 +938,7 @@ void WatchHandler::showEditValue(const WatchData &data)
         QPixmap im = v.value<QPixmap>();
         if (QLabel *l = qobject_cast<QLabel *>(w))
             l->setPixmap(im);
-    } else if (data.type == "QString") {
+    } else if (data.type == QLatin1String("QString")) {
         if (!w) {
             w = new QTextEdit;
             m_editWindows[data.iname] = w;
@@ -993,7 +972,7 @@ void WatchHandler::removeWatchExpression(const QString &exp)
     m_watchers.removeOne(exp);
     for (int i = m_completeSet.size(); --i >= 0;) {
         const WatchData & data = m_completeSet.at(i);
-        if (data.iname.startsWith("watch.") && data.exp == exp) {
+        if (data.iname.startsWith(QLatin1String("watch.")) && data.exp == exp) {
             m_completeSet.takeAt(i);
             break;
         }
@@ -1022,7 +1001,7 @@ void WatchHandler::reinitializeWatchersHelper()
         data.variable.clear();
         data.setAllNeeded();
         data.valuedisabled = false;
-        data.iname = "watch." + QString::number(i);
+        data.iname = QLatin1String("watch.") + QString::number(i);
         data.name = exp;
         data.exp = exp;
         insertData(data);
@@ -1064,7 +1043,7 @@ void WatchHandler::fetchMore(const QModelIndex &parent)
     m_inFetchMore = true;
 
     WatchData data = takeData(iname);
-    MODEL_DEBUG("FETCH MORE: " << parent << ":" << iname << data.name);
+    MODEL_DEBUG("FETCH MORE: " << parent << ':' << iname << data.name);
 
     if (!data.isValid()) {
         MODEL_DEBUG("FIXME: FETCH MORE, no data " << iname << "found");
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 6701eecda34baf9de1a95553eef7deb9b7b2d721..a31c8f0caec7675fe2085427a26a675df827103e 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -98,9 +98,11 @@ public:
     void setChildCount(int n) { childCount = n; setChildCountUnneeded();
         if (n == 0) setChildrenUnneeded(); }
 
+    WatchData pointerChildPlaceHolder() const;
+
     QString toString() const;
     bool isLocal() const { return iname.startsWith(QLatin1String("local.")); }
-    bool isWatcher() const { return iname.startsWith(QLatin1String("watch.")); };
+    bool isWatcher() const { return iname.startsWith(QLatin1String("watch.")); }
     bool isValid() const { return !iname.isEmpty(); }
 
 public: