diff --git a/src/plugins/qtscripteditor/qtscripteditor.cpp b/src/plugins/qtscripteditor/qtscripteditor.cpp
index e33a1f85263f3910602deca0c8c3616b62257004..dbab0ba888dc5c79e288acad70e675ce0e6d681e 100644
--- a/src/plugins/qtscripteditor/qtscripteditor.cpp
+++ b/src/plugins/qtscripteditor/qtscripteditor.cpp
@@ -32,6 +32,13 @@
 #include "qtscripthighlighter.h"
 #include "qtscripteditorplugin.h"
 
+#include "parser/javascriptengine_p.h"
+#include "parser/javascriptparser_p.h"
+#include "parser/javascriptlexer_p.h"
+#include "parser/javascriptnodepool_p.h"
+#include "parser/javascriptastvisitor_p.h"
+#include "parser/javascriptast_p.h"
+
 #include <indenter.h>
 
 #include <coreplugin/icore.h>
@@ -42,6 +49,11 @@
 #include <texteditor/texteditorconstants.h>
 
 #include <QtGui/QMenu>
+#include <QtCore/QTimer>
+
+enum {
+    UPDATE_DOCUMENT_DEFAULT_INTERVAL = 100
+};
 
 namespace QtScriptEditor {
 namespace Internal {
@@ -64,6 +76,14 @@ ScriptEditor::ScriptEditor(const Context &context,
     setCodeFoldingVisible(true);
     setMimeType(QtScriptEditor::Constants::C_QTSCRIPTEDITOR_MIMETYPE);
 
+    m_updateDocumentTimer = new QTimer(this);
+    m_updateDocumentTimer->setInterval(UPDATE_DOCUMENT_DEFAULT_INTERVAL);
+    m_updateDocumentTimer->setSingleShot(true);
+
+    connect(m_updateDocumentTimer, SIGNAL(timeout()), this, SLOT(updateDocumentNow()));
+
+    connect(this, SIGNAL(textChanged()), this, SLOT(updateDocument()));
+
     baseTextDocument()->setSyntaxHighlighter(new QtScriptHighlighter);
 }
 
@@ -94,6 +114,55 @@ ScriptEditor::Context ScriptEditorEditable::context() const
     return m_context;
 }
 
+void ScriptEditor::updateDocument()
+{
+    m_updateDocumentTimer->start(UPDATE_DOCUMENT_DEFAULT_INTERVAL);
+}
+
+void ScriptEditor::updateDocumentNow()
+{
+    // ### move in the parser thread.
+
+    m_updateDocumentTimer->stop();
+
+    const QString fileName = file()->fileName();
+    const QString code = toPlainText();
+
+    JavaScriptParser parser;
+    JavaScriptEnginePrivate driver;
+
+    JavaScript::NodePool nodePool(fileName, &driver);
+    driver.setNodePool(&nodePool);
+
+    JavaScript::Lexer lexer(&driver);
+    lexer.setCode(code, /*line = */ 1);
+    driver.setLexer(&lexer);
+
+    QList<QTextEdit::ExtraSelection> selections;
+
+    if (parser.parse(&driver)) {
+        // do something here
+    } else {
+        QTextEdit::ExtraSelection sel;
+        sel.format.setUnderlineColor(Qt::red);
+        sel.format.setUnderlineStyle(QTextCharFormat::WaveUnderline);
+
+        const int line = parser.errorLineNumber();
+
+        QTextCursor c(document()->findBlockByNumber(line - 1));
+        sel.cursor = c;
+
+        if (parser.errorColumnNumber() > 1)
+            sel.cursor.setPosition(c.position() + parser.errorColumnNumber() - 1);
+
+        sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+
+        selections.append(sel);
+    }
+
+    setExtraSelections(CodeWarningsSelection, selections);
+}
+
 void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs)
 {
     TextEditor::BaseTextEditor::setFontSettings(fs);
diff --git a/src/plugins/qtscripteditor/qtscripteditor.h b/src/plugins/qtscripteditor/qtscripteditor.h
index a38640a0665c7b65b40b25e67a93bf057db11a36..2e8b157f20f548c871b7ef5a53285a7ba33270b7 100644
--- a/src/plugins/qtscripteditor/qtscripteditor.h
+++ b/src/plugins/qtscripteditor/qtscripteditor.h
@@ -31,6 +31,7 @@
 #define QTSCRIPTDITORW_H
 
 #include <texteditor/basetexteditor.h>
+#include <QTimer>
 
 namespace Core {
     class ICore;
@@ -76,6 +77,10 @@ public:
 public slots:
     virtual void setFontSettings(const TextEditor::FontSettings &);
 
+private slots:
+    void updateDocument();
+    void updateDocumentNow();
+
 protected:
     void contextMenuEvent(QContextMenuEvent *e);
     TextEditor::BaseTextEditorEditable *createEditableInterface() { return new ScriptEditorEditable(this, m_context); }
@@ -86,6 +91,8 @@ private:
 
     const Context m_context;
     TextEditor::TextEditorActionHandler *m_ah;
+
+    QTimer *m_updateDocumentTimer;
 };
 
 } // namespace Internal