rr/darthorimar/paaaackage wip
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt
index 084aabb..573d729 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt
@@ -24,9 +24,9 @@
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.createDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinCompositeDeclarationProvider
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.moduleData
 import org.jetbrains.kotlin.fir.resolve.ScopeSession
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt
index 26f1632..adc2d08 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt
@@ -17,8 +17,10 @@
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProviderMerger
 import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModificationService
 import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerMerger
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderMerger
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinByModulesResolutionScopeProvider
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeProvider
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule
@@ -27,8 +29,9 @@
 import org.jetbrains.kotlin.analysis.api.standalone.base.declarations.KotlinStandaloneDeclarationProviderMerger
 import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneGlobalModificationService
 import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerMerger
 import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderMerger
 import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.StandaloneProjectFactory
 import org.jetbrains.kotlin.analysis.decompiled.light.classes.ClsJavaStubByVirtualFileCache
 import org.jetbrains.kotlin.analysis.decompiled.light.classes.DecompiledLightClassesFactory
@@ -165,7 +168,11 @@
                 KotlinPackageProviderFactory::class.java,
                 KotlinStandalonePackageProviderFactory(project, testKtFiles + ktFilesForBinaries)
             )
-            registerService(KotlinPackageProviderMerger::class.java, KotlinStandalonePackageProviderMerger(project))
+            registerService(
+                KotlinPackageExistenceCheckerFactory::class.java,
+                KotlinStandalonePackageExistenceCheckerFactory(project, testKtFiles + ktFilesForBinaries)
+            )
+            registerService(KotlinPackageExistenceCheckerMerger::class.java, KotlinStandalonePackageExistenceCheckerMerger(project))
             registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java)
         }
     }
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt
index 9be7bc2..f6f002c 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt
@@ -18,7 +18,7 @@
  * It is a responsibility of the implementor to make the source representation correct.
  * Symbol's properties are not affected by its source representation.
  *
- * Implementations should be consistent with their corresponding [KotlinForwardDeclarationsPackageProviderFactory][org.jetbrains.kotlin.analysis.api.platform.packages.KotlinForwardDeclarationsPackageProviderFactory]
+ * Implementations should be consistent with their corresponding [KotlinForwardDeclarationsPackageProviderFactory][org.jetbrains.kotlin.analysis.api.platform.packages.KotlinForwardDeclarationsPackageExistenceCheckerFactory]
  * implementation.
  */
 public interface KotlinForwardDeclarationProviderFactory : KotlinOptionalPlatformComponent {
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageProviderFactory.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageExistenceCheckerFactory.kt
similarity index 62%
rename from analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageProviderFactory.kt
rename to analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageExistenceCheckerFactory.kt
index 23f3503..4b1b3aac 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageProviderFactory.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageExistenceCheckerFactory.kt
@@ -11,20 +11,20 @@
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
 
 /**
- * [KotlinForwardDeclarationsPackageProviderFactory] creates [KotlinPackageProvider]s for Kotlin/Native forward declarations.
+ * [KotlinForwardDeclarationsPackageExistenceCheckerFactory] creates [KotlinPackageProvider]s for Kotlin/Native forward declarations.
  *
  * Implementations should be consistent with their corresponding [KotlinForwardDeclarationProviderFactory][org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinForwardDeclarationProviderFactory]
  * implementation.
  */
-public interface KotlinForwardDeclarationsPackageProviderFactory : KotlinOptionalPlatformComponent {
+public interface KotlinForwardDeclarationsPackageExistenceCheckerFactory : KotlinOptionalPlatformComponent {
     /**
      * Creates a package provider for Kotlin/Native forward declaration packages in [module], or `null` if the module cannot contain forward
      * declarations.
      */
-    public fun createPackageProvider(module: KaModule): KotlinPackageProvider?
+    public fun createPackageExistenceChecker(module: KaModule): KotlinPackageExistenceChecker?
 
     public companion object {
-        public fun getInstance(project: Project): KotlinForwardDeclarationsPackageProviderFactory? = project.serviceOrNull()
+        public fun getInstance(project: Project): KotlinForwardDeclarationsPackageExistenceCheckerFactory? = project.serviceOrNull()
     }
 }
 
@@ -32,7 +32,7 @@
  * Creates a package provider for Kotlin/Native forward declaration packages in [module], or `null` if the module cannot contain forward
  * declarations.
  *
- * @see KotlinForwardDeclarationsPackageProviderFactory
+ * @see KotlinForwardDeclarationsPackageExistenceCheckerFactory
  */
-public fun Project.createForwardDeclarationsPackageProvider(module: KaModule): KotlinPackageProvider? =
-    KotlinForwardDeclarationsPackageProviderFactory.getInstance(this)?.createPackageProvider(module)
+public fun Project.createForwardDeclarationsPackageExistenceChecker(module: KaModule): KotlinPackageExistenceChecker? =
+    KotlinForwardDeclarationsPackageExistenceCheckerFactory.getInstance(this)?.createPackageExistenceChecker(module)
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageExistenceChecker.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageExistenceChecker.kt
new file mode 100644
index 0000000..db57b5d
--- /dev/null
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageExistenceChecker.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.platform.packages
+
+import com.intellij.openapi.components.service
+import com.intellij.openapi.project.Project
+import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.analysis.api.platform.KotlinComposableProvider
+import org.jetbrains.kotlin.analysis.api.platform.KotlinComposableProviderMerger
+import org.jetbrains.kotlin.analysis.api.platform.KotlinCompositeProvider
+import org.jetbrains.kotlin.analysis.api.platform.KotlinCompositeProviderFactory
+import org.jetbrains.kotlin.analysis.api.platform.KotlinPlatformComponent
+import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.platform.TargetPlatform
+
+
+public interface KotlinPackageExistenceChecker : KotlinComposableProvider {
+    public fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean
+}
+
+public class KotlinCompositePackageExistenceChecker private constructor(
+    override val providers: List<KotlinPackageExistenceChecker>,
+) : KotlinPackageExistenceChecker, KotlinCompositeProvider<KotlinPackageExistenceChecker> {
+    override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
+        return providers.any { it.doesKotlinOnlyPackageExist(packageFqName) }
+    }
+
+    public companion object {
+        public val factory: KotlinCompositeProviderFactory<KotlinPackageExistenceChecker> = KotlinCompositeProviderFactory(
+            KotlinEmptyPackageExistenceChecker,
+            ::KotlinCompositePackageExistenceChecker,
+        )
+
+        public fun create(providers: List<KotlinPackageExistenceChecker>): KotlinPackageExistenceChecker = factory.create(providers)
+    }
+}
+
+public object KotlinEmptyPackageExistenceChecker : KotlinPackageExistenceChecker {
+    override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
+        return false
+    }
+}
+
+public interface KotlinPackageExistenceCheckerFactory {
+    public fun createPackageExistenceChecker(modules: List<KaModule>): KotlinPackageExistenceChecker
+    public fun createPackageExistenceChecker(module: KaModule): KotlinPackageExistenceChecker =
+        createPackageExistenceChecker(listOf(module))
+
+    public companion object {
+        public fun getInstance(project: Project): KotlinPackageExistenceCheckerFactory = project.service()
+    }
+}
+
+public interface KotlinPackageExistenceCheckerMerger : KotlinComposableProviderMerger<KotlinPackageExistenceChecker>,
+    KotlinPlatformComponent {
+    public companion object {
+        public fun getInstance(project: Project): KotlinPackageExistenceCheckerMerger = project.service()
+    }
+}
+
+
+public fun Project.mergePackageExistenceChecker(checkers: List<KotlinPackageExistenceChecker>): KotlinPackageExistenceChecker =
+    KotlinPackageExistenceCheckerMerger.getInstance(this).merge(checkers)
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt
index 66538bc..97b7579 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt
@@ -19,7 +19,7 @@
  * [scope][com.intellij.psi.search.GlobalSearchScope], but the details depend on the kind of package provider.
  *
  * The main kind of package providers is created via [KotlinPackageProviderFactory] and it is scope-based, but there are other kinds of
- * package providers, such as those created by [KotlinForwardDeclarationsPackageProviderFactory].
+ * package providers, such as those created by [KotlinForwardDeclarationsPackageExistenceCheckerFactory].
  *
  * Package providers are critical for performance, so implementations should cache results.
  */
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt
index 5d1e13e..b89812d 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt
@@ -28,20 +28,8 @@
     }
 }
 
-/**
- * [KotlinPackageProviderMerger] allows merging multiple [KotlinPackageProvider]s into a more efficient package provider.
- *
- * Package providers should not be naively merged by combining scopes and calling [createPackageProvider], because there may be additional
- * package providers which do not operate based on scopes (e.g. resolve extension package providers).
- */
-public interface KotlinPackageProviderMerger : KotlinComposableProviderMerger<KotlinPackageProvider>, KotlinPlatformComponent {
-    public companion object {
-        public fun getInstance(project: Project): KotlinPackageProviderMerger = project.service()
-    }
-}
 
 public fun Project.createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider =
     KotlinPackageProviderFactory.getInstance(this).createPackageProvider(searchScope)
 
-public fun Project.mergePackageProviders(packageProviders: List<KotlinPackageProvider>): KotlinPackageProvider =
-    KotlinPackageProviderMerger.getInstance(this).merge(packageProviders)
+
diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageExistenceChecker.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageExistenceChecker.kt
new file mode 100644
index 0000000..c601e8a
--- /dev/null
+++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageExistenceChecker.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.standalone.base.packages
+
+import com.intellij.openapi.project.Project
+import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.analysis.api.platform.mergeSpecificProviders
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinEmptyPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerMerger
+import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.psi.KtFile
+
+class KotlinStandalonePackageExistenceChecker(
+    project: Project,
+    scope: GlobalSearchScope,
+    files: Collection<KtFile>,
+    val modules: List<KaModule>,
+) : KotlinPackageExistenceChecker {
+    // TODO
+    private val provider = KotlinStandalonePackageProvider(project, scope, files)
+
+    override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
+        return provider.doesKotlinOnlyPackageExist(packageFqName)
+    }
+}
+
+class KotlinStandalonePackageExistenceCheckerFactory(
+    private val project: Project,
+    private val files: Collection<KtFile>,
+) : KotlinPackageExistenceCheckerFactory {
+    override fun createPackageExistenceChecker(modules: List<KaModule>): KotlinPackageExistenceChecker {
+        if (modules.isEmpty()) return KotlinEmptyPackageExistenceChecker
+        return KotlinStandalonePackageExistenceChecker(project, GlobalSearchScope.union(modules.map { it.contentScope }), files, modules)
+    }
+}
+
+class KotlinStandalonePackageExistenceCheckerMerger(private val project: Project) : KotlinPackageExistenceCheckerMerger {
+    override fun merge(providers: List<KotlinPackageExistenceChecker>): KotlinPackageExistenceChecker =
+        providers.mergeSpecificProviders<_, KotlinStandalonePackageExistenceChecker>(KotlinCompositePackageExistenceChecker.factory) { targetProviders ->
+            KotlinPackageExistenceCheckerFactory.getInstance(project).createPackageExistenceChecker(
+                providers.flatMap { (it as KotlinStandalonePackageExistenceChecker).modules } + targetProviders.flatMap { it.modules }
+            )
+        }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt
index 213f7db..a227fca 100644
--- a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt
+++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt
@@ -9,11 +9,7 @@
 import com.intellij.psi.search.GlobalSearchScope
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderMerger
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderBase
-import org.jetbrains.kotlin.analysis.api.platform.mergeSpecificProviders
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageProvider
 import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.psi.KtFile
@@ -53,16 +49,4 @@
     override fun createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider {
         return KotlinStandalonePackageProvider(project, searchScope, files)
     }
-}
-
-class KotlinStandalonePackageProviderMerger(private val project: Project) : KotlinPackageProviderMerger {
-    override fun merge(providers: List<KotlinPackageProvider>): KotlinPackageProvider =
-        providers.mergeSpecificProviders<_, KotlinStandalonePackageProvider>(KotlinCompositePackageProvider.factory) { targetProviders ->
-            val combinedScope = GlobalSearchScope.union(targetProviders.map { it.scope })
-            project.createPackageProvider(combinedScope).apply {
-                check(this is KotlinStandalonePackageProvider) {
-                    "`${KotlinStandalonePackageProvider::class.simpleName}` can only be merged into a combined package provider of the same type."
-                }
-            }
-        }
-}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
index 1de7e93..c4e43a0 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
@@ -21,9 +21,10 @@
 import org.jetbrains.kotlin.analysis.api.platform.lifetime.KotlinLifetimeTokenFactory
 import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModificationService
 import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerMerger
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackagePartProviderFactory
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderMerger
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinByModulesResolutionScopeProvider
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinCompilerPluginsProvider
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeProvider
@@ -35,8 +36,9 @@
 import org.jetbrains.kotlin.analysis.api.standalone.base.declarations.KotlinStandaloneFirCompilerPluginsProvider
 import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneGlobalModificationService
 import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerMerger
 import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderMerger
 import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.AnalysisApiSimpleServiceRegistrar
 import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.ApplicationServiceRegistration
 import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.FirStandaloneServiceRegistrar
@@ -164,7 +166,14 @@
                 KotlinPackageProviderFactory::class.java,
                 KotlinStandalonePackageProviderFactory(project, sourceKtFiles + declarationProviderFactory.getAdditionalCreatedKtFiles())
             )
-            registerService(KotlinPackageProviderMerger::class.java, KotlinStandalonePackageProviderMerger(this))
+            registerService(
+                KotlinPackageExistenceCheckerFactory::class.java,
+                KotlinStandalonePackageExistenceCheckerFactory(
+                    project,
+                    sourceKtFiles + declarationProviderFactory.getAdditionalCreatedKtFiles()
+                )
+            )
+            registerService(KotlinPackageExistenceCheckerMerger::class.java, KotlinStandalonePackageExistenceCheckerMerger(this))
 
             registerService(
                 KotlinPackagePartProviderFactory::class.java,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt
index 604dbb5..794bbd3 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt
@@ -9,9 +9,9 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.NullableCaffeineCache
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.mergeDeclarationProviders
-import org.jetbrains.kotlin.analysis.api.platform.packages.mergePackageProviders
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.mergePackageExistenceChecker
 import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.resolve.providers.FirCompositeCachedSymbolNamesProvider
@@ -42,7 +42,7 @@
  *
  * [declarationProvider] must have a scope which combines the scopes of the individual [providers].
  *
- * [packageProviderForKotlinPackages] should be the package provider combined from all [providers] which allow `kotlin` packages (see
+ * [packageExistenceCheckerForKotlinPackages] should be the package provider combined from all [providers] which allow `kotlin` packages (see
  * [LLFirProvider.SymbolProvider.allowKotlinPackage]). It may be `null` if no such provider exists. See [getPackage] for a use case.
  */
 internal class LLFirCombinedKotlinSymbolProvider private constructor(
@@ -50,8 +50,8 @@
     project: Project,
     providers: List<LLFirKotlinSymbolProvider>,
     private val declarationProvider: KotlinDeclarationProvider,
-    private val packageProvider: KotlinPackageProvider,
-    private val packageProviderForKotlinPackages: KotlinPackageProvider?,
+    private val packageExistenceChecker: KotlinPackageExistenceChecker,
+    private val packageExistenceCheckerForKotlinPackages: KotlinPackageExistenceChecker?,
 ) : LLFirSelectingCombinedSymbolProvider<LLFirKotlinSymbolProvider>(session, project, providers) {
     override val symbolNamesProvider: FirSymbolNamesProvider = FirCompositeCachedSymbolNamesProvider.fromSymbolProviders(session, providers)
 
@@ -126,9 +126,9 @@
             // because calling that individual symbol provider directly would result in `null` (as it disallows `kotlin` packages). The
             // `packageProviderForKotlinPackages` solves this issue by including only scopes from symbol providers which allow `kotlin`
             // packages.
-            packageProviderForKotlinPackages?.doesKotlinOnlyPackageExist(fqName) == true
+            packageExistenceCheckerForKotlinPackages?.doesKotlinOnlyPackageExist(fqName) == true
         } else {
-            packageProvider.doesKotlinOnlyPackageExist(fqName)
+            packageExistenceChecker.doesKotlinOnlyPackageExist(fqName)
         }
 
         // Regarding caching `hasPackage`: The static (standalone) package provider precomputes its packages, while the IDE package provider
@@ -141,20 +141,20 @@
             if (providers.size > 1) {
                 val declarationProvider = project.mergeDeclarationProviders(providers.map { it.declarationProvider })
 
-                val packageProvider = project.mergePackageProviders(providers.map { it.packageProvider })
+                val packageExistenceChecker = project.mergePackageExistenceChecker(providers.map { it.packageExistenceChecker })
 
                 val packageProviderForKotlinPackages = providers
                     .filter { it.allowKotlinPackage }
                     .takeIf { it.isNotEmpty() }
-                    ?.map { it.packageProvider }
-                    ?.let(project::mergePackageProviders)
+                    ?.map { it.packageExistenceChecker }
+                    ?.let(project::mergePackageExistenceChecker)
 
                 LLFirCombinedKotlinSymbolProvider(
                     session,
                     project,
                     providers,
                     declarationProvider,
-                    packageProvider,
+                    packageExistenceChecker,
                     packageProviderForKotlinPackages,
                 )
             } else providers.singleOrNull()
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt
index a26601f..f766f5d 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.analysis.low.level.api.fir.providers
 
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -29,7 +30,7 @@
 internal abstract class LLFirKotlinSymbolProvider(session: FirSession) : FirSymbolProvider(session) {
     abstract val declarationProvider: KotlinDeclarationProvider
 
-    abstract val packageProvider: KotlinPackageProvider
+    abstract val packageExistenceChecker: KotlinPackageExistenceChecker
 
     /**
      * Whether the [LLFirKotlinSymbolProvider] should be able to find symbols defined in `kotlin` packages. This is usually not the case for
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt
index ca2eb6a..15f5018 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt
@@ -10,9 +10,9 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.llFirModuleData
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createForwardDeclarationsPackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.createForwardDeclarationsPackageExistenceChecker
 import org.jetbrains.kotlin.analysis.api.platform.declarations.createForwardDeclarationProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
 import org.jetbrains.kotlin.fir.FirModuleData
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.caches.FirCache
@@ -44,7 +44,7 @@
     moduleDataProvider: SingleModuleDataProvider,
     private val kotlinScopeProvider: FirKotlinScopeProvider,
     override val declarationProvider: KotlinDeclarationProvider,
-    override val packageProvider: KotlinPackageProvider,
+    override val packageExistenceChecker: KotlinPackageExistenceChecker,
 ) : LLFirKotlinSymbolProvider(
     session,
 ) {
@@ -67,7 +67,7 @@
             }
         )
 
-    override fun getPackage(fqName: FqName): FqName? = fqName.takeIf { packageProvider.doesKotlinOnlyPackageExist(fqName) }
+    override fun getPackage(fqName: FqName): FqName? = fqName.takeIf { packageExistenceChecker.doesKotlinOnlyPackageExist(fqName) }
 
     @FirSymbolProviderInternals
     override fun getClassLikeSymbolByClassId(
@@ -136,16 +136,16 @@
     kotlinScopeProvider: FirKotlinScopeProvider,
 ): FirSymbolProvider? {
     val ktModule = session.llFirModuleData.ktModule
-    val packageProvider = project.createForwardDeclarationsPackageProvider(ktModule)
+    val packageExistenceChecker = project.createForwardDeclarationsPackageExistenceChecker(ktModule)
     val declarationProvider = project.createForwardDeclarationProvider(ktModule)
 
-    check((packageProvider == null) == (declarationProvider == null)) {
+    check((packageExistenceChecker == null) == (declarationProvider == null)) {
         "Inconsistency between package and declaration providers for forward declarations. Both should be either null or non-null," +
-                " but found: packageProvider $packageProvider; declarationProvider $declarationProvider"
+                " but found: packageProvider $packageExistenceChecker; declarationProvider $declarationProvider"
     }
-    if (packageProvider == null || declarationProvider == null) return null
+    if (packageExistenceChecker == null || declarationProvider == null) return null
 
     return LLFirNativeForwardDeclarationsSymbolProvider(
-        session, moduleDataProvider, kotlinScopeProvider, declarationProvider, packageProvider,
+        session, moduleDataProvider, kotlinScopeProvider, declarationProvider, packageExistenceChecker,
     )
 }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt
index 96c8e18..2fbe51b 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt
@@ -9,6 +9,7 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
 import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
 import org.jetbrains.kotlin.fir.NoMutableState
 import org.jetbrains.kotlin.fir.ThreadSafeMutableState
@@ -110,7 +111,7 @@
     internal inner class SymbolProvider : LLFirKotlinSymbolProvider(session) {
         override val declarationProvider: KotlinDeclarationProvider get() = providerHelper.declarationProvider
 
-        override val packageProvider: KotlinPackageProvider get() = providerHelper.packageProvider
+        override val packageExistenceChecker: KotlinPackageExistenceChecker get() = providerHelper.packageExistenceChecker
 
         override val symbolNamesProvider: FirSymbolNamesProvider get() = providerHelper.symbolNameCache
 
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt
index 6fb1697..b04beb4 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt
@@ -14,9 +14,9 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirElementFinder
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinCompositeDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
 import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.config.AnalysisFlags
 import org.jetbrains.kotlin.fir.caches.FirCache
@@ -64,10 +64,10 @@
         )
     )
 
-    val packageProvider = KotlinCompositePackageProvider.create(
+    val packageExistenceChecker = KotlinCompositePackageExistenceChecker.create(
         listOfNotNull(
-            firSession.project.createPackageProvider(searchScope),
-            extensionTool?.packageProvider,
+            KotlinPackageExistenceCheckerFactory.getInstance(firSession.project).createPackageExistenceChecker(listOf(firSession.ktModule))
+//            extensionTool?.packageProvider, TODO
         )
     )
 
@@ -229,7 +229,7 @@
 
     fun getPackage(fqName: FqName): FqName? {
         if (!allowKotlinPackage && fqName.isKotlinPackage()) return null
-        return fqName.takeIf(packageProvider::doesKotlinOnlyPackageExist)
+        return fqName.takeIf(packageExistenceChecker::doesKotlinOnlyPackageExist)
     }
 }
 
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt
index defa705..26bf1b6 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt
@@ -12,7 +12,7 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirKotlinSymbolProvider
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
 import org.jetbrains.kotlin.analysis.api.platform.declarations.createDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.caches.FirCache
 import org.jetbrains.kotlin.fir.caches.firCachesFactory
@@ -88,7 +88,8 @@
     private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId)
     private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId)
 
-    final override val packageProvider = project.createPackageProvider(scope)
+    final override val packageExistenceChecker =
+        KotlinPackageExistenceCheckerFactory.getInstance(project).createPackageExistenceChecker(session.llFirModuleData.ktModule)
 
     /**
      * Computes the origin for the declarations coming from [file].
@@ -285,7 +286,7 @@
     }
 
     override fun getPackage(fqName: FqName): FqName? =
-        fqName.takeIf { packageProvider.doesKotlinOnlyPackageExist(fqName) }
+        fqName.takeIf { packageExistenceChecker.doesKotlinOnlyPackageExist(fqName) }
 
     override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
         if (!symbolNamesProvider.mayHaveTopLevelClassifier(classId)) return null