diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.cpp b/src/plugins/debugger/gdb/abstractgdbadapter.cpp
index cd99fec311e288c0f44e43d97fc85f552562e135..dca2e9ad5bece78bf8d02aab450a1dde4d343cd7 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.cpp
@@ -51,6 +51,10 @@ void AbstractGdbAdapter::shutdown()
 {
 }
 
+void AbstractGdbAdapter::startInferiorPhase2()
+{
+}
+
 const char *AbstractGdbAdapter::inferiorShutdownCommand() const
 {
     return "kill";
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index 9dc018e0380385b4dc17871683edc1d434bd2783..7fed63fc8c3af25d1f1ab67fd24a90d3a9f34d63 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -56,6 +56,7 @@ public:
 
     virtual void startAdapter() = 0;
     virtual void startInferior() = 0;
+    virtual void startInferiorPhase2();
     virtual void interruptInferior() = 0;
     virtual void shutdown();
     virtual const char *inferiorShutdownCommand() const;
@@ -80,6 +81,10 @@ signals:
     // Make sure to clean up everything before emitting this signal.
     void adapterCrashed(const QString &msg);
 
+    // This triggers the initial breakpoint synchronization and causes
+    // startInferiorPhase2() being called once done.
+    void inferiorPrepared();
+
     // The adapter is still running just fine, but it failed to acquire a debuggee.
     void inferiorStartFailed(const QString &msg);
     
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp
index f89421e5929ed2c010b42ada40b2d71553516398..ae83ed6a49076b347a61fe195cb33e305f693a6a 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp
@@ -82,6 +82,7 @@ void AttachGdbAdapter::handleAttach(const GdbResponse &response)
         QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
         debugMessage(_("INFERIOR ATTACHED"));
         showStatusMessage(msgAttachedToStoppedInferior());
+        emit inferiorPrepared();
         m_engine->updateAll();
     } else {
         QString msg = __(response.data.findChild("msg").data());
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 93916267abbe98aca8947854a3e01f3cf99a9d98..87024f56ea7be4dd896828685e05680645096f46 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -234,6 +234,9 @@ void GdbEngine::connectAdapter()
     connect(m_gdbAdapter, SIGNAL(adapterStartFailed(QString,QString)),
         this, SLOT(handleAdapterStartFailed(QString,QString)));
 
+    connect(m_gdbAdapter, SIGNAL(inferiorPrepared()),
+        this, SLOT(handleInferiorPrepared()));
+
     connect(m_gdbAdapter, SIGNAL(inferiorStartFailed(QString)),
         this, SLOT(handleInferiorStartFailed(QString)));
 
@@ -692,7 +695,8 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd)
     }
 
     if (cmd.flags & NeedsStop) {
-        if (state() == InferiorStopped || state() == AdapterStarted) {
+        if (state() == InferiorStopped
+            || state() == InferiorStarting || state() == AdapterStarted) {
             // Can be safely sent now.
             flushCommand(cmd);
         } else {
@@ -4318,24 +4322,29 @@ void GdbEngine::handleAdapterStarted()
     setState(AdapterStarted);
     debugMessage(_("ADAPTER SUCCESSFULLY STARTED"));
 
+    showStatusMessage(tr("Starting inferior..."));
+    setState(InferiorStarting);
+    m_gdbAdapter->startInferior();
+}
+
+void GdbEngine::handleInferiorPrepared()
+{
     // Initial attempt to set breakpoints
     showStatusMessage(tr("Setting breakpoints..."));
     attemptBreakpointSynchronization();
 
     if (m_cookieForToken.isEmpty()) {
-        startInferior();
+        startInferiorPhase2();
     } else {
         QTC_ASSERT(m_commandsDoneCallback == 0, /**/);
-        m_commandsDoneCallback = &GdbEngine::startInferior;
+        m_commandsDoneCallback = &GdbEngine::startInferiorPhase2;
     }
 }
 
-void GdbEngine::startInferior()
+void GdbEngine::startInferiorPhase2()
 {
-    QTC_ASSERT(state() == AdapterStarted, qDebug() << state());
-    showStatusMessage(tr("Starting inferior..."));
-    setState(InferiorStarting);
-    m_gdbAdapter->startInferior();
+    debugMessage(_("BREAKPOINTS SET, CONTINUING INFERIOR STARTUP"));
+    m_gdbAdapter->startInferiorPhase2();
 }
 
 void GdbEngine::handleInferiorStartFailed(const QString &msg)
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 91c230dacc9db2b5baa4a7a5c2198f1f10f61fd9..94e91e4669a8451d61f63c961beb4fb02cf98477 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -126,7 +126,7 @@ private: ////////// Gdb Process Management //////////
     AbstractGdbAdapter *createAdapter(const DebuggerStartParametersPtr &dp);
     void connectAdapter();
     bool startGdb(const QStringList &args = QStringList(), const QString &gdb = QString());
-    void startInferior();
+    void startInferiorPhase2();
 
     void handleInferiorShutdown(const GdbResponse &response);
     void handleGdbExit(const GdbResponse &response);
@@ -146,6 +146,8 @@ private slots:
     void handleAdapterStarted();
     void handleAdapterStartFailed(const QString &msg, const QString &settingsIdHint = QString());
 
+    void handleInferiorPrepared();
+
     void handleInferiorStartFailed(const QString &msg);
 
     void handleAdapterCrashed(const QString &msg);
diff --git a/src/plugins/debugger/gdb/plaingdbadapter.cpp b/src/plugins/debugger/gdb/plaingdbadapter.cpp
index 2a16c27628f5a76ae0f2285182645ebb8a57ba3c..8df6d740165dd922cbe63c8c8c48a904a6dc6ff8 100644
--- a/src/plugins/debugger/gdb/plaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/plaingdbadapter.cpp
@@ -106,9 +106,7 @@ void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
 {
     QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
     if (response.resultClass == GdbResultDone) {
-        //m_breakHandler->clearBreakMarkers();
-        setState(InferiorRunningRequested);
-        m_engine->postCommand(_("-exec-run"), GdbEngine::RunRequest, CB(handleExecRun));
+        emit inferiorPrepared();
     } else {
         QString msg = tr("Starting executable failed:\n") +
             __(response.data.findChild("msg").data());
@@ -116,6 +114,12 @@ void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
     }
 }
 
+void PlainGdbAdapter::startInferiorPhase2()
+{
+    setState(InferiorRunningRequested);
+    m_engine->postCommand(_("-exec-run"), GdbEngine::RunRequest, CB(handleExecRun));
+}
+
 void PlainGdbAdapter::handleExecRun(const GdbResponse &response)
 {
     if (response.resultClass == GdbResultRunning) {
diff --git a/src/plugins/debugger/gdb/plaingdbadapter.h b/src/plugins/debugger/gdb/plaingdbadapter.h
index fb445d3b329a3a045261c386b741cb1e53cab2dd..0998ad2b82fe53175868aabfe48d94f3713551e9 100644
--- a/src/plugins/debugger/gdb/plaingdbadapter.h
+++ b/src/plugins/debugger/gdb/plaingdbadapter.h
@@ -57,6 +57,7 @@ public:
 
     void startAdapter();
     void startInferior();
+    void startInferiorPhase2();
     void interruptInferior();
     void shutdown();
     const char *inferiorShutdownCommand() const { return "kill"; }
diff --git a/src/plugins/debugger/gdb/remotegdbadapter.cpp b/src/plugins/debugger/gdb/remotegdbadapter.cpp
index 504e0a5620881917ebc3c7daa56f575b16811445..ab06baab43343fa96960c3790500c959df480937 100644
--- a/src/plugins/debugger/gdb/remotegdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbadapter.cpp
@@ -199,7 +199,7 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
         // gdb server will stop the remote application itself.
         debugMessage(_("INFERIOR STARTED"));
         showStatusMessage(msgAttachedToStoppedInferior());
-        m_engine->continueInferior();
+        emit inferiorPrepared();
     } else {
         // 16^error,msg="hd:5555: Connection timed out."
         QString msg = msgConnectRemoteServerFailed(__(record.data.findChild("msg").data()));
@@ -207,6 +207,11 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
     }
 }
 
+void RemoteGdbAdapter::startInferiorPhase2()
+{
+    m_engine->continueInferior();
+}
+
 void RemoteGdbAdapter::interruptInferior()
 {
     m_engine->postCommand(_("-exec-interrupt"));
diff --git a/src/plugins/debugger/gdb/remotegdbadapter.h b/src/plugins/debugger/gdb/remotegdbadapter.h
index a7f4bc645a4511ccdebd80bc964ab52af87f65bc..edc65ece950d085b69cdf75458c59b8f84d93e9e 100644
--- a/src/plugins/debugger/gdb/remotegdbadapter.h
+++ b/src/plugins/debugger/gdb/remotegdbadapter.h
@@ -56,6 +56,7 @@ public:
 
     void startAdapter();
     void startInferior();
+    void startInferiorPhase2();
     void interruptInferior();
     void shutdown();
 
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index e1405d86f4267485affc84eb887a5c17c2b62d67..d41ff2327338bcf5ebcec17d648f8b85f93b5f36 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -1639,8 +1639,7 @@ void TrkGdbAdapter::handleTargetRemote(const GdbResponse &record)
 {
     QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
     if (record.resultClass == GdbResultDone) {
-        setState(InferiorRunningRequested);
-        m_engine->postCommand(_("-exec-continue"), GdbEngine::RunRequest, CB(handleFirstContinue));
+        emit inferiorPrepared();
     } else {
         QString msg = tr("Connecting to trk server adapter failed:\n")
             + _(record.data.findChild("msg").data());
@@ -1648,6 +1647,12 @@ void TrkGdbAdapter::handleTargetRemote(const GdbResponse &record)
     }
 }
 
+void TrkGdbAdapter::startInferiorPhase2()
+{
+    setState(InferiorRunningRequested);
+    m_engine->postCommand(_("-exec-continue"), GdbEngine::RunRequest, CB(handleFirstContinue));
+}
+
 void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record)
 {
     QTC_ASSERT(state() == InferiorRunning, qDebug() << state());
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 72a996ef01ffde07ef84c7d9c7355dae24a0213c..42d8911401f3a9c4d2874c44704d4b8ed432056d 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -170,6 +170,7 @@ public:
 private:
     void startAdapter();
     void startInferior();
+    void startInferiorPhase2();
     void interruptInferior();
     void shutdown();