diff --git a/src/plugins/duieditor/duieditor.cpp b/src/plugins/duieditor/duieditor.cpp
index 351037cc10e23909bbc71c29fe89c2a72c399e3c..a9926f5b92d6d179260848ebc268feac5afb470c 100644
--- a/src/plugins/duieditor/duieditor.cpp
+++ b/src/plugins/duieditor/duieditor.cpp
@@ -446,20 +446,24 @@ void ScriptEditor::updateDocumentNow()
 
     QTextEdit::ExtraSelection sel;
 
-    foreach (const JavaScriptParser::DiagnosticMessage &d, parser.diagnosticMessages()) {
-        if (d.isWarning())
-            continue;
+    m_diagnosticMessages = parser.diagnosticMessages();
 
-        int line = d.line;
-        int column = d.column;
+    foreach (const JavaScriptParser::DiagnosticMessage &d, m_diagnosticMessages) {
+        int line = d.loc.startLine;
+        int column = d.loc.startColumn;
 
         if (column == 0)
             column = 1;
 
         QTextCursor c(document()->findBlockByNumber(line - 1));
         sel.cursor = c;
+
         sel.cursor.setPosition(c.position() + column - 1);
-        sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+        if (sel.cursor.atBlockEnd())
+            sel.cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
+        else
+            sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+
         sel.format = errorFormat;
 
         selections.append(sel);
diff --git a/src/plugins/duieditor/duieditor.h b/src/plugins/duieditor/duieditor.h
index da603249a7faa18099e39e45cfd9f87d81f450f3..6807c3ff4270de5d4a8e977dd867f7301d819ce5 100644
--- a/src/plugins/duieditor/duieditor.h
+++ b/src/plugins/duieditor/duieditor.h
@@ -32,6 +32,7 @@
 
 #include <texteditor/basetexteditor.h>
 #include <parser/javascriptast_p.h>
+#include <parser/javascriptparser_p.h>
 
 QT_BEGIN_NAMESPACE
 class QComboBox;
@@ -51,6 +52,8 @@ class ScriptEditor;
 
 class ScriptEditorEditable : public TextEditor::BaseTextEditorEditable
 {
+    Q_OBJECT
+
 public:
     ScriptEditorEditable(ScriptEditor *, const QList<int> &);
     QList<int> context() const;
@@ -94,6 +97,9 @@ public:
     QList<Declaration> declarations() const;
     QStringList words() const;
 
+    QList<JavaScriptParser::DiagnosticMessage> diagnosticMessages() const
+    { return m_diagnosticMessages; }
+
 public slots:
     virtual void setFontSettings(const TextEditor::FontSettings &);
 
@@ -126,6 +132,7 @@ private:
     QList<Declaration> m_declarations;
     QStringList m_words;
     QMap<QString, QList<JavaScript::AST::SourceLocation> > m_ids; // ### use QMultiMap
+    QList<JavaScriptParser::DiagnosticMessage> m_diagnosticMessages;
 };
 
 } // namespace Internal
diff --git a/src/plugins/duieditor/duieditor.pro b/src/plugins/duieditor/duieditor.pro
index 9149293c5164ecae1e1ae25d6a08521a2f98e8d7..a2633e9d4de94cd40c07d20da55e8d7c67d9788f 100644
--- a/src/plugins/duieditor/duieditor.pro
+++ b/src/plugins/duieditor/duieditor.pro
@@ -19,13 +19,15 @@ duieditorplugin.h \
 duihighlighter.h \
 duieditoractionhandler.h \
 duicodecompletion.h \
-duieditorconstants.h
+duieditorconstants.h \
+duihoverhandler.h
 
 SOURCES += duieditor.cpp \
 duieditorfactory.cpp \
 duieditorplugin.cpp \
 duihighlighter.cpp \
 duieditoractionhandler.cpp \
-duicodecompletion.cpp
+duicodecompletion.cpp \
+duihoverhandler.cpp
 
 RESOURCES += duieditor.qrc
diff --git a/src/plugins/duieditor/duieditorplugin.cpp b/src/plugins/duieditor/duieditorplugin.cpp
index 99668926a28540a29c5cb1d1bae1582e8aa3ecff..faa7d07dba125616029408326b6e0bfdbcfd17eb 100644
--- a/src/plugins/duieditor/duieditorplugin.cpp
+++ b/src/plugins/duieditor/duieditorplugin.cpp
@@ -34,6 +34,7 @@
 #include "duieditorconstants.h"
 #include "duieditorfactory.h"
 #include "duicodecompletion.h"
+#include "duihoverhandler.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/coreconstants.h>
@@ -112,6 +113,8 @@ bool DuiEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
     m_completion = new DuiCodeCompletion();
     addAutoReleasedObject(m_completion);
 
+    addAutoReleasedObject(new DuiHoverHandler());
+
     // Restore settings
     QSettings *settings = Core::ICore::instance()->settings();
     settings->beginGroup(QLatin1String("CppTools")); // ### FIXME:
diff --git a/src/plugins/duieditor/duihoverhandler.cpp b/src/plugins/duieditor/duihoverhandler.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d5a8dba030e4b3cb85efdccb158ce22d742e7771
--- /dev/null
+++ b/src/plugins/duieditor/duihoverhandler.cpp
@@ -0,0 +1,122 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (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 qt-sales@nokia.com.
+**
+**************************************************************************/
+
+#include "duihoverhandler.h"
+#include "duieditor.h"
+
+#include <coreplugin/icore.h>
+#include <coreplugin/uniqueidmanager.h>
+#include <coreplugin/editormanager/editormanager.h>
+#include <extensionsystem/pluginmanager.h>
+#include <texteditor/itexteditor.h>
+#include <texteditor/basetexteditor.h>
+#include <debugger/debuggerconstants.h>
+
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtCore/QSettings>
+#include <QtGui/QToolTip>
+#include <QtGui/QTextCursor>
+#include <QtGui/QTextBlock>
+#include <QtHelp/QHelpEngineCore>
+
+using namespace DuiEditor::Internal;
+using namespace Core;
+
+DuiHoverHandler::DuiHoverHandler(QObject *parent)
+    : QObject(parent)
+{
+    ICore *core = ICore::instance();
+
+    // Listen for editor opened events in order to connect to tooltip/helpid requests
+    connect(core->editorManager(), SIGNAL(editorOpened(Core::IEditor *)),
+            this, SLOT(editorOpened(Core::IEditor *)));
+}
+
+void DuiHoverHandler::editorOpened(IEditor *editor)
+{
+    ScriptEditorEditable *duiEditor = qobject_cast<ScriptEditorEditable *>(editor);
+    if (!duiEditor)
+        return;
+
+    qDebug() << "connected for editor:" << editor->file()->fileName();
+
+    connect(duiEditor, SIGNAL(tooltipRequested(TextEditor::ITextEditor*, QPoint, int)),
+            this, SLOT(showToolTip(TextEditor::ITextEditor*, QPoint, int)));
+
+    connect(duiEditor, SIGNAL(contextHelpIdRequested(TextEditor::ITextEditor*, int)),
+            this, SLOT(updateContextHelpId(TextEditor::ITextEditor*, int)));
+}
+
+void DuiHoverHandler::showToolTip(TextEditor::ITextEditor *editor, const QPoint &point, int pos)
+{
+    if (! editor)
+        return;
+
+    ScriptEditor *ed = qobject_cast<ScriptEditor *>(editor->widget());
+
+    ICore *core = ICore::instance();
+    const int dbgcontext = core->uniqueIDManager()->uniqueIdentifier(Debugger::Constants::C_GDBDEBUGGER);
+
+    if (core->hasContext(dbgcontext))
+        return;
+
+    m_toolTip.clear();
+
+    QTextCursor tc = ed->textCursor();
+    tc.setPosition(pos);
+    const unsigned line = tc.block().blockNumber() + 1;
+
+    foreach (const JavaScriptParser::DiagnosticMessage &m, ed->diagnosticMessages()) {
+        if (m.loc.startLine == line) {
+            m_toolTip.append(m.message);
+            break;
+        }
+    }
+
+    if (m_toolTip.isEmpty())
+        QToolTip::hideText();
+    else {
+        const QPoint pnt = point - QPoint(0,
+#ifdef Q_WS_WIN
+        24
+#else
+        16
+#endif
+        );
+
+        QToolTip::showText(pnt, m_toolTip);
+    }
+}
+
+void DuiHoverHandler::updateContextHelpId(TextEditor::ITextEditor *, int)
+{
+}
+
diff --git a/src/plugins/duieditor/duihoverhandler.h b/src/plugins/duieditor/duihoverhandler.h
new file mode 100644
index 0000000000000000000000000000000000000000..9cde98ae2884f907b3756eb3bfe2b8324ee3be4d
--- /dev/null
+++ b/src/plugins/duieditor/duihoverhandler.h
@@ -0,0 +1,71 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (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 qt-sales@nokia.com.
+**
+**************************************************************************/
+
+#ifndef DUIHOVERHANDLER_H
+#define DUIHOVERHANDLER_H
+
+#include <QtCore/QObject>
+
+QT_BEGIN_NAMESPACE
+class QPoint;
+QT_END_NAMESPACE
+
+namespace Core {
+class IEditor;
+}
+
+namespace TextEditor {
+class ITextEditor;
+}
+
+namespace DuiEditor {
+namespace Internal {
+
+class DuiHoverHandler : public QObject
+{
+    Q_OBJECT
+
+public:
+    DuiHoverHandler(QObject *parent = 0);
+
+public slots:
+    void showToolTip(TextEditor::ITextEditor *editor, const QPoint &point, int pos);
+    void updateContextHelpId(TextEditor::ITextEditor *editor, int pos);
+
+private slots:
+    void editorOpened(Core::IEditor *editor);
+
+private:
+    QString m_toolTip;
+};
+
+} // namespace Internal
+} // namespace DuiEditor
+
+#endif // DUIHOVERHANDLER_H