diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 3e1d2f97e8d418b35e98f6780d971098bd0faf6a..3492fbbdd8c4d72e525363f67fa4c887ab416969 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -372,10 +372,12 @@ BreakHandler::BreakHandler(DebuggerEngine *engine)
     m_disabledBreakpointIcon(_(":/debugger/images/breakpoint_disabled_16.png")),
     m_pendingBreakPointIcon(_(":/debugger/images/breakpoint_pending_16.png")),
     m_watchpointIcon(_(":/debugger/images/watchpoint.png")),
-    m_engine(engine),  // Possibly 0 for the dummy engine "handling" session data.
+    m_engine(engine),
     m_lastFound(0),
     m_lastFoundQueried(false)
-{}
+{
+    QTC_ASSERT(m_engine, /**/);
+}
 
 BreakHandler::~BreakHandler()
 {
@@ -737,27 +739,11 @@ bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int
             return true;
         }
 
-        case RequestRemoveBreakpointRole: {
-            BreakpointData *data = value.value<BreakpointData *>();
-            QTC_ASSERT(data, return false);
-            removeBreakpoint(data);
-            return true;
-        }
-
-        case RequestAppendBreakpointRole: {
-            BreakpointData *data = value.value<BreakpointData *>();
-            QTC_ASSERT(data, return false);
-            appendBreakpoint(data);
-            if (m_engine)
-                m_engine->attemptBreakpointSynchronization();
-            return true;
-        }
-
         case RequestUpdateBreakpointRole: {
             BreakpointData *data = value.value<BreakpointData *>();
             QTC_ASSERT(data, return false);
-            if (m_engine)
-                m_engine->attemptBreakpointSynchronization();
+            QTC_ASSERT(m_engine, return false);
+            m_engine->attemptBreakpointSynchronization();
             return true;
         }
 
@@ -940,14 +926,25 @@ void BreakHandler::removeAllBreakpoints()
     updateMarkers();
 }
 
-/*
-void BreakHandler::setAllPending()
+void BreakHandler::toggleBreakpoint(const QString &fileName, int lineNumber)
 {
-    for (int index = size(); --index >= 0;)
-        at(index)->pending = true;
-    updateMarkers();
+    for (int index = size(); --index >= 0;) {
+        BreakpointData *data = m_bp.at(index);
+        if (data->isLocatedAt(fileName, lineNumber)) {
+            removeBreakpointHelper(index);
+            emit layoutChanged();
+            return;
+        }
+    }
+    BreakpointData *data = new BreakpointData;
+    data->fileName = fileName;
+    data->lineNumber = QByteArray::number(lineNumber);
+    data->pending = true;
+    data->setMarkerFileName(fileName);
+    data->setMarkerLineNumber(lineNumber);
+    appendBreakpoint(data);
+    m_engine->attemptBreakpointSynchronization();
 }
-*/
 
 void BreakHandler::saveSessionData()
 {
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 4e856cfef1025a127ac8ffbab98e181f38b3e611..0bd7ec202edc628000701e4e1779078566c8e025 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -56,7 +56,6 @@ public:
     ~BreakHandler();
 
     void removeAllBreakpoints();
-    //void setAllPending();
     void loadSessionData();
     void saveSessionData();
 
@@ -88,6 +87,7 @@ public:
 
     void initializeFromTemplate(BreakHandler *other);
     void storeToTemplate(BreakHandler *other);
+    void toggleBreakpoint(const QString &fileName, int lineNumber);
 
 public slots:
     void appendBreakpoint(BreakpointData *data);
diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index 0195ba3c51661e3ca31f7316293a327b7bafb185..a510ff6ecac65dd6252b8f5a400267fec06b3842 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -421,18 +421,6 @@ BreakpointData *BreakWindow::findSimilarBreakpoint(const BreakpointData *needle0
     return v.value<BreakpointData *>();
 }
 
-void BreakWindow::appendBreakpoint(BreakpointData *data)
-{
-    QVariant v = QVariant::fromValue<BreakpointData *>(data);
-    setModelData(RequestAppendBreakpointRole, v);
-}
-
-void BreakWindow::removeBreakpoint(BreakpointData *data)
-{
-    QVariant v = QVariant::fromValue<BreakpointData *>(data);
-    setModelData(RequestRemoveBreakpointRole, v);
-}
-
 void BreakWindow::updateBreakpoint(BreakpointData *data)
 {
     QVariant v = QVariant::fromValue<BreakpointData *>(data);
diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h
index 3a5d5a18ba9904c17213e3b5907fd9004d49c478..92013a0dd00fc4bcd7119f4150cab5e2bab91af1 100644
--- a/src/plugins/debugger/breakwindow.h
+++ b/src/plugins/debugger/breakwindow.h
@@ -47,8 +47,8 @@ public:
 
     BreakpointData *findSimilarBreakpoint(const BreakpointData *needle);
     void updateBreakpoint(BreakpointData *data);
-    void appendBreakpoint(BreakpointData *data);
-    void removeBreakpoint(BreakpointData *data);
+    //void appendBreakpoint(BreakpointData *data);
+    //void removeBreakpoint(BreakpointData *data);
     QVariant modelData(int role, int index);
 
 public slots:
diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index bd8a9c42148d9f8eb29c8a2bfbc832a52b97dc27..00f4d560012a42019c82256d97ddcc225acaa414 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -190,14 +190,13 @@ enum ModelRoles
     BreakpointIgnoreCountRole,
     BreakpointThreadSpecRole,
     RequestActivateBreakpointRole,
-    RequestRemoveBreakpointRole,
     RequestRemoveBreakpointByIndexRole,
     RequestSynchronizeBreakpointsRole,
     RequestBreakByFunctionRole,
     RequestBreakByFunctionMainRole,
     RequestFindSimilarBreakpointRole,
-    RequestAppendBreakpointRole,
     RequestUpdateBreakpointRole,
+    RequestToggleBreakpointRole,
 
     // Locals and Watchers
     LocalsINameRole,
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 8e6afda85811024bb44283360d5d8279f310cf48..d46c763142f07e13eae2f4e3eef0008b245183ed 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -349,14 +349,17 @@ void DebuggerEngine::handleCommand(int role, const QVariant &value)
             break;
         }
 
-        case RequestWatchPointRole:
-            //if (QAction *action = qobject_cast<QAction *>(sender()))
-            //    watchPoint(action->data().toPoint());
-            QTC_ASSERT(false, /* FIXME ABC */);
+        case RequestToggleBreakpointRole: {
+            QList<QVariant> list = value.toList();
+            QTC_ASSERT(list.size() == 2, break);
+            const QString fileName = list.at(0).toString();
+            const int lineNumber = list.at(1).toInt();
+            breakHandler()->toggleBreakpoint(fileName, lineNumber);
             break;
+        }
     }
-}
 
+}
 
 void DebuggerEngine::showModuleSymbols
     (const QString &moduleName, const Symbols &symbols)
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index ce67ada91698b376c7335fdd0c2f25aeb666c5b2..fd524af5582d1fc13a8afe571121192a3ffa01b1 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1843,21 +1843,10 @@ void DebuggerPluginPrivate::toggleBreakpoint()
 
 void DebuggerPluginPrivate::toggleBreakpoint(const QString &fileName, int lineNumber)
 {
-    BreakpointData needle;
-    needle.bpFileName = fileName;
-    needle.bpLineNumber.setNum(lineNumber);
-    BreakpointData *data = m_breakWindow->findSimilarBreakpoint(&needle);
-    if (data) {
-        m_breakWindow->removeBreakpoint(data);
-    } else {
-        data = new BreakpointData;
-        data->fileName = fileName;
-        data->lineNumber = QByteArray::number(lineNumber);
-        data->pending = true;
-        data->setMarkerFileName(fileName);
-        data->setMarkerLineNumber(lineNumber);
-        m_breakWindow->appendBreakpoint(data);
-    }
+    QList<QVariant> list;
+    list.append(fileName);
+    list.append(lineNumber);
+    notifyCurrentEngine(RequestToggleBreakpointRole, list);
 }
 
 void DebuggerPluginPrivate::breakpointSetRemoveMarginActionTriggered()