diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 2b787a9e11c274027e20bd99b416c05bebd1aa32..bf5df8b499b04f76351eefda0e30910dcf4648f4 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -32,13 +32,15 @@
 ***************************************************************************/
 
 #include "LookupContext.h"
+#include "ResolveExpression.h"
+#include "Overview.h"
+
 #include <CoreTypes.h>
 #include <Symbols.h>
 #include <Literals.h>
 #include <Names.h>
 #include <Scope.h>
 #include <Control.h>
-#include <cplusplus/Overview.h>
 
 #include <QtDebug>
 
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 5c656f3d57c47d4e198f822320d3b2c481c74715..6f8ae2ba9b9f7568d7c5ed3fbf4820c5a279ffce 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -427,7 +427,7 @@ bool ResolveExpression::visit(UnaryExpressionAST *ast)
 
 bool ResolveExpression::visit(QualifiedNameAST *ast)
 {
-    ResolveClass symbolsForDotAcces;
+    ResolveClass resolveClass;
     Scope dummy;
     Name *name = sem.check(ast, &dummy);
 
@@ -437,7 +437,8 @@ bool ResolveExpression::visit(QualifiedNameAST *ast)
             if (NamedType *namedTy = symbol->type()->asNamedType()) {
                 LookupContext symbolContext(symbol, _context);
                 const Result r(namedTy, symbol);
-                const QList<Symbol *> resolvedClasses = symbolsForDotAcces(r, _context);
+                const QList<Symbol *> resolvedClasses =
+                        resolveClass(r, _context);
                 if (resolvedClasses.count()) {
                     foreach (Symbol *s, resolvedClasses) {
                         addResult(s->type(), s);
@@ -555,8 +556,8 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
                     symbolsForDotAcccess(p, _context);
 
             foreach (Symbol *classObject, classObjectCandidates) {
-                const QList<Result> overloads = resolveArrayOperator(p, namedTy,
-                                                                     classObject->asClass());
+                const QList<Result> overloads =
+                        resolveArrayOperator(p, namedTy, classObject->asClass());
                 foreach (Result r, overloads) {
                     FullySpecifiedType ty = r.first;
                     Function *funTy = ty->asFunction();
@@ -803,8 +804,8 @@ ResolveClass::ResolveClass()
 { }
 
 QList<Symbol *> ResolveClass::operator()(NamedType *namedTy,
-                                                ResolveExpression::Result p,
-                                                const LookupContext &context)
+                                         ResolveExpression::Result p,
+                                         const LookupContext &context)
 {
     const QList<ResolveExpression::Result> previousBlackList = _blackList;
     const QList<Symbol *> symbols = resolveClass(namedTy, p, context);
@@ -813,7 +814,7 @@ QList<Symbol *> ResolveClass::operator()(NamedType *namedTy,
 }
 
 QList<Symbol *> ResolveClass::operator()(ResolveExpression::Result p,
-                                                const LookupContext &context)
+                                         const LookupContext &context)
 {
     const QList<ResolveExpression::Result> previousBlackList = _blackList;
     const QList<Symbol *> symbols = resolveClass(p, context);
@@ -822,8 +823,8 @@ QList<Symbol *> ResolveClass::operator()(ResolveExpression::Result p,
 }
 
 QList<Symbol *> ResolveClass::resolveClass(NamedType *namedTy,
-                                                         ResolveExpression::Result p,
-                                                         const LookupContext &context)
+                                           ResolveExpression::Result p,
+                                           const LookupContext &context)
 {
     QList<Symbol *> resolvedSymbols;
 
@@ -871,7 +872,7 @@ QList<Symbol *> ResolveClass::resolveClass(NamedType *namedTy,
 }
 
 QList<Symbol *> ResolveClass::resolveClass(ResolveExpression::Result p,
-                                                         const LookupContext &context)
+                                           const LookupContext &context)
 {
     FullySpecifiedType ty = p.first;
 
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 5ceecf9148299e761bb2ede0ce5dba0d874794aa..50e5432f2f83b13e3c24e3fb1cd13168ab2ee2e7 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -581,24 +581,36 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
     if (results.isEmpty())
         return false;
 
-    const TypeOfExpression::Result p = results.first();
+    TypeOfExpression::Result result = results.first();
     QList<Symbol *> classObjectCandidates;
 
     if (m_completionOperator == T_ARROW)  {
-        FullySpecifiedType ty = p.first;
+        FullySpecifiedType ty = result.first;
 
         if (ReferenceType *refTy = ty->asReferenceType())
             ty = refTy->elementType();
 
+        if (NamedType *namedTy = ty->asNamedType()) {
+            // ### This code is pretty slow.
+            const QList<Symbol *> candidates = context.resolve(namedTy->name());
+            foreach (Symbol *candidate, candidates) {
+                if (candidate->isTypedef()) {
+                    ty = candidate->type();
+                    const ResolveExpression::Result r(ty, candidate);
+                    result = r;
+                    break;
+                }
+            }
+        }
+
         if (NamedType *namedTy = ty->asNamedType()) {
             ResolveExpression resolveExpression(context);
             ResolveClass resolveClass;
 
-            const QList<Symbol *> candidates = resolveClass(namedTy, p, context);
-
+            const QList<Symbol *> candidates = resolveClass(result, context);
             foreach (Symbol *classObject, candidates) {
                 const QList<TypeOfExpression::Result> overloads =
-                        resolveExpression.resolveArrowOperator(p, namedTy,
+                        resolveExpression.resolveArrowOperator(result, namedTy,
                                                                classObject->asClass());
 
                 foreach (TypeOfExpression::Result r, overloads) {
@@ -615,7 +627,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
                     if (PointerType *ptrTy = ty->asPointerType()) {
                         if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) {
                             const QList<Symbol *> classes =
-                                    resolveClass(namedTy, p, context);
+                                    resolveClass(namedTy, result, context);
 
                             foreach (Symbol *c, classes) {
                                 if (! classObjectCandidates.contains(c))
@@ -629,17 +641,22 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
             if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) {
                 ResolveClass resolveClass;
 
-                const QList<Symbol *> classes = resolveClass(namedTy, p,
-                                                                    context);
+                const QList<Symbol *> classes = resolveClass(namedTy, result,
+                                                             context);
 
                 foreach (Symbol *c, classes) {
                     if (! classObjectCandidates.contains(c))
                         classObjectCandidates.append(c);
                 }
+            } else if (Class *classTy = ptrTy->elementType()->asClass()) {
+                // typedef struct { int x } *Ptr;
+                // Ptr p;
+                // p->
+                classObjectCandidates.append(classTy);
             }
         }
     } else if (m_completionOperator == T_DOT) {
-        FullySpecifiedType ty = p.first;
+        FullySpecifiedType ty = result.first;
 
         if (ReferenceType *refTy = ty->asReferenceType())
             ty = refTy->elementType();
@@ -663,7 +680,8 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
 
         if (namedTy) {
             ResolveClass resolveClass;
-            const QList<Symbol *> symbols = resolveClass(namedTy, p, context);
+            const QList<Symbol *> symbols = resolveClass(namedTy, result,
+                                                         context);
             foreach (Symbol *symbol, symbols) {
                 if (classObjectCandidates.contains(symbol))
                     continue;