diff --git a/compiler/ir/backend.js/build.gradle.kts b/compiler/ir/backend.js/build.gradle.kts
index 011fe36..e230aec 100644
--- a/compiler/ir/backend.js/build.gradle.kts
+++ b/compiler/ir/backend.js/build.gradle.kts
@@ -13,6 +13,7 @@
 
 dependencies {
     compileOnly(KOTLIN_COMPOSE_STDLIB)
+    compileOnly(project(":compiler:serialization.js"))
     compileOnly("org.jetbrains.kotlin:kotlin-compiler:$COMPOSE_VERSION")
     compileOnly("org.jetbrains.kotlin:kotlin-plugin:$COMPOSE_VERSION")
     compileOnly("org.jetbrains.kotlin:kotlin-intellij-core:$COMPOSE_VERSION")
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt
index a92ca8c..e1289cb 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt
@@ -173,7 +173,7 @@
 )
 
 private val localDeclarationsLoweringPhase = makeJsModulePhase(
-    ::LocalDeclarationsLowering,
+    { context -> LocalDeclarationsLowering(context) },
     name = "LocalDeclarationsLowering",
     description = "Move local declarations into nearest declaration container",
     prerequisite = setOf(sharedVariablesLoweringPhase, localDelegatedPropertiesLoweringPhase)
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
index 3324a7c..6f7d75e 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
@@ -25,7 +25,7 @@
     return DFS.topologicalOrder(dependencies) { m ->
         val descriptor = m.descriptor
         descriptor.allDependencyModules.filter { it != descriptor }.map { mapping[it] }
-    }.reversed()
+    }.reversed() as Collection<IrModuleFragment>
 }
 
 fun compile(
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt
index b3408b7..9b3cf94 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt
@@ -41,17 +41,18 @@
     }
 
     private fun createLong(v: Long): IrExpression =
-        lowerConst(context.intrinsics.longClassSymbol, IrConstImpl<*>::int, v.toInt(), (v shr 32).toInt())
+        lowerConst(context.intrinsics.longClassSymbol, IrConstImpl.Companion::int, v.toInt(), (v shr 32)
+            .toInt())
 
     override fun <T> visitConst(expression: IrConst<T>): IrExpression {
         with(context.intrinsics) {
             if (expression.type.isUnsigned()) {
                 return when (expression.type.classifierOrNull) {
-                    uByteClassSymbol -> lowerConst(uByteClassSymbol, IrConstImpl<*>::byte, IrConstKind.Byte.valueOf(expression))
+                    uByteClassSymbol -> lowerConst(uByteClassSymbol, IrConstImpl.Companion::byte, IrConstKind.Byte.valueOf(expression))
 
-                    uShortClassSymbol -> lowerConst(uShortClassSymbol, IrConstImpl<*>::short, IrConstKind.Short.valueOf(expression))
+                    uShortClassSymbol -> lowerConst(uShortClassSymbol, IrConstImpl.Companion::short, IrConstKind.Short.valueOf(expression))
 
-                    uIntClassSymbol -> lowerConst(uIntClassSymbol, IrConstImpl<*>::int, IrConstKind.Int.valueOf(expression))
+                    uIntClassSymbol -> lowerConst(uIntClassSymbol, IrConstImpl.Companion::int, IrConstKind.Int.valueOf(expression))
 
                     uLongClassSymbol -> lowerConst(uLongClassSymbol, { _, _, _, v -> createLong(v) }, IrConstKind.Long.valueOf(expression))
 
@@ -60,7 +61,7 @@
             }
             return when {
                 expression.kind is IrConstKind.Char ->
-                    lowerConst(charClassSymbol, IrConstImpl<*>::int, IrConstKind.Char.valueOf(expression).toInt())
+                    lowerConst(charClassSymbol, IrConstImpl.Companion::int, IrConstKind.Char.valueOf(expression).toInt())
 
                 expression.kind is IrConstKind.Long ->
                     createLong(IrConstKind.Long.valueOf(expression))
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt
index 8797a0b..4142118 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt
@@ -14,6 +14,7 @@
 import org.jetbrains.kotlin.backend.common.lower.irBlockBody
 import org.jetbrains.kotlin.backend.common.lower.irIfThen
 import org.jetbrains.kotlin.descriptors.Visibilities
+import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
 import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
@@ -336,11 +337,11 @@
         val entryInstances = createEnumEntryInstanceVariables()
 
         // Create boolean flag that indicates if entry instances were initialized.
-        val entryInstancesInitializedVar = createEntryInstancesInitializedVar()
+        val entryInstancesInitializedVar: IrField = createEntryInstancesInitializedVar()
 
         // Create function that initializes all enum entry instances using `IrEnumEntry.initializationExpression`.
         // It should be called on the first `IrGetEnumValue`, consecutive calls to this function will do nothing.
-        val initEntryInstancesFun = createInitEntryInstancesFun(entryInstancesInitializedVar, entryInstances)
+        val initEntryInstancesFun: IrSimpleFunction = createInitEntryInstancesFun(entryInstancesInitializedVar, entryInstances)
 
         // Create entry instance getters. These are used to lower `IrGetEnumValue`.
         val entryGetInstanceFuns = createGetEntryInstanceFuns(initEntryInstancesFun, entryInstances)
@@ -351,7 +352,13 @@
         // Remove IrEnumEntry nodes from class declarations. Replace them with corresponding class declarations (if they have them).
         replaceIrEntriesWithCorrespondingClasses()
 
-        return listOf(irClass) + entryInstances + listOf(entryInstancesInitializedVar, initEntryInstancesFun) + entryGetInstanceFuns
+        val x: List<IrClass> = listOf(irClass)
+        val y: List<IrDeclaration> = entryInstances
+        val z: List<IrDeclaration> = listOf(entryInstancesInitializedVar,
+            initEntryInstancesFun)
+        val z1: List<IrSimpleFunction> = entryGetInstanceFuns
+
+        return x + y + z + z1
     }
 
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt
index a0b5366..7c940fa 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt
@@ -520,8 +520,9 @@
 
     override fun visitReturn(expression: IrReturn) {
         expression.acceptChildrenVoid(this)
-        if (expression.returnTargetSymbol is IrReturnableBlockSymbol) {
-            val (exitState, varSymbol) = returnableBlockMap[expression.returnTargetSymbol]!!
+        val rts = expression.returnTargetSymbol
+        if (rts is IrReturnableBlockSymbol) {
+            val (exitState, varSymbol) = returnableBlockMap[rts]!!
             if (varSymbol != null) {
                 transformLastExpression { JsIrBuilder.buildSetVariable(varSymbol, it, it.type) }
             }
diff --git a/compiler/ir/serialization.js/build.gradle.kts b/compiler/ir/serialization.js/build.gradle.kts
index dcaa8d4..011fe36 100644
--- a/compiler/ir/serialization.js/build.gradle.kts
+++ b/compiler/ir/serialization.js/build.gradle.kts
@@ -1,197 +1,28 @@
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 plugins {
     kotlin("jvm")
-    id("jps-compatible")
+}
+
+val COMPOSE_VERSION = "1.3.50-compose-20190806"
+val KOTLIN_COMPOSE_STDLIB = "org.jetbrains.kotlin:kotlin-stdlib:$COMPOSE_VERSION"
+
+repositories {
+    maven(project.rootProject.projectDir.resolve("../../prebuilts/androidx/external").absolutePath)
 }
 
 dependencies {
-    compile(project(":compiler:ir.psi2ir"))
-    compile(project(":compiler:ir.serialization.common"))
-    compile(project(":js:js.frontend"))
-
-    compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
-
-    testCompile(intellijCoreDep()) { includeJars("intellij-core") }
-    testCompile(project(":compiler:frontend"))
-    testCompile(project(":compiler:cli"))
-    testCompile(project(":compiler:util"))
-
-    testRuntime(intellijDep()) { includeJars("picocontainer", "trove4j", "guava", "jdom", rootProject = rootProject) }
+    compileOnly(KOTLIN_COMPOSE_STDLIB)
+    compileOnly("org.jetbrains.kotlin:kotlin-compiler:$COMPOSE_VERSION")
+    compileOnly("org.jetbrains.kotlin:kotlin-plugin:$COMPOSE_VERSION")
+    compileOnly("org.jetbrains.kotlin:kotlin-intellij-core:$COMPOSE_VERSION")
+    compileOnly("org.jetbrains.kotlin:kotlin-platform-api:$COMPOSE_VERSION")
 }
 
-sourceSets {
-    "main" { projectDefault() }
-    "test" { projectDefault() }
-}
-
-val unimplementedNativeBuiltIns =
-    (file("$rootDir/core/builtins/native/kotlin/").list().toSet() - file("$rootDir/libraries/stdlib/js-ir/builtins/").list())
-        .map { "core/builtins/native/kotlin/$it" }
-
-// Required to compile native builtins with the rest of runtime
-val builtInsHeader = """@file:Suppress(
-    "NON_ABSTRACT_FUNCTION_WITH_NO_BODY",
-    "MUST_BE_INITIALIZED_OR_BE_ABSTRACT",
-    "EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE",
-    "PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED",
-    "WRONG_MODIFIER_TARGET"
-)
-"""
-
-val fullRuntimeSources by task<Sync> {
-
-    val sources = listOf(
-        "core/builtins/src/kotlin/",
-        "libraries/stdlib/common/src/",
-        "libraries/stdlib/src/kotlin/",
-        "libraries/stdlib/unsigned/",
-        "libraries/stdlib/js/src/",
-        "libraries/stdlib/js/runtime/",
-        "libraries/stdlib/js-ir/builtins/",
-        "libraries/stdlib/js-ir/src/",
-        "libraries/stdlib/js-ir/runtime/",
-
-        // TODO get rid - move to test module
-        "js/js.translator/testData/_commonFiles/"
-    ) + unimplementedNativeBuiltIns
-
-    val excluded = listOf(
-        // stdlib/js/src/generated is used exclusively for current `js-v1` backend.
-        "libraries/stdlib/js/src/generated/**",
-
-        // JS-specific optimized version of emptyArray() already defined
-        "core/builtins/src/kotlin/ArrayIntrinsics.kt"
-    )
-
-    sources.forEach { path ->
-        from("$rootDir/$path") {
-            into(path.dropLastWhile { it != '/' })
-            excluded.filter { it.startsWith(path) }.forEach {
-                exclude(it.substring(path.length))
-            }
-        }
-    }
-
-    into("$buildDir/fullRuntime/src")
-
-    doLast {
-        unimplementedNativeBuiltIns.forEach { path ->
-            val file = File("$buildDir/fullRuntime/src/$path")
-            val sourceCode = builtInsHeader + file.readText()
-            file.writeText(sourceCode)
-        }
+tasks.withType<KotlinCompile>().all {
+    kotlinOptions {
+        jvmTarget = "1.8"
     }
 }
 
-val reducedRuntimeSources by task<Sync> {
-    dependsOn(fullRuntimeSources)
-
-    from(fullRuntimeSources.outputs.files.singleFile) {
-        exclude(
-            listOf(
-                "libraries/stdlib/unsigned/**",
-                "libraries/stdlib/common/src/generated/_Arrays.kt",
-                "libraries/stdlib/common/src/generated/_Collections.kt",
-                "libraries/stdlib/common/src/generated/_Comparisons.kt",
-                "libraries/stdlib/common/src/generated/_Maps.kt",
-                "libraries/stdlib/common/src/generated/_Sequences.kt",
-                "libraries/stdlib/common/src/generated/_Sets.kt",
-                "libraries/stdlib/common/src/generated/_Strings.kt",
-                "libraries/stdlib/common/src/generated/_UArrays.kt",
-                "libraries/stdlib/common/src/generated/_URanges.kt",
-                "libraries/stdlib/common/src/generated/_UCollections.kt",
-                "libraries/stdlib/common/src/generated/_UComparisons.kt",
-                "libraries/stdlib/common/src/generated/_USequences.kt",
-                "libraries/stdlib/common/src/kotlin/SequencesH.kt",
-                "libraries/stdlib/common/src/kotlin/TextH.kt",
-                "libraries/stdlib/common/src/kotlin/UMath.kt",
-                "libraries/stdlib/common/src/kotlin/collections/**",
-                "libraries/stdlib/common/src/kotlin/ioH.kt",
-                "libraries/stdlib/js-ir/runtime/collectionsHacks.kt",
-                "libraries/stdlib/js-ir/src/generated/**",
-                "libraries/stdlib/js-ir/src/kotlin/text/**",
-                "libraries/stdlib/js/src/jquery/**",
-                "libraries/stdlib/js/src/org.w3c/**",
-                "libraries/stdlib/js/src/kotlin/char.kt",
-                "libraries/stdlib/js/src/kotlin/collections.kt",
-                "libraries/stdlib/js/src/kotlin/collections/**",
-                "libraries/stdlib/js/src/kotlin/time/**",
-                "libraries/stdlib/js/src/kotlin/console.kt",
-                "libraries/stdlib/js/src/kotlin/coreDeprecated.kt",
-                "libraries/stdlib/js/src/kotlin/date.kt",
-                "libraries/stdlib/js/src/kotlin/debug.kt",
-                "libraries/stdlib/js/src/kotlin/grouping.kt",
-                "libraries/stdlib/js/src/kotlin/json.kt",
-                "libraries/stdlib/js/src/kotlin/promise.kt",
-                "libraries/stdlib/js/src/kotlin/regexp.kt",
-                "libraries/stdlib/js/src/kotlin/sequence.kt",
-                "libraries/stdlib/js/src/kotlin/text/**",
-                "libraries/stdlib/src/kotlin/collections/**",
-                "libraries/stdlib/src/kotlin/experimental/bitwiseOperations.kt",
-                "libraries/stdlib/src/kotlin/properties/Delegates.kt",
-                "libraries/stdlib/src/kotlin/random/URandom.kt",
-                "libraries/stdlib/src/kotlin/text/**",
-                "libraries/stdlib/src/kotlin/time/**",
-                "libraries/stdlib/src/kotlin/util/KotlinVersion.kt",
-                "libraries/stdlib/src/kotlin/util/Tuples.kt",
-                "libraries/stdlib/js/src/kotlin/dom/**",
-                "libraries/stdlib/js/src/kotlin/browser/**"
-            )
-        )
-    }
-
-    from("$rootDir/libraries/stdlib/js-ir/smallRuntime") {
-        into("libraries/stdlib/js-ir/runtime/")
-    }
-
-    into("$buildDir/reducedRuntime/src")
-}
-
-
-fun JavaExec.buildKLib(sources: List<String>, dependencies: List<String>, outPath: String, commonSources: List<String>) {
-    inputs.files(sources)
-    outputs.dir(file(outPath).parent)
-
-    classpath = sourceSets.test.get().runtimeClasspath
-    main = "org.jetbrains.kotlin.ir.backend.js.GenerateIrRuntimeKt"
-    workingDir = rootDir
-    args = sources.toList() + listOf("-o", outPath) + dependencies.flatMap { listOf("-d", it) } + commonSources.flatMap { listOf("-c", it) }
-
-    passClasspathInJar()
-}
-
-val generateFullRuntimeKLib by task<NoDebugJavaExec> {
-    dependsOn(fullRuntimeSources)
-
-    buildKLib(sources = listOf(fullRuntimeSources.outputs.files.singleFile.path),
-              dependencies = emptyList(),
-              outPath = "$buildDir/fullRuntime/klib",
-              commonSources = listOf("common", "src", "unsigned").map { "$buildDir/fullRuntime/src/libraries/stdlib/$it" }
-    )
-}
-
-val generateReducedRuntimeKLib by task<NoDebugJavaExec> {
-    dependsOn(reducedRuntimeSources)
-
-    buildKLib(sources = listOf(reducedRuntimeSources.outputs.files.singleFile.path),
-              dependencies = emptyList(),
-              outPath = "$buildDir/reducedRuntime/klib",
-              commonSources = listOf("common", "src", "unsigned").map { "$buildDir/reducedRuntime/src/libraries/stdlib/$it" }
-    )
-}
-
-val kotlinTestCommonSources = listOf(
-    "$rootDir/libraries/kotlin.test/annotations-common/src/main",
-    "$rootDir/libraries/kotlin.test/common/src/main"
-)
-val generateKotlinTestKLib by task<NoDebugJavaExec> {
-    dependsOn(generateFullRuntimeKLib)
-
-    buildKLib(
-        sources = listOf("$rootDir/libraries/kotlin.test/js/src/main") + kotlinTestCommonSources,
-        dependencies = listOf("${generateFullRuntimeKLib.outputs.files.singleFile.path}/klib"),
-        outPath = "$buildDir/kotlin.test/klib",
-        commonSources = kotlinTestCommonSources
-    )
-}
-
-testsJar {}
+sourceSets.maybeCreate("main").java.srcDirs("src")
\ No newline at end of file
