diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 3492fbbdd8c4d72e525363f67fa4c887ab416969..c9b63e8bfcee2a1a8b66c14c52def0c39e681b5f 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -572,15 +572,6 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const
     static const QString empty = QString(QLatin1Char('-'));
 
     switch (role) {
-        case RequestFindSimilarBreakpointRole: {
-            // Complain if data/setData are not used alternately.
-            QTC_ASSERT(m_lastFoundQueried, return false);
-            QVariant value =  QVariant::fromValue(m_lastFound);
-            m_lastFoundQueried = false;
-            m_lastFound = 0; // Reset for "safety".
-            return value;
-        }
-
         case CurrentThreadIdRole:
             QTC_ASSERT(m_engine, return QVariant());
             return m_engine->threadsHandler()->currentThreadId();
@@ -714,16 +705,6 @@ Qt::ItemFlags BreakHandler::flags(const QModelIndex &index) const
 bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int role)
 {
     switch (role) {
-        case RequestFindSimilarBreakpointRole: {
-            // Complain if data/setData are not used alternately.
-            QTC_ASSERT(!m_lastFoundQueried, return false);
-            BreakpointData *needle = value.value<BreakpointData *>();
-            QTC_ASSERT(needle, return false);
-            m_lastFound = findSimilarBreakpoint(needle);
-            m_lastFoundQueried = true;
-            return true;
-        }
-
         case RequestActivateBreakpointRole: {
             const BreakpointData *data = at(value.toInt());
             QTC_ASSERT(data, return false);
@@ -739,14 +720,6 @@ bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int
             return true;
         }
 
-        case RequestUpdateBreakpointRole: {
-            BreakpointData *data = value.value<BreakpointData *>();
-            QTC_ASSERT(data, return false);
-            QTC_ASSERT(m_engine, return false);
-            m_engine->attemptBreakpointSynchronization();
-            return true;
-        }
-
         case RequestSynchronizeBreakpointsRole:
             QTC_ASSERT(m_engine, return false);
             m_engine->attemptBreakpointSynchronization();
@@ -884,14 +857,12 @@ void BreakHandler::removeBreakpoint(int index)
         return;
     removeBreakpointHelper(index);
     emit layoutChanged();
-    //saveBreakpoints();
 }
 
 void BreakHandler::removeBreakpoint(BreakpointData *data)
 {
     removeBreakpointHelper(m_bp.indexOf(data));
     emit layoutChanged();
-    //saveBreakpoints();
 }
 
 void BreakHandler::toggleBreakpointEnabled(BreakpointData *data)
@@ -905,7 +876,6 @@ void BreakHandler::toggleBreakpointEnabled(BreakpointData *data)
         m_enabled.removeAll(data);
         m_disabled.append(data);
     }
-    //saveBreakpoints();
     updateMarkers();
 }
 
@@ -913,7 +883,7 @@ void BreakHandler::appendBreakpoint(BreakpointData *data)
 {
     append(data);
     emit layoutChanged();
-    saveBreakpoints();
+    saveBreakpoints();  // FIXME: remove?
     updateMarkers();
 }
 
@@ -922,27 +892,40 @@ void BreakHandler::removeAllBreakpoints()
     for (int index = size(); --index >= 0;)
         removeBreakpointHelper(index);
     emit layoutChanged();
-    //saveBreakpoints();
     updateMarkers();
 }
 
+BreakpointData *BreakHandler::findBreakpoint(const QString &fileName, int lineNumber)
+{
+    foreach (BreakpointData *data, m_bp)
+        if (data->isLocatedAt(fileName, lineNumber))
+            return data;
+    return 0;
+}
+
 void BreakHandler::toggleBreakpoint(const QString &fileName, int lineNumber)
 {
-    for (int index = size(); --index >= 0;) {
-        BreakpointData *data = m_bp.at(index);
-        if (data->isLocatedAt(fileName, lineNumber)) {
-            removeBreakpointHelper(index);
-            emit layoutChanged();
-            return;
-        }
+    BreakpointData *data = findBreakpoint(fileName, lineNumber);
+    if (data) {
+        removeBreakpoint(data);
+    } else {
+        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();
     }
-    BreakpointData *data = new BreakpointData;
-    data->fileName = fileName;
-    data->lineNumber = QByteArray::number(lineNumber);
-    data->pending = true;
-    data->setMarkerFileName(fileName);
-    data->setMarkerLineNumber(lineNumber);
-    appendBreakpoint(data);
+}
+
+void BreakHandler::toggleBreakpointEnabled(const QString &fileName, int lineNumber)
+{
+    BreakpointData *data = findBreakpoint(fileName, lineNumber);
+    QTC_ASSERT(data, return);
+    data->enabled = !data->enabled;
+    data->updateMarker();
     m_engine->attemptBreakpointSynchronization();
 }
 
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 0bd7ec202edc628000701e4e1779078566c8e025..16a477eb7854f5835789b2849d213a3450c3b217 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -88,6 +88,8 @@ public:
     void initializeFromTemplate(BreakHandler *other);
     void storeToTemplate(BreakHandler *other);
     void toggleBreakpoint(const QString &fileName, int lineNumber);
+    void toggleBreakpointEnabled(const QString &fileName, int lineNumber);
+    BreakpointData *findBreakpoint(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 a510ff6ecac65dd6252b8f5a400267fec06b3842..222fa8f400cb425c6ed99a37e4f15019a0a0d01a 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -411,22 +411,6 @@ void BreakWindow::rowActivated(const QModelIndex &index)
     setModelData(RequestActivateBreakpointRole, index.row());
 }
 
-BreakpointData *BreakWindow::findSimilarBreakpoint(const BreakpointData *needle0)
-{
-    BreakpointData *needle = const_cast<BreakpointData *>(needle0);
-    QVariant v = QVariant::fromValue<BreakpointData *>(needle);
-    setModelData(RequestFindSimilarBreakpointRole, v);
-    QTC_ASSERT(model(), return false);
-    v = model()->data(QModelIndex(), RequestFindSimilarBreakpointRole);
-    return v.value<BreakpointData *>();
-}
-
-void BreakWindow::updateBreakpoint(BreakpointData *data)
-{
-    QVariant v = QVariant::fromValue<BreakpointData *>(data);
-    setModelData(RequestUpdateBreakpointRole, v);
-}
-
 void BreakWindow::setModelData
     (int role, const QVariant &value, const QModelIndex &index)
 {
diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h
index 92013a0dd00fc4bcd7119f4150cab5e2bab91af1..1e7204ab6c65dcb7f78f69e69cf35b035503c7aa 100644
--- a/src/plugins/debugger/breakwindow.h
+++ b/src/plugins/debugger/breakwindow.h
@@ -45,17 +45,10 @@ public:
     explicit BreakWindow(QWidget *parent = 0);
     ~BreakWindow();
 
-    BreakpointData *findSimilarBreakpoint(const BreakpointData *needle);
-    void updateBreakpoint(BreakpointData *data);
-    //void appendBreakpoint(BreakpointData *data);
-    //void removeBreakpoint(BreakpointData *data);
-    QVariant modelData(int role, int index);
-
-public slots:
+private slots:
     void resizeColumnsToContents();
     void setAlwaysResizeColumnsToContents(bool on);
 
-private slots:
     void rowActivated(const QModelIndex &index);
     void setAlternatingRowColorsHelper(bool on) { setAlternatingRowColors(on); }
     void showAddressColumn(bool on);
diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index 00f4d560012a42019c82256d97ddcc225acaa414..68ab98a0fe09e2ac0478129fa040fb19f4f63230 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -194,9 +194,9 @@ enum ModelRoles
     RequestSynchronizeBreakpointsRole,
     RequestBreakByFunctionRole,
     RequestBreakByFunctionMainRole,
-    RequestFindSimilarBreakpointRole,
-    RequestUpdateBreakpointRole,
     RequestToggleBreakpointRole,
+    RequestToggleBreakpointEnabledRole,
+    RequestContextMenuRole,
 
     // Locals and Watchers
     LocalsINameRole,
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index d46c763142f07e13eae2f4e3eef0008b245183ed..04fd03a42c22cb816839de5b506d25b2d52ec9dd 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -72,6 +72,7 @@
 #include <QtGui/QAbstractItemView>
 #include <QtGui/QStandardItemModel>
 #include <QtGui/QAction>
+#include <QtGui/QMenu>
 #include <QtGui/QMessageBox>
 #include <QtGui/QPlainTextEdit>
 #include <QtGui/QPushButton>
@@ -197,8 +198,10 @@ bool CommandHandler::setData(const QModelIndex &, const QVariant &value, int rol
 //
 //////////////////////////////////////////////////////////////////////
 
-class DebuggerEnginePrivate
+class DebuggerEnginePrivate : public QObject
 {
+    Q_OBJECT
+
 public:
     DebuggerEnginePrivate(DebuggerEngine *engine, const DebuggerStartParameters &sp)
       : m_engine(engine),
@@ -217,6 +220,11 @@ public:
         m_disassemblerViewAgent(engine)
     {}
 
+public slots:
+    void breakpointSetRemoveMarginActionTriggered();
+    void breakpointEnableDisableMarginActionTriggered();
+    void handleContextMenuRequest(const QVariant &parameters);
+
 public:
     DebuggerEngine *m_engine; // Not owned.
     DebuggerRunControl *m_runControl;  // Not owned.
@@ -238,6 +246,85 @@ public:
     DisassemblerViewAgent m_disassemblerViewAgent;
 };
 
+void DebuggerEnginePrivate::breakpointSetRemoveMarginActionTriggered()
+{
+    QAction *act = qobject_cast<QAction *>(sender());
+    QTC_ASSERT(act, return);
+    QList<QVariant> list = act->data().toList();
+    QTC_ASSERT(list.size() == 2, return);
+    const QString fileName = list.at(0).toString();
+    const int lineNumber = list.at(1).toInt();
+    m_breakHandler.toggleBreakpoint(fileName, lineNumber);
+}
+
+void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered()
+{
+    QAction *act = qobject_cast<QAction *>(sender());
+    QTC_ASSERT(act, return);
+    QList<QVariant> list = act->data().toList();
+    QTC_ASSERT(list.size() == 2, return);
+    const QString fileName = list.at(0).toString();
+    const int lineNumber = list.at(1).toInt();
+    m_breakHandler.toggleBreakpointEnabled(fileName, lineNumber);
+}
+
+void DebuggerEnginePrivate::handleContextMenuRequest(const QVariant &parameters)
+{
+    const QList<QVariant> list = parameters.toList();
+    QTC_ASSERT(list.size() == 3, return);
+    TextEditor::ITextEditor *editor = 
+        (TextEditor::ITextEditor *)(list.at(0).value<quint64>());
+    int lineNumber = list.at(1).toInt();
+    QMenu *menu = (QMenu *)(list.at(2).value<quint64>());
+
+    BreakpointData *data = 0;
+    QString position;
+    QString fileName;
+    if (editor->property("DisassemblerView").toBool()) {
+        fileName = editor->file()->fileName();
+        QString line = editor->contents()
+            .section('\n', lineNumber - 1, lineNumber - 1);
+        position = _("*") + fileName;
+        BreakpointData needle;
+        needle.bpAddress = line.left(line.indexOf(QLatin1Char(' '))).toLatin1();
+        needle.bpLineNumber = "-1";
+        data = m_breakHandler.findSimilarBreakpoint(&needle);
+    } else {
+        fileName = editor->file()->fileName();
+        position = fileName + QString(":%1").arg(lineNumber);
+        data = m_breakHandler.findBreakpoint(fileName, lineNumber);
+    }
+
+    QList<QVariant> args;
+    args.append(fileName);
+    args.append(lineNumber);
+
+    if (data) {
+        // existing breakpoint
+        QAction *act = new QAction(tr("Remove Breakpoint"), menu);
+        act->setData(args);
+        connect(act, SIGNAL(triggered()),
+            this, SLOT(breakpointSetRemoveMarginActionTriggered()));
+        menu->addAction(act);
+
+        QAction *act2;
+        if (data->enabled)
+            act2 = new QAction(tr("Disable Breakpoint"), menu);
+        else
+            act2 = new QAction(tr("Enable Breakpoint"), menu);
+        act2->setData(args);
+        connect(act2, SIGNAL(triggered()),
+            this, SLOT(breakpointEnableDisableMarginActionTriggered()));
+        menu->addAction(act2);
+    } else {
+        // non-existing
+        QAction *act = new QAction(tr("Set Breakpoint"), menu);
+        act->setData(args);
+        connect(act, SIGNAL(triggered()),
+            this, SLOT(breakpointSetRemoveMarginActionTriggered()));
+        menu->addAction(act);
+    }
+}
 
 //////////////////////////////////////////////////////////////////////
 //
@@ -340,25 +427,33 @@ void DebuggerEngine::handleCommand(int role, const QVariant &value)
             executeDebuggerCommand(value.toString());
             break;
 
+        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;
+        }
+
         case RequestToolTipByExpressionRole: {
             QList<QVariant> list = value.toList();
             QTC_ASSERT(list.size() == 3, break);
-            setToolTipExpression(list.at(0).value<QPoint>(),
-                (TextEditor::ITextEditor *)(list.at(1).value<quint64>()),
-                list.at(2).toInt()); // Eeks.
+            QPoint point = list.at(0).value<QPoint>();
+            TextEditor::ITextEditor *editor = // Eeks.
+                (TextEditor::ITextEditor *)(list.at(1).value<quint64>());
+            int pos = list.at(2).toInt(); 
+            setToolTipExpression(point, editor, pos);
             break;
         }
 
-        case RequestToggleBreakpointRole: {
+        case RequestContextMenuRole: {
             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);
+            QTC_ASSERT(list.size() == 3, break);
+            d->handleContextMenuRequest(list);
             break;
         }
     }
-
 }
 
 void DebuggerEngine::showModuleSymbols
@@ -960,3 +1055,5 @@ bool DebuggerEngine::isReverseDebugging() const
 
 } // namespace Internal
 } // namespace Debugger
+
+#include "debuggerengine.moc"
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index fd524af5582d1fc13a8afe571121192a3ffa01b1..c57a3dae516bc6cca8c1a75420a105ec28bead70 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -815,8 +815,6 @@ public slots:
     void activateDebugMode();
     void toggleBreakpoint();
     void toggleBreakpoint(const QString &fileName, int lineNumber);
-    void breakpointSetRemoveMarginActionTriggered();
-    void breakpointEnableDisableMarginActionTriggered();
     void onModeChanged(Core::IMode *mode);
     void showSettingsDialog();
 
@@ -1785,51 +1783,11 @@ void DebuggerPluginPrivate::requestContextMenu(TextEditor::ITextEditor *editor,
     if (!isDebuggable(editor))
         return;
 
-    BreakpointData *data = 0;
-    QString position;
-    if (editor->property("DisassemblerView").toBool()) {
-        QString fileName = editor->file()->fileName();
-        QString line = editor->contents()
-            .section('\n', lineNumber - 1, lineNumber - 1);
-        position = _("*") + fileName;
-        BreakpointData needle;
-        needle.bpAddress = line.left(line.indexOf(QLatin1Char(' '))).toLatin1();
-        needle.bpLineNumber = "-1";
-        data = m_breakWindow->findSimilarBreakpoint(&needle);
-    } else {
-        QString fileName = editor->file()->fileName();
-        position = fileName + QString(":%1").arg(lineNumber);
-        BreakpointData needle;
-        needle.bpFileName = fileName;
-        needle.bpLineNumber = QByteArray::number(lineNumber);
-        data = m_breakWindow->findSimilarBreakpoint(&needle);
-    }
-
-    if (data) {
-        // existing breakpoint
-        QAction *act = new QAction(tr("Remove Breakpoint"), menu);
-        act->setData(position);
-        connect(act, SIGNAL(triggered()),
-            this, SLOT(breakpointSetRemoveMarginActionTriggered()));
-        menu->addAction(act);
-
-        QAction *act2;
-        if (data->enabled)
-            act2 = new QAction(tr("Disable Breakpoint"), menu);
-        else
-            act2 = new QAction(tr("Enable Breakpoint"), menu);
-        act2->setData(position);
-        connect(act2, SIGNAL(triggered()),
-            this, SLOT(breakpointEnableDisableMarginActionTriggered()));
-        menu->addAction(act2);
-    } else {
-        // non-existing
-        QAction *act = new QAction(tr("Set Breakpoint"), menu);
-        act->setData(position);
-        connect(act, SIGNAL(triggered()),
-            this, SLOT(breakpointSetRemoveMarginActionTriggered()));
-        menu->addAction(act);
-    }
+    QList<QVariant> list;
+    list.append(quint64(editor));
+    list.append(lineNumber);
+    list.append(quint64(menu));
+    notifyCurrentEngine(RequestContextMenuRole, list);
 }
 
 void DebuggerPluginPrivate::toggleBreakpoint()
@@ -1849,31 +1807,6 @@ void DebuggerPluginPrivate::toggleBreakpoint(const QString &fileName, int lineNu
     notifyCurrentEngine(RequestToggleBreakpointRole, list);
 }
 
-void DebuggerPluginPrivate::breakpointSetRemoveMarginActionTriggered()
-{
-    QAction *act = qobject_cast<QAction *>(sender());
-    QTC_ASSERT(act, return);
-    QString str = act->data().toString();
-    int pos = str.lastIndexOf(':');
-    toggleBreakpoint(str.left(pos), str.mid(pos + 1).toInt());
-}
-
-void DebuggerPluginPrivate::breakpointEnableDisableMarginActionTriggered()
-{
-    QAction *act = qobject_cast<QAction *>(sender());
-    QTC_ASSERT(act, return);
-
-    QString str = act->data().toString();
-    int pos = str.lastIndexOf(':');
-    BreakpointData needle;
-    needle.bpFileName = str.left(pos);
-    needle.bpLineNumber = str.mid(pos + 1).toLatin1();
-    BreakpointData *data = m_breakWindow->findSimilarBreakpoint(&needle);
-    QTC_ASSERT(data, return);
-    data->enabled = !data->enabled;
-    m_breakWindow->updateBreakpoint(data);
-}
-
 void DebuggerPluginPrivate::requestMark(ITextEditor *editor, int lineNumber)
 {
     if (isDebuggable(editor))