diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 2c1327d02fd056096ca4c1b9ec2a9716667d1180..f66e8031f183aca6b7186141ec08ad72a64a8e4e 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -37,6 +37,7 @@
 #include "debuggerstringutils.h"
 #include "stackframe.h"
 
+#include <extensionsystem/invoker.h>
 #include <utils/hostosinfo.h>
 #include <utils/qtcassert.h>
 
@@ -1258,6 +1259,25 @@ void BreakHandler::updateLineNumberFromMarker(BreakpointModelId id, int lineNumb
     emit layoutChanged();
 }
 
+void BreakHandler::changeLineNumberFromMarker(BreakpointModelId id, int lineNumber)
+{
+    // We need to delay this as it is called from a marker which will be destroyed.
+    ExtensionSystem::InvokerBase invoker;
+    invoker.addArgument(id);
+    invoker.addArgument(lineNumber);
+    invoker.setConnectionType(Qt::QueuedConnection);
+    invoker.invoke(this, "changeLineNumberFromMarkerHelper");
+    QTC_CHECK(invoker.wasSuccessful());
+}
+
+void BreakHandler::changeLineNumberFromMarkerHelper(BreakpointModelId id, int lineNumber)
+{
+    BreakpointParameters data = breakpointData(id);
+    data.lineNumber = lineNumber;
+    removeBreakpoint(id);
+    appendBreakpoint(data);
+}
+
 BreakpointModelIds BreakHandler::allBreakpointIds() const
 {
     BreakpointModelIds ids;
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 750d2faff3c36e1b3b668989e69c9caa15b2ca35..7e6eb46a9bd4bb9f8f968bf4864471821b43ae5d 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -133,6 +133,7 @@ public:
     void setEnabled(BreakpointModelId id, bool on);
     void updateFileNameFromMarker(BreakpointModelId id, const QString &fileName);
     void updateLineNumberFromMarker(BreakpointModelId id, int lineNumber);
+    void changeLineNumberFromMarker(BreakpointModelId id, int lineNumber);
     void setMarkerFileAndLine(BreakpointModelId id,
         const QString &fileName, int lineNumber);
     bool isOneShot(BreakpointModelId id) const;
@@ -189,6 +190,7 @@ private:
     void loadBreakpoints();
     void saveBreakpoints();
     void cleanupBreakpoint(BreakpointModelId id);
+    Q_SLOT void changeLineNumberFromMarkerHelper(Debugger::Internal::BreakpointModelId id, int lineNumber);
 
     struct BreakpointItem
     {
diff --git a/src/plugins/debugger/breakpointmarker.cpp b/src/plugins/debugger/breakpointmarker.cpp
index 412bc5ade1f1461d11a97728e3ecd2b1a295723d..0821ec1063fdfabbd07dfc6eec89b45eec2ce69c 100644
--- a/src/plugins/debugger/breakpointmarker.cpp
+++ b/src/plugins/debugger/breakpointmarker.cpp
@@ -68,6 +68,11 @@ void BreakpointMarker::updateLineNumber(int lineNumber)
     breakHandler()->updateLineNumberFromMarker(m_id, lineNumber);
 }
 
+void BreakpointMarker::dragToLine(int lineNumber)
+{
+    breakHandler()->changeLineNumberFromMarker(m_id, lineNumber);
+}
+
 void BreakpointMarker::updateFileName(const QString &fileName)
 {
     BaseTextMark::updateFileName(fileName);
diff --git a/src/plugins/debugger/breakpointmarker.h b/src/plugins/debugger/breakpointmarker.h
index 9f6f083828c6d8726deaeaf9df4f2a87ddb72261..0a972d43756f2d4ac9356653b325a74312029226 100644
--- a/src/plugins/debugger/breakpointmarker.h
+++ b/src/plugins/debugger/breakpointmarker.h
@@ -46,6 +46,8 @@ public:
     void removedFromEditor();
     void updateLineNumber(int lineNumber);
     void updateFileName(const QString &fileName);
+    bool isDraggable() const { return true; }
+    void dragToLine(int lineNumber);
 
 private:
     BreakpointModelId m_id;