diff --git a/src/main/grammar/RelAstGrammar.bnf b/src/main/grammar/RelAstGrammar.bnf
index c0a5b23c9153beebde6744c8317fbfad13f71d6d..e0242462d4b42e2cc35b19c7d7be2050f0a3cc67 100644
--- a/src/main/grammar/RelAstGrammar.bnf
+++ b/src/main/grammar/RelAstGrammar.bnf
@@ -21,7 +21,7 @@ declaration ::= (type_decl | relation) comment*
 
 comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
 
-type_decl ::= ABSTRACT? ID (COL ID)? (ASSIGN (component | nta_component)*)? SCOL
+type_decl ::= ABSTRACT? ID (COL ID)? (ASSIGN (component | nta_component)*)? SCOL {methods=[getName]}
 
 nta_component ::= SLASH component SLASH
 
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java b/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..37b37fc15606c2cdb406e141fbd9c265547108b2
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
@@ -0,0 +1,74 @@
+package org.jastadd.tooling;
+
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.psi.search.FileTypeIndex;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.util.PsiTreeUtil;
+import org.jastadd.tooling.psi.RelAstGrammarFile;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+
+public class RelAstGrammarUtil {
+
+  /**
+   * Searches the entire project for RelAst grammar files with TypeDecls with the given name.
+   *
+   * @param project current project
+   * @param name    to check
+   * @return matching TypeDecls
+   */
+  public static List<RelAstGrammarTypeDecl> findTypeDecl(Project project, String name) {
+    List<RelAstGrammarTypeDecl> result = new ArrayList<>();
+    Collection<VirtualFile> virtualFiles =
+      FileTypeIndex.getFiles(RelAstGrammarFileType.INSTANCE, GlobalSearchScope.allScope(project));
+    for (VirtualFile virtualFile : virtualFiles) {
+      RelAstGrammarFile simpleFile = (RelAstGrammarFile) PsiManager.getInstance(project).findFile(virtualFile);
+      if (simpleFile != null) {
+        // TODO check if file is ignored or generated!
+        RelAstGrammarTypeDecl[] typeDecls = PsiTreeUtil.getChildrenOfType(simpleFile, RelAstGrammarTypeDecl.class);
+        if (typeDecls != null) {
+          for (RelAstGrammarTypeDecl typeDecl : typeDecls) {
+            // FIXME workaround because mixins are not working with gradle-grammar-kit-plugin
+            // see https://github.com/JetBrains/gradle-grammar-kit-plugin/issues/23
+            if (name.equals(org.jastadd.tooling.psi.impl.RelAstGrammarPsiImplUtil.getName(typeDecl))) {
+              result.add(typeDecl);
+            }
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Collects all TypeDecls from all RelAst grammar files in the entire project.
+   *
+   * @param project current project
+   * @return all TypeDecls
+   */
+  public static List<RelAstGrammarTypeDecl> findTypeDecl(Project project) {
+    List<RelAstGrammarTypeDecl> result = new ArrayList<>();
+    Collection<VirtualFile> virtualFiles =
+      FileTypeIndex.getFiles(RelAstGrammarFileType.INSTANCE, GlobalSearchScope.allScope(project));
+    for (VirtualFile virtualFile : virtualFiles) {
+      RelAstGrammarFile simpleFile = (RelAstGrammarFile) PsiManager.getInstance(project).findFile(virtualFile);
+      if (simpleFile != null) {
+        // TODO check if file is ignored or generated!
+        RelAstGrammarTypeDecl[] typeDecls = PsiTreeUtil.getChildrenOfType(simpleFile, RelAstGrammarTypeDecl.class);
+        if (typeDecls != null) {
+          result.addAll(Arrays.asList(typeDecls));
+        }
+      }
+    }
+    return result;
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..573ac98d128c812f5f361e05f3f7802d544f6bcb
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
@@ -0,0 +1,19 @@
+package org.jastadd.tooling.psi.impl;
+
+import com.intellij.lang.ASTNode;
+import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+
+public class RelAstGrammarPsiImplUtil {
+  public static String getName(RelAstGrammarTypeDecl element) {
+    // this finds the *first* ID, which is what we want
+    ASTNode keyNode = element.getNode().findChildByType(RelAstGrammarTypes.ID);
+    if (keyNode != null) {
+      // IMPORTANT: Convert embedded escaped spaces to simple spaces
+      return keyNode.getText();
+    } else {
+      return null;
+    }
+  }
+
+}