diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index e28aaa17790f375b8e0906269ba6089cdca56da0..4e4e360fd77a5c4e979b3da4a47666242d73d8a9 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -447,6 +447,9 @@ void LookupContext::expandClass(Class *klass,
                                 const QList<Scope *> &visibleScopes,
                                 QList<Scope *> *expandedScopes) const
 {
+    for (TemplateParameters *params = klass->templateParameters(); params; params = params->previous())
+        expand(params->scope(), visibleScopes, expandedScopes);
+
     for (unsigned i = 0; i < klass->memberCount(); ++i) {
         Symbol *symbol = klass->memberAt(i);
         if (Class *nestedClass = symbol->asClass()) {
@@ -510,6 +513,9 @@ void LookupContext::expandFunction(Function *function,
                                    const QList<Scope *> &visibleScopes,
                                    QList<Scope *> *expandedScopes) const
 {
+    for (TemplateParameters *params = function->templateParameters(); params; params = params->previous())
+        expand(params->scope(), visibleScopes, expandedScopes);
+
     if (! expandedScopes->contains(function->arguments()))
         expandedScopes->append(function->arguments());
 
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index ca497beab0f0d0e3e0e09cb5d16c5fb0269755f9..5d934707ea94d4e8e90b0dcf090d066d840572d4 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -637,11 +637,15 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i
 
         if (NamedType *namedTy = ty->asNamedType()) {
             const QList<Scope *> visibleScopes = _context.visibleScopes(result);
-            const QList<Symbol *> typedefCandidates = _context.resolve(namedTy->name(), visibleScopes);
-            foreach (Symbol *typedefCandidate, typedefCandidates) {
-                if (typedefCandidate->isTypedef() && typedefCandidate->type()->isNamedType()) {
-                    ty = typedefCandidate->type();
-                    lastVisibleSymbol = typedefCandidate;
+            const QList<Symbol *> candidates = _context.resolve(namedTy->name(), visibleScopes);
+            foreach (Symbol *candidate, candidates) {
+                if (candidate->isTypedef() && candidate->type()->isNamedType()) {
+                    ty = candidate->type();
+                    lastVisibleSymbol = candidate;
+                    break;
+                } else if (TypenameArgument *arg = candidate->asTypenameArgument()) {
+                    ty = arg->type();
+                    lastVisibleSymbol = candidate;
                     break;
                 }
             }