diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 5723433aca0c8053ea31788974e126be908ad3ef..ed2afed6eddbbf000cd6e41e3597d4abe6de479f 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -126,59 +126,48 @@ bool LookupContext::maybeValidSymbol(Symbol *symbol,
     return false;
 }
 
-QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q,
-                                                      const QList<Scope *> &visibleScopes,
-                                                      ResolveMode mode) const
+QList<Scope *> LookupContext::resolveNestedNameSpecifier(QualifiedNameId *q,
+                                                          const QList<Scope *> &visibleScopes) const
 {
-    QList<Scope *> scopes = visibleScopes;
     QList<Symbol *> candidates;
+    QList<Scope *> scopes = visibleScopes;
 
-    for (unsigned i = 0; i < q->nameCount(); ++i) {
+    for (unsigned i = 0; i < q->nameCount() - 1; ++i) {
         Name *name = q->nameAt(i);
 
-        if (i + 1 == q->nameCount())
-            candidates = resolve(name, scopes, mode);
-        else
-            candidates = resolveClassOrNamespace(name, scopes);
+        candidates = resolveClassOrNamespace(name, scopes);
 
-        if (candidates.isEmpty() || i + 1 == q->nameCount())
+        if (candidates.isEmpty())
             break;
 
         scopes.clear();
+
         foreach (Symbol *candidate, candidates) {
-            if (ScopedSymbol *scoped = candidate->asScopedSymbol()) {
-                scopes.append(scoped->members());
-            }
+            ScopedSymbol *scoped = candidate->asScopedSymbol();
+            Scope *members = scoped->members();
+
+            if (! scopes.contains(members))
+                scopes.append(members);
         }
     }
 
-    Identifier *id = q->identifier();
-    foreach (Scope *scope, visibleScopes) {
-        Symbol *symbol = scope->lookat(id);
-        for (; symbol; symbol = symbol->next()) {
-            if (! symbol->name())
-                continue;
-            else if (! maybeValidSymbol(symbol, mode, candidates))
-                continue;
-            QualifiedNameId *qq = symbol->name()->asQualifiedNameId();
-            if (! qq)
-                continue;
-            if (q->nameCount() > qq->nameCount())
-                continue;
+    return scopes;
+}
+
+QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q,
+                                                      const QList<Scope *> &visibleScopes,
+                                                      ResolveMode mode) const
+{
+    QList<Scope *> scopes;
 
-            for (int i = q->nameCount() - 1; i != -1; --i) {
-                Name *a = q->nameAt(i);
-                Name *b = qq->nameAt(i);
+    if (q->nameCount() == 1)
+        scopes = visibleScopes;     // ### handle global scope lookup
+    else
+        scopes = resolveNestedNameSpecifier(q, visibleScopes);
 
-                if (! a->isEqualTo(b))
-                    break;
-                else if (i == 0)
-                    candidates.append(symbol);
-            }
-        }
-    }
+    // ### expand the scopes.
 
-    return candidates;
+    return resolve(q->unqualifiedNameId(), scopes, mode);
 }
 
 QList<Symbol *> LookupContext::resolveOperatorNameId(OperatorNameId *opId,
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 4985e11f74104aafda9c2f391e895ee6834129f0..fcfac57826246ce65d09bd9370a15e34e953dc3b 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -123,6 +123,9 @@ private:
                                           const QList<Scope *> &visibleScopes,
                                           ResolveMode mode) const;
 
+    QList<Scope *> resolveNestedNameSpecifier(QualifiedNameId *q,
+                                               const QList<Scope *> &visibleScopes) const;
+
     Identifier *identifier(const Name *name) const;
 
     QList<Scope *> buildVisibleScopes();