WIP
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
index 75897cf..4c37c88 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
@@ -4211,6 +4211,12 @@
       }
 
       @Test
+      @TestMetadata("lambdaBelongsToOuterCall.kt")
+      public void testLambdaBelongsToOuterCall() {
+        runTest("compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt");
+      }
+
+      @Test
       @TestMetadata("overloadResolutionByLambdaReturnType.kt")
       public void testOverloadResolutionByLambdaReturnType() {
         runTest("compiler/testData/diagnostics/tests/builderInference/overloadResolutionByLambdaReturnType.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
index ebb21d9..aab8699 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
@@ -4211,6 +4211,12 @@
       }
 
       @Test
+      @TestMetadata("lambdaBelongsToOuterCall.kt")
+      public void testLambdaBelongsToOuterCall() {
+        runTest("compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt");
+      }
+
+      @Test
       @TestMetadata("overloadResolutionByLambdaReturnType.kt")
       public void testOverloadResolutionByLambdaReturnType() {
         runTest("compiler/testData/diagnostics/tests/builderInference/overloadResolutionByLambdaReturnType.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
index 72d695c..4ce3220 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
@@ -4205,6 +4205,12 @@
       }
 
       @Test
+      @TestMetadata("lambdaBelongsToOuterCall.kt")
+      public void testLambdaBelongsToOuterCall() {
+        runTest("compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt");
+      }
+
+      @Test
       @TestMetadata("overloadResolutionByLambdaReturnType.kt")
       public void testOverloadResolutionByLambdaReturnType() {
         runTest("compiler/testData/diagnostics/tests/builderInference/overloadResolutionByLambdaReturnType.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
index 1f65063..ae32fe9 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
@@ -4211,6 +4211,12 @@
       }
 
       @Test
+      @TestMetadata("lambdaBelongsToOuterCall.kt")
+      public void testLambdaBelongsToOuterCall() {
+        runTest("compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt");
+      }
+
+      @Test
       @TestMetadata("overloadResolutionByLambdaReturnType.kt")
       public void testOverloadResolutionByLambdaReturnType() {
         runTest("compiler/testData/diagnostics/tests/builderInference/overloadResolutionByLambdaReturnType.kt");
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
index f12c4f8..3e0aa25 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
@@ -109,16 +109,7 @@
                 runCompletionForCall(candidate, completionMode, call, initialType, analyzer)
 
                 val readOnlyConstraintStorage = candidate.system.asReadOnlyStorage()
-                if (inferenceSession !is FirPCLAInferenceSession) {
-                    // With FirPCLAInferenceSession we either have here a situation when the candidate system uses
-                    // an outer system, and completionMode is PCLA_POSTPONED_CALL (see customCompletionModeInsteadOfFull);
-                    // or, the candidate system does not use an outer system; then the PCLA common system is somewhere on top,
-                    // and after fixing type variables of this candidate we still may have some unfixed variables from the common system
-                    // TODO: KT-69040. We think some better decision is possible here, e.g. in a situation when the candidate system
-                    // does not use an outer system either the completionMode should not be FULL,
-                    // or it should not be added as a "base" system.
-                    checkStorageConstraintsAfterFullCompletion(readOnlyConstraintStorage)
-                }
+                checkStorageConstraintsAfterFullCompletion(readOnlyConstraintStorage)
 
                 val finalSubstitutor = readOnlyConstraintStorage
                     .buildAbstractResultingSubstitutor(session.typeContext) as ConeSubstitutor
@@ -435,7 +426,7 @@
 
             transformer.context.withAnonymousFunctionTowerDataContext(lambdaArgument.symbol) {
                 val pclaInferenceSession =
-                    runIf(withPCLASession) {
+                    runIf(withPCLASession || (transformer.context.inferenceSession as? FirPCLAInferenceSession)?.isDisposed == true) {
                         candidate.lambdasAnalyzedWithPCLA += lambdaArgument
 
                         FirPCLAInferenceSession(candidate, session.inferenceComponents)
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirPCLAInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirPCLAInferenceSession.kt
index af4bcb1..2ec18ae 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirPCLAInferenceSession.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirPCLAInferenceSession.kt
@@ -37,6 +37,9 @@
     var currentCommonSystem: NewConstraintSystemImpl = prepareSharedBaseSystem(outerCandidate.system, inferenceComponents)
         private set
 
+    var isDisposed = false
+        private set
+
     override fun baseConstraintStorageForCandidate(candidate: Candidate, bodyResolveContext: BodyResolveContext): ConstraintStorage? {
         if (candidate.mightBeAnalyzedAndCompletedIndependently(bodyResolveContext.returnTypeCalculator)) return null
 
@@ -115,7 +118,9 @@
     }
 
     fun applyResultsToMainCandidate() {
+        check(!isDisposed)
         outerCandidate.system.replaceContentWith(currentCommonSystem.currentStorage())
+        isDisposed = true
     }
 
     fun integrateChildSession(
diff --git a/compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt b/compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt
new file mode 100644
index 0000000..1c39015
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt
@@ -0,0 +1,39 @@
+// FIR_IDENTICAL
+// ISSUE: KT-69040
+
+interface Controller<T> {
+    fun add(t: T)
+}
+
+fun <T1, R1> T1.foo(g: (T1) -> R1): R1 = TODO()
+fun <T2> Controller<T2>.get(): T2 = TODO()
+
+fun <BK, BV> build(
+    transformer: (Controller<BK>) -> BV,
+): BV = TODO()
+
+//fun test1() {
+//    build { c ->
+//        c.add("")
+//
+//        c.foo {
+//            c.get()
+//        }
+//    }
+//}
+
+interface Base
+interface A : Base
+interface B : Base
+
+fun test2(a: A, b: B) {
+    val x = build { c ->
+        c.foo {
+            c.add(a)
+            c.add(b)
+            c.get()
+        }
+    }
+
+    <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>x<!>
+}
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
index e2e2efc..f8c4e01 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
@@ -4211,6 +4211,12 @@
       }
 
       @Test
+      @TestMetadata("lambdaBelongsToOuterCall.kt")
+      public void testLambdaBelongsToOuterCall() {
+        runTest("compiler/testData/diagnostics/tests/builderInference/lambdaBelongsToOuterCall.kt");
+      }
+
+      @Test
       @TestMetadata("overloadResolutionByLambdaReturnType.kt")
       public void testOverloadResolutionByLambdaReturnType() {
         runTest("compiler/testData/diagnostics/tests/builderInference/overloadResolutionByLambdaReturnType.kt");