diff --git a/src/libs/qmljs/qmljs.pri b/src/libs/qmljs/qmljs.pri
index 4d2285d2d0ac71687acfcd7b9aa57dc9134910f9..5756428677b974b9ceadaea5e46e29e8342b7b6a 100644
--- a/src/libs/qmljs/qmljs.pri
+++ b/src/libs/qmljs/qmljs.pri
@@ -1,5 +1,5 @@
 INCLUDEPATH += $$PWD/../../shared
 INCLUDEPATH += $$PWD/../../shared/qmljs $$PWD/../../shared/qmljs/parser
 
-DEPENDPATH += $$PWD/../../shared/qmljs
+DEPENDPATH += $$PWD/../../shared/qmljs $$PWD/../../shared/qmljs/parser
 LIBS *= -l$$qtLibraryTarget(QmlJS)
diff --git a/src/plugins/qmljseditor/qmlcodecompletion.cpp b/src/plugins/qmljseditor/qmlcodecompletion.cpp
index bc4888e4b1923d5760ace0d7f3e3fcf4c8b6822c..4eb0b987f72e1cbec81a98d1f846220781c89478 100644
--- a/src/plugins/qmljseditor/qmlcodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmlcodecompletion.cpp
@@ -95,12 +95,12 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
     if (qmlDocument.isNull())
         return pos;
 
-    if (!qmlDocument->program())
+    if (!qmlDocument->qmlProgram())
         qmlDocument = m_modelManager->snapshot().value(qmlDocument->fileName());
 
     // FIXME: this completion strategy is not going to work when the document was never parsed correctly.
-    if (qmlDocument && qmlDocument->program()) {
-         QmlJS::AST::UiProgram *program = qmlDocument->program();
+    if (qmlDocument && qmlDocument->qmlProgram()) {
+         QmlJS::AST::UiProgram *program = qmlDocument->qmlProgram();
 //         qDebug() << "*** program:" << program;
  
          if (program) {
diff --git a/src/plugins/qmljseditor/qmlexpressionundercursor.cpp b/src/plugins/qmljseditor/qmlexpressionundercursor.cpp
index 70c019795ddb26e9c516a37644414d9afb402cf6..f95db88828b3ce5958838149ec23711fd6a4373f 100644
--- a/src/plugins/qmljseditor/qmlexpressionundercursor.cpp
+++ b/src/plugins/qmljseditor/qmlexpressionundercursor.cpp
@@ -130,7 +130,7 @@ namespace QmlJSEditor {
                 _pos = pos;
                 _scopes.clear();
                 _currentSymbol = 0;
-                Node::accept(doc->program(), this);
+                Node::accept(doc->qmlProgram(), this);
                 return _scopes;
             }
 
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index c627d342083f413ba90a0c4a89e34ca50a60b1c1..ee738429f5a17155c7c96f6a4754842d8b6f9be6 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -425,11 +425,11 @@ void QmlJSTextEditor::onDocumentUpdated(Qml::QmlDocument::Ptr doc)
 
     FindIdDeclarations updateIds;
     m_idsRevision = document()->revision();
-    m_ids = updateIds(doc->program());
+    m_ids = updateIds(doc->qmlProgram());
 
     if (doc->isParsedCorrectly()) {
         FindDeclarations findDeclarations;
-        m_declarations = findDeclarations(doc->program());
+        m_declarations = findDeclarations(doc->qmlProgram());
 
         QStringList items;
         items.append(tr("<Select Symbol>"));
diff --git a/src/plugins/qmljseditor/qmllookupcontext.cpp b/src/plugins/qmljseditor/qmllookupcontext.cpp
index d22133fc127ce404689c405bb211a93e7ba2ba7a..7c4061b02bc1ba2b8b876652dd1de8ddad6aad6e 100644
--- a/src/plugins/qmljseditor/qmllookupcontext.cpp
+++ b/src/plugins/qmljseditor/qmllookupcontext.cpp
@@ -137,7 +137,7 @@ QmlSymbol *QmlLookupContext::resolveType(const QString &name, const QString &fil
     if (document.isNull())
         return 0;
 
-    UiProgram *prog = document->program();
+    UiProgram *prog = document->qmlProgram();
     if (!prog)
         return 0;
 
@@ -252,7 +252,7 @@ QList<QmlSymbol*> QmlLookupContext::visibleTypes()
 {
     QList<QmlSymbol*> result;
 
-    UiProgram *program = _doc->program();
+    UiProgram *program = _doc->qmlProgram();
     if (!program)
         return result;
 
diff --git a/src/plugins/qmljseditor/qmlmodelmanager.cpp b/src/plugins/qmljseditor/qmlmodelmanager.cpp
index 495dcd0114aa4be0b06c82047fbdda8b849d2146..fc55e6095b25e573a7ab55de0e6cf9b130c8cb1e 100644
--- a/src/plugins/qmljseditor/qmlmodelmanager.cpp
+++ b/src/plugins/qmljseditor/qmlmodelmanager.cpp
@@ -27,21 +27,20 @@
 **
 **************************************************************************/
 
-#include <QFile>
-#include <QtConcurrentRun>
-#include <qtconcurrent/runextensions.h>
-#include <QTextStream>
+#include "qmljseditorconstants.h"
+#include "qmlmodelmanager.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/progressmanager/progressmanager.h>
-
+#include <coreplugin/mimedatabase.h>
 #include <texteditor/itexteditor.h>
 
-#include "qmljseditorconstants.h"
-#include "qmlmodelmanager.h"
-
-#include <QtCore/QMetaType>
+#include <QFile>
+#include <QFileInfo>
+#include <QtConcurrentRun>
+#include <qtconcurrent/runextensions.h>
+#include <QTextStream>
 
 using namespace QmlJSEditor;
 using namespace QmlJSEditor::Internal;
@@ -156,7 +155,21 @@ void QmlModelManager::parse(QFutureInterface<void> &future,
 
         Qml::QmlDocument::Ptr doc = Qml::QmlDocument::create(fileName);
         doc->setSource(contents);
-        doc->parse();
+
+        {
+            Core::MimeDatabase *db = Core::ICore::instance()->mimeDatabase();
+            Core::MimeType jsSourceTy = db->findByType(QLatin1String("application/javascript"));
+            Core::MimeType qmlSourceTy = db->findByType(QLatin1String("application/x-qml"));
+
+            const QFileInfo fileInfo(fileName);
+
+            if (jsSourceTy.matchesFile(fileInfo))
+                doc->parseJavaScript();
+            else if (qmlSourceTy.matchesFile(fileInfo))
+                doc->parseQml();
+            else
+                qWarning() << "Don't know how to treat" << fileName;
+        }
 
         modelManager->emitDocumentUpdated(doc);
     }
diff --git a/src/shared/qmljs/qmldocument.cpp b/src/shared/qmljs/qmldocument.cpp
index 2cd13a58d5ae1686162ae796b4e9be6ca4abb0dd..7d1880dd70f25418ae733d10413d946d7501f47e 100644
--- a/src/shared/qmljs/qmldocument.cpp
+++ b/src/shared/qmljs/qmldocument.cpp
@@ -35,13 +35,17 @@
 #include <qmljs/parser/qmljsnodepool_p.h>
 #include <qmljs/parser/qmljsastfwd_p.h>
 
+#include <QDebug>
+
 using namespace Qml;
 using namespace QmlJS;
+using namespace QmlJS::AST;
 
 QmlDocument::QmlDocument(const QString &fileName)
     : _engine(0)
     , _pool(0)
-    , _program(0)
+    , _uiProgram(0)
+    , _jsProgram(0)
     , _fileName(fileName)
     , _parsedCorrectly(false)
 {
@@ -70,9 +74,14 @@ QmlDocument::Ptr QmlDocument::create(const QString &fileName)
     return doc;
 }
 
-AST::UiProgram *QmlDocument::program() const
+AST::UiProgram *QmlDocument::qmlProgram() const
+{
+    return _uiProgram;
+}
+
+AST::Program *QmlDocument::jsProgram() const
 {
-    return _program;
+    return _jsProgram;
 }
 
 QList<DiagnosticMessage> QmlDocument::diagnosticMessages() const
@@ -90,11 +99,14 @@ void QmlDocument::setSource(const QString &source)
     _source = source;
 }
 
-bool QmlDocument::parse()
+bool QmlDocument::parseQml()
 {
     Q_ASSERT(! _engine);
     Q_ASSERT(! _pool);
-    Q_ASSERT(! _program);
+    Q_ASSERT(! _uiProgram);
+    Q_ASSERT(! _jsProgram);
+
+    qDebug() << "QmlDocument::parseQml() for file" << _fileName;
 
     _engine = new Engine();
     _pool = new NodePool(_fileName, _engine);
@@ -106,11 +118,11 @@ bool QmlDocument::parse()
     lexer.setCode(_source, /*line = */ 1);
 
     _parsedCorrectly = parser.parse();
-    _program = parser.ast();
+    _uiProgram = parser.ast();
     _diagnosticMessages = parser.diagnosticMessages();
 
-    if (_program) {
-        for (QmlJS::AST::UiObjectMemberList *iter = _program->members; iter; iter = iter->next)
+    if (_uiProgram) {
+        for (QmlJS::AST::UiObjectMemberList *iter = _uiProgram->members; iter; iter = iter->next)
             if (iter->member)
                 _symbols.append(new QmlSymbolFromFile(_fileName, iter->member));
 
@@ -123,6 +135,29 @@ bool QmlDocument::parse()
     return _parsedCorrectly;
 }
 
+bool QmlDocument::parseJavaScript()
+{
+    Q_ASSERT(! _engine);
+    Q_ASSERT(! _pool);
+    Q_ASSERT(! _uiProgram);
+    Q_ASSERT(! _jsProgram);
+
+    _engine = new Engine();
+    _pool = new NodePool(_fileName, _engine);
+    _ids.clear();
+
+    Lexer lexer(_engine);
+    Parser parser(_engine);
+
+    lexer.setCode(_source, /*line = */ 1);
+
+    _parsedCorrectly = parser.parseProgram();
+    _jsProgram = cast<Program*>(parser.rootNode());
+    _diagnosticMessages = parser.diagnosticMessages();
+
+    return _parsedCorrectly;
+}
+
 QmlSymbolFromFile *QmlDocument::findSymbol(QmlJS::AST::Node *node) const
 {
     foreach (QmlSymbol *symbol, _symbols)
@@ -143,10 +178,8 @@ Snapshot::~Snapshot()
 
 void Snapshot::insert(const QmlDocument::Ptr &document)
 {
-    if (!document || !document->program())
-        return;
-
-    QMap<QString, QmlDocument::Ptr>::insert(document->fileName(), document);
+    if (document && (document->qmlProgram() || document->jsProgram()))
+        QMap<QString, QmlDocument::Ptr>::insert(document->fileName(), document);
 }
 
 QmlDocument::PtrList Snapshot::importedDocuments(const QmlDocument::Ptr &doc, const QString &importPath) const
diff --git a/src/shared/qmljs/qmldocument.h b/src/shared/qmljs/qmldocument.h
index 15edb168e7e3f96dfec51195907b23c7f9b42964..626f0f6bb3adb739007b21f72cea0106101cf27c 100644
--- a/src/shared/qmljs/qmldocument.h
+++ b/src/shared/qmljs/qmldocument.h
@@ -56,13 +56,15 @@ public:
 
     static QmlDocument::Ptr create(const QString &fileName);
 
-    QmlJS::AST::UiProgram *program() const;
+    QmlJS::AST::UiProgram *qmlProgram() const;
+    QmlJS::AST::Program *jsProgram() const;
     QList<QmlJS::DiagnosticMessage> diagnosticMessages() const;
 
     QString source() const;
     void setSource(const QString &source);
 
-    bool parse();
+    bool parseQml();
+    bool parseJavaScript();
 
     bool isParsedCorrectly() const
     { return _parsedCorrectly; }
@@ -80,7 +82,8 @@ public:
 private:
     QmlJS::Engine *_engine;
     QmlJS::NodePool *_pool;
-    QmlJS::AST::UiProgram *_program;
+    QmlJS::AST::UiProgram *_uiProgram;
+    QmlJS::AST::Program *_jsProgram;
     QList<QmlJS::DiagnosticMessage> _diagnosticMessages;
     QString _fileName;
     QString _path;
diff --git a/src/shared/qmljs/qmlidcollector.cpp b/src/shared/qmljs/qmlidcollector.cpp
index c45e9089acebcb89c154f7f31f811d84e9bae789..3ccbf132c6450ce1923c93c9102168ce181e33ba 100644
--- a/src/shared/qmljs/qmlidcollector.cpp
+++ b/src/shared/qmljs/qmlidcollector.cpp
@@ -44,7 +44,7 @@ QMap<QString, QmlIdSymbol*> QmlIdCollector::operator()(Qml::QmlDocument &doc)
     _ids.clear();
     _currentSymbol = 0;
 
-    Node::accept(doc.program(), this);
+    Node::accept(doc.qmlProgram(), this);
 
     return _ids;
 }