diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 969b011a9c5187559f9eb6d678529d55a1f51ec1..baaef60d340cb8e00f03fc8f9aa19f1b857305f1 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -802,6 +802,7 @@ bool Breakpoint::isOneShot() const { return parameters().oneShot; }
 
 void Breakpoint::removeAlienBreakpoint()
 {
+    b->m_state = BreakpointRemoveProceeding;
     b->deleteThis();
 }
 
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 16a2300247cb0945472251d00d2d2f28ee9e6ae3..99135a09a7180da87b273257d9ab6d0bd7c33032 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -598,8 +598,9 @@ void GdbEngine::handleResponse(const QByteArray &buff)
                     // This also triggers when a temporary breakpoint is hit.
                     // We do not really want that, as this loses all information.
                     // FIXME: Use a special marker for this case?
-                    if (!bp.isOneShot())
-                        bp.removeAlienBreakpoint();
+                    // if (!bp.isOneShot()) ... is not sufficient.
+                    // It keeps temporary "Jump" breakpoints alive.
+                    bp.removeAlienBreakpoint();
                 }
             } else if (asyncClass == "cmd-param-changed") {
                 // New since 2012-08-09