diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt
index 93ed25dd..91e17a8 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * 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.
  */
 
@@ -119,7 +119,8 @@
 
     override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
         checkModuleIsCorrect(moduleInfo)
-        return doGetDescriptorForModule(moduleInfo)
+        val result = doGetDescriptorForModule(moduleInfo)
+        return result
     }
 
     override fun diagnoseUnknownModuleInfo(infos: List<ModuleInfo>): Nothing {
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt
index 5e5d63f..5974003 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt
@@ -1,17 +1,6 @@
 /*
- * Copyright 2010-2017 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * 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.resolve.checkers
@@ -69,12 +58,14 @@
             val checkActual = !context.languageVersionSettings.getFlag(AnalysisFlags.multiPlatformDoNotCheckActual)
 
             val allImplementedModules = moduleStructureOracle.findAllDependsOnPaths(descriptor.module).flatMap { it.nodes }.toHashSet()
+            val expLast = ExpectedActualResolver.findExpectedForActual(descriptor, allImplementedModules.last(), { it.name in allImplementedModules.map { m -> m.name } })
+            val expFist = ExpectedActualResolver.findExpectedForActual(descriptor, allImplementedModules.first(), { it.name in allImplementedModules.map { m -> m.name } })
             checkActualDeclarationHasExpected(
                 declaration,
                 descriptor,
                 context.trace,
                 checkActual,
-                moduleVisibilityFilter = { it in allImplementedModules }
+                moduleVisibilityFilter = { it.name in allImplementedModules.map { m -> m.name } }
             )
         }
     }
diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
index 8e4885e..cc558a6 100644
--- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
+++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * 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.
  */
 
@@ -142,7 +142,7 @@
         State.ENABLED_WITH_WARNING
     ),
 
-    MultiPlatformProjects(sinceVersion = null, defaultState = State.DISABLED),
+    MultiPlatformProjects(sinceVersion = KOTLIN_1_3, defaultState = State.ENABLED),
 
     NewInference(sinceVersion = KOTLIN_1_4),
     // In the next block, features can be enabled only along with new inference
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt
index bb6de03..548cd86 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt
@@ -1,17 +1,6 @@
 /*
- * Copyright 2010-2016 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * 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.caches.resolve
@@ -493,8 +482,10 @@
         return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
     }
 
-    override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? =
-        (moduleInfo as? IdeaModuleInfo)?.let { getResolutionFacadeByModuleInfo(it, platform) }
+    override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? {
+//        if (moduleInfo is LibrarySourceInfo)
+        return (moduleInfo as? IdeaModuleInfo)?.let { getResolutionFacadeByModuleInfo(it, platform) }
+    }
 
     private fun Collection<KtFile>.filterNotInProjectSource(moduleInfo: IdeaModuleInfo): Set<KtFile> {
         return mapNotNull {
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt
index 09e936c..8459699 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * 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.
  */
 
@@ -135,7 +135,8 @@
         cachedResolverForProject.resolverForModuleDescriptor(moduleDescriptor)
 
     internal fun findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor {
-        return cachedResolverForProject.descriptorForModule(ideaModuleInfo)
+        val result = cachedResolverForProject.descriptorForModule(ideaModuleInfo)
+        return result
     }
 
     internal fun getAnalysisResultsForElements(elements: Collection<KtElement>): AnalysisResult {
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaModuleStructureOracle.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaModuleStructureOracle.kt
index 8b1a440f..65090fc 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaModuleStructureOracle.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaModuleStructureOracle.kt
@@ -1,20 +1,67 @@
 /*
- * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
- * that can be found in the license/LICENSE.txt file.
+ * 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.project
 
 import com.intellij.openapi.module.Module
+import com.intellij.openapi.roots.OrderRootType
+import com.intellij.openapi.roots.libraries.Library
+import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl
+import com.intellij.psi.PsiManager
 import org.jetbrains.kotlin.analyzer.ModuleInfo
+import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
 import org.jetbrains.kotlin.descriptors.ModuleDescriptor
 import org.jetbrains.kotlin.idea.caches.project.*
-import org.jetbrains.kotlin.idea.caches.project.sourceType
 import org.jetbrains.kotlin.idea.core.unwrapModuleSourceInfo
+import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.platform.TargetPlatform
+import org.jetbrains.kotlin.psi.KtFile
 import org.jetbrains.kotlin.resolve.ModulePath
 import org.jetbrains.kotlin.resolve.ModuleStructureOracle
 import java.util.*
 
+fun findVirtualFile(file: VirtualDirectoryImpl): VirtualFile? {
+    for (child in file.children) {
+        if (child.url.endsWith(".kt")) {
+            return child
+        }
+
+        if (child is VirtualDirectoryImpl) {
+            val result = findVirtualFile(child)
+            if (result != null) {
+                return result
+            }
+        }
+    }
+
+    return null
+}
+
+fun findModuleDescriptors(
+    library: Library,
+    platform: TargetPlatform,
+    psiManager: PsiManager,
+    cacheService: KotlinCacheService
+): Map<Name, ModuleDescriptor> {
+    val descriptors = hashMapOf<Name, ModuleDescriptor>()
+
+    for (sources in listOf(*library.getFiles(OrderRootType.SOURCES))) {
+        if (sources !is VirtualDirectoryImpl) continue
+
+        val virtualFileForKt = findVirtualFile(sources) ?: continue
+        val fileViewProvider = psiManager.findViewProvider(virtualFileForKt)
+        val ktFile = fileViewProvider!!.getPsi(fileViewProvider.baseLanguage) as? KtFile ?: continue
+        val facade = cacheService.getResolutionFacade(listOf(ktFile), platform)
+
+        descriptors[facade.moduleDescriptor.name] = facade.moduleDescriptor
+    }
+
+    return descriptors
+}
+
 class IdeaModuleStructureOracle : ModuleStructureOracle {
     override fun hasImplementingModules(module: ModuleDescriptor): Boolean {
         return module.implementingDescriptors.isNotEmpty()
@@ -42,6 +89,29 @@
     override fun findAllDependsOnPaths(module: ModuleDescriptor): List<ModulePath> {
         val currentPath: Stack<ModuleInfo> = Stack()
 
+        if (module.platform != null && module.getCapability(ModuleInfo.Capability) is LibrarySourceInfo) {
+            val librarySourceInfo = module.getCapability(ModuleInfo.Capability) as LibrarySourceInfo
+
+            val cacheService = KotlinCacheService.getInstance(librarySourceInfo.project)
+            val psiManager = PsiManager.getInstance(librarySourceInfo.project)
+
+            val descriptors = hashMapOf<Name, ModuleDescriptor>()
+
+            for ((name, descriptor) in findModuleDescriptors(librarySourceInfo.library, module.platform!!, psiManager, cacheService)) {
+                descriptors[name] = descriptor
+            }
+
+            for (moduleInfo in getModuleInfosFromIdeaModel(librarySourceInfo.project).filter { it.displayedName.contains("stdlib") }) {
+                if (moduleInfo is LibraryInfo) {
+                    for ((name, descriptor) in findModuleDescriptors(moduleInfo.library, module.platform!!, psiManager, cacheService)) {
+                        descriptors[name] = descriptor
+                    }
+                }
+            }
+
+            return listOf(ModulePath(descriptors.map { it.value }.toList()))
+        }
+
         return sequence<ModuleInfoPath> {
             val root = module.moduleInfo
             if (root != null) {
