diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java
new file mode 100644
index 0000000000000000000000000000000000000000..51ad305b136d8b42198ff2993a318f10ebafeeb7
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java
@@ -0,0 +1,35 @@
+package org.jastadd.tooling;
+
+import com.intellij.navigation.ChooseByNameContributor;
+import com.intellij.navigation.NavigationItem;
+import com.intellij.openapi.project.Project;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RelAstGrammarChooseByNameContributor implements ChooseByNameContributor {
+
+  @NotNull
+  @Override
+  public String @NotNull [] getNames(Project project, boolean includeNonProjectItems) {
+    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project);
+    List<String> names = new ArrayList<>(typeDecls.size());
+    for (RelAstGrammarTypeDecl typeDecl : typeDecls) {
+      if (typeDecl.getName() != null && typeDecl.getName().length() > 0) {
+        names.add(typeDecl.getName());
+      }
+    }
+    return names.toArray(new String[0]);
+  }
+
+  @NotNull
+  @Override
+  public NavigationItem @NotNull [] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) {
+    // TODO: include non project items
+    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project, name);
+    return typeDecls.toArray(new NavigationItem[0]);
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
index 11c41f499e3e529a2cf16b801b251b5a3f934ac1..f684e427eb0700feae1b799a9e28828efd9c8181 100644
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
@@ -2,12 +2,16 @@ package org.jastadd.tooling.psi.impl;
 
 import com.intellij.extapi.psi.ASTWrapperPsiElement;
 import com.intellij.lang.ASTNode;
+import com.intellij.navigation.ItemPresentation;
 import com.intellij.psi.PsiReference;
 import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
+import org.jastadd.tooling.JastAddIcons;
 import org.jastadd.tooling.psi.RelAstGrammarNamedElement;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import javax.swing.*;
+
 public abstract class RelAstGrammarNamedElementImpl extends ASTWrapperPsiElement implements RelAstGrammarNamedElement {
 
   protected RelAstGrammarNamedElementImpl(@NotNull ASTNode node) {
@@ -25,4 +29,25 @@ public abstract class RelAstGrammarNamedElementImpl extends ASTWrapperPsiElement
     return ReferenceProvidersRegistry.getReferencesFromProviders(this);
   }
 
+  @Override
+  public ItemPresentation getPresentation() {
+    return new ItemPresentation() {
+      @Nullable
+      @Override
+      public String getPresentableText() {
+        return getName();
+      }
+
+      @Override
+      public String getLocationString() {
+        return getContainingFile().getName();
+      }
+
+      @Override
+      public Icon getIcon(boolean unused) {
+        return JastAddIcons.FILE;
+      }
+    };
+  }
+
 }
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 321963c6945774ea7cc9d107882e92da476cb18f..f2d489f03713716ac8366d9e10f068dc8130ae8f 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -40,6 +40,9 @@
 
         <lang.findUsagesProvider language="JastAddGrammar"
                                  implementationClass="org.jastadd.tooling.RelAstGrammarFindUsageProvider"/>
+
+        <gotoSymbolContributor
+            implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/>
     </extensions>
 
     <actions>