diff --git a/src/libs/qmljs/qmljsscanner.cpp b/src/libs/qmljs/qmljsscanner.cpp
index 7b201d2c6c73762367c7dae60833e1a63a0f7dee..79f81509f23ee871f62e5350aaf9be54476fd11a 100644
--- a/src/libs/qmljs/qmljsscanner.cpp
+++ b/src/libs/qmljs/qmljsscanner.cpp
@@ -309,3 +309,13 @@ bool Scanner::isKeyword(const QString &text) const
 
     return false;
 }
+
+QStringList Scanner::keywords()
+{
+    static QStringList words;
+    if (words.isEmpty()) {
+        for (const QString *word = begin(js_keywords); word != end(js_keywords); ++word)
+            words.append(*word);
+    }
+    return words;
+}
diff --git a/src/libs/qmljs/qmljsscanner.h b/src/libs/qmljs/qmljsscanner.h
index 7d02e1b42ddf820b4b304ab3234842489d52f606..9141842cd71e3403ac3413f67c7b092b8eee1070 100644
--- a/src/libs/qmljs/qmljsscanner.h
+++ b/src/libs/qmljs/qmljsscanner.h
@@ -87,6 +87,7 @@ public:
     int state() const;
 
     bool isKeyword(const QString &text) const;
+    static QStringList keywords();
 
 private:
     int _state;
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 2eab2db74fbd189b936d7641e27317ace10ad426..1c7f3e39d1bd041e4181a8b0590184d3f9d10352 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -692,6 +692,25 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
             item.icon = symbolIcon;
             m_completions.append(item);
         }
+
+        // add js keywords
+        foreach (const QString &word, Scanner::keywords()) {
+            TextEditor::CompletionItem item(this);
+            item.text = word;
+            m_completions.append(item);
+        }
+
+        // add qml extra words
+        if (document->qmlProgram()) {
+            static QStringList qmlWords;
+            if (qmlWords.isEmpty())
+                qmlWords << "property" << "readonly" << "signal";
+            foreach (const QString &word, qmlWords) {
+                TextEditor::CompletionItem item(this);
+                item.text = word;
+                m_completions.append(item);
+            }
+        }
     }
 
     else if (completionOperator == QLatin1Char('.') || completionOperator == QLatin1Char('(')) {