diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 8df0b90f3c4f5d1653f5b5c3dcf9a774c1097177..1bcfafcbdd84ace682b5c6f0aa4d029cda9bbd73 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -28,6 +28,7 @@
 **************************************************************************/
 
 #include "breakhandler.h"
+#include "breakpointmarker.h"
 
 #include "debuggeractions.h"
 #include "debuggerengine.h"
@@ -52,6 +53,8 @@ static DebuggerPlugin *plugin() { return DebuggerPlugin::instance(); }
 
 
 static Breakpoints m_bp;
+// FIXME this is only static because it might map to bps in the above list
+static QHash<quint64,BreakpointMarker*> m_markers;
 
 //////////////////////////////////////////////////////////////////
 //
@@ -108,6 +111,7 @@ void BreakHandler::removeAt(int index)
     BreakpointData *data = at(index);
     QTC_ASSERT(data, return);
     m_bp.removeAt(index);
+    delete m_markers.take(data->id);
     delete data;
 }
 
@@ -242,10 +246,33 @@ void BreakHandler::loadBreakpoints()
 void BreakHandler::updateMarkers()
 {
     for (int index = 0; index != size(); ++index)
-        at(index)->updateMarker();
+        updateMarker(at(index));
     emit layoutChanged();
 }
 
+void BreakHandler::updateMarker(BreakpointData * bp)
+{
+    BreakpointMarker *marker = m_markers.value(bp->id);
+
+    if (marker && (bp->m_markerFileName != marker->fileName()
+                || bp->m_markerLineNumber != marker->lineNumber())) {
+        removeMarker(bp);
+        marker = 0;
+    }
+
+    if (!marker && !bp->m_markerFileName.isEmpty() && bp->m_markerLineNumber > 0) {
+        marker = new BreakpointMarker(this, bp, bp->m_markerFileName, bp->m_markerLineNumber);
+        m_markers.insert(bp->id, marker);
+    }
+
+    if (marker)
+        marker->setPending(bp->pending);
+}
+void BreakHandler::removeMarker(BreakpointData * bp)
+{
+    delete m_markers.take(bp->id);
+}
+
 QVariant BreakHandler::headerData(int section,
     Qt::Orientation orientation, int role) const
 {
@@ -517,12 +544,14 @@ void BreakHandler::reinsertBreakpoint(BreakpointData *data)
 
 void BreakHandler::append(BreakpointData *data)
 {
-    data->m_handler = this;
     m_bp.append(data);
 }
 
 Breakpoints BreakHandler::takeRemovedBreakpoints()
 {
+    foreach(BreakpointData *bp, m_removed) {
+        removeMarker(bp);
+    }
     Breakpoints result = m_removed;
     m_removed.clear();
     return result;
@@ -547,7 +576,7 @@ void BreakHandler::removeBreakpointHelper(int index)
     BreakpointData *data = at(index);
     QTC_ASSERT(data, return);
     m_bp.removeAt(index);
-    data->removeMarker();
+    removeMarker(data);
     m_removed.append(data);
 }
 
@@ -576,8 +605,8 @@ void BreakHandler::toggleBreakpointEnabled(BreakpointData *data)
         m_enabled.removeAll(data);
         m_disabled.append(data);
     }
-    data->removeMarker(); // Force icon update.
-    data->updateMarker();
+    removeMarker(data); // Force icon update.
+    updateMarker(data);
     emit layoutChanged();
     m_engine->attemptBreakpointSynchronization();
 }
@@ -661,6 +690,9 @@ void BreakHandler::saveSessionData()
 void BreakHandler::loadSessionData()
 {
     QTC_ASSERT(m_engine->isSessionEngine(), return);
+    foreach(BreakpointData *bp, m_bp) {
+        delete m_markers.take(bp->id);
+    }
     qDeleteAll(m_bp);
     m_bp.clear();
     loadBreakpoints();
@@ -696,7 +728,9 @@ void BreakHandler::initializeFromTemplate(BreakHandler *other)
     m_inserted.clear();
     foreach(BreakpointData *data, m_bp) {
         if (m_engine->acceptsBreakpoint(data)) {
-            data->m_handler = this;
+            BreakpointMarker *marker = m_markers.value(data->id);
+            if (marker)
+                marker->m_handler = this;
             m_inserted.append(data);
         }
     }
@@ -705,7 +739,9 @@ void BreakHandler::initializeFromTemplate(BreakHandler *other)
 void BreakHandler::storeToTemplate(BreakHandler *other)
 {
     foreach (BreakpointData *data, m_bp) {
-        data->m_handler = other;
+        BreakpointMarker *marker = m_markers.value(data->id);
+        if (marker)
+            marker->m_handler = other;
         data->clear();
     }
     other->saveSessionData();
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 39de2c9044f36a87e1b8064aaeb60d8d6ad78d15..ca7a8d649c2ac618ecd26ebe3b1774125c2eedae 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -75,6 +75,8 @@ public:
     int findWatchPointIndexByAddress(quint64 address) const;
     bool watchPointAt(quint64 address) const;
     void updateMarkers();
+    void updateMarker(BreakpointData *);
+    void removeMarker(BreakpointData *);
     bool isActive() const;
 
     Breakpoints takeRemovedBreakpoints(); // Owned.
diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp
index 1235e8ce14d899e1ffef9da94755edbf70828641..63581a1000c956c6fc98590db3723a8698f760f3 100644
--- a/src/plugins/debugger/breakpoint.cpp
+++ b/src/plugins/debugger/breakpoint.cpp
@@ -27,13 +27,9 @@
 **
 **************************************************************************/
 
+#include "breakpoint.h"
 #include "breakhandler.h"
 
-#include "debuggeractions.h"
-#include "debuggerengine.h"
-#include "debuggerstringutils.h"
-#include "threadshandler.h"
-#include "stackhandler.h"
 #include "stackframe.h"
 
 #include <texteditor/basetextmark.h>
@@ -45,111 +41,9 @@
 #include <QtCore/QFileInfo>
 #include <QtCore/QDir>
 
-//////////////////////////////////////////////////////////////////
-//
-// BreakpointMarker
-//
-//////////////////////////////////////////////////////////////////
-
-// Compare file names case insensitively on Windows.
-static inline bool fileNameMatch(const QString &f1, const QString &f2)
-{
-#ifdef Q_OS_WIN
-    return f1.compare(f2, Qt::CaseInsensitive) == 0;
-#else
-    return f1 == f2;
-#endif
-}
-
 namespace Debugger {
 namespace Internal {
 
-// The red blob on the left side in the cpp editor.
-class BreakpointMarker : public TextEditor::BaseTextMark
-{
-    Q_OBJECT
-public:
-    BreakpointMarker(BreakpointData *data, const QString &fileName, int lineNumber)
-      : BaseTextMark(fileName, lineNumber)
-    {
-        m_data = data;
-        m_pending = true;
-        //qDebug() << "CREATE MARKER " << fileName << lineNumber;
-    }
-
-    ~BreakpointMarker()
-    {
-        //qDebug() << "REMOVE MARKER ";
-        m_data = 0;
-    }
-
-    QIcon icon() const
-    {
-        const BreakHandler *handler = m_data->handler();
-        if (!m_data->enabled)
-            return handler->disabledBreakpointIcon();
-        if (!handler->isActive())
-            return handler->emptyIcon();
-        return m_pending ? handler->pendingBreakPointIcon() : handler->breakpointIcon();
-    }
-
-    void setPending(bool pending)
-    {
-        if (pending == m_pending)
-            return;
-        m_pending = pending;
-        updateMarker();
-    }
-
-    void updateBlock(const QTextBlock &)
-    {
-        //qDebug() << "BREAKPOINT MARKER UPDATE BLOCK";
-    }
-
-    void removedFromEditor()
-    {
-        if (!m_data)
-            return;
-
-        BreakHandler *handler = m_data->handler();
-        handler->removeBreakpoint(m_data);
-        //handler->saveBreakpoints();
-        handler->updateMarkers();
-    }
-
-    void updateLineNumber(int lineNumber)
-    {
-        if (!m_data)
-            return;
-        //if (m_data->markerLineNumber == lineNumber)
-        //    return;
-        if (m_data->markerLineNumber() != lineNumber) {
-            m_data->setMarkerLineNumber(lineNumber);
-            // FIXME: Should we tell gdb about the change?
-            // Ignore it for now, as we would require re-compilation
-            // and debugger re-start anyway.
-            if (0 && m_data->bpLineNumber) {
-                if (!m_data->bpNumber.trimmed().isEmpty()) {
-                    m_data->pending = true;
-                }
-            }
-        }
-        // Ignore updates to the "real" line number while the debugger is
-        // running, as this can be triggered by moving the breakpoint to
-        // the next line that generated code.
-        // FIXME: Do we need yet another data member?
-        if (m_data->bpNumber.trimmed().isEmpty()) {
-            m_data->lineNumber = lineNumber;
-            m_data->handler()->updateMarkers();
-        }
-    }
-
-private:
-    BreakpointData *m_data;
-    bool m_pending;
-};
-
-
 //////////////////////////////////////////////////////////////////
 //
 // BreakpointData
@@ -159,22 +53,30 @@ private:
 const char *BreakpointData::throwFunction = "throw";
 const char *BreakpointData::catchFunction = "catch";
 
+static quint64 nextBPId() {
+    /* ok to be not thread-safe
+       the order does not matter and only the gui
+       produces authoritative ids. well, for now...
+    */
+    static quint64 i=1;
+    return ++i;
+}
+
 BreakpointData::BreakpointData() :
-    m_handler(0), enabled(true),
+    id(nextBPId()), enabled(true),
     pending(true), type(BreakpointType),
     ignoreCount(0), lineNumber(0), address(0),
     useFullPath(false),
     bpIgnoreCount(0), bpLineNumber(0),
     bpCorrectedLineNumber(0), bpAddress(0),
     bpMultiple(false), bpEnabled(true),
-    m_markerLineNumber(0), marker(0)
+    m_markerLineNumber(0)
 {
 }
 
 BreakpointData *BreakpointData::clone() const
 {
     BreakpointData *data = new BreakpointData();
-    data->m_handler = m_handler;
     data->enabled = enabled;
     data->type = type;
     data->fileName = fileName;
@@ -199,7 +101,6 @@ BreakpointData *BreakpointData::clone() const
 
 BreakpointData::~BreakpointData()
 {
-    removeMarker();
 }
 
 void BreakpointData::clear()
@@ -220,27 +121,6 @@ void BreakpointData::clear()
     bpState.clear();
     m_markerFileName = fileName;
     m_markerLineNumber = lineNumber;
-    updateMarker();
-}
-
-void BreakpointData::removeMarker()
-{
-    BreakpointMarker *m = marker;
-    marker = 0;
-    delete m;
-}
-
-void BreakpointData::updateMarker()
-{
-    if (marker && (m_markerFileName != marker->fileName()
-            || m_markerLineNumber != marker->lineNumber()))
-        removeMarker();
-
-    if (!marker && !m_markerFileName.isEmpty() && m_markerLineNumber > 0)
-        marker = new BreakpointMarker(this, m_markerFileName, m_markerLineNumber);
-
-    if (marker)
-        marker->setPending(pending);
 }
 
 void BreakpointData::setMarkerFileName(const QString &fileName)
@@ -268,44 +148,44 @@ QString BreakpointData::toToolTip() const
     QString rc;
     QTextStream str(&rc);
     str << "<html><body><table>"
-        << "<tr><td>" << BreakHandler::tr("Marker File:")
+        << "<tr><td>" << tr("Marker File:")
         << "</td><td>" << QDir::toNativeSeparators(m_markerFileName) << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Marker Line:")
+        << "<tr><td>" << tr("Marker Line:")
         << "</td><td>" << m_markerLineNumber << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Breakpoint Number:")
+        << "<tr><td>" << tr("Breakpoint Number:")
         << "</td><td>" << bpNumber << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Breakpoint Type:")
+        << "<tr><td>" << tr("Breakpoint Type:")
         << "</td><td>"
-        << (type == BreakpointType ? BreakHandler::tr("Breakpoint")
-            : type == WatchpointType ? BreakHandler::tr("Watchpoint")
-            : BreakHandler::tr("Unknown breakpoint type"))
+        << (type == BreakpointType ? tr("Breakpoint")
+            : type == WatchpointType ? tr("Watchpoint")
+            : tr("Unknown breakpoint type"))
         << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("State:")
+        << "<tr><td>" << tr("State:")
         << "</td><td>" << bpState << "</td></tr>"
         << "</table><br><hr><table>"
-        << "<tr><th>" << BreakHandler::tr("Property")
-        << "</th><th>" << BreakHandler::tr("Requested")
-        << "</th><th>" << BreakHandler::tr("Obtained") << "</th></tr>"
-        << "<tr><td>" << BreakHandler::tr("Internal Number:")
+        << "<tr><th>" << tr("Property")
+        << "</th><th>" << tr("Requested")
+        << "</th><th>" << tr("Obtained") << "</th></tr>"
+        << "<tr><td>" << tr("Internal Number:")
         << "</td><td>&mdash;</td><td>" << bpNumber << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("File Name:")
+        << "<tr><td>" << tr("File Name:")
         << "</td><td>" << QDir::toNativeSeparators(fileName) << "</td><td>" << QDir::toNativeSeparators(bpFileName) << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Function Name:")
+        << "<tr><td>" << tr("Function Name:")
         << "</td><td>" << funcName << "</td><td>" << bpFuncName << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Line Number:") << "</td><td>";
+        << "<tr><td>" << tr("Line Number:") << "</td><td>";
     if (lineNumber)
         str << lineNumber;
     str << "</td><td>";
     if (bpLineNumber)
         str << bpLineNumber;
     str << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Breakpoint Address:")
+        << "<tr><td>" << tr("Breakpoint Address:")
         << "</td><td>";
     formatAddress(str, address);
     str << "</td><td>";
     formatAddress(str, bpAddress);
     str <<  "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Corrected Line Number:")
+        << "<tr><td>" << tr("Corrected Line Number:")
         << "</td><td>-</td><td>";
     if (bpCorrectedLineNumber > 0) {
         str << bpCorrectedLineNumber;
@@ -313,21 +193,31 @@ QString BreakpointData::toToolTip() const
         str << '-';
     }
     str << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Condition:")
+        << "<tr><td>" << tr("Condition:")
         << "</td><td>" << condition << "</td><td>" << bpCondition << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Ignore Count:") << "</td><td>";
+        << "<tr><td>" << tr("Ignore Count:") << "</td><td>";
     if (ignoreCount)
         str << ignoreCount;
     str << "</td><td>";
     if (bpIgnoreCount)
         str << bpIgnoreCount;
     str << "</td></tr>"
-        << "<tr><td>" << BreakHandler::tr("Thread Specification:")
+        << "<tr><td>" << tr("Thread Specification:")
         << "</td><td>" << threadSpec << "</td><td>" << bpThreadSpec << "</td></tr>"
         << "</table></body></html>";
     return rc;
 }
 
+// Compare file names case insensitively on Windows.
+static inline bool fileNameMatch(const QString &f1, const QString &f2)
+{
+#ifdef Q_OS_WIN
+    return f1.compare(f2, Qt::CaseInsensitive) == 0;
+#else
+    return f1 == f2;
+#endif
+}
+
 bool BreakpointData::isLocatedAt(const QString &fileName_, int lineNumber_, 
     bool useMarkerPosition) const
 {
@@ -339,6 +229,9 @@ bool BreakpointData::isSimilarTo(const BreakpointData *needle) const
 {
     //qDebug() << "COMPARING " << toString() << " WITH " << needle->toString();
 
+    if (id == needle->id && id != 0)
+        return true;
+
     // Clear hit.
     if (bpNumber == needle->bpNumber
             && !bpNumber.isEmpty()
@@ -385,13 +278,6 @@ bool BreakpointData::conditionsMatch() const
     return s1 == s2;
 }
 
-void BreakpointData::reinsertBreakpoint()
-{
-    QTC_ASSERT(m_handler, return);
-    m_handler->reinsertBreakpoint(this);
-}
-
 } // namespace Internal
 } // namespace Debugger
 
-#include "breakpoint.moc"
diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h
index 9589fb8dc9693c0b4f60a20c92982a793de03a84..eaf6d543dcb7b92d1c8f736130222f9704933414 100644
--- a/src/plugins/debugger/breakpoint.h
+++ b/src/plugins/debugger/breakpoint.h
@@ -33,6 +33,7 @@
 #include <QtCore/QMetaType>
 #include <QtCore/QList>
 #include <QtCore/QString>
+#include <QtCore/QCoreApplication>
 
 namespace Debugger {
 namespace Internal {
@@ -52,11 +53,7 @@ public:
     BreakpointData();
     ~BreakpointData();
 
-    void removeMarker();
-    void updateMarker();
     QString toToolTip() const;
-    BreakHandler *handler() { return m_handler; }
-    void reinsertBreakpoint();
     void clear(); // Delete all generated data.
 
     bool isLocatedAt(const QString &fileName, int lineNumber,
@@ -77,13 +74,13 @@ private:
     BreakpointData(const BreakpointData &);
     void operator=(const BreakpointData &);
 
-    // Our owner
-    BreakHandler *m_handler; // Not owned.
     friend class BreakHandler;
 
 public:
     enum Type { BreakpointType, WatchpointType };
 
+    quint64 id;
+
     bool enabled;            // Should we talk to the debugger engine?
     bool pending;            // Does the debugger engine know about us already?
     Type type;               // Type of breakpoint.
@@ -124,13 +121,12 @@ public:
     bool isSetByFunction() const { return !funcName.isEmpty(); }
     bool isSetByFileAndLine() const { return !fileName.isEmpty(); }
 
-private:
+    Q_DECLARE_TR_FUNCTIONS(BreakHandler)
+
+    // TODO: move those to breakhandler
     // Taken from either user input or gdb responses.
     QString m_markerFileName; // Used to locate the marker.
     int m_markerLineNumber;
-
-    // Our red blob in the editor.
-    BreakpointMarker *marker;
 };
 
 typedef QList<BreakpointData *> Breakpoints;
diff --git a/src/plugins/debugger/breakpointmarker.cpp b/src/plugins/debugger/breakpointmarker.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f0ffa4d67e41769dd4e2ad00ce9849629132f264
--- /dev/null
+++ b/src/plugins/debugger/breakpointmarker.cpp
@@ -0,0 +1,130 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "breakpointmarker.h"
+#include "breakhandler.h"
+
+#include "stackframe.h"
+
+#include <texteditor/basetextmark.h>
+#include <utils/qtcassert.h>
+
+#include <QtCore/QByteArray>
+#include <QtCore/QDebug>
+#include <QtCore/QTextStream>
+#include <QtCore/QFileInfo>
+#include <QtCore/QDir>
+
+//////////////////////////////////////////////////////////////////
+//
+// BreakpointMarker
+//
+//////////////////////////////////////////////////////////////////
+
+
+namespace Debugger {
+namespace Internal {
+
+BreakpointMarker::BreakpointMarker(BreakHandler *handler, BreakpointData *data, 
+        const QString &fileName, int lineNumber)
+    : BaseTextMark(fileName, lineNumber)
+    , m_handler(handler)
+    , m_data(data)
+    , m_pending(true)
+{
+    //qDebug() << "CREATE MARKER " << fileName << lineNumber;
+}
+
+BreakpointMarker::~BreakpointMarker()
+{
+    //qDebug() << "REMOVE MARKER ";
+    m_data = 0;
+}
+
+QIcon BreakpointMarker::icon() const
+{
+    if (!m_data->enabled)
+        return m_handler->disabledBreakpointIcon();
+    if (!m_handler->isActive())
+        return m_handler->emptyIcon();
+    return m_pending ? m_handler->pendingBreakPointIcon() : m_handler->breakpointIcon();
+}
+
+void BreakpointMarker::setPending(bool pending)
+{
+    if (pending == m_pending)
+        return;
+    m_pending = pending;
+    updateMarker();
+}
+
+void BreakpointMarker::updateBlock(const QTextBlock &)
+{
+    //qDebug() << "BREAKPOINT MARKER UPDATE BLOCK";
+}
+
+void BreakpointMarker::removedFromEditor()
+{
+    if (!m_data)
+        return;
+    m_handler->removeBreakpoint(m_data);
+    //handler->saveBreakpoints();
+    m_handler->updateMarkers();
+}
+
+void BreakpointMarker::updateLineNumber(int lineNumber)
+{
+    if (!m_data)
+        return;
+    //if (m_data->markerLineNumber == lineNumber)
+    //    return;
+    if (m_data->markerLineNumber() != lineNumber) {
+        m_data->setMarkerLineNumber(lineNumber);
+        // FIXME: Should we tell gdb about the change?
+        // Ignore it for now, as we would require re-compilation
+        // and debugger re-start anyway.
+        if (0 && m_data->bpLineNumber) {
+            if (!m_data->bpNumber.trimmed().isEmpty()) {
+                m_data->pending = true;
+            }
+        }
+    }
+    // Ignore updates to the "real" line number while the debugger is
+    // running, as this can be triggered by moving the breakpoint to
+    // the next line that generated code.
+    // FIXME: Do we need yet another data member?
+    if (m_data->bpNumber.trimmed().isEmpty()) {
+        m_data->lineNumber = lineNumber;
+        m_handler->updateMarkers();
+    }
+}
+
+} // namespace Internal
+} // namespace Debugger
+
diff --git a/src/plugins/debugger/breakpointmarker.h b/src/plugins/debugger/breakpointmarker.h
new file mode 100644
index 0000000000000000000000000000000000000000..f643a96d46df5d3d5f7f17e70f8c846b68bc5163
--- /dev/null
+++ b/src/plugins/debugger/breakpointmarker.h
@@ -0,0 +1,65 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef DEBUGGER_BREAKPOINTMARKER_H
+#define DEBUGGER_BREAKPOINTMARKER_H
+
+#include <QtCore/QString>
+#include <QtGui/QIcon>
+
+#include "breakpoint.h"
+#include "breakhandler.h"
+#include <texteditor/basetextmark.h>
+
+namespace Debugger {
+namespace Internal {
+
+// The red blob on the left side in the cpp editor.
+class BreakpointMarker : public TextEditor::BaseTextMark
+{
+    Q_OBJECT
+public:
+    BreakpointMarker(BreakHandler *handler, BreakpointData *data,
+            const QString &fileName, int lineNumber);
+    ~BreakpointMarker();
+    QIcon icon() const;
+    void setPending(bool pending);
+    void updateBlock(const QTextBlock &);
+    void removedFromEditor();
+    void updateLineNumber(int lineNumber);
+private:
+    BreakHandler *m_handler;
+    BreakpointData *m_data;
+    bool m_pending;
+    friend class BreakHandler;
+};
+
+} // namespace Internal
+} // namespace Debugger
+#endif
diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index 4c26e0c3c6f6cc8c0e277ef6d2dfa2950d7cc39b..d54bd821025108abde04af69c481add9df6ad1fe 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -28,6 +28,7 @@
 **************************************************************************/
 
 #include "breakwindow.h"
+#include "breakhandler.h"
 
 #include "debuggeractions.h"
 #include "debuggerconstants.h"
@@ -426,8 +427,12 @@ void BreakWindow::editBreakpoints(const QModelIndexList &list)
         const QVariant dataV = model()->data(list.at(0), BreakpointRole);
         QTC_ASSERT(qVariantCanConvert<BreakpointData *>(dataV), return );
         BreakpointData *data = qvariant_cast<BreakpointData *>(dataV);
-        if (editBreakpoint(data, this))
-            data->reinsertBreakpoint();
+        if (editBreakpoint(data, this)) {
+            // FIXME: nasty MVC violation
+            BreakHandler * handler = qobject_cast<BreakHandler *>(model());
+            if (handler)
+                handler->reinsertBreakpoint(data);
+        }
         return;
     }
 
diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro
index 50b9de2f7a98948396e9a8965c58d16e501e5fdc..0dcfe624d59279b58ef067826e82e9b47645a58d 100644
--- a/src/plugins/debugger/debugger.pro
+++ b/src/plugins/debugger/debugger.pro
@@ -18,6 +18,7 @@ QT += gui \
 
 HEADERS += breakhandler.h \
     breakpoint.h \
+    breakpointmarker.h \
     breakwindow.h \
     consolewindow.h \
     debugger_global.h \
@@ -58,6 +59,7 @@ HEADERS += breakhandler.h \
 
 SOURCES += breakhandler.cpp \
     breakpoint.cpp \
+    breakpointmarker.cpp \
     breakwindow.cpp \
     consolewindow.cpp \
     debuggeractions.cpp \
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index c554130e539d7e41f29cd10e64cf65c8096981b0..4731ce119bb88df29c0ea667419acb5643ab6c58 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -340,8 +340,7 @@ void DebuggerEnginePrivate::slotEditBreakpoint()
     const QVariant data = act->data();
     QTC_ASSERT(qVariantCanConvert<BreakpointData *>(data), return);
     BreakpointData *breakPointData = qvariant_cast<BreakpointData *>(data);
-    if (BreakWindow::editBreakpoint(breakPointData, ICore::instance()->mainWindow()))
-        breakPointData->reinsertBreakpoint();
+    BreakWindow::editBreakpoint(breakPointData, ICore::instance()->mainWindow());
 }
 
 void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered()
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index c190419fb8d02347506b1d8da5d976df7f527ebd..cae06f00c89edf4812117fb42ee338ac3c24c40c 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -705,7 +705,7 @@ void QmlEngine::messageReceived(const QByteArray &message)
                     data->pending = false;
                     data->bpFileName = file;
                     data->bpLineNumber = line;
-                    data->updateMarker();
+                    handler->updateMarker(data);
                 }
             }
         }
diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp
index 09ac194e3d0e9c1a885260500c859cb64fda0e09..b6f3ff35547501e972bc10c5fe499fbdea000310 100644
--- a/src/plugins/debugger/script/scriptengine.cpp
+++ b/src/plugins/debugger/script/scriptengine.cpp
@@ -655,7 +655,7 @@ bool ScriptEngine::checkForBreakCondition(bool byFunction)
         data->setMarkerLineNumber(lineNumber);
         data->setMarkerFileName(fileName);
         data->pending = false;
-        data->updateMarker();
+        breakHandler()->updateMarker(data);
     }
     notifyInferiorSpontaneousStop();
     SDEBUG("Stopped at " << lineNumber << fileName);