diff --git a/platform/core-api/src/com/intellij/navigation/NavigationTarget.java b/platform/core-api/src/com/intellij/navigation/NavigationTarget.java
new file mode 100644
index 000000000000..805e8f8ec277
--- /dev/null
+++ b/platform/core-api/src/com/intellij/navigation/NavigationTarget.java
@@ -0,0 +1,42 @@
+// Copyright 2000-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 file.
+package com.intellij.navigation;
+
+import com.intellij.pom.Navigatable;
+import org.jetbrains.annotations.ApiStatus.Experimental;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+@Experimental
+public interface NavigationTarget {
+
+ /**
+ * @return {@code true} if it's safe to call other methods of this instance
+ */
+ boolean isValid();
+
+ /**
+ * This method is called only if {@link #isValid()} returns {@code true}.
+ *
+ * @return navigatable instance to use when this target is selected
+ */
+ @Nullable
+ Navigatable getNavigatable();
+
+ /**
+ * This method is called only if {@link #isValid()} returns {@code true}.
+ *
+ * @return presentation to render this target in navigation popup
+ */
+ @NotNull
+ TargetPresentation getTargetPresentation();
+
+ /**
+ * Two different symbols may have the same navigation target.
+ * #equals and #hashCode are used to filter out same targets to hide them in navigation popup.
+ */
+ @Override
+ boolean equals(Object obj);
+
+ @Override
+ int hashCode();
+}
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoDeclarationProvider.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoDeclarationProvider.java
new file mode 100644
index 000000000000..4b966ecbb873
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoDeclarationProvider.java
@@ -0,0 +1,20 @@
+// Copyright 2000-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 file.
+package com.intellij.codeInsight.navigation;
+
+import com.intellij.navigation.NavigationTarget;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.ApiStatus.Experimental;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.function.Consumer;
+
+@Experimental
+public interface GotoDeclarationProvider {
+
+ void collectTargets(@NotNull Project project,
+ @NotNull Editor editor,
+ @NotNull PsiFile file,
+ @NotNull Consumer super NavigationTarget> consumer);
+}
diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
index 5a3d2d59d363..1298889fc08c 100644
--- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
+++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
@@ -601,6 +601,8 @@
interface="com.intellij.codeInsight.navigation.actions.TypeDeclarationProvider"/>
+