diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index e564a745121406663dd81ea386ef6852ebb4b1c0..4c26e0c3c6f6cc8c0e277ef6d2dfa2950d7cc39b 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -104,14 +104,29 @@ bool BreakpointDialog::showDialog(BreakpointData *data)
     if (exec() != QDialog::Accepted)
         return false;
 
-    data->lineNumber = lineEditLineNumber->text().toInt();
-    data->useFullPath = checkBoxUseFullPath->isChecked();
-    data->address = lineEditAddress->text().toULongLong(0, 0);
-    data->funcName = lineEditFunction->text();
-    data->fileName = pathChooserFileName->path();
-    data->condition = lineEditCondition->text().toUtf8();
-    data->ignoreCount = lineEditIgnoreCount->text().toInt();
-    data->threadSpec = lineEditThreadSpec->text().toUtf8();
+    // Check if changed.
+    const int newLineNumber = lineEditLineNumber->text().toInt();
+    const bool newUseFullPath  = checkBoxUseFullPath->isChecked();
+    const quint64 newAddress = lineEditAddress->text().toULongLong(0, 0);
+    const QString newFunc = lineEditFunction->text();
+    const QString newFileName = pathChooserFileName->path();
+    const QByteArray newCondition = lineEditCondition->text().toUtf8();
+    const int newIgnoreCount = lineEditIgnoreCount->text().toInt();
+    const QByteArray newThreadSpec = lineEditThreadSpec->text().toUtf8();
+    if (newLineNumber == data->lineNumber && newUseFullPath == data->useFullPath
+        && newAddress == data->address && newFunc == data->funcName
+        && newFileName == data->fileName && newCondition == data->condition
+        && newIgnoreCount == data->ignoreCount && newThreadSpec == data->threadSpec)
+        return false; // Unchanged -> Cancel.
+
+    data->address = newAddress;
+    data->funcName = newFunc;
+    data->useFullPath = newUseFullPath;
+    data->fileName = newFileName;
+    data->lineNumber = newLineNumber;
+    data->condition = newCondition;
+    data->ignoreCount = newIgnoreCount;
+    data->threadSpec = newThreadSpec;
     return true;
 }
 
@@ -389,16 +404,16 @@ void BreakWindow::deleteBreakpoints(QList<int> list)
     setModelData(RequestSynchronizeBreakpointsRole);
 }
 
-bool BreakWindow::editBreakpoint(BreakpointData *data)
+bool BreakWindow::editBreakpoint(BreakpointData *data, QWidget *parent)
 {
-    BreakpointDialog dialog(this);
+    BreakpointDialog dialog(parent);
     return dialog.showDialog(data);
 }
 
 void BreakWindow::addBreakpoint()
 {
     BreakpointData *data = new BreakpointData();
-    if (editBreakpoint(data))
+    if (editBreakpoint(data, this))
         setModelData(RequestBreakpointRole, QVariant::fromValue(data));
     else
         delete data;
@@ -406,11 +421,12 @@ void BreakWindow::addBreakpoint()
 
 void BreakWindow::editBreakpoints(const QModelIndexList &list)
 {
+    QTC_ASSERT(!list.isEmpty(), return);
     if (list.size() == 1) {
         const QVariant dataV = model()->data(list.at(0), BreakpointRole);
         QTC_ASSERT(qVariantCanConvert<BreakpointData *>(dataV), return );
         BreakpointData *data = qvariant_cast<BreakpointData *>(dataV);
-        if (editBreakpoint(data))
+        if (editBreakpoint(data, this))
             data->reinsertBreakpoint();
         return;
     }
@@ -419,30 +435,36 @@ void BreakWindow::editBreakpoints(const QModelIndexList &list)
     QDialog dlg(this);
     Ui::BreakCondition ui;
     ui.setupUi(&dlg);
-
-    QTC_ASSERT(!list.isEmpty(), return);
-    QModelIndex idx = list.front();
     dlg.setWindowTitle(tr("Edit Breakpoint Properties"));
+    ui.lineEditIgnoreCount->setValidator(new QIntValidator(0, 2147483647, ui.lineEditIgnoreCount));
+
+    const QModelIndex idx = list.front();
     QAbstractItemModel *m = model();
-    ui.lineEditCondition->setText(
-        m->data(idx, BreakpointConditionRole).toString());
-    ui.lineEditIgnoreCount->setValidator(
-        new QIntValidator(0, 2147483647, ui.lineEditIgnoreCount));
-    ui.lineEditIgnoreCount->setText(
-        m->data(idx, BreakpointIgnoreCountRole).toString());
-    ui.lineEditThreadSpec->setText(
-        m->data(idx, BreakpointThreadSpecRole).toString());
+
+    const QString oldCondition = m->data(idx, BreakpointConditionRole).toString();
+    const QString oldIgnoreCount = m->data(idx, BreakpointIgnoreCountRole).toString();
+    const QString oldThreadSpec = m->data(idx, BreakpointThreadSpecRole).toString();
+
+    ui.lineEditCondition->setText(oldCondition);
+    ui.lineEditIgnoreCount->setText(oldIgnoreCount);
+    ui.lineEditThreadSpec->setText(oldThreadSpec);
 
     if (dlg.exec() == QDialog::Rejected)
         return;
 
+    const QString newCondition = ui.lineEditCondition->text();
+    const QString newIgnoreCount = ui.lineEditIgnoreCount->text();
+    const QString newThreadSpec = ui.lineEditThreadSpec->text();
+
+    // Unchanged -> cancel
+    if (newCondition == oldCondition && newIgnoreCount == oldIgnoreCount
+            && newThreadSpec == oldThreadSpec)
+        return;
+
     foreach (const QModelIndex &idx, list) {
-        //m->setData(idx.sibling(idx.row(), 1), ui.lineEditFunction->text());
-        //m->setData(idx.sibling(idx.row(), 2), ui.pathChooserFileName->text());
-        //m->setData(idx.sibling(idx.row(), 3), ui.lineEditLineNumber->text());
-        m->setData(idx, ui.lineEditCondition->text(), BreakpointConditionRole);
-        m->setData(idx, ui.lineEditIgnoreCount->text(), BreakpointIgnoreCountRole);
-        m->setData(idx, ui.lineEditThreadSpec->text(), BreakpointThreadSpecRole);
+        m->setData(idx, newCondition, BreakpointConditionRole);
+        m->setData(idx, newIgnoreCount, BreakpointIgnoreCountRole);
+        m->setData(idx, newThreadSpec, BreakpointThreadSpecRole);
     }
     setModelData(RequestSynchronizeBreakpointsRole);
 }
diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h
index 5b6b1cb969b2d72e8a48ff921c0093a3be42a06b..84fbd28fc12edfd2070625004dfdd16713ba1104 100644
--- a/src/plugins/debugger/breakwindow.h
+++ b/src/plugins/debugger/breakwindow.h
@@ -45,6 +45,8 @@ public:
     explicit BreakWindow(QWidget *parent = 0);
     ~BreakWindow();
 
+    static bool editBreakpoint(BreakpointData *data, QWidget *parent = 0);
+
 private slots:
     void resizeColumnsToContents();
     void setAlwaysResizeColumnsToContents(bool on);
@@ -62,7 +64,6 @@ private:
     void deleteBreakpoints(const QModelIndexList &list);
     void deleteBreakpoints(QList<int> rows);
     void addBreakpoint();
-    bool editBreakpoint(BreakpointData *data); // Returns 'Accept'.
     void editBreakpoints(const QModelIndexList &list);
     void associateBreakpoint(const QModelIndexList &list, int thread);
     void setBreakpointsEnabled(const QModelIndexList &list, bool enabled);
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 3ebf618d6f4d70231940e39a620ff18350f00095..49227cbb29f5dc0ec3f89c3ab68f785db1d60bd9 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -46,6 +46,7 @@
 #include "threadshandler.h"
 #include "watchhandler.h"
 #include "watchutils.h"
+#include "breakwindow.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/editormanager/editormanager.h>
@@ -84,7 +85,7 @@
 #include <QtGui/QTextCursor>
 #include <QtGui/QTextDocument>
 #include <QtGui/QTreeWidget>
-
+#include <QtGui/QMainWindow>
 
 using namespace Core;
 using namespace Debugger;
@@ -286,6 +287,8 @@ public slots:
         m_runControl->bringApplicationToForeground(m_inferiorPid);
     }
 
+private slots:
+    void slotEditBreakpoint();
 
 public:
     DebuggerState state() const { return m_state; }
@@ -333,6 +336,17 @@ void DebuggerEnginePrivate::breakpointSetRemoveMarginActionTriggered()
     m_breakHandler.toggleBreakpoint(fileName, lineNumber, address);
 }
 
+void DebuggerEnginePrivate::slotEditBreakpoint()
+{
+    const QAction *act = qobject_cast<QAction *>(sender());
+    QTC_ASSERT(act, return);
+    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();
+}
+
 void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered()
 {
     QAction *act = qobject_cast<QAction *>(sender());
@@ -392,6 +406,10 @@ void DebuggerEnginePrivate::handleContextMenuRequest(const QVariant &parameters)
         connect(act2, SIGNAL(triggered()),
             this, SLOT(breakpointEnableDisableMarginActionTriggered()));
         menu->addAction(act2);
+        QAction *editAction = new QAction(tr("Edit Breakpoint %1...").arg(number), menu);
+        connect(editAction, SIGNAL(triggered()), this, SLOT(slotEditBreakpoint()));
+        editAction->setData(qVariantFromValue(data));
+        menu->addAction(editAction);
     } else {
         // non-existing
         const QString text = address ?