diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 0bae54ae03fa25fc7283a9cd2902b8e0a1423fa4..8677a5e293922ab1c67e8730f5918c8e764f9bd0 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -471,7 +471,7 @@ void CdbEngine::syncOperateByInstruction(bool operateByInstruction)
     postCommand(m_operateByInstruction ? QByteArray("l-s") : QByteArray("l+s"), 0);
 }
 
-void CdbEngine::setToolTipExpression(const QPoint &mousePos,
+bool CdbEngine::setToolTipExpression(const QPoint &mousePos,
                                      TextEditor::ITextEditor *editor,
                                      const DebuggerToolTipContext &contextIn)
 {
@@ -479,7 +479,7 @@ void CdbEngine::setToolTipExpression(const QPoint &mousePos,
         qDebug() << Q_FUNC_INFO;
     // Need a stopped debuggee and a cpp file in a valid frame
     if (state() != InferiorStopOk || !isCppEditor(editor) || stackHandler()->currentIndex() < 0)
-        return;
+        return false;
     // Determine expression and function
     int line;
     int column;
@@ -487,20 +487,21 @@ void CdbEngine::setToolTipExpression(const QPoint &mousePos,
     const QString exp = cppExpressionAt(editor, context.position, &line, &column, &context.function);
     // Are we in the current stack frame
     if (context.function.isEmpty() || exp.isEmpty() || context.function != stackHandler()->currentFrame().function)
-        return;
+        return false;
     // No numerical or any other expressions [yet]
     if (!(exp.at(0).isLetter() || exp.at(0) == QLatin1Char('_')))
-        return;
+        return false;
     const QByteArray iname = QByteArray(localsPrefixC) + exp.toAscii();
     const QModelIndex index = watchHandler()->itemIndex(iname);
-    if (index.isValid()) {
-        DebuggerTreeViewToolTipWidget *tw = new DebuggerTreeViewToolTipWidget;
-        tw->setContext(context);
-        tw->setDebuggerModel(LocalsWatch);
-        tw->setExpression(exp);
-        tw->acquireEngine(this);
-        DebuggerToolTipManager::instance()->add(mousePos, tw);
-    }
+    if (!index.isValid())
+        return false;
+    DebuggerTreeViewToolTipWidget *tw = new DebuggerTreeViewToolTipWidget;
+    tw->setContext(context);
+    tw->setDebuggerModel(LocalsWatch);
+    tw->setExpression(exp);
+    tw->acquireEngine(this);
+    DebuggerToolTipManager::instance()->add(mousePos, tw);
+    return true;
 }
 
 // Determine full path to the CDB extension library.
diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h
index 5fa6f8bfb046b3a9d484761d8d2615fe22ff6702..263da86a1ed7cc002b6c3742d90c038ba9c0f5e9 100644
--- a/src/plugins/debugger/cdb/cdbengine.h
+++ b/src/plugins/debugger/cdb/cdbengine.h
@@ -85,7 +85,7 @@ public:
     virtual ~CdbEngine();
     // Factory function that returns 0 if the debug engine library cannot be found.
 
-    virtual void setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor,
+    virtual bool setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor,
                                       const DebuggerToolTipContext &ctx);
     virtual void setupEngine();
     virtual void setupInferior();
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 50986b415c1b06b1273a6408ddba09e4a2c5eaa2..7b82b9a4a7761712492fc25b42e7d785fd04b84c 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -1239,9 +1239,10 @@ DebuggerRunControl *DebuggerEngine::runControl() const
     return d->runControl();
 }
 
-void DebuggerEngine::setToolTipExpression
+bool DebuggerEngine::setToolTipExpression
     (const QPoint &, TextEditor::ITextEditor *, const DebuggerToolTipContext &)
 {
+    return false;
 }
 
 void DebuggerEngine::updateWatchData(const WatchData &, const WatchUpdateFlags &)
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 8cab885da99b164e7efe67243b11e5ff04cf2af8..63d4d4634781b08acbc0273394c6c9ec823c52fc 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -137,7 +137,7 @@ public:
     const DebuggerStartParameters &startParameters() const;
     DebuggerStartParameters &startParameters();
 
-    virtual void setToolTipExpression(const QPoint & mousePos,
+    virtual bool setToolTipExpression(const QPoint & mousePos,
         TextEditor::ITextEditor *editor, const Internal::DebuggerToolTipContext &);
 
     virtual void updateWatchData(const Internal::WatchData &data,
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 62ccadd109c88aef6eef657af04a8cfc1780fc76..1eb85fce72216cf509bc84058c4032229004ed70 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -721,16 +721,6 @@ bool DebuggingHelperOptionPage::matches(const QString &s) const
 //
 ///////////////////////////////////////////////////////////////////////
 
-static bool isDebuggable(IEditor *editor)
-{
-    // Only blacklist Qml. Whitelisting would fail on C++ code in files
-    // with strange names, more harm would be done this way.
-    //   IFile *file = editor->file();
-    //   return !(file && file->mimeType() == "application/x-qml");
-    // Nowadays, even Qml is debuggable.
-    return editor;
-}
-
 class ContextData
 {
 public:
@@ -871,8 +861,6 @@ public slots:
     void updateBreakMenuItem(Core::IEditor *editor);
     void setBusyCursor(bool busy);
     void requestMark(TextEditor::ITextEditor *editor, int lineNumber);
-    void showToolTip(TextEditor::ITextEditor *editor,
-        const QPoint &pnt, int pos, bool *handled);
     void requestContextMenu(TextEditor::ITextEditor *editor,
         int lineNumber, QMenu *menu);
 
@@ -1776,7 +1764,7 @@ void DebuggerPluginPrivate::runScheduled()
 
 void DebuggerPluginPrivate::editorOpened(IEditor *editor)
 {
-    if (!isDebuggable(editor))
+    if (!isEditorDebuggable(editor))
         return;
     ITextEditor *textEditor = qobject_cast<ITextEditor *>(editor);
     if (!textEditor)
@@ -1784,9 +1772,6 @@ void DebuggerPluginPrivate::editorOpened(IEditor *editor)
     connect(textEditor,
         SIGNAL(markRequested(TextEditor::ITextEditor*,int)),
         SLOT(requestMark(TextEditor::ITextEditor*,int)));
-    connect(editor,
-        SIGNAL(tooltipOverrideRequested(TextEditor::ITextEditor*,QPoint,int,bool*)),
-        SLOT(showToolTip(TextEditor::ITextEditor*,QPoint,int,bool*)));
     connect(textEditor,
         SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
         SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
@@ -1801,7 +1786,7 @@ void DebuggerPluginPrivate::updateBreakMenuItem(Core::IEditor *editor)
 void DebuggerPluginPrivate::requestContextMenu(ITextEditor *editor,
     int lineNumber, QMenu *menu)
 {
-    if (!isDebuggable(editor))
+    if (!isEditorDebuggable(editor))
         return;
 
     ContextData args;
@@ -1947,26 +1932,6 @@ void DebuggerPluginPrivate::requestMark(ITextEditor *editor, int lineNumber)
     }
 }
 
-void DebuggerPluginPrivate::showToolTip(ITextEditor *editor,
-    const QPoint &point, int pos, bool *handled)
-{
-    if (!isDebuggable(editor))
-        return;
-    if (!boolSetting(UseToolTipsInMainEditor))
-        return;
-    if (!currentEngine())
-        return;
-    if (!currentEngine()->canDisplayTooltip())
-        return;
-    QTC_ASSERT(handled, return);
-
-    const DebuggerToolTipContext context = DebuggerToolTipContext::fromEditor(editor, pos);
-    if (context.isValid()) {
-        *handled = true;
-        currentEngine()->setToolTipExpression(point, editor, context);
-    }
-}
-
 DebuggerRunControl *DebuggerPluginPrivate::createDebugger
     (const DebuggerStartParameters &sp, RunConfiguration *rc)
 {
diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp
index 738ab14667daf34ef02a63ddac4d304c1eb2aae4..c1282f9ab2b2c551cb5ae3df68498f6ae6a58c81 100644
--- a/src/plugins/debugger/debuggertooltipmanager.cpp
+++ b/src/plugins/debugger/debuggertooltipmanager.cpp
@@ -34,7 +34,9 @@
 #include "debuggertooltipmanager.h"
 #include "watchutils.h"
 #include "debuggerengine.h"
+#include "debuggeractions.h"
 #include "watchhandler.h"
+#include "watchutils.h"
 #include "stackhandler.h"
 #include "debuggercore.h"
 
@@ -43,6 +45,7 @@
 #include <coreplugin/imode.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <texteditor/itexteditor.h>
+#include <texteditor/tooltip/tooltip.h>
 
 #include <utils/qtcassert.h>
 
@@ -128,28 +131,46 @@ static inline void debugMode(const QAbstractItemModel *model)
         nospace << '#' << r << ' ' << model->data(model->index(r, 0)).toString() << '\n';
 }
 
-static inline QPlainTextEdit *plainTextEditor(Core::IEditor *ie, QString *fileName = 0)
+namespace Debugger {
+namespace Internal {
+
+// A convenience struct to pass around all tooltip-relevant editor members
+// (TextEditor, Widget, File, etc), constructing from a Core::IEditor.
+struct DebuggerToolTipEditor
+{
+    explicit DebuggerToolTipEditor(Core::IEditor *ie = 0);
+    inline bool isValid() const { return textEditor != 0 && plainTextEdit != 0 && file != 0; }
+    inline operator bool() const { return isValid(); }
+    QString fileName() const { return file ? file->fileName() : QString(); }
+
+    static DebuggerToolTipEditor currentToolTipEditor();
+
+    TextEditor::ITextEditor *textEditor;
+    QPlainTextEdit *plainTextEdit;
+    Core::IFile *file;
+};
+
+DebuggerToolTipEditor::DebuggerToolTipEditor(Core::IEditor *ie) :
+    textEditor(0), plainTextEdit(0), file(0)
 {
-    if (const Core::IFile *file = ie->file())
-        if (qobject_cast<TextEditor::ITextEditor *>(ie))
+    if (ie && ie->file() && isEditorDebuggable(ie)) {
+        if (TextEditor::ITextEditor *te = qobject_cast<TextEditor::ITextEditor *>(ie)) {
             if (QPlainTextEdit *pe = qobject_cast<QPlainTextEdit *>(ie->widget())) {
-                if (fileName)
-                    *fileName = file->fileName();
-                return pe;
+                textEditor = te;
+                plainTextEdit = pe;
+                file = ie->file();
             }
-    return 0;
+        }
+    }
 }
 
-static inline QPlainTextEdit *currentPlainTextEditor(QString *fileName = 0)
+DebuggerToolTipEditor DebuggerToolTipEditor::currentToolTipEditor()
 {
     if (Core::IEditor *ie = Core::EditorManager::instance()->currentEditor())
-        return plainTextEditor(ie, fileName);
-    return 0;
+        return DebuggerToolTipEditor(ie);
+    return DebuggerToolTipEditor();
 }
 
-namespace Debugger {
-namespace Internal {
-
 /* Helper for building a QStandardItemModel of a tree form (see TreeModelVisitor).
  * The recursion/building is based on the scheme: \code
 <row><item1><item2>
@@ -1005,7 +1026,8 @@ QString DebuggerTreeViewToolTipWidget::clipboardContents() const
 DebuggerToolTipManager *DebuggerToolTipManager::m_instance = 0;
 
 DebuggerToolTipManager::DebuggerToolTipManager(QObject *parent) :
-    QObject(parent), m_debugModeActive(false)
+    QObject(parent), m_debugModeActive(false),
+    m_lastToolTipPos(-1), m_lastToolTipEditor(0)
 {
     DebuggerToolTipManager::m_instance = this;
 }
@@ -1152,21 +1174,21 @@ void DebuggerToolTipManager::slotUpdateVisibleToolTips()
         return;
     }
 
-    QString fileName;
-    QPlainTextEdit *plainTextEdit = currentPlainTextEditor(&fileName);
+    DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor::currentToolTipEditor();
 
     if (debugToolTips)
-        qDebug() << "DebuggerToolTipManager::slotUpdateVisibleToolTips() " << fileName << sender();
+        qDebug() << "DebuggerToolTipManager::slotUpdateVisibleToolTips() " << sender();
 
-    if (fileName.isEmpty() || !plainTextEdit) {
+    if (!toolTipEditor.isValid() || toolTipEditor.fileName().isEmpty()) {
         hide();
         return;
     }
 
     // Reposition and show all tooltips of that file.
+    const QString fileName = toolTipEditor.fileName();
     foreach (const QPointer<AbstractDebuggerToolTipWidget> &tw, m_tooltips) {
         if (tw->fileName() == fileName) {
-            tw->positionShow(plainTextEdit);
+            tw->positionShow(toolTipEditor.plainTextEdit);
         } else {
             tw->hide();
         }
@@ -1250,9 +1272,12 @@ bool DebuggerToolTipManager::debug()
 void DebuggerToolTipManager::slotEditorOpened(Core::IEditor *e)
 {
     // Move tooltip along when scrolled.
-    if (QPlainTextEdit *plainTextEdit = plainTextEditor(e)) {
-        connect(plainTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)),
+    if (DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e)) {
+        connect(toolTipEditor.plainTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)),
                 this, SLOT(slotUpdateVisibleToolTips()));
+        connect(toolTipEditor.textEditor,
+            SIGNAL(tooltipOverrideRequested(TextEditor::ITextEditor*,QPoint,int,bool*)),
+            SLOT(slotTooltipOverrideRequested(TextEditor::ITextEditor*,QPoint,int,bool*)));
     }
 }
 
@@ -1288,16 +1313,65 @@ void DebuggerToolTipManager::leavingDebugMode()
     if (m_debugModeActive) {
         m_debugModeActive = false;
         hide();
-        QWidget *topLevel = Core::ICore::instance()->mainWindow()->topLevelWidget();
-        topLevel->removeEventFilter(this);
-        Core::EditorManager *em = Core::EditorManager::instance();
-        foreach (Core::IEditor *e, em->openedEditors())
-            if (QPlainTextEdit *plainTextEdit = plainTextEditor(e))
-                plainTextEdit->verticalScrollBar()->disconnect(this);
-        em->disconnect(this);
+        if (QWidget *topLevel = Core::ICore::instance()->mainWindow()->topLevelWidget())
+            topLevel->removeEventFilter(this);
+        if (Core::EditorManager *em = Core::EditorManager::instance()) {
+            foreach (Core::IEditor *e, em->openedEditors()) {
+                if (DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e)) {
+                    toolTipEditor.plainTextEdit->verticalScrollBar()->disconnect(this);
+                    toolTipEditor.textEditor->disconnect(this);
+                }
+            }
+            em->disconnect(this);
+        }
+        m_lastToolTipEditor = 0;
+        m_lastToolTipPos = -1;
     }
 }
 
+void DebuggerToolTipManager::slotTooltipOverrideRequested(TextEditor::ITextEditor *editor,
+                                                          const QPoint &point,
+                                                          int pos, bool *handled)
+{
+    QTC_ASSERT(handled, return);
+    if (debugToolTips)
+        qDebug() << ">slotTooltipOverrideRequested() " << editor << point << pos << *handled;
+
+    DebuggerEngine *currentEngine = 0;
+    do {
+        if (*handled || (m_lastToolTipEditor == editor && pos == m_lastToolTipPos))
+            break; // Avoid flicker.
+
+        DebuggerCore  *core = debuggerCore();
+        if (!isEditorDebuggable(editor) || !core->boolSetting(UseToolTipsInMainEditor))
+            break;
+
+        currentEngine = core->currentEngine();
+        if (!currentEngine || !currentEngine->canDisplayTooltip())
+            break;
+
+        const DebuggerToolTipContext context = DebuggerToolTipContext::fromEditor(editor, pos);
+        if (context.isValid() && currentEngine->setToolTipExpression(point, editor, context)) {
+            if (TextEditor::ToolTip::instance()->isVisible())
+                TextEditor::ToolTip::instance()->hide();
+            *handled = true;
+            m_lastToolTipEditor = editor;
+            m_lastToolTipPos = pos;
+        }
+
+    } while (false);
+
+    // Other tooltip, close all in case mouse never entered the tooltip
+    // and no leave was triggered.
+    if (!*handled) {
+        m_lastToolTipEditor = 0;
+        m_lastToolTipPos = -1;
+        closeUnpinnedToolTips();
+    }
+    if (debugToolTips)
+        qDebug() << "<slotTooltipOverrideRequested() " << currentEngine << *handled;
+}
+
 QStringList DebuggerToolTipManager::treeWidgetExpressions(const QString &fileName,
                                                           const QString &engineType,
                                                           const QString &function) const
diff --git a/src/plugins/debugger/debuggertooltipmanager.h b/src/plugins/debugger/debuggertooltipmanager.h
index f17ee5ad9c29ed48ab6834d3e91b0be5d03af166..0f21a1b9e53f280f7e4e3ab4b96e4a982057dd37 100644
--- a/src/plugins/debugger/debuggertooltipmanager.h
+++ b/src/plugins/debugger/debuggertooltipmanager.h
@@ -62,6 +62,10 @@ class IEditor;
 class IMode;
 }
 
+namespace TextEditor {
+class ITextEditor;
+}
+
 namespace Debugger {
 class DebuggerEngine;
 
@@ -266,6 +270,8 @@ private slots:
     void slotDebuggerStateChanged(Debugger::DebuggerState);
     void slotStackFrameCompleted();
     void slotEditorOpened(Core::IEditor *);
+    void slotTooltipOverrideRequested(TextEditor::ITextEditor *editor, const QPoint &point,
+                                      int pos, bool *handled);
 
 private:
     typedef QList<QPointer<AbstractDebuggerToolTipWidget> > DebuggerToolTipWidgetList;
@@ -280,6 +286,8 @@ private:
 
     DebuggerToolTipWidgetList m_tooltips;
     bool m_debugModeActive;
+    int m_lastToolTipPos;
+    Core::IEditor *m_lastToolTipEditor;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 1ce7af51b7d82f8e86f382d55d62c8957526c51e..b95ecb5e2b0976334dc9cc915e9ea7bb1d8db42e 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3419,13 +3419,13 @@ void GdbEngine::clearToolTip()
     m_toolTipContext.reset();
 }
 
-void GdbEngine::setToolTipExpression(const QPoint &mousePos,
+bool GdbEngine::setToolTipExpression(const QPoint &mousePos,
     TextEditor::ITextEditor *editor, const DebuggerToolTipContext &contextIn)
 {
     if (state() != InferiorStopOk || !isCppEditor(editor)) {
         //qDebug() << "SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED "
         // " OR NOT A CPPEDITOR";
-        return;
+        return false;
     }
 
     DebuggerToolTipContext context = contextIn;
@@ -3434,7 +3434,7 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos,
     if (DebuggerToolTipManager::debug())
         qDebug() << "GdbEngine::setToolTipExpression1 " << exp << context;
     if (exp.isEmpty())
-        return;
+        return false;
 
     // Extract the first identifier, everything else is considered
     // too dangerous.
@@ -3455,10 +3455,10 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos,
     exp = exp.mid(pos1, pos2 - pos1);
 
     if (exp.isEmpty() || exp.startsWith(_c('#')) || !hasLetterOrNumber(exp) || isKeyWord(exp))
-        return;
+        return false;
 
     if (exp.startsWith(_c('"')) && exp.endsWith(_c('"')))
-        return;
+        return false;
 
     if (exp.startsWith(__("++")) || exp.startsWith(__("--")))
         exp = exp.mid(2);
@@ -3467,14 +3467,14 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos,
         exp = exp.mid(2);
 
     if (exp.startsWith(_c('<')) || exp.startsWith(_c('[')))
-        return;
+        return false;
 
     if (hasSideEffects(exp) || exp.isEmpty())
-        return;
+        return false;
 
     if (!m_toolTipContext.isNull() && m_toolTipContext->expression == exp) {
         showToolTip();
-        return;
+        return true;
     }
 
     m_toolTipContext.reset(new GdbToolTipContext(context));
@@ -3485,7 +3485,7 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos,
 
     if (isSynchronous()) {
         updateLocals(QVariant());
-        return;
+        return true;
     }
 
     WatchData toolTip;
@@ -3494,6 +3494,7 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos,
     toolTip.iname = tooltipIName(exp);
     watchHandler()->removeData(toolTip.iname);
     watchHandler()->insertData(toolTip);
+    return true;
 }
 
 
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 440a70eacedce974941ecc23fddf7dfee4f306e0..3f5936df0d971e6ef4f26973081b5d7499fa8c79 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -476,7 +476,7 @@ private: ////////// View & Data Stuff //////////
     //
     // Watch specific stuff
     //
-    virtual void setToolTipExpression(const QPoint &mousePos,
+    virtual bool setToolTipExpression(const QPoint &mousePos,
         TextEditor::ITextEditor *editor, const DebuggerToolTipContext &);
     virtual void assignValueInDebugger(const WatchData *data,
         const QString &expr, const QVariant &value);
diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp
index a0547b7383e5a6b0e325bfedca13486aa8ef8719..46c8a5eed7f909bdefbd8930a2d2b1dc5b8118a2 100644
--- a/src/plugins/debugger/pdb/pdbengine.cpp
+++ b/src/plugins/debugger/pdb/pdbengine.cpp
@@ -456,7 +456,7 @@ static WatchData m_toolTip;
 static QPoint m_toolTipPos;
 static QHash<QString, WatchData> m_toolTipCache;
 
-void PdbEngine::setToolTipExpression(const QPoint &mousePos,
+bool PdbEngine::setToolTipExpression(const QPoint &mousePos,
     TextEditor::ITextEditor *editor, const DebuggerToolTipContext &ctx)
 {
     Q_UNUSED(mousePos)
@@ -464,13 +464,13 @@ void PdbEngine::setToolTipExpression(const QPoint &mousePos,
 
     if (state() != InferiorStopOk) {
         //SDEBUG("SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED");
-        return;
+        return false;
     }
     // Check mime type and get expression (borrowing some C++ - functions)
     const QString javaPythonMimeType =
         QLatin1String("application/javascript");
     if (!editor->file() || editor->file()->mimeType() != javaPythonMimeType)
-        return;
+        return false;
 
     int line;
     int column;
@@ -488,17 +488,17 @@ void PdbEngine::setToolTipExpression(const QPoint &mousePos,
     QToolTip::hideText();
     if (exp.isEmpty() || exp.startsWith(QLatin1Char('#')))  {
         QToolTip::hideText();
-        return;
+        return false;
     }
 
     if (!hasLetterOrNumber(exp)) {
         QToolTip::showText(m_toolTipPos, tr("'%1' contains no identifier").arg(exp));
-        return;
+        return true;
     }
 
     if (exp.startsWith(QLatin1Char('"')) && exp.endsWith(QLatin1Char('"'))) {
         QToolTip::showText(m_toolTipPos, tr("String literal %1").arg(exp));
-        return;
+        return true;
     }
 
     if (exp.startsWith(QLatin1String("++")) || exp.startsWith(QLatin1String("--")))
@@ -508,13 +508,13 @@ void PdbEngine::setToolTipExpression(const QPoint &mousePos,
         exp.remove(0, 2);
 
     if (exp.startsWith(QLatin1Char('<')) || exp.startsWith(QLatin1Char('[')))
-        return;
+        return false;
 
     if (hasSideEffects(exp)) {
         QToolTip::showText(m_toolTipPos,
             tr("Cowardly refusing to evaluate expression '%1' "
                "with potential side effects").arg(exp));
-        return;
+        return true;
     }
 
 #if 0
@@ -528,6 +528,7 @@ void PdbEngine::setToolTipExpression(const QPoint &mousePos,
     m_toolTip.iname = tooltipIName;
     insertData(m_toolTip);
 #endif
+    return false;
 }
 
 
diff --git a/src/plugins/debugger/pdb/pdbengine.h b/src/plugins/debugger/pdb/pdbengine.h
index 8da4377e42cf97a51b538b04a40d61688b8618df..fcff5d32e0833e229eab314f0af48b580f35dd6e 100644
--- a/src/plugins/debugger/pdb/pdbengine.h
+++ b/src/plugins/debugger/pdb/pdbengine.h
@@ -79,7 +79,7 @@ private:
     void shutdownInferior();
     void shutdownEngine();
 
-    void setToolTipExpression(const QPoint &mousePos,
+    bool setToolTipExpression(const QPoint &mousePos,
         TextEditor::ITextEditor *editor, const DebuggerToolTipContext &);
 
     void continueInferior();
diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp
index 2060955d30dfa3a8e3a2ac52f0b834cce0af810c..afd2e63a785da9f0dd206ba1578fc7f851bb7db3 100644
--- a/src/plugins/debugger/qml/qmlcppengine.cpp
+++ b/src/plugins/debugger/qml/qmlcppengine.cpp
@@ -139,10 +139,10 @@ QmlCppEngine::~QmlCppEngine()
     delete d->m_cppEngine;
 }
 
-void QmlCppEngine::setToolTipExpression(const QPoint & mousePos,
+bool QmlCppEngine::setToolTipExpression(const QPoint & mousePos,
         TextEditor::ITextEditor *editor, const DebuggerToolTipContext &ctx)
 {
-    d->m_activeEngine->setToolTipExpression(mousePos, editor, ctx);
+    return d->m_activeEngine->setToolTipExpression(mousePos, editor, ctx);
 }
 
 void QmlCppEngine::updateWatchData(const WatchData &data,
diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h
index f0cf10e6fb32b9c27d09aa0c4651620c1bfd4d9f..72d81fc9b644cdd9878d3f423b58c2d0a1b343d8 100644
--- a/src/plugins/debugger/qml/qmlcppengine.h
+++ b/src/plugins/debugger/qml/qmlcppengine.h
@@ -18,7 +18,7 @@ public:
     explicit QmlCppEngine(const DebuggerStartParameters &sp);
     ~QmlCppEngine();
 
-    void setToolTipExpression(const QPoint &mousePos,
+    bool setToolTipExpression(const QPoint &mousePos,
         TextEditor::ITextEditor * editor, const DebuggerToolTipContext &);
     void updateWatchData(const WatchData &data,
         const WatchUpdateFlags &flags);
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index 11e1ef48d1ae1984600c1aaebade0a60868d5981..5faf4b1f4400a3dfb3aa9611a744f251a1afa8bd 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -571,12 +571,13 @@ void QmlEngine::requestModuleSymbols(const QString &moduleName)
 //
 //////////////////////////////////////////////////////////////////////
 
-void QmlEngine::setToolTipExpression(const QPoint &mousePos,
+bool QmlEngine::setToolTipExpression(const QPoint &mousePos,
     TextEditor::ITextEditor *editor, const DebuggerToolTipContext &ctx)
 {
     // This is processed by QML inspector, which has dependencies to 
     // the qml js editor. Makes life easier.
     emit tooltipRequested(mousePos, editor, ctx.position);
+    return true;
 }
 
 //////////////////////////////////////////////////////////////////////
diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h
index 533fb4e3e8fc0d0a597982b36573f211a0b0aa9e..055594cd913aab2a45cc2e4c5cd6615798e911f2 100644
--- a/src/plugins/debugger/qml/qmlengine.h
+++ b/src/plugins/debugger/qml/qmlengine.h
@@ -80,7 +80,7 @@ private:
     void shutdownInferior();
     void shutdownEngine();
 
-    void setToolTipExpression(const QPoint &mousePos,
+    bool setToolTipExpression(const QPoint &mousePos,
         TextEditor::ITextEditor *editor, const DebuggerToolTipContext &);
 
     void continueInferior();
diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp
index 6b6a1e33d611a65a3a5f1daa4cdd8326b80ce702..888514092aedb5a944aa9c386374e4ef899e5aaa 100644
--- a/src/plugins/debugger/script/scriptengine.cpp
+++ b/src/plugins/debugger/script/scriptengine.cpp
@@ -512,7 +512,7 @@ static WatchData m_toolTip;
 static QPoint m_toolTipPos;
 static QHash<QString, WatchData> m_toolTipCache;
 
-void ScriptEngine::setToolTipExpression(const QPoint &mousePos,
+bool ScriptEngine::setToolTipExpression(const QPoint &mousePos,
     TextEditor::ITextEditor *editor, const DebuggerToolTipContext &ctx)
 {
     Q_UNUSED(mousePos)
@@ -520,13 +520,13 @@ void ScriptEngine::setToolTipExpression(const QPoint &mousePos,
 
     if (state() != InferiorStopOk) {
         //SDEBUG("SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED");
-        return;
+        return false;
     }
     // Check mime type and get expression (borrowing some C++ - functions)
     const QString javaScriptMimeType =
         QLatin1String("application/javascript");
     if (!editor->file() || editor->file()->mimeType() != javaScriptMimeType)
-        return;
+        return false;
 
     int line;
     int column;
@@ -544,17 +544,17 @@ void ScriptEngine::setToolTipExpression(const QPoint &mousePos,
     QToolTip::hideText();
     if (exp.isEmpty() || exp.startsWith(QLatin1Char('#')))  {
         QToolTip::hideText();
-        return;
+        return false;
     }
 
     if (!hasLetterOrNumber(exp)) {
         QToolTip::showText(m_toolTipPos, tr("'%1' contains no identifier").arg(exp));
-        return;
+        return false;
     }
 
     if (exp.startsWith(QLatin1Char('"')) && exp.endsWith(QLatin1Char('"'))) {
         QToolTip::showText(m_toolTipPos, tr("String literal %1").arg(exp));
-        return;
+        return false;
     }
 
     if (exp.startsWith(QLatin1String("++")) || exp.startsWith(QLatin1String("--")))
@@ -564,13 +564,13 @@ void ScriptEngine::setToolTipExpression(const QPoint &mousePos,
         exp.remove(0, 2);
 
     if (exp.startsWith(QLatin1Char('<')) || exp.startsWith(QLatin1Char('[')))
-        return;
+        return false;
 
     if (hasSideEffects(exp)) {
         QToolTip::showText(m_toolTipPos,
             tr("Cowardly refusing to evaluate expression '%1' "
                "with potential side effects").arg(exp));
-        return;
+        return false;
     }
 
 #if 0
@@ -584,6 +584,7 @@ void ScriptEngine::setToolTipExpression(const QPoint &mousePos,
     m_toolTip.iname = tooltipIName;
     insertData(m_toolTip);
 #endif
+    return false;
 }
 
 
diff --git a/src/plugins/debugger/script/scriptengine.h b/src/plugins/debugger/script/scriptengine.h
index b34ae49b5818657925b36bd85809c28fae61c443..8136c9a23bffd99892950e71fbb191a8f1880708 100644
--- a/src/plugins/debugger/script/scriptengine.h
+++ b/src/plugins/debugger/script/scriptengine.h
@@ -73,7 +73,7 @@ private:
     void executeStepI();
     void executeNextI();
 
-    void setToolTipExpression(const QPoint &mousePos,
+    bool setToolTipExpression(const QPoint &mousePos,
         TextEditor::ITextEditor *editor, const DebuggerToolTipContext &);
     void setupEngine();
     void setupInferior();
diff --git a/src/plugins/debugger/tcf/tcfengine.cpp b/src/plugins/debugger/tcf/tcfengine.cpp
index a06910f6c1038127b12220736692e5b2bddd82f8..b63aa6e3c2ef3d3cdab10de50787c7fac9dd2deb 100644
--- a/src/plugins/debugger/tcf/tcfengine.cpp
+++ b/src/plugins/debugger/tcf/tcfengine.cpp
@@ -535,10 +535,11 @@ static WatchData m_toolTip;
 static QPoint m_toolTipPos;
 static QHash<QString, WatchData> m_toolTipCache;
 
-void TcfEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, const DebuggerToolTipContext &)
+bool TcfEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, const DebuggerToolTipContext &)
 {
     Q_UNUSED(mousePos)
     Q_UNUSED(editor)
+    return false;
 }
 
 //////////////////////////////////////////////////////////////////////
diff --git a/src/plugins/debugger/tcf/tcfengine.h b/src/plugins/debugger/tcf/tcfengine.h
index d3ade0a2e7e57371e6935cfcf628df4ed6485cdf..56b3fbb15171dea155a09c6f81a890e714c4fc4c 100644
--- a/src/plugins/debugger/tcf/tcfengine.h
+++ b/src/plugins/debugger/tcf/tcfengine.h
@@ -82,7 +82,7 @@ private:
     void shutdownInferior();
     void shutdownEngine();
 
-    void setToolTipExpression(const QPoint &mousePos,
+    bool setToolTipExpression(const QPoint &mousePos,
         TextEditor::ITextEditor *editor, const DebuggerToolTipContext &);
 
     void continueInferior();
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index 730955ae57ec8684f771b2fce042b175fe779d32..9d10cb372e91be46c6a2aba128a929cfc1b5da91 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -148,6 +148,16 @@ QDebug operator<<(QDebug d, const Scope &scope)
 namespace Debugger {
 namespace Internal {
 
+bool isEditorDebuggable(Core::IEditor *editor)
+{
+    // Only blacklist Qml. Whitelisting would fail on C++ code in files
+    // with strange names, more harm would be done this way.
+    //   IFile *file = editor->file();
+    //   return !(file && file->mimeType() == "application/x-qml");
+    // Nowadays, even Qml is debuggable.
+    return editor;
+}
+
 QByteArray dotEscape(QByteArray str)
 {
     str.replace(' ', '.');
diff --git a/src/plugins/debugger/watchutils.h b/src/plugins/debugger/watchutils.h
index 11a3a412fc03162d49187ab458f6ec585f548a4d..5985158a22744c656983853fc21274396da8c07c 100644
--- a/src/plugins/debugger/watchutils.h
+++ b/src/plugins/debugger/watchutils.h
@@ -60,6 +60,7 @@ namespace Internal {
 class WatchData;
 class GdbMi;
 
+bool isEditorDebuggable(Core::IEditor *editor);
 QByteArray dotEscape(QByteArray str);
 QString currentTime();
 bool isSkippableFunction(const QString &funcName, const QString &fileName);