diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..201bebf1782a5c06760d67e09db1c1c2d3c2c210
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+<!-- Keep a Changelog guide -> https://keepachangelog.com -->
+
+# JastAdd Plugin Changelog
+
+## [Unreleased]
+### Changed
+- Changed build script to Kotlin DSL
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..9136fd64c14dc1bab1d4bbfb3a26a61259a84f6c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,5 @@
+# JastAdd Language Support
+
+<!-- Plugin description -->
+This plugin provides support for JastAdd and Relational RAGs
+<!-- Plugin description end -->
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 92351823fc92e56b7d79732121c8cfd8e1348e9c..0000000000000000000000000000000000000000
--- a/build.gradle
+++ /dev/null
@@ -1,94 +0,0 @@
-plugins {
-    id 'java'
-    id 'org.jetbrains.intellij' version '0.6.5'
-    id "org.jetbrains.grammarkit" version "2020.3.2"
-    id 'idea'
-}
-
-group = "org.jastadd"
-version = "1.0-SNAPSHOT"
-
-repositories {
-    mavenCentral()
-}
-
-runIde {
-    jvmArgs '--add-exports', 'java.base/jdk.internal.vm=ALL-UNNAMED'
-}
-
-//Kotlin DSL:
-//
-//tasks.runIde {
-//    jvmArgs("--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED")
-//}
-
-
-sourceSets {
-    main.java.srcDirs += "src/gen/java"
-}
-
-apply plugin: 'idea'
-apply plugin: 'org.jetbrains.grammarkit'
-
-idea {
-    module {
-        generatedSourceDirs += file('src/gen/java')
-    }
-}
-
-dependencies {
-    testImplementation group: 'junit', name: 'junit', version: '4.12'
-}
-
-// See https://github.com/JetBrains/gradle-intellij-plugin/
-intellij {
-    version = "2020.2.4"
-    plugins = ['java']
-}
-
-
-
-import org.jetbrains.grammarkit.tasks.*
-
-grammarKit {
-    // version of IntelliJ patched JFlex (see bintray link below), Default is 1.7.0-1
-    jflexRelease = '1.7.0-1'
-
-    // tag or short commit hash of Grammar-Kit to use (see link below). Default is 2020.3.1
-    grammarKitRelease = '2020.3.1'
-}
-
-patchPluginXml {
-    changeNotes """
-      Add change notes here.<br>
-      <em>most HTML tags may be used</em>"""
-}
-
-task generateRelAstGrammarParser(type: GenerateParser) {
-
-    // source bnf file
-    source = "src/main/grammar/RelAstGrammar.bnf"
-
-    // optional, task-specific root for the generated files. Default: none
-    targetRoot = 'src/gen/java'
-
-    // path to a parser file, relative to the targetRoot
-    pathToParser = '/org/jastadd/tooling/RelAstGrammarParser.java'
-
-    // path to a directory with generated psi files, relative to the targetRoot
-    pathToPsiRoot = '/org/jastadd/tooling/psi'
-
-    // if set, plugin will remove a parser output file and psi output directory before generating new ones. Default: false
-    purgeOldFiles = true
-}
-
-task generateRelAstGrammarLexer(type: GenerateLexer) {
-
-    source = "src/main/grammar/RelAstGrammar.flex"
-
-    targetDir = 'src/gen/java/org/jastadd/tooling/lexer/'
-
-    targetClass = 'RelAstGrammarLexer'
-
-    purgeOldFiles = true
-}
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000000000000000000000000000000000000..0bf2dc5fbc76ba94304158c94ccc3b6ba3a4fc84
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,164 @@
+import org.jetbrains.changelog.closure
+import org.jetbrains.changelog.markdownToHTML
+import org.jetbrains.grammarkit.tasks.GenerateLexer
+import org.jetbrains.grammarkit.tasks.GenerateParser
+
+plugins {
+    // IDE support
+    idea
+    // Java support
+    id("java")
+    // gradle-intellij-plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin
+    id("org.jetbrains.intellij") version "0.6.5"
+    // gradle-changelog-plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin
+    id("org.jetbrains.changelog") version "0.6.2"
+    // Grammar-Kit - read more: https://github.com/JetBrains/Grammar-Kit
+    id("org.jetbrains.grammarkit") version "2020.3.2"
+}
+
+// Import variables from gradle.properties file
+val pluginGroup: String by project
+// `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure.
+// Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29
+val pluginName_: String by project
+val pluginVersion: String by project
+val pluginSinceBuild: String by project
+val pluginUntilBuild: String by project
+val pluginVerifierIdeVersions: String by project
+
+val platformType: String by project
+val platformVersion: String by project
+val platformPlugins: String by project
+val platformDownloadSources: String by project
+
+
+
+apply {
+    plugin("idea")
+    plugin("org.jetbrains.grammarkit")
+    plugin("org.jetbrains.intellij")
+}
+
+group = pluginGroup
+version = pluginVersion
+
+// Configure project's dependencies
+repositories {
+    mavenCentral()
+    jcenter()
+}
+
+idea {
+    module {
+        generatedSourceDirs.add(file("src/gen"))
+    }
+}
+
+// Configure gradle-intellij-plugin plugin.
+// Read more: https://github.com/JetBrains/gradle-intellij-plugin
+intellij {
+    pluginName = pluginName_
+//    version = platformVersion
+//    type = platformType
+    downloadSources = platformDownloadSources.toBoolean()
+    updateSinceUntilBuild = true
+
+    // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file.
+    setPlugins("java")
+}
+
+sourceSets {
+    main {
+        java.srcDir("src/gen/java")
+    }
+}
+
+//import org.jetbrains.grammarkit.tasks.*
+//
+grammarKit {
+    // version of IntelliJ patched JFlex (see bintray link below), Default is 1.7.0-1
+    jflexRelease = "1.7.0-1"
+
+    // tag or short commit hash of Grammar-Kit to use (see link below). Default is 2020.3.1
+    grammarKitRelease = "2020.3.1"
+}
+
+tasks {
+
+    val generateRelAstGrammarLexer = task<GenerateLexer>("generateRelAstGrammarLexer") {
+        source = "src/main/grammar/RelAstGrammar.flex"
+        targetDir = "src/gen/java/org/jastadd/tooling/lexer/"
+        targetClass = "RelAstGrammarLexer"
+        purgeOldFiles = true
+    }
+
+    // not fully working because of https://github.com/JetBrains/gradle-grammar-kit-plugin/issues/3
+    val generateRelAstGrammarParser = task<GenerateParser>("generateRelAstGrammarParser") {
+        source = "src/main/grammar/RelAstGrammar.bnf"
+        targetRoot = "src/gen/java"
+        pathToParser = "/org/jastadd/tooling/RelAstGrammarParser.java"
+        pathToPsiRoot = "/org/jastadd/tooling/psi"
+        purgeOldFiles = true
+    }
+
+    compileJava {
+        dependsOn(generateRelAstGrammarLexer)
+        dependsOn(generateRelAstGrammarParser)
+    }
+
+    withType<JavaCompile> {
+        sourceCompatibility = "11" // "1.8"
+        targetCompatibility = "11" // "1.8"
+    }
+
+    runIde {
+        jvmArgs("--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED")
+    }
+
+    buildSearchableOptions {
+        jvmArgs("--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED")
+        enabled = false // see https://youtrack.jetbrains.com/issue/KTIJ-782
+    }
+
+    patchPluginXml {
+
+        version(pluginVersion)
+        setSinceBuild(pluginSinceBuild)
+        untilBuild(pluginUntilBuild)
+
+        // Extract the <!-- Plugin description --> section from README.md and provide for the plugin's manifest
+        pluginDescription(
+            closure {
+                File("./README.md").readText().lines().run {
+                    val start = "<!-- Plugin description -->"
+                    val end = "<!-- Plugin description end -->"
+
+                    if (!containsAll(listOf(start, end))) {
+                        throw GradleException("Plugin description section not found in README.md:\n$start ... $end")
+                    }
+                    subList(indexOf(start) + 1, indexOf(end))
+                }.joinToString("\n").run { markdownToHTML(this) }
+            }
+        )
+
+        // Get the latest available change notes from the changelog file
+        changeNotes(
+            closure {
+                changelog.getLatest().toHTML()
+            }
+        )
+    }
+
+    runPluginVerifier {
+        ideVersions(pluginVerifierIdeVersions)
+    }
+
+    publishPlugin {
+        dependsOn("patchChangelog")
+        token(System.getenv("PUBLISH_TOKEN"))
+        // pluginVersion is based on the SemVer (https://semver.org) and supports pre-release labels, like 2.1.7-alpha.3
+        // Specify pre-release label to publish the plugin in a custom Release Channel automatically. Read more:
+        // https://jetbrains.org/intellij/sdk/docs/tutorials/build_system/deployment.html#specifying-a-release-channel
+        channels(pluginVersion.split('-').getOrElse(1) { "default" }.split('.').first())
+    }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a548210f6c459d251296cd1a90ac909e96b5ebf4
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,22 @@
+# IntelliJ Platform Artifacts Repositories
+# -> https://www.jetbrains.org/intellij/sdk/docs/reference_guide/intellij_artifacts.html
+
+pluginGroup = org.jastadd
+pluginName_ = JastAddGrammar
+pluginVersion = 0.1.0
+pluginSinceBuild = 201
+pluginUntilBuild = 203.*
+# Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl
+# See https://jb.gg/intellij-platform-builds-list for available build versions
+pluginVerifierIdeVersions = 2020.3.1
+
+platformType = IC
+platformVersion = 2020.2.4
+platformDownloadSources = true
+# Plugin Dependencies -> https://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_dependencies.html
+# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22
+platformPlugins = com.intellij.modules.java
+
+# Opt-out flag for bundling Kotlin standard library.
+# See https://kotlinlang.org/docs/reference/using-gradle.html#dependency-on-the-standard-library for details.
+kotlin.stdlib.default.dependency = false
diff --git a/settings.gradle b/settings.gradle.kts
similarity index 100%
rename from settings.gradle
rename to settings.gradle.kts
index cbf5c3bc9c34d9efeb6139aea300ee0325d1a97d..2f0d5d41705f0afcd0af77de1b01f669f2825d8b 100644
--- a/settings.gradle
+++ b/settings.gradle.kts
@@ -1,2 +1,2 @@
-rootProject.name = "JastAddGrammar"
 
+rootProject.name = "JastAddGrammar"
diff --git a/src/main/grammar/RelAstGrammar.bnf b/src/main/grammar/RelAstGrammar.bnf
index 9e632fc1ed3b88e584102aad6fa817a3ca8f93cb..081d3f4ba93d185634a64fed29706bdb69bd429d 100644
--- a/src/main/grammar/RelAstGrammar.bnf
+++ b/src/main/grammar/RelAstGrammar.bnf
@@ -21,9 +21,8 @@ comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
 
 type_decl ::= ABSTRACT? declared_name (COL type_reference)? (ASSIGN (component | nta_component)*)? SCOL
 {
-  mixin="org.jastadd.tooling.psi.impl.RelAstGrammarNamedElementImpl"
-  implements="org.jastadd.tooling.psi.RelAstGrammarNamedElement"
-  methods=[getName setName getNameIdentifier]
+  extends="org.jastadd.tooling.psi.impl.RelAstGrammarTypeDeclImplExtension"
+  implements="org.jastadd.tooling.psi.RelAstGrammarTypeDeclExtension"
 }
 
 nta_component ::= SLASH component SLASH
@@ -46,9 +45,8 @@ navigable_role ::= type_reference DOT declared_name (STAR | QUESTION_MARK)?
 declared_name ::= ID
 type_reference ::= ID
 {
-  mixin="org.jastadd.tooling.psi.impl.RelAstGrammarNamedElementImpl"
-  implements="org.jastadd.tooling.psi.RelAstGrammarNamedElement"
-  methods=[getName setName getNameIdentifier]
+  extends="org.jastadd.tooling.psi.impl.RelAstGrammarTypeReferenceImplExtension"
+  implements="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceExtension"
 }
 
 java_name ::= ID
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
index 84290018dea71e54249295ff3e40f41b0f78568d..e871cccf11540cb21c3808b1413e6e78dcb4bece 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
@@ -7,10 +7,13 @@ import com.intellij.util.ProcessingContext;
 import org.jastadd.tooling.parser.RelAstGrammarTypes;
 import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
 import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
 public class RelAstGrammarCompletionContributor extends CompletionContributor {
 
+  public static final String COMPLETION_ELEMENT_SUFFIX = "IntellijIdeaRulezzz";
+
   public RelAstGrammarCompletionContributor() {
 
     // add completion in definition of relations
@@ -20,7 +23,8 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
                                    @NotNull ProcessingContext context,
                                    @NotNull CompletionResultSet resultSet) {
           for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
-            resultSet.addElement(LookupElementBuilder.create(RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName())));
+            RelAstGrammarTypeReference ref = RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName());
+            resultSet.addElement(LookupElementBuilder.create(ref).withIcon(JastAddIcons.FILE).withTypeText(decl.getContainingFile().getName()));
           }
         }
       }
@@ -28,7 +32,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
 
     // add "* ", "? " after REL ID DOT ID
     extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .withTextLengthLongerThan(COMPLETION_ELEMENT_SUFFIX.length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
         .afterLeaf(".")
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))),
@@ -45,7 +49,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     // add "*", "?" after <-  ID DOT ID
     // add "*", "?" after <-> ID DOT ID
     extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .withTextLengthLongerThan(COMPLETION_ELEMENT_SUFFIX.length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
         .afterLeaf(".")
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("<-", "<->"))),
@@ -95,7 +99,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     // add "." after <-> ID
     // add "." after <- ID
     extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .withTextLengthLongerThan(COMPLETION_ELEMENT_SUFFIX.length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
         .afterLeaf("rel", "<->", "<-"),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java b/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
index 3f8f4c50910dd4c7730f8896ab66b9d93c2ffe52..4133679bf7727239aa2a36d69a0d4ed09d678e8d 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
@@ -47,18 +47,20 @@ public class RelAstGrammarFindUsageProvider implements FindUsagesProvider {
   @NotNull
   @Override
   public String getDescriptiveName(@NotNull PsiElement element) {
-    if (element instanceof RelAstGrammarTypeDecl && ((RelAstGrammarTypeDecl) element).getName() != null) {
-      return ((RelAstGrammarTypeDecl) element).getName();
-    } else {
-      return "";
+    if (element instanceof RelAstGrammarTypeDecl) {
+      RelAstGrammarTypeDecl decl = (RelAstGrammarTypeDecl) element;
+      if (decl.getName() != null) {
+        return decl.getName();
+      }
     }
+    return "";
   }
 
   @NotNull
   @Override
   public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
     if (element instanceof RelAstGrammarTypeDecl) {
-      return ((RelAstGrammarTypeDecl) element).getText();
+      return element.getText();
     } else {
       return "";
     }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java b/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
index 09a4de0533fd15fcad069da798988e38450f1662..ae8f8733bd756ee80d9a0038a75dc5c04a49cb8c 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
@@ -6,7 +6,6 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.*;
 import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
-import org.jastadd.tooling.psi.impl.RelAstGrammarPsiImplUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -24,7 +23,7 @@ public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> impleme
 
   @NotNull
   @Override
-  public ResolveResult[] multiResolve(boolean incompleteCode) {
+  public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) {
     Project project = myElement.getProject();
     final List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project, key);
     List<ResolveResult> results = new ArrayList<>();
@@ -43,14 +42,15 @@ public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> impleme
 
   @NotNull
   @Override
-  public Object[] getVariants() {
+  public Object @NotNull [] getVariants() {
     Project project = myElement.getProject();
     List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project);
     List<LookupElement> variants = new ArrayList<>();
     for (final RelAstGrammarTypeDecl typeDecl : typeDecls) {
-      if (RelAstGrammarPsiImplUtil.getName(typeDecl) != null && typeDecl.getName().length() > 0) {
+      if (typeDecl.getName() != null && typeDecl.getName().length() > 0) {
         variants.add(LookupElementBuilder
           .create(typeDecl).withIcon(JastAddIcons.FILE)
+          .withPresentableText(typeDecl.getName())
           .withTypeText(typeDecl.getContainingFile().getName())
         );
       }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java b/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
index fe5c59bb15ae313966c0b0e564e0dcc2ce13f0ae..8a480a0330cf26425481e92f2a957056b2b6899e 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
@@ -1,10 +1,6 @@
 package org.jastadd.tooling;
 
 
-import com.intellij.codeInspection.ProblemHighlightType;
-import com.intellij.lang.annotation.AnnotationHolder;
-import com.intellij.lang.annotation.HighlightSeverity;
-import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
@@ -18,11 +14,15 @@ import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 public class RelAstGrammarUtil {
 
+  private RelAstGrammarUtil() {
+    // appease SonarLint java:S1118
+    throw new IllegalStateException("Utility class");
+  }
+
   /**
    * Searches the entire project for RelAst grammar files with TypeDecls with the given name.
    *
@@ -41,9 +41,7 @@ public class RelAstGrammarUtil {
         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))) {
+            if (name.equals(typeDecl.getName())) {
               result.add(typeDecl);
             }
           }
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..79837b70315b8c0d8c0913811f5057a5196ea71b
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
@@ -0,0 +1,4 @@
+package org.jastadd.tooling.psi;
+
+public interface RelAstGrammarTypeDeclExtension extends RelAstGrammarNamedElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6c95e7553e773c28c39c0d0f764074eaba5ccc2
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java
@@ -0,0 +1,4 @@
+package org.jastadd.tooling.psi;
+
+public interface RelAstGrammarTypeReferenceExtension extends RelAstGrammarNamedElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
deleted file mode 100644
index 22766e52a9b2e17d66e52a625cf4babe5efaa6f1..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.jastadd.tooling.psi.impl;
-
-import com.intellij.lang.ASTNode;
-import com.intellij.psi.PsiElement;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-import org.jastadd.tooling.psi.RelAstGrammarDeclaredName;
-import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
-import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
-import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
-
-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.DECLARED_NAME);
-    if (keyNode != null) {
-      return keyNode.getText();
-    } else {
-      System.out.println("getName NULL");
-      return null;
-    }
-  }
-
-  public static PsiElement setName(RelAstGrammarTypeDecl element, String newName) {
-    ASTNode keyNode = element.getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
-    if (keyNode != null) {
-      RelAstGrammarDeclaredName name = RelAstGrammarElementFactory.createDeclaredName(element.getProject(), newName);
-      ASTNode newKeyNode = name.getNode();
-      element.getNode().replaceChild(keyNode, newKeyNode);
-    }
-    return element;
-  }
-
-  public static PsiElement getNameIdentifier(RelAstGrammarTypeDecl element) {
-    ASTNode keyNode = element.getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
-    if (keyNode != null) {
-      return keyNode.getPsi();
-    } else {
-      System.out.println("getNameIdentifier NULL");
-      return null;
-    }
-  }
-
-  public static String getName(RelAstGrammarTypeReference element) {
-    // this finds the *first* ID, which is what we want
-    ASTNode keyNode = element.getNode();
-    if (keyNode != null) {
-      return keyNode.getText();
-    } else {
-      System.out.println("RelAstGrammarTypeReference.getName() returned NULL");
-      return null;
-    }
-  }
-
-  public static PsiElement setName(RelAstGrammarTypeReference element, String newName) {
-    ASTNode keyNode = element.getNode().getFirstChildNode();
-    if (keyNode != null) {
-      RelAstGrammarTypeReference name = RelAstGrammarElementFactory.createTypeReference(element.getProject(), newName);
-      ASTNode newKeyNode = name.getNode().getFirstChildNode();
-      element.getNode().replaceChild(keyNode, newKeyNode);
-    }
-    return element;
-  }
-
-  public static PsiElement getNameIdentifier(RelAstGrammarTypeReference element) {
-    ASTNode keyNode = element.getNode();
-    if (keyNode != null) {
-      return keyNode.getPsi();
-    } else {
-      System.out.println("getNameIdentifier2 NULL");
-      return null;
-    }
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..b51ed4fec649f326781dd67a61489f086485536d
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
@@ -0,0 +1,47 @@
+package org.jastadd.tooling.psi.impl;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.psi.RelAstGrammarDeclaredName;
+import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDeclExtension;
+import org.jetbrains.annotations.NotNull;
+
+public class RelAstGrammarTypeDeclImplExtension extends RelAstGrammarNamedElementImpl implements RelAstGrammarTypeDeclExtension {
+
+  public RelAstGrammarTypeDeclImplExtension(@NotNull ASTNode node) {
+    super(node);
+  }
+
+  public String getName() {
+    // this finds the *first* ID, which is what we want
+    ASTNode keyNode = getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      return keyNode.getText();
+    } else {
+      return null;
+    }
+  }
+
+  public PsiElement setName(@NotNull String newName) {
+    ASTNode keyNode = getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      RelAstGrammarDeclaredName name = RelAstGrammarElementFactory.createDeclaredName(getProject(), newName);
+      ASTNode newKeyNode = name.getNode();
+      getNode().replaceChild(keyNode, newKeyNode);
+    }
+    return this;
+  }
+
+  public PsiElement getNameIdentifier() {
+    ASTNode keyNode = getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      return keyNode.getPsi();
+    } else {
+      return null;
+    }
+  }
+
+
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..74f719d63b2e0c086a2be79132133eb4bba65919
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java
@@ -0,0 +1,35 @@
+package org.jastadd.tooling.psi.impl;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReferenceExtension;
+import org.jetbrains.annotations.NotNull;
+
+public class RelAstGrammarTypeReferenceImplExtension extends RelAstGrammarNamedElementImpl implements RelAstGrammarTypeReferenceExtension {
+
+  public RelAstGrammarTypeReferenceImplExtension(@NotNull ASTNode node) {
+    super(node);
+  }
+
+  public String getName() {
+    // this finds the *first* ID, which is what we want
+    return getNode().getText();
+  }
+
+  public PsiElement setName(@NotNull String newName) {
+    ASTNode keyNode = getNode().getFirstChildNode();
+    if (keyNode != null) {
+      RelAstGrammarTypeReference name = RelAstGrammarElementFactory.createTypeReference(getProject(), newName);
+      ASTNode newKeyNode = name.getNode().getFirstChildNode();
+      getNode().replaceChild(keyNode, newKeyNode);
+    }
+    return this;
+  }
+
+  public PsiElement getNameIdentifier() {
+    return getNode().getPsi();
+  }
+
+}
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 7bb097d05c32c16a757a723a855c5212d4879a59..321963c6945774ea7cc9d107882e92da476cb18f 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -3,9 +3,6 @@
     <name>JastAdd Grammar Language</name>
     <vendor email="johannes.mey@tu-dresden.de" url="jastadd.org">The JastAdd Team</vendor>
 
-    <description><![CDATA[
-    A plugin for JastAdd grammars specified in ast and relast files.
-    ]]></description>
 
     <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
          on how to target different products -->
@@ -37,7 +34,8 @@
         <lang.refactoringSupport language="JastAddGrammar"
                                  implementationClass="org.jastadd.tooling.RelAstGrammarRefactoringSupportProvider"/>
 
-        <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference" implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
+        <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference"
+                                 implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
 
 
         <lang.findUsagesProvider language="JastAddGrammar"