diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 075a55b96e96008767490956b909c33345f911f4..947bea8f6f7081c9c6bea567de52c2183854331e 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -515,7 +515,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
             } if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) &&
                       completeMember(exprTy, resolvedTypes, context)) {
                 return m_startPosition;
-            } else if (m_completionOperator == T_COLON_COLON && completeScope(exprTy, resolvedTypes, context)) {
+            } else if (m_completionOperator == T_COLON_COLON && completeScope(resolvedTypes, context)) {
                 return m_startPosition;
             } else if (m_completionOperator == T_SIGNAL && completeSignal(exprTy, resolvedTypes, context)) {
                 return m_startPosition;
@@ -682,32 +682,45 @@ bool CppCodeCompletion::completeMember(FullySpecifiedType,
     return false;
 }
 
-bool CppCodeCompletion::completeScope(FullySpecifiedType exprTy,
-                                      const QList<TypeOfExpression::Result> &resolvedTypes,
+bool CppCodeCompletion::completeScope(const QList<TypeOfExpression::Result> &results,
                                       const LookupContext &context)
 {
+    if (results.isEmpty())
+        return false; // nothing to do.
+
     // Search for a class or a namespace.
-    foreach (TypeOfExpression::Result p, resolvedTypes) {
-        if (p.first->isClass() || p.first->isNamespace()) {
-            exprTy = p.first;
+    TypeOfExpression::Result result(FullySpecifiedType(), 0);
+    foreach (result, results) {
+        FullySpecifiedType ty = result.first;
+
+        if (ty->isClass() || ty->isNamespace())
             break;
-        }
     }
 
-    if (exprTy->asNamespace()) {
+    FullySpecifiedType exprTy = result.first;
+    if (! exprTy) {
+        return false;
+    } else if (exprTy->asNamespace()) {
         QList<Symbol *> candidates;
-        foreach (TypeOfExpression::Result p, resolvedTypes) {
+        foreach (TypeOfExpression::Result p, results) {
             if (Namespace *ns = p.first->asNamespace())
                 candidates.append(ns);
         }
         completeNamespace(candidates, context);
     } else if (exprTy->isClass()) {
         QList<Symbol *> candidates;
-        foreach (TypeOfExpression::Result p, resolvedTypes) {
+        foreach (TypeOfExpression::Result p, results) {
             if (Class *k = p.first->asClass())
                 candidates.append(k);
         }
         completeClass(candidates, context);
+    } else if (Symbol *symbol = result.second) {
+        if (symbol->isTypedef()) {
+            SymbolsForDotAccess symbolsForDotAccess;
+            const QList<Symbol *> candidates = symbolsForDotAccess(result,
+                                                                   context);
+            completeClass(candidates, context);
+        }
     }
 
     return ! m_completions.isEmpty();
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index baf278e71d0ed4ce7540082939d0ed81de06d887..faaaec3570bf7a3c9d9825f174e9d63c0604782d 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -100,8 +100,7 @@ private:
                         const QList<CPlusPlus::TypeOfExpression::Result> &,
                         const CPlusPlus::LookupContext &context);
 
-    bool completeScope(CPlusPlus::FullySpecifiedType exprTy,
-                       const QList<CPlusPlus::TypeOfExpression::Result> &,
+    bool completeScope(const QList<CPlusPlus::TypeOfExpression::Result> &,
                        const CPlusPlus::LookupContext &context);
 
     void completeNamespace(const QList<CPlusPlus::Symbol *> &candidates,