diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index e703f5fddb2b4badba7a229449f93ae0b827d7dc..40dd61b2c538da033e850ffd041c710540570876 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -78,21 +78,25 @@ QList<int> FindUsages::references() const
 
 void FindUsages::operator()(Symbol *symbol)
 {
+    if (! symbol)
+        return;
+
+    _id = symbol->identifier();
+
+    if (! _id)
+        return;
+
     _processed.clear();
     _references.clear();
     _usages.clear();
-    _declSymbol = symbol;
+    _declSymbolFullyQualifiedName = LookupContext::fullyQualifiedName(symbol);
     _inSimpleDeclaration = 0;
     _inQProperty = false;
 
-    _id = 0;
-    if (_declSymbol && 0 != (_id = _declSymbol->identifier()))
-        _id = _doc->control()->findOrInsertIdentifier(_id->chars(), _id->size());
+    // get the canonical id
+    _id = _doc->control()->findOrInsertIdentifier(_id->chars(), _id->size());
 
-    if (_id) {
-        _exprDoc = Document::create("<references>");
-        accept(_doc->translationUnit()->ast());
-    }
+    accept(_doc->translationUnit()->ast());
 }
 
 QString FindUsages::matchingLine(const Token &tk) const
@@ -160,13 +164,26 @@ void FindUsages::reportResult(unsigned tokenIndex)
     _references.append(tokenIndex);
 }
 
+bool FindUsages::compareFullyQualifiedName(const QList<const Name *> &path, const QList<const Name *> &other)
+{
+    if (path.length() != other.length())
+        return false;
+
+    for (int i = 0; i < path.length(); ++i) {
+        if (! path.at(i)->isEqualTo(other.at(i)))
+            return false;
+    }
+
+    return true;
+}
+
 bool FindUsages::checkCandidates(const QList<LookupItem> &candidates) const
 {
-    if (ClassOrNamespace *c = _context.lookupType(_declSymbol)) {
-        for (int i = candidates.size() - 1; i != -1; --i) {
-            const LookupItem &r = candidates.at(i);
-            Symbol *s = r.declaration();
-            if (_context.lookupType(s) == c)
+    for (int i = candidates.size() - 1; i != -1; --i) {
+        const LookupItem &r = candidates.at(i);
+
+        if (Symbol *s = r.declaration()) {
+            if (compareFullyQualifiedName(LookupContext::fullyQualifiedName(s), _declSymbolFullyQualifiedName))
                 return true;
         }
     }
@@ -180,6 +197,16 @@ void FindUsages::ensureNameIsValid(NameAST *ast)
         ast->name = _sem.check(ast, /*scope = */ 0);
 }
 
+bool FindUsages::visit(NamespaceAST *ast)
+{
+    const Identifier *id = identifier(ast->identifier_token);
+    if (id == _id && ast->symbol) {
+        const QList<LookupItem> candidates = _context.lookup(ast->symbol->name(), scopeAt(ast->identifier_token));
+        reportResult(ast->identifier_token, candidates);
+    }
+    return true;
+}
+
 bool FindUsages::visit(MemInitializerAST *ast)
 {
     if (ast->name && ast->name->asSimpleName() != 0) {
diff --git a/src/libs/cplusplus/FindUsages.h b/src/libs/cplusplus/FindUsages.h
index f274da04d6676000c74dbc008c7b22dc54eeeaf6..05a71e9e966dbf42d57e524fba813baac02d5fa3 100644
--- a/src/libs/cplusplus/FindUsages.h
+++ b/src/libs/cplusplus/FindUsages.h
@@ -82,6 +82,7 @@ protected:
 
     void ensureNameIsValid(NameAST *ast);
 
+    virtual bool visit(NamespaceAST *ast);
     virtual bool visit(MemInitializerAST *ast);
     virtual bool visit(MemberAccessAST *ast);
     virtual bool visit(QualifiedNameAST *ast);
@@ -104,15 +105,15 @@ protected:
     virtual bool visit(TemplateTypeParameterAST *ast);
 
     unsigned startOfTemplateDeclaration(TemplateDeclarationAST *ast) const;
+    static bool compareFullyQualifiedName(const QList<const Name *> &path, const QList<const Name *> &other);
 
 private:
     const Identifier *_id;
-    Symbol *_declSymbol;
+    QList<const Name *> _declSymbolFullyQualifiedName;
     Document::Ptr _doc;
     Snapshot _snapshot;
     LookupContext _context;
     QByteArray _source;
-    Document::Ptr _exprDoc;
     Semantic _sem;
     QList<QualifiedNameAST *> _qualifiedNameStack;
     QList<TemplateDeclarationAST *> _templateDeclarationStack;
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index 451aef42613c21a85306ba16da48bc28823451d8..624eea525dccfab97fe5836e1b16a004fa7d78c2 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -185,7 +185,7 @@ static void find_helper(QFutureInterface<Usage> &future,
     const QString sourceFile = QString::fromUtf8(symbol->fileName(), symbol->fileNameLength());
     QStringList files(sourceFile);
 
-    if (symbol->isClass() || symbol->isForwardClassDeclaration()) {
+    if (symbol->isClass() || symbol->isForwardClassDeclaration() || (symbol->scope() && symbol->scope()->isNamespaceScope())) {
         foreach (const Document::Ptr &doc, context.snapshot()) {
             if (doc->fileName() == sourceFile)
                 continue;