diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp
index c53b0f0..ee14213 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -1067,7 +1067,9 @@
   //
   // FIXME: Only function bodies and constructor ctor-initializers are
   // parsed correctly, fix the rest.
-  if (!CurScope->getParent()->isClassScope()) {
+  if (!CurScope->getParent()->isClassScope() && 
+      !(CurScope->getParent()->isTemplateParamScope() &&
+        CurScope->getParent()->getParent()->isClassScope())) {
     // We are not inside a nested class. This class and its nested classes
     // are complete and we can parse the delayed portions of method
     // declarations and the lexed inline method definitions.
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp
index 8fe287c..6212449 100644
--- a/lib/Sema/SemaLookup.cpp
+++ b/lib/Sema/SemaLookup.cpp
@@ -687,7 +687,8 @@
         if (R || RedeclarationOnly)
           return std::make_pair(true, R);
       }
-      if (Ctx->getParent() != Ctx->getLexicalParent()) {
+      if (Ctx->getParent() != Ctx->getLexicalParent() 
+          || isa<CXXMethodDecl>(Ctx)) {
         // It is out of line defined C++ method or struct, we continue
         // doing name lookup in parent context. Once we will find namespace
         // or translation-unit we save it for possible checking
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index e69a1ce..a5eb779 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -697,9 +697,13 @@
 NamedDecl *
 Sema::InstantiateDeclRef(NamedDecl *D, const TemplateArgumentList &TemplateArgs) {
   DeclContext *ParentDC = D->getDeclContext();
+  if (isa<ParmVarDecl>(D) || ParentDC->isFunctionOrMethod()) {
+    // D is a local of some kind. Look into the map of local
+    // declarations to their instantiations.
+    return cast<NamedDecl>(CurrentInstantiationScope->getInstantiationOf(D));
+  }
 
-  if (!ParentDC->isFileContext()) {
-    NamedDecl *ParentDecl = cast<NamedDecl>(ParentDC);
+  if (NamedDecl *ParentDecl = dyn_cast<NamedDecl>(ParentDC)) {
     ParentDecl = InstantiateDeclRef(ParentDecl, TemplateArgs);
     if (!ParentDecl)
       return 0;
@@ -707,12 +711,6 @@
     ParentDC = cast<DeclContext>(ParentDecl);
   }
 
-  if (ParentDC->isFunctionOrMethod()) {
-    // D is a local of some kind. Look into the map of local
-    // variables to their instantiations.
-    return cast<NamedDecl>(CurrentInstantiationScope->getInstantiationOf(D));
-  }
-
   if (ParentDC != D->getDeclContext()) {
     // We performed some kind of instantiation in the parent context,
     // so now we need to look into the instantiated parent context to
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp
index a0fc25d..726ac2b 100644
--- a/lib/Sema/SemaTemplateInstantiateExpr.cpp
+++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp
@@ -109,8 +109,7 @@
 Sema::OwningExprResult
 TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
   // FIXME: Recast this in terms of Sema::InstantiateDeclRef.
-  Decl *D = E->getDecl();
-  ValueDecl *NewD = 0;
+  NamedDecl *D = E->getDecl();
   if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
     assert(NTTP->getDepth() == 0 && "No nested templates yet");
     const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()]; 
@@ -131,29 +130,22 @@
                                                  *Arg.getAsIntegral(),
                                                  T, 
                                        E->getSourceRange().getBegin()));
-  } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
-    NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
-  } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
-    if (Var->hasLocalStorage())
-      NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
-    else
-      assert(false && 
-             "FIXME: instantiation of non-local variable declarations");
-  } else if (isa<FunctionDecl>(D)) {
-    // FIXME: Instantiate decl!
-    NewD = cast<ValueDecl>(D);
-  } else if (isa<OverloadedFunctionDecl>(D)) {
-    // FIXME: instantiate decls?
-    return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(cast<NamedDecl>(D),
+  }
+
+  if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
+    // FIXME: instantiate each decl in the overload set
+    return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
                                                    SemaRef.Context.OverloadTy,
                                                            E->getLocation(),
                                                            false, false));
-  } else
-    assert(false && "FIXME: unhandled declaration reference kind");
+  }
 
+  ValueDecl *NewD 
+    = dyn_cast_or_null<ValueDecl>(SemaRef.InstantiateDeclRef(D, TemplateArgs));
   if (!NewD)
     return SemaRef.ExprError();
 
+  // FIXME: Build QualifiedDeclRefExpr?
   QualType T = NewD->getType();
   return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
                                                       T.getNonReferenceType(),
