diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index cbd781688c2f732dee2dd00c5227ca63f76ca1bc..6c10f88c5716118e2928e2dd9328aaf80bfb16ef 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -82,11 +82,11 @@ LookupContext::LookupContext(Control *control)
 LookupContext::LookupContext(Symbol *symbol,
                              Document::Ptr expressionDocument,
                              Document::Ptr thisDocument,
-                             const Snapshot &documents)
+                             const Snapshot &snapshot)
     : _symbol(symbol),
       _expressionDocument(expressionDocument),
       _thisDocument(thisDocument),
-      _documents(documents)
+      _snapshot(snapshot)
 {
     _control = _expressionDocument->control();
     _visibleScopes = buildVisibleScopes();
@@ -95,9 +95,6 @@ LookupContext::LookupContext(Symbol *symbol,
 bool LookupContext::isValid() const
 { return _control != 0; }
 
-LookupContext::operator bool() const
-{ return _control != 0; }
-
 Control *LookupContext::control() const
 { return _control; }
 
@@ -111,20 +108,10 @@ Document::Ptr LookupContext::thisDocument() const
 { return _thisDocument; }
 
 Document::Ptr LookupContext::document(const QString &fileName) const
-{ return _documents.value(fileName); }
+{ return _snapshot.value(fileName); }
 
-Identifier *LookupContext::identifier(Name *name) const
-{
-    if (NameId *nameId = name->asNameId())
-        return nameId->identifier();
-    else if (TemplateNameId *templId = name->asTemplateNameId())
-        return templId->identifier();
-    else if (DestructorNameId *dtorId = name->asDestructorNameId())
-        return dtorId->identifier();
-    else if (QualifiedNameId *q = name->asQualifiedNameId())
-        return identifier(q->unqualifiedNameId());
-    return 0;
-}
+Snapshot LookupContext::snapshot() const
+{ return _snapshot; }
 
 bool LookupContext::maybeValidSymbol(Symbol *symbol,
                                      ResolveMode mode,
@@ -257,6 +244,14 @@ QList<Symbol *> LookupContext::resolve(Name *name, const QList<Scope *> &visible
     return candidates;
 }
 
+Identifier *LookupContext::identifier(const Name *name) const
+{
+    if (name)
+        return name->identifier();
+
+    return 0;
+}
+
 void LookupContext::buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes,
                                               QSet<QString> *processed)
 {
@@ -267,7 +262,7 @@ void LookupContext::buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *>
             scopes->append(doc->globalSymbols());
 
         foreach (const Document::Include &incl, doc->includes()) {
-            buildVisibleScopes_helper(_documents.value(incl.fileName()),
+            buildVisibleScopes_helper(_snapshot.value(incl.fileName()),
                                       scopes, processed);
         }
     }
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index c54ea3087c7da6cba8d04aedf40cef307188b754..9ba268fe1af2537662e1731e5a81a0223cfd1199 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -43,16 +43,16 @@ public:
     LookupContext(Symbol *symbol,
                   Document::Ptr expressionDocument,
                   Document::Ptr thisDocument,
-                  const Snapshot &documents);
+                  const Snapshot &snapshot);
 
     bool isValid() const;
-    operator bool() const;
 
     Control *control() const;
     Symbol *symbol() const;
     Document::Ptr expressionDocument() const;
     Document::Ptr thisDocument() const;
     Document::Ptr document(const QString &fileName) const;
+    Snapshot snapshot() const;
 
     QList<Symbol *> resolve(Name *name) const
     { return resolve(name, visibleScopes()); }
@@ -66,9 +66,6 @@ public:
     QList<Symbol *> resolveClassOrNamespace(Name *name) const
     { return resolveClassOrNamespace(name, visibleScopes()); }
 
-    Snapshot snapshot() const
-    { return _documents; }
-
     enum ResolveMode {
         ResolveSymbol           = 0x01,
         ResolveClass            = 0x02,
@@ -77,8 +74,6 @@ public:
         ResolveAll              = ResolveSymbol | ResolveClassOrNamespace
     };
 
-    Identifier *identifier(Name *name) const;
-
     QList<Symbol *> resolve(Name *name, const QList<Scope *> &visibleScopes,
                             ResolveMode mode = ResolveAll) const;
 
@@ -120,6 +115,8 @@ public:
                         QList<Scope *> *expandedScopes) const;
 
 private:
+    Identifier *identifier(const Name *name) const;
+
     QList<Scope *> buildVisibleScopes();
 
     void buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes,
@@ -144,7 +141,7 @@ private:
     Document::Ptr _thisDocument;
 
     // All documents.
-    Snapshot _documents;
+    Snapshot _snapshot;
 
     // Visible scopes.
     QList<Scope *> _visibleScopes;
diff --git a/src/shared/cplusplus/Name.h b/src/shared/cplusplus/Name.h
index e58fd86d7ec79b58d0780616db5bc7a0b63207ca..ad871ea1daa39d1e1b49503ab6f591212b962cb8 100644
--- a/src/shared/cplusplus/Name.h
+++ b/src/shared/cplusplus/Name.h
@@ -63,6 +63,8 @@ public:
     Name();
     virtual ~Name();
 
+    virtual Identifier *identifier() const = 0;
+
     bool isNameId() const;
     bool isTemplateNameId() const;
     bool isDestructorNameId() const;
diff --git a/src/shared/cplusplus/Names.cpp b/src/shared/cplusplus/Names.cpp
index d3ae0a69b4dcd770482d0d23b8cb8eaebe24b734..a6911415f49ddfa1b1b05b47fad30cb564fb25c8 100644
--- a/src/shared/cplusplus/Names.cpp
+++ b/src/shared/cplusplus/Names.cpp
@@ -73,6 +73,14 @@ QualifiedNameId::~QualifiedNameId()
 void QualifiedNameId::accept0(NameVisitor *visitor)
 { visitor->visit(this); }
 
+Identifier *QualifiedNameId::identifier() const
+{
+    if (Name *u = unqualifiedNameId())
+        return u->identifier();
+
+    return 0;
+}
+
 unsigned QualifiedNameId::nameCount() const
 { return _nameCount; }
 
@@ -225,6 +233,9 @@ void OperatorNameId::accept0(NameVisitor *visitor)
 int OperatorNameId::kind() const
 { return _kind; }
 
+Identifier *OperatorNameId::identifier() const
+{ return 0; }
+
 bool OperatorNameId::isEqualTo(const Name *other) const
 {
     const OperatorNameId *o = other->asOperatorNameId();
@@ -246,6 +257,9 @@ void ConversionNameId::accept0(NameVisitor *visitor)
 FullySpecifiedType ConversionNameId::type() const
 { return _type; }
 
+Identifier *ConversionNameId::identifier() const
+{ return 0; }
+
 bool ConversionNameId::isEqualTo(const Name *other) const
 {
     const ConversionNameId *c = other->asConversionNameId();
diff --git a/src/shared/cplusplus/Names.h b/src/shared/cplusplus/Names.h
index e872aa0eeea4367c1cd92b7bd8f73922a0e7c0c2..3d0d1d0b9d18be71e912c2f55d12a4ade7131eb5 100644
--- a/src/shared/cplusplus/Names.h
+++ b/src/shared/cplusplus/Names.h
@@ -64,6 +64,8 @@ public:
                     bool isGlobal = false);
     virtual ~QualifiedNameId();
 
+    virtual Identifier *identifier() const;
+
     unsigned nameCount() const;
     Name *nameAt(unsigned index) const;
     Name *const *names() const;
@@ -94,7 +96,7 @@ public:
     NameId(Identifier *identifier);
     virtual ~NameId();
 
-    Identifier *identifier() const;
+    virtual Identifier *identifier() const;
 
     virtual bool isEqualTo(const Name *other) const;
 
@@ -117,7 +119,7 @@ public:
     DestructorNameId(Identifier *identifier);
     virtual ~DestructorNameId();
 
-    Identifier *identifier() const;
+    virtual Identifier *identifier() const;
 
     virtual bool isEqualTo(const Name *other) const;
 
@@ -142,7 +144,7 @@ public:
                    unsigned templateArgumentCount);
     virtual ~TemplateNameId();
 
-    Identifier *identifier() const;
+    virtual Identifier *identifier() const;
 
     // ### find a better name
     unsigned templateArgumentCount() const;
@@ -229,6 +231,7 @@ public:
 
     int kind() const;
 
+    virtual Identifier *identifier() const;
     virtual bool isEqualTo(const Name *other) const;
 
     virtual const OperatorNameId *asOperatorNameId() const
@@ -252,6 +255,7 @@ public:
 
     FullySpecifiedType type() const;
 
+    virtual Identifier *identifier() const;
     virtual bool isEqualTo(const Name *other) const;
 
     virtual const ConversionNameId *asConversionNameId() const
diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index 68b19c54e97c53d2502af52b88d50a7130951379..a012cca8ad8c450f3af939a71f2608b7357daaa4 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -296,6 +296,14 @@ void Symbol::setName(Name *name)
     }
 }
 
+Identifier *Symbol::identifier() const
+{
+    if (_name)
+        return _name->identifier();
+
+    return 0;
+}
+
 Scope *Symbol::scope() const
 { return _scope; }
 
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index 4db5d297c298384f12198b0dfbabde3b7db3930e..c5cc484f108179e1f956213dfd031daae064703c 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -125,6 +125,9 @@ public:
     /// Sets this Symbol's name.
     void setName(Name *name); // ### dangerous
 
+    /// Returns this Symbol's (optional) identifier
+    Identifier *identifier() const;
+
     /// Returns this Symbol's storage class specifier.
     int storage() const;