diff --git a/src/libs/qmljs/parser/cmd.sed b/src/libs/qmljs/parser/cmd.sed
index 740da4e3d1acb77deb7d27d619d3db9935b6de58..fd76d634419d48063b2ff726048712bf0f0dbbe8 100644
--- a/src/libs/qmljs/parser/cmd.sed
+++ b/src/libs/qmljs/parser/cmd.sed
@@ -1,6 +1,7 @@
 s/qdeclarative/qml/g
 s/QDECLARATIVE/QML/g
 s/QDeclarative/Qml/g
+s/Q_DECLARATIVE_EXPORT //g
 
 # adjust pri file
 s/    \$\$PWD\/qmljsglobal_p.h/    $$PWD\/qmljsglobal_p.h \\\
diff --git a/src/libs/qmljs/parser/gen-parser.sh b/src/libs/qmljs/parser/gen-parser.sh
index 5b999e27f158cb2b18c9c9d8e1f227733d61ba27..7123511b2cacdab01d618dd75fb7449b30dc6c39 100755
--- a/src/libs/qmljs/parser/gen-parser.sh
+++ b/src/libs/qmljs/parser/gen-parser.sh
@@ -11,4 +11,4 @@ for i in $QTDIR/src/declarative/qml/qdeclarative{error.{h,cpp},dirparser{_p.h,.c
 done
 
 # export QmlDirParser
-perl -p -0777 -i -e 's/QT_BEGIN_NAMESPACE\n\nclass QmlError;\n\nclass QmlDirParser/#include "qmljsglobal_p.h"\n\nQT_BEGIN_NAMESPACE\n\nclass QmlError;\n\nclass QML_PARSER_EXPORT QmlDirParser/' qmldirparser_p.h
+perl -p -0777 -i -e 's/QT_BEGIN_NAMESPACE\n\nclass QmlError;\nclass QmlDirParser/#include "qmljsglobal_p.h"\n\nQT_BEGIN_NAMESPACE\n\nclass QmlError;\nclass QML_PARSER_EXPORT QmlDirParser/' qmldirparser_p.h
diff --git a/src/libs/qmljs/parser/qmldirparser.cpp b/src/libs/qmljs/parser/qmldirparser.cpp
index 60beb720978b6ef8642be9b3e49fb199f3e7747d..86ca9f6a60a231173713ecab3a61dfab099eeb63 100644
--- a/src/libs/qmljs/parser/qmldirparser.cpp
+++ b/src/libs/qmljs/parser/qmldirparser.cpp
@@ -151,13 +151,26 @@ bool QmlDirParser::parse()
 
             _plugins.append(entry);
 
+        } else if (sections[0] == QLatin1String("internal")) {
+            if (sectionCount != 3) {
+                reportError(lineNumber, -1,
+                            QString::fromUtf8("internal types require 2 arguments, but %1 were provided").arg(sectionCount + 1));
+                continue;
+            }
+            Component entry(sections[1], sections[2], -1, -1);
+            entry.internal = true;
+            _components.append(entry);
+
+        } else if (sectionCount == 2) {
+            // No version specified (should only be used for relative qmldir files)
+            const Component entry(sections[0], sections[1], -1, -1);
+            _components.append(entry);
         } else if (sectionCount == 3) {
             const QString &version = sections[1];
             const int dotIndex = version.indexOf(QLatin1Char('.'));
 
             if (dotIndex == -1) {
                 qWarning() << "expected '.'"; // ### use reportError
-
             } else if (version.indexOf(QLatin1Char('.'), dotIndex + 1) != -1) {
                 qWarning() << "unexpected '.'"; // ### use reportError
 
diff --git a/src/libs/qmljs/parser/qmldirparser_p.h b/src/libs/qmljs/parser/qmldirparser_p.h
index 8ab6095c3825116a28abe9cdbf07d102b3f86de3..07c783ffcf050945140c857a70c16bf217f1dccb 100644
--- a/src/libs/qmljs/parser/qmldirparser_p.h
+++ b/src/libs/qmljs/parser/qmldirparser_p.h
@@ -61,7 +61,6 @@
 QT_BEGIN_NAMESPACE
 
 class QmlError;
-
 class QML_PARSER_EXPORT QmlDirParser
 {
     Q_DISABLE_COPY(QmlDirParser)
@@ -96,15 +95,17 @@ public:
     struct Component
     {
         Component()
-            : majorVersion(0), minorVersion(0) {}
+            : majorVersion(0), minorVersion(0), internal(false) {}
 
         Component(const QString &typeName, const QString &fileName, int majorVersion, int minorVersion)
-            : typeName(typeName), fileName(fileName), majorVersion(majorVersion), minorVersion(minorVersion) {}
+            : typeName(typeName), fileName(fileName), majorVersion(majorVersion), minorVersion(minorVersion),
+            internal(false) {}
 
         QString typeName;
         QString fileName;
         int majorVersion;
         int minorVersion;
+        bool internal;
     };
 
     QList<Component> components() const;
@@ -122,6 +123,9 @@ private:
     unsigned _isParsed: 1;
 };
 
+typedef QList<QmlDirParser::Component> QmlDirComponents;
+
+
 QT_END_NAMESPACE
 
 #endif // QMLDIRPARSER_P_H
diff --git a/src/libs/qmljs/parser/qmljsparser.cpp b/src/libs/qmljs/parser/qmljsparser.cpp
index 71050e1cda1eda5df27377c5798ddef56145fd45..5e12f8543cdf7da48afab1631c742ee057e8e31e 100644
--- a/src/libs/qmljs/parser/qmljsparser.cpp
+++ b/src/libs/qmljs/parser/qmljsparser.cpp
@@ -284,7 +284,9 @@ case 20: {
 
     sym(1).Node = node;
 
-    if (! node) {
+    if (node) {
+        node->importToken = loc(1);
+    } else {
        diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
          QLatin1String("Expected a qualified name id or a string literal")));