~~
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt
index 62686f8..f3ac751 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt
@@ -22,7 +22,6 @@
 import org.jetbrains.kotlin.fir.resolve.calls.*
 import org.jetbrains.kotlin.fir.resolve.dfa.DataFlowAnalyzerContext
 import org.jetbrains.kotlin.fir.resolve.inference.FirInferenceSession
-import org.jetbrains.kotlin.fir.resolve.inference.FirPCLAInferenceSession
 import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
 import org.jetbrains.kotlin.fir.resolve.transformers.withScopeCleanup
 import org.jetbrains.kotlin.fir.scopes.FirScope
@@ -39,12 +38,9 @@
 import org.jetbrains.kotlin.util.PrivateForInline
 
 class BodyResolveContext(
-    val returnTypeCalculator: ReturnTypeCalculator,
+    @set:PrivateForInline
+    var returnTypeCalculator: ReturnTypeCalculator,
     val dataFlowAnalyzerContext: DataFlowAnalyzerContext,
-    val targetedLocalClasses: Set<FirClassLikeDeclaration> = emptySet(),
-    val outerLocalClassForNested: MutableMap<FirClassLikeSymbol<*>, FirClassLikeSymbol<*>> = mutableMapOf(),
-    // If `this` context is defined for some local class
-    val parentContext: BodyResolveContext? = null
 ) {
     val fileImportsScope: MutableList<FirScope> = mutableListOf()
 
@@ -85,53 +81,17 @@
     val containerIfAny: FirDeclaration?
         get() = containers.lastOrNull()
 
-    // Potentially, we might just initialize it with null and make the `inferenceSession` getter look like
-    // _inferenceSession ?: parentContext?.inferenceSession ?: FirInferenceSession.DEFAULT.
-    // But that might lead to poor performance in the most common case.
-    @Suppress("PropertyName")
-    @PrivateForInline
-    var _inferenceSession: FirInferenceSession? =
-        when {
-            parentContext == null -> FirInferenceSession.DEFAULT
-            else -> null
-        }
-
-    val inferenceSession: FirInferenceSession
-        @OptIn(PrivateForInline::class)
-        get() = _inferenceSession
-        // It's important that we re-use the session from the parent context.
-        // As in different moments the value might be restored _there_ (in the parent context)
-        // while it wouldn't be reflected if we just copied it once at the creation of the local-class-context.
-        //
-        // It's only important for the case like
-        // pclaBuilder {
-        //    object {
-        //       var implicitlyTypedDelegatedVar by delegate()
-        //
-        //    }
-        //    ...
-        // }
-        //
-        // There we would resolve the setter and relevant `setValue` call only after the whole `pclaBuilder` call is completed
-        // So, the relevant PCLA session would be dead at the moment and the default one would be set back
-        // for the `parentContext!!.inferenceSession`.
-        //
-        // NB: Looks like we should use this session only for PCLA to be able
-        // to use information from local class inside it.
-        // However, we should not use other kinds of inference sessions,
-        // otherwise we can "inherit" type variables from there provoking inference problems
-            ?: parentContext!!.inferenceSession as? FirPCLAInferenceSession
-            ?: FirInferenceSession.DEFAULT
-
+    @set:PrivateForInline
+    var inferenceSession: FirInferenceSession = FirInferenceSession.DEFAULT
 
     @OptIn(PrivateForInline::class)
     inline fun <R, S : FirInferenceSession> withInferenceSession(inferenceSession: S, block: S.() -> R): R {
-        val oldSession = this._inferenceSession
-        this._inferenceSession = inferenceSession
+        val oldSession = this.inferenceSession
+        this.inferenceSession = inferenceSession
         return try {
             inferenceSession.block()
         } finally {
-            this._inferenceSession = oldSession
+            this.inferenceSession = oldSession
         }
     }
 
@@ -171,6 +131,11 @@
 
     var containingClassDeclarations: ArrayDeque<FirClass> = ArrayDeque()
 
+    @set:PrivateForInline
+    var targetedLocalClasses: Set<FirClassLikeDeclaration> = emptySet()
+
+    val outerLocalClassForNested: MutableMap<FirClassLikeSymbol<*>, FirClassLikeSymbol<*>> = mutableMapOf()
+
     @OptIn(PrivateForInline::class)
     inline fun <T> withTowerDataContexts(newContexts: FirRegularTowerDataContexts, f: () -> T): T {
         val old = regularTowerDataContexts
@@ -438,23 +403,36 @@
     }
 
     @OptIn(PrivateForInline::class)
-    fun createSnapshotForLocalClasses(
+    inline fun <T> forLocalClasses(
         returnTypeCalculator: ReturnTypeCalculator,
-        targetedLocalClasses: Set<FirClassLikeDeclaration>
-    ): BodyResolveContext =
-        BodyResolveContext(
-            returnTypeCalculator, dataFlowAnalyzerContext, targetedLocalClasses, outerLocalClassForNested,
-            parentContext = this,
-        ).apply {
-            file = this@BodyResolveContext.file
-            fileImportsScope += this@BodyResolveContext.fileImportsScope
-            specialTowerDataContexts.putAll(this@BodyResolveContext.specialTowerDataContexts)
-            containers = this@BodyResolveContext.containers
-            containingClassDeclarations = ArrayDeque(this@BodyResolveContext.containingClassDeclarations)
-            containingRegularClass = this@BodyResolveContext.containingRegularClass
-            replaceTowerDataContext(this@BodyResolveContext.towerDataContext)
-            anonymousFunctionsAnalyzedInDependentContext.addAll(this@BodyResolveContext.anonymousFunctionsAnalyzedInDependentContext)
+        targetedLocalClasses: Set<FirClassLikeDeclaration>,
+        f: () -> T,
+    ): T {
+        val oldReturnTypeCalculator = this.returnTypeCalculator
+        val oldTargetedLocalClasses = this.targetedLocalClasses
+        return try {
+            this.returnTypeCalculator = returnTypeCalculator
+            this.targetedLocalClasses = targetedLocalClasses
+            f()
+        } finally {
+            this.returnTypeCalculator = oldReturnTypeCalculator
+            this.targetedLocalClasses = oldTargetedLocalClasses
         }
+    }
+
+    @OptIn(PrivateForInline::class)
+    inline fun <T> withReturnTypeCalculator(
+        returnTypeCalculator: ReturnTypeCalculator,
+        f: () -> T,
+    ): T {
+        val oldReturnTypeCalculator = this.returnTypeCalculator
+        return try {
+            this.returnTypeCalculator = returnTypeCalculator
+            f()
+        } finally {
+            this.returnTypeCalculator = oldReturnTypeCalculator
+        }
+    }
 
     // withElement PUBLIC API
 
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt
index 237f1ff..2341b6b 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt
@@ -95,23 +95,22 @@
         implicitBodyResolveComputationSession,
         designationMap,
         outerTransformer = components.transformer,
+        outerBodyResolveContext = components.context,
     )
 
-    val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses)
-    returnTypeCalculator.outerBodyResolveContext = newContext
+    return components.context.forLocalClasses(returnTypeCalculator, targetedClasses) {
+        runContractResolveForLocalClass(components.session, components.scopeSession, components.context)
 
-    runContractResolveForLocalClass(components.session, components.scopeSession, components.context, targetedClasses)
-
-    val transformer = FirImplicitAwareBodyResolveTransformer(
-        components.session, components.scopeSession,
-        implicitBodyResolveComputationSession,
-        FirResolvePhase.BODY_RESOLVE,
-        implicitTypeOnly = false,
-        returnTypeCalculator,
-        outerBodyResolveContext = newContext,
-    )
-
-    return this.transform(transformer, resolutionMode)
+        val transformer = FirImplicitAwareBodyResolveTransformer(
+            components.session, components.scopeSession,
+            implicitBodyResolveComputationSession,
+            FirResolvePhase.BODY_RESOLVE,
+            implicitTypeOnly = false,
+            returnTypeCalculator,
+            outerBodyResolveContext = components.context,
+        )
+        this.transform(transformer, resolutionMode)
+    }
 }
 
 open class FirImplicitAwareBodyResolveTransformer(
@@ -194,17 +193,12 @@
     val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
     val designationMapForLocalClasses: Map<FirCallableDeclaration, List<FirClassLikeDeclaration>> = mapOf(),
     val outerTransformer: FirAbstractBodyResolveTransformerDispatcher? = null,
+    val outerBodyResolveContext: BodyResolveContext? = null
 ) : ReturnTypeCalculator() {
     override val callableCopyTypeCalculator: CallableCopyTypeCalculator = CallableCopyTypeCalculatorWithJump()
 
     @OptIn(PrivateForInline::class)
-    var outerBodyResolveContext: BodyResolveContext? = null
-        set(context) {
-            field = context
-            outerTowerDataContexts = context?.regularTowerDataContexts
-        }
-
-    var outerTowerDataContexts: FirRegularTowerDataContexts? = null
+    val outerTowerDataContexts: FirRegularTowerDataContexts? = outerBodyResolveContext?.regularTowerDataContexts
 
     override fun tryCalculateReturnTypeOrNull(declaration: FirCallableDeclaration): FirResolvedTypeRef {
         // Local declarations must be handled by `ReturnTypeCalculatorForFullBodyResolve` to avoid resolution cycles in LL FIR.
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt
index 6d4d7a2..e3be875 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt
@@ -45,16 +45,14 @@
 fun <F : FirClassLikeDeclaration> F.runContractResolveForLocalClass(
     session: FirSession,
     scopeSession: ScopeSession,
-    outerBodyResolveContext: BodyResolveContext,
-    targetedClasses: Set<FirClassLikeDeclaration>
+    context: BodyResolveContext
 ): F {
-    val newContext = outerBodyResolveContext.createSnapshotForLocalClasses(
+    return context.withReturnTypeCalculator(
         ReturnTypeCalculatorForFullBodyResolve.Contract,
-        targetedClasses
-    )
-    val transformer = FirContractResolveTransformer(session, scopeSession, newContext)
-
-    return this.transformSingle(transformer, ResolutionMode.ContextIndependent)
+    ) {
+        val transformer = FirContractResolveTransformer(session, scopeSession, context)
+        this.transformSingle(transformer, ResolutionMode.ContextIndependent)
+    }
 }
 
 fun <F : FirFunction> F.runContractResolveForFunction(