diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java
index 0d68dd5..9eaf421 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java
@@ -51,6 +51,9 @@
 import org.jetbrains.kotlin.util.PerformanceCounter;
 
 import javax.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 
 import static org.jetbrains.kotlin.diagnostics.Errors.*;
@@ -567,6 +570,13 @@
     ) {
         Call call = context.call;
         tracing.bindCall(context.trace, call);
+        System.out.println(
+                "[CallResolver.doResolveCall] NewInference = " +
+                context.languageVersionSettings.getFeatureSupport(LanguageFeature.NewInference) +
+                ", resolutionTask.name=" +
+                resolutionTask.name
+        );
+
 
         boolean newInferenceEnabled = languageVersionSettings.supportsFeature(LanguageFeature.NewInference);
         NewResolutionOldInference.ResolutionKind resolutionKind = resolutionTask.resolutionKind;
@@ -656,6 +666,10 @@
             @NotNull ResolutionTask<D> resolutionTask,
             @NotNull TracingStrategy tracing
     ) {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream ps = new PrintStream(baos, true);
+        new Exception().printStackTrace(ps);
+
         DataFlowInfo initialInfo = context.dataFlowInfoForArguments.getResultInfo();
         if (context.checkArguments == CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS) {
             argumentTypeResolver.analyzeArgumentsAndRecordTypes(context, ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS);
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt
index 3efae64..20a165c 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt
@@ -28,6 +28,7 @@
 import org.jetbrains.kotlin.analyzer.TrackableModuleInfo
 import org.jetbrains.kotlin.caches.project.LibraryModuleInfo
 import org.jetbrains.kotlin.config.KotlinSourceRootType
+import org.jetbrains.kotlin.config.LanguageVersionSettings
 import org.jetbrains.kotlin.descriptors.ModuleDescriptor
 import org.jetbrains.kotlin.idea.configuration.BuildSystemType
 import org.jetbrains.kotlin.idea.configuration.getBuildSystemType
@@ -443,3 +444,8 @@
 
 fun IdeaModuleInfo.projectSourceModules(): List<ModuleSourceInfo>? =
     (this as? ModuleSourceInfo)?.let(::listOf) ?: (this as? PlatformModuleInfo)?.containedModules
+
+data class ModuleSourceInfoWithGivenLanguageSettings(
+    private val originalModuleSourceInfo: ModuleSourceInfo,
+    val languageVersionSettings: LanguageVersionSettings
+) : ModuleSourceInfo by originalModuleSourceInfo
\ No newline at end of file
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt
index d49f287..05c70fe 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt
@@ -47,6 +47,7 @@
         isReleaseCoroutines: Boolean?
     ): LanguageVersionSettings =
         when (moduleInfo) {
+            is ModuleSourceInfoWithGivenLanguageSettings -> moduleInfo.languageVersionSettings
             is ModuleSourceInfo -> moduleInfo.module.languageVersionSettings
             is LibraryInfo -> project.getLanguageVersionSettings(
                 jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines
diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 3b3aab3..1b1f4bb 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -2976,6 +2976,16 @@
                      language="kotlin"
     />
 
+    <localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.migration.DivergedInferenceMigrationInspection"
+                     displayName="Check inference divergence"
+                     groupPath="Kotlin"
+                     groupName="Migration"
+                     enabledByDefault="false"
+                     cleanupTool="true"
+                     level="INFORMATION"
+                     language="kotlin"
+    />
+
     <localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.RedundantWithInspection"
                      displayName="Redundant 'with' call"
                      groupPath="Kotlin"
diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt
index 54f463e..f24f882 100644
--- a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt
@@ -9,20 +9,23 @@
 import com.intellij.codeInspection.ProblemDescriptor
 import com.intellij.psi.PsiFile
 import org.jetbrains.kotlin.analyzer.AnalysisResult
-import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
 import org.jetbrains.kotlin.config.LanguageFeature
 import org.jetbrains.kotlin.config.LanguageVersion
 import org.jetbrains.kotlin.config.LanguageVersionSettings
-import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
-import org.jetbrains.kotlin.idea.caches.resolve.analyzeAndGetResult
-import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
+import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
+import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfoWithGivenLanguageSettings
+import org.jetbrains.kotlin.idea.caches.project.forcedModuleInfo
+import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
 import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
 import org.jetbrains.kotlin.idea.configuration.MigrationInfo
 import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
+import org.jetbrains.kotlin.idea.project.languageVersionSettings
 import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix
+import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
+import org.jetbrains.kotlin.idea.resolve.frontendService
+import org.jetbrains.kotlin.idea.util.projectStructure.module
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.util.SymbolTable
-import org.jetbrains.kotlin.psi.KtElement
 import org.jetbrains.kotlin.psi.KtFile
 import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
 import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
@@ -33,39 +36,45 @@
         return migrationInfo.isInferenceUpdate()
     }
 
-    override fun checkFile(file: PsiFile, manager: InspectionManager, isOnTheFly: Boolean): Array<ProblemDescriptor>? {
-        if (file !is KtFile) return null
+    override fun checkFile(oldFile: PsiFile, manager: InspectionManager, isOnTheFly: Boolean): Array<ProblemDescriptor>? {
+        if (oldFile !is KtFile) return null
+        val oldModuleInfo = oldFile.getModuleInfo() as? ModuleSourceInfo ?: return null
 
-        // TODO
-        val languageVersionSettingsBefore = LanguageVersionSettingsImpl.DEFAULT
-        val languageVersionSettingsAfter = LanguageVersionSettingsImpl.DEFAULT
+        val languageVersionSettingsBefore = oldFile.module?.languageVersionSettings!!
+        val languageVersionSettingsAfter = languageVersionSettingsBefore.wrapEnablingNewInference()
 
-        val resolutionBefore = buildResolutionSummary(file, languageVersionSettingsBefore)
-        val resolutionAfter = buildResolutionSummary(file, languageVersionSettingsAfter)
+        val syntheticFileCopy = oldFile.copy() as KtFile
+        syntheticFileCopy.forcedModuleInfo = ModuleSourceInfoWithGivenLanguageSettings(oldModuleInfo, languageVersionSettingsAfter)
+
+        val resolutionBefore = buildResolutionSummary(oldFile, oldFile.getResolutionFacade())
+        val resolutionAfter = buildResolutionSummary(syntheticFileCopy, syntheticFileCopy.getResolutionFacade())
 
         val resolutionDifference = compareResolutionSummaries(resolutionBefore, resolutionAfter)
 
         return resolutionDifference.toProblemsDescriptors()
     }
 
+    private fun LanguageVersionSettings.wrapEnablingNewInference(): LanguageVersionSettings {
+        return object : LanguageVersionSettings by this {
+            override fun getFeatureSupport(feature: LanguageFeature): LanguageFeature.State =
+                if (feature == LanguageFeature.NewInference) LanguageFeature.State.ENABLED else getFeatureSupport(feature)
+
+            override fun supportsFeature(feature: LanguageFeature): Boolean =
+                if (feature == LanguageFeature.NewInference) true else supportsFeature(feature)
+        }
+    }
+
     private fun compareResolutionSummaries(resolutionBefore: ResolutionSummary, resolutionAfter: ResolutionSummary): ResolutionDifference {
-        // TODO()
         return ResolutionDifference()
     }
 
-    @Suppress("UNREACHABLE_CODE")
-    private fun buildResolutionSummary(file: KtFile, languageVersionSettings: LanguageVersionSettings): ResolutionSummary {
-        val analysisResult = file.analyzeWithGivenLanguageVersionSettings(languageVersionSettings)
-        val (ir, symbolTable) = buildIr(file, analysisResult, languageVersionSettings = TODO())
+    private fun buildResolutionSummary(file: KtFile, resolutionFacade: ResolutionFacade): ResolutionSummary {
+        val analysisResult = resolutionFacade.analyzeWithAllCompilerChecks(listOf(file))
+        val (ir, symbolTable) = buildIr(file, analysisResult, languageVersionSettings = resolutionFacade.frontendService())
 
         return ResolutionSummary(analysisResult, ir, symbolTable, file)
     }
 
-    private fun KtFile.analyzeWithGivenLanguageVersionSettings(languageVersionSettings: LanguageVersionSettings): AnalysisResult {
-        // TODO
-        KotlinCacheService.getInstance(project).getResolutionFacade(listOf(this)).analyzeWithAllCompilerChecks(listOf(this)).bindingContext
-    }
-
     private fun buildIr(
         sourceFile: KtFile,
         analysisResult: AnalysisResult,
@@ -89,7 +98,8 @@
 
 private class ResolutionDifference {
     fun toProblemsDescriptors(): Array<ProblemDescriptor>? {
-        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+        // TODO
+        return null
     }
 }
 
