diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 6fbd2d6d8003634acbe0947a6d56d04a43b1e3e2..f90e86fe2dc06246c81c36cce8821f355d4d6c16 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -628,26 +628,37 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults,
                 ty = refTy->elementType();
 
             if (NamedType *namedTy = ty->asNamedType()) {
-                const QList<Symbol *> classObjectCandidates =
-                        resolveClass(namedTy, p, _context);
+                resolveClass.setPointerAccess(true);
+                QList<Symbol *> classObjectCandidates = resolveClass(namedTy, p, _context);
 
                 foreach (Symbol *classObject, classObjectCandidates) {
-                    const QList<Result> overloads = resolveArrowOperator(p, namedTy,
-                                                                         classObject->asClass());
-                    foreach (Result r, overloads) {
-                        FullySpecifiedType ty = r.first;
-                        Function *funTy = ty->asFunctionType();
-                        if (! funTy)
-                            continue;
-
-                        ty = funTy->returnType();
-
-                        if (ReferenceType *refTy = ty->asReferenceType())
-                            ty = refTy->elementType();
-
-                        if (PointerType *ptrTy = ty->asPointerType()) {
-                            if (NamedType *namedTy = ptrTy->elementType()->asNamedType())
-                                results += resolveMember(r, memberName, namedTy);
+                    results += resolveMember(p, memberName,
+                                             control()->namedType(classObject->name()), // ### remove the call to namedType
+                                             classObject->asClass());
+                }
+
+                if (classObjectCandidates.isEmpty()) {
+                    resolveClass.setPointerAccess(false);
+                    classObjectCandidates = resolveClass(namedTy, p, _context);
+
+                    foreach (Symbol *classObject, classObjectCandidates) {
+                        const QList<Result> overloads = resolveArrowOperator(p, namedTy,
+                                                                             classObject->asClass());
+                        foreach (Result r, overloads) {
+                            FullySpecifiedType ty = r.first;
+                            Function *funTy = ty->asFunctionType();
+                            if (! funTy)
+                                continue;
+
+                            ty = funTy->returnType();
+
+                            if (ReferenceType *refTy = ty->asReferenceType())
+                                ty = refTy->elementType();
+
+                            if (PointerType *ptrTy = ty->asPointerType()) {
+                                if (NamedType *namedTy = ptrTy->elementType()->asNamedType())
+                                    results += resolveMember(r, memberName, namedTy);
+                            }
                         }
                     }
                 }
@@ -822,8 +833,15 @@ bool ResolveExpression::visit(PostIncrDecrAST *)
 
 ////////////////////////////////////////////////////////////////////////////////
 ResolveClass::ResolveClass()
+    : _pointerAccess(false)
 { }
 
+bool ResolveClass::pointerAccess() const
+{ return _pointerAccess; }
+
+void ResolveClass::setPointerAccess(bool pointerAccess)
+{ _pointerAccess = pointerAccess; }
+
 QList<Symbol *> ResolveClass::operator()(NamedType *namedTy,
                                          ResolveExpression::Result p,
                                          const LookupContext &context)
@@ -864,7 +882,13 @@ QList<Symbol *> ResolveClass::resolveClass(NamedType *namedTy,
             resolvedSymbols.append(klass);
         } else if (candidate->isTypedef()) {
             if (Declaration *decl = candidate->asDeclaration()) {
-                if (Class *asClass = decl->type()->asClassType()) {
+                if (_pointerAccess && decl->type()->isPointerType()) {
+                    PointerType *ptrTy = decl->type()->asPointerType();
+                    _pointerAccess = false;
+                    const ResolveExpression::Result r(ptrTy->elementType(), decl);
+                    resolvedSymbols += resolveClass(r, context);
+                    _pointerAccess = true;
+                } else if (Class *asClass = decl->type()->asClassType()) {
                     // typedef struct { } Point;
                     // Point pt;
                     // pt.
diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h
index ff452c4cf716cc3d7fa3b2531fb1cca5b8948f44..b154f189874b56f1f34fa10f6d4d3ecb5ac63c1a 100644
--- a/src/libs/cplusplus/ResolveExpression.h
+++ b/src/libs/cplusplus/ResolveExpression.h
@@ -130,6 +130,9 @@ class CPLUSPLUS_EXPORT ResolveClass
 public:
     ResolveClass();
 
+    bool pointerAccess() const;
+    void setPointerAccess(bool pointerAccess);
+
     QList<Symbol *> operator()(NamedType *namedTy,
                                ResolveExpression::Result p,
                                const LookupContext &context);
@@ -147,6 +150,7 @@ private:
 
 private:
     QList<ResolveExpression::Result> _blackList;
+    bool _pointerAccess;
 };