wip
diff --git a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
index 0e03e6c..46dd3fb 100644
--- a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
+++ b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
@@ -378,6 +378,7 @@
     val cToKotlinBridge = ClassIds.cToKotlinBridge.classSymbol()
     val kotlinToCBridge = ClassIds.kotlinToCBridge.classSymbol()
     val interopCallMarker = symbolFinder.topLevelFunction(RuntimeNames.kotlinxCInteropInternalPackageName, "interopCallMarker")
+    val interopLowered = symbolFinder.topLevelClass(NativeRuntimeNames.Annotations.interopLoweredClassId)
 
     val objCMethodImp = ClassIds.objCMethodImp.classSymbol()
 
diff --git a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt
index dd30109..c20aa9e 100644
--- a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt
+++ b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt
@@ -19,13 +19,17 @@
 import org.jetbrains.kotlin.ir.types.isMarkedNullable
 import org.jetbrains.kotlin.ir.util.IdSignature
 import org.jetbrains.kotlin.ir.util.constructors
+import org.jetbrains.kotlin.ir.util.hasTopLevelEqualFqName
 import org.jetbrains.kotlin.ir.util.isFunction
 import org.jetbrains.kotlin.ir.util.isInterface
 import org.jetbrains.kotlin.ir.util.isSuspendFunction
 import org.jetbrains.kotlin.utils.atMostOne
 
+private fun IrClass.hasFqNameEqualToSignature(signature: IdSignature.CommonSignature): Boolean =
+    name.asString() == signature.shortName && hasTopLevelEqualFqName(signature.packageFqName, signature.declarationFqName)
+
 private fun IrClass.isClassTypeWithSignature(signature: IdSignature.CommonSignature): Boolean {
-    return signature == symbol.signature
+    return signature == symbol.signature || (this.hasFqNameEqualToSignature(signature))
 }
 
 fun IrClass.isUnit() = this.isClassTypeWithSignature(IdSignatureValues.unit)
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt
index c8ffa73..18c5ea6 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt
@@ -38,7 +38,7 @@
     prerequisite = setOf(lateinitPhase)
 )
 
-private val localClassesInInlineLambdasPhase = makeIrModulePhase(
+val localClassesInInlineLambdasPhase = makeIrModulePhase(
     ::LocalClassesInInlineLambdasLowering,
     name = "LocalClassesInInlineLambdasPhase",
 )
@@ -114,13 +114,14 @@
 
 fun loweringsOfTheFirstPhase(
     @Suppress("UNUSED_PARAMETER") irMangler: IrMangler,
-    languageVersionSettings: LanguageVersionSettings
+    @Suppress("UNUSED_PARAMETER") languageVersionSettings: LanguageVersionSettings
 ): List<NamedCompilerPhase<PreSerializationLoweringContext, IrModuleFragment, IrModuleFragment>> = buildList {
     this += avoidLocalFOsInInlineFunctionsLowering
     if (languageVersionSettings.supportsFeature(LanguageFeature.IrInlinerBeforeKlibSerialization)) {
         this += lateinitPhase
         this += sharedVariablesLoweringPhase
         this += localClassesInInlineLambdasPhase
+        // TODO: interop lowering goes here.
         this += arrayConstructorPhase
         this += inlineOnlyPrivateFunctionsPhase
         this += checkInlineDeclarationsAfterInliningOnlyPrivateFunctions
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt
index 3fc8202..20d7e64 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt
@@ -16,7 +16,7 @@
 import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
 import org.jetbrains.kotlin.ir.inline.loweringsOfTheFirstPhase
 
-private val upgradeCallableReferencesPhase = makeIrModulePhase(
+val upgradeCallableReferencesPhase = makeIrModulePhase(
     lowering = ::UpgradeCallableReferences,
     name = "UpgradeCallableReferences"
 )
diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt
index 7ef3724..e3d3fcb 100644
--- a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt
+++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt
@@ -25,7 +25,7 @@
             else -> return false
         }
 
-        return node.hasAnnotation(classId)
+        return node.annotations.hasAnnotation(classId)
     }
 
     override fun backendSpecificSerializeAllMembers(irClass: IrClass) = !KonanFakeOverrideClassFilter.needToConstructFakeOverrides(irClass)
diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt
index 142fd3f..a6ecf13 100644
--- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt
+++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt
@@ -29,7 +29,10 @@
     CurrentKlibModuleOrigin, SyntheticModulesOrigin -> false
 }
 
-val ModuleDescriptor.klibModuleOrigin get() = this.getCapability(KlibModuleOrigin.CAPABILITY)!!
+val ModuleDescriptor.klibModuleOrigin get() = this.getCapability(KlibModuleOrigin.CAPABILITY)
+        ?: error("KlibModuleOrigin not available: ${this::class.java} $this")
+
+val ModuleDescriptor.klibModuleOriginIfExists get() = this.getCapability(KlibModuleOrigin.CAPABILITY)
 
 val ModuleDescriptor.kotlinLibrary
     get() = (this.klibModuleOrigin as DeserializedKlibModuleOrigin).library
diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
index 50dac65..9e289d5 100644
--- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
+++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
@@ -511,7 +511,8 @@
     DontCreateSyntheticPropertiesWithoutBaseJavaGetter(sinceVersion = null, "KT-64358"),
     JavaTypeParameterDefaultRepresentationWithDNN(sinceVersion = null, testOnly = true, issue = "KT-59138"),
     ProperFieldAccessGenerationForFieldAccessShadowedByKotlinProperty(sinceVersion = null, "KT-56386"),
-    IrInlinerBeforeKlibSerialization(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-69765"),
+    IrInlinerBeforeKlibSerialization(sinceVersion = KOTLIN_2_0, forcesPreReleaseBinaries = true, issue = "KT-69765"),
+    //IrInlinerBeforeKlibSerialization(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-69765"),
     NestedTypeAliases(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-45285"),
     ForbidUsingSupertypesWithInaccessibleContentInTypeArguments(sinceVersion = null, enabledInProgressiveMode = true, "KT-66691"), // KT-66691, KT-66742
     UnnamedLocalVariables(sinceVersion = null, forcesPreReleaseBinaries = false, issue = "KT-74809"),
@@ -519,7 +520,8 @@
     AnnotationsInMetadata(sinceVersion = null, "KT-57919"),
     DisableWarningsForValueBasedJavaClasses(sinceVersion = null, "KT-70722"),
     DisableWarningsForIdentitySensitiveOperationsOnValueClassesAndPrimitives(sinceVersion = null, "KT-70722"),
-    IrRichCallableReferencesInKlibs(sinceVersion = null, "KT-72734"), // KT-72734, KT-74384, KT-74392
+    IrRichCallableReferencesInKlibs(sinceVersion = KOTLIN_2_0, "KT-72734"), // KT-72734, KT-74384, KT-74392
+    //IrRichCallableReferencesInKlibs(sinceVersion = null, "KT-72734"), // KT-72734, KT-74384, KT-74392
     ExportKlibToOlderAbiVersion(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-76131"),
     ;
 
diff --git a/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt b/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt
index 0e0839e..3c91cfc 100644
--- a/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt
+++ b/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt
@@ -42,6 +42,7 @@
         val symbolNameClassId = ClassId(kotlinNativePackage, Name.identifier("SymbolName"))
         val cNameClassId = ClassId(kotlinNativePackage, Name.identifier("CName"))
         val exportedBridgeClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportedBridge"))
+        val interopLoweredClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("InteropLowered"))
         val exportForCppRuntimeClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportForCppRuntime"))
         val exportForCompilerClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportForCompiler"))
         val exportTypeInfoClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportTypeInfo"))
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt
index 5a76132..bc584b7 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt
@@ -29,6 +29,8 @@
 import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
 import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
 import org.jetbrains.kotlin.ir.util.render
+import org.jetbrains.kotlin.konan.library.KonanLibrary
+import org.jetbrains.kotlin.library.KotlinLibrary
 import org.jetbrains.kotlin.resolve.descriptorUtil.module
 import org.jetbrains.kotlin.utils.addToStdlib.getOrSetIfNull
 import java.util.concurrent.ConcurrentHashMap
@@ -63,6 +65,8 @@
         ExternalDeclarationFileNameProvider(moduleDeserializerProvider)
     }
 
+    override fun getExternalPackageFragmentLibrary(packageFragment: IrExternalPackageFragment) = packageFragment.konanLibrary
+
     private val inlineFunctionDeserializers = ConcurrentHashMap<KonanPartialModuleDeserializer, InlineFunctionDeserializer>()
 
     fun getInlineFunctionDeserializer(function: IrFunction): InlineFunctionDeserializer {
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
index 8b7c40e..2842334 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
@@ -155,6 +155,13 @@
             isNewDependency = usedBitcodeOfFile.add(it) || isNewDependency
         }
 
+//        if (isNewDependency) {
+//            println("ZZZ: ${library.libraryName} ${library.libraryFile} ${libraryFile?.filePath}")
+//            val e = IllegalStateException()
+//            println(e.stackTraceToString())
+//            println()
+//        }
+
         require(!(sealed && isNewDependency)) { "The dependencies have been sealed off" }
     }
 
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt
index be4caf8..cfb4fc1 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt
@@ -26,11 +26,13 @@
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.declarations.IrDeclaration
 import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
+import org.jetbrains.kotlin.ir.declarations.moduleDescriptor
 import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
 import org.jetbrains.kotlin.ir.util.getPackageFragment
 import org.jetbrains.kotlin.library.isNativeStdlib
 import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
+import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
 import org.jetbrains.kotlin.name.NativeForwardDeclarationKind
 import org.jetbrains.kotlin.storage.LockBasedStorageManager
 
@@ -86,25 +88,32 @@
         "`${actualizedResult.irModuleFragment.name}` must be Name.special, since it's required by KlibMetadataModuleDescriptorFactoryImpl.createDescriptorOptionalBuiltIns()"
     }
 
+    val forwardDeclarationPackages = NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet()
     @OptIn(DelicateDeclarationStorageApi::class)
     val usedPackages = buildSet {
         fun addExternalPackage(it: IrSymbol) {
             // FIXME(KT-64742): Fir2IrDeclarationStorage caches may contain unbound IR symbols, so we filter them out.
             val p = it.takeIf { it.isBound }?.owner as? IrDeclaration ?: return
             val fragment = (p.getPackageFragment() as? IrExternalPackageFragment) ?: return
-            add(fragment.packageFqName)
+            if (fragment.packageFqName !in forwardDeclarationPackages)
+                add(fragment)
         }
         actualizedResult.components.declarationStorage.forEachCachedDeclarationSymbol(::addExternalPackage)
         actualizedResult.components.classifierStorage.forEachCachedDeclarationSymbol(::addExternalPackage)
 
         // These packages exist in all platform libraries, but can contain only synthetic declarations.
         // These declarations are not really located in klib, so we don't need to depend on klib to use them.
-        removeAll(NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet())
+        //removeAll(NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet())
     }.toList()
 
+    val usedPackagesMap = mutableMapOf<IrExternalPackageFragment, KotlinResolvedLibrary>()
+    librariesDescriptors.zip(resolvedLibraries).forEach { (module, library) ->
+        usedPackages.filter { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it.packageFqName) }
+                .forEach { usedPackagesMap[it] = library }
+    }
 
     val usedLibraries = librariesDescriptors.zip(resolvedLibraries).filter { (module, _) ->
-        usedPackages.any { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it) }
+        usedPackages.any { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it.packageFqName) }
     }.map { it.second }.toSet()
 
     resolvedLibraries.find { it.library.isNativeStdlib }?.let {
@@ -122,7 +131,7 @@
         throw KonanCompilationException("Compilation failed: there were some diagnostics during fir2ir")
     }
 
-    return Fir2IrOutput(input.firResult, symbols, actualizedResult, usedLibraries)
+    return Fir2IrOutput(input.firResult, symbols, actualizedResult, usedLibraries, usedPackagesMap)
 }
 
 private fun PhaseContext.createKonanSymbols(
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt
index 6bfd6a7..03d5853 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt
@@ -7,14 +7,59 @@
 
 import org.jetbrains.kotlin.backend.common.CommonBackendContext
 import org.jetbrains.kotlin.backend.common.ir.KlibSharedVariablesManager
+import org.jetbrains.kotlin.backend.common.LoweringContext
+import org.jetbrains.kotlin.backend.common.PreSerializationLoweringContext
 import org.jetbrains.kotlin.backend.konan.driver.BasicPhaseContext
 import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
 import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
 import org.jetbrains.kotlin.cli.common.messages.MessageCollector
+import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.descriptors.ModuleDescriptor
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.ir.IrBuiltIns
+import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
 import org.jetbrains.kotlin.ir.declarations.IrFactory
 import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
+import org.jetbrains.kotlin.ir.declarations.moduleDescriptor
+import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
+import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
+import org.jetbrains.kotlin.library.KotlinLibrary
 
-internal abstract class KonanBackendContext(config: KonanConfig) : BasicPhaseContext(config), CommonBackendContext {
+interface NativeLoweringContext : LoweringContext {
+    override val symbols: KonanSymbols
+    val config: KonanConfig
+    val typeSystem: IrTypeSystemContext
+    fun getExternalPackageFragmentLibrary(packageFragment: IrExternalPackageFragment): KotlinLibrary?
+}
+
+internal class NativePreSerializationLoweringContext2(
+        irBuiltIns: IrBuiltIns,
+        configuration: CompilerConfiguration,
+        diagnosticReporter: DiagnosticReporter,
+        override val config: KonanConfig,
+        //private val usedLibraries: Map<ModuleDescriptor, KotlinLibrary>,
+        private val usedPackages: Map<IrExternalPackageFragment, KotlinLibrary>,
+) : PreSerializationLoweringContext(irBuiltIns, configuration, diagnosticReporter), NativeLoweringContext {
+    private val konanSymbols = KonanSymbols(this, irBuiltIns, configuration)
+
+    override val symbols = konanSymbols
+
+    override val sharedVariablesManager by lazy {
+        // Creating lazily because builtIns module seems to be incomplete during `link` test;
+        // TODO: investigate this.
+        KlibSharedVariablesManager(symbols)
+    }
+
+    override val typeSystem: IrTypeSystemContext
+        get() = IrTypeSystemContextImpl(irBuiltIns)
+
+    override fun getExternalPackageFragmentLibrary(packageFragment: IrExternalPackageFragment) = usedPackages[packageFragment]
+}
+
+
+internal abstract class KonanBackendContext(config: KonanConfig)
+    : BasicPhaseContext(config), CommonBackendContext, NativeLoweringContext
+{
     abstract val builtIns: KonanBuiltIns
 
     abstract override val symbols: KonanSymbols
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt
index 9f0e5d2..09fc77d 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt
@@ -17,6 +17,7 @@
 import org.jetbrains.kotlin.descriptors.ClassKind
 import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
 import org.jetbrains.kotlin.descriptors.Modality
+import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.IrStatement
@@ -37,6 +38,7 @@
 import org.jetbrains.kotlin.konan.ForeignExceptionMode
 import org.jetbrains.kotlin.konan.target.Family
 import org.jetbrains.kotlin.konan.target.KonanTarget
+import org.jetbrains.kotlin.library.KotlinLibrary
 import org.jetbrains.kotlin.library.metadata.isCInteropLibrary
 import org.jetbrains.kotlin.library.uniqueName
 import org.jetbrains.kotlin.name.Name
@@ -55,6 +57,7 @@
     fun addKotlin(declaration: IrDeclaration)
     fun getUniqueCName(prefix: String): String
     fun getUniqueKotlinFunctionReferenceClassName(prefix: String): String
+    fun getPackageFragmentLibrary(packageFragment: IrPackageFragment): KotlinLibrary?
 
     fun throwCompilerError(element: IrElement?, message: String): Nothing
     fun renderCompilerError(element: IrElement?, message: String = "Failed requirement."): String
@@ -189,11 +192,23 @@
         callBuilder.state.addC(listOf("extern const $targetFunctionVariable __asm(\"$cCallSymbolName\");")) // Exported from cinterop stubs.
     }
 
-    val libraryName = if (isInvoke) "" else callee.getPackageFragment().konanLibrary.let {
+    val libraryName = if (isInvoke) "" else this.getPackageFragmentLibrary(callee.getPackageFragment()).let {
+        if (it == null) {
+            val moduleDescriptor = callee.getPackageFragment().moduleDescriptor
+            println("QXX: $moduleDescriptor ${moduleDescriptor::class.java}" +
+                    " ${System.identityHashCode(moduleDescriptor)}" +
+                    " ${(moduleDescriptor as? FirModuleDescriptor)?.moduleData?.name}" +
+                    " ${(moduleDescriptor as? FirModuleDescriptor)?.moduleData?.capabilities?.joinToString()}")
+        }
         require(it?.isCInteropLibrary() == true) { "Expected a function from a cinterop library: ${callee.render()}" }
         it.uniqueName
     }
 
+//    val libraryName = if (isInvoke) "" else callee.getPackageFragment().konanLibrary.let {
+//        require(it?.isCInteropLibrary() == true) { "Expected a function from a cinterop library: ${callee.render()}" }
+//        it.uniqueName
+//    }
+
     callBuilder.finishBuilding(libraryName)
 
     return result
@@ -342,7 +357,8 @@
     val isDirect = directSymbolName != null
 
     val exceptionMode = ForeignExceptionMode.byValue(
-            resolved.konanLibrary?.manifestProperties
+            this@generateObjCCall.getPackageFragmentLibrary(resolved.getPackageFragment())
+                    ?.manifestProperties
                     ?.getProperty(ForeignExceptionMode.manifestKey)
     )
 
@@ -441,7 +457,7 @@
         // an explicit call must have been executed and no edge would be lost.
         ""
     } else { // Category-provided.
-        method.getPackageFragment().konanLibrary.let {
+        this@generateObjCCall.getPackageFragmentLibrary(method.getPackageFragment()).let {
             require(it?.isCInteropLibrary() == true) { "Expected a function from a cinterop library: ${method.render()}" }
             it.uniqueName
         }
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
index 7d7629a..51538db 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
@@ -19,6 +19,9 @@
 import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
 import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
 import org.jetbrains.kotlin.config.CommonConfigurationKeys
+import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
+import org.jetbrains.kotlin.config.languageVersionSettings
+import org.jetbrains.kotlin.fir.moduleData
 import org.jetbrains.kotlin.konan.file.File
 import org.jetbrains.kotlin.konan.target.CompilerOutputKind
 import org.jetbrains.kotlin.util.PerformanceManager
@@ -131,6 +134,13 @@
             val fir2IrOutput = performanceManager.tryMeasurePhaseTime(PhaseType.TranslationToIr) {
                 engine.runFir2Ir(frontendOutput)
             }
+
+//                println("firResult:")
+//                frontendOutput.firResult.outputs.forEach {
+//                    println("    ${it.session.moduleData.name}")
+//                    it.fir.forEach { println("        ${it.name}") }
+//                }
+
             val headerKlibPath = config.headerKlibPath
             if (!headerKlibPath.isNullOrEmpty()) {
                 val headerKlib = performanceManager.tryMeasurePhaseTime(PhaseType.IrSerialization) {
@@ -147,7 +157,7 @@
             engine.runK2SpecialBackendChecks(fir2IrOutput)
 
             val loweredIr = performanceManager.tryMeasurePhaseTime(PhaseType.IrPreLowering) {
-                engine.runPreSerializationLowerings(fir2IrOutput, environment)
+                engine.runPreSerializationLowerings(fir2IrOutput, environment, config)
             }
             performanceManager.tryMeasurePhaseTime(PhaseType.IrSerialization) {
                 engine.runFir2IrSerializer(FirSerializerInput(loweredIr))
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
index 048572c..7d068f3 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
@@ -8,14 +8,18 @@
 import org.jetbrains.kotlin.backend.common.phaser.KotlinBackendIrHolder
 import org.jetbrains.kotlin.backend.common.phaser.PhaseEngine
 import org.jetbrains.kotlin.backend.common.phaser.createSimpleNamedCompilerPhase
+import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
 import org.jetbrains.kotlin.backend.konan.KonanCompilationException
+import org.jetbrains.kotlin.backend.konan.KonanConfig
 import org.jetbrains.kotlin.backend.konan.NativeGenerationState
 import org.jetbrains.kotlin.backend.konan.NativePreSerializationLoweringContext
+import org.jetbrains.kotlin.backend.konan.NativePreSerializationLoweringContext2
 import org.jetbrains.kotlin.backend.konan.OutputFiles
 import org.jetbrains.kotlin.backend.konan.driver.PhaseContext
 import org.jetbrains.kotlin.backend.konan.driver.utilities.getDefaultIrActions
 import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
 import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier
+import org.jetbrains.kotlin.backend.konan.lower.InteropLowering
 import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal
 import org.jetbrains.kotlin.backend.konan.makeEntryPoint
 import org.jetbrains.kotlin.backend.konan.objcexport.createTestBundle
@@ -27,6 +31,7 @@
 import org.jetbrains.kotlin.config.messageCollector
 import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
 import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
+import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.IrFileEntry
@@ -34,7 +39,10 @@
 import org.jetbrains.kotlin.ir.declarations.IrFile
 import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
 import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
+import org.jetbrains.kotlin.ir.declarations.moduleDescriptor
 import org.jetbrains.kotlin.ir.inline.konan.nativeLoweringsOfTheFirstPhase
+import org.jetbrains.kotlin.ir.inline.konan.upgradeCallableReferencesPhase
+import org.jetbrains.kotlin.ir.inline.localClassesInInlineLambdasPhase
 import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
 import org.jetbrains.kotlin.ir.util.addChild
 import org.jetbrains.kotlin.ir.util.addFile
@@ -86,21 +94,39 @@
     runPhase(K2SpecialBackendChecksPhase, fir2IrOutput)
 }
 
-internal fun <T : PhaseContext> PhaseEngine<T>.runPreSerializationLowerings(fir2IrOutput: Fir2IrOutput, environment: KotlinCoreEnvironment): Fir2IrOutput {
+internal fun <T : PhaseContext> PhaseEngine<T>.runPreSerializationLowerings(
+        fir2IrOutput: Fir2IrOutput,
+        environment: KotlinCoreEnvironment,
+        config: KonanConfig,
+): Fir2IrOutput {
     val diagnosticReporter = DiagnosticReporterFactory.createReporter(environment.configuration.messageCollector)
     val irDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(
             diagnosticReporter,
             environment.configuration.languageVersionSettings
     )
-    val loweringContext = NativePreSerializationLoweringContext(
+    val loweringContext = NativePreSerializationLoweringContext2(
             fir2IrOutput.fir2irActualizedResult.irBuiltIns,
             environment.configuration,
             irDiagnosticReporter,
+            config,
+            //fir2IrOutput.usedLibraries.entries.associate { it.value to it.key.library },
+            fir2IrOutput.usedPackages.entries.associate { it.key to it.value.library },
     )
     val preSerializationLowered = newEngine(loweringContext) { engine ->
+        val lowerings = nativeLoweringsOfTheFirstPhase(environment.configuration.languageVersionSettings)
+                .toMutableList()
+        val index = lowerings.indexOfFirst { it == localClassesInInlineLambdasPhase }
+        //val index = lowerings.indexOfFirst { it == upgradeCallableReferencesPhase }
+        if (index != -1) {
+            lowerings.add(index + 1, interopModulePhase)
+//            println("QZZ")
+//            fir2IrOutput.usedPackages.forEach {
+//                println("    ${it.key.packageFqName} ${it.value.library.libraryName} ${it.key.moduleDescriptor}")
+//            }
+        }
         engine.runPreSerializationLoweringPhases(
                 fir2IrOutput.fir2irActualizedResult,
-                nativeLoweringsOfTheFirstPhase(environment.configuration.languageVersionSettings),
+                lowerings,
         )
     }
     // TODO: After KT-73624, generate native diagnostic tests for `compiler/testData/diagnostics/irInliner/syntheticAccessors`
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt
index c192e82..afd19f0 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt
@@ -10,15 +10,18 @@
 import org.jetbrains.kotlin.backend.konan.driver.PhaseContext
 import org.jetbrains.kotlin.backend.konan.fir2Ir
 import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
+import org.jetbrains.kotlin.descriptors.ModuleDescriptor
 import org.jetbrains.kotlin.fir.pipeline.Fir2IrActualizedResult
 import org.jetbrains.kotlin.fir.pipeline.FirResult
+import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
 import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
 
 internal data class Fir2IrOutput(
         val firResult: FirResult,
         val symbols: KonanSymbols,
         val fir2irActualizedResult: Fir2IrActualizedResult,
-        val usedLibraries: Set<KotlinResolvedLibrary>
+        val usedLibraries: Set<KotlinResolvedLibrary>,
+        val usedPackages: Map<IrExternalPackageFragment, KotlinResolvedLibrary>
 )
 
 internal val Fir2IrPhase = createSimpleNamedCompilerPhase(
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt
index 5d6b958..6822e92 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt
@@ -7,6 +7,7 @@
 
 import org.jetbrains.kotlin.backend.common.BodyLoweringPass
 import org.jetbrains.kotlin.backend.common.FileLoweringPass
+import org.jetbrains.kotlin.backend.common.PreSerializationLoweringContext
 import org.jetbrains.kotlin.backend.common.ir.Symbols
 import org.jetbrains.kotlin.backend.common.ir.isReifiable
 import org.jetbrains.kotlin.backend.common.lower.*
@@ -33,6 +34,7 @@
 import org.jetbrains.kotlin.ir.inline.*
 import org.jetbrains.kotlin.backend.konan.lower.NativeAssertionWrapperLowering
 import org.jetbrains.kotlin.backend.konan.optimizations.CastsOptimization
+import org.jetbrains.kotlin.config.CommonConfigurationKeys
 import org.jetbrains.kotlin.ir.interpreter.IrInterpreterConfiguration
 
 internal typealias LoweringList = List<NamedCompilerPhase<NativeGenerationState, IrFile, IrFile>>
@@ -376,6 +378,13 @@
         prerequisite = setOf(extractLocalClassesFromInlineBodies)
 )
 
+val interopModulePhase = makeIrModulePhase(
+        lowering = { context: PreSerializationLoweringContext ->
+            InteropLowering(context as NativeLoweringContext, null)
+        },
+        name = "Interop",
+)
+
 private val specialInteropIntrinsicsPhase = createFileLoweringPhase(
         lowering = ::SpecialInteropIntrinsicsLowering,
         name = "SpecialInteropIntrinsics",
@@ -391,7 +400,7 @@
 private val varargPhase = createFileLoweringPhase(
         ::VarargInjectionLowering,
         name = "Vararg",
-        prerequisite = setOf(functionReferencePhase, defaultParameterExtentPhase, interopPhase, functionsWithoutBoundCheck)
+        prerequisite = setOf(functionReferencePhase, defaultParameterExtentPhase, /*interopPhase, */functionsWithoutBoundCheck)
 )
 
 private val coroutinesPhase = createFileLoweringPhase(
@@ -566,7 +575,7 @@
         lateinitPhase,
         sharedVariablesPhase,
         extractLocalClassesFromInlineBodies,
-        interopPhase,
+        //interopPhase,
         arrayConstructorPhase,
         inlineOnlyPrivateFunctionsPhase,
         outerThisSpecialAccessorInInlineFunctionsPhase,
@@ -574,6 +583,7 @@
 )
 
 internal fun KonanConfig.getLoweringsAfterInlining(): LoweringList = listOfNotNull(
+        interopPhase,//.takeIf { !this.configuration.getBoolean(CommonConfigurationKeys.USE_FIR) },
         specializeSharedVariableBoxes,
         specialInteropIntrinsicsPhase,
         dumpTestsPhase.takeIf { this.configuration.getNotNull(KonanConfigKeys.GENERATE_TEST_RUNNER) != TestRunnerKind.NONE },
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
index 2181434..edeac01 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
@@ -65,7 +65,8 @@
         val additionalOutput = produceAdditionalOutput(psiToIrEngine)
         val psiToIrInput = PsiToIrInput(frontendOutput.moduleDescriptor, frontendOutput.environment, isProducingLibrary)
         val output = psiToIrEngine.runPhase(PsiToIrPhase, psiToIrInput)
-        psiToIrEngine.runSpecialBackendChecks(output.irModule, output.irBuiltIns, output.symbols)
+        if (!config.produce.isCache)
+            psiToIrEngine.runSpecialBackendChecks(output.irModule, output.irBuiltIns, output.symbols)
         output to additionalOutput
     }
     runPhase(CopyDefaultValuesToActualPhase, psiToIrOutput)
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt
index eb6c576..5d0ba7f 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt
@@ -9,6 +9,7 @@
 import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata
 import org.jetbrains.kotlin.backend.konan.serialization.isFromCInteropLibrary
 import org.jetbrains.kotlin.descriptors.ModuleDescriptor
+import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
@@ -16,6 +17,7 @@
 import org.jetbrains.kotlin.library.KotlinLibrary
 import org.jetbrains.kotlin.library.metadata.DeserializedKlibModuleOrigin
 import org.jetbrains.kotlin.library.metadata.klibModuleOrigin
+import org.jetbrains.kotlin.library.metadata.klibModuleOriginIfExists
 import org.jetbrains.kotlin.utils.atMostOne
 
 internal fun IrExpression.isBoxOrUnboxCall() =
@@ -31,7 +33,8 @@
     it.allOverriddenFunctions.atMostOne { it.parent == this }
 }
 
-val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
+val ModuleDescriptor.konanLibrary get() = (this.klibModuleOriginIfExists as? DeserializedKlibModuleOrigin)?.library
+//val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
 
 val IrPackageFragment.konanLibrary: KotlinLibrary?
     get() {
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt
index 9c08818..456ef11 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt
@@ -61,7 +61,11 @@
 
                     if (!declaration.isFakeOverride && declaration.isInline && declaration.isExported) {
                         val inlineFunctionSerializer = InlineFunctionSerializer(moduleDeserializer)
-                        generationState.inlineFunctionBodies.add(inlineFunctionSerializer.buildInlineFunctionReference(declaration))
+                        val element = inlineFunctionSerializer.buildInlineFunctionReference(declaration)
+                        generationState.inlineFunctionBodies.add(element)
+//                        if (declaration.name.asString() == "useContents") {
+//                            println("YEAH: ${element.functionSignature} ${declaration.symbol.signature?.render()} ${declaration.render()}")
+//                        }
                         trackCallees(declaration)
                     }
                 }
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt
index 5712846..2e479ec 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt
@@ -9,6 +9,7 @@
 import org.jetbrains.kotlin.backend.konan.cgen.*
 import org.jetbrains.kotlin.ir.util.getAnnotationStringValue
 import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
+import org.jetbrains.kotlin.backend.konan.ir.isAny
 import org.jetbrains.kotlin.backend.konan.llvm.IntrinsicType
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.builders.*
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt
index fbab927..abf0117 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt
@@ -19,6 +19,7 @@
 import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.IrStatement
+import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
 import org.jetbrains.kotlin.ir.builders.*
 import org.jetbrains.kotlin.ir.builders.declarations.IrValueParameterBuilder
 import org.jetbrains.kotlin.ir.builders.declarations.buildFun
@@ -35,22 +36,45 @@
 import org.jetbrains.kotlin.ir.util.isSubtypeOf
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
 import org.jetbrains.kotlin.konan.ForeignExceptionMode
-import org.jetbrains.kotlin.konan.library.KonanLibrary
+import org.jetbrains.kotlin.library.KotlinLibrary
 import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.name.NativeStandardInteropNames.objCActionClassId
 import org.jetbrains.kotlin.native.interop.ObjCMethodInfo
 
-internal class InteropLowering(val context: Context, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
+internal class InteropLowering(val context: NativeLoweringContext, val fileLowerState: FileLowerState?) : FileLoweringPass, BodyLoweringPass {
     override fun lower(irFile: IrFile) {
+        if (irFile.hasAnnotation(context.symbols.interopLowered))
+            return
+        val fileLowerState = this.fileLowerState ?: FileLowerState()
         // TODO: merge these lowerings.
         InteropLoweringPart1(context, fileLowerState).lower(irFile)
         InteropLoweringPart2(context, fileLowerState).lower(irFile)
+        irFile.annotations += buildSimpleAnnotation(
+                context.irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
+                context.symbols.interopLowered.owner
+        )
+
+//        println("BEFORE:")
+//        println(irFile.dump())
+
+//        CollectInteropBridges(generationState).lower(irFile)
+
+//        println("AFTER:")
+//        println(irFile.dump())
     }
 
     override fun lower(irBody: IrBody, container: IrDeclaration) {
+        if (container.hasAnnotation(context.symbols.interopLowered))
+            return
+        val fileLowerState = this.fileLowerState ?: error("Expected to be called in per-file mode")
         InteropLoweringPart1(context, fileLowerState).lower(irBody, container)
         InteropLoweringPart2(context, fileLowerState).lower(irBody, container)
+        container.annotations += buildSimpleAnnotation(
+                context.irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
+                context.symbols.interopLowered.owner
+        )
+//        CollectInteropBridges(generationState).lower(irBody, container)
     }
 }
 
@@ -59,7 +83,7 @@
 }
 
 private abstract class BaseInteropIrTransformer(
-        protected val context: Context,
+        protected val context: NativeLoweringContext,
         protected val fileLowerState: FileLowerState,
         protected val irFile: IrFile?,
 ) : IrBuildingTransformer(context) {
@@ -113,8 +137,8 @@
             override val symbols get() = context.symbols
             override val typeSystem: IrTypeSystemContext get() = context.typeSystem
 
-            val klib: KonanLibrary? get() {
-                return (element as? IrCall)?.symbol?.owner?.konanLibrary as? KonanLibrary
+            val klib: KotlinLibrary? = (element as? IrCall)?.symbol?.owner?.getPackageFragment()?.let {
+                getPackageFragmentLibrary(it)
             }
 
             override val language: String
@@ -131,6 +155,13 @@
             override fun getUniqueKotlinFunctionReferenceClassName(prefix: String) =
                     fileLowerState.getFunctionReferenceImplUniqueName(prefix)
 
+            override fun getPackageFragmentLibrary(packageFragment: IrPackageFragment): KotlinLibrary? {
+                (packageFragment as? IrExternalPackageFragment)?.let {
+                    return context.getExternalPackageFragmentLibrary(it)
+                }
+                return packageFragment.konanLibrary
+            }
+
             override val target get() = context.config.target
 
             override fun throwCompilerError(element: IrElement?, message: String): Nothing {
@@ -146,7 +177,7 @@
             renderCompilerError(irFile, element, message)
 }
 
-private class InteropLoweringPart1(val context: Context, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
+private class InteropLoweringPart1(val context: NativeLoweringContext, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
     private var topLevelInitializersCounter = 0
 
     override fun lower(irFile: IrFile) {
@@ -190,7 +221,7 @@
 }
 
 private class InteropTransformerPart1(
-        context: Context,
+        context: NativeLoweringContext,
         fileLowerState: FileLowerState,
         irFile: IrFile?,
 ) : BaseInteropIrTransformer(context, fileLowerState, irFile) {
@@ -597,6 +628,8 @@
             }
 
     override fun visitCall(expression: IrCall): IrExpression {
+        if (tryGetIntrinsicType(expression) == IntrinsicType.INIT_INSTANCE) return expression // Avoid double lowering.
+
         expression.transformChildrenVoid()
 
         val callee = expression.symbol.owner
@@ -703,7 +736,7 @@
 /**
  * Lowers some interop intrinsic calls.
  */
-private class InteropLoweringPart2(val context: Context, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
+private class InteropLoweringPart2(val context: NativeLoweringContext, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
     override fun lower(irFile: IrFile) {
         val transformer = InteropTransformerPart2(context, fileLowerState, irFile)
         irFile.transformChildrenVoid(transformer)
@@ -716,7 +749,7 @@
 }
 
 private class InteropTransformerPart2(
-        context: Context,
+        context: NativeLoweringContext,
         fileLowerState: FileLowerState,
         irFile: IrFile?,
 ) : BaseInteropIrTransformer(context, fileLowerState, irFile) {
@@ -811,7 +844,8 @@
         val function = expression.symbol.owner
 
         val exceptionMode = ForeignExceptionMode.byValue(
-                function.konanLibrary?.manifestProperties?.getProperty(ForeignExceptionMode.manifestKey)
+                context.getExternalPackageFragmentLibrary(function.getPackageFragment() as IrExternalPackageFragment)
+                        ?.manifestProperties?.getProperty(ForeignExceptionMode.manifestKey)
         )
         return builder.generateExpressionWithStubs(expression) { generateCCall(expression, builder, isInvoke = false, exceptionMode) }
     }
@@ -865,8 +899,8 @@
     }
 
     private fun lowerWorkerExecute(expression: IrCall): IrExpression {
-        val staticFunctionArgument = unwrapStaticFunctionArgument(expression.arguments[3]!!)
-        require(staticFunctionArgument != null) { renderCompilerError(expression) }
+        val staticFunctionArgument = unwrapStaticFunctionArgument(expression.arguments[3]!!) ?: error("BUGBUGBUG: ${expression.dump()}")
+        //require(staticFunctionArgument != null) { renderCompilerError(expression) }
 
         builder.at(expression)
         val targetSymbol = staticFunctionArgument.function.symbol
@@ -901,6 +935,7 @@
             IntrinsicType.OBJC_INIT_BY -> return lowerObjCInitBy(expression)
             IntrinsicType.INTEROP_STATIC_C_FUNCTION -> return lowerStaticCFunction(expression)
             IntrinsicType.WORKER_EXECUTE -> return lowerWorkerExecute(expression)
+            IntrinsicType.INIT_INSTANCE -> return expression // Avoid double lowering.
             else -> Unit
         }
 
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt
index ce58da5..f5dc070 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt
@@ -64,7 +64,7 @@
 
         LocalClassesInInlineLambdasLowering(context).lower(body, function)
 
-        InteropLowering(context, generationState.fileLowerState).lower(body, function)
+        //InteropLowering(context, generationState.fileLowerState).lower(body, function)
 
         ArrayConstructorLowering(context).lower(body, function)
 
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt
index 1b36238..b3c5d8f 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt
@@ -312,8 +312,12 @@
 
             expression.symbol.owner.getObjCInitMethod()?.let { initMethod ->
 
-                if (!expression.symbol.owner.objCConstructorIsDesignated())
-                    reportError(expression, "Unable to call non-designated initializer as super constructor")
+                if (!expression.symbol.owner.objCConstructorIsDesignated()) {
+//                    print("BUGBUGBUG: ${expression.dump()}")
+//                    println(expression.symbol.owner.dump())
+                    error("Unable to call non-designated initializer as super constructor")
+//                    reportError(expression, "Unable to call non-designated initializer as super constructor")
+                }
 
                 checkCanGenerateObjCCall(
                         method = initMethod,
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt
index 6c21562..f61ea32 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt
@@ -122,10 +122,14 @@
 ) {
     private val inlineFunctionReferences: Map<IdSignature, SerializedInlineFunctionReference> by lazy {
         val cache = cachedLibraries.getLibraryCache(deserializer.klib) ?: error("No cache for ${deserializer.klib.libraryName}")
+        //println("ZZZ: ${deserializer.klib.libraryName}")
         cache.serializedInlineFunctionBodies.associateBy {
             with(deserializer) {
                 val symbolDeserializer = it.file.deserializationState.declarationDeserializer.symbolDeserializer
-                symbolDeserializer.deserializeIdSignature(it.functionSignature)
+                symbolDeserializer.deserializeIdSignature(it.functionSignature)/*.also { signature ->
+                    //if (it.functionSignature == 829)
+                    println("    ${it.functionSignature}: ${signature.render()}")
+                }*/
             }
         }
     }
@@ -146,6 +150,8 @@
         val fileDeserializationState = with(deserializer) { inlineFunctionReference.file.deserializationState }
         val declarationDeserializer = fileDeserializationState.declarationDeserializer
 
+        //println("QZZ: ${function.render()} ${signature.render()}")
+
         if (packageFragment is IrExternalPackageFragment) {
             val symbolDeserializer = declarationDeserializer.symbolDeserializer
             val outerClasses = (function.parent as? IrClass)?.getOuterClasses(takeOnlyInner = true) ?: emptyList()
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt
index 462f6b6..47c46ce 100644
--- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt
+++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt
@@ -161,3 +161,6 @@
 @Retention(value = AnnotationRetention.BINARY)
 @ExperimentalNativeApi
 public annotation class ExportedBridge(val bridgeName: String)
+
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FILE)
+internal annotation class InteropLowered
\ No newline at end of file