diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index e3d8e1e107d22633364e5a12a0de3fe299ec6a31..6e892b54b029bbf46154eee47c33550029ef08e0 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -604,10 +604,15 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const
                         //|| data.type == BreakpointAtVFork
                         || data.type == BreakpointAtSysCall)
                     return typeToString(data.type);
-                if (data.type == WatchpointAtAddress)
-                    return tr("Data at 0x%1").arg(data.address, 0, 16);
-                if (data.type == WatchpointAtExpression)
-                    return tr("Data at %1").arg(data.expression);
+                if (data.type == WatchpointAtAddress) {
+                    quint64 address = response.address ? response.address : data.address;
+                    return tr("Data at 0x%1").arg(address, 0, 16);
+                }
+                if (data.type == WatchpointAtExpression) {
+                    QString expression = !response.expression.isEmpty()
+                            ? response.expression : data.expression;
+                    return tr("Data at %1").arg(expression);
+                }
                 return empty;
             }
             break;
@@ -1052,11 +1057,14 @@ void BreakHandler::appendBreakpoint(const BreakpointParameters &data)
     scheduleSynchronization();
 }
 
-void BreakHandler::handleAlienBreakpoint(BreakpointModelId id,
-    const BreakpointResponse &response, DebuggerEngine *engine)
+void BreakHandler::handleAlienBreakpoint(const BreakpointResponse &response, DebuggerEngine *engine)
 {
-    if (response.id.isMinor()) {
-        insertSubBreakpoint(id, response);
+    BreakpointModelId id = findSimilarBreakpoint(response);
+    if (id.isValid()) {
+        if (response.id.isMinor())
+            insertSubBreakpoint(id, response);
+        else
+            setResponse(id, response);
     } else {
         BreakpointModelId id(++currentId);
         const int row = m_storage.size();
@@ -1066,10 +1074,6 @@ void BreakHandler::handleAlienBreakpoint(BreakpointModelId id,
         endInsertRows();
 
         it->data = response;
-        it->data.type = BreakpointByFileAndLine;
-        it->data.functionName.clear();
-        it->data.address = 0;
-
         it->response = response;
         it->state = BreakpointInserted;
         it->engine = engine;
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index ca003552f912e5f84ecd56d8c566449939cfc4e3..04475bc80d67a390011e9caa93eb3a394398dccb 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -70,8 +70,7 @@ public:
 
     // The only way to add a new breakpoint.
     void appendBreakpoint(const BreakpointParameters &data);
-    void handleAlienBreakpoint(BreakpointModelId id,
-        const BreakpointResponse &response, DebuggerEngine *engine);
+    void handleAlienBreakpoint(const BreakpointResponse &response, DebuggerEngine *engine);
     void insertSubBreakpoint(BreakpointModelId id, const BreakpointResponse &data);
     void removeAlienBreakpoint(BreakpointModelId id);
 
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index f163acc2a6ab2a0a5b1d511291f642a67d590f5f..7e0a941122ee67facdf8d64620d90c818856517d 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -518,13 +518,15 @@ void GdbEngine::handleResponse(const QByteArray &buff)
             } else if (asyncClass == "breakpoint-created") {
                 // "{bkpt={number="1",type="breakpoint",disp="del",enabled="y",
                 //  addr="<PENDING>",pending="main",times="0",
-                //original-location="main"}}"
+                //  original-location="main"}}" -- or --
+                // {bkpt={number="2",type="hw watchpoint",disp="keep",enabled="y",
+                //  what="*0xbfffed48",times="0",original-location="*0xbfffed48"
                 BreakHandler *handler = breakHandler();
                 foreach (const GdbMi &bkpt, result.children()) {
                     BreakpointResponse br;
+                    br.type = BreakpointByFileAndLine;
                     updateResponse(br, bkpt);
-                    BreakpointModelId id = handler->findBreakpointByResponseId(br.id);
-                    handler->handleAlienBreakpoint(id, br, this);
+                    handler->handleAlienBreakpoint(br, this);
                 }
             } else if (asyncClass == "breakpoint-deleted") {
                 // "breakpoint-deleted" "{id="1"}"
@@ -2380,11 +2382,21 @@ void GdbEngine::updateResponse(BreakpointResponse &response, const GdbMi &bkpt)
         } else if (child.hasName("thread")) {
             response.threadSpec = child.data().toInt();
         } else if (child.hasName("type")) {
-            // "breakpoint", "hw breakpoint", "tracepoint"
-            if (child.data().contains("tracepoint"))
+            // "breakpoint", "hw breakpoint", "tracepoint", "hw watchpoint"
+            // {bkpt={number="2",type="hw watchpoint",disp="keep",enabled="y",
+            //  what="*0xbfffed48",times="0",original-location="*0xbfffed48"
+            if (child.data().contains("tracepoint")) {
                 response.tracepoint = true;
-            else if (!child.data().contains("reakpoint"))
-                response.type = WatchpointAtAddress;
+            } else if (child.data() == "hw watchpoint" || child.data() == "watchpoint") {
+                QByteArray what = bkpt.findChild("what").data();
+                if (what.startsWith("*0x")) {
+                    response.type = WatchpointAtAddress;
+                    response.address = what.mid(1).toULongLong(0, 0);
+                } else {
+                    response.type = WatchpointAtExpression;
+                    response.expression = QString::fromLocal8Bit(what);
+                }
+            }
         } else if (child.hasName("original-location")) {
             originalLocation = child.data();
         }