diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 25d5324729a542e8d45eb51a94834e7aac93889a..83b28ac89c03b8ef645642672b89772676c2b7ff 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -781,13 +781,14 @@ class FrameCommand(gdb.Command):
 
     def handleWatch(self, d, exp, iname):
         exp = str(exp)
+        escapedExp = exp.replace('"', '\\"');
         #warn("HANDLING WATCH %s, INAME: '%s'" % (exp, iname))
         if exp.startswith("[") and exp.endswith("]"):
             #warn("EVAL: EXP: %s" % exp)
             d.beginHash()
             d.putField("iname", iname)
-            d.putField("name", exp)
-            d.putField("exp", exp)
+            d.putField("name", escapedExp)
+            d.putField("exp", escapedExp)
             try:
                 list = eval(exp)
                 d.putValue("")
@@ -800,8 +801,8 @@ class FrameCommand(gdb.Command):
                     self.handleWatch(d, item, "%s.%d" % (iname, itemNumber))
                     itemNumber += 1
                 d.endChildren()
-            except:
-                warn("EVAL: ERROR CAUGHT")
+            except RuntimeError, error:
+                warn("EVAL: ERROR CAUGHT %s" % error)
                 d.putValue("<syntax error>")
                 d.putType(" ")
                 d.putNumChild(0)
@@ -812,18 +813,20 @@ class FrameCommand(gdb.Command):
 
         d.beginHash()
         d.putField("iname", iname)
-        d.putField("name", exp)
-        d.putField("exp", exp)
+        d.putField("name", escapedExp)
+        d.putField("exp", escapedExp)
         handled = False
-        if exp == "<Edit>":
-            d.putValue('value=" ",type=" ",numchild="0",')
+        if exp == "<Edit>" or len(exp) == 0:
+            d.put('value=" ",type=" ",numchild="0",')
         else:
-                #try:
+            try:
                 value = parseAndEvaluate(exp)
                 item = Item(value, iname, None, None)
+                if not value is None:
+                    d.putAddress(value.address)
                 d.putItemHelper(item)
-                #except RuntimeError:
-                #d.put('value="<invalid>",type="<unknown>",numchild="0",')
+            except RuntimeError:
+                d.put('value="<invalid>",type="<unknown>",numchild="0",')
         d.endHash()
 
 
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 714f76f3156f4790ac6dee1bbf5b9eab56b65e3b..fff4f3ce7cd5b361baa9fceaf21b6f7186a6cfab 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -1350,7 +1350,8 @@ static void swapEndian(char *d, int nchar)
 
 void WatchHandler::showEditValue(const WatchData &data)
 {
-    QObject *w = m_editHandlers.value(data.iname);
+    const QByteArray key  = data.addr.isEmpty() ? data.iname : data.addr;
+    QObject *w = m_editHandlers.value(key);
     if (data.editformat == 0x0) {
         m_editHandlers.remove(data.iname);
         delete w;
@@ -1364,7 +1365,7 @@ void WatchHandler::showEditValue(const WatchData &data)
             if (!data.addr.isEmpty())
                 addr =  QString::fromLatin1(data.addr);
             l->setWindowTitle(tr("%1 object at %2").arg(data.type, addr));
-            m_editHandlers[data.iname] = l;
+            m_editHandlers[key] = l;
         }
         int width, height, format;
         QByteArray ba;
@@ -1396,7 +1397,7 @@ void WatchHandler::showEditValue(const WatchData &data)
         if (!t) {
             delete w;
             t = new QTextEdit;
-            m_editHandlers[data.iname] = t;
+            m_editHandlers[key] = t;
         }
         QByteArray ba = QByteArray::fromHex(data.editvalue);
         QString str = QString::fromUtf16((ushort *)ba.constData(), ba.size()/2);
@@ -1413,7 +1414,7 @@ void WatchHandler::showEditValue(const WatchData &data)
             p = new QProcess;
             p->start(cmd);
             p->waitForStarted();
-            m_editHandlers[data.iname] = p;
+            m_editHandlers[key] = p;
         }
         p->write(input + "\n");
     } else {