diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java
index 1a88b089b664..fd15a87163ef 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java
@@ -359,6 +359,11 @@ public class ModuleHighlightUtil {
PsiClass implClass = (PsiClass)implTarget;
PsiMethod provider;
+ if (findModule(statement) != findModule(implClass)) {
+ String message = JavaErrorMessages.message("module.service.alien");
+ results.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range(implRef)).descriptionAndTooltip(message).create());
+ }
+
if (InheritanceUtil.isInheritorOrSelf(implClass, (PsiClass)intTarget, true)) {
if (implClass.hasModifierProperty(PsiModifier.ABSTRACT)) {
String message = JavaErrorMessages.message("module.service.abstract", implClass.getName());
diff --git a/java/java-psi-impl/src/messages/JavaErrorMessages.properties b/java/java-psi-impl/src/messages/JavaErrorMessages.properties
index d7b2f6cbe5e5..da06fa4af591 100644
--- a/java/java-psi-impl/src/messages/JavaErrorMessages.properties
+++ b/java/java-psi-impl/src/messages/JavaErrorMessages.properties
@@ -410,6 +410,7 @@ module.opens.in.weak.module='opens' is not allowed in an open module
package.not.found=Package not found: {0}
package.is.empty=Package is empty: {0}
module.service.enum=The service definition is an enum: {0}
+module.service.alien=The service implementation must be defined in the same module as the provides directive
module.service.impl=The service implementation type must be a subtype of the service interface type, or have a public static no-args 'provider' method
module.service.abstract=The service implementation is an abstract class: {0}
module.service.inner=The service implementation is an inner class: {0}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt
index ce7ffce24ba0..c9de28eda2fe 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt
@@ -151,8 +151,12 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() {
addFile("pkg/main/Impl7.java", "package pkg.main;\npublic class Impl7 {\n public static void provider();\n}")
addFile("pkg/main/Impl8.java", "package pkg.main;\npublic class Impl8 {\n public static C provider();\n}")
addFile("pkg/main/Impl9.java", "package pkg.main;\npublic class Impl9 {\n public class Inner implements C { }\n}")
+ addFile("module-info.java", "module M2 {\n exports pkg.m2;\n}", M2)
+ addFile("pkg/m2/C.java", "package pkg.m2;\npublic class C { }", M2)
+ addFile("pkg/m2/Impl.java", "package pkg.m2;\npublic class Impl extends C { }", M2)
highlight("""
module M {
+ requires M2;
provides pkg.main.C with pkg.main.NoImpl;
provides pkg.main.C with pkg.main.Impl1;
provides pkg.main.C with pkg.main.Impl2;
@@ -163,6 +167,7 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() {
provides pkg.main.C with pkg.main.Impl7;
provides pkg.main.C with pkg.main.Impl8;
provides pkg.main.C with pkg.main.Impl9.Inner;
+ provides pkg.m2.C with pkg.m2.Impl;
}""".trimIndent())
}