diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index e37a1b34b7f34623e75fca526251997158a429fa..348f9cddd72deb1362d6d72fd5c57c46d7b944ca 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -144,6 +144,42 @@ unsigned AccessDeclarationAST::lastToken() const
     return access_specifier_token + 1;
 }
 
+unsigned QtPropertyDeclarationNamingItemAST::firstToken() const
+{
+    return item_name_token;
+}
+
+unsigned QtPropertyDeclarationNamingItemAST::lastToken() const
+{
+    if (name_value)
+        return name_value->lastToken();
+    else
+        return item_name_token + 1;
+}
+
+unsigned QtPropertyDeclarationBoolItemAST::firstToken() const
+{
+    return item_name_token;
+}
+
+unsigned QtPropertyDeclarationBoolItemAST::lastToken() const
+{
+    if (bool_value)
+        return bool_value->lastToken();
+    else
+        return item_name_token + 1;
+}
+
+unsigned QtPropertyDeclarationFlaggingItemAST::firstToken() const
+{
+    return item_name_token;
+}
+
+unsigned QtPropertyDeclarationFlaggingItemAST::lastToken() const
+{
+    return item_name_token + 1;
+}
+
 unsigned QtPropertyDeclarationAST::firstToken() const
 {
     return property_specifier_token;
@@ -151,7 +187,18 @@ unsigned QtPropertyDeclarationAST::firstToken() const
 
 unsigned QtPropertyDeclarationAST::lastToken() const
 {
-    return rparen_token;
+    if (rparen_token)
+        return rparen_token + 1;
+    else if (property_declaration_items)
+        return property_declaration_items->lastToken();
+    else if (property_name)
+        return property_name->lastToken();
+    else if (type_id)
+        return type_id->lastToken();
+    else if (lparen_token)
+        return lparen_token + 1;
+    else
+        return property_specifier_token + 1;
 }
 
 unsigned QtEnumDeclarationAST::firstToken() const
@@ -161,17 +208,31 @@ unsigned QtEnumDeclarationAST::firstToken() const
 
 unsigned QtEnumDeclarationAST::lastToken() const
 {
-    return rparen_token;
+    if (rparen_token)
+        return rparen_token + 1;
+    else if (enumerator_list)
+        return enumerator_list->lastToken();
+    else if (lparen_token)
+        return lparen_token + 1;
+    else
+        return enum_specifier_token + 1;
 }
 
 unsigned QtFlagsDeclarationAST::firstToken() const
 {
-    return this->flags_specifier_token;
+    return flags_specifier_token + 1;
 }
 
 unsigned QtFlagsDeclarationAST::lastToken() const
 {
-    return rparen_token;
+    if (rparen_token)
+        return rparen_token + 1;
+    else if (flag_enums_list)
+        return flag_enums_list->lastToken();
+    else if (lparen_token)
+        return lparen_token + 1;
+    else
+        return flags_specifier_token + 1;
 }
 
 unsigned QtDeclareFlagsDeclarationAST::firstToken() const
@@ -181,7 +242,18 @@ unsigned QtDeclareFlagsDeclarationAST::firstToken() const
 
 unsigned QtDeclareFlagsDeclarationAST::lastToken() const
 {
-    return rparen_token;
+    if (rparen_token)
+        return rparen_token + 1;
+    else if (flags_name)
+        return flags_name->lastToken();
+    else if (comma_token)
+        return comma_token + 1;
+    else if (enum_name)
+        return enum_name->lastToken();
+    else if (lparen_token)
+        return lparen_token + 1;
+    else
+        return declareflags_specifier_token + 1;
 }
 
 unsigned ArrayAccessAST::firstToken() const
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index e7824f9393ff3f5fdb48b4e78054445bc8eef599..eef6ec7528bc83b3d31d67299156d2ee408eee0f 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -262,6 +262,10 @@ public:
     virtual QtMemberDeclarationAST *asQtMemberDeclaration() { return 0; }
     virtual QtMethodAST *asQtMethod() { return 0; }
     virtual QtPropertyDeclarationAST *asQtPropertyDeclaration() { return 0; }
+    virtual QtPropertyDeclarationBoolItemAST *asQtPropertyDeclarationBoolItem() { return 0; }
+    virtual QtPropertyDeclarationFlaggingItemAST *asQtPropertyDeclarationFlaggingItem() { return 0; }
+    virtual QtPropertyDeclarationItemAST *asQtPropertyDeclarationItem() { return 0; }
+    virtual QtPropertyDeclarationNamingItemAST *asQtPropertyDeclarationNamingItem() { return 0; }
     virtual QualifiedNameAST *asQualifiedName() { return 0; }
     virtual ReferenceAST *asReference() { return 0; }
     virtual ReturnStatementAST *asReturnStatement() { return 0; }
@@ -552,43 +556,76 @@ protected:
     virtual bool match0(AST *, ASTMatcher *);
 };
 
+class QtPropertyDeclarationItemAST: public AST
+{
+public:
+    unsigned item_name_token;
+
+public:
+    virtual QtPropertyDeclarationItemAST *asQtPropertyDeclarationItem() { return this; }
+
+    virtual QtPropertyDeclarationItemAST *clone(MemoryPool *pool) const = 0;
+};
+
+class QtPropertyDeclarationNamingItemAST: public QtPropertyDeclarationItemAST
+{
+public:
+    SimpleNameAST *name_value;
+
+public:
+    virtual QtPropertyDeclarationNamingItemAST *asQtPropertyDeclarationNamingItem() { return this; }
+
+    virtual unsigned firstToken() const;
+    virtual unsigned lastToken() const;
+
+    virtual QtPropertyDeclarationNamingItemAST *clone(MemoryPool *pool) const;
+
+protected:
+    virtual void accept0(ASTVisitor *visitor);
+    virtual bool match0(AST *, ASTMatcher *);
+};
+
+class QtPropertyDeclarationBoolItemAST: public QtPropertyDeclarationItemAST
+{
+public:
+    BoolLiteralAST *bool_value;
+
+public:
+    virtual QtPropertyDeclarationBoolItemAST *asQtPropertyDeclarationBoolItem() { return this; }
+
+    virtual unsigned firstToken() const;
+    virtual unsigned lastToken() const;
+
+    virtual QtPropertyDeclarationBoolItemAST *clone(MemoryPool *pool) const;
+
+protected:
+    virtual void accept0(ASTVisitor *visitor);
+    virtual bool match0(AST *, ASTMatcher *);
+};
+
+class QtPropertyDeclarationFlaggingItemAST: public QtPropertyDeclarationItemAST
+{
+public:
+    virtual QtPropertyDeclarationFlaggingItemAST *asQtPropertyDeclarationFlaggingItem() { return this; }
+
+    virtual unsigned firstToken() const;
+    virtual unsigned lastToken() const;
+
+    virtual QtPropertyDeclarationFlaggingItemAST *clone(MemoryPool *pool) const;
+
+protected:
+    virtual void accept0(ASTVisitor *visitor);
+    virtual bool match0(AST *, ASTMatcher *);
+};
+
 class CPLUSPLUS_EXPORT QtPropertyDeclarationAST: public DeclarationAST
 {
-    /*
-    Q_PROPERTY(type name
-            READ getFunction
-            [WRITE setFunction]
-            [RESET resetFunction]
-            [NOTIFY notifySignal]
-            [DESIGNABLE bool]
-            [SCRIPTABLE bool]
-            [STORED bool]
-            [USER bool]
-            [CONSTANT]
-            [FINAL])*/
 public:
     unsigned property_specifier_token;
     unsigned lparen_token;
     ExpressionAST *type_id;
     SimpleNameAST *property_name;
-    unsigned read_token;
-    SimpleNameAST *read_function;
-    unsigned write_token;
-    SimpleNameAST *write_function;
-    unsigned reset_token;
-    SimpleNameAST *reset_function;
-    unsigned notify_token;
-    SimpleNameAST *notify_function;
-    unsigned designable_token;
-    BoolLiteralAST *designable_value;
-    unsigned scriptable_token;
-    BoolLiteralAST *scriptable_value;
-    unsigned stored_token;
-    BoolLiteralAST *stored_value;
-    unsigned user_token;
-    BoolLiteralAST *user_value;
-    unsigned constant_token;
-    unsigned final_token;
+    QtPropertyDeclarationItemListAST *property_declaration_items;
     unsigned rparen_token;
 
 public:
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 68b907cdcfcb68b973cfe34748e8d13bdf0a6caf..183cce037a6bb5b6a50a99f050debcb90eeaa80b 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -138,6 +138,28 @@ AccessDeclarationAST *AccessDeclarationAST::clone(MemoryPool *pool) const
     return ast;
 }
 
+QtPropertyDeclarationNamingItemAST *QtPropertyDeclarationNamingItemAST::clone(MemoryPool *pool) const
+{
+    QtPropertyDeclarationNamingItemAST *ast = new (pool) QtPropertyDeclarationNamingItemAST;
+    if (name_value)
+        ast->name_value = name_value->clone(pool);
+    return ast;
+}
+
+QtPropertyDeclarationBoolItemAST *QtPropertyDeclarationBoolItemAST::clone(MemoryPool *pool) const
+{
+    QtPropertyDeclarationBoolItemAST *ast = new (pool) QtPropertyDeclarationBoolItemAST;
+    if (bool_value)
+        ast->bool_value = bool_value->clone(pool);
+    return ast;
+}
+
+QtPropertyDeclarationFlaggingItemAST *QtPropertyDeclarationFlaggingItemAST::clone(MemoryPool *pool) const
+{
+    QtPropertyDeclarationFlaggingItemAST *ast = new (pool) QtPropertyDeclarationFlaggingItemAST;
+    return ast;
+}
+
 QtPropertyDeclarationAST *QtPropertyDeclarationAST::clone(MemoryPool *pool) const
 {
     QtPropertyDeclarationAST *ast = new (pool) QtPropertyDeclarationAST;
@@ -147,32 +169,9 @@ QtPropertyDeclarationAST *QtPropertyDeclarationAST::clone(MemoryPool *pool) cons
         ast->type_id = type_id->clone(pool);
     if (property_name)
         ast->property_name = property_name->clone(pool);
-    ast->read_token = read_token;
-    if (read_function)
-        ast->read_function = read_function->clone(pool);
-    ast->write_token = write_token;
-    if (write_function)
-        ast->write_function = write_function->clone(pool);
-    ast->reset_token = reset_token;
-    if (reset_function)
-        ast->reset_function = reset_function->clone(pool);
-    ast->notify_token = notify_token;
-    if (notify_function)
-        ast->notify_function = notify_function->clone(pool);
-    ast->designable_token = designable_token;
-    if (designable_value)
-        ast->designable_value = designable_value->clone(pool);
-    ast->scriptable_token = scriptable_token;
-    if (scriptable_value)
-        ast->scriptable_value = scriptable_value->clone(pool);
-    ast->stored_token = stored_token;
-    if (stored_value)
-        ast->stored_value = stored_value->clone(pool);
-    ast->user_token = user_token;
-    if (user_value)
-        ast->user_value = user_value->clone(pool);
-    ast->constant_token = constant_token;
-    ast->final_token = final_token;
+    for (QtPropertyDeclarationItemListAST *iter = property_declaration_items, **ast_iter = &ast->property_declaration_items;
+         iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
+        *ast_iter = new (pool) QtPropertyDeclarationItemListAST((iter->value) ? iter->value->clone(pool) : 0);
     ast->rparen_token = rparen_token;
     return ast;
 }
diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp
index 6a49dba34a952630b62d650fbbc5c5f0748b19f2..74d0aa6e5eb6fe4113c8d936312e0f7cb58ebd29 100644
--- a/src/shared/cplusplus/ASTMatch0.cpp
+++ b/src/shared/cplusplus/ASTMatch0.cpp
@@ -105,6 +105,30 @@ bool AccessDeclarationAST::match0(AST *pattern, ASTMatcher *matcher)
     return false;
 }
 
+bool QtPropertyDeclarationNamingItemAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+    if (QtPropertyDeclarationNamingItemAST *_other = pattern->asQtPropertyDeclarationNamingItem())
+        return matcher->match(this, _other);
+
+    return false;
+}
+
+bool QtPropertyDeclarationBoolItemAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+    if (QtPropertyDeclarationBoolItemAST *_other = pattern->asQtPropertyDeclarationBoolItem())
+        return matcher->match(this, _other);
+
+    return false;
+}
+
+bool QtPropertyDeclarationFlaggingItemAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+    if (QtPropertyDeclarationFlaggingItemAST *_other = pattern->asQtPropertyDeclarationFlaggingItem())
+        return matcher->match(this, _other);
+
+    return false;
+}
+
 bool QtPropertyDeclarationAST::match0(AST *pattern, ASTMatcher *matcher)
 {
     if (QtPropertyDeclarationAST *_other = pattern->asQtPropertyDeclaration())
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 0ec34db4747406c56331bf07047f71844517f402..6992a1d1cc2f488a2dbc9459da6c2db778867e9e 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -206,85 +206,64 @@ bool ASTMatcher::match(AccessDeclarationAST *node, AccessDeclarationAST *pattern
     return true;
 }
 
-bool ASTMatcher::match(QtPropertyDeclarationAST *node, QtPropertyDeclarationAST *pattern)
+bool ASTMatcher::match(QtPropertyDeclarationNamingItemAST *node, QtPropertyDeclarationNamingItemAST *pattern)
 {
     (void) node;
     (void) pattern;
 
-    pattern->property_specifier_token = node->property_specifier_token;
-
-    pattern->lparen_token = node->lparen_token;
-
-    if (! pattern->type_id)
-        pattern->type_id = node->type_id;
-    else if (! AST::match(node->type_id, pattern->type_id, this))
-        return false;
-
-    if (! pattern->property_name)
-        pattern->property_name = node->property_name;
-    else if (! AST::match(node->property_name, pattern->property_name, this))
+    if (! pattern->name_value)
+        pattern->name_value = node->name_value;
+    else if (! AST::match(node->name_value, pattern->name_value, this))
         return false;
 
-    pattern->read_token = node->read_token;
-
-    if (! pattern->read_function)
-        pattern->read_function = node->read_function;
-    else if (! AST::match(node->read_function, pattern->read_function, this))
-        return false;
+    return true;
+}
 
-    pattern->write_token = node->write_token;
+bool ASTMatcher::match(QtPropertyDeclarationBoolItemAST *node, QtPropertyDeclarationBoolItemAST *pattern)
+{
+    (void) node;
+    (void) pattern;
 
-    if (! pattern->write_function)
-        pattern->write_function = node->write_function;
-    else if (! AST::match(node->write_function, pattern->write_function, this))
+    if (! pattern->bool_value)
+        pattern->bool_value = node->bool_value;
+    else if (! AST::match(node->bool_value, pattern->bool_value, this))
         return false;
 
-    pattern->reset_token = node->reset_token;
-
-    if (! pattern->reset_function)
-        pattern->reset_function = node->reset_function;
-    else if (! AST::match(node->reset_function, pattern->reset_function, this))
-        return false;
+    return true;
+}
 
-    pattern->notify_token = node->notify_token;
+bool ASTMatcher::match(QtPropertyDeclarationFlaggingItemAST *node, QtPropertyDeclarationFlaggingItemAST *pattern)
+{
+    (void) node;
+    (void) pattern;
 
-    if (! pattern->notify_function)
-        pattern->notify_function = node->notify_function;
-    else if (! AST::match(node->notify_function, pattern->notify_function, this))
-        return false;
+    return true;
+}
 
-    pattern->designable_token = node->designable_token;
+bool ASTMatcher::match(QtPropertyDeclarationAST *node, QtPropertyDeclarationAST *pattern)
+{
+    (void) node;
+    (void) pattern;
 
-    if (! pattern->designable_value)
-        pattern->designable_value = node->designable_value;
-    else if (! AST::match(node->designable_value, pattern->designable_value, this))
-        return false;
+    pattern->property_specifier_token = node->property_specifier_token;
 
-    pattern->scriptable_token = node->scriptable_token;
+    pattern->lparen_token = node->lparen_token;
 
-    if (! pattern->scriptable_value)
-        pattern->scriptable_value = node->scriptable_value;
-    else if (! AST::match(node->scriptable_value, pattern->scriptable_value, this))
+    if (! pattern->type_id)
+        pattern->type_id = node->type_id;
+    else if (! AST::match(node->type_id, pattern->type_id, this))
         return false;
 
-    pattern->stored_token = node->stored_token;
-
-    if (! pattern->stored_value)
-        pattern->stored_value = node->stored_value;
-    else if (! AST::match(node->stored_value, pattern->stored_value, this))
+    if (! pattern->property_name)
+        pattern->property_name = node->property_name;
+    else if (! AST::match(node->property_name, pattern->property_name, this))
         return false;
 
-    pattern->user_token = node->user_token;
-
-    if (! pattern->user_value)
-        pattern->user_value = node->user_value;
-    else if (! AST::match(node->user_value, pattern->user_value, this))
+    if (! pattern->property_declaration_items)
+        pattern->property_declaration_items = node->property_declaration_items;
+    else if (! AST::match(node->property_declaration_items, pattern->property_declaration_items, this))
         return false;
 
-    pattern->constant_token = node->constant_token;
-
-    pattern->final_token = node->final_token;
-
     pattern->rparen_token = node->rparen_token;
 
     return true;
diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h
index df097eec3016f474529f651044b0c07a26a95f19..f024f82ff8ae0f9a1ca1a589970afac58ea0f8db 100644
--- a/src/shared/cplusplus/ASTMatcher.h
+++ b/src/shared/cplusplus/ASTMatcher.h
@@ -142,6 +142,9 @@ public:
     virtual bool match(QtMethodAST *node, QtMethodAST *pattern);
     virtual bool match(QtMemberDeclarationAST *node, QtMemberDeclarationAST *pattern);
     virtual bool match(ObjCClassDeclarationAST *node, ObjCClassDeclarationAST *pattern);
+    virtual bool match(QtPropertyDeclarationBoolItemAST *node, QtPropertyDeclarationBoolItemAST *pattern);
+    virtual bool match(QtPropertyDeclarationFlaggingItemAST *node, QtPropertyDeclarationFlaggingItemAST *pattern);
+    virtual bool match(QtPropertyDeclarationNamingItemAST *node, QtPropertyDeclarationNamingItemAST *pattern);
     virtual bool match(ObjCClassForwardDeclarationAST *node, ObjCClassForwardDeclarationAST *pattern);
     virtual bool match(ObjCProtocolDeclarationAST *node, ObjCProtocolDeclarationAST *pattern);
     virtual bool match(ObjCProtocolForwardDeclarationAST *node, ObjCProtocolForwardDeclarationAST *pattern);
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 430f60679c8f896ec8b31c4e97917aaf8d8b9a43..22d9bd20ded0af877a04a0e5c82f30fc1b793a64 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -108,19 +108,35 @@ void AccessDeclarationAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
+void QtPropertyDeclarationNamingItemAST::accept0(ASTVisitor *visitor)
+{
+    if (visitor->visit(this)) {
+        accept(name_value, visitor);
+    }
+    visitor->endVisit(this);
+}
+
+void QtPropertyDeclarationBoolItemAST::accept0(ASTVisitor *visitor)
+{
+    if (visitor->visit(this)) {
+        accept(bool_value, visitor);
+    }
+    visitor->endVisit(this);
+}
+
+void QtPropertyDeclarationFlaggingItemAST::accept0(ASTVisitor *visitor)
+{
+    if (visitor->visit(this)) {
+    }
+    visitor->endVisit(this);
+}
+
 void QtPropertyDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(type_id, visitor);
         accept(property_name, visitor);
-        accept(read_function, visitor);
-        accept(write_function, visitor);
-        accept(reset_function, visitor);
-        accept(notify_function, visitor);
-        accept(designable_value, visitor);
-        accept(scriptable_value, visitor);
-        accept(stored_value, visitor);
-        accept(user_value, visitor);
+        accept(property_declaration_items, visitor);
     }
     visitor->endVisit(this);
 }
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 92cd08f3924e2a148c61cabbe44aa80cbc2d61a1..343e3a6331c3804ef6a9194315be867c8f53400d 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -205,6 +205,10 @@ public:
     virtual bool visit(QtMethodAST *) { return true; }
     virtual bool visit(QtMemberDeclarationAST *) { return true; }
 
+    virtual bool visit(QtPropertyDeclarationBoolItemAST *) { return true; }
+    virtual bool visit(QtPropertyDeclarationFlaggingItemAST *) { return true; }
+    virtual bool visit(QtPropertyDeclarationNamingItemAST *) { return true; }
+
     // ObjC++
     virtual bool visit(ObjCClassDeclarationAST *) { return true; }
     virtual bool visit(ObjCClassForwardDeclarationAST *) { return true; }
@@ -336,6 +340,10 @@ public:
     virtual void endVisit(QtMethodAST *) { }
     virtual void endVisit(QtMemberDeclarationAST *) { }
 
+    virtual void endVisit(QtPropertyDeclarationBoolItemAST *) { }
+    virtual void endVisit(QtPropertyDeclarationFlaggingItemAST *) { }
+    virtual void endVisit(QtPropertyDeclarationNamingItemAST *) { }
+
     // ObjC++
     virtual void endVisit(ObjCClassDeclarationAST *) { }
     virtual void endVisit(ObjCClassForwardDeclarationAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 9890143e41e95850399ac7ea02aa343fcc03d361..77864ca4575db5837f73c6cfac9d8bd51f5e59a2 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -169,6 +169,10 @@ class QtFlagsDeclarationAST;
 class QtMemberDeclarationAST;
 class QtMethodAST;
 class QtPropertyDeclarationAST;
+class QtPropertyDeclarationBoolItemAST;
+class QtPropertyDeclarationFlaggingItemAST;
+class QtPropertyDeclarationItemAST;
+class QtPropertyDeclarationNamingItemAST;
 class QualifiedNameAST;
 class ReferenceAST;
 class ReturnStatementAST;
@@ -213,8 +217,9 @@ typedef List<NestedNameSpecifierAST *> NestedNameSpecifierListAST;
 typedef List<CatchClauseAST *> CatchClauseListAST;
 typedef List<PtrOperatorAST *> PtrOperatorListAST;
 typedef List<SpecifierAST *> SpecifierListAST;
-
+typedef List<QtPropertyDeclarationItemAST *> QtPropertyDeclarationItemListAST;
 typedef List<NameAST *> NameListAST;
+
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
 typedef List<ObjCSelectorArgumentAST *> ObjCSelectorArgumentListAST;
 typedef List<ObjCPropertyAttributeAST *> ObjCPropertyAttributeListAST;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index b5c402e31426b8f35b1f72aed447d883f3db4986..faeac37e106dff9d837479a9473d67888f31b5be 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -831,13 +831,16 @@ bool CheckDeclaration::visit(QtPropertyDeclarationAST *ast)
         semantic()->check(ast->type_id, _scope);
     if (ast->property_name)
         semantic()->check(ast->property_name, _scope);
-    if (ast->read_function)
-        semantic()->check(ast->read_function, _scope);
-    if (ast->write_function)
-        semantic()->check(ast->write_function, _scope);
-    if (ast->reset_function)
-        semantic()->check(ast->reset_function, _scope);
-    if (ast->notify_function)
-        semantic()->check(ast->notify_function, _scope);
+
+    for (QtPropertyDeclarationItemListAST *iter = ast->property_declaration_items;
+         iter; iter = iter->next) {
+        if (! iter->value)
+            continue;
+
+        if (QtPropertyDeclarationNamingItemAST *namedItem = iter->value->asQtPropertyDeclarationNamingItem())
+            if (namedItem->name_value)
+                semantic()->check(namedItem->name_value, _scope);
+    }
+
     return false;
 }
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 9c504f0f546553c319174b83213e2e6c37f17923..60828aa6fe5640d651493a6916cbbc7794e7d1ea 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1794,74 +1794,59 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node)
         parseTypeId(ast->type_id);
         ast->property_name = new (_pool) SimpleNameAST;
         match(T_IDENTIFIER, &ast->property_name->identifier_token);
-
+        QtPropertyDeclarationItemListAST **iter = &ast->property_declaration_items;
         while (true) {
             if (LA() == T_RPAREN) {
                 ast->rparen_token = consumeToken();
                 node = ast;
                 break;
             } else if (LA() == T_IDENTIFIER) {
+                QtPropertyDeclarationItemAST *item = 0;
                 switch (peekAtQtContextKeyword()) {
                 case Token_READ:
-                    ast->read_token = consumeToken();
-                    ast->read_function = new (_pool) SimpleNameAST;
-                    match(T_IDENTIFIER, &ast->read_function->identifier_token);
-                    break;
-
                 case Token_WRITE:
-                    ast->write_token = consumeToken();
-                    ast->write_function = new (_pool) SimpleNameAST;
-                    match(T_IDENTIFIER, &ast->write_function->identifier_token);
-                    break;
-
                 case Token_RESET:
-                    ast->reset_token = consumeToken();
-                    ast->reset_function = new (_pool) SimpleNameAST;
-                    match(T_IDENTIFIER, &ast->reset_function->identifier_token);
-                    break;
-
-                case Token_NOTIFY:
-                    ast->notify_token = consumeToken();
-                    ast->notify_function = new (_pool) SimpleNameAST;
-                    match(T_IDENTIFIER, &ast->notify_function->identifier_token);
+                case Token_NOTIFY: {
+                    QtPropertyDeclarationNamingItemAST *nItem = new (_pool) QtPropertyDeclarationNamingItemAST;
+                    nItem->item_name_token = consumeToken();
+                    nItem->name_value = new (_pool) SimpleNameAST;
+                    match(T_IDENTIFIER, &nItem->name_value->identifier_token);
+                    item = nItem;
                     break;
+                }
 
                 case Token_DESIGNABLE:
-                    ast->designable_token = consumeToken();
-                    if (!matchBoolean(ast->designable_value))
-                        break;
-                    break;
-
                 case Token_SCRIPTABLE:
-                    ast->scriptable_token = consumeToken();
-                    if (!matchBoolean(ast->scriptable_value))
-                        break;
-                    break;
-
                 case Token_STORED:
-                    ast->stored_token = consumeToken();
-                    if (!matchBoolean(ast->stored_value))
-                        break;
-                    break;
-
-                case Token_USER:
-                    ast->user_token = consumeToken();
-                    if (!matchBoolean(ast->user_value))
-                        break;
+                case Token_USER: {
+                    QtPropertyDeclarationBoolItemAST *bItem = new (_pool) QtPropertyDeclarationBoolItemAST;
+                    bItem->item_name_token = consumeToken();
+                    ExpressionAST *expr = 0;
+                    if (parseBoolLiteral(expr))
+                        bItem->bool_value = expr->asBoolLiteral();
+                    else
+                        _translationUnit->error(cursor(), "expected `true' or `false' before `%s'", tok().spell());
+                    item = bItem;
                     break;
+                }
 
                 case Token_CONSTANT:
-                    ast->constant_token = consumeToken();
-                    break;
-
-                case Token_FINAL:
-                    ast->final_token = consumeToken();
+                case Token_FINAL: {
+                    QtPropertyDeclarationFlaggingItemAST *fItem = new (_pool) QtPropertyDeclarationFlaggingItemAST;
+                    fItem->item_name_token = consumeToken();
+                    item = fItem;
                     break;
+                }
 
                 default:
                     _translationUnit->error(cursor(), "expected `)' before `%s'", tok().spell());
                     return true;
                 }
+                if (item) {
+                    *iter = new (_pool) QtPropertyDeclarationItemListAST;
+                    (*iter)->value = item;
+                    iter = &(*iter)->next;
+                }
             } else {
                 _translationUnit->error(cursor(), "expected `)' before `%s'", tok().spell());
                 break;
@@ -1871,18 +1856,6 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node)
     return true;
 }
 
-bool Parser::matchBoolean(BoolLiteralAST *&node)
-{
-    ExpressionAST *expr = 0;
-    if (parseBoolLiteral(expr)) {
-        node = expr->asBoolLiteral();
-        return true;
-    } else {
-        _translationUnit->error(cursor(), "expected `true' or `false' before `%s'", tok().spell());
-        return false;
-    }
-}
-
 // q-enums-decl ::= 'Q_ENUMS' '(' q-enums-list? ')'
 // q-enums-list ::= identifier
 // q-enums-list ::= q-enums-list identifier
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index dddf081dd918371d27a25ddc648232f5d05e8060..07f80cdc335b5cc4f1b473b61b995be715a1a7cb 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -79,7 +79,6 @@ public:
     bool parseEmptyDeclaration(DeclarationAST *&node);
     bool parseAccessDeclaration(DeclarationAST *&node);
     bool parseQtPropertyDeclaration(DeclarationAST *&node);
-    bool matchBoolean(BoolLiteralAST *&node);
     bool parseQtEnumDeclaration(DeclarationAST *&node);
     bool parseQtFlags(DeclarationAST *&node);
     bool parseQtDeclareFlags(DeclarationAST *&node);