diff --git a/src/libs/qmljs/qmljsdocument.cpp b/src/libs/qmljs/qmljsdocument.cpp
index 6b4f3ed96ba7d7c9b84549da5dc3c4d7d440f67b..650643d19a2772fdd20c83f7935217db70e7c921 100644
--- a/src/libs/qmljs/qmljsdocument.cpp
+++ b/src/libs/qmljs/qmljsdocument.cpp
@@ -44,6 +44,7 @@ Document::Document(const QString &fileName)
     , _pool(0)
     , _ast(0)
     , _bind(0)
+    , _isQmlDocument(false)
     , _documentRevision(0)
     , _parsedCorrectly(false)
     , _fileName(fileName)
@@ -52,6 +53,7 @@ Document::Document(const QString &fileName)
     _path = fileInfo.absolutePath();
 
     if (fileInfo.suffix() == QLatin1String("qml")) {
+        _isQmlDocument = true;
         _componentName = fileInfo.baseName();
 
         if (! _componentName.isEmpty()) {
@@ -81,6 +83,16 @@ Document::Ptr Document::create(const QString &fileName)
     return doc;
 }
 
+bool Document::isQmlDocument() const
+{
+    return _isQmlDocument;
+}
+
+bool Document::isJSDocument() const
+{
+    return ! _isQmlDocument;
+}
+
 AST::UiProgram *Document::qmlProgram() const
 {
     return cast<UiProgram *>(_ast);
@@ -182,6 +194,14 @@ bool Document::parse_helper(int startToken)
     return _parsedCorrectly;
 }
 
+bool Document::parse()
+{
+    if (isQmlDocument())
+        return parseQml();
+
+    return parseJavaScript();
+}
+
 bool Document::parseQml()
 {
     return parse_helper(QmlJSGrammar::T_FEED_UI_PROGRAM);
@@ -264,7 +284,7 @@ QList<Document::Ptr> Snapshot::importedDocuments(const Document::Ptr &doc, const
     foreach (Document::Ptr candidate, _documents) {
         if (candidate == doc)
             continue; // ignore this document
-        else if (! candidate->qmlProgram())
+        else if (candidate->isJSDocument())
             continue; // skip JS documents
 
         if (candidate->path() == doc->path() || candidate->path() == docPath)
diff --git a/src/libs/qmljs/qmljsdocument.h b/src/libs/qmljs/qmljsdocument.h
index fd3742e8b86db3339b4b531b2a12ebb4c41b8c7d..e3cfa420d840153d87d4dd6f49f54feacb24e16c 100644
--- a/src/libs/qmljs/qmljsdocument.h
+++ b/src/libs/qmljs/qmljsdocument.h
@@ -57,6 +57,9 @@ public:
 
     static Document::Ptr create(const QString &fileName);
 
+    bool isQmlDocument() const;
+    bool isJSDocument() const;
+
     AST::UiProgram *qmlProgram() const;
     AST::Program *jsProgram() const;
     AST::ExpressionNode *expression() const;
@@ -67,6 +70,7 @@ public:
     QString source() const;
     void setSource(const QString &source);
 
+    bool parse();
     bool parseQml();
     bool parseJavaScript();
     bool parseExpression();
@@ -91,6 +95,7 @@ private:
     NodePool *_pool;
     AST::Node *_ast;
     Bind *_bind;
+    bool _isQmlDocument;
     int _documentRevision;
     bool _parsedCorrectly;
     QList<QmlJS::DiagnosticMessage> _diagnosticMessages;
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 57854d514a7cc8fd38b89c444c5eb39fb3c20f63..05b9c38c5105d128db2f95489e66764477a5b7b7 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -703,10 +703,16 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
         }
 
         // add qml extra words
-        if (document && document->qmlProgram()) {
+        if (isQmlFile) {
             static QStringList qmlWords;
-            if (qmlWords.isEmpty())
-                qmlWords << "property" << "readonly" << "signal";
+
+            if (qmlWords.isEmpty()) {
+                qmlWords << QLatin1String("property")
+                        << QLatin1String("readonly")
+                        << QLatin1String("signal")
+                        << QLatin1String("import");
+            }
+
             foreach (const QString &word, qmlWords) {
                 TextEditor::CompletionItem item(this);
                 item.text = word;
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 6a9512a0b5c27eb7ed9ece301824fb0d6288ac3e..6a2166d29b7ecc66cec75722e80c072856964926 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -1354,12 +1354,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source)
     if (! doc) {
         snapshot = source.snapshot;
         doc = snapshot.documentFromSource(source.code, source.fileName);
-
-        // ### This doesn't really work: what if snapshot doesn't have the doc?
-        if (snapshot.document(source.fileName)->qmlProgram())
-            doc->parseQml();
-        else if (snapshot.document(source.fileName)->jsProgram())
-            doc->parseJavaScript();
+        doc->parse();
     }
 
     SemanticInfo semanticInfo;