diff --git a/src/plugins/debugger/debuggeritem.cpp b/src/plugins/debugger/debuggeritem.cpp
index 9ac30bbb7d4a060e4de5ba3c5fa10651ebf6d7c0..33396b84bef7c6c087c9e6f1e17ed8a38d7e0046 100644
--- a/src/plugins/debugger/debuggeritem.cpp
+++ b/src/plugins/debugger/debuggeritem.cpp
@@ -140,6 +140,14 @@ QStringList DebuggerItem::abiNames() const
     return list;
 }
 
+bool DebuggerItem::operator==(const DebuggerItem &other) const
+{
+    return m_id == other.m_id
+            && m_isAutoDetected == other.m_isAutoDetected
+            && m_command == other.m_command
+            && m_abis == other.m_abis;
+}
+
 QVariantMap DebuggerItem::toMap() const
 {
     QVariantMap data;
diff --git a/src/plugins/debugger/debuggeritem.h b/src/plugins/debugger/debuggeritem.h
index 9809da22c7b01214f3e795dafda545c92d89e8fc..c2ef2a6fec70df1dc0e651fd2ebf5153d343c22b 100644
--- a/src/plugins/debugger/debuggeritem.h
+++ b/src/plugins/debugger/debuggeritem.h
@@ -82,6 +82,8 @@ public:
 
     QStringList abiNames() const;
 
+    bool operator==(const DebuggerItem &other) const;
+
 private:
     QVariant m_id;
     QString m_displayName;
diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp
index e9df26be1ef11be23af4de0ae35df0508565294a..55ea0762447cfd04b8057b1ea174316bcfb2b6e9 100644
--- a/src/plugins/debugger/debuggeritemmanager.cpp
+++ b/src/plugins/debugger/debuggeritemmanager.cpp
@@ -344,16 +344,28 @@ void DebuggerItemManager::saveDebuggers()
 
 QVariant DebuggerItemManager::registerDebugger(const DebuggerItem &item)
 {
-    if (findByCommand(item.command()))
-        return item.id();
+    if (const DebuggerItem *orig = findById(item.id())) {
+        QVariant id = orig->id();
+        if (*orig == item)
+            return id;
+        removeDebugger(id);
+        addDebugger(item);
+        emit m_instance->debuggerUpdated(id);
+        return id;
+    }
 
-    return addDebugger(item);
+    QVariant id = addDebugger(item);
+    emit m_instance->debuggerAdded(id);
+    return id;
 }
 
 void DebuggerItemManager::deregisterDebugger(const DebuggerItem &item)
 {
-    if (findByCommand(item.command()))
+    if (findById(item.id())) {
+        emit m_instance->aboutToRemoveDebugger(item.id());
         removeDebugger(item.id());
+        emit m_instance->removeDebugger(item.id());
+    }
 }
 
 QVariant DebuggerItemManager::addDebugger(const DebuggerItem &item)
diff --git a/src/plugins/debugger/debuggeritemmanager.h b/src/plugins/debugger/debuggeritemmanager.h
index 057cfd58b12d05938a825d01dd8be48e54470679..63936354d86981745995c3d7160cf9edc026004b 100644
--- a/src/plugins/debugger/debuggeritemmanager.h
+++ b/src/plugins/debugger/debuggeritemmanager.h
@@ -70,6 +70,12 @@ public:
     static void removeDebugger(const QVariant &id);
     static QVariant addDebugger(const DebuggerItem &item);
 
+signals:
+    void debuggerAdded(const QVariant &id);
+    void aboutToRemoveDebugger(const QVariant &id);
+    void debuggerRemoved(const QVariant &id);
+    void debuggerUpdated(const QVariant &id);
+
 public slots:
     void saveDebuggers();