diff --git a/src/libs/qmljs/qmljsdocument.cpp b/src/libs/qmljs/qmljsdocument.cpp
index a8698aaf1f8dca59a8f624ad1106209386186a94..26e651e0645f52009afe7810808b8ea20d854648 100644
--- a/src/libs/qmljs/qmljsdocument.cpp
+++ b/src/libs/qmljs/qmljsdocument.cpp
@@ -83,6 +83,21 @@ using namespace QmlJS::AST;
 */
 
 
+bool Document::isQmlLikeLanguage(Document::Language language)
+{
+    switch (language) {
+    case QmlLanguage:
+    case QmlQtQuick1Language:
+    case QmlQtQuick2Language:
+    case QmlQbsLanguage:
+    case QmlProjectLanguage:
+    case QmlTypeInfoLanguage:
+        return true;
+    default:
+        return false;
+    }
+}
+
 Document::Document(const QString &fileName, Language language)
     : _engine(0)
     , _ast(0)
@@ -95,7 +110,7 @@ Document::Document(const QString &fileName, Language language)
     QFileInfo fileInfo(fileName);
     _path = QDir::cleanPath(fileInfo.absolutePath());
 
-    if (language == QmlLanguage) {
+    if (isQmlLikeLanguage(language)) {
         _componentName = fileInfo.baseName();
 
         if (! _componentName.isEmpty()) {
@@ -127,6 +142,8 @@ Document::Language Document::guessLanguageFromSuffix(const QString &fileName)
 {
     if (fileName.endsWith(QLatin1String(".qml"), Qt::CaseInsensitive))
         return QmlLanguage;
+    if (fileName.endsWith(QLatin1String(".qbs"), Qt::CaseInsensitive))
+        return QmlQbsLanguage;
     if (fileName.endsWith(QLatin1String(".js"), Qt::CaseInsensitive))
         return JavaScriptLanguage;
     if (fileName.endsWith(QLatin1String(".json"), Qt::CaseInsensitive))
@@ -141,7 +158,7 @@ Document::Ptr Document::ptr() const
 
 bool Document::isQmlDocument() const
 {
-    return _language == QmlLanguage;
+    return isQmlLikeLanguage(_language);
 }
 
 Document::Language Document::language() const
@@ -259,7 +276,7 @@ bool Document::parse_helper(int startToken)
     Parser parser(_engine);
 
     QString source = _source;
-    lexer.setCode(source, /*line = */ 1, /*qmlMode = */_language == QmlLanguage);
+    lexer.setCode(source, /*line = */ 1, /*qmlMode = */isQmlLikeLanguage(_language));
 
     CollectDirectives collectDirectives(path());
     _engine->setDirectives(&collectDirectives);
diff --git a/src/libs/qmljs/qmljsdocument.h b/src/libs/qmljs/qmljsdocument.h
index c852a4ad11e6dab3e12e1e9eb3895c1facbb6118..d8798aee4dfe4205e406a7bee38be3bc98821fba 100644
--- a/src/libs/qmljs/qmljsdocument.h
+++ b/src/libs/qmljs/qmljsdocument.h
@@ -51,15 +51,20 @@ public:
     typedef QSharedPointer<const Document> Ptr;
     typedef QSharedPointer<Document> MutablePtr;
 
-    // used in a 3-bit bitfield
     enum Language
     {
-        QmlLanguage = 0,
+        UnknownLanguage = 0,
         JavaScriptLanguage = 1,
         JsonLanguage = 2,
-        UnknownLanguage = 3
+        QmlLanguage = 3,
+        QmlQtQuick1Language = 4,
+        QmlQtQuick2Language = 5,
+        QmlQbsLanguage = 6,
+        QmlProjectLanguage = 7,
+        QmlTypeInfoLanguage = 8
     };
 
+    static bool isQmlLikeLanguage(Language languge);
 protected:
     Document(const QString &fileName, Language language);
 
@@ -117,8 +122,8 @@ private:
     QString _source;
     QWeakPointer<Document> _ptr;
     int _editorRevision;
-    Language _language : 3;
-    bool _parsedCorrectly : 1;
+    Language _language;
+    bool _parsedCorrectly;
 
     // for documentFromSource
     friend class Snapshot;
diff --git a/src/plugins/cpaster/protocol.cpp b/src/plugins/cpaster/protocol.cpp
index f092ef09d1afa4c776e6c82b3363667585f9895c..7a8bcdc2b32071f83a6bc43eedfb0bcb909f58c8 100644
--- a/src/plugins/cpaster/protocol.cpp
+++ b/src/plugins/cpaster/protocol.cpp
@@ -96,6 +96,8 @@ Protocol::ContentType Protocol::contentType(const QString &mt)
         || mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE))
         return Cpp;
     if (mt == QLatin1String(QmlJSTools::Constants::QML_MIMETYPE)
+        || mt == QLatin1String(QmlJSTools::Constants::QMLPROJECT_MIMETYPE)
+        || mt == QLatin1String(QmlJSTools::Constants::QBS_MIMETYPE)
         || mt == QLatin1String(QmlJSTools::Constants::JS_MIMETYPE)
         || mt == QLatin1String(QmlJSTools::Constants::JSON_MIMETYPE))
         return JavaScript;
diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h
index 74c33d738e5234c139ebc3dc1bd0fd80365e0fe7..2964c6b137205b0173576bddcc0e9b2970fbf414 100644
--- a/src/plugins/projectexplorer/projectexplorerconstants.h
+++ b/src/plugins/projectexplorer/projectexplorerconstants.h
@@ -170,7 +170,7 @@ const char C_HEADER_MIMETYPE[]    = "text/x-chdr";
 const char CPP_SOURCE_MIMETYPE[]  = "text/x-c++src";
 const char CPP_HEADER_MIMETYPE[]  = "text/x-c++hdr";
 const char FORM_MIMETYPE[]        = "application/x-designer";
-const char QML_MIMETYPE[]         = "application/x-qml";
+const char QML_MIMETYPE[]         = "application/x-qml"; // separate def also in qmljstoolsconstants.h
 const char RESOURCE_MIMETYPE[]    = "application/vnd.nokia.xml.qt.resource";
 
 // Settings page
diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp
index 696ca553e8a51060e1042ac56c1457b3689a5f6c..73f1f4fce84be9072500063c04006a29aca41e31 100644
--- a/src/plugins/projectexplorer/projectnodes.cpp
+++ b/src/plugins/projectexplorer/projectnodes.cpp
@@ -796,7 +796,8 @@ FileType typeForFileName(const Core::MimeDatabase *db, const QFileInfo &file)
         return ResourceType;
     if (typeName == QLatin1String(Constants::FORM_MIMETYPE))
         return FormType;
-    if (typeName == QLatin1String(Constants::QML_MIMETYPE))
+    if (mt.subClassesOf().contains(QLatin1String(Constants::QML_MIMETYPE))
+            || typeName == QLatin1String(Constants::QML_MIMETYPE))
         return QMLType;
     return UnknownFileType;
 }
diff --git a/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml b/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml
index 6c17c14689096fc5878077d1a1481f9bc507ac80..a1bdef531efaff6cf227c50e7109ecdef7a15a02 100644
--- a/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml
+++ b/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml
@@ -5,10 +5,24 @@
         <sub-class-of type="text/plain"/>
         <comment>QML file</comment>
         <glob pattern="*.qml"/>
+    </mime-type>
+    <mime-type type="application/x-qt.qbs+qml">
+        <alias type="text/x-qt.qbs+qml"/>
+        <sub-class-of type="application/x-qml"/>
+        <comment>Qt Build Suite file</comment>
+        <glob pattern="*.qbs"/>
+    </mime-type>
+    <mime-type type="application/x-qmlproject">
+        <alias type="text/x-qmlproject"/>
+        <sub-class-of type="application/x-qml"/>
+        <comment>Qt Creator Qt UI project file</comment>
         <glob pattern="*.qmlproject"/>
+    </mime-type>
+    <mime-type type="application/x-qt.meta-info+qml">
+        <alias type="text/x-qt.meta-info+qml"/>
+        <sub-class-of type="application/x-qml"/>
+        <comment>QML file</comment>
         <glob pattern="*.qmltypes"/>
-        <glob pattern="*.qbs"/>
-        <glob pattern="*.qbp"/>
     </mime-type>
     <mime-type type="application/javascript">
         <alias type="application/x-javascript"/>
diff --git a/src/plugins/qmljseditor/qmljseditorfactory.cpp b/src/plugins/qmljseditor/qmljseditorfactory.cpp
index 17a9841b5f487cedcd642bdc6191b3d1696efe7b..eecf99cfcd27a65064ac3f87002407e04fe8e583 100644
--- a/src/plugins/qmljseditor/qmljseditorfactory.cpp
+++ b/src/plugins/qmljseditor/qmljseditorfactory.cpp
@@ -59,6 +59,9 @@ QmlJSEditorFactory::QmlJSEditorFactory(QObject *parent)
 {
     m_mimeTypes
             << QLatin1String(QmlJSTools::Constants::QML_MIMETYPE)
+            << QLatin1String(QmlJSTools::Constants::QMLPROJECT_MIMETYPE)
+            << QLatin1String(QmlJSTools::Constants::QBS_MIMETYPE)
+            << QLatin1String(QmlJSTools::Constants::QMLTYPES_MIMETYPE)
             << QLatin1String(QmlJSTools::Constants::JS_MIMETYPE)
             << QLatin1String(QmlJSTools::Constants::JSON_MIMETYPE)
             ;
diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp
index 9cfb1073eae0573794189a8a110618207a256ce7..b6a71e3310cc9feb031a7796df476b8d045bc346 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp
@@ -70,27 +70,41 @@ using namespace QmlJSTools::Internal;
 
 static QStringList environmentImportPaths();
 
+static void mergeSuffixes(QStringList &l1, const QStringList &l2)
+{
+    if (!l2.isEmpty())
+        l1 = l2;
+}
+
 QmlJS::Document::Language QmlJSTools::languageOfFile(const QString &fileName)
 {
     QStringList jsSuffixes(QLatin1String("js"));
     QStringList qmlSuffixes(QLatin1String("qml"));
+    QStringList qmlProjectSuffixes(QLatin1String("qmlproject"));
     QStringList jsonSuffixes(QLatin1String("json"));
+    QStringList qbsSuffixes(QLatin1String("qbs"));
 
     if (Core::ICore::instance()) {
         Core::MimeDatabase *db = Core::ICore::mimeDatabase();
         Core::MimeType jsSourceTy = db->findByType(QLatin1String(Constants::JS_MIMETYPE));
-        jsSuffixes = jsSourceTy.suffixes();
+        mergeSuffixes(jsSuffixes, jsSourceTy.suffixes());
         Core::MimeType qmlSourceTy = db->findByType(QLatin1String(Constants::QML_MIMETYPE));
-        qmlSuffixes = qmlSourceTy.suffixes();
+        mergeSuffixes(qmlSuffixes, qmlSourceTy.suffixes());
+        Core::MimeType qbsSourceTy = db->findByType(QLatin1String(Constants::QBS_MIMETYPE));
+        mergeSuffixes(qbsSuffixes, qbsSourceTy.suffixes());
+        Core::MimeType qmlProjectSourceTy = db->findByType(QLatin1String(Constants::QMLPROJECT_MIMETYPE));
+        mergeSuffixes(qbsSuffixes, qmlProjectSourceTy.suffixes());
         Core::MimeType jsonSourceTy = db->findByType(QLatin1String(Constants::JSON_MIMETYPE));
-        jsonSuffixes = jsonSourceTy.suffixes();
+        mergeSuffixes(jsonSuffixes, jsonSourceTy.suffixes());
     }
 
     const QFileInfo info(fileName);
     const QString fileSuffix = info.suffix();
     if (jsSuffixes.contains(fileSuffix))
         return QmlJS::Document::JavaScriptLanguage;
-    if (qmlSuffixes.contains(fileSuffix))
+    if (qbsSuffixes.contains(fileSuffix))
+        return QmlJS::Document::QmlQbsLanguage;
+    if (qmlSuffixes.contains(fileSuffix) || qmlProjectSuffixes.contains(fileSuffix))
         return QmlJS::Document::QmlLanguage;
     if (jsonSuffixes.contains(fileSuffix))
         return QmlJS::Document::JsonLanguage;
diff --git a/src/plugins/qmljstools/qmljstoolsconstants.h b/src/plugins/qmljstools/qmljstoolsconstants.h
index 4fb73ae2f798b952595a6adeb7365729d61bb253..dc7c7302426c99b0f97b117a2a95fc6424dfe4ad 100644
--- a/src/plugins/qmljstools/qmljstoolsconstants.h
+++ b/src/plugins/qmljstools/qmljstoolsconstants.h
@@ -35,7 +35,10 @@
 namespace QmlJSTools {
 namespace Constants {
 
-const char QML_MIMETYPE[] = "application/x-qml";
+const char QML_MIMETYPE[] = "application/x-qml"; // separate def also in projectexplorerconstants.h
+const char QBS_MIMETYPE[] = "application/x-qt.qbs+qml";
+const char QMLPROJECT_MIMETYPE[] = "application/x-qmlproject";
+const char QMLTYPES_MIMETYPE[] = "application/x-qt.meta-info+qml";
 const char JS_MIMETYPE[] = "application/javascript";
 const char JSON_MIMETYPE[] = "application/json";
 
diff --git a/src/plugins/qmljstools/qmljstoolssettings.cpp b/src/plugins/qmljstools/qmljstoolssettings.cpp
index be35adb0712f6159382030a74a2005fddd83883a..5291384194ebcd9173c4bdad3b11f3ebf6cd061d 100644
--- a/src/plugins/qmljstools/qmljstoolssettings.cpp
+++ b/src/plugins/qmljstools/qmljstoolssettings.cpp
@@ -140,6 +140,15 @@ QmlJSToolsSettings::QmlJSToolsSettings(QObject *parent)
     textEditorSettings->registerMimeTypeForLanguageId(
                 QLatin1String(Constants::QML_MIMETYPE),
                 Constants::QML_JS_SETTINGS_ID);
+    textEditorSettings->registerMimeTypeForLanguageId(
+                QLatin1String(Constants::QBS_MIMETYPE),
+                Constants::QML_JS_SETTINGS_ID);
+    textEditorSettings->registerMimeTypeForLanguageId(
+                QLatin1String(Constants::QMLPROJECT_MIMETYPE),
+                Constants::QML_JS_SETTINGS_ID);
+    textEditorSettings->registerMimeTypeForLanguageId(
+                QLatin1String(Constants::QMLTYPES_MIMETYPE),
+                Constants::QML_JS_SETTINGS_ID);
     textEditorSettings->registerMimeTypeForLanguageId(
                 QLatin1String(Constants::JS_MIMETYPE),
                 Constants::QML_JS_SETTINGS_ID);
diff --git a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp
index 22c6eb72c1b2db73fddd7b231ce80b8c47aca621..9d142d0fe59668c6813fe68875421526641afd8d 100644
--- a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp
@@ -129,7 +129,7 @@ void QmlProfilerDetailsRewriter::requestDetailsForLocation(int type,
     QFileInfo fileInfo(localFile);
     if (!fileInfo.exists() || !fileInfo.isReadable())
         return;
-    if (QmlJSTools::languageOfFile(localFile) != QmlJS::Document::QmlLanguage)
+    if (!QmlJS::Document::isQmlLikeLanguage(QmlJSTools::languageOfFile(localFile)))
         return;
 
     PendingEvent ev = {location, localFile, type};
diff --git a/src/plugins/qmlprojectmanager/qmlprojectconstants.h b/src/plugins/qmlprojectmanager/qmlprojectconstants.h
index c0803d5d53c152be8c64c8bcfdb6e59bf062d253..db9e9bc76da7fa4ac31079e8a2c10063687652ff 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectconstants.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectconstants.h
@@ -30,12 +30,14 @@
 #ifndef QMLPROJECTCONSTANTS_H
 #define QMLPROJECTCONSTANTS_H
 
+#include <qmljstools/qmljstoolsconstants.h>
+
 namespace QmlProjectManager {
 namespace Constants {
 
 const char *const PROJECTCONTEXT     = "QmlProject.ProjectContext";
 const char *const LANG_QML           = "QML";
-const char *const QMLMIMETYPE        = "application/x-qmlproject";
+const char *const QMLPROJECT_MIMETYPE        = QmlJSTools::Constants::QMLPROJECT_MIMETYPE;
 
 } // namespace Constants
 } // namespace QmlProjectManager
diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
index ff09f1fba4fa47c6d3c4a6f571ba6fe7bce60785..0640b2fa50ca1c3ff567bec8f35799756ffffe11 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
@@ -77,7 +77,7 @@ QString QmlProjectFile::suggestedFileName() const
 
 QString QmlProjectFile::mimeType() const
 {
-    return QLatin1String(Constants::QMLMIMETYPE);
+    return QLatin1String(Constants::QMLPROJECT_MIMETYPE);
 }
 
 bool QmlProjectFile::isModified() const
diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp b/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
index e73fbb0a75e30879201ed6e79d531a288bbb061e..fe83c3079d21cf981e6fac45d09aa15519caf945 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
@@ -47,7 +47,7 @@ Manager::Manager()
 }
 
 QString Manager::mimeType() const
-{ return QLatin1String(Constants::QMLMIMETYPE); }
+{ return QLatin1String(Constants::QMLPROJECT_MIMETYPE); }
 
 ProjectExplorer::Project *Manager::openProject(const QString &fileName, QString *errorString)
 {