diff --git a/src/libs/3rdparty/cplusplus/Templates.cpp b/src/libs/3rdparty/cplusplus/Templates.cpp
index c81ed51b09c483f750dbc56f75044cb0ff435995..b813600143f4f93f08ae5fb79eaa44089f6635ae 100644
--- a/src/libs/3rdparty/cplusplus/Templates.cpp
+++ b/src/libs/3rdparty/cplusplus/Templates.cpp
@@ -526,11 +526,23 @@ FullySpecifiedType Subst::apply(const Name *name) const
             return _previous->apply(name);
 
         else if (const QualifiedNameId *q = name->asQualifiedNameId()) {
-            const NamedType *name = apply(q->base())->asNamedType();
+            const NamedType *baseNamedType = apply(q->base())->asNamedType();
             const NamedType *unqualified = apply(q->name())->asNamedType();
-            if (name && name->name()->identifier() != 0 && unqualified)
-                return control()->namedType(control()->qualifiedNameId(name->name()->identifier(),
-                                                                       unqualified->name()));
+            if (baseNamedType) {
+                if (! unqualified) {
+                    const Name *qualifiedBase = baseNamedType->name();
+                    const Name *qualifiedName = q->name();
+                    return control()->namedType(control()->qualifiedNameId(qualifiedBase,
+                                                                           qualifiedName));
+                }
+                else if(baseNamedType->name()->identifier() != 0) {
+                    const QualifiedNameId *clonedQualifiedNameId
+                            = control()->qualifiedNameId(baseNamedType->name()->identifier(),
+                                                         unqualified->name());
+                    NamedType *clonedNamedType = control()->namedType(clonedQualifiedNameId);
+                    return clonedNamedType;
+                }
+            }
         }
 
     }
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index b23cf73949b7869120c5a02b0cad7f799311a679..68586bff8bd7409730b35428a2c1059a3a29659a 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -833,6 +833,17 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
                     oo.showReturnTypes = true;
                     oo.showTemplateParameters = true;
                     qDebug()<<"cloned"<<oo(clone->type());
+                    if (Class *klass = s->asClass()) {
+                        const unsigned klassMemberCount = klass->memberCount();
+                        for (unsigned i = 0; i < klassMemberCount; ++i){
+                            Symbol *klassMemberAsSymbol = klass->memberAt(i);
+                            if (klassMemberAsSymbol->isTypedef()) {
+                                if (Declaration *declaration = klassMemberAsSymbol->asDeclaration()) {
+                                    qDebug() << "Member: " << oo(declaration->type(), declaration->name());
+                                }
+                            }
+                        }
+                    }
 #endif // DEBUG_LOOKUP
                 }
                 instantiateNestedClasses(reference, cloner, subst, instantiation);
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp
index 19267fa6e8e003f1f15023a525a26440ccdd09a3..fb61faec0db6b711911099366bd830a585e55d54 100644
--- a/src/plugins/cpptools/cppcompletion_test.cpp
+++ b/src/plugins/cpptools/cppcompletion_test.cpp
@@ -1570,3 +1570,46 @@ void CppToolsPlugin::test_completion_typedef_is_inside_function_before_declarati
     QVERIFY(completions.contains(QLatin1String("Foo")));
     QVERIFY(completions.contains(QLatin1String("bar")));
 }
+
+void CppToolsPlugin::test_completion_resolve_complex_typedef_with_template()
+{
+    TestData data;
+    data.srcText = "\n"
+            "template <typename T>\n"
+            "struct Template2\n"
+            "{\n"
+            "    typedef typename T::template Template1<T>::TT TemplateTypedef;\n"
+            "    TemplateTypedef templateTypedef;\n"
+            "};\n"
+            "struct Foo\n"
+            "{\n"
+            "    int bar;\n"
+            "    template <typename T>\n"
+            "    struct Template1\n"
+            "    {\n"
+            "        typedef T TT;\n"
+            "    };\n"
+            "};\n"
+            "void fun()\n"
+            "{\n"
+            "    Template2<Foo> template2;\n"
+            "    @\n"
+            "    // padding so we get the scope right\n"
+            "}\n"
+            ;
+    setup(&data);
+
+    Utils::ChangeSet change;
+    QString txt = QLatin1String("template2.templateTypedef.");
+    change.insert(data.pos, txt);
+    QTextCursor cursor(data.doc);
+    change.apply(&cursor);
+    data.pos += txt.length();
+
+    QStringList completions = getCompletions(data);
+
+    QCOMPARE(completions.size(), 3);
+    QVERIFY(completions.contains(QLatin1String("Foo")));
+    QVERIFY(completions.contains(QLatin1String("bar")));
+    QVERIFY(completions.contains(QLatin1String("Template1")));
+}
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index d132ecce67b52dcbc9a7fc4cf93e80ad791b6f4f..e7eae03882ac2260f9875677a1781f72def7338e 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -122,6 +122,7 @@ private slots:
     void test_completion_typedef_of_pointer();
     void test_completion_typedef_of_pointer_inside_function();
     void test_completion_typedef_is_inside_function_before_declaration_block();
+    void test_completion_resolve_complex_typedef_with_template();
 
     void test_format_pointerdeclaration_in_simpledeclarations();
     void test_format_pointerdeclaration_in_simpledeclarations_data();