diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index a2bb440..57bf94c 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -1004,8 +1004,10 @@
     else
       return getLVForDecl(cast<NamedDecl>(ContextDecl), computation);
   }
+
   if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC))
     return getLVForDecl(ND, computation);
+
   return LinkageInfo::external();
 }
 
@@ -1090,19 +1092,6 @@
                      LV.isVisibilityExplicit());
 }
 
-static inline const CXXRecordDecl*
-getOutermostEnclosingLambda(const CXXRecordDecl *Record) {
-  const CXXRecordDecl *Ret = Record;
-  while (Record && Record->isLambda()) {
-    Ret = Record;
-    if (!Record->getParent()) break;
-    // Get the Containing Class of this Lambda Class
-    Record = dyn_cast_or_null<CXXRecordDecl>(
-      Record->getParent()->getParent());
-  }
-  return Ret;
-}
-
 static LinkageInfo computeLVForDecl(const NamedDecl *D,
                                     LVComputationKind computation) {
   // Objective-C: treat all Objective-C declarations as having external
@@ -1133,24 +1122,9 @@
           return LinkageInfo::internal();
         }
 
-        // This lambda has its linkage/visibility determined:
-        //  - either by the outermost lambda if that lambda has no mangling 
-        //    number. 
-        //  - or by the parent of the outer most lambda
-        // This prevents infinite recursion in settings such as nested lambdas 
-        // used in NSDMI's, for e.g. 
-        //  struct L {
-        //    int t{};
-        //    int t2 = ([](int a) { return [](int b) { return b; };})(t)(t);    
-        //  };
-        const CXXRecordDecl *OuterMostLambda = 
-            getOutermostEnclosingLambda(Record);
-        if (!OuterMostLambda->getLambdaManglingNumber())
-          return LinkageInfo::internal();
-        
-        return getLVForClosure(
-                  OuterMostLambda->getDeclContext()->getRedeclContext(),
-                  OuterMostLambda->getLambdaContextDecl(), computation);
+        // This lambda has its linkage/visibility determined by its owner.
+        return getLVForClosure(D->getDeclContext()->getRedeclContext(),
+                               Record->getLambdaContextDecl(), computation);
       }
       
       break;
diff --git a/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp b/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp
deleted file mode 100644
index d763d41..0000000
--- a/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
-
-// CHECK-LABEL: define void @_ZN19non_inline_function3fooEv()
-// CHECK-LABEL: define internal void @"_ZZN19non_inline_function3fooEvENK3$_0clEi"
-// CHECK-LABEL: define internal signext i8 @"_ZZZN19non_inline_function3fooEvENK3$_0clEiENKUlcE_clEc"
-namespace non_inline_function {
-void foo() {
-  auto L = [](int a) {
-    return [](char b) {
-     return b;
-    };
-  };
-  L(3)('a');
-}
-}
-// CHECK-LABEL: define linkonce_odr i32 @_ZN15inline_function3fooEv
-// CHECK-LABEL: define linkonce_odr void @_ZZN15inline_function3fooEvENKUliE_clEi
-// CHECK-LABEL: define linkonce_odr signext i8 @_ZZZN15inline_function3fooEvENKUliE_clEiENKUlcE_clEc
-namespace inline_function {
-inline int foo() {
-  auto L = [](int a) {
-    return [](char b) {
-     return b;
-    };
-  };
-  L(3)('a');
-}
-int use = foo();
-}
-
-// CHECK-LABEL: define linkonce_odr void @_ZN12non_template1LC1Ev
-// CHECK-LABEL: define linkonce_odr void @_ZNK12non_template1L1tMUliE_clEi(%class.anon
-// CHECK-LABEL: define linkonce_odr i32 @_ZZNK12non_template1L1tMUliE_clEiENKUliE_clEi(%class.anon
-namespace non_template {
-  struct L {
-    int t = ([](int a) { return [](int b) { return b; };})(2)(3);    
-  };
-  L l; 
-}
-
-// CHECK-LABEL: define linkonce_odr void @_ZN32lambdas_in_NSDMIs_template_class1LIiEC2Ev
-// CHECK-LABEL: define linkonce_odr void @_ZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEi(%class.anon
-// CHECK-LABEL: linkonce_odr i32 @_ZZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEiENKUliE_clEi(%class.anon
-namespace lambdas_in_NSDMIs_template_class {
-template<class T>
-struct L {
-    T t2 = ([](int a) { return [](int b) { return b; };})(T{})(T{});    
-};
-L<int> l;
-}
-
-
-
diff --git a/test/SemaCXX/lambda-expressions.cpp b/test/SemaCXX/lambda-expressions.cpp
index e290424..e8e2eb6 100644
--- a/test/SemaCXX/lambda-expressions.cpp
+++ b/test/SemaCXX/lambda-expressions.cpp
@@ -265,21 +265,3 @@
 #endif
   }
 }
-
-
-namespace lambdas_in_NSDMIs {
-  template<class T>
-  struct L {
-      T t{};
-      T t2 = ([](int a) { return [](int b) { return b; };})(t)(t);    
-  };
-  L<int> l; 
-  
-  namespace non_template {
-    struct L {
-      int t = 0;
-      int t2 = ([](int a) { return [](int b) { return b; };})(t)(t);    
-    };
-    L l; 
-  }
-}
\ No newline at end of file
