diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp
index 09b735ae9ed20650c38e5c2e7ffb8d33068011f0..2a888b7a1e1ad6af6fa1757e97e3b979d24b4baf 100644
--- a/src/qml/qml/qqmlproperty.cpp
+++ b/src/qml/qml/qqmlproperty.cpp
@@ -1611,15 +1611,14 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object,
 
 QQmlMetaObject QQmlPropertyPrivate::rawMetaObjectForType(QQmlEnginePrivate *engine, int userType)
 {
-    if (engine) {
+    QMetaType metaType(userType);
+    if ((metaType.flags() & QMetaType::PointerToQObject) && metaType.metaObject())
+        return metaType.metaObject();
+    if (engine)
         return engine->rawMetaObjectForType(userType);
-    }
     QQmlType *type = QQmlMetaType::qmlType(userType);
     if (type)
         return QQmlMetaObject(type->baseMetaObject());
-    QMetaType metaType(userType);
-    if ((metaType.flags() & QMetaType::PointerToQObject) && metaType.metaObject())
-        return metaType.metaObject();
     return QQmlMetaObject((QObject*)0);
 }
 
diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
index 6cd1eafafdde56c03ccd05c0b37854d9ad798b83..62ccec5794b58b12e54c1f642210893a793ed1ea 100644
--- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
+++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
@@ -1157,6 +1157,17 @@ void tst_qqmlproperty::read()
         QVERIFY(v.canConvert(QMetaType::QObjectStar));
         QVERIFY(qvariant_cast<QObject *>(v) == o.qObject());
     }
+    {
+        QQmlEngine engine;
+        PropertyObject o;
+        QQmlProperty p(&o, "qObject", &engine);
+        QCOMPARE(p.propertyTypeCategory(), QQmlProperty::Object);
+
+        QCOMPARE(p.propertyType(), qMetaTypeId<MyQObject*>());
+        QVariant v = p.read();
+        QVERIFY(v.canConvert(QMetaType::QObjectStar));
+        QVERIFY(qvariant_cast<QObject *>(v) == o.qObject());
+    }
 
     // Object property
     {
@@ -1432,6 +1443,23 @@ void tst_qqmlproperty::write()
         QCOMPARE(newData.value<QObject*>(), newObject);
         QCOMPARE(newData.value<MyQObject*>(), newObject);
     }
+    {
+        QQmlEngine engine;
+        PropertyObject o;
+        QQmlProperty p(&o, QString("qObject"), &engine);
+        QCOMPARE(o.qObject(), (QObject*)0);
+        QObject *newObject = new MyQObject(this);
+        QCOMPARE(p.write(QVariant::fromValue(newObject)), true);
+        QCOMPARE(o.qObject(), newObject);
+        QVariant data = p.read();
+        QCOMPARE(data.value<QObject*>(), newObject);
+        QCOMPARE(data.value<MyQObject*>(), newObject);
+        // Incompatible types can not be written.
+        QCOMPARE(p.write(QVariant::fromValue(new MyQmlObject(this))), false);
+        QVariant newData = p.read();
+        QCOMPARE(newData.value<QObject*>(), newObject);
+        QCOMPARE(newData.value<MyQObject*>(), newObject);
+    }
 }
 
 void tst_qqmlproperty::reset()