diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/commonizer/KotlinCommonizerModelResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/commonizer/KotlinCommonizerModelResolver.kt
new file mode 100644
index 00000000000..a74743df58c
--- /dev/null
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/commonizer/KotlinCommonizerModelResolver.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2020 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.idea.commonizer
+
+import org.jetbrains.kotlin.gradle.EnableCommonizerTask
+import org.jetbrains.plugins.gradle.model.ClassSetProjectImportModelProvider
+import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension
+
+class KotlinCommonizerModelResolver : AbstractProjectResolverExtension() {
+ override fun requiresTaskRunning() = true
+
+ override fun getProjectsLoadedModelProvider() = ClassSetProjectImportModelProvider(
+ setOf(EnableCommonizerTask::class.java)
+ )
+}
+
+
diff --git a/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService
index 492bb1188f8..de4ba481d83 100644
--- a/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService
+++ b/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService
@@ -1,6 +1,7 @@
org.jetbrains.kotlin.gradle.KotlinGradleModelBuilder
org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder
org.jetbrains.kotlin.gradle.KotlinCocoaPodsModelBuilder
+org.jetbrains.kotlin.gradle.KotlinCommonizerModelBuilder
org.jetbrains.kotlin.allopen.ide.AllOpenModelBuilderService
org.jetbrains.kotlin.kapt.idea.KaptModelBuilderService
org.jetbrains.kotlin.noarg.ide.NoArgModelBuilderService
diff --git a/idea/kotlin-gradle-tooling/src/KotlinCommonizerModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinCommonizerModelBuilder.kt
new file mode 100644
index 00000000000..a6ba146aae7
--- /dev/null
+++ b/idea/kotlin-gradle-tooling/src/KotlinCommonizerModelBuilder.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2010-2020 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.api.Project
+import org.gradle.api.logging.Logging
+import org.jetbrains.plugins.gradle.tooling.AbstractModelBuilderService
+import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder
+import org.jetbrains.plugins.gradle.tooling.ModelBuilderContext
+
+
+interface EnableCommonizerTask
+
+class KotlinCommonizerModelBuilder : AbstractModelBuilderService() {
+
+ companion object {
+ private const val COMMONIZER_TASK_NAME = "runCommonizer"
+ private const val COMMONIZER_SETUP_CLASS = "org.jetbrains.kotlin.gradle.targets.native.internal.KotlinNativePlatformDependenciesKt"
+ }
+
+ override fun canBuild(modelName: String?): Boolean {
+ return EnableCommonizerTask::class.java.name == modelName
+ }
+
+ override fun buildAll(modelName: String, project: Project, context: ModelBuilderContext): Any? {
+ val kotlinExt = project.extensions.findByName("kotlin") ?: return null
+
+ try {
+ val classLoader = kotlinExt.javaClass.classLoader
+ val clazz = Class.forName(COMMONIZER_SETUP_CLASS, false, classLoader)
+ val isAllowCommonizerFun = clazz.getMethodOrNull("isAllowCommonizer", Project::class.java) ?: return null
+
+ val isAllowCommonizer = isAllowCommonizerFun.invoke(Boolean::class.java, project) as Boolean
+
+ if (isAllowCommonizer) {
+ val startParameter = project.gradle.startParameter
+ val tasks = HashSet(startParameter.taskNames)
+ if (!tasks.contains(COMMONIZER_TASK_NAME)) {
+ tasks.add(COMMONIZER_TASK_NAME)
+ startParameter.setTaskNames(tasks)
+ }
+ }
+ } catch (e: Exception) {
+ project.logger.error(
+ getErrorMessageBuilder(project, e).build()
+ )
+ }
+ return null
+ }
+
+ override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder {
+ return ErrorMessageBuilder.create(
+ project, e, "EnableCommonizerTask error"
+ ).withDescription("Unable to create $COMMONIZER_TASK_NAME task.")
+ }
+}
\ No newline at end of file
diff --git a/idea/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml
index fca081cbffe..cc354cf6e1f 100644
--- a/idea/resources/META-INF/gradle-java.xml
+++ b/idea/resources/META-INF/gradle-java.xml
@@ -14,6 +14,7 @@
+
diff --git a/idea/resources/META-INF/gradle-java.xml.201 b/idea/resources/META-INF/gradle-java.xml.201
index 99de71d92cb..02ef57d2cce 100644
--- a/idea/resources/META-INF/gradle-java.xml.201
+++ b/idea/resources/META-INF/gradle-java.xml.201
@@ -10,6 +10,7 @@
+