diff --git a/src/plugins/duieditor/duicodecompletion.cpp b/src/plugins/duieditor/duicodecompletion.cpp
index c0b0de1af748965fb3e587a148a3c4a0bd39c5b8..cceca642d2f4bdf09e2b659e124e6e8e0e041e7b 100644
--- a/src/plugins/duieditor/duicodecompletion.cpp
+++ b/src/plugins/duieditor/duicodecompletion.cpp
@@ -49,10 +49,13 @@ int DuiCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
     m_startPosition = pos;
     m_completions.clear();
 
-    foreach (const QString &word, edit->words()) {
-        if (word.isEmpty())
-            continue;
+    foreach (const QString &word, edit->keywords()) {
+        TextEditor::CompletionItem item(this);
+        item.m_text = word;
+        m_completions.append(item);
+    }
 
+    foreach (const QString &word, edit->words()) {
         TextEditor::CompletionItem item(this);
         item.m_text = word;
         m_completions.append(item);
diff --git a/src/plugins/duieditor/duieditor.cpp b/src/plugins/duieditor/duieditor.cpp
index 134baa059fddb40f33503e485c87e7ae923449f6..e07dd584744c502eecf3a494878fa7f575fbad4f 100644
--- a/src/plugins/duieditor/duieditor.cpp
+++ b/src/plugins/duieditor/duieditor.cpp
@@ -577,6 +577,19 @@ void ScriptEditor::renameIdUnderCursor()
     }
 }
 
+QStringList ScriptEditor::keywords() const
+{
+    QStringList words;
+
+    if (DuiHighlighter *highlighter = qobject_cast<DuiHighlighter*>(baseTextDocument()->syntaxHighlighter())) {
+        words = highlighter->keywords().toList();
+        words.append(QLatin1String("property")); // ### move
+        words.append(QLatin1String("signal")); // ### move
+    }
+
+    return words;
+}
+
 void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs)
 {
     TextEditor::BaseTextEditor::setFontSettings(fs);
@@ -696,12 +709,12 @@ void ScriptEditor::contextMenuEvent(QContextMenuEvent *e)
     const QList<AST::SourceLocation> &locations = m_ids.value(id);
     if (! locations.isEmpty()) {
         menu->addSeparator();
-        QAction *a = menu->addAction(tr("Rename '%1'...").arg(wordUnderCursor()));
+        QAction *a = menu->addAction(tr("Rename id '%1'...").arg(id));
         connect(a, SIGNAL(triggered()), this, SLOT(renameIdUnderCursor()));
     }
 
     menu->exec(e->globalPos());
-    delete menu;
+    menu->deleteLater();
 }
 
 } // namespace Internal
diff --git a/src/plugins/duieditor/duieditor.h b/src/plugins/duieditor/duieditor.h
index 6807c3ff4270de5d4a8e977dd867f7301d819ce5..33d52bc95251ae9bb3416aa617aba6fd4f40cb16 100644
--- a/src/plugins/duieditor/duieditor.h
+++ b/src/plugins/duieditor/duieditor.h
@@ -96,6 +96,7 @@ public:
 
     QList<Declaration> declarations() const;
     QStringList words() const;
+    QStringList keywords() const;
 
     QList<JavaScriptParser::DiagnosticMessage> diagnosticMessages() const
     { return m_diagnosticMessages; }
diff --git a/src/shared/qscripthighlighter/qscripthighlighter.cpp b/src/shared/qscripthighlighter/qscripthighlighter.cpp
index f56ccd6dceadeb45b382da4756255b64798982d5..f01047117e510ecbde29aeca3abf41185c14e1bb 100644
--- a/src/shared/qscripthighlighter/qscripthighlighter.cpp
+++ b/src/shared/qscripthighlighter/qscripthighlighter.cpp
@@ -32,82 +32,75 @@
 #include <QtCore/QSet>
 #include <QtCore/QtAlgorithms>
 
-static const QSet<QString> &qscriptKeywords() {
-    static QSet<QString> keywords;
-    if (keywords.empty()) {
-        keywords.insert(QLatin1String("Infinity"));
-        keywords.insert(QLatin1String("NaN"));
-        keywords.insert(QLatin1String("abstract"));
-        keywords.insert(QLatin1String("boolean"));
-        keywords.insert(QLatin1String("break"));
-        keywords.insert(QLatin1String("byte"));
-        keywords.insert(QLatin1String("case"));
-        keywords.insert(QLatin1String("catch"));
-        keywords.insert(QLatin1String("char"));
-        keywords.insert(QLatin1String("class"));
-        keywords.insert(QLatin1String("const"));
-        keywords.insert(QLatin1String("constructor"));
-        keywords.insert(QLatin1String("continue"));
-        keywords.insert(QLatin1String("debugger"));
-        keywords.insert(QLatin1String("default"));
-        keywords.insert(QLatin1String("delete"));
-        keywords.insert(QLatin1String("do"));
-        keywords.insert(QLatin1String("double"));
-        keywords.insert(QLatin1String("else"));
-        keywords.insert(QLatin1String("enum"));
-        keywords.insert(QLatin1String("export"));
-        keywords.insert(QLatin1String("extends"));
-        keywords.insert(QLatin1String("false"));
-        keywords.insert(QLatin1String("final"));
-        keywords.insert(QLatin1String("finally"));
-        keywords.insert(QLatin1String("float"));
-        keywords.insert(QLatin1String("for"));
-        keywords.insert(QLatin1String("function"));
-        keywords.insert(QLatin1String("goto"));
-        keywords.insert(QLatin1String("if"));
-        keywords.insert(QLatin1String("implements"));
-        keywords.insert(QLatin1String("import"));
-        keywords.insert(QLatin1String("in"));
-        keywords.insert(QLatin1String("instanceof"));
-        keywords.insert(QLatin1String("int"));
-        keywords.insert(QLatin1String("interface"));
-        keywords.insert(QLatin1String("long"));
-        keywords.insert(QLatin1String("native"));
-        keywords.insert(QLatin1String("new"));
-        keywords.insert(QLatin1String("package"));
-        keywords.insert(QLatin1String("private"));
-        keywords.insert(QLatin1String("protected"));
-        keywords.insert(QLatin1String("public"));
-        keywords.insert(QLatin1String("return"));
-        keywords.insert(QLatin1String("short"));
-        keywords.insert(QLatin1String("static"));
-        keywords.insert(QLatin1String("super"));
-        keywords.insert(QLatin1String("switch"));
-        keywords.insert(QLatin1String("synchronized"));
-        keywords.insert(QLatin1String("this"));
-        keywords.insert(QLatin1String("throw"));
-        keywords.insert(QLatin1String("throws"));
-        keywords.insert(QLatin1String("transient"));
-        keywords.insert(QLatin1String("true"));
-        keywords.insert(QLatin1String("try"));
-        keywords.insert(QLatin1String("typeof"));
-        keywords.insert(QLatin1String("undefined"));
-        keywords.insert(QLatin1String("var"));
-        keywords.insert(QLatin1String("void"));
-        keywords.insert(QLatin1String("volatile"));
-        keywords.insert(QLatin1String("while"));
-        keywords.insert(QLatin1String("with"));    // end
-    }
-    return keywords;
-}
-
-
 namespace SharedTools {
 
 QScriptHighlighter::QScriptHighlighter(QTextDocument *parent)
     : QSyntaxHighlighter(parent),
       m_duiEnabled(false)
 {
+    qscriptKeywords.insert(QLatin1String("Infinity"));
+    qscriptKeywords.insert(QLatin1String("NaN"));
+    qscriptKeywords.insert(QLatin1String("abstract"));
+    qscriptKeywords.insert(QLatin1String("boolean"));
+    qscriptKeywords.insert(QLatin1String("break"));
+    qscriptKeywords.insert(QLatin1String("byte"));
+    qscriptKeywords.insert(QLatin1String("case"));
+    qscriptKeywords.insert(QLatin1String("catch"));
+    qscriptKeywords.insert(QLatin1String("char"));
+    qscriptKeywords.insert(QLatin1String("class"));
+    qscriptKeywords.insert(QLatin1String("const"));
+    qscriptKeywords.insert(QLatin1String("constructor"));
+    qscriptKeywords.insert(QLatin1String("continue"));
+    qscriptKeywords.insert(QLatin1String("debugger"));
+    qscriptKeywords.insert(QLatin1String("default"));
+    qscriptKeywords.insert(QLatin1String("delete"));
+    qscriptKeywords.insert(QLatin1String("do"));
+    qscriptKeywords.insert(QLatin1String("double"));
+    qscriptKeywords.insert(QLatin1String("else"));
+    qscriptKeywords.insert(QLatin1String("enum"));
+    qscriptKeywords.insert(QLatin1String("export"));
+    qscriptKeywords.insert(QLatin1String("extends"));
+    qscriptKeywords.insert(QLatin1String("false"));
+    qscriptKeywords.insert(QLatin1String("final"));
+    qscriptKeywords.insert(QLatin1String("finally"));
+    qscriptKeywords.insert(QLatin1String("float"));
+    qscriptKeywords.insert(QLatin1String("for"));
+    qscriptKeywords.insert(QLatin1String("function"));
+    qscriptKeywords.insert(QLatin1String("goto"));
+    qscriptKeywords.insert(QLatin1String("if"));
+    qscriptKeywords.insert(QLatin1String("implements"));
+    qscriptKeywords.insert(QLatin1String("import"));
+    qscriptKeywords.insert(QLatin1String("in"));
+    qscriptKeywords.insert(QLatin1String("instanceof"));
+    qscriptKeywords.insert(QLatin1String("int"));
+    qscriptKeywords.insert(QLatin1String("interface"));
+    qscriptKeywords.insert(QLatin1String("long"));
+    qscriptKeywords.insert(QLatin1String("native"));
+    qscriptKeywords.insert(QLatin1String("new"));
+    qscriptKeywords.insert(QLatin1String("package"));
+    qscriptKeywords.insert(QLatin1String("private"));
+    qscriptKeywords.insert(QLatin1String("protected"));
+    qscriptKeywords.insert(QLatin1String("public"));
+    qscriptKeywords.insert(QLatin1String("return"));
+    qscriptKeywords.insert(QLatin1String("short"));
+    qscriptKeywords.insert(QLatin1String("static"));
+    qscriptKeywords.insert(QLatin1String("super"));
+    qscriptKeywords.insert(QLatin1String("switch"));
+    qscriptKeywords.insert(QLatin1String("synchronized"));
+    qscriptKeywords.insert(QLatin1String("this"));
+    qscriptKeywords.insert(QLatin1String("throw"));
+    qscriptKeywords.insert(QLatin1String("throws"));
+    qscriptKeywords.insert(QLatin1String("transient"));
+    qscriptKeywords.insert(QLatin1String("true"));
+    qscriptKeywords.insert(QLatin1String("try"));
+    qscriptKeywords.insert(QLatin1String("typeof"));
+    qscriptKeywords.insert(QLatin1String("undefined"));
+    qscriptKeywords.insert(QLatin1String("var"));
+    qscriptKeywords.insert(QLatin1String("void"));
+    qscriptKeywords.insert(QLatin1String("volatile"));
+    qscriptKeywords.insert(QLatin1String("while"));
+    qscriptKeywords.insert(QLatin1String("with"));    // end
+
     setFormats(defaultFormats());
 }
 
@@ -266,10 +259,13 @@ void QScriptHighlighter::highlightBlock(const QString &text)
                                   nextChar = text.at(i + 1);
                               if (state == StateStandard && !questionMark &&
                                   lastChar != ':' && nextChar != ':') {
-                                  for (int j = 0; j < i; ++j) {
-                                      if (format(j) == emptyFormat)
-                                          setFormat(j, 1, m_formats[LabelFormat]);
+                                  int start = i - 1;
+                                  for (; start != -1; --start) {
+                                      if (text.at(start).isSpace())
+                                          break;
                                   }
+                                  ++start;
+                                  setFormat(start, i - start, m_formats[LabelFormat]);
                               }
                               break;
                           }
@@ -438,7 +434,7 @@ void QScriptHighlighter::highlightKeyword(int currentPos, const QString &buffer)
     if (m_duiEnabled && buffer.at(0).isUpper() || (! m_duiEnabled && buffer.at(0) == QLatin1Char('Q'))) {
         setFormat(currentPos - buffer.length(), buffer.length(), m_formats[TypeFormat]);
     } else {
-        if (qscriptKeywords().contains(buffer))
+        if (qscriptKeywords.contains(buffer))
             setFormat(currentPos - buffer.length(), buffer.length(), m_formats[KeywordFormat]);
     }
 }
diff --git a/src/shared/qscripthighlighter/qscripthighlighter.h b/src/shared/qscripthighlighter/qscripthighlighter.h
index 8917af0ee3e60bca0848a1cc82711c5f243845d7..3a91a8400835e233e49e2af5df8a4c30419a3513 100644
--- a/src/shared/qscripthighlighter/qscripthighlighter.h
+++ b/src/shared/qscripthighlighter/qscripthighlighter.h
@@ -30,7 +30,8 @@
 #ifndef QSCRIPTSYNTAXHIGHLIGHTER_H
 #define QSCRIPTSYNTAXHIGHLIGHTER_H
 
-#include <QVector>
+#include <QtCore/QVector>
+#include <QtCore/QSet>
 #include <QtGui/QSyntaxHighlighter>
 
 namespace SharedTools {
@@ -56,7 +57,10 @@ public:
     QTextCharFormat labelTextCharFormat() const
     { return m_formats[LabelFormat]; }
 
-private:
+    const QSet<QString> &keywords() const
+    { return qscriptKeywords; }
+
+protected:
     // The functions are notified whenever parentheses are encountered.
     // Custom behaviour can be added, for example storing info for indenting.
     virtual int onBlockStart(); // returns the blocks initial state
@@ -69,6 +73,7 @@ private:
 
     bool m_duiEnabled;
     QTextCharFormat m_formats[NumFormats];
+    QSet<QString> qscriptKeywords;
 };
 
 } // namespace SharedTools