diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp
index 38d14eda5c09e19f0f9570cf1f183f0d80daa5b4..601a373ae34980cc848ed6eeab42fdf7c6d41b38 100644
--- a/src/libs/qmljs/qmljscheck.cpp
+++ b/src/libs/qmljs/qmljscheck.cpp
@@ -93,6 +93,42 @@ DiagnosticMessage QmlJS::errorMessage(const AST::SourceLocation &loc, const QStr
     return DiagnosticMessage(DiagnosticMessage::Error, loc, message);
 }
 
+namespace {
+class SharedData
+{
+public:
+    SharedData()
+    {
+        validBuiltinPropertyNames.insert(QLatin1String("action"));
+        validBuiltinPropertyNames.insert(QLatin1String("bool"));
+        validBuiltinPropertyNames.insert(QLatin1String("color"));
+        validBuiltinPropertyNames.insert(QLatin1String("date"));
+        validBuiltinPropertyNames.insert(QLatin1String("double"));
+        validBuiltinPropertyNames.insert(QLatin1String("enumeration"));
+        validBuiltinPropertyNames.insert(QLatin1String("font"));
+        validBuiltinPropertyNames.insert(QLatin1String("int"));
+        validBuiltinPropertyNames.insert(QLatin1String("list"));
+        validBuiltinPropertyNames.insert(QLatin1String("point"));
+        validBuiltinPropertyNames.insert(QLatin1String("real"));
+        validBuiltinPropertyNames.insert(QLatin1String("rect"));
+        validBuiltinPropertyNames.insert(QLatin1String("size"));
+        validBuiltinPropertyNames.insert(QLatin1String("string"));
+        validBuiltinPropertyNames.insert(QLatin1String("time"));
+        validBuiltinPropertyNames.insert(QLatin1String("url"));
+        validBuiltinPropertyNames.insert(QLatin1String("variant"));
+        validBuiltinPropertyNames.insert(QLatin1String("vector3d"));
+    }
+
+    QSet<QString> validBuiltinPropertyNames;
+};
+} // anonymous namespace
+Q_GLOBAL_STATIC(SharedData, sharedData)
+
+bool QmlJS::isValidBuiltinPropertyType(const QString &name)
+{
+    return sharedData()->validBuiltinPropertyNames.contains(name);
+}
+
 namespace {
 
 class AssignmentCheck : public ValueVisitor
@@ -597,6 +633,19 @@ bool Check::visit(UiArrayBinding *ast)
     return true;
 }
 
+bool Check::visit(UiPublicMember *ast)
+{
+    // check if the member type is valid
+    if (ast->memberType) {
+        const QString name = ast->memberType->asString();
+        if (!name.isEmpty() && name.at(0).isLower()) {
+            if (!isValidBuiltinPropertyType(name))
+                error(ast->typeToken, tr("'%1' is not a valid property type").arg(name));
+        }
+    }
+    return true;
+}
+
 bool Check::visit(IdentifierExpression *ast)
 {
     // currently disabled: too many false negatives
diff --git a/src/libs/qmljs/qmljscheck.h b/src/libs/qmljs/qmljscheck.h
index 392fc6c0e10517b1721ffadc25452fe7b7c113d8..af4b75c2c3c93ab2fa6dd6d1fb83425a4733e787 100644
--- a/src/libs/qmljs/qmljscheck.h
+++ b/src/libs/qmljs/qmljscheck.h
@@ -91,6 +91,7 @@ protected:
     virtual bool visit(AST::UiObjectBinding *ast);
     virtual bool visit(AST::UiScriptBinding *ast);
     virtual bool visit(AST::UiArrayBinding *ast);
+    virtual bool visit(AST::UiPublicMember *ast);
     virtual bool visit(AST::IdentifierExpression *ast);
     virtual bool visit(AST::FieldMemberExpression *ast);
     virtual bool visit(AST::FunctionDeclaration *ast);
@@ -152,6 +153,8 @@ QMLJS_EXPORT AST::SourceLocation fullLocationForQualifiedId(AST::UiQualifiedId *
 QMLJS_EXPORT DiagnosticMessage errorMessage(const AST::SourceLocation &loc,
                                             const QString &message);
 
+QMLJS_EXPORT bool isValidBuiltinPropertyType(const QString &name);
+
 template <class T>
 DiagnosticMessage errorMessage(const T *node, const QString &message)
 {