diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 720c50414d25232e1b9f9becd37e87ca0cfa9559..5812a3202911c5ff89d03b203dc19f5215f2f0a9 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -35,6 +35,7 @@
 #include "debuggerconstants.h"
 #include "idebuggerengine.h"
 #include "debuggerstringutils.h"
+#include "watchutils.h"
 
 #include "breakwindow.h"
 #include "debuggeroutputwindow.h"
@@ -57,13 +58,16 @@
 #ifdef Q_OS_WIN
 #  include "shared/peutils.h"
 #endif
+
 #include <coreplugin/icore.h>
+#include <coreplugin/editormanager/editormanager.h>
 #include <utils/qtcassert.h>
 #include <utils/fancymainwindow.h>
 #include <projectexplorer/toolchain.h>
 #include <cplusplus/CppDocument.h>
 #include <cpptools/cppmodelmanagerinterface.h>
 #include <qt4projectmanager/qt4projectmanagerconstants.h>
+#include <texteditor/itexteditor.h>
 
 #include <QtCore/QDebug>
 #include <QtCore/QDir>
@@ -1178,14 +1182,31 @@ void DebuggerManager::dumpLog()
 
 void DebuggerManager::addToWatchWindow()
 {
+    using namespace Core;
+    using namespace TextEditor;
     // requires a selection, but that's the only case we want...
-    QObject *ob = 0;
-    queryCurrentTextEditor(0, 0, &ob);
-    QPlainTextEdit *editor = qobject_cast<QPlainTextEdit*>(ob);
+    EditorManager *editorManager = EditorManager::instance();
+    if (!editorManager)
+        return;
+    IEditor *editor = editorManager->currentEditor();
     if (!editor)
         return;
-    QTextCursor tc = editor->textCursor();
-    theDebuggerAction(WatchExpression)->setValue(tc.selectedText());
+    ITextEditor *textEditor = qobject_cast<ITextEditor*>(editor);
+    if (!textEditor)
+        return;
+    QTextCursor tc;
+    QPlainTextEdit *ptEdit = qobject_cast<QPlainTextEdit*>(editor->widget());
+    if (ptEdit)
+        tc = ptEdit->textCursor();
+    QString exp;
+    if (tc.hasSelection()) {
+        exp = tc.selectedText();
+    } else {
+        int line, column;
+        exp = cppExpressionAt(textEditor, tc.position(), &line, &column);
+    }
+    if (!exp.isEmpty())
+        d->m_watchHandler->watchExpression(exp);
 }
 
 void DebuggerManager::setBreakpoint(const QString &fileName, int lineNumber)
@@ -1647,7 +1668,7 @@ void DebuggerManager::setState(DebuggerState state, bool forced)
     if (stopped)
         QApplication::alert(mainWindow(), 3000);
 
-    d->m_actions.watchAction->setEnabled(stopped);
+    d->m_actions.watchAction->setEnabled(true);
     d->m_actions.breakAction->setEnabled(true);
 
     bool interruptIsExit = !running;
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index ddf7d2449fae3ca14e9a810be2cdc0ef3d029469..02eb6fd8bb89f872e56577290ed3ae4ad52b9832 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -803,8 +803,14 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
 
     cmd = am->registerAction(actions.watchAction,
         Constants::ADD_TO_WATCH, cppeditorcontext);
-    //cmd->setDefaultKeySequence(QKeySequence(tr("ALT+D,ALT+W")));
+    cmd->action()->setEnabled(true);
+    cmd->setDefaultKeySequence(QKeySequence(tr("ALT+D,ALT+W")));
     mdebug->addAction(cmd);
+    // QTCREATORBUG-342 asks for that unconditionally
+    //ActionContainer *editorContextMenu =
+    //    am->actionContainer(CppEditor::Constants::M_CONTEXT);
+    //editorContextMenu->addAction(cmd);
+    //cmd->setAttribute(Command::CA_Hide);
 
     // Views menu
     cmd = am->registerAction(sep, QLatin1String("Debugger.Sep.Views"), globalcontext);