diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index bd3cba0a36d6af2216e113a18d2cce94fbce5862..f81b3fda8b20099256cb284db71117e1001ce881 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -540,20 +540,6 @@ bool CheckUndefinedSymbols::visit(ObjCPropertyDeclarationAST *ast)
     return false;
 }
 
-bool CheckUndefinedSymbols::visit(QtDeclareFlagsDeclarationAST *ast)
-{
-    // ### check flags name too?
-
-    if (ast->enum_name && ast->enum_name->name) {
-        const Identifier *enumId = ast->enum_name->name->identifier();
-        if (!isType(enumId)) // ### we're only checking if the enum name is known as a type name, not as an *enum*.
-            translationUnit()->warning(ast->enum_name->firstToken(),
-                                       "unknown enum '%s'",
-                                       enumId->chars());
-    }
-    return false;
-}
-
 bool CheckUndefinedSymbols::visit(QtEnumDeclarationAST *ast)
 {
     for (NameListAST *iter = ast->enumerator_list; iter; iter = iter->next) {
diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.h b/src/libs/cplusplus/CheckUndefinedSymbols.h
index dc7aa79dc36e5794a817c735aea467acab383e0e..bc55ae8f6d5d8a0f757095981bd331e4ba8b065a 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.h
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.h
@@ -98,7 +98,6 @@ protected:
     virtual bool visit(ObjCProtocolRefsAST *ast);
     virtual bool visit(ObjCPropertyDeclarationAST *ast);
 
-    virtual bool visit(QtDeclareFlagsDeclarationAST *ast);
     virtual bool visit(QtEnumDeclarationAST *ast);
     virtual bool visit(QtFlagsDeclarationAST *ast);
     virtual bool visit(QtPropertyDeclarationAST *ast);
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 7c9fe50b398f0854f74a4befda86ca3741c109e2..3f3c7099a1fd34da1e4241ab4edac359d058dbee 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -766,8 +766,10 @@ void Preprocessor::preprocess(const QString &fileName, const QByteArray &source,
                     expandBuiltinMacro(identifierToken, spell);
 
                 else {
-                    if (spell != "Q_PROPERTY" && spell != "Q_INVOKABLE" && spell != "Q_ENUMS"
-                        && spell != "Q_FLAGS" && spell != "Q_DECLARE_FLAGS") {
+                    if (spell != "Q_PROPERTY"
+                        && spell != "Q_INVOKABLE"
+                        && spell != "Q_ENUMS"
+                        && spell != "Q_FLAGS") {
 
                         // ### FIXME: shouldn't this be T_Q_PROPERTY & friends?
 
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 4504d9eadc165fbf46a3c12178791d83e7c74e6b..9a8312eabaa5573788af11e3d798d5ea68d65184 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -235,27 +235,6 @@ unsigned QtFlagsDeclarationAST::lastToken() const
         return flags_specifier_token + 1;
 }
 
-unsigned QtDeclareFlagsDeclarationAST::firstToken() const
-{
-    return declareflags_specifier_token;
-}
-
-unsigned QtDeclareFlagsDeclarationAST::lastToken() const
-{
-    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
 {
     return lbracket_token;
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 11bcaf0f1c01cee284aa5c95397e0a4bddbdf2d4..4b0c149357f1dc819b62ece6b35ebc8d33eea761 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -256,7 +256,6 @@ public:
     virtual PostfixDeclaratorAST *asPostfixDeclarator() { return 0; }
     virtual PostfixExpressionAST *asPostfixExpression() { return 0; }
     virtual PtrOperatorAST *asPtrOperator() { return 0; }
-    virtual QtDeclareFlagsDeclarationAST *asQtDeclareFlagsDeclaration() { return 0; }
     virtual QtEnumDeclarationAST *asQtEnumDeclaration() { return 0; }
     virtual QtFlagsDeclarationAST *asQtFlagsDeclaration() { return 0; }
     virtual QtMemberDeclarationAST *asQtMemberDeclaration() { return 0; }
@@ -683,29 +682,6 @@ protected:
     virtual bool match0(AST *, ASTMatcher *);
 };
 
-class CPLUSPLUS_EXPORT QtDeclareFlagsDeclarationAST: public DeclarationAST
-{
-public:
-    unsigned declareflags_specifier_token;
-    unsigned lparen_token;
-    SimpleNameAST *flags_name;
-    unsigned comma_token;
-    SimpleNameAST *enum_name;
-    unsigned rparen_token;
-
-public:
-    virtual QtDeclareFlagsDeclarationAST *asQtDeclareFlagsDeclaration() { return this; }
-
-    virtual unsigned firstToken() const;
-    virtual unsigned lastToken() const;
-
-    virtual QtDeclareFlagsDeclarationAST *clone(MemoryPool *pool) const;
-
-protected:
-    virtual void accept0(ASTVisitor *visitor);
-    virtual bool match0(AST *, ASTMatcher *);
-};
-
 class CPLUSPLUS_EXPORT AsmDefinitionAST: public DeclarationAST
 {
 public:
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 805e7837b7a728c64ef6e195c2ee14b7a0e5c5b1..87ee91558b14208778705c4cc192a26ce216cff1 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -200,20 +200,6 @@ QtFlagsDeclarationAST *QtFlagsDeclarationAST::clone(MemoryPool *pool) const
     return ast;
 }
 
-QtDeclareFlagsDeclarationAST *QtDeclareFlagsDeclarationAST::clone(MemoryPool *pool) const
-{
-    QtDeclareFlagsDeclarationAST *ast = new (pool) QtDeclareFlagsDeclarationAST;
-    ast->declareflags_specifier_token = declareflags_specifier_token;
-    ast->lparen_token = lparen_token;
-    if (flags_name)
-        ast->flags_name = flags_name->clone(pool);
-    ast->comma_token = comma_token;
-    if (enum_name)
-        ast->enum_name = enum_name->clone(pool);
-    ast->rparen_token = rparen_token;
-    return ast;
-}
-
 AsmDefinitionAST *AsmDefinitionAST::clone(MemoryPool *pool) const
 {
     AsmDefinitionAST *ast = new (pool) AsmDefinitionAST;
diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp
index 74d0aa6e5eb6fe4113c8d936312e0f7cb58ebd29..a2fcf8e0b96d4f4457a68b8386023b234aa55510 100644
--- a/src/shared/cplusplus/ASTMatch0.cpp
+++ b/src/shared/cplusplus/ASTMatch0.cpp
@@ -153,14 +153,6 @@ bool QtFlagsDeclarationAST::match0(AST *pattern, ASTMatcher *matcher)
     return false;
 }
 
-bool QtDeclareFlagsDeclarationAST::match0(AST *pattern, ASTMatcher *matcher)
-{
-    if (QtDeclareFlagsDeclarationAST *_other = pattern->asQtDeclareFlagsDeclaration())
-        return matcher->match(this, _other);
-
-    return false;
-}
-
 bool AsmDefinitionAST::match0(AST *pattern, ASTMatcher *matcher)
 {
     if (AsmDefinitionAST *_other = pattern->asAsmDefinition())
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 7f86349551c2ce993470733c5f456e77d65dc90f..c3e04a0d4e3525175bfd1fe7cd9a9db72cba4aed 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -307,32 +307,6 @@ bool ASTMatcher::match(QtFlagsDeclarationAST *node, QtFlagsDeclarationAST *patte
     return true;
 }
 
-bool ASTMatcher::match(QtDeclareFlagsDeclarationAST *node, QtDeclareFlagsDeclarationAST *pattern)
-{
-    (void) node;
-    (void) pattern;
-
-    pattern->declareflags_specifier_token = node->declareflags_specifier_token;
-
-    pattern->lparen_token = node->lparen_token;
-
-    if (! pattern->flags_name)
-        pattern->flags_name = node->flags_name;
-    else if (! AST::match(node->flags_name, pattern->flags_name, this))
-        return false;
-
-    pattern->comma_token = node->comma_token;
-
-    if (! pattern->enum_name)
-        pattern->enum_name = node->enum_name;
-    else if (! AST::match(node->enum_name, pattern->enum_name, this))
-        return false;
-
-    pattern->rparen_token = node->rparen_token;
-
-    return true;
-}
-
 bool ASTMatcher::match(AsmDefinitionAST *node, AsmDefinitionAST *pattern)
 {
     (void) node;
diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h
index f024f82ff8ae0f9a1ca1a589970afac58ea0f8db..c6466a4919f6b171d202b48c36f9ab6e6f0322f7 100644
--- a/src/shared/cplusplus/ASTMatcher.h
+++ b/src/shared/cplusplus/ASTMatcher.h
@@ -43,7 +43,6 @@ public:
     virtual bool match(QtPropertyDeclarationAST *node, QtPropertyDeclarationAST *pattern);
     virtual bool match(QtEnumDeclarationAST *node, QtEnumDeclarationAST *pattern);
     virtual bool match(QtFlagsDeclarationAST *node, QtFlagsDeclarationAST *pattern);
-    virtual bool match(QtDeclareFlagsDeclarationAST *node, QtDeclareFlagsDeclarationAST *pattern);
     virtual bool match(ArrayAccessAST *node, ArrayAccessAST *pattern);
     virtual bool match(ArrayDeclaratorAST *node, ArrayDeclaratorAST *pattern);
     virtual bool match(ArrayInitializerAST *node, ArrayInitializerAST *pattern);
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 1b9f50df58d3a06645e5c9e1f5f2de4d968870bd..8b53d99f7f3cd40263b6c184e7fcc0cfcfe8ac5a 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -157,15 +157,6 @@ void QtFlagsDeclarationAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void QtDeclareFlagsDeclarationAST::accept0(ASTVisitor *visitor)
-{
-    if (visitor->visit(this)) {
-        accept(flags_name, visitor);
-        accept(enum_name, visitor);
-    }
-    visitor->endVisit(this);
-}
-
 void AsmDefinitionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 343e3a6331c3804ef6a9194315be867c8f53400d..72a3f4b736e0ca2c45ee04e342ba2c499c8025ef 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -106,7 +106,6 @@ public:
     virtual bool visit(QtPropertyDeclarationAST *) { return true; }
     virtual bool visit(QtEnumDeclarationAST *) { return true; }
     virtual bool visit(QtFlagsDeclarationAST *) { return true; }
-    virtual bool visit(QtDeclareFlagsDeclarationAST *) { return true; }
     virtual bool visit(ArrayAccessAST *) { return true; }
     virtual bool visit(ArrayDeclaratorAST *) { return true; }
     virtual bool visit(ArrayInitializerAST *) { return true; }
@@ -241,7 +240,6 @@ public:
     virtual void endVisit(QtPropertyDeclarationAST *) { }
     virtual void endVisit(QtEnumDeclarationAST *) { }
     virtual void endVisit(QtFlagsDeclarationAST *) { }
-    virtual void endVisit(QtDeclareFlagsDeclarationAST *) { }
     virtual void endVisit(ArrayAccessAST *) { }
     virtual void endVisit(ArrayDeclaratorAST *) { }
     virtual void endVisit(ArrayInitializerAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 77864ca4575db5837f73c6cfac9d8bd51f5e59a2..d2a1d317d8111c4e9b802252084580f7f5047b38 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -163,7 +163,6 @@ class PostfixAST;
 class PostfixDeclaratorAST;
 class PostfixExpressionAST;
 class PtrOperatorAST;
-class QtDeclareFlagsDeclarationAST;
 class QtEnumDeclarationAST;
 class QtFlagsDeclarationAST;
 class QtMemberDeclarationAST;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 7ad7662af319efc0ff42c891b92ea9357afad66f..5d3646e3246fddbd25f52376cfa8dd95153289c2 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -802,15 +802,6 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast)
     return false;
 }
 
-bool CheckDeclaration::visit(QtDeclareFlagsDeclarationAST *ast)
-{
-    if (ast->flags_name)
-        semantic()->check(ast->flags_name, _scope);
-    if (ast->enum_name)
-        semantic()->check(ast->enum_name, _scope);
-    return false;
-}
-
 bool CheckDeclaration::visit(QtEnumDeclarationAST *ast)
 {
     for (NameListAST *iter = ast->enumerator_list; iter; iter = iter->next)
diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h
index 03661bc68e76e64f530b7ce5e55932e82b8ed7ca..6d06d42b9b051fcd8e875f0bd81a2dc115cabdbb 100644
--- a/src/shared/cplusplus/CheckDeclaration.h
+++ b/src/shared/cplusplus/CheckDeclaration.h
@@ -80,7 +80,6 @@ protected:
     virtual bool visit(QtPropertyDeclarationAST *ast);
     virtual bool visit(QtEnumDeclarationAST *ast);
     virtual bool visit(QtFlagsDeclarationAST *ast);
-    virtual bool visit(QtDeclareFlagsDeclarationAST *ast);
     virtual bool visit(AsmDefinitionAST *ast);
     virtual bool visit(ExceptionDeclarationAST *ast);
     virtual bool visit(FunctionDefinitionAST *ast);
diff --git a/src/shared/cplusplus/Keywords.cpp b/src/shared/cplusplus/Keywords.cpp
index 414221efa630f447ac0e6f39a8a879fe98c4c0d6..e1e45373ea66108055518c3f01be2b0d61c43a66 100644
--- a/src/shared/cplusplus/Keywords.cpp
+++ b/src/shared/cplusplus/Keywords.cpp
@@ -1283,41 +1283,6 @@ static inline int classify13(const char *s, bool) {
   return T_IDENTIFIER;
 }
 
-static inline int classify15(const char *s, bool) {
-  if (s[0] == 'Q') {
-    if (s[1] == '_') {
-      if (s[2] == 'D') {
-        if (s[3] == 'E') {
-          if (s[4] == 'C') {
-            if (s[5] == 'L') {
-              if (s[6] == 'A') {
-                if (s[7] == 'R') {
-                  if (s[8] == 'E') {
-                    if (s[9] == '_') {
-                      if (s[10] == 'F') {
-                        if (s[11] == 'L') {
-                          if (s[12] == 'A') {
-                            if (s[13] == 'G') {
-                              if (s[14] == 'S') {
-                                return T_Q_DECLARE_FLAGS;
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  return T_IDENTIFIER;
-}
-
 static inline int classify16(const char *s, bool) {
   if (s[0] == 'r') {
     if (s[1] == 'e') {
@@ -1369,7 +1334,6 @@ int Lexer::classify(const char *s, int n, bool q) {
     case 11: return classify11(s, q);
     case 12: return classify12(s, q);
     case 13: return classify13(s, q);
-    case 15: return classify15(s, q);
     case 16: return classify16(s, q);
     default: return T_IDENTIFIER;
   } // switch
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 86fb18dd2c3bb66e97901929f715ff0fa3a9eb2a..a9fd9f0d50775edd71ca6372db38bf857b845678 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1920,29 +1920,6 @@ bool Parser::parseQtFlags(DeclarationAST *&node)
     return true;
 }
 
-// q-declare-flags ::= 'Q_DECLARE_FLAGS' '(' q-flags-name ',' q-enum-name ')'
-// q-flags-name    ::= T_IDENTIFIER
-// q-enum-name     ::= T_IDENTIFIER
-bool Parser::parseQtDeclareFlags(DeclarationAST *&node)
-{
-     /*Q_DECLARE_FLAGS(flag enum)*/
-    DEBUG_THIS_RULE();
-    if (LA() != T_Q_DECLARE_FLAGS)
-        return false;
-
-    QtDeclareFlagsDeclarationAST *ast = new (_pool) QtDeclareFlagsDeclarationAST;
-    ast->declareflags_specifier_token = consumeToken();
-    match(T_LPAREN, &ast->lparen_token);
-    ast->flags_name = new (_pool) SimpleNameAST;
-    match(T_IDENTIFIER, &ast->flags_name->identifier_token);
-    match(T_COMMA, &ast->comma_token);
-    ast->enum_name = new (_pool) SimpleNameAST;
-    match(T_IDENTIFIER, &ast->enum_name->identifier_token);
-    match(T_RPAREN, &ast->rparen_token);
-    node = ast;
-    return true;
-}
-
 bool Parser::parseMemberSpecification(DeclarationAST *&node)
 {
     DEBUG_THIS_RULE();
@@ -1972,9 +1949,6 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node)
     case T_Q_FLAGS:
         return parseQtFlags(node);
 
-    case T_Q_DECLARE_FLAGS:
-        return parseQtDeclareFlags(node);
-
     default:
         return parseSimpleDeclaration(node, /*acceptStructDeclarator=*/true);
     } // switch
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 07f80cdc335b5cc4f1b473b61b995be715a1a7cb..ab4449ee743b218427ff7c260896b53a00e38685 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -81,7 +81,6 @@ public:
     bool parseQtPropertyDeclaration(DeclarationAST *&node);
     bool parseQtEnumDeclaration(DeclarationAST *&node);
     bool parseQtFlags(DeclarationAST *&node);
-    bool parseQtDeclareFlags(DeclarationAST *&node);
     bool parseAdditiveExpression(ExpressionAST *&node);
     bool parseAndExpression(ExpressionAST *&node);
     bool parseAsmDefinition(DeclarationAST *&node);
diff --git a/src/shared/cplusplus/Token.cpp b/src/shared/cplusplus/Token.cpp
index f071d21d875ea230e28bfd26ae256dc54ff7e784..e86038271fa1eed95d0f18f59eac5e4d8bafd4ce 100644
--- a/src/shared/cplusplus/Token.cpp
+++ b/src/shared/cplusplus/Token.cpp
@@ -93,7 +93,7 @@ static const char *token_names[] = {
 
     ("SIGNAL"), ("SLOT"), ("Q_SIGNAL"), ("Q_SLOT"), ("signals"), ("slots"),
     ("Q_FOREACH"), ("Q_D"), ("Q_Q"),
-    ("Q_INVOKABLE"), ("Q_PROPERTY"), ("Q_ENUMS"), ("Q_FLAGS"), ("Q_DECLARE_FLAGS")
+    ("Q_INVOKABLE"), ("Q_PROPERTY"), ("Q_ENUMS"), ("Q_FLAGS")
 };
 
 Token::Token() :
diff --git a/src/shared/cplusplus/Token.h b/src/shared/cplusplus/Token.h
index c915e31f4ea019a9621ea051d4a21e12f3dbbc01..d139584bddbc116474808e77aec38aeda7ce4032 100644
--- a/src/shared/cplusplus/Token.h
+++ b/src/shared/cplusplus/Token.h
@@ -242,8 +242,7 @@ enum Kind {
     T_Q_PROPERTY,
     T_Q_ENUMS,
     T_Q_FLAGS,
-    T_Q_DECLARE_FLAGS,
-    T_LAST_KEYWORD = T_Q_DECLARE_FLAGS,
+    T_LAST_KEYWORD = T_Q_FLAGS,
 
     // aliases
     T_OR = T_PIPE_PIPE,