diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index 7de0f7c77dac8907729f409bb07fe9c2a92279af..7b1d0a8f79c8ee55dfb403890c0901ddb5b14cfc 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -273,40 +273,33 @@ bool CheckUndefinedSymbols::warning(AST *ast, const QString &text)
     return false;
 }
 
-bool CheckUndefinedSymbols::visit(UsingDirectiveAST *ast)
+bool CheckUndefinedSymbols::visit(NamespaceAST *ast)
 {
-    checkNamespace(ast->name);
-    return false;
+    if (ast->identifier_token) {
+        const Token &tok = tokenAt(ast->identifier_token);
+        if (! tok.generated()) {
+            unsigned line, column;
+            getTokenStartPosition(ast->identifier_token, &line, &column);
+            Use use(line, column, tok.length());
+            _typeUsages.append(use);
+        }
+    }
+
+    return true;
 }
 
-bool CheckUndefinedSymbols::visit(SimpleDeclarationAST *)
+bool CheckUndefinedSymbols::visit(UsingDirectiveAST *)
 {
     return true;
 }
 
-bool CheckUndefinedSymbols::visit(NamedTypeSpecifierAST *ast)
+bool CheckUndefinedSymbols::visit(SimpleDeclarationAST *)
 {
-#if 0
-    if (ast->name) {
-        unsigned line, column;
-        getTokenStartPosition(ast->name->firstToken(), &line, &column);
-
-        // ### use the potential types.
-        Scope *enclosingScope = _context.thisDocument()->scopeAt(line, column);
-        const QList<Symbol *> candidates = _context.lookup(ast->name->name, enclosingScope);
-
-        Symbol *ty = 0;
-        foreach (Symbol *c, candidates) {
-            if (c->isTypedef() || c->isClass() || c->isEnum()
-                    || c->isForwardClassDeclaration() || c->isTypenameArgument())
-                ty = c;
-        }
-
-        if (! ty)
-            warning(ast->name, QCoreApplication::translate("CheckUndefinedSymbols", "Expected a type-name"));
-    }
-#endif
+    return true;
+}
 
+bool CheckUndefinedSymbols::visit(NamedTypeSpecifierAST *)
+{
     return true;
 }
 
@@ -330,7 +323,7 @@ void CheckUndefinedSymbols::checkNamespace(NameAST *name)
     warning(line, column, QCoreApplication::translate("CheckUndefinedSymbols", "Expected a namespace-name"), length);
 }
 
-bool CheckUndefinedSymbols::visit(SimpleNameAST *ast)
+void CheckUndefinedSymbols::checkName(NameAST *ast)
 {
     if (ast->name) {
         const QByteArray id = QByteArray::fromRawData(ast->name->identifier()->chars(), // ### move
@@ -345,25 +338,17 @@ bool CheckUndefinedSymbols::visit(SimpleNameAST *ast)
             addTypeUsage(candidates, ast);
         }
     }
+}
 
+bool CheckUndefinedSymbols::visit(SimpleNameAST *ast)
+{
+    checkName(ast);
     return true;
 }
 
 bool CheckUndefinedSymbols::visit(TemplateIdAST *ast)
 {
-    if (ast->name) {
-        const QByteArray id = QByteArray::fromRawData(ast->name->identifier()->chars(), // ### move
-                                                      ast->name->identifier()->size());
-        if (_potentialTypes.contains(id)) {
-            Scope *scope = CollectTypes::findScope(tokenAt(ast->firstToken()).offset, _scopes); // ### move
-            if (! scope)
-                scope = _context.thisDocument()->globalSymbols();
-
-            ClassOrNamespace *b = _context.lookupType(ast->name, scope);
-            addTypeUsage(b, ast);
-        }
-    }
-
+    checkName(ast);
     return true;
 }
 
@@ -446,7 +431,13 @@ void CheckUndefinedSymbols::addTypeUsage(const QList<Symbol *> &candidates, Name
     const unsigned length = tok.length();
 
     foreach (Symbol *c, candidates) {
-        if (c->isTypedef() || c->isClass() || c->isEnum() || c->isForwardClassDeclaration() || c->isTypenameArgument()) {
+        if (c->isUsingDeclaration()) // skip using declarations...
+            continue;
+        else if (c->isUsingNamespaceDirective()) // ... and using namespace directives.
+            continue;
+        else if (c->isTypedef() || c->isNamespace() ||
+                 c->isClass() || c->isEnum() ||
+                 c->isForwardClassDeclaration() || c->isTypenameArgument()) {
             Use use(line, column, length);
             _typeUsages.append(use);
             //qDebug() << "added use" << oo(ast->name) << line << column << length;
diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.h b/src/libs/cplusplus/CheckUndefinedSymbols.h
index f375d904e8a5e14d090aa33f05ad22bb30b11ba6..ec636191c15a5572c786f2e8bba26d0b32ebed3c 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.h
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.h
@@ -62,10 +62,12 @@ protected:
     bool warning(unsigned line, unsigned column, const QString &text, unsigned length = 0);
     bool warning(AST *ast, const QString &text);
 
+    void checkName(NameAST *ast);
     void checkNamespace(NameAST *name);
     void addTypeUsage(ClassOrNamespace *b, NameAST *ast);
     void addTypeUsage(const QList<Symbol *> &candidates, NameAST *ast);
 
+    virtual bool visit(NamespaceAST *);
     virtual bool visit(UsingDirectiveAST *);
     virtual bool visit(SimpleDeclarationAST *);
     virtual bool visit(NamedTypeSpecifierAST *);