diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro
index 1d30ef924f2d61bc5f45bb88ee8d62713aea75d5..25b7c355f07785ae0e79cf6dfb99b79efbd26dfc 100644
--- a/src/plugins/debugger/debugger.pro
+++ b/src/plugins/debugger/debugger.pro
@@ -27,6 +27,7 @@ HEADERS += \
     debuggeroutputwindow.h \
     debuggerplugin.h \
     debuggerrunner.h \
+    debuggertooltip.h \
     disassemblerhandler.h \
     disassemblerwindow.h \
     watchutils.h \
@@ -55,6 +56,7 @@ SOURCES += \
     debuggeroutputwindow.cpp \
     debuggerplugin.cpp \
     debuggerrunner.cpp \
+    debuggertooltip.cpp \
     disassemblerhandler.cpp \
     disassemblerwindow.cpp \
     watchutils.cpp \
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 5144f01ea88b04040d4d4a112398375939401f72..e9226a7c42277767ba5aca980ea46e46f40e0c25 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -66,6 +66,7 @@
 #include <QtCore/QTime>
 #include <QtCore/QTimer>
 
+#include <QtGui/QApplication>
 #include <QtGui/QAction>
 #include <QtGui/QComboBox>
 #include <QtGui/QDockWidget>
@@ -75,16 +76,34 @@
 #include <QtGui/QMainWindow>
 #include <QtGui/QMessageBox>
 #include <QtGui/QPlainTextEdit>
+#include <QtGui/QPushButton>
 #include <QtGui/QStatusBar>
 #include <QtGui/QTextBlock>
 #include <QtGui/QTextCursor>
 #include <QtGui/QToolBar>
 #include <QtGui/QToolButton>
-#include <QtGui/QPushButton>
 #include <QtGui/QToolTip>
 
+
+// The creation functions take a list of options pages they can add to.
+// This allows for having a "enabled" toggle on the page indepently
+// of the engine.
+using namespace Debugger::Internal;
+
+IDebuggerEngine *createGdbEngine(DebuggerManager *parent, QList<Core::IOptionsPage*> *);
+IDebuggerEngine *createWinEngine(DebuggerManager *, bool /* cmdLineEnabled */, QList<Core::IOptionsPage*> *)
+#ifdef CDB_ENABLED
+;
+#else
+{ return 0; }
+#endif
+IDebuggerEngine *createScriptEngine(DebuggerManager *parent, QList<Core::IOptionsPage*> *);
+IDebuggerEngine *createTcfEngine(DebuggerManager *parent, QList<Core::IOptionsPage*> *);
+
+
 namespace Debugger {
-    namespace Internal {
+namespace Internal {
+
 QDebug operator<<(QDebug str, const DebuggerStartParameters &p)
 {
     QDebug nospace = str.nospace();
@@ -100,12 +119,8 @@ QDebug operator<<(QDebug str, const DebuggerStartParameters &p)
             << " toolchain=" << p.toolChainType << '\n';
     return str;
 }
-} // namespace Internal
-} // namespace Debugger
 
-using namespace Debugger;
-using namespace Debugger::Internal;
-using namespace Debugger::Constants;
+using namespace Constants;
 
 static const QString tooltipIName = "tooltip";
 
@@ -131,36 +146,15 @@ static const char *stateName(int s)
 
 ///////////////////////////////////////////////////////////////////////
 //
-// DebuggerManager
+// DebuggerStartParameters
 //
 ///////////////////////////////////////////////////////////////////////
 
-static IDebuggerEngine *gdbEngine = 0;
-static IDebuggerEngine *winEngine = 0;
-static IDebuggerEngine *scriptEngine = 0;
-static IDebuggerEngine *tcfEngine = 0;
-
-// The creation functions take a list of options pages they can add to.
-// This allows for having a "enabled" toggle on the page indepently
-// of the engine.
-IDebuggerEngine *createGdbEngine(DebuggerManager *parent, QList<Core::IOptionsPage*> *);
-IDebuggerEngine *createWinEngine(DebuggerManager *, bool /* cmdLineEnabled */, QList<Core::IOptionsPage*> *)
-#ifdef CDB_ENABLED
-;
-#else
-{ return 0; }
-#endif
-IDebuggerEngine *createScriptEngine(DebuggerManager *parent, QList<Core::IOptionsPage*> *);
-IDebuggerEngine *createTcfEngine(DebuggerManager *parent, QList<Core::IOptionsPage*> *);
-
-// ---------------- DebuggerStartParameters
-
-DebuggerStartParameters::DebuggerStartParameters() :
-    attachPID(-1),
+DebuggerStartParameters::DebuggerStartParameters()
+  : attachPID(-1),
     useTerminal(false),
     toolChainType(ProjectExplorer::ToolChain::UNKNOWN)
-{
-}
+{}
 
 void DebuggerStartParameters::clear()
 {
@@ -179,9 +173,20 @@ void DebuggerStartParameters::clear()
     toolChainType = ProjectExplorer::ToolChain::UNKNOWN;
 }
 
-// --------- DebuggerManager
-DebuggerManager::DebuggerManager() :
-    m_startParameters(new DebuggerStartParameters),
+
+///////////////////////////////////////////////////////////////////////
+//
+// DebuggerManager
+//
+///////////////////////////////////////////////////////////////////////
+
+static IDebuggerEngine *gdbEngine = 0;
+static IDebuggerEngine *winEngine = 0;
+static IDebuggerEngine *scriptEngine = 0;
+static IDebuggerEngine *tcfEngine = 0;
+
+DebuggerManager::DebuggerManager()
+  : m_startParameters(new DebuggerStartParameters),
     m_inferiorPid(0)
 {
     init();
@@ -228,8 +233,6 @@ void DebuggerManager::init()
     m_localsWindow = new WatchWindow(WatchWindow::LocalsType);
     m_watchersWindow = new WatchWindow(WatchWindow::WatchersType);
     //m_tooltipWindow = new WatchWindow(WatchWindow::TooltipType);
-    //m_watchersWindow = new QTreeView;
-    m_tooltipWindow = new QTreeView;
     m_statusTimer = new QTimer(this);
 
     m_mainWindow = new QMainWindow;
@@ -334,8 +337,8 @@ void DebuggerManager::init()
         this, SLOT(assignValueInDebugger()), Qt::QueuedConnection);
 
     // Tooltip
-    QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow);
-    tooltipView->setModel(m_watchHandler->model(TooltipsWatch));
+    //QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow);
+    //tooltipView->setModel(m_watchHandler->model(TooltipsWatch));
 
     connect(m_watchHandler, SIGNAL(watchDataUpdateNeeded(WatchData)),
         this, SLOT(updateWatchData(WatchData)));
@@ -461,8 +464,10 @@ void DebuggerManager::init()
     localsAndWatchers->setWindowTitle(m_localsWindow->windowTitle());
     localsAndWatchers->addWidget(m_localsWindow);
     localsAndWatchers->addWidget(m_watchersWindow);
+    //localsAndWatchers->addWidget(m_tooltipWindow);
     localsAndWatchers->setStretchFactor(0, 3);
     localsAndWatchers->setStretchFactor(1, 1);
+    localsAndWatchers->setStretchFactor(2, 1);
     m_watchDock = createDockForWidget(localsAndWatchers);
 
     setStatus(DebuggerProcessNotReady);
@@ -710,7 +715,7 @@ void DebuggerManager::shutdown()
     doDelete(m_stackWindow);
     doDelete(m_sourceFilesWindow);
     doDelete(m_threadsWindow);
-    doDelete(m_tooltipWindow);
+    //doDelete(m_tooltipWindow);
     doDelete(m_watchersWindow);
     doDelete(m_localsWindow);
 
@@ -1275,7 +1280,7 @@ void DebuggerManager::setBusyCursor(bool busy)
     m_stackWindow->setCursor(cursor);
     m_sourceFilesWindow->setCursor(cursor);
     m_threadsWindow->setCursor(cursor);
-    m_tooltipWindow->setCursor(cursor);
+    //m_tooltipWindow->setCursor(cursor);
     m_watchersWindow->setCursor(cursor);
 }
 
@@ -1561,3 +1566,7 @@ void DebuggerManager::runTest(const QString &fileName)
     m_startParameters->workingDir.clear();
     //startNewDebugger(StartInternal);
 }
+
+} // namespace Internal
+} // namespace Debugger
+
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index bbf12e383d91ad2a097167d56c596fc7555bb0aa..23624c7d601ee2af1ebca6dfdab0ce955fa58f69 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -42,6 +42,7 @@ class QAbstractItemModel;
 class QDockWidget;
 class QLabel;
 class QMainWindow;
+class QModelIndex;
 class QPoint;
 class QTimer;
 class QWidget;
@@ -70,16 +71,16 @@ class DebuggerPlugin;
 class DebugMode;
 
 class BreakHandler;
+class BreakpointData;
 class DisassemblerHandler;
 class ModulesHandler;
 class RegisterHandler;
+class SourceFilesWindow;
 class StackHandler;
+class Symbol;
 class ThreadsHandler;
-class WatchHandler;
-class SourceFilesWindow;
 class WatchData;
-class BreakpointData;
-class Symbol;
+class WatchHandler;
 
 // Note: the Debugger process itself is referred to as 'Debugger',
 // whereas the debugged process is referred to as 'Inferior' or 'Debuggee'.
@@ -104,7 +105,6 @@ class Symbol;
 //    [N] :  Step, Next
 
 
-
 enum DebuggerStatus
 {
     DebuggerProcessNotReady,          // Debugger not started
@@ -483,7 +483,7 @@ private:
     QWidget *m_localsWindow;
     QWidget *m_registerWindow;
     QWidget *m_modulesWindow;
-    QWidget *m_tooltipWindow;
+    //QWidget *m_tooltipWindow;
     QWidget *m_stackWindow;
     QWidget *m_threadsWindow;
     QWidget *m_watchersWindow;
diff --git a/src/plugins/debugger/debuggertooltip.cpp b/src/plugins/debugger/debuggertooltip.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a3ba05304c8f3d45914907d21bd7bd5399e82bea
--- /dev/null
+++ b/src/plugins/debugger/debuggertooltip.cpp
@@ -0,0 +1,211 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+**
+**************************************************************************/
+
+#include "debuggertooltip.h"
+
+#include <QtCore/QPointer>
+#include <QtCore/QtDebug>
+
+#include <QtGui/QApplication>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QHeaderView>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QLabel>
+#include <QtGui/QTreeView>
+#include <QtGui/QVBoxLayout>
+#include <QtGui/QWidget>
+
+
+namespace Debugger {
+namespace Internal {
+
+///////////////////////////////////////////////////////////////////////
+//
+// TooltipTreeView
+//
+///////////////////////////////////////////////////////////////////////
+
+class ToolTipTreeView : public QTreeView
+{
+public:
+    ToolTipTreeView(QWidget *parent = 0) : QTreeView(parent) {}
+
+/*   
+    QSize sizeHint() const {
+        qDebug() << viewport()->size()
+            << viewport()->size().boundedTo(QSize(500, 300));
+        return viewport()->size().boundedTo(QSize(100, 100));
+    }
+*/
+};
+
+///////////////////////////////////////////////////////////////////////
+//
+// TooltipWidget
+//
+///////////////////////////////////////////////////////////////////////
+
+class ToolTipWidget : public QTreeView
+{
+    Q_OBJECT
+
+public:
+    ToolTipWidget(QWidget *parent);
+
+    void done();
+    void run(const QPoint &point, QAbstractItemModel *model,
+        const QModelIndex &index, const QString &msg);
+    bool eventFilter(QObject *ob, QEvent *ev);
+
+    QSize sizeHint() const { return m_size; }
+
+    int computeHeight(const QModelIndex &index)
+    {
+        int s = rowHeight(index);
+        for (int i = 0; i < model()->rowCount(index); ++i)
+            s += computeHeight(model()->index(i, 0, index));
+        return s;
+    }
+
+    Q_SLOT void computeSize() 
+    {
+        int columns = 0;
+        for (int i = 0; i < 3; ++i) {
+            resizeColumnToContents(i);
+            columns += sizeHintForColumn(i);
+        }
+        int rows = computeHeight(QModelIndex());
+        m_size = QSize(columns + 5, rows + 5);
+        setMinimumSize(m_size);
+        setMaximumSize(m_size);
+    }
+private:
+    QSize m_size;
+};
+
+static QPointer<ToolTipWidget> theToolTipWidget;
+
+
+ToolTipWidget::ToolTipWidget(QWidget *parent)
+    : QTreeView(parent)
+{
+    setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint);
+    setFocusPolicy(Qt::NoFocus);
+
+    header()->hide();
+
+    setUniformRowHeights(true);
+    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+    connect(this, SIGNAL(collapsed(QModelIndex)), this, SLOT(computeSize()),
+        Qt::QueuedConnection);
+    connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(computeSize()),
+        Qt::QueuedConnection);
+
+    qApp->installEventFilter(this);
+}
+
+bool ToolTipWidget::eventFilter(QObject *ob, QEvent *ev)
+{
+    Q_UNUSED(ob);
+    switch (ev->type()) {
+    case QEvent::ShortcutOverride:
+        if (static_cast<QKeyEvent *>(ev)->key() == Qt::Key_Escape)
+            return true;
+        break;
+    case QEvent::KeyPress:
+        if (static_cast<QKeyEvent *>(ev)->key() == Qt::Key_Escape) {
+            return true;
+        }
+        break;
+    case QEvent::KeyRelease:
+        if (static_cast<QKeyEvent *>(ev)->key() == Qt::Key_Escape) {
+            done();
+            return true;
+        }
+        break;
+    case QEvent::WindowDeactivate:
+    case QEvent::FocusOut:
+        done();
+        break;
+    default:
+        break;
+    }
+    return false;
+}
+
+void ToolTipWidget::done()
+{
+    qApp->removeEventFilter(this);
+    deleteLater();
+}
+
+void ToolTipWidget::run(const QPoint &point, QAbstractItemModel *model,
+    const QModelIndex &index, const QString &msg)
+{
+    move(point);
+    setModel(model);
+    setRootIndex(index.parent());
+    computeSize();
+    setRootIsDecorated(model->hasChildren(index));
+    // FIXME: use something more sensible
+    QPalette pal = palette();
+    QColor bg = pal.color(QPalette::Base);
+    bg.setAlpha(20);
+    pal.setColor(QPalette::Base, bg);
+    setPalette(pal);
+    //viewport()->setPalette(pal);
+}
+
+void showDebuggerToolTip(const QPoint &point, QAbstractItemModel *model,
+        const QModelIndex &index, const QString &msg)
+{
+    if (model) {
+        if (!theToolTipWidget)
+            theToolTipWidget = new ToolTipWidget(0);
+        theToolTipWidget->run(point, model, index, msg);
+        theToolTipWidget->show();
+    } else if (theToolTipWidget) {
+        theToolTipWidget->done();
+        theToolTipWidget = 0;
+    }
+}
+
+void hideDebuggerToolTip(int delay)
+{
+    Q_UNUSED(delay)
+    if (theToolTipWidget)
+        theToolTipWidget->done();
+}
+
+} // namespace Internal
+} // namespace Debugger
+
+#include "debuggertooltip.moc"
diff --git a/src/plugins/debugger/debuggertooltip.h b/src/plugins/debugger/debuggertooltip.h
new file mode 100644
index 0000000000000000000000000000000000000000..7111e80686536291cb42d38dbfb13e43e4efee94
--- /dev/null
+++ b/src/plugins/debugger/debuggertooltip.h
@@ -0,0 +1,53 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+**
+**************************************************************************/
+
+#ifndef DEBUGGER_DEBUGGERTOOLTIP_H
+#define DEBUGGER_DEBUGGERTOOLTIP_H
+
+#include <qglobal.h>
+
+QT_BEGIN_NAMESPACE
+class QAbstractItemModel;
+class QModelIndex;
+class QPoint;
+class QString;
+QT_END_NAMESPACE
+
+namespace Debugger {
+namespace Internal {
+
+void showDebuggerToolTip(const QPoint &point, QAbstractItemModel *model,
+        const QModelIndex &rootIndex, const QString &msg);
+
+void hideDebuggerToolTip(int delay = 0);
+
+} // namespace Internal
+} // namespace Debugger
+
+#endif // DEBUGGER_DEBUGGERTOOLTIP_H
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index d9a12155e3b894faef543fe7c15c4277b5066469..15c75713049471175ad972d2d63e4ac8d6221f5c 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -36,6 +36,7 @@
 #include "debuggeractions.h"
 #include "debuggerconstants.h"
 #include "debuggermanager.h"
+#include "debuggertooltip.h"
 #include "gdbmi.h"
 #include "procinterrupt.h"
 
@@ -65,7 +66,6 @@
 #include <QtGui/QLabel>
 #include <QtGui/QMainWindow>
 #include <QtGui/QMessageBox>
-#include <QtGui/QToolTip>
 #include <QtGui/QDialogButtonBox>
 #include <QtGui/QPushButton>
 #ifdef Q_OS_WIN
@@ -103,8 +103,6 @@ static int &currentToken()
     return token;
 }
 
-static const QString tooltipIName = _("tooltip");
-
 ///////////////////////////////////////////////////////////////////////
 //
 // GdbEngine
@@ -2610,18 +2608,42 @@ bool GdbEngine::supportsThreads() const
     return m_gdbVersion > 60500;
 }
 
+
 //////////////////////////////////////////////////////////////////////
 //
 // Tooltip specific stuff
 //
 //////////////////////////////////////////////////////////////////////
 
-static WatchData m_toolTip;
 static QString m_toolTipExpression;
 static QPoint m_toolTipPos;
-static QMap<QString, WatchData> m_toolTipCache;
 
-void GdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos)
+static QString tooltipINameForExpression(const QString &exp)
+{
+    // FIXME: 'exp' can contain illegal characters
+    //return QLatin1String("tooltip.") + exp;
+    Q_UNUSED(exp);
+    return QLatin1String("tooltip.x");
+}
+
+bool GdbEngine::showToolTip()
+{
+    WatchHandler *handler = qq->watchHandler();
+    WatchModel *model = handler->model(TooltipsWatch);
+    QString iname = tooltipINameForExpression(m_toolTipExpression);
+    model->setActiveData(iname);
+    WatchItem *item = model->findItem(iname, model->dummyRoot());
+    if (!item) {
+        hideDebuggerToolTip();
+        return false;
+    }
+    QModelIndex index = model->watchIndex(item);
+    showDebuggerToolTip(m_toolTipPos, model, index, m_toolTipExpression);
+    return true;
+}
+
+void GdbEngine::setToolTipExpression(const QPoint &mousePos,
+    TextEditor::ITextEditor *editor, int cursorPos)
 {
     if (q->status() != DebuggerInferiorStopped || !isCppEditor(editor)) {
         //qDebug() << "SUPPRESSING DEBUGGER TOOLTIP, INFERIOR NOT STOPPED/Non Cpp editor";
@@ -2635,30 +2657,21 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEd
 
     m_toolTipPos = mousePos;
     int line, column;
-    m_toolTipExpression = cppExpressionAt(editor, cursorPos, &line, &column);
-    QString exp = m_toolTipExpression;
-/*
-    if (m_toolTip.isTypePending()) {
-        qDebug() << "suppressing duplicated tooltip creation";
-        return;
-    }
-*/
-    if (m_toolTipCache.contains(exp)) {
-        const WatchData & data = m_toolTipCache[exp];
-        // FIXME: qq->watchHandler()->collapseChildren(data.iname);
-        insertData(data);
-        return;
-    }
+    QString exp = cppExpressionAt(editor, cursorPos, &line, &column);
+    m_toolTipExpression = exp;
+
+    // FIXME: enable caching
+    //if (showToolTip())
+    //    return;
 
-    QToolTip::hideText();
     if (exp.isEmpty() || exp.startsWith(_c('#')))  {
-        QToolTip::hideText();
+        //QToolTip::hideText();
         return;
     }
 
     if (!hasLetterOrNumber(exp)) {
-        QToolTip::showText(m_toolTipPos,
-            tr("'%1' contains no identifier").arg(exp));
+        //QToolTip::showText(m_toolTipPos,
+        //    tr("'%1' contains no identifier").arg(exp));
         return;
     }
 
@@ -2666,7 +2679,7 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEd
         return;
 
     if (exp.startsWith(_c('"')) && exp.endsWith(_c('"')))  {
-        QToolTip::showText(m_toolTipPos, tr("String literal %1").arg(exp));
+        //QToolTip::showText(m_toolTipPos, tr("String literal %1").arg(exp));
         return;
     }
 
@@ -2680,9 +2693,9 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEd
         return;
 
     if (hasSideEffects(exp)) {
-        QToolTip::showText(m_toolTipPos,
-            tr("Cowardly refusing to evaluate expression '%1' "
-               "with potential side effects").arg(exp));
+        //QToolTip::showText(m_toolTipPos,
+        //    tr("Cowardly refusing to evaluate expression '%1' "
+        //       "with potential side effects").arg(exp));
         return;
     }
 
@@ -2703,19 +2716,12 @@ void GdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEd
     }
 */
 
-    //if (m_manager->status() != DebuggerInferiorStopped)
-    //    return;
-
-    // FIXME: 'exp' can contain illegal characters
-    m_toolTip = WatchData();
-    //m_toolTip.level = 0;
-   // m_toolTip.row = 0;
-   // m_toolTip.parentIndex = 2;
-    m_toolTip.exp = exp;
-    m_toolTip.name = exp;
-    m_toolTip.iname = tooltipIName;
-    insertData(m_toolTip);
-    //updateWatchModel2();
+    WatchData toolTip;
+    toolTip.exp = exp;
+    toolTip.name = exp;
+    toolTip.iname = tooltipINameForExpression(exp);
+    qq->watchHandler()->removeData(toolTip.iname);
+    qq->watchHandler()->insertData(toolTip);
 }
 
 
@@ -3073,18 +3079,7 @@ void GdbEngine::rebuildModel()
     emit gdbInputAvailable(LogStatus, _("<Rebuild Watchmodel>"));
     q->showStatusMessage(tr("Finished retrieving data."), 400);
     qq->watchHandler()->endCycle();
-
-    if (!m_toolTipExpression.isEmpty()) {
-        WatchData *item = qq->watchHandler()->findItem(tooltipIName);
-        if (item) {
-            //m_toolTipCache[data->exp] = *data;
-            QToolTip::showText(m_toolTipPos,
-               _c('(') + item->type + _(") ") + item->exp + _(" = ") + item->value);
-        } else {
-            QToolTip::showText(m_toolTipPos,
-                tr("Cannot evaluate expression: %1").arg(m_toolTipExpression));
-        }
-    }
+    showToolTip();
 }
 
 void GdbEngine::handleQueryDebuggingHelper(const GdbResultRecord &record, const QVariant &)
@@ -3465,7 +3460,7 @@ void GdbEngine::updateLocals()
     m_pendingRequests = 0;
 
     PENDING_DEBUG("\nRESET PENDING");
-    m_toolTipCache.clear();
+    //m_toolTipCache.clear();
     m_toolTipExpression.clear();
     qq->watchHandler()->beginCycle();
 
@@ -3596,44 +3591,6 @@ void GdbEngine::insertData(const WatchData &data0)
     qq->watchHandler()->insertData(data);
 }
 
-void GdbEngine::handleTypeContents(const QString &output)
-{
-    // output.startsWith("type = ") == true
-    // "type = int"
-    // "type = class QString {"
-    // "type = class QStringList : public QList<QString> {"
-    QString tip;
-    QString className;
-    if (output.startsWith(__("type = class"))) {
-        int posBrace = output.indexOf(_c('{'));
-        QString head = output.mid(13, posBrace - 13 - 1);
-        int posColon = head.indexOf(__(": public"));
-        if (posColon == -1)
-            posColon = head.indexOf(__(": protected"));
-        if (posColon == -1)
-            posColon = head.indexOf(__(": private"));
-        if (posColon == -1) {
-            className = head;
-            tip = _("class ") + className + _(" { ... }");
-        } else {
-            className = head.left(posColon - 1);
-            tip = _("class ") + head + _(" { ... }");
-        }
-        //qDebug() << "posColon:" << posColon;
-        //qDebug() << "posBrace:" << posBrace;
-        //qDebug() << "head:" << head;
-    } else {
-        className = output.mid(7);
-        tip = className;
-    }
-    //qDebug() << "output:" << output.left(100) + "...";
-    //qDebug() << "className:" << className;
-    //qDebug() << "tip:" << tip;
-    //m_toolTip.type = className;
-    m_toolTip.type.clear();
-    m_toolTip.value = tip;
-}
-
 void GdbEngine::handleVarListChildrenHelper(const GdbMi &item,
     const WatchData &parent)
 {
@@ -3775,6 +3732,7 @@ void GdbEngine::handleVarListChildren(const GdbResultRecord &record,
     }
 }
 
+/*
 void GdbEngine::handleToolTip(const GdbResultRecord &record,
         const QVariant &cookie)
 {
@@ -3826,6 +3784,7 @@ void GdbEngine::handleToolTip(const GdbResultRecord &record,
     QTimer::singleShot(0, this, SLOT(updateWatchModel2()));
     qDebug() << "HANDLE TOOLTIP END";
 }
+*/
 
 #if 0
 void GdbEngine::handleChangedItem(QStandardItem *item)
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 6ec7818266f8c089c62ab3ed2220fdced55eb011..552ae564447260a8f7271e9b283497a0e5897740 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -221,6 +221,7 @@ private:
     void handleSetTargetAsync(const GdbResultRecord &, const QVariant &);
     void handleTargetRemote(const GdbResultRecord &, const QVariant &);
     void debugMessage(const QString &msg);
+    bool showToolTip();
 
     const bool m_dumperInjectionLoad;
 
@@ -327,7 +328,6 @@ private:
     void sendWatchParameters(const QByteArray &params0);
     void createGdbVariable(const WatchData &data);
 
-    void handleTypeContents(const QString &output);
     void maybeHandleInferiorPidChanged(const QString &pid);
 
     void tryLoadDebuggingHelpers();
@@ -344,8 +344,8 @@ private:
     void handleVarAssign(const GdbResultRecord &, const QVariant &);
     void handleEvaluateExpression(const GdbResultRecord &record,
         const QVariant &cookie);
-    void handleToolTip(const GdbResultRecord &record,
-        const QVariant &cookie);
+    //void handleToolTip(const GdbResultRecord &record,
+    //    const QVariant &cookie);
     void handleQueryDebuggingHelper(const GdbResultRecord &record, const QVariant &);
     void handleDebuggingHelperValue1(const GdbResultRecord &record,
         const QVariant &cookie);
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 79e67dd868572d5e160fc6c58629019d1e648a1b..57cb69c0964645e4d15d3d0129795e51ba46ee26 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -54,8 +54,8 @@
 
 // creates debug output regarding pending watch data results
 //#define DEBUG_PENDING 1
-//// creates debug output for accesses to the itemmodel
-#define DEBUG_MODEL 1
+// creates debug output for accesses to the model
+//#define DEBUG_MODEL 1
 
 #if DEBUG_MODEL
 #   define MODEL_DEBUG(s) qDebug() << s
@@ -611,6 +611,10 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
         case ExpandedRole:
             return m_handler->m_expandedINames.contains(data.iname);
             //FIXME return node < 4 || m_expandedINames.contains(data.iname);
+
+        case ActiveDataRole:
+            qDebug() << "ASK FOR" << data.iname;
+            return true;
     
         default:
             break; 
@@ -848,7 +852,7 @@ void WatchHandler::cleanup()
 
 void WatchHandler::insertData(const WatchData &data)
 {
-    //MODEL_DEBUG("INSERTDATA: " << data.toString());
+    MODEL_DEBUG("INSERTDATA: " << data.toString());
     QTC_ASSERT(data.isValid(), return);
     if (data.isSomethingNeeded()) {
         emit watchDataUpdateNeeded(data);
@@ -859,6 +863,16 @@ void WatchHandler::insertData(const WatchData &data)
     }
 }
 
+void WatchHandler::removeData(const QString &iname)
+{
+    WatchModel *model = modelForIName(iname);
+    if (!model)
+        return;
+    WatchItem *item = model->findItem(iname, model->m_root);
+    if (item)
+        model->removeItem(item);
+}
+
 void WatchHandler::watchExpression()
 {
     if (QAction *action = qobject_cast<QAction *>(sender()))
@@ -1058,7 +1072,7 @@ WatchModel *WatchHandler::modelForIName(const QString &iname) const
         return m_locals;
     if (iname.startsWith(QLatin1String("watch.")))
         return m_watchers;
-    if (iname.startsWith(QLatin1String("tooltip.")))
+    if (iname.startsWith(QLatin1String("tooltip")))
         return m_tooltips;
     QTC_ASSERT(false, /**/);
     return 0;
@@ -1076,5 +1090,6 @@ QString WatchHandler::watcherEditPlaceHolder()
     static const QString rc = tr("<Edit>");
     return rc;
 }
+
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 9cc817b39c154031e662b843d46f973aa366cc6c..2ee1cb10746aed776bbc12e1377c2996d911bdb2 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -135,7 +135,13 @@ public:
     bool changed;
 };
 
-enum { INameRole = Qt::UserRole, ExpressionRole, ExpandedRole };
+enum WatchRoles
+{
+    INameRole = Qt::UserRole,
+    ExpressionRole,
+    ExpandedRole,
+    ActiveDataRole,  // used for tooltip
+};
 
 class WatchModel : public QAbstractItemModel
 {
@@ -158,6 +164,8 @@ private:
     void fetchMore(const QModelIndex &parent);
 
     friend class WatchHandler;
+    friend class GdbEngine;
+
     WatchItem *watchItem(const QModelIndex &) const;
     QModelIndex watchIndex(const WatchItem *needle) const;
     QModelIndex watchIndexHelper(const WatchItem *needle,
@@ -170,11 +178,13 @@ private:
     void removeOutdatedHelper(WatchItem *item);
     WatchItem *dummyRoot() const;
     void removeItem(WatchItem *item);
+    void setActiveData(const QString &data) { m_activeData = data; }
 
 private:
     WatchHandler *m_handler;
     WatchType m_type;
     WatchItem *m_root;
+    QString m_activeData;
 };
 
 class WatchHandler : public QObject
@@ -198,6 +208,7 @@ public:
     void showEditValue(const WatchData &data);
 
     void insertData(const WatchData &data);
+    void removeData(const QString &iname);
     WatchData *findItem(const QString &iname) const;
 
     void loadSessionData();
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 9a11053dad52c97b4b07abca5d5a2219e0b9e07b..7fedf1520bfe0e27ec8c3a24df76020595e4c18e 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -44,7 +44,6 @@
 #include <QtGui/QLineEdit>
 #include <QtGui/QMenu>
 #include <QtGui/QResizeEvent>
-#include <QtGui/QSplitter>
 
 using namespace Debugger::Internal;
 
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index d7d7f8108162d834571e625cee5ceb246434cea8..a3a004cfc52eede16533f6cbdfda6ffa5be4b04e 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -335,11 +335,6 @@ void testQList()
     lu.append(102);
     lu.append(102);
     lu.append(102);
-    lu.append(102);
-    lu.append(102);
-    lu.append(102);
-    lu.append(102);
-    lu.append(102);
 
     QList<uint> i;
     i.append(42);
@@ -347,6 +342,18 @@ void testQList()
     i.append(44);
     i.append(45);
 
+    QList<ushort> ls;
+    ls.append(42);
+    ls.append(43);
+    ls.append(44);
+    ls.append(45);
+
+    QList<QChar> lc;
+    lc.append(QChar('a'));
+    lc.append(QChar('b'));
+    lc.append(QChar('c'));
+    lc.append(QChar('d'));
+
     QList<qulonglong> l;
     l.append(42);
     l.append(43);