diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index 99826798c01ad7f1c809acd057bd0bccb62fa00c..f26b23ac8be18dd710bffee8e751e91672436931 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -31,6 +31,7 @@
 
 #include "debuggeractions.h"
 #include "debuggermanager.h"
+#include "stackhandler.h"
 #include "ui_breakcondition.h"
 #include "ui_breakbyfunction.h"
 
@@ -196,6 +197,13 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
         new QAction(tr("Edit Breakpoint..."), &menu);
     editBreakpointAction->setEnabled(si.size() > 0);
 
+    int threadId = m_manager->threadsHandler()->currentThreadId();
+    QString associateTitle = threadId == -1
+        ?  tr("Associate Breakpoint With All Threads")
+        :  tr("Associate Breakpoint With Thread %1").arg(threadId);
+    QAction *associateBreakpointAction = new QAction(associateTitle, &menu);
+    associateBreakpointAction->setEnabled(si.size() > 0);
+
     QAction *synchronizeAction =
         new QAction(tr("Synchronize Breakpoints"), &menu);
     synchronizeAction->setEnabled(
@@ -231,6 +239,7 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
 
     menu.addAction(deleteAction);
     menu.addAction(editBreakpointAction);
+    menu.addAction(associateBreakpointAction);
     menu.addAction(toggleEnabledAction);
     menu.addAction(pathAction);
     menu.addSeparator();
@@ -270,6 +279,8 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
         setAlwaysResizeColumnsToContents(!m_alwaysResizeColumnsToContents);
     else if (act == editBreakpointAction)
         editBreakpoint(si);
+    else if (act == associateBreakpointAction)
+        associateBreakpoint(si, threadId);
     else if (act == synchronizeAction)
         emit breakpointSynchronizationRequested();
     else if (act == toggleEnabledAction)
@@ -371,6 +382,16 @@ void BreakWindow::editBreakpoint(const QModelIndexList &list)
     emit breakpointSynchronizationRequested();
 }
 
+void BreakWindow::associateBreakpoint(const QModelIndexList &list, int threadId)
+{
+    QString str;
+    if (threadId != -1)
+        str = QString::number(threadId);
+    foreach (const QModelIndex &idx, list)
+        model()->setData(idx.sibling(idx.row(), 6), str);
+    emit breakpointSynchronizationRequested();
+}
+
 void BreakWindow::resizeColumnsToContents()
 {
     for (int i = model()->columnCount(); --i >= 0; )
diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h
index be25319d2bbe8d66e617ef08b6cba43772566865..b3828cae455d56e6045d56b826068aada9dbe03d 100644
--- a/src/plugins/debugger/breakwindow.h
+++ b/src/plugins/debugger/breakwindow.h
@@ -72,6 +72,7 @@ private:
     void deleteBreakpoints(const QModelIndexList &list);
     void deleteBreakpoints(QList<int> rows);
     void editBreakpoint(const QModelIndexList &list);
+    void associateBreakpoint(const QModelIndexList &list, int thread);
     void setBreakpointsEnabled(const QModelIndexList &list, bool enabled);
     void setBreakpointsFullPath(const QModelIndexList &list, bool fullpath);
 
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 67480dd9214fa37df411656e1af1080a48d5a954..e3793ed5e1c8591711fc514580b8a68a2a738fd4 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -287,7 +287,7 @@ public slots: // FIXME
     void operateByInstructionTriggered();
     void startFailed();
 
-private:
+public:
     Internal::ModulesHandler *modulesHandler() const;
     Internal::BreakHandler *breakHandler() const;
     Internal::RegisterHandler *registerHandler() const;
@@ -295,6 +295,8 @@ private:
     Internal::ThreadsHandler *threadsHandler() const;
     Internal::WatchHandler *watchHandler() const;
     Internal::SnapshotHandler *snapshotHandler() const;
+
+private:
     Internal::SourceFilesWindow *sourceFileWindow() const;
     QWidget *threadsWindow() const;
 
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 16199e52ebb4e5feff47b61c82ff1b01860f5a75..17ac63a1705524b35e2d356d0531df65aae3925b 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2544,15 +2544,13 @@ void GdbEngine::attemptBreakpointSynchronization()
                 data->bpEnabled = false;
                 continue;
             }
-            if (data->threadSpec != data->bpThreadSpec && !data->bpThreadSpec.isEmpty()) {
+            if (data->threadSpec != data->bpThreadSpec && !data->bpNumber.isEmpty()) {
                 // The only way to change this seems to be to re-set the bp completely.
                 //qDebug() << "FIXME: THREAD: " << data->threadSpec << data->bpThreadSpec;
-                //data->bpThreadSpec = data->threadSpec;
-                if (!data->bpNumber.isEmpty()) {
-                    postCommand("-break-delete " + data->bpNumber,
-                        NeedsStop | RebuildBreakpointModel);
-                    sendInsertBreakpoint(index);
-                }
+                data->bpThreadSpec.clear();
+                postCommand("-break-delete " + data->bpNumber,
+                    NeedsStop | RebuildBreakpointModel);
+                sendInsertBreakpoint(index);
                 continue;
             }
             if (data->bpAddress.startsWith("0x")
diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp
index 5913d0c30d39179ab344645bd54672f234a9eba9..432cef2878ea59cf44e37f4132ffc327235bbd9f 100644
--- a/src/plugins/debugger/stackhandler.cpp
+++ b/src/plugins/debugger/stackhandler.cpp
@@ -361,6 +361,13 @@ QVariant ThreadsHandler::headerData(int section, Qt::Orientation orientation, in
     return QVariant();
 }
 
+int ThreadsHandler::currentThreadId() const
+{
+    if (m_currentIndex < 0 || m_currentIndex >= m_threads.size())
+        return -1;
+    return m_threads[m_currentIndex].id;
+}
+
 void ThreadsHandler::setCurrentThread(int index)
 {
     if (index == m_currentIndex)
diff --git a/src/plugins/debugger/stackhandler.h b/src/plugins/debugger/stackhandler.h
index 6c6cd6b740492b580899e485264c6a35710e4d0c..64c0eff0957fbd4100073135e152cb65a150051f 100644
--- a/src/plugins/debugger/stackhandler.h
+++ b/src/plugins/debugger/stackhandler.h
@@ -119,6 +119,7 @@ class ThreadsHandler : public QAbstractTableModel
 public:
     ThreadsHandler(QObject *parent = 0);
 
+    int currentThreadId() const;
     void setCurrentThread(int index);
     void selectThread(int index);
     void setThreads(const QList<ThreadData> &threads);