diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index bec8ed7171030ee6d61467d56f05f3f90c5a7e44..67743aab3737453a8d25862ed4b6c1a733b7cb26 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -294,17 +294,17 @@ class FrameCommand(gdb.Command):
             name = str(watcherCount)
             try:
                 value = gdb.parse_and_eval(watcher)
-                item = Item(value), "watch", name, name)
+                item = Item(value, "watch", name, name)
                 warn(" VALUE %s" % item.value)
                 d.beginHash()
                 d.put('iname="%s",' % item.iname)
                 d.safePutItemHelper(item)
                 d.endHash()
-            else:
+            except RuntimeError:
                 d.beginHash()
                 d.put('iname="watch.%d",' % watcherCount)
                 d.put('name="%s",' % watcher)
-                d.put('value="<invalid>",' % watcherCount)
+                d.put('value="<invalid>",')
                 d.put('type=<unknown>,numchild="0"')
                 d.endHash()
             watcherCount += 1
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index bc7ee0ddd44c1209d2d97438717eec157014e717..8c9da78ad084e24d07e021c30a3f83b6a8598dad 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2819,7 +2819,7 @@ static void setWatchDataValueEditable(WatchData &data, const GdbMi &mi)
 static void setWatchDataExpression(WatchData &data, const GdbMi &mi)
 {
     if (mi.isValid())
-        data.exp = _('(' + mi.data() + ')');
+        data.exp = _(mi.data());
 }
 
 static void setWatchDataAddress(WatchData &data, const GdbMi &mi)
@@ -2827,7 +2827,7 @@ static void setWatchDataAddress(WatchData &data, const GdbMi &mi)
     if (mi.isValid()) {
         data.addr = _(mi.data());
         if (data.exp.isEmpty() && !data.addr.startsWith(_("$")))
-            data.exp = _("(*(") + gdbQuoteTypes(data.type) + _("*)") + data.addr + _c(')');
+            data.exp = _("*(") + gdbQuoteTypes(data.type) + _("*)") + data.addr;
     }
 }
 
@@ -2886,9 +2886,9 @@ void GdbEngine::runDirectDebuggingHelper(const WatchData &data, bool dumpChildre
     QString cmd;
 
     if (type == __("QString") || type.endsWith(__("::QString")))
-        cmd = _("qdumpqstring (&") + data.exp + _c(')');
+        cmd = _("qdumpqstring (&(") + data.exp + _("))");
     else if (type == __("QStringList") || type.endsWith(__("::QStringList")))
-        cmd = _("qdumpqstringlist (&") + data.exp + _c(')');
+        cmd = _("qdumpqstringlist (&(") + data.exp + _("))");
 
     QVariant var;
     var.setValue(data);
@@ -3546,17 +3546,22 @@ void GdbEngine::updateLocals(const QVariant &cookie)
         WatchHandler *handler = m_manager->watchHandler();
         QStringList expanded = handler->expandedINames().toList();
         QString watchers;
-        foreach (QString item, handler->watchedExpressions()) {
+        QHash<QString, int> watcherNames = handler->watcherNames();
+        QHashIterator<QString, int> it(watcherNames);
+        while (it.hasNext()) {
+            it.next();
             if (!watchers.isEmpty())
-                watchers += _("$");
-            //item.replace(_("\""), _("\\\""));
-            watchers += item;
+                watchers += _("$$");
+            if (it.key() == WatchHandler::watcherEditPlaceHolder()) 
+                watchers += _("<Edit>$%1").arg(it.value());
+            else
+                watchers += _("%1$%2").arg(it.key()).arg(it.value());
         }
 
         postCommand(_("-interpreter-exec console \"bb %1 0 %2 %3\"")
                 .arg(int(theDebuggerBoolSetting(UseDebuggingHelpers)))
                 .arg(expanded.join(_(",")))
-                .arg(_(watchers.toLatin1().toBase64())),
+                .arg(_(watchers.toLatin1().toHex())),
             CB(handleStackFrame));
     } else {
         m_processedNames.clear();
@@ -3598,18 +3603,22 @@ void GdbEngine::handleStackFrame(const GdbResponse &response)
         GdbMi all;
         all.fromStringMultiple(out);
         
-        //qDebug() << "\n\n\nALL: " << all.toString() << "\n";
         GdbMi locals = all.findChild("locals");
-        //qDebug() << "\n\n\nLOCALS: " << locals.toString() << "\n";
         WatchData *data = manager()->watchHandler()->findItem(_("local"));
         QTC_ASSERT(data, return);
-
         QList<WatchData> list;
-        //foreach (const GdbMi &local, locals.children)
-        //   handleChildren(*data, local, &list);
         handleChildren(*data, locals, &list);
         //for (int i = 0; i != list.size(); ++i)
-        //    qDebug() << "READ: " << list.at(i).toString();
+        //    qDebug() << "LOCAL: " << list.at(i).toString();
+        manager()->watchHandler()->insertBulkData(list);
+
+        GdbMi watchers = all.findChild("watchers");
+        data = manager()->watchHandler()->findItem(_("watch"));
+        QTC_ASSERT(data, return);
+        list.clear();
+        handleChildren(*data, watchers, &list);
+        //for (int i = 0; i != list.size(); ++i)
+        //    qDebug() << "WATCH: " << list.at(i).toString();
         manager()->watchHandler()->insertBulkData(list);
 
         // FIXME:
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index fdcae7dda21f47c493ce50c7df36a0b08aae3fc0..b1c1a818e61448479c69e54208f89d5a31149072 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -1268,7 +1268,12 @@ void WatchHandler::watchExpression(const QString &exp)
     if (exp.isEmpty() || exp == watcherEditPlaceHolder())
         data.setAllUnneeded();
     data.iname = watcherName(exp);
-    insertData(data);
+    IDebuggerEngine *engine = m_manager->currentEngine();
+    if (engine && engine->isSynchroneous())
+        m_manager->updateWatchData(data);
+    else
+        insertData(data);
+    m_manager->updateWatchData(data);
     saveWatchers();
 }
 
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 50852d3838c04ebb671c3d09486e2f591b154790..a35f05e97bccc8fd165c77938b4db7b6b4d69347 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -275,6 +275,8 @@ public:
     QSet<QString> expandedINames() const
         { return m_expandedINames; }
     QStringList watchedExpressions() const;
+    QHash<QString, int> watcherNames() const
+        { return m_watcherNames; }
 
     static QString watcherEditPlaceHolder();
 
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index b8d2869a3bcd1a4db0777212ad1a5011fe9c6003..776e8cbd4dc5f00ae54257c72a440c335e459cf0 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -267,8 +267,15 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
         actWatchKnownMemory = new QAction(tr("Open memory editor at %1").arg(address), &menu);
     menu.addSeparator();
 
-    int atype = (m_type == LocalsType) ? WatchExpression : RemoveWatchExpression;
-    menu.addAction(theDebuggerAction(atype)->updatedAction(exp));
+    QAction *actWatchOrRemove;
+    if (m_type == LocalsType) { 
+        actWatchOrRemove = theDebuggerAction(WatchExpression)->updatedAction(exp);
+    } else {
+        actWatchOrRemove = theDebuggerAction(RemoveWatchExpression)->updatedAction(exp);
+        // Also for the case where the user cleared the expression.
+        actWatchOrRemove->setEnabled(true);
+    }
+    menu.addAction(actWatchOrRemove);
 
     menu.addAction(actInsertNewWatchItem);
     menu.addAction(actSelectWidgetToWatch);