diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 2eefdb7c1f21b381b4f6e00e9d874fe6ba1b1eb1..7daf735da2486c1302ed1105a4d7457cd2119b90 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -1074,7 +1074,7 @@ void CdbEngine::updateLocalVariable(const QByteArray &iname)
 unsigned CdbEngine::debuggerCapabilities() const
 {
     return DisassemblerCapability | RegisterCapability | ShowMemoryCapability
-           |WatchpointByAddressCapability|JumpToLineCapability|AddWatcherCapability
+           |WatchpointByAddressCapability|JumpToLineCapability|AddWatcherCapability|WatchWidgetsCapability
            |ReloadModuleCapability
            |BreakOnThrowAndCatchCapability // Sort-of: Can break on throw().
            |BreakConditionCapability|TracePointCapability
@@ -1083,11 +1083,6 @@ unsigned CdbEngine::debuggerCapabilities() const
            |RunToLineCapability;
 }
 
-bool CdbEngine::canWatchWidgets() const
-{
-    return true;
-}
-
 void CdbEngine::executeStep()
 {
     if (!m_operateByInstruction)
diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h
index 27a4e7b2b877c3de7e28f571e358e8b8f5cd5b34..9c21dd4b0a877edbd517019def5b3ecb073277bf 100644
--- a/src/plugins/debugger/cdb/cdbengine.h
+++ b/src/plugins/debugger/cdb/cdbengine.h
@@ -99,7 +99,6 @@ public:
     virtual void updateWatchData(const WatchData &data,
                                  const WatchUpdateFlags & flags = WatchUpdateFlags());
     virtual unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
     virtual void watchPoint(const QPoint &);
     virtual void setRegisterValue(int regnr, const QString &value);
 
diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index c14c682279616a6c0277d20bba1b95c816b1e2d5..35ae2fb8f83dc9c7290c995507d653e969e8b0d7 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -148,12 +148,14 @@ enum DebuggerCapabilities
     ReturnFromFunctionCapability = 0x2000,
     CreateFullBacktraceCapability = 0x4000,
     AddWatcherCapability = 0x8000,
-    WatchpointByAddressCapability = 0x10000,
-    WatchpointByExpressionCapability = 0x20000,
-    ShowModuleSymbolsCapability = 0x40000,
-    CatchCapability = 0x80000, //!< fork, vfork, syscall
-    OperateByInstructionCapability = 0x100000,
-    RunToLineCapability = 0x200000,
+    AddWatcherWhileRunningCapability = 0x10000,
+    WatchWidgetsCapability = 0x20000,
+    WatchpointByAddressCapability = 0x40000,
+    WatchpointByExpressionCapability = 0x80000,
+    ShowModuleSymbolsCapability = 0x100000,
+    CatchCapability = 0x200000, //!< fork, vfork, syscall
+    OperateByInstructionCapability = 0x400000,
+    RunToLineCapability = 0x800000,
     AllDebuggerCapabilities = 0xFFFFFFFF
 };
 
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 15f86c2ac14836a5226afbe442fa3d4a4260f1e2..7065a3e1e5a97e64df488db454a015f2bdcb7b21 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -1298,16 +1298,6 @@ unsigned DebuggerEngine::debuggerCapabilities() const
     return 0;
 }
 
-bool DebuggerEngine::canWatchWidgets() const
-{
-    return false;
-}
-
-bool DebuggerEngine::acceptsWatchesWhileRunning() const
-{
-    return false;
-}
-
 bool DebuggerEngine::isSynchronous() const
 {
     return false;
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 7fabfd253d91bbdb44df4cc0a8055773359ab4d9..d20bb421bf3fd737cedb1ac717af5f5a7eca5411 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -193,8 +193,6 @@ public:
     virtual void setRegisterValue(int regnr, const QString &value);
     virtual void addOptionPages(QList<Core::IOptionsPage*> *) const;
     virtual unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
-    virtual bool acceptsWatchesWhileRunning() const;
 
     virtual bool isSynchronous() const;
     virtual QByteArray qtNamespace() const;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 0f4169cf5452455d102e4b5c8be1cb8d77c39bc9..1f3737737a84160cea5f50331405a17d2227e6d4 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1999,6 +1999,7 @@ unsigned GdbEngine::debuggerCapabilities() const
         | WatchpointByAddressCapability
         | WatchpointByExpressionCapability
         | AddWatcherCapability
+        | WatchWidgetsCapability
         | ShowModuleSymbolsCapability
         | CatchCapability
         | OperateByInstructionCapability
@@ -2014,10 +2015,6 @@ unsigned GdbEngine::debuggerCapabilities() const
     return caps | SnapshotCapability;
 }
 
-bool GdbEngine::canWatchWidgets() const
-{
-    return true;
-}
 
 void GdbEngine::continueInferiorInternal()
 {
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 99d869e38849ad1100d0fdaf1ac5ed37eaf31d0a..6dc50b4df80afa3410848d9fdd26942f2ebff8fa 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -238,7 +238,6 @@ private: ////////// General Interface //////////
     virtual void runEngine();
 
     virtual unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
     virtual void detachDebugger();
     virtual void shutdownEngine();
     virtual void shutdownInferior();
diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp
index a05a7fd35f348148ee76ed60d6b1b3a97d4bffb6..963df0f16af8d94efee7d2fe77b180b1e926584b 100644
--- a/src/plugins/debugger/qml/qmlcppengine.cpp
+++ b/src/plugins/debugger/qml/qmlcppengine.cpp
@@ -252,17 +252,15 @@ void QmlCppEngine::setRegisterValue(int regnr, const QString &value)
 unsigned QmlCppEngine::debuggerCapabilities() const
 {
     // ### this could also be an OR of both engines' capabilities
-    return d->m_cppEngine->debuggerCapabilities();
-}
-
-bool QmlCppEngine::canWatchWidgets() const
-{
-    return d->m_activeEngine->canWatchWidgets();
-}
-
-bool QmlCppEngine::acceptsWatchesWhileRunning() const
-{
-    return d->m_activeEngine->acceptsWatchesWhileRunning();
+    unsigned result = d->m_cppEngine->debuggerCapabilities();
+    if (d->m_activeEngine != d->m_cppEngine) {
+        const unsigned qmlCapabilities = d->m_qmlEngine->debuggerCapabilities();
+        if (qmlCapabilities & AddWatcherWhileRunningCapability)
+            result |= AddWatcherWhileRunningCapability;
+        if (!(qmlCapabilities & WatchWidgetsCapability))
+            result &= ~WatchWidgetsCapability;
+    }
+    return result;
 }
 
 bool QmlCppEngine::isSynchronous() const
diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h
index 322e4a9d4473c1044bbf38ea9ab6e00e026adf22..80bf87e52aac910f9f4fe2d9844f0ede9338b1c6 100644
--- a/src/plugins/debugger/qml/qmlcppengine.h
+++ b/src/plugins/debugger/qml/qmlcppengine.h
@@ -74,8 +74,6 @@ public:
 
     void setRegisterValue(int regnr, const QString &value);
     unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
-    virtual bool acceptsWatchesWhileRunning() const;
 
     bool isSynchronous() const;
     QByteArray qtNamespace() const;
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index 7b7aa9e4b0b9d3f2d7b9ad653176d01530bcd5f5..06a880e36559920454d412e88660e2c02882da72 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -321,11 +321,6 @@ void QmlEngine::showMessage(const QString &msg, int channel, int timeout) const
     DebuggerEngine::showMessage(msg, channel, timeout);
 }
 
-bool QmlEngine::acceptsWatchesWhileRunning() const
-{
-    return true;
-}
-
 void QmlEngine::closeConnection()
 {
     disconnect(watchersModel(),SIGNAL(layoutChanged()),this,SLOT(synchronizeWatchers()));
@@ -645,7 +640,7 @@ void QmlEngine::synchronizeWatchers()
 
 unsigned QmlEngine::debuggerCapabilities() const
 {
-    return AddWatcherCapability;
+    return AddWatcherCapability|AddWatcherWhileRunningCapability;
     /*ReverseSteppingCapability | SnapshotCapability
         | AutoDerefPointersCapability | DisassemblerCapability
         | RegisterCapability | ShowMemoryCapability
diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h
index 2658de726a8c01a56cf054137a5df45529b11f5d..ae96ad1d2610d6bdcd0767c4b8e44e52a7393d68 100644
--- a/src/plugins/debugger/qml/qmlengine.h
+++ b/src/plugins/debugger/qml/qmlengine.h
@@ -66,7 +66,6 @@ public:
     void showMessage(const QString &msg, int channel = LogDebug,
                      int timeout = -1) const;
     void filterApplicationMessage(const QString &msg, int channel);
-    virtual bool acceptsWatchesWhileRunning() const;
     QString toFileInProject(const QUrl &fileUrl);
     void inferiorSpontaneousStop();
 
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 2624c790097d745162496fcdde19e7aab2c12f44..944cedc9e447443d2ce7be6fac140418abc86ccb 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -892,7 +892,7 @@ Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const
 
     // Disable editing if debuggee is positively running.
     const bool isRunning = engine() && engine()->state() == InferiorRunOk;
-    if (isRunning && engine() && !engine()->acceptsWatchesWhileRunning())
+    if (isRunning && engine() && !(engine()->debuggerCapabilities() & AddWatcherWhileRunningCapability))
         return notEditable;
 
     const WatchData &data = *watchItem(idx);
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 8cf50608315d3fa182718b0d4c5273abf5be9c68..4d04ab1682ffa68e354837eea04c18f4b511a8c6 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -716,7 +716,7 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     const DebuggerState state = engine->state();
     const bool canInsertWatches = state == InferiorStopOk
         || state == InferiorUnrunnable
-        || (state == InferiorRunOk && engine->acceptsWatchesWhileRunning());
+        || (state == InferiorRunOk && (engineCapabilities & AddWatcherWhileRunningCapability));
 
     QMenu breakpointMenu;
     breakpointMenu.setTitle(tr("Add Data Breakpoint..."));
@@ -763,8 +763,8 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     QAction *actInsertNewWatchItem = menu.addAction(tr("Insert New Evaluated Expression"));
     actInsertNewWatchItem->setEnabled(canHandleWatches && canInsertWatches);
     QAction *actSelectWidgetToWatch = menu.addAction(tr("Select Widget to Watch"));
-    actSelectWidgetToWatch->setEnabled(canHandleWatches && (engine->canWatchWidgets()));
-
+    actSelectWidgetToWatch->setEnabled(canHandleWatches
+                                       && (engine->debuggerCapabilities() & WatchWidgetsCapability));
     menu.addSeparator();
 
     QAction *actWatchExpression = new QAction(addWatchActionText(exp), &menu);