KT-64385 Enable K2 KAPT by default

Also adds support for front-end compiler plugins in Kapt

(cherry picked from commit 7e9d6e601d007bc1250e1b47c6b2e55e3399145b)
diff --git a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArgumentsCopyGenerated.kt b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArgumentsCopyGenerated.kt
index 6f50b16..f125da9 100644
--- a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArgumentsCopyGenerated.kt
+++ b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArgumentsCopyGenerated.kt
@@ -78,7 +78,6 @@
     to.typeEnhancementImprovementsInStrictMode = from.typeEnhancementImprovementsInStrictMode
     to.useFastJarFileSystem = from.useFastJarFileSystem
     to.useJavac = from.useJavac
-    to.useKapt4 = from.useKapt4
     to.useOldBackend = from.useOldBackend
     to.useOldClassFilesReading = from.useOldClassFilesReading
     to.useOldInlineClassesManglingScheme = from.useOldInlineClassesManglingScheme
diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt
index 146457d..b214ad3 100644
--- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt
+++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt
@@ -845,16 +845,6 @@
             field = value
         }
 
-    @Argument(
-        value = "-Xuse-kapt4",
-        description = "Enable the experimental KAPT 4."
-    )
-    var useKapt4 = false
-        set(value) {
-            checkFrozen()
-            field = value
-        }
-
     override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap<AnalysisFlag<*>, Any> {
         val result = super.configureAnalysisFlags(collector, languageVersion)
         result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt
index 70cd63a..cc951af 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt
@@ -8,7 +8,6 @@
 import com.intellij.ide.highlighter.JavaFileType
 import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
 import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
-import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
 import org.jetbrains.kotlin.cli.common.arguments.ManualLanguageFeatureSetting
 import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
 import org.jetbrains.kotlin.cli.common.messages.MessageCollector
@@ -48,7 +47,6 @@
         }
     }
 
-    switchToFallbackModeIfNecessary(arguments, messageCollector)
     setupLanguageVersionSettings(arguments)
 
     val usesK2 = arguments.useK2 || languageVersionSettings.languageVersion.usesK2
@@ -57,34 +55,6 @@
     buildHmppModuleStructure(arguments)?.let { put(CommonConfigurationKeys.HMPP_MODULE_STRUCTURE, it) }
 }
 
-private fun switchToFallbackModeIfNecessary(arguments: CommonCompilerArguments, messageCollector: MessageCollector) {
-    fun warn(message: String) {
-        if (!arguments.suppressVersionWarnings) messageCollector.report(CompilerMessageSeverity.STRONG_WARNING, message)
-    }
-
-    if (arguments !is K2JVMCompilerArguments) return
-    val isK2 =
-        arguments.useK2 || (arguments.languageVersion?.startsWith('2') ?: (LanguageVersion.LATEST_STABLE >= LanguageVersion.KOTLIN_2_0))
-    val isKaptUsed = arguments.pluginOptions?.any { it.startsWith("plugin:org.jetbrains.kotlin.kapt3") } == true
-    when {
-        isK2 && isKaptUsed && !arguments.useKapt4 -> {
-            warn("Kapt currently doesn't support language version 2.0+. Falling back to 1.9.")
-            arguments.languageVersion = LanguageVersion.KOTLIN_1_9.versionString
-            if (arguments.apiVersion?.startsWith("2") == true) {
-                arguments.apiVersion = ApiVersion.KOTLIN_1_9.versionString
-            }
-            arguments.useK2 = false
-            arguments.skipMetadataVersionCheck = true
-            arguments.skipPrereleaseCheck = true
-            arguments.allowUnstableDependencies = true
-        }
-        arguments.useKapt4 -> warn(
-            if (isK2) "K2 kapt is an experimental feature. Use with caution."
-            else "-Xuse-kapt4 flag can be only used with language version 2.0+."
-        )
-    }
-}
-
 fun CompilerConfiguration.setupLanguageVersionSettings(arguments: CommonCompilerArguments) {
     languageVersionSettings = arguments.toLanguageVersionSettings(getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY))
 }
diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out
index 207dfc4..b3b543b 100644
--- a/compiler/testData/cli/jvm/extraHelp.out
+++ b/compiler/testData/cli/jvm/extraHelp.out
@@ -142,7 +142,6 @@
                              See KT-45671 for more details.
   -Xuse-fast-jar-file-system Use the fast implementation of Jar FS. This may speed up compilation time, but it is experimental.
   -Xuse-javac                Use javac for Java source and class file analysis.
-  -Xuse-kapt4                Enable the experimental KAPT 4.
   -Xuse-old-backend          Use the old JVM backend.
   -Xuse-old-class-files-reading Use the old implementation for reading class files. This may slow down the compilation and cause problems with Groovy interop.
                              This can be used in the event of problems with the new implementation.
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndGradleDaemon.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndGradleDaemon.kt
index f0d8516..30f3543 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndGradleDaemon.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndGradleDaemon.kt
@@ -12,9 +12,9 @@
 import org.junit.jupiter.api.AfterEach
 import org.junit.jupiter.api.DisplayName
 
-@DisplayName("Kapt caching inside Gradle daemon")
+@DisplayName("Kapt3 caching inside Gradle daemon")
 @DaemonsGradlePluginTests
-class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
+open class Kapt3AndGradleDaemon : KGPDaemonsBaseTest() {
 
     override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions
         .copy(
@@ -22,7 +22,7 @@
                 verbose = true,
                 includeCompileClasspath = false
             )
-        )
+        ).copyEnsuringK1()
 
     @DisplayName("Javac should be loaded only once")
     @GradleTest
@@ -51,7 +51,7 @@
     // which is not compatible with classloaders caching.
     @GradleTestVersions(maxVersion = TestVersions.Gradle.G_7_6)
     @GradleTest
-    fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {
+    open fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {
         project(
             "javacIsLoadedOnce".withPrefix,
             gradleVersion,
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt
index f44abb3..7f83f91 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt
@@ -146,17 +146,9 @@
     }
 
     @Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
-    override fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {
-    }
-
-    @Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
     override fun testMultipleProcessingPasses(gradleVersion: GradleVersion) {
     }
 
-    @Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project")
-    override fun useK2KaptProperty(gradleVersion: GradleVersion) {
-    }
-
     override fun testAnnotationProcessorAsFqName(gradleVersion: GradleVersion) {
         project("annotationProcessorAsFqName".withPrefix, gradleVersion) {
             //classloaders caching is not compatible with includeCompileClasspath
@@ -1258,99 +1250,6 @@
         }
     }
 
-    @DisplayName("Kapt runs in fallback mode with useK2 = true")
-    @GradleTest
-    open fun fallBackModeWithUseK2(gradleVersion: GradleVersion) {
-        project("simple".withPrefix, gradleVersion) {
-            buildGradle.appendText(
-                """
-                |tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
-                |    compilerOptions {
-                |        freeCompilerArgs.addAll([
-                |            "-Xuse-fir-ic",
-                |            "-Xuse-fir-lt"
-                |        ])
-                |    }
-                |    kotlinOptions {
-                |      useK2 = true
-                |    }
-                |}
-                |
-                |compileKotlin.kotlinOptions.allWarningsAsErrors = false
-                """.trimMargin()
-            )
-            build("build") {
-                assertKaptSuccessful()
-                assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
-                assertOutputContains("Falling back to 1.9.")
-            }
-        }
-    }
-
-    @DisplayName("Kapt runs in fallback mode with languageVersion = 2.0")
-    @GradleTest
-    open fun fallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {
-        project("simple".withPrefix, gradleVersion) {
-            buildGradle.appendText(
-                """
-                |tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
-                |    compilerOptions {
-                |        freeCompilerArgs.addAll([
-                |            "-Xuse-fir-ic",
-                |            "-Xuse-fir-lt"
-                |        ])
-                |    }
-                |    kotlinOptions {
-                |      languageVersion = "2.0"
-                |    }
-                |}
-                |
-                |compileKotlin.kotlinOptions.allWarningsAsErrors = false
-                """.trimMargin()
-            )
-            build("build") {
-                assertKaptSuccessful()
-                assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
-                assertOutputContains("Falling back to 1.9.")
-            }
-        }
-    }
-
-    @DisplayName("K2 Kapt can be enabled via Gradle property kapt.use.k2")
-    @GradleTest
-    open fun useK2KaptProperty(gradleVersion: GradleVersion) {
-        project("simple".withPrefix, gradleVersion) {
-            buildGradle.appendText(
-                """
-                |tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
-                |    compilerOptions {
-                |        freeCompilerArgs.addAll([
-                |            "-Xuse-fir-ic",
-                |            "-Xuse-fir-lt"
-                |        ])
-                |    }
-                |    kotlinOptions {
-                |        languageVersion = "2.0"
-                |    }
-                |}
-                |
-                |compileKotlin.kotlinOptions.allWarningsAsErrors = false
-                """.trimMargin()
-            )
-            build("-Pkapt.use.k2=true", "build") {
-                assertKaptSuccessful()
-                assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
-                assertOutputDoesNotContain("Falling back to 1.9.")
-                assertOutputContains("K2 kapt is an experimental feature. Use with caution.")
-            }
-            build("-Pkapt.use.k2=true", "cleanCompileKotlin", "compileKotlin") {
-                assertTasksExecuted(":compileKotlin")
-                // The warning should not be displayed for the compile task.
-                assertOutputDoesNotContain("K2 kapt is an experimental feature. Use with caution.")
-            }
-        }
-    }
-
     @DisplayName("Kapt-generated Kotlin sources can be used in Kotlin")
     @GradleTest
     open fun useGeneratedKotlinSource(gradleVersion: GradleVersion) {
@@ -1362,35 +1261,6 @@
         }
     }
 
-    @DisplayName("Kapt-generated Kotlin sources can be used in Kotlin with languageVersion = 2.0")
-    @GradleTest
-    open fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {
-        project("useGeneratedKotlinSource".withPrefix, gradleVersion) {
-            buildGradle.appendText(
-                """
-                |tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
-                |    compilerOptions {
-                |        freeCompilerArgs.addAll([
-                |            "-Xuse-fir-ic",
-                |            "-Xuse-fir-lt"
-                |        ])
-                |    }
-                |    kotlinOptions {
-                |      languageVersion = "2.0"
-                |    }
-                |}
-                |
-                |compileKotlin.kotlinOptions.allWarningsAsErrors = false
-                """.trimMargin()
-            )
-            build("build") {
-                assertKaptSuccessful()
-                assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
-                assertOutputContains("Falling back to 1.9.")
-            }
-        }
-    }
-
     @DisplayName("KT-58745: compiler plugin options should be passed to KaptGenerateStubs task")
     @GradleTest
     fun kaptGenerateStubsConfiguredWithCompilerPluginOptions(gradleVersion: GradleVersion) {
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4AndGradleDaemon.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4AndGradleDaemon.kt
new file mode 100644
index 0000000..647cc10
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4AndGradleDaemon.kt
@@ -0,0 +1,21 @@
+/*
+ * 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.gradle
+
+import org.gradle.util.GradleVersion
+import org.jetbrains.kotlin.gradle.testbase.BuildOptions
+import org.jetbrains.kotlin.gradle.testbase.DaemonsGradlePluginTests
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.DisplayName
+
+@DisplayName("Kapt4 caching inside Gradle daemon")
+@DaemonsGradlePluginTests
+class Kapt4AndGradleDaemon : Kapt3AndGradleDaemon() {
+    override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions.copyEnsuringK2()
+
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
+    override fun testAnnotationProcessorClassIsLoadedOnce(gradleVersion: GradleVersion) {}
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4IT.kt
index 3b72c1d..9e854f2 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4IT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt4IT.kt
@@ -10,29 +10,24 @@
 import org.junit.jupiter.api.Disabled
 import org.junit.jupiter.api.DisplayName
 import kotlin.io.path.appendText
-import kotlin.io.path.name
-import kotlin.io.path.walk
+
 
 @DisplayName("Kapt 4 base checks")
 class Kapt4IT : Kapt3IT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
 
-    override fun TestProject.customizeProject() {
-        forceKapt4()
+    @DisplayName("Kapt doesn't run in fallback mode with languageVersion = 2.0")
+    @GradleTest
+    fun noFallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {
+        project("simple".withPrefix, gradleVersion) {
+            build("build") {
+                assertKaptSuccessful()
+                assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin")
+                assertOutputDoesNotContain("Falling back to 1.9.")
+            }
+        }
     }
 
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {}
-
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun fallBackModeWithUseK2(gradleVersion: GradleVersion) {}
-
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun fallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {}
-
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun useK2KaptProperty(gradleVersion: GradleVersion) {}
-
     @DisplayName("KT-61879: K2 KAPT works with proguarded compiler jars and enum class")
     @GradleTest
     fun testEnumClass(gradleVersion: GradleVersion) {
@@ -50,57 +45,15 @@
 class Kapt4ClassLoadersCacheIT : Kapt3ClassLoadersCacheIT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
 
-    override fun TestProject.customizeProject() {
-        forceKapt4()
-    }
-
     @Disabled("Enable when KT-61845 is fixed")
     override fun testKt18799(gradleVersion: GradleVersion) {}
 
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) {}
-
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun fallBackModeWithUseK2(gradleVersion: GradleVersion) {}
-
-    @Disabled("Doesn't make sense in Kapt 4")
-    override fun fallBackModeWithLanguageVersion2_0(gradleVersion: GradleVersion) {}
-
-    @Disabled("Doesn't work in 2.0. Neither with Kapt 3 nor with Kapt 4")
-    override fun testMPPKaptPresence(gradleVersion: GradleVersion) {}
-
-    @Disabled("Incremental compilation doesn't work in 2.0")
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
     override fun testSimpleWithIC(gradleVersion: GradleVersion) {}
 
-    @Disabled("Incremental compilation doesn't work in 2.0")
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
     override fun testSimpleWithIC_withClasspathSnapshot(gradleVersion: GradleVersion) {}
-}
 
-fun TestProject.forceKapt4() {
-    projectPath.walk().forEach {
-        when (it.fileName.name) {
-            "build.gradle" -> it.appendText(
-                """
-                
-                pluginManager.withPlugin('kotlin') {
-                    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
-                       compilerOptions.freeCompilerArgs.addAll(['-Xuse-kapt4', '-Xsuppress-version-warnings'])
-                    }
-                }
-                
-                """.trimIndent()
-            )
-            "build.gradle.kts" -> it.appendText(
-                """
-                
-                pluginManager.withPlugin("kotlin") {
-                    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile::class.java).configureEach {
-                       compilerOptions.freeCompilerArgs.addAll(listOf("-Xuse-kapt4", "-Xsuppress-version-warnings"))
-                    }
-                }
-                
-                """.trimIndent()
-            )
-        }
-    }
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
+    override fun testChangeClasspathICRebuild(gradleVersion: GradleVersion) {}
 }
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt
index 901b9ae..d9027bf 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalIT.kt
@@ -3,6 +3,7 @@
 import org.gradle.api.logging.LogLevel
 import org.gradle.testkit.runner.BuildResult
 import org.gradle.util.GradleVersion
+import  org.jetbrains.kotlin.gradle.dsl.KotlinVersion
 import org.jetbrains.kotlin.gradle.testbase.*
 import org.junit.jupiter.api.DisplayName
 import java.io.File
@@ -29,7 +30,7 @@
     override val defaultBuildOptions = super.defaultBuildOptions.copy(
         incremental = true,
         kaptOptions = BuildOptions.KaptOptions(incrementalKapt = true)
-    )
+    ).copyEnsuringK1()
 
     protected open fun KGPBaseTest.kaptProject(
         gradleVersion: GradleVersion,
@@ -186,8 +187,10 @@
             build("assemble") {
                 assertKapt3FullyExecuted()
 
-                assertFileInProjectExists("$kapt3IncDataPath/bar/B.class")
-                assertFileInProjectExists("$kapt3IncDataPath/bar/UseBKt.class")
+                if (isIncrementalStubGenerationSupported) {
+                    assertFileInProjectExists("$kapt3IncDataPath/bar/B.class")
+                    assertFileInProjectExists("$kapt3IncDataPath/bar/UseBKt.class")
+                }
                 assertFileInProjectExists("$kapt3StubsPath/bar/B.java")
                 assertFileInProjectExists("$kapt3StubsPath/bar/B.kapt_metadata")
                 assertFileInProjectExists("$kapt3StubsPath/bar/UseBKt.java")
@@ -282,11 +285,13 @@
                 assertKapt3FullyExecuted()
 
                 val useBKt = javaSourcesDir().resolve("bar/useB.kt")
-                assertCompiledKotlinSources(
-                    listOf(projectPath.relativize(bKt), projectPath.relativize(useBKt)),
-                    getOutputForTask(":kaptGenerateStubsKotlin"),
-                    errorMessageSuffix = " in task 'kaptGenerateStubsKotlin'"
-                )
+                if (isIncrementalStubGenerationSupported) {
+                    assertCompiledKotlinSources(
+                        listOf(projectPath.relativize(bKt), projectPath.relativize(useBKt)),
+                        getOutputForTask(":kaptGenerateStubsKotlin"),
+                        errorMessageSuffix = " in task 'kaptGenerateStubsKotlin'"
+                    )
+                }
 
                 // java removal is detected
                 assertCompiledKotlinSources(
@@ -343,17 +348,20 @@
         buildResult: BuildResult,
         sources: List<Path>
     ) {
-        assertCompiledKotlinSources(
-            sources,
-            buildResult.getOutputForTask(":kaptGenerateStubsKotlin"),
-            errorMessageSuffix = " in task 'kaptGenerateStubsKotlin"
-        )
+        if (isIncrementalStubGenerationSupported) {
+            assertCompiledKotlinSources(
+                sources,
+                buildResult.getOutputForTask(":kaptGenerateStubsKotlin"),
+                errorMessageSuffix = " in task 'kaptGenerateStubsKotlin"
+            )
 
-        assertCompiledKotlinSources(
-            sources,
-            buildResult.getOutputForTask(":compileKotlin"),
-            errorMessageSuffix = " in task 'compileKotlin'"
-        )
+
+            assertCompiledKotlinSources(
+                sources,
+                buildResult.getOutputForTask(":compileKotlin"),
+                errorMessageSuffix = " in task 'compileKotlin'"
+            )
+        }
     }
 
     private fun BuildResult.assertKapt3FullyExecuted() {
@@ -390,7 +398,17 @@
     val TestProject.kaptGeneratedToPath get() = projectPath.resolve("build/generated/source/kapt")
 }
 
+@DisplayName("K2 Kapt incremental compilation")
+@OtherGradlePluginTests
+class K2KaptIncrementalIT: KaptIncrementalIT() {
+    override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
+}
+
 @DisplayName("Kapt incremental compilation with disabled precise compilation outputs backup")
 class KaptIncrementalWithoutPreciseBackupIT : KaptIncrementalIT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
-}
\ No newline at end of file
+}
+
+// KT-63102 Incremental compilation doesn't work in 2.0
+val TestProject.isIncrementalStubGenerationSupported: Boolean
+    get() = buildOptions.languageVersion?.startsWith("1") ?: (KotlinVersion.DEFAULT < KotlinVersion.KOTLIN_2_0)
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt
index 08c3e4c..729ce71 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt
@@ -20,7 +20,7 @@
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
 
-@DisplayName("Kapt incremental tests with aggregating apt")
+@DisplayName("K1 Kapt incremental tests with aggregating apt")
 open class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() {
 
     override val defaultBuildOptions = super.defaultBuildOptions.copy(
@@ -390,8 +390,16 @@
     }
 }
 
+@DisplayName("K2 Kapt incremental tests with aggregating apt")
+class K2KaptIncrementalWithAggregatingApt: KaptIncrementalWithAggregatingApt() {
+    override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
+}
 
-@DisplayName("Kapt incremental tests with aggregating apt with disabled precise compilation outputs backup")
-class KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup : KaptIncrementalWithAggregatingApt() {
+@DisplayName("K1 Kapt incremental tests with aggregating apt with disabled precise compilation outputs backup")
+open class KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup : KaptIncrementalWithAggregatingApt() {
     override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
+}
+
+class K2KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup: KaptIncrementalWithAggregatingAptAndWithoutPreciseBackup() {
+    override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
 }
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt
index 5adb3c8..2a89ea5 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt
@@ -12,6 +12,7 @@
 import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessor
 import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessorReferencingClasspath
 import org.jetbrains.kotlin.gradle.testbase.*
+import org.junit.jupiter.api.Disabled
 import org.junit.jupiter.api.DisplayName
 import org.junit.jupiter.api.condition.DisabledOnOs
 import org.junit.jupiter.api.condition.OS
@@ -23,7 +24,7 @@
 import kotlin.io.path.*
 import kotlin.test.assertEquals
 
-@DisplayName("Kapt incremental tests with isolating apt")
+@DisplayName("K1 Kapt incremental tests with isolating apt")
 open class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() {
 
     override val defaultBuildOptions = super.defaultBuildOptions.copy(
@@ -33,7 +34,7 @@
             incrementalKapt = true,
             includeCompileClasspath = false
         )
-    )
+    ).copyEnsuringK1()
 
     override fun KGPBaseTest.kaptProject(
         gradleVersion: GradleVersion,
@@ -318,14 +319,16 @@
                 }
 
             build(":mylibrary:assembleDebug") {
-                assertEquals(
-                    listOf(
-                        "baseLibrary/build/tmp/kapt3/stubs/debug/error/NonExistentClass.java",
-                        "mylibrary/src/main/java/com/example/lib/ExampleParcel.java",
-                        "baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java",
-                    ).map { projectPath.resolve(it).toRealPath().toString() }.toSet(),
-                    getProcessedSources(output)
-                )
+                if (isIncrementalStubGenerationSupported) {
+                    assertEquals(
+                        listOf(
+                            "baseLibrary/build/tmp/kapt3/stubs/debug/error/NonExistentClass.java",
+                            "mylibrary/src/main/java/com/example/lib/ExampleParcel.java",
+                            "baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java",
+                        ).map { projectPath.resolve(it).toRealPath().toString() }.toSet(),
+                        getProcessedSources(output)
+                    )
+                }
             }
         }
     }
@@ -437,11 +440,21 @@
     }
 }
 
-@DisplayName("Kapt incremental tests with isolating apt with disabled precise compilation outputs backup")
-class KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingApt() {
+@DisplayName("K2 Kapt incremental tests with isolating apt")
+class K2KaptIncrementalWithIsolatingApt : KaptIncrementalWithIsolatingApt() {
+    override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
+}
+
+@DisplayName("K1 Kapt incremental tests with isolating apt with disabled precise compilation outputs backup")
+open class KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingApt() {
     override val defaultBuildOptions = super.defaultBuildOptions.copy(usePreciseOutputsBackup = false, keepIncrementalCompilationCachesInMemory = false)
 }
 
+@DisplayName("K2 Kapt incremental tests with isolating apt with disabled precise compilation outputs backup")
+class K2KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup : KaptIncrementalWithIsolatingAptAndWithoutPreciseBackup() {
+    override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
+}
+
 private const val patternApt = "Processing java sources with annotation processors:"
 fun getProcessedSources(output: String): Set<String> {
     return output.lines().filter { it.contains(patternApt) }.flatMapTo(HashSet()) { logging ->
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt
index c61dc2b..152236e 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt
@@ -135,7 +135,7 @@
 
     @DisplayName("kapt works with databinding")
     @GradleAndroidTest
-    fun testDatabinding(
+    open fun testDatabinding(
         gradleVersion: GradleVersion,
         agpVersion: String,
         jdkVersion: JdkVersions.ProvidedJdk,
@@ -213,7 +213,7 @@
 
     @DisplayName("KT-61622: common sources are attached in MPP + Android project")
     @GradleAndroidTest
-    fun testMppAndroidKapt(
+    open fun testMppAndroidKapt(
         gradleVersion: GradleVersion,
         agpVersion: String,
         jdkVersion: JdkVersions.ProvidedJdk,
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidIncrementalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidIncrementalIT.kt
index e15d429..4c57db9 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidIncrementalIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidIncrementalIT.kt
@@ -78,7 +78,7 @@
 
     @DisplayName("incremental compilation works with dagger")
     @GradleAndroidTest
-    fun testAndroidDaggerIC(
+    open fun testAndroidDaggerIC(
         gradleVersion: GradleVersion,
         agpVersion: String,
         jdkVersion: JdkVersions.ProvidedJdk,
@@ -160,7 +160,7 @@
 
     @DisplayName("inter-project IC works with kapt")
     @GradleAndroidTest
-    fun testInterProjectIC(
+    open fun testInterProjectIC(
         gradleVersion: GradleVersion,
         agpVersion: String,
         jdkVersion: JdkVersions.ProvidedJdk,
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidExternalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidExternalIT.kt
index 1112473..5b761ab 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidExternalIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidExternalIT.kt
@@ -5,16 +5,19 @@
 
 package org.jetbrains.kotlin.gradle.android
 
-import org.jetbrains.kotlin.config.LanguageVersion
-import org.jetbrains.kotlin.gradle.forceKapt4
-import org.jetbrains.kotlin.gradle.testbase.TestProject
+import org.gradle.util.GradleVersion
+import org.jetbrains.kotlin.gradle.testbase.JdkVersions
+import org.junit.jupiter.api.Disabled
 import org.junit.jupiter.api.DisplayName
 
 @DisplayName("android with kapt4 external dependencies tests")
 class Kapt4AndroidExternalIT : Kapt3AndroidExternalIT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
 
-    override fun TestProject.customizeProject() {
-        forceKapt4()
-    }
+    @Disabled("KT-62345")
+    override fun testMppAndroidKapt(
+        gradleVersion: GradleVersion,
+        agpVersion: String,
+        jdkVersion: JdkVersions.ProvidedJdk,
+    ) {}
 }
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIT.kt
index 3b8f592..520bf24 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIT.kt
@@ -5,15 +5,9 @@
 
 package org.jetbrains.kotlin.gradle.android
 
-import org.jetbrains.kotlin.gradle.forceKapt4
-import org.jetbrains.kotlin.gradle.testbase.TestProject
 import org.junit.jupiter.api.DisplayName
 
 @DisplayName("android with kapt4 tests")
 class Kapt4AndroidIT : Kapt3AndroidIT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
-
-    override fun TestProject.customizeProject() {
-        forceKapt4()
-    }
 }
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIncrementalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIncrementalIT.kt
index 07275bf..79a4696 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIncrementalIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt4AndroidIncrementalIT.kt
@@ -5,16 +5,21 @@
 
 package org.jetbrains.kotlin.gradle.android
 
-import org.jetbrains.kotlin.gradle.forceKapt4
-import org.jetbrains.kotlin.gradle.testbase.TestProject
+import org.gradle.util.GradleVersion
+import org.jetbrains.kotlin.gradle.testbase.JdkVersions
+import org.junit.jupiter.api.Disabled
 import org.junit.jupiter.api.DisplayName
 
 @DisplayName("android with kapt4 incremental build tests")
 class Kapt4AndroidIncrementalIT : Kapt3AndroidIncrementalIT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
 
-    override fun TestProject.customizeProject() {
-        forceKapt4()
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
+    override fun testAndroidDaggerIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
+    }
+
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
+    override fun testInterProjectIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
     }
 }
 
@@ -22,7 +27,11 @@
 class Kapt4AndroidIncrementalWithoutPreciseBackupIT : Kapt3AndroidIncrementalWithoutPreciseBackupIT() {
     override val defaultBuildOptions = super.defaultBuildOptions.copyEnsuringK2()
 
-    override fun TestProject.customizeProject() {
-        forceKapt4()
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
+    override fun testAndroidDaggerIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
+    }
+
+    @Disabled("KT-63102 Incremental compilation doesn't work in 2.0")
+    override fun testInterProjectIC(gradleVersion: GradleVersion, agpVersion: String, jdkVersion: JdkVersions.ProvidedJdk) {
     }
 }
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt
index a2ffedf..b5612c8 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt
@@ -14,7 +14,7 @@
 import kotlin.io.path.writeText
 
 @DisplayName("JVM API validation")
-class KotlinJvmApiTest : KGPBaseTest() {
+open class KotlinJvmApiTest : KGPBaseTest() {
     @DisplayName("Kotlin compilation can be set up using APIs")
     @JvmGradlePluginTests
     @GradleTest
@@ -51,11 +51,7 @@
                         """.trimIndent()
             }
 
-            val expectedOutput = projectPath.resolve("build/fooOutput/Foo.class")
-
-            build("foo") {
-                assertFileExists(expectedOutput)
-            }
+            build("foo")
         }
     }
 
@@ -147,7 +143,6 @@
                         """.trimIndent()
             }
 
-            val expectedOutputClass = projectPath.resolve("build/fooOutput/Foo.class")
             val expectedOutputStubs = listOf(
                 projectPath.resolve("build/fooOutputStubs/Foo.java"),
                 projectPath.resolve("build/fooOutputStubs/Foo.kapt_metadata"),
@@ -155,7 +150,6 @@
             )
 
             build("foo") {
-                assertFileExists(expectedOutputClass)
                 expectedOutputStubs.forEach { assertFileExists(it) }
             }
         }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt
index c55e053..66ac7bb 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt
@@ -25,7 +25,6 @@
 import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isInfoAsWarnings
 import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isKaptKeepKdocCommentsInStubs
 import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isKaptVerbose
-import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isUseK2
 import org.jetbrains.kotlin.gradle.model.builder.KaptModelBuilder
 import org.jetbrains.kotlin.gradle.plugin.*
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
@@ -123,10 +122,6 @@
             return getBooleanOptionValue(BooleanOption.KAPT_KEEP_KDOC_COMMENTS_IN_STUBS)
         }
 
-        fun Project.isUseK2(): Boolean {
-            return getBooleanOptionValue(BooleanOption.KAPT_USE_K2)
-        }
-
         fun Project.classLoadersCacheSize(): Int = findPropertySafe(CLASSLOADERS_CACHE_SIZE)?.toString()?.toInt() ?: 0
 
         fun Project.disableClassloaderCacheForProcessors(): Set<String> {
@@ -218,7 +213,6 @@
             KAPT_INFO_AS_WARNINGS("kapt.info.as.warnings", false),
             KAPT_INCLUDE_COMPILE_CLASSPATH("kapt.include.compile.classpath", true),
             KAPT_KEEP_KDOC_COMMENTS_IN_STUBS("kapt.keep.kdoc.comments.in.stubs", true),
-            KAPT_USE_K2("kapt.use.k2", false),
         }
     }
 
@@ -538,7 +532,6 @@
     pluginOptions += SubpluginOption("keepKdocCommentsInStubs", "${project.isKaptKeepKdocCommentsInStubs()}")
     pluginOptions += SubpluginOption("showProcessorTimings", "${kaptExtension.showProcessorStats}")
     pluginOptions += SubpluginOption("detectMemoryLeaks", kaptExtension.detectMemoryLeaks)
-    pluginOptions += SubpluginOption("useK2", "${project.isUseK2()}")
     pluginOptions += SubpluginOption("infoAsWarnings", "${project.isInfoAsWarnings()}")
     pluginOptions += FilesSubpluginOption("stubs", kaptStubsDir)
 
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt
index 92c4ca9..9cb528d 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt
@@ -29,6 +29,7 @@
 import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
 import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsDefault
 import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper
+import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
 import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext
 import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.create
 import org.jetbrains.kotlin.gradle.report.BuildReportMode
@@ -66,9 +67,6 @@
     @get:Input
     abstract val verbose: Property<Boolean>
 
-    @get:Input
-    abstract val useK2Kapt: Property<Boolean>
-
     /**
      * Changes in this additional sources will trigger stubs regeneration,
      * but the sources themselves will not be used to find kapt annotations and generate stubs.
@@ -129,10 +127,6 @@
 
             args.verbose = verbose.get()
             args.destinationAsFile = destinationDirectory.get().asFile
-
-            if (useK2Kapt.get()) {
-                args.freeArgs += "-Xuse-kapt4"
-            }
         }
 
         pluginClasspath { args ->
@@ -154,5 +148,5 @@
     }
 
     override fun isIncrementalCompilationEnabled(): Boolean =
-        super.isIncrementalCompilationEnabled() && !useK2Kapt.get() && ("-Xuse-kapt4" !in compilerOptions.freeCompilerArgs.get())
+        super.isIncrementalCompilationEnabled() && compilerOptions.languageVersion.getOrElse(KotlinVersion.DEFAULT) < KotlinVersion.KOTLIN_2_0
 }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt
index 3571ec8..e525891 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt
@@ -16,7 +16,6 @@
 import org.jetbrains.kotlin.gradle.internal.*
 import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.KAPT_SUBPLUGIN_ID
 import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isIncludeCompileClasspath
-import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isUseK2
 import org.jetbrains.kotlin.gradle.plugin.KaptExtension
 import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
 import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
@@ -50,7 +49,6 @@
         configureTask { task ->
             task.verbose.set(KaptTask.queryKaptVerboseProperty(project))
             task.pluginOptions.add(buildOptions(kaptExtension, task))
-            task.useK2Kapt.value(project.isUseK2()).finalizeValueOnRead()
 
             if (!isIncludeCompileClasspath(kaptExtension)) {
                 task.onlyIf {
diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-dagger-maven-example/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-dagger-maven-example/pom.xml
index e74ba70..da6e746 100644
--- a/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-dagger-maven-example/pom.xml
+++ b/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-dagger-maven-example/pom.xml
@@ -11,7 +11,7 @@
 
     <properties>
         <junit.version>4.13.1</junit.version>
-        <dagger.version>2.9</dagger.version>
+        <dagger.version>2.50</dagger.version>
         <main.class>coffee.CoffeeApp</main.class>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-enable-extensions-kapt-allopen/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-enable-extensions-kapt-allopen/pom.xml
index b3571e5..96ae273 100644
--- a/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-enable-extensions-kapt-allopen/pom.xml
+++ b/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-enable-extensions-kapt-allopen/pom.xml
@@ -11,7 +11,7 @@
 
     <properties>
         <junit.version>4.13.1</junit.version>
-        <dagger.version>2.9</dagger.version>
+        <dagger.version>2.50</dagger.version>
         <main.class>coffee.CoffeeApp</main.class>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-kapt-allopen/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-kapt-allopen/pom.xml
index 21fb411..1b5ec06 100644
--- a/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-kapt-allopen/pom.xml
+++ b/libraries/tools/kotlin-maven-plugin-test/src/it/java8/test-kapt-allopen/pom.xml
@@ -11,7 +11,7 @@
 
     <properties>
         <junit.version>4.13.1</junit.version>
-        <dagger.version>2.9</dagger.version>
+        <dagger.version>2.50</dagger.version>
         <main.class>coffee.CoffeeApp</main.class>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
diff --git a/plugins/kapt3/kapt3-cli/src/KaptCli.kt b/plugins/kapt3/kapt3-cli/src/KaptCli.kt
index 8c8475d..8c909fc 100644
--- a/plugins/kapt3/kapt3-cli/src/KaptCli.kt
+++ b/plugins/kapt3/kapt3-cli/src/KaptCli.kt
@@ -107,7 +107,6 @@
             }
             KaptCliOption.APT_MODE_OPTION -> aptModePassed = true
             KaptCliOption.VERBOSE_MODE_OPTION -> kaptVerboseModePassed = true
-            KaptCliOption.USE_K2 -> transformed.add("-Xuse-kapt4")
             else -> {}
         }
 
@@ -115,7 +114,7 @@
     }
 
     if (!aptModePassed) {
-        val isK2 = "-Xuse-kapt4" in transformed && ("-Xuse-k2" in transformed ||
+        val isK2 = ("-Xuse-k2" in transformed ||
                 transformed.any { it.startsWith("-language-version=2") } ||
                 transformed.lastIndexOf("-language-version").takeIf { it >= 0 }
                     ?.let { transformed.getOrNull(it + 1)?.startsWith('2') } == true)
diff --git a/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt b/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt
index f244f5e..86f757a 100644
--- a/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt
+++ b/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt
@@ -214,13 +214,6 @@
         "Keep KDoc comments in stubs"
     ),
 
-    USE_K2(
-        "useK2",
-        "true | false",
-        "Use K2",
-        cliToolOption = CliToolOption("-Kapt-use-k2", FLAG)
-    ),
-
     DETECT_MEMORY_LEAKS_OPTION("detectMemoryLeaks", "true | false", "Detect memory leaks in annotation processors"),
     INCLUDE_COMPILE_CLASSPATH(
         "includeCompileClasspath",
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/argfile/kaptArgs.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/argfile/kaptArgs.txt
index 5f6166c..da9f468 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/argfile/kaptArgs.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/argfile/kaptArgs.txt
@@ -1,5 +1,4 @@
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/compileModeUnsupported/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/compileModeUnsupported/build.txt
index 8d6c0d7..91ff20d 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/compileModeUnsupported/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/compileModeUnsupported/build.txt
@@ -1,7 +1,6 @@
 # kapt
 -language-version 2.0
 -Xsuppress-version-warnings
--Xuse-kapt4
 -Kapt-mode=compile
 ../simple/Test.kt
 
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/correctErrorTypesOn/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/correctErrorTypesOn/build.txt
index 97db889..d94a9c8 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/correctErrorTypesOn/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/correctErrorTypesOn/build.txt
@@ -12,7 +12,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/defaultPackage/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/defaultPackage/build.txt
index cad0d62..40eac7b 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/defaultPackage/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/defaultPackage/build.txt
@@ -17,7 +17,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kaptUseK2Flag/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kaptUseK2Flag/build.txt
index 14d960b..91ff20d 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kaptUseK2Flag/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kaptUseK2Flag/build.txt
@@ -1,7 +1,6 @@
 # kapt
 -language-version 2.0
 -Xsuppress-version-warnings
--Kapt-use-k2=true
 -Kapt-mode=compile
 ../simple/Test.kt
 
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGeneration/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGeneration/build.txt
index 8daf772..f9cff86 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGeneration/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGeneration/build.txt
@@ -17,7 +17,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGenerationDefaultOutput/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGenerationDefaultOutput/build.txt
index aecd364..ee68005 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGenerationDefaultOutput/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kotlinFileGenerationDefaultOutput/build.txt
@@ -20,7 +20,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
@@ -34,7 +33,6 @@
 
 # kotlinc
 -language-version 2.0
--Xuse-kapt4
 -d output/classes
 -cp output/classes:output/ap:%KOTLIN_STDLIB%
 Test.kt
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kt33800/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kt33800/build.txt
index 4ac429b..f3c16ef 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kt33800/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/kt33800/build.txt
@@ -21,7 +21,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/multipass/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/multipass/build.txt
index 7796317..62ce2f8 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/multipass/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/multipass/build.txt
@@ -13,7 +13,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/separateStubAptCompilation/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/separateStubAptCompilation/build.txt
index 300ddcb..669e438 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/separateStubAptCompilation/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/separateStubAptCompilation/build.txt
@@ -21,7 +21,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
@@ -33,7 +32,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/simple/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/simple/build.txt
index f6de1d6..05ad916 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/simple/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/simple/build.txt
@@ -17,7 +17,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-mode=stubsAndApt
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
diff --git a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/withoutService/build.txt b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/withoutService/build.txt
index e307618..d6a9562 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration-kapt4/withoutService/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration-kapt4/withoutService/build.txt
@@ -21,7 +21,6 @@
 
 # kapt
 -language-version 2.0
--Xuse-kapt4
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt b/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt
index 0587b56..11fd970 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt
@@ -1,3 +1,4 @@
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
\ No newline at end of file
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt b/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt
index 68cf0ee..85b3d5c 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt
@@ -1,3 +1,4 @@
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt
index 3a9c302..7cd08eb 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt
@@ -14,11 +14,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
@@ -41,7 +43,6 @@
 # after
 Return code: 1
 
-warning: kapt currently doesn't support language version 2.0+. Falling back to 1.9.
 error: error: NonExistentClass type occurred
 Test.kt:4:8: error: unresolved reference: generated
 import generated.Property
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt
index 5cc53e3..606837e 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt
@@ -6,11 +6,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/defaultPackage/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/defaultPackage/build.txt
index 08ef3b7..4a11108 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/defaultPackage/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/defaultPackage/build.txt
@@ -10,11 +10,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/fallback/Test.kt b/plugins/kapt3/kapt3-cli/testData/integration/fallback/Test.kt
deleted file mode 100644
index a23c670..0000000
--- a/plugins/kapt3/kapt3-cli/testData/integration/fallback/Test.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package test
-
-import apt.Anno
-import generated.Test as TestGenerated
-
-@Anno
-class Test {
-    @field:Anno
-    val property: String = ""
-
-    @Anno
-    fun function() {
-
-    }
-}
-
-fun main() {
-    println("Generated class: " + TestGenerated::class.java.name)
-}
\ No newline at end of file
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/fallback/ap/META-INF/services/javax.annotation.processing.Processor b/plugins/kapt3/kapt3-cli/testData/integration/fallback/ap/META-INF/services/javax.annotation.processing.Processor
deleted file mode 100644
index 078558e..0000000
--- a/plugins/kapt3/kapt3-cli/testData/integration/fallback/ap/META-INF/services/javax.annotation.processing.Processor
+++ /dev/null
@@ -1 +0,0 @@
-apt.SampleApt
\ No newline at end of file
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/fallback/ap/Processor.kt b/plugins/kapt3/kapt3-cli/testData/integration/fallback/ap/Processor.kt
deleted file mode 100644
index 22afdb9..0000000
--- a/plugins/kapt3/kapt3-cli/testData/integration/fallback/ap/Processor.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package apt
-
-import javax.annotation.processing.*
-import javax.lang.model.SourceVersion
-import javax.lang.model.element.TypeElement
-import javax.tools.Diagnostic.Kind.*
-import javax.tools.StandardLocation
-
-annotation class Anno
-
-class SampleApt : AbstractProcessor() {
-    override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
-        val writeKotlinFiles = processingEnv.options["kapt.test.writeKotlinFiles"] == "true"
-
-        for (element in roundEnv.getElementsAnnotatedWith(Anno::class.java)) {
-            val generatedSimpleName = element.simpleName.toString().capitalize()
-
-            val file = when (writeKotlinFiles) {
-                true -> processingEnv.filer.createResource(StandardLocation.SOURCE_OUTPUT, "generated", "$generatedSimpleName.kt")
-                false -> processingEnv.filer.createSourceFile("generated.$generatedSimpleName")
-            }
-
-            file.openWriter().use {
-                it.write("package generated;\npublic class $generatedSimpleName {}")
-            }
-        }
-
-        return true
-    }
-
-    override fun getSupportedOptions() = setOf("kapt.test.writeKotlinFiles")
-    override fun getSupportedSourceVersion() = SourceVersion.RELEASE_8
-    override fun getSupportedAnnotationTypes() = setOf("apt.Anno")
-}
\ No newline at end of file
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/fallback/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/fallback/build.txt
deleted file mode 100644
index a510c56..0000000
--- a/plugins/kapt3/kapt3-cli/testData/integration/fallback/build.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-# mkdir
-output/stubs
-output/classes
-output/javaClasses
-output/sources
-output/stubsAlt
-output/classesAlt
-output/javaClassesAlt
-output/sourcesAlt
-
-# kotlinc
--language-version 2.0
--cp %KOTLIN_STDLIB%
--d output/ap.jar
-ap/Processor.kt
-
-# copy
-ap/META-INF/services/javax.annotation.processing.Processor
-output/ap/META-INF/services/javax.annotation.processing.Processor
-
-# kapt
--Xuse-k2
--Kapt-stubs=output/stubs
--Kapt-classes=output/classes
--Kapt-sources=output/sources
--Kapt-classpath=output/ap
--d output/classes
--cp output/ap.jar:%KOTLIN_STDLIB%
-Test.kt
-
-# javac
--cp output/ap.jar
--d output/javaClasses
--proc:none
-output/sources/generated/Function.java
-output/sources/generated/Property.java
-output/sources/generated/Test.java
-
-# kapt
--language-version 2.0
--Kapt-stubs=output/stubsAlt
--Kapt-classes=output/classesAlt
--Kapt-sources=output/sourcesAlt
--Kapt-classpath=output/ap
--d output/classesAlt
--cp output/ap.jar:%KOTLIN_STDLIB%
-Test.kt
-
-# output
-warning: kapt currently doesn't support language version 2.0+. Falling back to 1.9.
-
-# java
--cp output/classes:output/javaClasses:output/ap.jar:%KOTLIN_STDLIB%
-test.TestKt
-
-# javac
--cp output/ap.jar
--d output/javaClassesAlt
--proc:none
-output/sourcesAlt/generated/Function.java
-output/sourcesAlt/generated/Property.java
-output/sourcesAlt/generated/Test.java
-
-# java
--cp output/classes:output/javaClassesAlt:output/ap.jar:%KOTLIN_STDLIB%
-test.TestKt
-
-# after
-Generated class: generated.Test
\ No newline at end of file
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGeneration/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGeneration/build.txt
index d552d57..f343d48 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGeneration/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGeneration/build.txt
@@ -6,6 +6,7 @@
 output/kotlin-sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
@@ -15,6 +16,7 @@
 output/ap/META-INF/services/javax.annotation.processing.Processor
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationCorrectErrorTypes/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationCorrectErrorTypes/build.txt
index 3feb71f..f3aecd6 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationCorrectErrorTypes/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationCorrectErrorTypes/build.txt
@@ -10,6 +10,7 @@
 output/kotlin-sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
@@ -19,6 +20,7 @@
 output/ap/META-INF/services/javax.annotation.processing.Processor
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationDefaultOutput/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationDefaultOutput/build.txt
index b555443..85fe46b 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationDefaultOutput/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGenerationDefaultOutput/build.txt
@@ -13,11 +13,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt
index fce839b..dda98f8 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/kt33800/build.txt
@@ -10,6 +10,7 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
@@ -19,6 +20,7 @@
 output/ap/META-INF/services/javax.annotation.processing.Processor
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/multipass/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/multipass/build.txt
index 9cb0559..335dfd2d 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/multipass/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/multipass/build.txt
@@ -6,11 +6,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/processors.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt
index 6abb00d..b988f65 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt
@@ -14,11 +14,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
@@ -29,6 +31,7 @@
 Test.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
@@ -40,6 +43,7 @@
 Test.kt
 
 # kotlinc
+-language-version 1.9
 -d output/classes
 -cp output/ap:%KOTLIN_STDLIB%
 output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt
index 6ec1cd7..0ef1f62 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt
@@ -6,6 +6,7 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
@@ -15,6 +16,7 @@
 output/ap/META-INF/services/javax.annotation.processing.Processor
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt
index 741b60e..fc1ea69 100644
--- a/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt
+++ b/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt
@@ -14,11 +14,13 @@
 output/sources
 
 # kotlinc
+-language-version 1.9
 -cp %KOTLIN_STDLIB%
 -d output/ap
 ap/Processor.kt
 
 # kapt
+-language-version 1.9
 -Kapt-stubs=output/stubs
 -Kapt-classes=output/classes
 -Kapt-sources=output/sources
diff --git a/plugins/kapt3/kapt3-cli/tests-gen/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java b/plugins/kapt3/kapt3-cli/tests-gen/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java
index b775721..9f92cee 100644
--- a/plugins/kapt3/kapt3-cli/tests-gen/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java
+++ b/plugins/kapt3/kapt3-cli/tests-gen/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java
@@ -49,12 +49,6 @@
     }
 
     @Test
-    @TestMetadata("fallback")
-    public void testFallback() throws Exception {
-        runTest("plugins/kapt3/kapt3-cli/testData/integration/fallback/");
-    }
-
-    @Test
     @TestMetadata("kotlinFileGeneration")
     public void testKotlinFileGeneration() throws Exception {
         runTest("plugins/kapt3/kapt3-cli/testData/integration/kotlinFileGeneration/");
diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt
index 712c184..8266c0c 100644
--- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt
+++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt
@@ -123,7 +123,6 @@
             STRICT_MODE_OPTION -> setFlag(KaptFlag.STRICT, value)
             STRIP_METADATA_OPTION -> setFlag(KaptFlag.STRIP_METADATA, value)
             KEEP_KDOC_COMMENTS_IN_STUBS -> setFlag(KaptFlag.KEEP_KDOC_COMMENTS_IN_STUBS, value)
-            USE_K2 -> {}
 
             SHOW_PROCESSOR_STATS -> setFlag(KaptFlag.SHOW_PROCESSOR_STATS, value)
             DUMP_PROCESSOR_STATS -> processorsStatsReportFile = File(value)
diff --git a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4AnalysisHandlerExtension.kt b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4AnalysisHandlerExtension.kt
index 2599992..e041de7 100644
--- a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4AnalysisHandlerExtension.kt
+++ b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4AnalysisHandlerExtension.kt
@@ -5,6 +5,7 @@
 
 package org.jetbrains.kotlin.kapt4
 
+import com.intellij.openapi.extensions.ExtensionPoint
 import com.intellij.openapi.util.Disposer
 import com.intellij.psi.PsiFile
 import com.intellij.psi.PsiJavaFile
@@ -12,6 +13,7 @@
 import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider
 import org.jetbrains.kotlin.analysis.api.standalone.KtAlwaysAccessibleLifetimeTokenProvider
 import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession
+import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
 import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
 import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
@@ -22,6 +24,7 @@
 import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
 import org.jetbrains.kotlin.config.*
 import org.jetbrains.kotlin.config.CommonConfigurationKeys.USE_FIR
+import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
 import org.jetbrains.kotlin.fir.extensions.FirAnalysisHandlerExtension
 import org.jetbrains.kotlin.kapt3.EfficientProcessorLoader
 import org.jetbrains.kotlin.kapt3.KAPT_OPTIONS
@@ -75,10 +78,23 @@
                     buildKtModuleProviderByCompilerConfiguration(updatedConfiguration)
 
                     registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider())
+                    registerProjectService(KtCompilerPluginsProvider::class.java, StandaloneCompilerPluginsProvider())
                 }
 
             val (module, files) = standaloneAnalysisAPISession.modulesWithFiles.entries.single()
 
+            val extensionStorage = CompilerPluginRegistrar.ExtensionStorage()
+            for (registrar in configuration.getList(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS)) {
+                with(registrar) { extensionStorage.registerExtensions(configuration) }
+            }
+            for ((extensionPoint, extensions) in extensionStorage.registeredExtensions) {
+                for (extension in extensions) {
+                    @Suppress("TestOnlyProblems")
+                    module.project.extensionArea.getExtensionPointIfRegistered<Any>(extensionPoint.extensionPointName.name)
+                        ?.registerExtension(extension, module.project)
+                }
+            }
+
             optionsBuilder.apply {
                 projectBaseDir = projectBaseDir ?: module.project.basePath?.let(::File)
                 val contentRoots = configuration[CLIConfigurationKeys.CONTENT_ROOTS] ?: emptyList()
diff --git a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/StandaloneCompilerPluginsProvider.kt b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/StandaloneCompilerPluginsProvider.kt
new file mode 100644
index 0000000..641e942
--- /dev/null
+++ b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/StandaloneCompilerPluginsProvider.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2010-2023 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.kapt4
+
+import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
+import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
+import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
+import org.jetbrains.kotlin.extensions.internal.InternalNonStableExtensionPoints
+import org.jetbrains.kotlin.resolve.extensions.AssignResolutionAltererExtension
+
+internal class StandaloneCompilerPluginsProvider : KtCompilerPluginsProvider() {
+    override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
+        return extensionType.getInstances(module.project)
+    }
+
+    @OptIn(InternalNonStableExtensionPoints::class)
+    override fun isPluginOfTypeRegistered(module: KtSourceModule, pluginType: CompilerPluginType): Boolean {
+        val extension = when (pluginType) {
+            CompilerPluginType.ASSIGNMENT -> AssignResolutionAltererExtension
+            else -> return false
+        }
+        return extension.getInstances(module.project).isNotEmpty()
+    }
+}
\ No newline at end of file