diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index a27b7cb0bf2290a7d59dd9493c64ada534083c87..5a3e301e8a636401b6b30eae0f852587e28e529e 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -2034,36 +2034,12 @@ void CppQmlTypes::load(Engine *engine, const T &objects)
     foreach (FakeMetaObject::ConstPtr metaObject, objects) {
         foreach (const FakeMetaObject::Export &exp, metaObject->exports())
             makeObject(engine, metaObject, exp, &newObjects);
-
-        FakeMetaObject::Export cppExport;
-        cppExport.package = cppPackage;
-        cppExport.type = metaObject->className();
-        cppExport.packageNameVersion = qualifiedName(cppPackage, cppExport.type, cppExport.version);
-        makeObject(engine, metaObject, cppExport, &newObjects);
     }
 
     // set prototypes
     foreach (FakeMetaObject::ConstPtr metaObject, newObjects) {
-        foreach (const FakeMetaObject::Export &exp, metaObject->exports()) {
-            QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(exp.packageNameVersion);
-            if (!objectValue || !metaObject->superClass())
-                continue;
-
-            // set prototypes for whole chain, creating new QmlObjectValues if necessary
-            // for instance, if an type isn't exported in the package of the super type
-            // Example: QObject (Qt, QtQuick) -> Positioner (not exported) -> Column (Qt, QtQuick)
-            // needs to create Positioner (Qt) and Positioner (QtQuick)
-            bool created = true;
-            QmlObjectValue *v = objectValue;
-            FakeMetaObject::ConstPtr fmo = metaObject;
-            while (created && fmo->superClass()) {
-                QmlObjectValue *superValue = getOrCreate(exp.package, fmo->superclassName(),
-                                                         fmo->superClass(), engine, &created);
-                v->setPrototype(superValue);
-                v = superValue;
-                fmo = fmo->superClass();
-            }
-        }
+        foreach (const FakeMetaObject::Export &exp, metaObject->exports())
+            setPrototypes(engine, metaObject, exp);
     }
 }
 // explicitly instantiate load for list and hash
@@ -2138,6 +2114,30 @@ void CppQmlTypes::makeObject(Engine *engine,
     _typesByFullyQualifiedName[exp.packageNameVersion] = objectValue;
 }
 
+void CppQmlTypes::setPrototypes(Engine *engine,
+                                FakeMetaObject::ConstPtr metaObject,
+                                const LanguageUtils::FakeMetaObject::Export &exp)
+{
+    QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(exp.packageNameVersion);
+    if (!objectValue || !metaObject->superClass())
+        return;
+
+    // set prototypes for whole chain, creating new QmlObjectValues if necessary
+    // for instance, if an type isn't exported in the package of the super type
+    // Example: QObject (Qt, QtQuick) -> Positioner (not exported) -> Column (Qt, QtQuick)
+    // needs to create Positioner (Qt) and Positioner (QtQuick)
+    bool created = true;
+    QmlObjectValue *v = objectValue;
+    FakeMetaObject::ConstPtr fmo = metaObject;
+    while (created && fmo->superClass()) {
+        QmlObjectValue *superValue = getOrCreate(exp.package, fmo->superclassName(),
+                                                 fmo->superClass(), engine, &created);
+        v->setPrototype(superValue);
+        v = superValue;
+        fmo = fmo->superClass();
+    }
+}
+
 QmlObjectValue *CppQmlTypes::getOrCreate(const QString &package, const QString &cppName,
                                          FakeMetaObject::ConstPtr metaObject, Engine *engine, bool *created)
 {
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index ca1aa026ddd839bca826955280225016ce0ee2c0..3732b576998d34b2b5b378f9107a743a598ae68b 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -625,6 +625,9 @@ private:
                     LanguageUtils::FakeMetaObject::ConstPtr metaObject,
                     const LanguageUtils::FakeMetaObject::Export &exp,
                     QList<LanguageUtils::FakeMetaObject::ConstPtr> *newObjects);
+    void setPrototypes(Engine *engine,
+                       LanguageUtils::FakeMetaObject::ConstPtr metaObject,
+                       const LanguageUtils::FakeMetaObject::Export &exp);
     QmlObjectValue *getOrCreate(const QString &package, const QString &cppName,
                                 LanguageUtils::FakeMetaObject::ConstPtr metaObject,
                                 Engine *engine, bool *created);
diff --git a/src/libs/qmljs/qmljstypedescriptionreader.cpp b/src/libs/qmljs/qmljstypedescriptionreader.cpp
index 35bce0a826b51a590c6b70f7fa4ace22c46b19a7..a1c92d6d9f87065c3a6d84ca80297c38f58861fa 100644
--- a/src/libs/qmljs/qmljstypedescriptionreader.cpp
+++ b/src/libs/qmljs/qmljstypedescriptionreader.cpp
@@ -8,6 +8,7 @@
 #include "parser/qmljsastvisitor_p.h"
 
 #include "qmljsbind.h"
+#include "qmljsinterpreter.h"
 
 #include <QtCore/QIODevice>
 #include <QtCore/QBuffer>
@@ -172,6 +173,8 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast)
         return;
     }
 
+    // ### add implicit export into the package of c++ types
+    fmo->addExport(fmo->className(), QmlJS::Interpreter::CppQmlTypes::cppPackage, ComponentVersion());
     _objects->insert(fmo->className(), fmo);
 }