diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 956ec267e74bbc9e1b3f3229ac3ddb9599adbd79..f4b39763ce5b62358961e5f632f1ecaec3e9522c 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -45,6 +45,25 @@
 
 using namespace CPlusPlus;
 
+static void fullyQualifiedName(Symbol *symbol, QList<const Name *> *names)
+{
+    if (! symbol)
+        return;
+
+    fullyQualifiedName(symbol->enclosingSymbol(), names);
+
+    if (symbol->name() && (symbol->isClass() || symbol->isNamespace())) {
+        if (const QualifiedNameId *q = symbol->name()->asQualifiedNameId()) {
+            for (unsigned i = 0; i < q->nameCount(); ++i)
+                names->append(q->nameAt(i));
+
+        } else if (symbol->name()->isNameId() || symbol->name()->isTemplateNameId()) {
+            names->append(symbol->name());
+
+        }
+    }
+}
+
 /////////////////////////////////////////////////////////////////////
 // LookupContext
 /////////////////////////////////////////////////////////////////////
@@ -201,6 +220,14 @@ QList<Symbol *> LookupContext::lookup(const Name *name, Scope *scope) const
                 const QualifiedNameId *q = fun->name()->asQualifiedNameId();
                 QList<QByteArray> path;
 
+                QList<const Name *> enclosingNames;
+                fullyQualifiedName(scope->owner(), &enclosingNames);
+                foreach (const Name *p, enclosingNames) {
+                    if (const Identifier *id = p->identifier()) {
+                        path.append(QByteArray::fromRawData(id->chars(), id->size()));
+                    }
+                }
+
                 for (unsigned index = 0; index < q->nameCount() - 1; ++index) {
                     if (const Identifier *id = q->nameAt(index)->identifier())
                         path.append(QByteArray::fromRawData(id->chars(), id->size()));
@@ -572,22 +599,20 @@ ClassOrNamespace *CreateBindings::globalNamespace() const
     return _globalNamespace;
 }
 
-ClassOrNamespace *CreateBindings::findClassOrNamespace(Symbol *s)
+ClassOrNamespace *CreateBindings::findClassOrNamespace(Symbol *symbol)
 {
-    // jump to the enclosing class or namespace.
-    for (; s; s = s->enclosingSymbol()) {
-        if (s->isClass() || s->isNamespace())
-            break;
-    }
+    QList<const Name *> names;
+    fullyQualifiedName(symbol, &names);
 
-    QList<QByteArray> path;
-    for (; s; s = s->enclosingSymbol()) {
-        if (const Identifier *id = s->identifier())
-            path.prepend(QByteArray::fromRawData(id->chars(), id->size()));
-    }
+    if (names.isEmpty())
+        return _globalNamespace;
 
-    ClassOrNamespace *e = _globalNamespace->findClassOrNamespace(path);
-    return e;
+    ClassOrNamespace *b = _globalNamespace->lookupClassOrNamespace(names.at(0));
+
+    for (int i = 1; b && i < names.size(); ++i)
+        b = b->findClassOrNamespace(names.at(i));
+
+    return b;
 }
 
 ClassOrNamespace *CreateBindings::findClassOrNamespace(const QList<QByteArray> &path)