diff --git a/build.gradle.kts b/build.gradle.kts
index c283684988ec4219febbbc8c4667dea0f0d535a7..a3635732989a196f93e7cf9de53dfec463fe5da3 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -86,44 +86,44 @@ grammarKit {
 
 tasks {
 
-    val generateRelAstGrammarLexer = task<GenerateLexer>("generateRelAstGrammarLexer") {
-        source = "src/main/grammar/RelAstGrammar.flex"
-        targetDir = "src/gen/java/org/jastadd/tooling/lexer/"
-        targetClass = "RelAstGrammarLexer"
+    val generateGrammarLexer = task<GenerateLexer>("generateGrammarLexer") {
+        source = "src/main/grammar/Grammar.flex"
+        targetDir = "src/gen/java/org/jastadd/tooling/grammar/lexer/"
+        targetClass = "GrammarLexer"
         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"
+    val generateGrammarParser = task<GenerateParser>("generateGrammarParser") {
+        source = "src/main/grammar/Grammar.bnf"
         targetRoot = "src/gen/java"
-        pathToParser = "/org/jastadd/tooling/RelAstGrammarParser.java"
-        pathToPsiRoot = "/org/jastadd/tooling/psi"
+        pathToParser = "/org/jastadd/tooling/grammar/GrammarParser.java"
+        pathToPsiRoot = "/org/jastadd/tooling/grammar/psi"
         purgeOldFiles = true
     }
 
-    val generateJastAddAspectLexer = task<GenerateLexer>("generateJastAddAspectLexer") {
-        source = "src/main/grammar/JastAddAspect.flex"
+    val generateAspectLexer = task<GenerateLexer>("generateAspectLexer") {
+        source = "src/main/grammar/Aspect.flex"
         targetDir = "src/gen/java/org/jastadd/tooling/aspect/lexer/"
-        targetClass = "JastAddAspectLexer"
+        targetClass = "AspectLexer"
         purgeOldFiles = true
     }
 
     // not fully working because of https://github.com/JetBrains/gradle-grammar-kit-plugin/issues/3
-    val generateJastAddAspectParser = task<GenerateParser>("generateJastAddAspectParser") {
-        source = "src/main/grammar/JastAddAspect.bnf"
+    val generateAspectParser = task<GenerateParser>("generateAspectParser") {
+        source = "src/main/grammar/Aspect.bnf"
         targetRoot = "src/gen/java"
-        pathToParser = "/org/jastadd/tooling/aspect/JastAddAspectParser.java"
+        pathToParser = "/org/jastadd/tooling/aspect/AspectParser.java"
         pathToPsiRoot = "/org/jastadd/tooling/aspect/psi"
         purgeOldFiles = true
     }
 
 
     compileJava {
-        dependsOn(generateRelAstGrammarLexer)
-        dependsOn(generateRelAstGrammarParser)
-        dependsOn(generateJastAddAspectLexer)
-        dependsOn(generateJastAddAspectParser)
+        dependsOn(generateGrammarLexer)
+        dependsOn(generateGrammarParser)
+        dependsOn(generateAspectLexer)
+        dependsOn(generateAspectParser)
     }
 
     withType<JavaCompile> {
diff --git a/src/main/grammar/JastAddAspect.bnf b/src/main/grammar/Aspect.bnf
similarity index 98%
rename from src/main/grammar/JastAddAspect.bnf
rename to src/main/grammar/Aspect.bnf
index 4fa13c65044f060688e8f338c8a259415ed8871c..de5d7962f16b7b1908d453908e075e55e24f717a 100644
--- a/src/main/grammar/JastAddAspect.bnf
+++ b/src/main/grammar/Aspect.bnf
@@ -8,9 +8,9 @@
   psiPackage="org.jastadd.tooling.aspect.psi"
   psiImplPackage="org.jastadd.tooling.aspect.psi.impl"
 
-  elementTypeHolderClass="org.jastadd.tooling.aspect.psi.JastAddAspectTypes"
-  elementTypeClass="org.jastadd.tooling.aspect.JastAddAspectElementType"
-  tokenTypeClass="org.jastadd.tooling.aspect.JastAddAspectTokenType"
+  elementTypeHolderClass="org.jastadd.tooling.aspect.psi.AspectTypes"
+  elementTypeClass="org.jastadd.tooling.aspect.psi.AspectElementType"
+  tokenTypeClass="org.jastadd.tooling.aspect.psi.AspectTokenType"
 
   tokens = [
         WhiteSpace          = 'regexp:[ \t\n\r\f]'
diff --git a/src/main/grammar/Aspect.flex b/src/main/grammar/Aspect.flex
new file mode 100644
index 0000000000000000000000000000000000000000..62522e2e366cb5b0f54b6697df6f6f67470ca994
--- /dev/null
+++ b/src/main/grammar/Aspect.flex
@@ -0,0 +1,258 @@
+package org.jastadd.tooling.aspect.lexer;
+
+import com.intellij.lexer.FlexLexer;
+import com.intellij.psi.tree.IElementType;
+import org.jastadd.tooling.aspect.psi.AspectTypes;
+import com.intellij.psi.TokenType;
+
+%%
+
+%class AspectLexer
+%implements FlexLexer
+%unicode
+%function advance
+%type IElementType
+%eof{  return;
+%eof}
+
+%{
+  private int counter = 0;
+%}
+
+WhiteSpace          = [ \t\n\r\f]
+
+// TODO what is /**/ in Java? Is this caputered here?
+SingleLineComment   = "//"  [^\n\r]* (\n | \r | \r\n)
+FormalComment       = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/]
+MultiLineComment    = "/*"  [^*]+ [*]+([^*/][^*]*[*]+)*[/]
+
+
+NotBrace          = ( [^{}/]+ | [/][^{}/*] )*
+
+// from jjt
+DecimalLiteral    = [1-9] [0-9]*
+HexLiteral        = 0 [xX] [0-9a-fA-F]+
+OctalLiteral      = 0 [0-7]*
+IntegerLiteral    = ( {DecimalLiteral} | {HexLiteral} | {OctalLiteral} ) [lL]?
+
+Exponent             = [eE] [+-]? [0-9]+
+FloatingPointLiteral = [0-9]+ "." [0-9]* {Exponent}? [fFdD]?
+                     |        "." [0-9]+ {Exponent}? [fFdD]?
+                     |            [0-9]+ {Exponent}  [fFdD]?
+                     |            [0-9]+ {Exponent}? [fFdD]
+
+CharacterLiteral     = '  ( [^'\\\n\r]  | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) ) '
+StringLiteral        = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) )* \"
+
+Identifier           = [:jletter:] [:jletterdigit:]*
+
+%state JASTADD
+%state EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
+%state CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
+%state LBRACE_ANYTHING_RBRACE
+%state JAVA_IN_PAREN
+%state COLLECTION_DECL
+%state ATTRIBUTE_DEFINITION
+%state LPAREN_ANYTHING_RPAREN
+
+%%
+
+<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
+  {WhiteSpace}+                  { return TokenType.WHITE_SPACE; }
+  {SingleLineComment}            { return AspectTypes.SINGLE_LINE_COMMENT; }
+  {FormalComment}                { return AspectTypes.FORMAL_COMMENT; }
+  {MultiLineComment}             { return AspectTypes.MULTI_LINE_COMMENT; }
+//  "EQ"                           { yybegin(YYINITIAL); return AspectTypes.EQ; }
+//  "{"                            { yybegin(JAVA); counter = 1;  }
+  "class"                        { yybegin(EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); }
+}
+
+<EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> {
+  "{"                            { yybegin(CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); counter = 1;  }
+  {NotBrace}                     {} // skip over everything
+}
+
+<CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> {
+  {SingleLineComment}            {}
+  {FormalComment}                {}
+  {MultiLineComment}             {}
+  {CharacterLiteral}             {}
+  {StringLiteral}                {}
+  "{"                            { counter++; }
+  "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return AspectTypes.CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE; } }
+  {NotBrace}                     {}
+}
+
+<LBRACE_ANYTHING_RBRACE> {
+  {SingleLineComment}            {}
+  {FormalComment}                {}
+  {MultiLineComment}             {}
+  {CharacterLiteral}             {}
+  {StringLiteral}                {}
+  "{"                            { counter++; }
+  "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return AspectTypes.LBRACE_ANYTHING_RBRACE; } }
+  {NotBrace}                     {}
+}
+
+<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
+  "abstract"                    { return AspectTypes.ABSTRACT; }
+//"assert"                      { return AspectTypes.ASSERT; }
+  "boolean"                     { return AspectTypes.BOOLEAN; }
+//"break"                       { return AspectTypes.BREAK; }
+  "byte"                        { return AspectTypes.BYTE; }
+//"case"                        { return AspectTypes.CASE; }
+//"catch"                       { return AspectTypes.CATCH; }
+  "char"                        { return AspectTypes.CHAR; }
+//"class"                       { return AspectTypes.CLASS; }
+//"const"                       { return AspectTypes.CONST; }
+//"continue"                    { return AspectTypes.CONTINUE; }
+//"default"                     { return AspectTypes._DEFAULT; }
+//"do"                          { return AspectTypes.DO; }
+  "double"                      { return AspectTypes.DOUBLE; }
+//"else"                        { return AspectTypes.ELSE; }
+//"enum"                        { return AspectTypes.ENUM; }
+  "extends"                     { return AspectTypes.EXTENDS; }
+  "false"                       { return AspectTypes.FALSE; }
+  "final"                       { return AspectTypes.FINAL; }
+//"finally"                     { return AspectTypes.FINALLY; }
+  "float"                       { return AspectTypes.FLOAT; }
+  "for"                         { return AspectTypes.FOR; }
+//"goto"                        { return AspectTypes.GOTO; }
+//"if"                          { return AspectTypes.IF; }
+  "implements"                  { return AspectTypes.IMPLEMENTS; }
+  "import"                      { return AspectTypes.IMPORT; }
+  "instanceof"                  { return AspectTypes.INSTANCEOF; }
+  "int"                         { return AspectTypes.INT; }
+  "interface"                   { return AspectTypes.INTERFACE; }
+  "long"                        { return AspectTypes.LONG; }
+  "native"                      { return AspectTypes.NATIVE; }
+//"new"                         { return AspectTypes.NEW; }
+  "null"                        { return AspectTypes.NULL; }
+//"package"                     { return AspectTypes.PACKAGE; }
+  "private"                     { return AspectTypes.PRIVATE; }
+  "protected"                   { return AspectTypes.PROTECTED; }
+  "public"                      { return AspectTypes.PUBLIC; }
+//"return"                      { return AspectTypes.RETURN; }
+  "short"                       { return AspectTypes.SHORT; }
+  "static"                      { return AspectTypes.STATIC; }
+  "strictfp"                    { return AspectTypes.STRICTFP; }
+  "super"                       { return AspectTypes.SUPER; }
+//"switch"                      { return AspectTypes.SWITCH; }
+  "synchronized"                { return AspectTypes.SYNCHRONIZED; }
+//"this"                        { return AspectTypes.THIS; }
+//"throw"                       { return AspectTypes.THROW; }
+  "throws"                      { return AspectTypes.THROWS; }
+  "transient"                   { return AspectTypes.TRANSIENT; }
+  "true"                        { return AspectTypes.TRUE; }
+//"try"                         { return AspectTypes.TRY; }
+  "void"                        { return AspectTypes.VOID; }
+  "volatile"                    { return AspectTypes.VOLATILE; }
+//"while"                       { return AspectTypes.WHILE; }
+
+  // JastAdd
+  "inh"                         { yybegin(ATTRIBUTE_DEFINITION); return AspectTypes.INH; }
+  "syn"                         { yybegin(ATTRIBUTE_DEFINITION); return AspectTypes.SYN; }
+  "lazy"                        { return AspectTypes.LAZY; }
+  "rewrite"                     { return AspectTypes.REWRITE; }
+  "to"                          { return AspectTypes.TO; }
+  "when"                        { return AspectTypes.WHEN; }
+  "aspect"                      { return AspectTypes.ASPECT; }
+  "eq"                          { yybegin(ATTRIBUTE_DEFINITION); return AspectTypes.EQUATION; }
+  "circular"                    { return AspectTypes.CIRCULAR; }
+  "refine"                      { return AspectTypes.REFINE; }
+  "contributes"                 { return AspectTypes.CONTRIBUTES; }
+  "each"                        { return AspectTypes.EACH; }
+  "nta"                         { return AspectTypes.NTA; }
+  "cache"                       { return AspectTypes.CACHE; }
+  "uncache"                     { return AspectTypes.UNCACHE; }
+
+  // TODO this is strangely split in another Token block, check semantics of JJTree file!
+  "coll"                        { yybegin(COLLECTION_DECL); return AspectTypes.COLL; }
+
+}
+
+<COLLECTION_DECL> {
+  "with"                        { return AspectTypes.WITH; }
+  "root"                        { return AspectTypes.ROOT; }
+}
+
+<ATTRIBUTE_DEFINITION> {
+  "{"                           { yybegin(LBRACE_ANYTHING_RBRACE); counter = 1; }
+}
+
+// a semicolon exits the COLLECTION_DECL (because we ignore semicolons in expressions)
+<COLLECTION_DECL, ATTRIBUTE_DEFINITION> {
+  ";"                           { yybegin(YYINITIAL); return AspectTypes.SEMICOLON; }
+}
+
+<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
+  // LITERALS
+  {IntegerLiteral}              { return AspectTypes.INTEGER_LITERAL; }
+  {FloatingPointLiteral}        { return AspectTypes.FLOATING_POINT_LITERAL; }
+  {CharacterLiteral}            { return AspectTypes.CHARACTER_LITERAL; }
+  {StringLiteral}               { return AspectTypes.STRING_LITERAL; }
+
+  // IDENTIFIERS
+  {Identifier}                  { return AspectTypes.IDENTIFIER; }
+
+  // COMBINED TOKENS
+  ".class"                      { return AspectTypes.DOT_CLASS; }
+
+  // SEPARATORS
+
+  "("                           { return AspectTypes.LPAREN; }
+  ")"                           { return AspectTypes.RPAREN; }
+  "{"                           { return AspectTypes.LBRACE; }
+  "}"                           { return AspectTypes.RBRACE; }
+  "["                           { return AspectTypes.LBRACKET; }
+  "]"                           { return AspectTypes.RBRACKET; }
+
+  ";"                           { return AspectTypes.SEMICOLON; }
+  ","                           { return AspectTypes.COMMA; }
+  "."                           { return AspectTypes.DOT; }
+//"@"                           { return AspectTypes.AT; }
+
+  // OPERATORS
+  "="                           { return AspectTypes.ASSIGN; }
+  "<"                           { return AspectTypes.LT; }
+  "!"                           { return AspectTypes.BANG; }
+  "~"                           { return AspectTypes.TILDE; }
+  "?"                           { return AspectTypes.HOOK; }
+  ":"                           { return AspectTypes.COLON; }
+  "=="                          { return AspectTypes.EQ; }
+  "<="                          { return AspectTypes.LE; }
+  ">="                          { return AspectTypes.GE; }
+  "!="                          { return AspectTypes.NE; }
+  "||"                          { return AspectTypes.SC_OR; }
+  "&&"                          { return AspectTypes.SC_AND; }
+  "++"                          { return AspectTypes.INCR; }
+  "--"                          { return AspectTypes.DECR; }
+  "+"                           { return AspectTypes.PLUS; }
+  "-"                           { return AspectTypes.MINUS; }
+  "*"                           { return AspectTypes.STAR; }
+  "/"                           { return AspectTypes.SLASH; }
+  "&"                           { return AspectTypes.BIT_AND; }
+  "|"                           { return AspectTypes.BIT_OR; }
+  "^"                           { return AspectTypes.XOR; }
+  "%"                           { return AspectTypes.REM; }
+  "<<"                          { return AspectTypes.LSHIFT; }
+  "+="                          { return AspectTypes.PLUSASSIGN; }
+  "-="                          { return AspectTypes.MINUSASSIGN; }
+  "*="                          { return AspectTypes.STARASSIGN; }
+  "/="                          { return AspectTypes.SLASHASSIGN; }
+  "&="                          { return AspectTypes.ANDASSIGN; }
+  "|="                          { return AspectTypes.ORASSIGN; }
+  "^="                          { return AspectTypes.XORASSIGN; }
+  "%="                          { return AspectTypes.REMASSIGN; }
+  "<<="                         { return AspectTypes.LSHIFTASSIGN; }
+  ">>="                         { return AspectTypes.RSIGNEDSHIFTASSIGN; }
+  ">>>="                        { return AspectTypes.RUNSIGNEDSHIFTASSIGN; }
+//"..."                         { return AspectTypes.ELLIPSIS; }
+  "->"                          { return AspectTypes.ARROW; }
+  "::"                          { return AspectTypes.DOUBLECOLON; }
+
+  // TODO RUNSIGNEDSHIFT >>> and RSIGNEDSHIFT >> are not parsed
+
+  ">"                           { return AspectTypes.GT; }
+}
+
diff --git a/src/main/grammar/RelAstGrammar.bnf b/src/main/grammar/Grammar.bnf
similarity index 62%
rename from src/main/grammar/RelAstGrammar.bnf
rename to src/main/grammar/Grammar.bnf
index 081d3f4ba93d185634a64fed29706bdb69bd429d..d3a722a46ea0aa0227ac494321fca8425a40150e 100644
--- a/src/main/grammar/RelAstGrammar.bnf
+++ b/src/main/grammar/Grammar.bnf
@@ -1,18 +1,18 @@
 {
-  parserClass="org.jastadd.tooling.parser.RelAstGrammarParser"
+  parserClass="org.jastadd.tooling.grammar.parser.GrammarParser"
 
   extends="com.intellij.extapi.psi.ASTWrapperPsiElement"
 
   psiClassPrefix="RelAstGrammar"
   psiImplClassSuffix="Impl"
-  psiPackage="org.jastadd.tooling.psi"
-  psiImplPackage="org.jastadd.tooling.psi.impl"
+  psiPackage="org.jastadd.tooling.grammar.psi"
+  psiImplPackage="org.jastadd.tooling.grammar.psi.impl"
 
-  elementTypeHolderClass="org.jastadd.tooling.parser.RelAstGrammarTypes"
-  elementTypeClass="org.jastadd.tooling.parser.RelAstGrammarElementType"
-  tokenTypeClass="org.jastadd.tooling.parser.RelAstGrammarTokenType"
+  elementTypeHolderClass="org.jastadd.tooling.grammar.parser.GrammarTypes"
+  elementTypeClass="org.jastadd.tooling.grammar.psi.GrammarElementType"
+  tokenTypeClass="org.jastadd.tooling.grammar.psi.GrammarTokenType"
 
-  psiImplUtilClass="org.jastadd.tooling.psi.impl.RelAstGrammarPsiImplUtil"
+  psiImplUtilClass="org.jastadd.tooling.grammar.psi.impl.RelAstGrammarPsiImplUtil"
 }
 
 relAstGrammarFile ::= comment* ((type_decl | relation) comment*)*
@@ -21,8 +21,8 @@ comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
 
 type_decl ::= ABSTRACT? declared_name (COL type_reference)? (ASSIGN (component | nta_component)*)? SCOL
 {
-  extends="org.jastadd.tooling.psi.impl.RelAstGrammarTypeDeclImplExtension"
-  implements="org.jastadd.tooling.psi.RelAstGrammarTypeDeclExtension"
+  extends="org.jastadd.tooling.grammar.psi.impl.GrammarTypeDeclImplExtension"
+  implements="org.jastadd.tooling.grammar.psi.GrammarTypeDeclExtension"
 }
 
 nta_component ::= SLASH component SLASH
@@ -45,8 +45,8 @@ navigable_role ::= type_reference DOT declared_name (STAR | QUESTION_MARK)?
 declared_name ::= ID
 type_reference ::= ID
 {
-  extends="org.jastadd.tooling.psi.impl.RelAstGrammarTypeReferenceImplExtension"
-  implements="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceExtension"
+  extends="org.jastadd.tooling.grammar.psi.impl.GrammarTypeReferenceImplExtension"
+  implements="org.jastadd.tooling.grammar.psi.GrammarTypeReferenceExtension"
 }
 
 java_name ::= ID
diff --git a/src/main/grammar/Grammar.flex b/src/main/grammar/Grammar.flex
new file mode 100644
index 0000000000000000000000000000000000000000..3f8006a0e296c7f371112ed2bac6cdf849b294db
--- /dev/null
+++ b/src/main/grammar/Grammar.flex
@@ -0,0 +1,66 @@
+// Copyright 2000-2020 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package org.jastadd.tooling.grammar.lexer;
+
+import com.intellij.lexer.FlexLexer;
+import com.intellij.psi.tree.IElementType;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+import com.intellij.psi.TokenType;
+
+%%
+
+%class GrammarLexer
+%implements FlexLexer
+%unicode
+%function advance
+%type IElementType
+%eof{  return;
+%eof}
+
+
+WhiteSpace        = [ ] | \t | \f | \n | \r | \r\n
+ID                = [a-zA-Z$_][a-zA-Z0-9$_]*
+MultiLineComment  = [/][*][^*]+[*]+([^*/][^*]*[*]+)*[/]
+DocComment        = [/][*][*][^*]*[*]+([^*/][^*]*[*]+)*[/]
+SingleLineComment = [/][/] [^\n\r]* (\n | \r | \r\n)
+
+
+%xstate COMMENT
+%state DECLARATION
+
+%%
+
+<DECLARATION> {
+  {WhiteSpace}          { return TokenType.WHITE_SPACE; } // maybe ignore this
+  {MultiLineComment}    { return GrammarTypes.MULTILINECOMMENT; } // maybe ignore this
+  {DocComment}          { return GrammarTypes.DOCCOMMENT; } // maybe ignore this
+  {SingleLineComment}   { return GrammarTypes.SINGLELINECOMMENT; } // maybe ignore this
+}
+
+<YYINITIAL,COMMENT> {
+  {WhiteSpace}+         { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; }
+  {MultiLineComment}    { yybegin(YYINITIAL); return GrammarTypes.MULTILINECOMMENT; }
+  {DocComment}          { yybegin(YYINITIAL); return GrammarTypes.DOCCOMMENT; }
+  {SingleLineComment}   { yybegin(YYINITIAL); return GrammarTypes.SINGLELINECOMMENT; }
+}
+
+<YYINITIAL,DECLARATION> {
+  "abstract"            { yybegin(DECLARATION); return GrammarTypes.ABSTRACT; }
+  "rel"                 { yybegin(DECLARATION); return GrammarTypes.REL; }
+  ";"                   { yybegin(COMMENT);     return GrammarTypes.SCOL; }
+  ":"                   { yybegin(DECLARATION); return GrammarTypes.COL; }
+  "::="                 { yybegin(DECLARATION); return GrammarTypes.ASSIGN; }
+  "*"                   { yybegin(DECLARATION); return GrammarTypes.STAR; }
+  "."                   { yybegin(DECLARATION); return GrammarTypes.DOT; }
+  ","                   { yybegin(DECLARATION); return GrammarTypes.COMMA; }
+  "<"                   { yybegin(DECLARATION); return GrammarTypes.LT; }
+  ">"                   { yybegin(DECLARATION); return GrammarTypes.GT; }
+  "["                   { yybegin(DECLARATION); return GrammarTypes.LBRACKET; }
+  "]"                   { yybegin(DECLARATION); return GrammarTypes.RBRACKET; }
+  "/"                   { yybegin(DECLARATION); return GrammarTypes.SLASH; }
+  "?"                   { yybegin(DECLARATION); return GrammarTypes.QUESTION_MARK; }
+  "->"                  { yybegin(DECLARATION); return GrammarTypes.RIGHT; }
+  "<-"                  { yybegin(DECLARATION); return GrammarTypes.LEFT; }
+  "<->"                 { yybegin(DECLARATION); return GrammarTypes.BIDIRECTIONAL; }
+  {ID}                  { yybegin(DECLARATION); return GrammarTypes.ID; }
+  [^]                   { return TokenType.BAD_CHARACTER; }
+}
diff --git a/src/main/grammar/JastAddAspect.flex b/src/main/grammar/JastAddAspect.flex
deleted file mode 100644
index a8b0b39c46ff8a828f81d8f7eee3b4d53130fc35..0000000000000000000000000000000000000000
--- a/src/main/grammar/JastAddAspect.flex
+++ /dev/null
@@ -1,258 +0,0 @@
-package org.jastadd.tooling.aspect.lexer;
-
-import com.intellij.lexer.FlexLexer;
-import com.intellij.psi.tree.IElementType;
-import org.jastadd.tooling.aspect.psi.JastAddAspectTypes;
-import com.intellij.psi.TokenType;
-
-%%
-
-%class JastAddAspectLexer
-%implements FlexLexer
-%unicode
-%function advance
-%type IElementType
-%eof{  return;
-%eof}
-
-%{
-  private int counter = 0;
-%}
-
-WhiteSpace          = [ \t\n\r\f]
-
-// TODO what is /**/ in Java? Is this caputered here?
-SingleLineComment   = "//"  [^\n\r]* (\n | \r | \r\n)
-FormalComment       = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/]
-MultiLineComment    = "/*"  [^*]+ [*]+([^*/][^*]*[*]+)*[/]
-
-
-NotBrace          = ( [^{}/]+ | [/][^{}/*] )*
-
-// from jjt
-DecimalLiteral    = [1-9] [0-9]*
-HexLiteral        = 0 [xX] [0-9a-fA-F]+
-OctalLiteral      = 0 [0-7]*
-IntegerLiteral    = ( {DecimalLiteral} | {HexLiteral} | {OctalLiteral} ) [lL]?
-
-Exponent             = [eE] [+-]? [0-9]+
-FloatingPointLiteral = [0-9]+ "." [0-9]* {Exponent}? [fFdD]?
-                     |        "." [0-9]+ {Exponent}? [fFdD]?
-                     |            [0-9]+ {Exponent}  [fFdD]?
-                     |            [0-9]+ {Exponent}? [fFdD]
-
-CharacterLiteral     = '  ( [^'\\\n\r]  | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) ) '
-StringLiteral        = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) )* \"
-
-Identifier           = [:jletter:] [:jletterdigit:]*
-
-%state JASTADD
-%state EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
-%state CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
-%state LBRACE_ANYTHING_RBRACE
-%state JAVA_IN_PAREN
-%state COLLECTION_DECL
-%state ATTRIBUTE_DEFINITION
-%state LPAREN_ANYTHING_RPAREN
-
-%%
-
-<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
-  {WhiteSpace}+                  { return TokenType.WHITE_SPACE; }
-  {SingleLineComment}            { return JastAddAspectTypes.SINGLE_LINE_COMMENT; }
-  {FormalComment}                { return JastAddAspectTypes.FORMAL_COMMENT; }
-  {MultiLineComment}             { return JastAddAspectTypes.MULTI_LINE_COMMENT; }
-//  "EQ"                           { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; }
-//  "{"                            { yybegin(JAVA); counter = 1;  }
-  "class"                        { yybegin(EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); }
-}
-
-<EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> {
-  "{"                            { yybegin(CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); counter = 1;  }
-  {NotBrace}                     {} // skip over everything
-}
-
-<CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> {
-  {SingleLineComment}            {}
-  {FormalComment}                {}
-  {MultiLineComment}             {}
-  {CharacterLiteral}             {}
-  {StringLiteral}                {}
-  "{"                            { counter++; }
-  "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE; } }
-  {NotBrace}                     {}
-}
-
-<LBRACE_ANYTHING_RBRACE> {
-  {SingleLineComment}            {}
-  {FormalComment}                {}
-  {MultiLineComment}             {}
-  {CharacterLiteral}             {}
-  {StringLiteral}                {}
-  "{"                            { counter++; }
-  "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.LBRACE_ANYTHING_RBRACE; } }
-  {NotBrace}                     {}
-}
-
-<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
-  "abstract"                    { return JastAddAspectTypes.ABSTRACT; }
-//"assert"                      { return JastAddAspectTypes.ASSERT; }
-  "boolean"                     { return JastAddAspectTypes.BOOLEAN; }
-//"break"                       { return JastAddAspectTypes.BREAK; }
-  "byte"                        { return JastAddAspectTypes.BYTE; }
-//"case"                        { return JastAddAspectTypes.CASE; }
-//"catch"                       { return JastAddAspectTypes.CATCH; }
-  "char"                        { return JastAddAspectTypes.CHAR; }
-//"class"                       { return JastAddAspectTypes.CLASS; }
-//"const"                       { return JastAddAspectTypes.CONST; }
-//"continue"                    { return JastAddAspectTypes.CONTINUE; }
-//"default"                     { return JastAddAspectTypes._DEFAULT; }
-//"do"                          { return JastAddAspectTypes.DO; }
-  "double"                      { return JastAddAspectTypes.DOUBLE; }
-//"else"                        { return JastAddAspectTypes.ELSE; }
-//"enum"                        { return JastAddAspectTypes.ENUM; }
-  "extends"                     { return JastAddAspectTypes.EXTENDS; }
-  "false"                       { return JastAddAspectTypes.FALSE; }
-  "final"                       { return JastAddAspectTypes.FINAL; }
-//"finally"                     { return JastAddAspectTypes.FINALLY; }
-  "float"                       { return JastAddAspectTypes.FLOAT; }
-  "for"                         { return JastAddAspectTypes.FOR; }
-//"goto"                        { return JastAddAspectTypes.GOTO; }
-//"if"                          { return JastAddAspectTypes.IF; }
-  "implements"                  { return JastAddAspectTypes.IMPLEMENTS; }
-  "import"                      { return JastAddAspectTypes.IMPORT; }
-  "instanceof"                  { return JastAddAspectTypes.INSTANCEOF; }
-  "int"                         { return JastAddAspectTypes.INT; }
-  "interface"                   { return JastAddAspectTypes.INTERFACE; }
-  "long"                        { return JastAddAspectTypes.LONG; }
-  "native"                      { return JastAddAspectTypes.NATIVE; }
-//"new"                         { return JastAddAspectTypes.NEW; }
-  "null"                        { return JastAddAspectTypes.NULL; }
-//"package"                     { return JastAddAspectTypes.PACKAGE; }
-  "private"                     { return JastAddAspectTypes.PRIVATE; }
-  "protected"                   { return JastAddAspectTypes.PROTECTED; }
-  "public"                      { return JastAddAspectTypes.PUBLIC; }
-//"return"                      { return JastAddAspectTypes.RETURN; }
-  "short"                       { return JastAddAspectTypes.SHORT; }
-  "static"                      { return JastAddAspectTypes.STATIC; }
-  "strictfp"                    { return JastAddAspectTypes.STRICTFP; }
-  "super"                       { return JastAddAspectTypes.SUPER; }
-//"switch"                      { return JastAddAspectTypes.SWITCH; }
-  "synchronized"                { return JastAddAspectTypes.SYNCHRONIZED; }
-//"this"                        { return JastAddAspectTypes.THIS; }
-//"throw"                       { return JastAddAspectTypes.THROW; }
-  "throws"                      { return JastAddAspectTypes.THROWS; }
-  "transient"                   { return JastAddAspectTypes.TRANSIENT; }
-  "true"                        { return JastAddAspectTypes.TRUE; }
-//"try"                         { return JastAddAspectTypes.TRY; }
-  "void"                        { return JastAddAspectTypes.VOID; }
-  "volatile"                    { return JastAddAspectTypes.VOLATILE; }
-//"while"                       { return JastAddAspectTypes.WHILE; }
-
-  // JastAdd
-  "inh"                         { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.INH; }
-  "syn"                         { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.SYN; }
-  "lazy"                        { return JastAddAspectTypes.LAZY; }
-  "rewrite"                     { return JastAddAspectTypes.REWRITE; }
-  "to"                          { return JastAddAspectTypes.TO; }
-  "when"                        { return JastAddAspectTypes.WHEN; }
-  "aspect"                      { return JastAddAspectTypes.ASPECT; }
-  "eq"                          { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.EQUATION; }
-  "circular"                    { return JastAddAspectTypes.CIRCULAR; }
-  "refine"                      { return JastAddAspectTypes.REFINE; }
-  "contributes"                 { return JastAddAspectTypes.CONTRIBUTES; }
-  "each"                        { return JastAddAspectTypes.EACH; }
-  "nta"                         { return JastAddAspectTypes.NTA; }
-  "cache"                       { return JastAddAspectTypes.CACHE; }
-  "uncache"                     { return JastAddAspectTypes.UNCACHE; }
-
-  // TODO this is strangely split in another Token block, check semantics of JJTree file!
-  "coll"                        { yybegin(COLLECTION_DECL); return JastAddAspectTypes.COLL; }
-
-}
-
-<COLLECTION_DECL> {
-  "with"                        { return JastAddAspectTypes.WITH; }
-  "root"                        { return JastAddAspectTypes.ROOT; }
-}
-
-<ATTRIBUTE_DEFINITION> {
-  "{"                           { yybegin(LBRACE_ANYTHING_RBRACE); counter = 1; }
-}
-
-// a semicolon exits the COLLECTION_DECL (because we ignore semicolons in expressions)
-<COLLECTION_DECL, ATTRIBUTE_DEFINITION> {
-  ";"                           { yybegin(YYINITIAL); return JastAddAspectTypes.SEMICOLON; }
-}
-
-<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
-  // LITERALS
-  {IntegerLiteral}              { return JastAddAspectTypes.INTEGER_LITERAL; }
-  {FloatingPointLiteral}        { return JastAddAspectTypes.FLOATING_POINT_LITERAL; }
-  {CharacterLiteral}            { return JastAddAspectTypes.CHARACTER_LITERAL; }
-  {StringLiteral}               { return JastAddAspectTypes.STRING_LITERAL; }
-
-  // IDENTIFIERS
-  {Identifier}                  { return JastAddAspectTypes.IDENTIFIER; }
-
-  // COMBINED TOKENS
-  ".class"                      { return JastAddAspectTypes.DOT_CLASS; }
-
-  // SEPARATORS
-
-  "("                           { return JastAddAspectTypes.LPAREN; }
-  ")"                           { return JastAddAspectTypes.RPAREN; }
-  "{"                           { return JastAddAspectTypes.LBRACE; }
-  "}"                           { return JastAddAspectTypes.RBRACE; }
-  "["                           { return JastAddAspectTypes.LBRACKET; }
-  "]"                           { return JastAddAspectTypes.RBRACKET; }
-
-  ";"                           { return JastAddAspectTypes.SEMICOLON; }
-  ","                           { return JastAddAspectTypes.COMMA; }
-  "."                           { return JastAddAspectTypes.DOT; }
-//"@"                           { return JastAddAspectTypes.AT; }
-
-  // OPERATORS
-  "="                           { return JastAddAspectTypes.ASSIGN; }
-  "<"                           { return JastAddAspectTypes.LT; }
-  "!"                           { return JastAddAspectTypes.BANG; }
-  "~"                           { return JastAddAspectTypes.TILDE; }
-  "?"                           { return JastAddAspectTypes.HOOK; }
-  ":"                           { return JastAddAspectTypes.COLON; }
-  "=="                          { return JastAddAspectTypes.EQ; }
-  "<="                          { return JastAddAspectTypes.LE; }
-  ">="                          { return JastAddAspectTypes.GE; }
-  "!="                          { return JastAddAspectTypes.NE; }
-  "||"                          { return JastAddAspectTypes.SC_OR; }
-  "&&"                          { return JastAddAspectTypes.SC_AND; }
-  "++"                          { return JastAddAspectTypes.INCR; }
-  "--"                          { return JastAddAspectTypes.DECR; }
-  "+"                           { return JastAddAspectTypes.PLUS; }
-  "-"                           { return JastAddAspectTypes.MINUS; }
-  "*"                           { return JastAddAspectTypes.STAR; }
-  "/"                           { return JastAddAspectTypes.SLASH; }
-  "&"                           { return JastAddAspectTypes.BIT_AND; }
-  "|"                           { return JastAddAspectTypes.BIT_OR; }
-  "^"                           { return JastAddAspectTypes.XOR; }
-  "%"                           { return JastAddAspectTypes.REM; }
-  "<<"                          { return JastAddAspectTypes.LSHIFT; }
-  "+="                          { return JastAddAspectTypes.PLUSASSIGN; }
-  "-="                          { return JastAddAspectTypes.MINUSASSIGN; }
-  "*="                          { return JastAddAspectTypes.STARASSIGN; }
-  "/="                          { return JastAddAspectTypes.SLASHASSIGN; }
-  "&="                          { return JastAddAspectTypes.ANDASSIGN; }
-  "|="                          { return JastAddAspectTypes.ORASSIGN; }
-  "^="                          { return JastAddAspectTypes.XORASSIGN; }
-  "%="                          { return JastAddAspectTypes.REMASSIGN; }
-  "<<="                         { return JastAddAspectTypes.LSHIFTASSIGN; }
-  ">>="                         { return JastAddAspectTypes.RSIGNEDSHIFTASSIGN; }
-  ">>>="                        { return JastAddAspectTypes.RUNSIGNEDSHIFTASSIGN; }
-//"..."                         { return JastAddAspectTypes.ELLIPSIS; }
-  "->"                          { return JastAddAspectTypes.ARROW; }
-  "::"                          { return JastAddAspectTypes.DOUBLECOLON; }
-
-  // TODO RUNSIGNEDSHIFT >>> and RSIGNEDSHIFT >> are not parsed
-
-  ">"                           { return JastAddAspectTypes.GT; }
-}
-
diff --git a/src/main/grammar/RelAstGrammar.flex b/src/main/grammar/RelAstGrammar.flex
deleted file mode 100644
index 27f0f9403ce13616436fe42caa257f3d0f39b5ff..0000000000000000000000000000000000000000
--- a/src/main/grammar/RelAstGrammar.flex
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2000-2020 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
-package org.jastadd.tooling.lexer;
-
-import com.intellij.lexer.FlexLexer;
-import com.intellij.psi.tree.IElementType;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-import com.intellij.psi.TokenType;
-
-%%
-
-%class RelAstGrammarLexer
-%implements FlexLexer
-%unicode
-%function advance
-%type IElementType
-%eof{  return;
-%eof}
-
-
-WhiteSpace        = [ ] | \t | \f | \n | \r | \r\n
-ID                = [a-zA-Z$_][a-zA-Z0-9$_]*
-MultiLineComment  = [/][*][^*]+[*]+([^*/][^*]*[*]+)*[/]
-DocComment        = [/][*][*][^*]*[*]+([^*/][^*]*[*]+)*[/]
-SingleLineComment = [/][/] [^\n\r]* (\n | \r | \r\n)
-
-
-%xstate COMMENT
-%state DECLARATION
-
-%%
-
-<DECLARATION> {
-  {WhiteSpace}          { return TokenType.WHITE_SPACE; } // maybe ignore this
-  {MultiLineComment}    { return RelAstGrammarTypes.MULTILINECOMMENT; } // maybe ignore this
-  {DocComment}          { return RelAstGrammarTypes.DOCCOMMENT; } // maybe ignore this
-  {SingleLineComment}   { return RelAstGrammarTypes.SINGLELINECOMMENT; } // maybe ignore this
-}
-
-<YYINITIAL,COMMENT> {
-  {WhiteSpace}+         { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; }
-  {MultiLineComment}    { yybegin(YYINITIAL); return RelAstGrammarTypes.MULTILINECOMMENT; }
-  {DocComment}          { yybegin(YYINITIAL); return RelAstGrammarTypes.DOCCOMMENT; }
-  {SingleLineComment}   { yybegin(YYINITIAL); return RelAstGrammarTypes.SINGLELINECOMMENT; }
-}
-
-<YYINITIAL,DECLARATION> {
-  "abstract"            { yybegin(DECLARATION); return RelAstGrammarTypes.ABSTRACT; }
-  "rel"                 { yybegin(DECLARATION); return RelAstGrammarTypes.REL; }
-  ";"                   { yybegin(COMMENT);     return RelAstGrammarTypes.SCOL; }
-  ":"                   { yybegin(DECLARATION); return RelAstGrammarTypes.COL; }
-  "::="                 { yybegin(DECLARATION); return RelAstGrammarTypes.ASSIGN; }
-  "*"                   { yybegin(DECLARATION); return RelAstGrammarTypes.STAR; }
-  "."                   { yybegin(DECLARATION); return RelAstGrammarTypes.DOT; }
-  ","                   { yybegin(DECLARATION); return RelAstGrammarTypes.COMMA; }
-  "<"                   { yybegin(DECLARATION); return RelAstGrammarTypes.LT; }
-  ">"                   { yybegin(DECLARATION); return RelAstGrammarTypes.GT; }
-  "["                   { yybegin(DECLARATION); return RelAstGrammarTypes.LBRACKET; }
-  "]"                   { yybegin(DECLARATION); return RelAstGrammarTypes.RBRACKET; }
-  "/"                   { yybegin(DECLARATION); return RelAstGrammarTypes.SLASH; }
-  "?"                   { yybegin(DECLARATION); return RelAstGrammarTypes.QUESTION_MARK; }
-  "->"                  { yybegin(DECLARATION); return RelAstGrammarTypes.RIGHT; }
-  "<-"                  { yybegin(DECLARATION); return RelAstGrammarTypes.LEFT; }
-  "<->"                 { yybegin(DECLARATION); return RelAstGrammarTypes.BIDIRECTIONAL; }
-  {ID}                  { yybegin(DECLARATION); return RelAstGrammarTypes.ID; }
-  [^]                   { return TokenType.BAD_CHARACTER; }
-}
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammar.java b/src/main/java/org/jastadd/tooling/RelAstGrammar.java
deleted file mode 100644
index 2b6f58f75be1d4eeb5e6c50133dc59b66b1686e7..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/RelAstGrammar.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.jastadd.tooling;
-
-import com.intellij.lang.Language;
-
-public class RelAstGrammar extends Language {
-
-  public static final RelAstGrammar INSTANCE = new RelAstGrammar();
-
-  private RelAstGrammar() {
-    super("JastAddGrammar");
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarFormattingModelBuilder.java b/src/main/java/org/jastadd/tooling/RelAstGrammarFormattingModelBuilder.java
deleted file mode 100644
index 4424b6000fd05825c5b34416d50c0ce714087111..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarFormattingModelBuilder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.jastadd.tooling;
-
-import com.intellij.formatting.*;
-import com.intellij.lang.ASTNode;
-import com.intellij.openapi.util.TextRange;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.codeStyle.CodeStyleSettings;
-import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
-import com.intellij.psi.tree.TokenSet;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-public class RelAstGrammarFormattingModelBuilder implements FormattingModelBuilder {
-
-  private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) {
-    final CommonCodeStyleSettings commonSettings = settings.getCommonSettings(RelAstGrammar.INSTANCE.getID());
-
-    final TokenSet roleMultiplicityTokens = TokenSet.create(RelAstGrammarTypes.STAR, RelAstGrammarTypes.QUESTION_MARK);
-    final TokenSet relationDirectionTokens = TokenSet.create(RelAstGrammarTypes.LEFT, RelAstGrammarTypes.RIGHT, RelAstGrammarTypes.BIDIRECTIONAL);
-    final TokenSet declarationTokens = TokenSet.create(RelAstGrammarTypes.TYPE_DECL, RelAstGrammarTypes.RELATION);
-
-    return new SpacingBuilder(settings, RelAstGrammar.INSTANCE)
-      .around(RelAstGrammarTypes.ASSIGN).spaceIf(commonSettings.SPACE_AROUND_ASSIGNMENT_OPERATORS)
-      .before(declarationTokens).none()
-      .before(RelAstGrammarTypes.SCOL).spaceIf(commonSettings.SPACE_BEFORE_SEMICOLON)
-      .around(relationDirectionTokens).spaceIf(commonSettings.SPACE_AROUND_RELATIONAL_OPERATORS)
-      .between(RelAstGrammarTypes.COMPONENT, RelAstGrammarTypes.COMPONENT).spaces(1)
-      .around(RelAstGrammarTypes.DOT).none()
-      .before(roleMultiplicityTokens).spaceIf(commonSettings.SPACE_AROUND_UNARY_OPERATOR)
-      .aroundInside(RelAstGrammarTypes.COL, RelAstGrammarTypes.TYPE_DECL).spaceIf(commonSettings.SPACE_AROUND_ADDITIVE_OPERATORS)
-      .aroundInside(RelAstGrammarTypes.COL, RelAstGrammarTypes.COMPONENT).none()
-      .withinPair(RelAstGrammarTypes.LT, RelAstGrammarTypes.GT).spaceIf(commonSettings.SPACE_WITHIN_CAST_PARENTHESES)
-      .withinPair(RelAstGrammarTypes.LBRACKET, RelAstGrammarTypes.RBRACKET).spaceIf(commonSettings.SPACE_WITHIN_BRACKETS)
-      .between(declarationTokens, RelAstGrammarTypes.COMMENT).spaces(1)
-      .afterInside(RelAstGrammarTypes.SLASH, RelAstGrammarTypes.NTA_COMPONENT).none()
-      .beforeInside(RelAstGrammarTypes.SLASH, RelAstGrammarTypes.NTA_COMPONENT).none();
-  }
-
-  @NotNull
-  @Override
-  public FormattingModel createModel(FormattingContext context) {
-    return FormattingModelProvider
-      .createFormattingModelForPsiFile(context.getPsiElement().getContainingFile(),
-        new RelAstGrammarBlock(context.getPsiElement().getNode(),
-          Wrap.createWrap(WrapType.NONE, false),
-          Alignment.createAlignment(),
-          createSpaceBuilder(context.getCodeStyleSettings())),
-        context.getCodeStyleSettings());
-  }
-
-  @Nullable
-  @Override
-  public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) {
-    return null;
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/aspect/Aspect.java b/src/main/java/org/jastadd/tooling/aspect/Aspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..b91b86adce23a5f74c379e93fcad4940520153e2
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/Aspect.java
@@ -0,0 +1,11 @@
+package org.jastadd.tooling.aspect;
+
+public class Aspect extends com.intellij.lang.Language {
+
+  public static final Aspect INSTANCE = new Aspect();
+
+  private Aspect() {
+    super("JastAddAspect");
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectFileType.java b/src/main/java/org/jastadd/tooling/aspect/AspectFileType.java
similarity index 68%
rename from src/main/java/org/jastadd/tooling/aspect/JastAddAspectFileType.java
rename to src/main/java/org/jastadd/tooling/aspect/AspectFileType.java
index ede88303f5adfc9ad4efaf279756af547fb96cc1..cdfd30057acece4fdb07ee4aa50a6860451a5d75 100644
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectFileType.java
+++ b/src/main/java/org/jastadd/tooling/aspect/AspectFileType.java
@@ -1,18 +1,18 @@
 package org.jastadd.tooling.aspect;
 
 import com.intellij.openapi.fileTypes.LanguageFileType;
-import org.jastadd.tooling.JastAddIcons;
+import org.jastadd.tooling.util.JastAddIcons;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 
-public class JastAddAspectFileType extends LanguageFileType {
+public class AspectFileType extends LanguageFileType {
 
-  public static final JastAddAspectFileType INSTANCE = new JastAddAspectFileType();
+  public static final AspectFileType INSTANCE = new AspectFileType();
 
-  private JastAddAspectFileType() {
-    super(JastAddAspectLanguage.INSTANCE);
+  private AspectFileType() {
+    super(Aspect.INSTANCE);
   }
 
   @NotNull
@@ -33,7 +33,6 @@ public class JastAddAspectFileType extends LanguageFileType {
     return "jadd";
   }
 
-
   @Nullable
   @Override
   public Icon getIcon() {
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAttributeFileType.java b/src/main/java/org/jastadd/tooling/aspect/AttributeFileType.java
similarity index 67%
rename from src/main/java/org/jastadd/tooling/aspect/JastAddAttributeFileType.java
rename to src/main/java/org/jastadd/tooling/aspect/AttributeFileType.java
index dd9569ef54a3332cfa9f203ec724b9966c3af964..a1f0720468f90b304f8b2c2e102442b4ca31b0cc 100644
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAttributeFileType.java
+++ b/src/main/java/org/jastadd/tooling/aspect/AttributeFileType.java
@@ -1,18 +1,18 @@
 package org.jastadd.tooling.aspect;
 
 import com.intellij.openapi.fileTypes.LanguageFileType;
-import org.jastadd.tooling.JastAddIcons;
+import org.jastadd.tooling.util.JastAddIcons;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 
-public class JastAddAttributeFileType extends LanguageFileType {
+public class AttributeFileType extends LanguageFileType {
 
-  public static final JastAddAttributeFileType INSTANCE = new JastAddAttributeFileType();
+  public static final AttributeFileType INSTANCE = new AttributeFileType();
 
-  private JastAddAttributeFileType() {
-    super(JastAddAspectLanguage.INSTANCE);
+  private AttributeFileType() {
+    super(Aspect.INSTANCE);
   }
 
   @NotNull
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectElementType.java b/src/main/java/org/jastadd/tooling/aspect/JastAddAspectElementType.java
deleted file mode 100644
index 4c15673a1bc53924ea6d497db6dab32381c17372..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectElementType.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.jastadd.tooling.aspect;
-
-import com.intellij.psi.tree.IElementType;
-import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
-
-public class JastAddAspectElementType extends IElementType {
-
-  public JastAddAspectElementType(@NotNull @NonNls String debugName) {
-    super(debugName, JastAddAspectLanguage.INSTANCE);
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectFile.java b/src/main/java/org/jastadd/tooling/aspect/JastAddAspectFile.java
deleted file mode 100644
index 1d67846a899164b0ac2cc65ffba532c9785baaa0..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectFile.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.jastadd.tooling.aspect;
-
-import com.intellij.extapi.psi.PsiFileBase;
-  import com.intellij.openapi.fileTypes.FileType;
-  import com.intellij.psi.FileViewProvider;
-  import org.jetbrains.annotations.NotNull;
-
-public class JastAddAspectFile extends PsiFileBase {
-
-  public JastAddAspectFile(@NotNull FileViewProvider viewProvider) {
-    super(viewProvider, JastAddAspectLanguage.INSTANCE);
-  }
-
-  @NotNull
-  @Override
-  public FileType getFileType() {
-    return JastAddAttributeFileType.INSTANCE;
-  }
-
-  @Override
-  public String toString() {
-    return "JastAdd Attribute Aspect File";
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectLanguage.java b/src/main/java/org/jastadd/tooling/aspect/JastAddAspectLanguage.java
deleted file mode 100644
index 400caa1ad201c832052d134a4b027219130a248e..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectLanguage.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.jastadd.tooling.aspect;
-
-import com.intellij.lang.Language;
-
-public class JastAddAspectLanguage extends Language {
-
-  public static final JastAddAspectLanguage INSTANCE = new JastAddAspectLanguage();
-
-  private JastAddAspectLanguage() {
-    super("JastAddAspect");
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/aspect/lexer/AspectLexerAdapter.java b/src/main/java/org/jastadd/tooling/aspect/lexer/AspectLexerAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..19590233648617c224cea2e91b32bd2bf0635f0b
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/lexer/AspectLexerAdapter.java
@@ -0,0 +1,11 @@
+package org.jastadd.tooling.aspect.lexer;
+
+import com.intellij.lexer.FlexAdapter;
+
+public class AspectLexerAdapter extends FlexAdapter {
+
+  public AspectLexerAdapter() {
+    super(new AspectLexer(null));
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/lexer/JastAddAspectLexerAdapter.java b/src/main/java/org/jastadd/tooling/aspect/lexer/JastAddAspectLexerAdapter.java
deleted file mode 100644
index d87f6a89665a4c361ed7143f574f6729132ca700..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/aspect/lexer/JastAddAspectLexerAdapter.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.jastadd.tooling.aspect.lexer;
-
-import com.intellij.lexer.FlexAdapter;
-
-public class JastAddAspectLexerAdapter extends FlexAdapter {
-
-  public JastAddAspectLexerAdapter() {
-    super(new JastAddAspectLexer(null));
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectParserDefinition.java b/src/main/java/org/jastadd/tooling/aspect/parser/AspectParserDefinition.java
similarity index 69%
rename from src/main/java/org/jastadd/tooling/aspect/JastAddAspectParserDefinition.java
rename to src/main/java/org/jastadd/tooling/aspect/parser/AspectParserDefinition.java
index 8e9ce5c8b187dc668deca297009558e10789506d..55c9f55c72f05518bbe6b82ea84f161d091ce1f0 100644
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectParserDefinition.java
+++ b/src/main/java/org/jastadd/tooling/aspect/parser/AspectParserDefinition.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling.aspect;
+package org.jastadd.tooling.aspect.parser;
 
 import com.intellij.lang.ASTNode;
 import com.intellij.lang.ParserDefinition;
@@ -11,23 +11,24 @@ import com.intellij.psi.PsiFile;
 import com.intellij.psi.TokenType;
 import com.intellij.psi.tree.IFileElementType;
 import com.intellij.psi.tree.TokenSet;
-import org.jastadd.tooling.aspect.lexer.JastAddAspectLexerAdapter;
-import org.jastadd.tooling.aspect.parser.JastAddAspectParser;
-import org.jastadd.tooling.aspect.psi.JastAddAspectTypes;
+import org.jastadd.tooling.aspect.Aspect;
+import org.jastadd.tooling.aspect.psi.AspectFile;
+import org.jastadd.tooling.aspect.lexer.AspectLexerAdapter;
+import org.jastadd.tooling.aspect.psi.AspectTypes;
 import org.jetbrains.annotations.NotNull;
 
-public class JastAddAspectParserDefinition implements ParserDefinition {
+public class AspectParserDefinition implements ParserDefinition {
 
   public static final TokenSet WHITE_SPACES = TokenSet.create(TokenType.WHITE_SPACE);
-  public static final TokenSet COMMENTS = TokenSet.create(JastAddAspectTypes.SINGLE_LINE_COMMENT, JastAddAspectTypes.MULTI_LINE_COMMENT, JastAddAspectTypes.FORMAL_COMMENT);
-  public static final TokenSet STRING_LITERALS = TokenSet.create(JastAddAspectTypes.STRING_LITERAL);
+  public static final TokenSet COMMENTS = TokenSet.create(AspectTypes.SINGLE_LINE_COMMENT, AspectTypes.MULTI_LINE_COMMENT, AspectTypes.FORMAL_COMMENT);
+  public static final TokenSet STRING_LITERALS = TokenSet.create(AspectTypes.STRING_LITERAL);
 
-  public static final IFileElementType FILE = new IFileElementType(JastAddAspectLanguage.INSTANCE);
+  public static final IFileElementType FILE = new IFileElementType(Aspect.INSTANCE);
 
   @NotNull
   @Override
   public Lexer createLexer(Project project) {
-    return new JastAddAspectLexerAdapter();
+    return new AspectLexerAdapter();
   }
 
   @NotNull
@@ -61,7 +62,7 @@ public class JastAddAspectParserDefinition implements ParserDefinition {
 
   @Override
   public PsiFile createFile(FileViewProvider viewProvider) {
-    return new JastAddAspectFile(viewProvider);
+    return new AspectFile(viewProvider);
   }
 
   @Override
@@ -72,7 +73,7 @@ public class JastAddAspectParserDefinition implements ParserDefinition {
   @NotNull
   @Override
   public PsiElement createElement(ASTNode node) {
-    return JastAddAspectTypes.Factory.createElement(node);
+    return AspectTypes.Factory.createElement(node);
   }
 
 }
diff --git a/src/main/java/org/jastadd/tooling/aspect/psi/AspectElementType.java b/src/main/java/org/jastadd/tooling/aspect/psi/AspectElementType.java
new file mode 100644
index 0000000000000000000000000000000000000000..35f355de33528986fe40e6b0e0428dd3d16f73b5
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/AspectElementType.java
@@ -0,0 +1,14 @@
+package org.jastadd.tooling.aspect.psi;
+
+import com.intellij.psi.tree.IElementType;
+import org.jastadd.tooling.aspect.Aspect;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+public class AspectElementType extends IElementType {
+
+  public AspectElementType(@NotNull @NonNls String debugName) {
+    super(debugName, Aspect.INSTANCE);
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/psi/AspectFile.java b/src/main/java/org/jastadd/tooling/aspect/psi/AspectFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..79158f2435b9b5c7b382945f78cfe1778c8e99cb
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/AspectFile.java
@@ -0,0 +1,27 @@
+package org.jastadd.tooling.aspect.psi;
+
+import com.intellij.extapi.psi.PsiFileBase;
+  import com.intellij.openapi.fileTypes.FileType;
+  import com.intellij.psi.FileViewProvider;
+import org.jastadd.tooling.aspect.Aspect;
+import org.jastadd.tooling.aspect.AttributeFileType;
+import org.jetbrains.annotations.NotNull;
+
+public class AspectFile extends PsiFileBase {
+
+  public AspectFile(@NotNull FileViewProvider viewProvider) {
+    super(viewProvider, Aspect.INSTANCE);
+  }
+
+  @NotNull
+  @Override
+  public FileType getFileType() {
+    return AttributeFileType.INSTANCE;
+  }
+
+  @Override
+  public String toString() {
+    return "JastAdd Attribute Aspect File";
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectTokenType.java b/src/main/java/org/jastadd/tooling/aspect/psi/AspectTokenType.java
similarity index 50%
rename from src/main/java/org/jastadd/tooling/aspect/JastAddAspectTokenType.java
rename to src/main/java/org/jastadd/tooling/aspect/psi/AspectTokenType.java
index 54d2601f7a6bb0e21368b9761d7ca3947d353382..5bd739cc8f1a3a8dd05d19f19af7defedf2e4406 100644
--- a/src/main/java/org/jastadd/tooling/aspect/JastAddAspectTokenType.java
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/AspectTokenType.java
@@ -1,13 +1,14 @@
-package org.jastadd.tooling.aspect;
+package org.jastadd.tooling.aspect.psi;
 
 import com.intellij.psi.tree.IElementType;
+import org.jastadd.tooling.aspect.Aspect;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 
-public class JastAddAspectTokenType extends IElementType {
+public class AspectTokenType extends IElementType {
 
-  public JastAddAspectTokenType(@NotNull @NonNls String debugName) {
-    super(debugName, JastAddAspectLanguage.INSTANCE);
+  public AspectTokenType(@NotNull @NonNls String debugName) {
+    super(debugName, Aspect.INSTANCE);
   }
 
   @Override
diff --git a/src/main/java/org/jastadd/tooling/grammar/Grammar.java b/src/main/java/org/jastadd/tooling/grammar/Grammar.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6865ecb5aa221dcb536e8fc5be71f5268e7a827
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/Grammar.java
@@ -0,0 +1,11 @@
+package org.jastadd.tooling.grammar;
+
+public class Grammar extends com.intellij.lang.Language {
+
+  public static final Grammar INSTANCE = new Grammar();
+
+  private Grammar() {
+    super("JastAddGrammar");
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarAnnotator.java b/src/main/java/org/jastadd/tooling/grammar/GrammarAnnotator.java
similarity index 79%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarAnnotator.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarAnnotator.java
index 91f4e0c4dde3bfd351bda7a7afaa8f604907f95f..a64502800b7373ca891c1fed67443f82d87de52a 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarAnnotator.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarAnnotator.java
@@ -1,17 +1,16 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.codeInspection.ProblemHighlightType;
 import com.intellij.lang.annotation.AnnotationHolder;
-import com.intellij.lang.annotation.Annotator;
 import com.intellij.lang.annotation.HighlightSeverity;
 import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
 import com.intellij.psi.PsiElement;
-import org.jastadd.tooling.psi.RelAstGrammarComponent;
-import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarComponent;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarAnnotator implements Annotator {
+public class GrammarAnnotator implements com.intellij.lang.annotation.Annotator {
 
   @Override
   public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) {
@@ -26,13 +25,13 @@ public class RelAstGrammarAnnotator implements Annotator {
             .highlightType(ProblemHighlightType.WEAK_WARNING)
             .textAttributes(DefaultLanguageHighlighterColors.HIGHLIGHTED_REFERENCE)
             .tooltip("When the name of a component is the same as its type, it can be omitted.")
-            .withFix(new RelAstGrammarRemoveRedundantComponentNameFix(component))
+            .withFix(new GrammarRemoveRedundantComponentNameFix(component))
             .create();
         }
       }
     } else if (element instanceof RelAstGrammarTypeReference) {
       RelAstGrammarTypeReference reference = (RelAstGrammarTypeReference) element;
-      if (RelAstGrammarUtil.findTypeDecl(element.getProject(), reference.getName()).isEmpty()) {
+      if (GrammarUtil.findTypeDecl(element.getProject(), reference.getName()).isEmpty()) {
         holder.newAnnotation(HighlightSeverity.ERROR, "Undefined reference")
           .range(element.getTextRange())
           .highlightType(ProblemHighlightType.ERROR)
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarBlock.java b/src/main/java/org/jastadd/tooling/grammar/GrammarBlock.java
similarity index 60%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarBlock.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarBlock.java
index 7aca9c69078cb3d4426a34cb79a3f0bb9294bd76..825a9e6d4610a05960ed3365266e98d466bf668b 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarBlock.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarBlock.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.formatting.*;
@@ -11,23 +11,23 @@ import org.jetbrains.annotations.Nullable;
 import java.util.ArrayList;
 import java.util.List;
 
-public class RelAstGrammarBlock extends AbstractBlock {
+public class GrammarBlock extends AbstractBlock {
 
   private final SpacingBuilder spacingBuilder;
 
-  protected RelAstGrammarBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment,
-                               SpacingBuilder spacingBuilder) {
+  protected GrammarBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment,
+                         SpacingBuilder spacingBuilder) {
     super(node, wrap, alignment);
     this.spacingBuilder = spacingBuilder;
   }
 
   @Override
-  protected List<Block> buildChildren() {
-    List<Block> blocks = new ArrayList<>();
+  protected List<com.intellij.formatting.Block> buildChildren() {
+    List<com.intellij.formatting.Block> blocks = new ArrayList<>();
     ASTNode child = myNode.getFirstChildNode();
     while (child != null) {
       if (child.getElementType() != TokenType.WHITE_SPACE) {
-        Block block = new RelAstGrammarBlock(child, Wrap.createWrap(WrapType.NONE, false), Alignment.createAlignment(),
+        com.intellij.formatting.Block block = new GrammarBlock(child, Wrap.createWrap(WrapType.NONE, false), Alignment.createAlignment(),
           spacingBuilder);
         blocks.add(block);
       }
@@ -43,7 +43,7 @@ public class RelAstGrammarBlock extends AbstractBlock {
 
   @Nullable
   @Override
-  public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
+  public Spacing getSpacing(@Nullable com.intellij.formatting.Block child1, @NotNull com.intellij.formatting.Block child2) {
     return spacingBuilder.getSpacing(this, child1, child2);
   }
 
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java b/src/main/java/org/jastadd/tooling/grammar/GrammarChooseByNameContributor.java
similarity index 67%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarChooseByNameContributor.java
index 51ad305b136d8b42198ff2993a318f10ebafeeb7..61f5d1a6fdecc4c0edfd3fd7690c218e4092538f 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarChooseByNameContributor.java
@@ -1,20 +1,19 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
-import com.intellij.navigation.ChooseByNameContributor;
 import com.intellij.navigation.NavigationItem;
 import com.intellij.openapi.project.Project;
-import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class RelAstGrammarChooseByNameContributor implements ChooseByNameContributor {
+public class GrammarChooseByNameContributor implements com.intellij.navigation.ChooseByNameContributor {
 
   @NotNull
   @Override
   public String @NotNull [] getNames(Project project, boolean includeNonProjectItems) {
-    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project);
+    List<RelAstGrammarTypeDecl> typeDecls = GrammarUtil.findTypeDecl(project);
     List<String> names = new ArrayList<>(typeDecls.size());
     for (RelAstGrammarTypeDecl typeDecl : typeDecls) {
       if (typeDecl.getName() != null && typeDecl.getName().length() > 0) {
@@ -28,7 +27,7 @@ public class RelAstGrammarChooseByNameContributor implements ChooseByNameContrib
   @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);
+    List<RelAstGrammarTypeDecl> typeDecls = GrammarUtil.findTypeDecl(project, name);
     return typeDecls.toArray(new NavigationItem[0]);
   }
 
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCodeStyleSettings.java b/src/main/java/org/jastadd/tooling/grammar/GrammarCodeStyleSettings.java
similarity index 50%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarCodeStyleSettings.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarCodeStyleSettings.java
index c531ee6ff2af2ed2ed92661dc02d699e24464320..730401c71cf0dde4081192f755bf330eca46c01b 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCodeStyleSettings.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarCodeStyleSettings.java
@@ -1,11 +1,11 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.psi.codeStyle.CodeStyleSettings;
   import com.intellij.psi.codeStyle.CustomCodeStyleSettings;
 
-public class RelAstGrammarCodeStyleSettings extends CustomCodeStyleSettings {
+public class GrammarCodeStyleSettings extends CustomCodeStyleSettings {
 
-  public RelAstGrammarCodeStyleSettings(CodeStyleSettings settings) {
+  public GrammarCodeStyleSettings(CodeStyleSettings settings) {
     super("RelAstGrammarCodeStyleSettings", settings);
   }
 
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCodeStyleSettingsProvider.java b/src/main/java/org/jastadd/tooling/grammar/GrammarCodeStyleSettingsProvider.java
similarity index 85%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarCodeStyleSettingsProvider.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarCodeStyleSettingsProvider.java
index ed57139d1595a5e95f09b8ecc25a0d465d29cbb1..1f5150ade7e64e6a74b1d4e05f5a188c12dc9e5c 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCodeStyleSettingsProvider.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarCodeStyleSettingsProvider.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.application.options.CodeStyleAbstractConfigurable;
   import com.intellij.application.options.CodeStyleAbstractPanel;
@@ -10,11 +10,11 @@ import com.intellij.application.options.CodeStyleAbstractConfigurable;
   import org.jetbrains.annotations.NotNull;
   import org.jetbrains.annotations.Nullable;
 
-public class RelAstGrammarCodeStyleSettingsProvider extends CodeStyleSettingsProvider {
+public class GrammarCodeStyleSettingsProvider extends CodeStyleSettingsProvider {
 
   @Override
   public CustomCodeStyleSettings createCustomSettings(CodeStyleSettings settings) {
-    return new RelAstGrammarCodeStyleSettings(settings);
+    return new GrammarCodeStyleSettings(settings);
   }
 
   @Nullable
@@ -36,7 +36,7 @@ public class RelAstGrammarCodeStyleSettingsProvider extends CodeStyleSettingsPro
   private static class SimpleCodeStyleMainPanel extends TabbedLanguageCodeStylePanel {
 
     public SimpleCodeStyleMainPanel(CodeStyleSettings currentSettings, CodeStyleSettings settings) {
-      super(RelAstGrammar.INSTANCE, currentSettings, settings);
+      super(Grammar.INSTANCE, currentSettings, settings);
     }
 
   }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarColorSettingsPage.java b/src/main/java/org/jastadd/tooling/grammar/GrammarColorSettingsPage.java
similarity index 50%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarColorSettingsPage.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarColorSettingsPage.java
index 3300b1e2eec8a37f3118321d945ffb65c93a020b..dd5ee32d608935199ff563f6d51b997c1a8069cf 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarColorSettingsPage.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarColorSettingsPage.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.openapi.editor.colors.TextAttributesKey;
@@ -6,33 +6,34 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter;
 import com.intellij.openapi.options.colors.AttributesDescriptor;
 import com.intellij.openapi.options.colors.ColorDescriptor;
 import com.intellij.openapi.options.colors.ColorSettingsPage;
+import org.jastadd.tooling.util.JastAddIcons;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.util.Map;
 
-public class RelAstGrammarColorSettingsPage implements ColorSettingsPage {
+public class GrammarColorSettingsPage implements ColorSettingsPage {
 
   private static final AttributesDescriptor[] DESCRIPTORS = new AttributesDescriptor[]{
 
-    new AttributesDescriptor("Keyword", RelAstGrammarSyntaxHighlighter.KEYWORD),
-    new AttributesDescriptor("Production Rule Symbol", RelAstGrammarSyntaxHighlighter.ASSIGN),
-    new AttributesDescriptor("Relation Direction", RelAstGrammarSyntaxHighlighter.RELATON_DIR),
-    new AttributesDescriptor("Superclass/Component Name", RelAstGrammarSyntaxHighlighter.COL),
-    new AttributesDescriptor("Comma", RelAstGrammarSyntaxHighlighter.COMMA),
-    new AttributesDescriptor("Documentation Comment", RelAstGrammarSyntaxHighlighter.DOCCOMMENT),
-    new AttributesDescriptor("Namespace Qualifier Dot", RelAstGrammarSyntaxHighlighter.DOT),
-    new AttributesDescriptor("Identifier", RelAstGrammarSyntaxHighlighter.ID),
-    new AttributesDescriptor("Terminal Symbol Bracket", RelAstGrammarSyntaxHighlighter.ANGLE_BRACKET),
-    new AttributesDescriptor("Block Comment", RelAstGrammarSyntaxHighlighter.MULTILINECOMMENT),
-    new AttributesDescriptor("0..1 Multiplicity", RelAstGrammarSyntaxHighlighter.QUESTION_MARK),
-    new AttributesDescriptor("Optional Bracket", RelAstGrammarSyntaxHighlighter.BRACKET),
-    new AttributesDescriptor("Semicolon", RelAstGrammarSyntaxHighlighter.SCOL),
-    new AttributesDescriptor("Line Comment", RelAstGrammarSyntaxHighlighter.SINGLELINECOMMENT),
-    new AttributesDescriptor("NTA Bracket", RelAstGrammarSyntaxHighlighter.SLASH),
-    new AttributesDescriptor("Star Multiplicity", RelAstGrammarSyntaxHighlighter.STAR),
-    new AttributesDescriptor("Bad Value", RelAstGrammarSyntaxHighlighter.BAD_CHARACTER)
+    new AttributesDescriptor("Keyword", GrammarSyntaxHighlighter.KEYWORD),
+    new AttributesDescriptor("Production Rule Symbol", GrammarSyntaxHighlighter.ASSIGN),
+    new AttributesDescriptor("Relation Direction", GrammarSyntaxHighlighter.RELATON_DIR),
+    new AttributesDescriptor("Superclass/Component Name", GrammarSyntaxHighlighter.COL),
+    new AttributesDescriptor("Comma", GrammarSyntaxHighlighter.COMMA),
+    new AttributesDescriptor("Documentation Comment", GrammarSyntaxHighlighter.DOCCOMMENT),
+    new AttributesDescriptor("Namespace Qualifier Dot", GrammarSyntaxHighlighter.DOT),
+    new AttributesDescriptor("Identifier", GrammarSyntaxHighlighter.ID),
+    new AttributesDescriptor("Terminal Symbol Bracket", GrammarSyntaxHighlighter.ANGLE_BRACKET),
+    new AttributesDescriptor("Block Comment", GrammarSyntaxHighlighter.MULTILINECOMMENT),
+    new AttributesDescriptor("0..1 Multiplicity", GrammarSyntaxHighlighter.QUESTION_MARK),
+    new AttributesDescriptor("Optional Bracket", GrammarSyntaxHighlighter.BRACKET),
+    new AttributesDescriptor("Semicolon", GrammarSyntaxHighlighter.SCOL),
+    new AttributesDescriptor("Line Comment", GrammarSyntaxHighlighter.SINGLELINECOMMENT),
+    new AttributesDescriptor("NTA Bracket", GrammarSyntaxHighlighter.SLASH),
+    new AttributesDescriptor("Star Multiplicity", GrammarSyntaxHighlighter.STAR),
+    new AttributesDescriptor("Bad Value", GrammarSyntaxHighlighter.BAD_CHARACTER)
   };
 
   @Nullable
@@ -44,7 +45,7 @@ public class RelAstGrammarColorSettingsPage implements ColorSettingsPage {
   @NotNull
   @Override
   public SyntaxHighlighter getHighlighter() {
-    return new RelAstGrammarSyntaxHighlighter();
+    return new GrammarSyntaxHighlighter();
   }
 
   @NotNull
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCommenter.java b/src/main/java/org/jastadd/tooling/grammar/GrammarCommenter.java
similarity index 85%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarCommenter.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarCommenter.java
index 7196de88c2554631cc7bdb7961aca871142d5bd2..641e230a25666067ff16e3a5af765098ff2e1be0 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCommenter.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarCommenter.java
@@ -1,10 +1,10 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.lang.Commenter;
   import org.jetbrains.annotations.Nullable;
 
-public class RelAstGrammarCommenter implements Commenter {
+public class GrammarCommenter implements Commenter {
 
   @Nullable
   @Override
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java b/src/main/java/org/jastadd/tooling/grammar/GrammarCompletionContributor.java
similarity index 77%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarCompletionContributor.java
index e871cccf11540cb21c3808b1413e6e78dcb4bece..86de3833f8575b8671122acd4cec7032db2adf42 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarCompletionContributor.java
@@ -1,29 +1,30 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.codeInsight.completion.*;
 import com.intellij.codeInsight.lookup.LookupElementBuilder;
 import com.intellij.patterns.PlatformPatterns;
 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.jastadd.tooling.util.JastAddIcons;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+import org.jastadd.tooling.grammar.psi.GrammarElementFactory;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarCompletionContributor extends CompletionContributor {
+public class GrammarCompletionContributor extends CompletionContributor {
 
   public static final String COMPLETION_ELEMENT_SUFFIX = "IntellijIdeaRulezzz";
 
-  public RelAstGrammarCompletionContributor() {
+  public GrammarCompletionContributor() {
 
     // add completion in definition of relations
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).afterLeaf("rel", "<->", "->", "<-"),
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID).afterLeaf("rel", "<->", "->", "<-"),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
                                    @NotNull ProcessingContext context,
                                    @NotNull CompletionResultSet resultSet) {
-          for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
-            RelAstGrammarTypeReference ref = RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName());
+          for (RelAstGrammarTypeDecl decl : GrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
+            RelAstGrammarTypeReference ref = GrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName());
             resultSet.addElement(LookupElementBuilder.create(ref).withIcon(JastAddIcons.FILE).withTypeText(decl.getContainingFile().getName()));
           }
         }
@@ -31,10 +32,10 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     );
 
     // add "* ", "? " after REL ID DOT ID
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID)
         .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(GrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
@@ -48,10 +49,10 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     );
     // add "*", "?" after <-  ID DOT ID
     // add "*", "?" after <-> ID DOT ID
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID)
         .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(GrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("<-", "<->"))),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
@@ -64,10 +65,10 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
       }
     );
     // add " -> ", " <-> " after REL ID DOT ID <SPACE>
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID)
+        .afterLeaf(PlatformPatterns.psiElement(GrammarTypes.ID))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf("."))
-        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(GrammarTypes.ID))))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel")))),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
@@ -80,11 +81,11 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     );
     // add " -> ", " <-> " after REL ID DOT ID * <SPACE>
     // add " -> ", " <-> " after REL ID DOT ID ? <SPACE>
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID)
         .afterLeaf("?", "*")
-        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(GrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(".")))
-        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(GrammarTypes.ID)))))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))))),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
@@ -98,7 +99,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     // add "." after REL ID
     // add "." after <-> ID
     // add "." after <- ID
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID)
         .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<>() {
@@ -111,8 +112,8 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
       }
     );
     // add " <- " after REL ID <SPACE>
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(GrammarTypes.ID)
+        .afterLeaf(PlatformPatterns.psiElement(GrammarTypes.ID))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel")),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarFileType.java b/src/main/java/org/jastadd/tooling/grammar/GrammarFileType.java
similarity index 66%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarFileType.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarFileType.java
index 0b3421103291558982981e730849333720de8d66..f73d87b0c6962a3680f8ba96b2315505b2ce5b8b 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarFileType.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarFileType.java
@@ -1,17 +1,18 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.openapi.fileTypes.LanguageFileType;
+import org.jastadd.tooling.util.JastAddIcons;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 
-public class RelAstGrammarFileType extends LanguageFileType {
+public class GrammarFileType extends LanguageFileType {
 
-  public static final RelAstGrammarFileType INSTANCE = new RelAstGrammarFileType();
+  public static final GrammarFileType INSTANCE = new GrammarFileType();
 
-  private RelAstGrammarFileType() {
-    super(RelAstGrammar.INSTANCE);
+  private GrammarFileType() {
+    super(Grammar.INSTANCE);
   }
 
   @NotNull
@@ -32,7 +33,6 @@ public class RelAstGrammarFileType extends LanguageFileType {
     return "relast";
   }
 
-
   @Nullable
   @Override
   public Icon getIcon() {
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java b/src/main/java/org/jastadd/tooling/grammar/GrammarFindUsageProvider.java
similarity index 74%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarFindUsageProvider.java
index 4133679bf7727239aa2a36d69a0d4ed09d678e8d..0cad9c8561c15f80cb11b57c0054394a1293d00c 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarFindUsageProvider.java
@@ -1,25 +1,25 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.lang.cacheBuilder.DefaultWordsScanner;
 import com.intellij.lang.cacheBuilder.WordsScanner;
 import com.intellij.lang.findUsages.FindUsagesProvider;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.tree.TokenSet;
-import org.jastadd.tooling.lexer.RelAstGrammarFlexAdapter;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.grammar.lexer.GrammarLexerAdapter;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class RelAstGrammarFindUsageProvider implements FindUsagesProvider {
+public class GrammarFindUsageProvider implements FindUsagesProvider {
 
   @Nullable
   @Override
   public WordsScanner getWordsScanner() {
     // TODO comments are not working
-    return new DefaultWordsScanner(new RelAstGrammarFlexAdapter(),
-      TokenSet.create(RelAstGrammarTypes.ID),
-      TokenSet.create(RelAstGrammarTypes.MULTILINECOMMENT, RelAstGrammarTypes.DOCCOMMENT, RelAstGrammarTypes.SINGLELINECOMMENT),
+    return new DefaultWordsScanner(new GrammarLexerAdapter(),
+      TokenSet.create(GrammarTypes.ID),
+      TokenSet.create(GrammarTypes.MULTILINECOMMENT, GrammarTypes.DOCCOMMENT, GrammarTypes.SINGLELINECOMMENT),
       TokenSet.EMPTY);
   }
 
diff --git a/src/main/java/org/jastadd/tooling/grammar/GrammarFormattingModelBuilder.java b/src/main/java/org/jastadd/tooling/grammar/GrammarFormattingModelBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..e945b6fc3f35edab6b53be3de5806fb18ef02a05
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarFormattingModelBuilder.java
@@ -0,0 +1,58 @@
+package org.jastadd.tooling.grammar;
+
+import com.intellij.formatting.*;
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
+import com.intellij.psi.tree.TokenSet;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class GrammarFormattingModelBuilder implements FormattingModelBuilder {
+
+  private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) {
+    final CommonCodeStyleSettings commonSettings = settings.getCommonSettings(Grammar.INSTANCE.getID());
+
+    final TokenSet roleMultiplicityTokens = TokenSet.create(GrammarTypes.STAR, GrammarTypes.QUESTION_MARK);
+    final TokenSet relationDirectionTokens = TokenSet.create(GrammarTypes.LEFT, GrammarTypes.RIGHT, GrammarTypes.BIDIRECTIONAL);
+    final TokenSet declarationTokens = TokenSet.create(GrammarTypes.TYPE_DECL, GrammarTypes.RELATION);
+
+    return new SpacingBuilder(settings, Grammar.INSTANCE)
+      .around(GrammarTypes.ASSIGN).spaceIf(commonSettings.SPACE_AROUND_ASSIGNMENT_OPERATORS)
+      .before(declarationTokens).none()
+      .before(GrammarTypes.SCOL).spaceIf(commonSettings.SPACE_BEFORE_SEMICOLON)
+      .around(relationDirectionTokens).spaceIf(commonSettings.SPACE_AROUND_RELATIONAL_OPERATORS)
+      .between(GrammarTypes.COMPONENT, GrammarTypes.COMPONENT).spaces(1)
+      .around(GrammarTypes.DOT).none()
+      .before(roleMultiplicityTokens).spaceIf(commonSettings.SPACE_AROUND_UNARY_OPERATOR)
+      .aroundInside(GrammarTypes.COL, GrammarTypes.TYPE_DECL).spaceIf(commonSettings.SPACE_AROUND_ADDITIVE_OPERATORS)
+      .aroundInside(GrammarTypes.COL, GrammarTypes.COMPONENT).none()
+      .withinPair(GrammarTypes.LT, GrammarTypes.GT).spaceIf(commonSettings.SPACE_WITHIN_CAST_PARENTHESES)
+      .withinPair(GrammarTypes.LBRACKET, GrammarTypes.RBRACKET).spaceIf(commonSettings.SPACE_WITHIN_BRACKETS)
+      .between(declarationTokens, GrammarTypes.COMMENT).spaces(1)
+      .afterInside(GrammarTypes.SLASH, GrammarTypes.NTA_COMPONENT).none()
+      .beforeInside(GrammarTypes.SLASH, GrammarTypes.NTA_COMPONENT).none();
+  }
+
+  @NotNull
+  @Override
+  public FormattingModel createModel(FormattingContext context) {
+    return FormattingModelProvider
+      .createFormattingModelForPsiFile(context.getPsiElement().getContainingFile(),
+        new GrammarBlock(context.getPsiElement().getNode(),
+          Wrap.createWrap(WrapType.NONE, false),
+          Alignment.createAlignment(),
+          createSpaceBuilder(context.getCodeStyleSettings())),
+        context.getCodeStyleSettings());
+  }
+
+  @Nullable
+  @Override
+  public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) {
+    return null;
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarJavaAnnotator.java b/src/main/java/org/jastadd/tooling/grammar/GrammarJavaAnnotator.java
similarity index 89%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarJavaAnnotator.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarJavaAnnotator.java
index 5beaeff927d825c7577c940e5c12e87982db8fda..3b409aa6321bb4b4955d7835a7682d335c5bf5a9 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarJavaAnnotator.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarJavaAnnotator.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.codeInspection.ProblemHighlightType;
@@ -10,16 +10,15 @@ import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.javadoc.PsiDocComment;
 import com.intellij.psi.javadoc.PsiDocTag;
-import org.jastadd.tooling.psi.RelAstGrammarComponent;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Arrays;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-import static org.jastadd.tooling.RelAstGrammarUtil.asReferenceToTypeDecl;
+import static org.jastadd.tooling.grammar.GrammarUtil.asReferenceToTypeDecl;
 
-public class RelAstGrammarJavaAnnotator implements Annotator {
+public class GrammarJavaAnnotator implements Annotator {
 
   @Override
   public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) {
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarLanguageCodeStyleSettingsProvider.java b/src/main/java/org/jastadd/tooling/grammar/GrammarLanguageCodeStyleSettingsProvider.java
similarity index 90%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarLanguageCodeStyleSettingsProvider.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarLanguageCodeStyleSettingsProvider.java
index 51e717ef3df6c37af8c2787031e6d4d48a484c97..49212b1eb271f9992e2554bfbf43997e6f5f85f6 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarLanguageCodeStyleSettingsProvider.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarLanguageCodeStyleSettingsProvider.java
@@ -1,16 +1,15 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
-import com.intellij.lang.Language;
 import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable;
 import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider {
+public class GrammarLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider {
 
   @NotNull
   @Override
-  public Language getLanguage() {
-    return RelAstGrammar.INSTANCE;
+  public com.intellij.lang.Language getLanguage() {
+    return Grammar.INSTANCE;
   }
 
   @Override
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarLineMarkerProvider.java b/src/main/java/org/jastadd/tooling/grammar/GrammarLineMarkerProvider.java
similarity index 74%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarLineMarkerProvider.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarLineMarkerProvider.java
index 1e8700833a57def53b05c01b1e6b3e19dddec361..47b14ea988e752a37daf072021548c005a0aefb2 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarLineMarkerProvider.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarLineMarkerProvider.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
 import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
@@ -6,16 +6,17 @@ import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiIdentifier;
-import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.util.JastAddIcons;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 
-import static org.jastadd.tooling.RelAstGrammarUtil.asReferenceToTypeDecl;
+import static org.jastadd.tooling.grammar.GrammarUtil.asReferenceToTypeDecl;
 
-public class RelAstGrammarLineMarkerProvider extends RelatedItemLineMarkerProvider {
+public class GrammarLineMarkerProvider extends RelatedItemLineMarkerProvider {
 
   @Override
   protected void collectNavigationMarkers(@NotNull PsiElement element,
@@ -32,7 +33,7 @@ public class RelAstGrammarLineMarkerProvider extends RelatedItemLineMarkerProvid
     }
 
     // Get the list of typeDecls for given key
-    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(element.getProject(), classOptional.get().getName());
+    List<RelAstGrammarTypeDecl> typeDecls = GrammarUtil.findTypeDecl(element.getProject(), classOptional.get().getName());
     if (!typeDecls.isEmpty()) {
       NavigationGutterIconBuilder<PsiElement> builder =
         NavigationGutterIconBuilder.create(JastAddIcons.FILE)
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarRefactoringSupportProvider.java b/src/main/java/org/jastadd/tooling/grammar/GrammarRefactoringSupportProvider.java
similarity index 72%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarRefactoringSupportProvider.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarRefactoringSupportProvider.java
index ae38c46ab88aa557667818ef7d6bc689249813e8..dfff3bf8dad02d91548b449268a4a323a2cb5159 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarRefactoringSupportProvider.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarRefactoringSupportProvider.java
@@ -1,14 +1,14 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.lang.refactoring.RefactoringSupportProvider;
 import com.intellij.psi.PsiElement;
-import org.jastadd.tooling.psi.RelAstGrammarDeclaredName;
-import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarDeclaredName;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class RelAstGrammarRefactoringSupportProvider extends RefactoringSupportProvider {
+public class GrammarRefactoringSupportProvider extends RefactoringSupportProvider {
 
   @Override
   public boolean isMemberInplaceRenameAvailable(@NotNull PsiElement elementToRename, @Nullable PsiElement context) {
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java b/src/main/java/org/jastadd/tooling/grammar/GrammarReference.java
similarity index 77%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarReference.java
index ae8f8733bd756ee80d9a0038a75dc5c04a49cb8c..2cfaafa7abc8a0f072d8018c0aefb08db78ce3c2 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarReference.java
@@ -1,22 +1,23 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.codeInsight.lookup.LookupElement;
 import com.intellij.codeInsight.lookup.LookupElementBuilder;
 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.util.JastAddIcons;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> implements PsiPolyVariantReference {
+public class GrammarReference extends PsiReferenceBase<PsiElement> implements PsiPolyVariantReference {
 
   private final String key;
 
-  public RelAstGrammarReference(@NotNull PsiElement element, TextRange textRange) {
+  public GrammarReference(@NotNull PsiElement element, TextRange textRange) {
     super(element, textRange);
     key = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset());
   }
@@ -25,7 +26,7 @@ public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> impleme
   @Override
   public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) {
     Project project = myElement.getProject();
-    final List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project, key);
+    final List<RelAstGrammarTypeDecl> typeDecls = GrammarUtil.findTypeDecl(project, key);
     List<ResolveResult> results = new ArrayList<>();
     for (RelAstGrammarTypeDecl typeDecl : typeDecls) {
       results.add(new PsiElementResolveResult(typeDecl));
@@ -44,7 +45,7 @@ public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> impleme
   @Override
   public Object @NotNull [] getVariants() {
     Project project = myElement.getProject();
-    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project);
+    List<RelAstGrammarTypeDecl> typeDecls = GrammarUtil.findTypeDecl(project);
     List<LookupElement> variants = new ArrayList<>();
     for (final RelAstGrammarTypeDecl typeDecl : typeDecls) {
       if (typeDecl.getName() != null && typeDecl.getName().length() > 0) {
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarReferenceContributor.java b/src/main/java/org/jastadd/tooling/grammar/GrammarReferenceContributor.java
similarity index 79%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarReferenceContributor.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarReferenceContributor.java
index 326b07524fa33af52382a98d2764d9fea1ba60fa..99ec1b2f55a8bee80f1cba535f8616671cdaf98c 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarReferenceContributor.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarReferenceContributor.java
@@ -1,13 +1,13 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.openapi.util.TextRange;
 import com.intellij.patterns.PlatformPatterns;
 import com.intellij.psi.*;
 import com.intellij.util.ProcessingContext;
-import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarReferenceContributor extends PsiReferenceContributor {
+public class GrammarReferenceContributor extends PsiReferenceContributor {
 
   @Override
   public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
@@ -22,7 +22,7 @@ public class RelAstGrammarReferenceContributor extends PsiReferenceContributor {
           String value = typeReference.getText();
           if (value != null) {
             TextRange range = new TextRange(0, value.length());
-            return new PsiReference[]{new RelAstGrammarReference(element, range)};
+            return new PsiReference[]{new GrammarReference(element, range)};
           }
           return PsiReference.EMPTY_ARRAY;
         }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarRemoveRedundantComponentNameFix.java b/src/main/java/org/jastadd/tooling/grammar/GrammarRemoveRedundantComponentNameFix.java
similarity index 75%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarRemoveRedundantComponentNameFix.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarRemoveRedundantComponentNameFix.java
index 01a095de0802074bd1561b684c2102a574d89add..25bf8d1346a36eac5613f3fb7df4f6e632a4cf4b 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarRemoveRedundantComponentNameFix.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarRemoveRedundantComponentNameFix.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.codeInsight.intention.impl.BaseIntentionAction;
 import com.intellij.openapi.editor.Editor;
@@ -6,15 +6,15 @@ import com.intellij.openapi.project.Project;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
 import com.intellij.util.IncorrectOperationException;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-import org.jastadd.tooling.psi.RelAstGrammarComponent;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarComponent;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarRemoveRedundantComponentNameFix extends BaseIntentionAction {
+public class GrammarRemoveRedundantComponentNameFix extends BaseIntentionAction {
 
   private final RelAstGrammarComponent component;
 
-  public RelAstGrammarRemoveRedundantComponentNameFix(RelAstGrammarComponent component) {
+  public GrammarRemoveRedundantComponentNameFix(RelAstGrammarComponent component) {
     this.component = component;
   }
 
@@ -40,7 +40,7 @@ public class RelAstGrammarRemoveRedundantComponentNameFix extends BaseIntentionA
     IncorrectOperationException {
     PsiElement first = component.getDeclaredName();
     PsiElement last = component.getDeclaredName();
-    while (last != null && last.getNode().getElementType() != RelAstGrammarTypes.COL) {
+    while (last != null && last.getNode().getElementType() != GrammarTypes.COL) {
       last = last.getNextSibling();
     }
     if (last == null) {
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java b/src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewElement.java
similarity index 76%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewElement.java
index dd6e74dc9112e7671f2b20d98b23418432c63701..e0bf0348ceb82a311e22d481b5688608964865a3 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewElement.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.ide.projectView.PresentationData;
 import com.intellij.ide.structureView.StructureViewTreeElement;
@@ -7,19 +7,19 @@ import com.intellij.ide.util.treeView.smartTree.TreeElement;
 import com.intellij.navigation.ItemPresentation;
 import com.intellij.psi.NavigatablePsiElement;
 import com.intellij.psi.util.PsiTreeUtil;
-import org.jastadd.tooling.psi.RelAstGrammarFile;
-import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
-import org.jastadd.tooling.psi.impl.RelAstGrammarTypeDeclImpl;
+import org.jastadd.tooling.grammar.psi.GrammarFile;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.grammar.psi.impl.RelAstGrammarTypeDeclImpl;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class RelAstGrammarStructureViewElement implements StructureViewTreeElement, SortableTreeElement {
+public class GrammarStructureViewElement implements StructureViewTreeElement, SortableTreeElement {
 
   private final NavigatablePsiElement myElement;
 
-  public RelAstGrammarStructureViewElement(NavigatablePsiElement element) {
+  public GrammarStructureViewElement(NavigatablePsiElement element) {
     this.myElement = element;
   }
 
@@ -60,11 +60,11 @@ public class RelAstGrammarStructureViewElement implements StructureViewTreeEleme
   @NotNull
   @Override
   public TreeElement @NotNull [] getChildren() {
-    if (myElement instanceof RelAstGrammarFile) {
+    if (myElement instanceof GrammarFile) {
       List<RelAstGrammarTypeDecl> properties = PsiTreeUtil.getChildrenOfTypeAsList(myElement, RelAstGrammarTypeDecl.class);
       List<TreeElement> treeElements = new ArrayList<>(properties.size());
       for (RelAstGrammarTypeDecl property : properties) {
-        treeElements.add(new RelAstGrammarStructureViewElement((RelAstGrammarTypeDeclImpl) property));
+        treeElements.add(new GrammarStructureViewElement((RelAstGrammarTypeDeclImpl) property));
       }
       return treeElements.toArray(new TreeElement[0]);
     }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java b/src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewFactory.java
similarity index 80%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewFactory.java
index 23b14e4281f2816557667501fab17a594ce7485c..1262848366283eec0cfa992335108939c27f29b9 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewFactory.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.ide.structureView.StructureViewBuilder;
 import com.intellij.ide.structureView.StructureViewModel;
@@ -9,7 +9,7 @@ import com.intellij.psi.PsiFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class RelAstGrammarStructureViewFactory implements PsiStructureViewFactory {
+public class GrammarStructureViewFactory implements PsiStructureViewFactory {
 
   @Nullable
   @Override
@@ -18,7 +18,7 @@ public class RelAstGrammarStructureViewFactory implements PsiStructureViewFactor
       @NotNull
       @Override
       public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
-        return new RelAstGrammarStructureViewModel(psiFile);
+        return new GrammarStructureViewModel(psiFile);
       }
     };
   }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java b/src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewModel.java
similarity index 65%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewModel.java
index 9f164f06b9c71570d7578c83452f1ad49dcaad1e..98994e47225077bdee1313c0afd24171ba54e220 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarStructureViewModel.java
@@ -1,18 +1,18 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.ide.structureView.StructureViewModel;
 import com.intellij.ide.structureView.StructureViewModelBase;
 import com.intellij.ide.structureView.StructureViewTreeElement;
 import com.intellij.ide.util.treeView.smartTree.Sorter;
 import com.intellij.psi.PsiFile;
-import org.jastadd.tooling.psi.RelAstGrammarFile;
+import org.jastadd.tooling.grammar.psi.GrammarFile;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarStructureViewModel extends StructureViewModelBase implements
+public class GrammarStructureViewModel extends StructureViewModelBase implements
   StructureViewModel.ElementInfoProvider {
 
-  public RelAstGrammarStructureViewModel(PsiFile psiFile) {
-    super(psiFile, new RelAstGrammarStructureViewElement(psiFile));
+  public GrammarStructureViewModel(PsiFile psiFile) {
+    super(psiFile, new GrammarStructureViewElement(psiFile));
   }
 
   @NotNull
@@ -28,7 +28,7 @@ public class RelAstGrammarStructureViewModel extends StructureViewModelBase impl
 
   @Override
   public boolean isAlwaysLeaf(StructureViewTreeElement element) {
-    return element instanceof RelAstGrammarFile;
+    return element instanceof GrammarFile;
   }
 
 }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarSyntaxHighlighter.java b/src/main/java/org/jastadd/tooling/grammar/GrammarSyntaxHighlighter.java
similarity index 77%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarSyntaxHighlighter.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarSyntaxHighlighter.java
index 23bc610ade194ee4c891a330d97c37c2e3edc1f0..31dda53dfab9aa4a68ac5a8c213d416a5784bc54 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarSyntaxHighlighter.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarSyntaxHighlighter.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.lexer.Lexer;
@@ -8,13 +8,13 @@ import com.intellij.openapi.editor.colors.TextAttributesKey;
 import com.intellij.openapi.fileTypes.SyntaxHighlighterBase;
 import com.intellij.psi.TokenType;
 import com.intellij.psi.tree.IElementType;
-import org.jastadd.tooling.lexer.RelAstGrammarFlexAdapter;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.grammar.lexer.GrammarLexerAdapter;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
 import org.jetbrains.annotations.NotNull;
 
 import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey;
 
-public class RelAstGrammarSyntaxHighlighter extends SyntaxHighlighterBase {
+public class GrammarSyntaxHighlighter extends SyntaxHighlighterBase {
 
   public static final TextAttributesKey KEYWORD = createTextAttributesKey("RELAST_KEYWORD", DefaultLanguageHighlighterColors.KEYWORD);
   public static final TextAttributesKey ASSIGN = createTextAttributesKey("RELAST_ASSIGN", DefaultLanguageHighlighterColors.OPERATION_SIGN);
@@ -57,54 +57,54 @@ public class RelAstGrammarSyntaxHighlighter extends SyntaxHighlighterBase {
   @NotNull
   @Override
   public Lexer getHighlightingLexer() {
-    return new RelAstGrammarFlexAdapter();
+    return new GrammarLexerAdapter();
   }
 
   @NotNull
   @Override
   public TextAttributesKey @NotNull [] getTokenHighlights(IElementType tokenType) {
 
-    if (tokenType.equals(RelAstGrammarTypes.ABSTRACT)) {
+    if (tokenType.equals(GrammarTypes.ABSTRACT)) {
       return KEYWORD_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.ASSIGN)) {
+    } else if (tokenType.equals(GrammarTypes.ASSIGN)) {
       return ASSIGN_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.BIDIRECTIONAL)) {
+    } else if (tokenType.equals(GrammarTypes.BIDIRECTIONAL)) {
       return RELATION_DIR_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.COL)) {
+    } else if (tokenType.equals(GrammarTypes.COL)) {
       return COL_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.COMMA)) {
+    } else if (tokenType.equals(GrammarTypes.COMMA)) {
       return COMMA_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.DOCCOMMENT)) {
+    } else if (tokenType.equals(GrammarTypes.DOCCOMMENT)) {
       return DOCCOMMENT_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.DOT)) {
+    } else if (tokenType.equals(GrammarTypes.DOT)) {
       return DOT_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.GT)) {
+    } else if (tokenType.equals(GrammarTypes.GT)) {
       return ANGLE_BRACKET_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.ID)) {
+    } else if (tokenType.equals(GrammarTypes.ID)) {
       return ID_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.LBRACKET)) {
+    } else if (tokenType.equals(GrammarTypes.LBRACKET)) {
       return BRACKET_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.LEFT)) {
+    } else if (tokenType.equals(GrammarTypes.LEFT)) {
       return RELATION_DIR_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.LT)) {
+    } else if (tokenType.equals(GrammarTypes.LT)) {
       return ANGLE_BRACKET_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.MULTILINECOMMENT)) {
+    } else if (tokenType.equals(GrammarTypes.MULTILINECOMMENT)) {
       return MULTILINECOMMENT_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.QUESTION_MARK)) {
+    } else if (tokenType.equals(GrammarTypes.QUESTION_MARK)) {
       return QUESTION_MARK_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.RBRACKET)) {
+    } else if (tokenType.equals(GrammarTypes.RBRACKET)) {
       return BRACKET_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.REL)) {
+    } else if (tokenType.equals(GrammarTypes.REL)) {
       return KEYWORD_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.RIGHT)) {
+    } else if (tokenType.equals(GrammarTypes.RIGHT)) {
       return RELATION_DIR_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.SCOL)) {
+    } else if (tokenType.equals(GrammarTypes.SCOL)) {
       return SCOL_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.SINGLELINECOMMENT)) {
+    } else if (tokenType.equals(GrammarTypes.SINGLELINECOMMENT)) {
       return SINGLELINECOMMENT_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.SLASH)) {
+    } else if (tokenType.equals(GrammarTypes.SLASH)) {
       return SLASH_KEYS;
-    } else if (tokenType.equals(RelAstGrammarTypes.STAR)) {
+    } else if (tokenType.equals(GrammarTypes.STAR)) {
       return STAR_KEYS;
     } else if (tokenType.equals(TokenType.BAD_CHARACTER)) {
       return BAD_CHAR_KEYS;
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarSyntaxHighlighterFactory.java b/src/main/java/org/jastadd/tooling/grammar/GrammarSyntaxHighlighterFactory.java
similarity index 69%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarSyntaxHighlighterFactory.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarSyntaxHighlighterFactory.java
index 2860248c7929f051c586a822696ee67a50901f23..0fb350fee3b9d03c58ed3b5ccdab5b82a382ec28 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarSyntaxHighlighterFactory.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarSyntaxHighlighterFactory.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 import com.intellij.openapi.fileTypes.SyntaxHighlighter;
 import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
@@ -6,12 +6,12 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarSyntaxHighlighterFactory extends SyntaxHighlighterFactory {
+public class GrammarSyntaxHighlighterFactory extends SyntaxHighlighterFactory {
 
   @NotNull
   @Override
   public SyntaxHighlighter getSyntaxHighlighter(Project project, VirtualFile virtualFile) {
-    return new RelAstGrammarSyntaxHighlighter();
+    return new GrammarSyntaxHighlighter();
   }
 
 }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java b/src/main/java/org/jastadd/tooling/grammar/GrammarUtil.java
similarity index 85%
rename from src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
rename to src/main/java/org/jastadd/tooling/grammar/GrammarUtil.java
index 8a480a0330cf26425481e92f2a957056b2b6899e..7f32eba9acf7d9be0d9c82045df9670ec33db571 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
+++ b/src/main/java/org/jastadd/tooling/grammar/GrammarUtil.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.grammar;
 
 
 import com.intellij.openapi.project.Project;
@@ -9,16 +9,16 @@ import com.intellij.psi.javadoc.PsiDocTag;
 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 org.jastadd.tooling.grammar.psi.GrammarFile;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.*;
 
 
-public class RelAstGrammarUtil {
+public class GrammarUtil {
 
-  private RelAstGrammarUtil() {
+  private GrammarUtil() {
     // appease SonarLint java:S1118
     throw new IllegalStateException("Utility class");
   }
@@ -33,9 +33,9 @@ public class RelAstGrammarUtil {
   public static List<RelAstGrammarTypeDecl> findTypeDecl(Project project, String name) {
     List<RelAstGrammarTypeDecl> result = new ArrayList<>();
     Collection<VirtualFile> virtualFiles =
-      FileTypeIndex.getFiles(RelAstGrammarFileType.INSTANCE, GlobalSearchScope.allScope(project));
+      FileTypeIndex.getFiles(GrammarFileType.INSTANCE, GlobalSearchScope.allScope(project));
     for (VirtualFile virtualFile : virtualFiles) {
-      RelAstGrammarFile simpleFile = (RelAstGrammarFile) PsiManager.getInstance(project).findFile(virtualFile);
+      GrammarFile simpleFile = (GrammarFile) PsiManager.getInstance(project).findFile(virtualFile);
       if (simpleFile != null) {
         // TODO check if file is ignored or generated!
         RelAstGrammarTypeDecl[] typeDecls = PsiTreeUtil.getChildrenOfType(simpleFile, RelAstGrammarTypeDecl.class);
@@ -60,9 +60,9 @@ public class RelAstGrammarUtil {
   public static List<RelAstGrammarTypeDecl> findTypeDecl(Project project) {
     List<RelAstGrammarTypeDecl> result = new ArrayList<>();
     Collection<VirtualFile> virtualFiles =
-      FileTypeIndex.getFiles(RelAstGrammarFileType.INSTANCE, GlobalSearchScope.allScope(project));
+      FileTypeIndex.getFiles(GrammarFileType.INSTANCE, GlobalSearchScope.allScope(project));
     for (VirtualFile virtualFile : virtualFiles) {
-      RelAstGrammarFile simpleFile = (RelAstGrammarFile) PsiManager.getInstance(project).findFile(virtualFile);
+      GrammarFile simpleFile = (GrammarFile) PsiManager.getInstance(project).findFile(virtualFile);
       if (simpleFile != null) {
         // TODO check if file is ignored or generated!
         RelAstGrammarTypeDecl[] typeDecls = PsiTreeUtil.getChildrenOfType(simpleFile, RelAstGrammarTypeDecl.class);
diff --git a/src/main/java/org/jastadd/tooling/grammar/lexer/GrammarLexerAdapter.java b/src/main/java/org/jastadd/tooling/grammar/lexer/GrammarLexerAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..1087854e68e44d1bdcf431bd5c3f31b5c7fa2bc3
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/lexer/GrammarLexerAdapter.java
@@ -0,0 +1,11 @@
+package org.jastadd.tooling.grammar.lexer;
+
+import com.intellij.lexer.FlexAdapter;
+
+public class GrammarLexerAdapter extends FlexAdapter {
+
+  public GrammarLexerAdapter() {
+    super(new GrammarLexer(null));
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/parser/RelAstGrammarParserDefinition.java b/src/main/java/org/jastadd/tooling/grammar/parser/GrammarParserDefinition.java
similarity index 69%
rename from src/main/java/org/jastadd/tooling/parser/RelAstGrammarParserDefinition.java
rename to src/main/java/org/jastadd/tooling/grammar/parser/GrammarParserDefinition.java
index 2f47290d6344b7809cbe2df364a4b6545b208308..03533b56174029b329ddc3dece081bfc7f2abf1b 100644
--- a/src/main/java/org/jastadd/tooling/parser/RelAstGrammarParserDefinition.java
+++ b/src/main/java/org/jastadd/tooling/grammar/parser/GrammarParserDefinition.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling.parser;
+package org.jastadd.tooling.grammar.parser;
 
 import com.intellij.lang.ASTNode;
 import com.intellij.lang.ParserDefinition;
@@ -11,23 +11,22 @@ import com.intellij.psi.PsiFile;
 import com.intellij.psi.TokenType;
 import com.intellij.psi.tree.IFileElementType;
 import com.intellij.psi.tree.TokenSet;
-import org.jastadd.tooling.RelAstGrammar;
-import org.jastadd.tooling.lexer.RelAstGrammarFlexAdapter;
-import org.jastadd.tooling.psi.RelAstGrammarFile;
+import org.jastadd.tooling.grammar.Grammar;
+import org.jastadd.tooling.grammar.lexer.GrammarLexerAdapter;
+import org.jastadd.tooling.grammar.psi.GrammarFile;
 import org.jetbrains.annotations.NotNull;
 
-
-public class RelAstGrammarParserDefinition implements ParserDefinition {
+public class GrammarParserDefinition implements ParserDefinition {
 
   public static final TokenSet WHITE_SPACES = TokenSet.create(TokenType.WHITE_SPACE);
-  public static final TokenSet COMMENTS = TokenSet.create(RelAstGrammarTypes.SINGLELINECOMMENT, RelAstGrammarTypes.DOCCOMMENT, RelAstGrammarTypes.MULTILINECOMMENT);
+  public static final TokenSet COMMENTS = TokenSet.create(GrammarTypes.SINGLELINECOMMENT, GrammarTypes.DOCCOMMENT, GrammarTypes.MULTILINECOMMENT);
 
-  public static final IFileElementType FILE = new IFileElementType(RelAstGrammar.INSTANCE);
+  public static final IFileElementType FILE = new IFileElementType(Grammar.INSTANCE);
 
   @NotNull
   @Override
   public Lexer createLexer(Project project) {
-    return new RelAstGrammarFlexAdapter();
+    return new GrammarLexerAdapter();
   }
 
   @NotNull
@@ -51,7 +50,7 @@ public class RelAstGrammarParserDefinition implements ParserDefinition {
   @NotNull
   @Override
   public PsiParser createParser(final Project project) {
-    return new RelAstGrammarParser();
+    return new GrammarParser();
   }
 
   @Override
@@ -61,7 +60,7 @@ public class RelAstGrammarParserDefinition implements ParserDefinition {
 
   @Override
   public PsiFile createFile(FileViewProvider viewProvider) {
-    return new RelAstGrammarFile(viewProvider);
+    return new GrammarFile(viewProvider);
   }
 
   @Override
@@ -72,7 +71,7 @@ public class RelAstGrammarParserDefinition implements ParserDefinition {
   @NotNull
   @Override
   public PsiElement createElement(ASTNode node) {
-    return RelAstGrammarTypes.Factory.createElement(node);
+    return GrammarTypes.Factory.createElement(node);
   }
 
 }
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarElementFactory.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarElementFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d080708d233e8d6ded5bb5c326de2c96b4b310c
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarElementFactory.java
@@ -0,0 +1,31 @@
+package org.jastadd.tooling.grammar.psi;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFileFactory;
+import org.jastadd.tooling.grammar.GrammarFileType;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+
+import java.util.Objects;
+
+public class GrammarElementFactory {
+
+  private GrammarElementFactory() {
+    throw new IllegalStateException("Utility class");
+  }
+
+  public static RelAstGrammarDeclaredName createDeclaredName(Project project, String name) {
+    final GrammarFile file = createFile(project, name + ";");
+    return (RelAstGrammarDeclaredName) file.getFirstChild().getFirstChild();
+  }
+
+  public static RelAstGrammarTypeReference createTypeReference(Project project, String name) {
+    final GrammarFile file = createFile(project, "X : " + name + ";");
+    return (RelAstGrammarTypeReference) (Objects.requireNonNull(file.getFirstChild().getNode().findChildByType(GrammarTypes.TYPE_REFERENCE)).getPsi());
+  }
+
+  public static GrammarFile createFile(Project project, String text) {
+    String name = "dummy.relast";
+    return (GrammarFile) PsiFileFactory.getInstance(project).
+      createFileFromText(name, GrammarFileType.INSTANCE, text);
+  }
+}
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarElementType.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarElementType.java
new file mode 100644
index 0000000000000000000000000000000000000000..098154fcb739415ad73e16d1534a889394a7cffa
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarElementType.java
@@ -0,0 +1,14 @@
+package org.jastadd.tooling.grammar.psi;
+
+import com.intellij.psi.tree.IElementType;
+import org.jastadd.tooling.grammar.Grammar;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+public class GrammarElementType extends IElementType {
+
+  public GrammarElementType(@NotNull @NonNls String debugName) {
+    super(debugName, Grammar.INSTANCE);
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarFile.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2a13eb1d1ee0826f4fa51c53593a5b571ad42a5
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarFile.java
@@ -0,0 +1,26 @@
+package org.jastadd.tooling.grammar.psi;
+
+import com.intellij.extapi.psi.PsiFileBase;
+import com.intellij.psi.FileViewProvider;
+import org.jastadd.tooling.grammar.Grammar;
+import org.jastadd.tooling.grammar.GrammarFileType;
+import org.jetbrains.annotations.NotNull;
+
+public class GrammarFile extends PsiFileBase {
+
+  public GrammarFile(@NotNull FileViewProvider viewProvider) {
+    super(viewProvider, Grammar.INSTANCE);
+  }
+
+  @NotNull
+  @Override
+  public com.intellij.openapi.fileTypes.FileType getFileType() {
+    return GrammarFileType.INSTANCE;
+  }
+
+  @Override
+  public String toString() {
+    return "RelAst Grammar File";
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarNamedElement.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarNamedElement.java
new file mode 100644
index 0000000000000000000000000000000000000000..69b6fe7cbf9737f3d18e9ba6e2830c7d9cd78910
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarNamedElement.java
@@ -0,0 +1,7 @@
+package org.jastadd.tooling.grammar.psi;
+
+import com.intellij.psi.PsiNameIdentifierOwner;
+
+public interface GrammarNamedElement extends PsiNameIdentifierOwner {
+
+}
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTokenType.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTokenType.java
new file mode 100644
index 0000000000000000000000000000000000000000..19c91f42e019714e82755a8164b31e8be41cfea9
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTokenType.java
@@ -0,0 +1,19 @@
+package org.jastadd.tooling.grammar.psi;
+
+import com.intellij.psi.tree.IElementType;
+import org.jastadd.tooling.grammar.Grammar;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+public class GrammarTokenType extends IElementType {
+
+  public GrammarTokenType(@NotNull @NonNls String debugName) {
+    super(debugName, Grammar.INSTANCE);
+  }
+
+  @Override
+  public String toString() {
+    return "RelAstGrammarTokenType." + super.toString();
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeDeclExtension.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeDeclExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..3459b1aca8435d9392d54556a96365d08491e3f1
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeDeclExtension.java
@@ -0,0 +1,4 @@
+package org.jastadd.tooling.grammar.psi;
+
+public interface GrammarTypeDeclExtension extends GrammarNamedElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeReferenceExtension.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeReferenceExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9cbb3c9089193483e7a999be66b1b9400a03a0f
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeReferenceExtension.java
@@ -0,0 +1,4 @@
+package org.jastadd.tooling.grammar.psi;
+
+public interface GrammarTypeReferenceExtension extends GrammarNamedElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceManipulator.java b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeReferenceManipulator.java
similarity index 82%
rename from src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceManipulator.java
rename to src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeReferenceManipulator.java
index 38112626dddc2521650a3af32c2e7490ad20fee0..4825b7d4bf6df99558c4116b98053307adf0ebf5 100644
--- a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceManipulator.java
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/GrammarTypeReferenceManipulator.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling.psi;
+package org.jastadd.tooling.grammar.psi;
 
 import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.AbstractElementManipulator;
@@ -7,7 +7,7 @@ import com.intellij.util.IncorrectOperationException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class RelAstGrammarTypeReferenceManipulator extends AbstractElementManipulator<RelAstGrammarTypeReference> implements ElementManipulator<RelAstGrammarTypeReference> {
+public class GrammarTypeReferenceManipulator extends AbstractElementManipulator<RelAstGrammarTypeReference> implements ElementManipulator<RelAstGrammarTypeReference> {
   /**
    * Changes the element's text to the given new text.
    *
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java b/src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarNamedElementImpl.java
similarity index 77%
rename from src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
rename to src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarNamedElementImpl.java
index f684e427eb0700feae1b799a9e28828efd9c8181..8b96481da17abea2668844bb1a834a4dba79687b 100644
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarNamedElementImpl.java
@@ -1,20 +1,20 @@
-package org.jastadd.tooling.psi.impl;
+package org.jastadd.tooling.grammar.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.jastadd.tooling.util.JastAddIcons;
+import org.jastadd.tooling.grammar.psi.GrammarNamedElement;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 
-public abstract class RelAstGrammarNamedElementImpl extends ASTWrapperPsiElement implements RelAstGrammarNamedElement {
+public abstract class GrammarNamedElementImpl extends ASTWrapperPsiElement implements GrammarNamedElement {
 
-  protected RelAstGrammarNamedElementImpl(@NotNull ASTNode node) {
+  protected GrammarNamedElementImpl(@NotNull ASTNode node) {
     super(node);
   }
 
diff --git a/src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarTypeDeclImplExtension.java b/src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarTypeDeclImplExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..9bc6712fa99c2bbc1bb044ece2c95244c1bbe327
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarTypeDeclImplExtension.java
@@ -0,0 +1,47 @@
+package org.jastadd.tooling.grammar.psi.impl;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import org.jastadd.tooling.grammar.parser.GrammarTypes;
+import org.jastadd.tooling.grammar.psi.GrammarTypeDeclExtension;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarDeclaredName;
+import org.jastadd.tooling.grammar.psi.GrammarElementFactory;
+import org.jetbrains.annotations.NotNull;
+
+public class GrammarTypeDeclImplExtension extends GrammarNamedElementImpl implements GrammarTypeDeclExtension {
+
+  public GrammarTypeDeclImplExtension(@NotNull ASTNode node) {
+    super(node);
+  }
+
+  public String getName() {
+    // this finds the *first* ID, which is what we want
+    ASTNode keyNode = getNode().findChildByType(GrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      return keyNode.getText();
+    } else {
+      return null;
+    }
+  }
+
+  public PsiElement setName(@NotNull String newName) {
+    ASTNode keyNode = getNode().findChildByType(GrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      RelAstGrammarDeclaredName name = GrammarElementFactory.createDeclaredName(getProject(), newName);
+      ASTNode newKeyNode = name.getNode();
+      getNode().replaceChild(keyNode, newKeyNode);
+    }
+    return this;
+  }
+
+  public PsiElement getNameIdentifier() {
+    ASTNode keyNode = getNode().findChildByType(GrammarTypes.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/grammar/psi/impl/GrammarTypeReferenceImplExtension.java
similarity index 57%
rename from src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java
rename to src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarTypeReferenceImplExtension.java
index 3b44b50ecc4e58eb33673bc27a9b6211baed5011..380fbc1d7804b94f97ba727de3647107287b45c5 100644
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java
+++ b/src/main/java/org/jastadd/tooling/grammar/psi/impl/GrammarTypeReferenceImplExtension.java
@@ -1,15 +1,15 @@
-package org.jastadd.tooling.psi.impl;
+package org.jastadd.tooling.grammar.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.jastadd.tooling.grammar.psi.GrammarElementFactory;
+import org.jastadd.tooling.grammar.psi.GrammarTypeReferenceExtension;
+import org.jastadd.tooling.grammar.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
-public class RelAstGrammarTypeReferenceImplExtension extends RelAstGrammarNamedElementImpl implements RelAstGrammarTypeReferenceExtension {
+public class GrammarTypeReferenceImplExtension extends GrammarNamedElementImpl implements GrammarTypeReferenceExtension {
 
-  public RelAstGrammarTypeReferenceImplExtension(@NotNull ASTNode node) {
+  public GrammarTypeReferenceImplExtension(@NotNull ASTNode node) {
     super(node);
   }
 
@@ -22,7 +22,7 @@ public class RelAstGrammarTypeReferenceImplExtension extends RelAstGrammarNamedE
     // FIXME this can break the grammar when the type is used in an unnamed component (and in many other cases probably)
     ASTNode keyNode = getNode().getFirstChildNode();
     if (keyNode != null) {
-      RelAstGrammarTypeReference name = RelAstGrammarElementFactory.createTypeReference(getProject(), newName);
+      RelAstGrammarTypeReference name = GrammarElementFactory.createTypeReference(getProject(), newName);
       ASTNode newKeyNode = name.getNode().getFirstChildNode();
       getNode().replaceChild(keyNode, newKeyNode);
     }
diff --git a/src/main/java/org/jastadd/tooling/lexer/RelAstGrammarFlexAdapter.java b/src/main/java/org/jastadd/tooling/lexer/RelAstGrammarFlexAdapter.java
deleted file mode 100644
index 305dd614526bd7d8a213541457144a5579291685..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/lexer/RelAstGrammarFlexAdapter.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.jastadd.tooling.lexer;
-
-import com.intellij.lexer.FlexAdapter;
-
-public class RelAstGrammarFlexAdapter extends FlexAdapter {
-
-  public RelAstGrammarFlexAdapter() {
-    super(new RelAstGrammarLexer(null));
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/parser/RelAstGrammarElementType.java b/src/main/java/org/jastadd/tooling/parser/RelAstGrammarElementType.java
deleted file mode 100644
index f50d18deca1639fbfafdd44d736787e5318e685b..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/parser/RelAstGrammarElementType.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.jastadd.tooling.parser;
-
-import com.intellij.psi.tree.IElementType;
-import org.jastadd.tooling.RelAstGrammar;
-import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
-
-public class RelAstGrammarElementType extends IElementType {
-
-  public RelAstGrammarElementType(@NotNull @NonNls String debugName) {
-    super(debugName, RelAstGrammar.INSTANCE);
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/parser/RelAstGrammarTokenType.java b/src/main/java/org/jastadd/tooling/parser/RelAstGrammarTokenType.java
deleted file mode 100644
index dd705f529788cef109b764d82d61c3049e425081..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/parser/RelAstGrammarTokenType.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.jastadd.tooling.parser;
-
-import com.intellij.psi.tree.IElementType;
-import org.jastadd.tooling.RelAstGrammar;
-import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
-
-public class RelAstGrammarTokenType extends IElementType {
-
-  public RelAstGrammarTokenType(@NotNull @NonNls String debugName) {
-    super(debugName, RelAstGrammar.INSTANCE);
-  }
-
-  @Override
-  public String toString() {
-    return "RelAstGrammarTokenType." + super.toString();
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarElementFactory.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarElementFactory.java
deleted file mode 100644
index df3bef4d1782301d2a97cbe908e2a8adc9f530e6..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarElementFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.jastadd.tooling.psi;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiFileFactory;
-import org.jastadd.tooling.RelAstGrammarFileType;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-
-import java.util.Objects;
-
-public class RelAstGrammarElementFactory {
-
-  private RelAstGrammarElementFactory() {
-    throw new IllegalStateException("Utility class");
-  }
-
-  public static RelAstGrammarDeclaredName createDeclaredName(Project project, String name) {
-    final RelAstGrammarFile file = createFile(project, name + ";");
-    return (RelAstGrammarDeclaredName) file.getFirstChild().getFirstChild();
-  }
-
-  public static RelAstGrammarTypeReference createTypeReference(Project project, String name) {
-    final RelAstGrammarFile file = createFile(project, "X : " + name + ";");
-    return (RelAstGrammarTypeReference) (Objects.requireNonNull(file.getFirstChild().getNode().findChildByType(RelAstGrammarTypes.TYPE_REFERENCE)).getPsi());
-  }
-
-  public static RelAstGrammarFile createFile(Project project, String text) {
-    String name = "dummy.relast";
-    return (RelAstGrammarFile) PsiFileFactory.getInstance(project).
-      createFileFromText(name, RelAstGrammarFileType.INSTANCE, text);
-  }
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarFile.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarFile.java
deleted file mode 100644
index 4c1afaec206dcb731e6e9d8c4967002e0468bce7..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarFile.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.jastadd.tooling.psi;
-
-import com.intellij.extapi.psi.PsiFileBase;
-import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.psi.FileViewProvider;
-import org.jastadd.tooling.RelAstGrammar;
-import org.jastadd.tooling.RelAstGrammarFileType;
-import org.jetbrains.annotations.NotNull;
-
-public class RelAstGrammarFile extends PsiFileBase {
-
-  public RelAstGrammarFile(@NotNull FileViewProvider viewProvider) {
-    super(viewProvider, RelAstGrammar.INSTANCE);
-  }
-
-  @NotNull
-  @Override
-  public FileType getFileType() {
-    return RelAstGrammarFileType.INSTANCE;
-  }
-
-  @Override
-  public String toString() {
-    return "RelAst Grammar File";
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarNamedElement.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarNamedElement.java
deleted file mode 100644
index 6a7844cf61085aaea84a0da8f70abc27f940b737..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarNamedElement.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.jastadd.tooling.psi;
-
-import com.intellij.psi.PsiNameIdentifierOwner;
-
-public interface RelAstGrammarNamedElement extends PsiNameIdentifierOwner {
-
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
deleted file mode 100644
index 79837b70315b8c0d8c0913811f5057a5196ea71b..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index a6c95e7553e773c28c39c0d0f764074eaba5ccc2..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.jastadd.tooling.psi;
-
-public interface RelAstGrammarTypeReferenceExtension extends RelAstGrammarNamedElement {
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
deleted file mode 100644
index b51ed4fec649f326781dd67a61489f086485536d..0000000000000000000000000000000000000000
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
+++ /dev/null
@@ -1,47 +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.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/JastAddIcons.java b/src/main/java/org/jastadd/tooling/util/JastAddIcons.java
similarity index 89%
rename from src/main/java/org/jastadd/tooling/JastAddIcons.java
rename to src/main/java/org/jastadd/tooling/util/JastAddIcons.java
index 011ca9980e71c02eb890798de3fb76077e169ae1..b75c0b6460965082f658c4c5d67ad2527b71c08a 100644
--- a/src/main/java/org/jastadd/tooling/JastAddIcons.java
+++ b/src/main/java/org/jastadd/tooling/util/JastAddIcons.java
@@ -1,4 +1,4 @@
-package org.jastadd.tooling;
+package org.jastadd.tooling.util;
 
 import com.intellij.openapi.util.IconLoader;
 
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 12c50ebef59cedd7b630ef32981b6c08600359a6..284b8d98e67152fd069f5dcbfc144ef1dd759184 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -11,62 +11,62 @@
 
     <extensions defaultExtensionNs="com.intellij">
         <!-- Add your extensions here -->
-        <fileType name="RelAst Grammar" implementationClass="org.jastadd.tooling.RelAstGrammarFileType"
+        <fileType name="RelAst Grammar" implementationClass="org.jastadd.tooling.grammar.GrammarFileType"
                   fieldName="INSTANCE" language="JastAddGrammar" extensions="relast"/>
         <lang.parserDefinition language="JastAddGrammar"
-                               implementationClass="org.jastadd.tooling.parser.RelAstGrammarParserDefinition"/>
+                               implementationClass="org.jastadd.tooling.grammar.parser.GrammarParserDefinition"/>
         <lang.syntaxHighlighterFactory language="JastAddGrammar"
-                                       implementationClass="org.jastadd.tooling.RelAstGrammarSyntaxHighlighterFactory"/>
+                                       implementationClass="org.jastadd.tooling.grammar.GrammarSyntaxHighlighterFactory"/>
 
-        <colorSettingsPage implementation="org.jastadd.tooling.RelAstGrammarColorSettingsPage"/>
+        <colorSettingsPage implementation="org.jastadd.tooling.grammar.GrammarColorSettingsPage"/>
 
-        <annotator language="JAVA" implementationClass="org.jastadd.tooling.RelAstGrammarJavaAnnotator"/>
+        <annotator language="JAVA" implementationClass="org.jastadd.tooling.grammar.GrammarJavaAnnotator"/>
 
-        <annotator language="JastAddGrammar" implementationClass="org.jastadd.tooling.RelAstGrammarAnnotator"/>
+        <annotator language="JastAddGrammar" implementationClass="org.jastadd.tooling.grammar.GrammarAnnotator"/>
 
         <codeInsight.lineMarkerProvider language="JAVA"
-                                        implementationClass="org.jastadd.tooling.RelAstGrammarLineMarkerProvider"/>
+                                        implementationClass="org.jastadd.tooling.grammar.GrammarLineMarkerProvider"/>
 
         <completion.contributor language="JastAddGrammar"
-                                implementationClass="org.jastadd.tooling.RelAstGrammarCompletionContributor"/>
+                                implementationClass="org.jastadd.tooling.grammar.GrammarCompletionContributor"/>
 
-        <psi.referenceContributor implementation="org.jastadd.tooling.RelAstGrammarReferenceContributor"/>
+        <psi.referenceContributor implementation="org.jastadd.tooling.grammar.GrammarReferenceContributor"/>
 
 
         <lang.refactoringSupport language="JastAddGrammar"
-                                 implementationClass="org.jastadd.tooling.RelAstGrammarRefactoringSupportProvider"/>
+                                 implementationClass="org.jastadd.tooling.grammar.GrammarRefactoringSupportProvider"/>
 
-        <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference"
-                                 implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
+        <lang.elementManipulator forClass="org.jastadd.tooling.grammar.psi.RelAstGrammarTypeReference"
+                                 implementationClass="org.jastadd.tooling.grammar.psi.GrammarTypeReferenceManipulator"/>
 
 
         <lang.findUsagesProvider language="JastAddGrammar"
-                                 implementationClass="org.jastadd.tooling.RelAstGrammarFindUsageProvider"/>
+                                 implementationClass="org.jastadd.tooling.grammar.GrammarFindUsageProvider"/>
 
-        <gotoSymbolContributor implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/>
+        <gotoSymbolContributor implementation="org.jastadd.tooling.grammar.GrammarChooseByNameContributor"/>
 
         <lang.psiStructureViewFactory language="JastAddGrammar"
-                                      implementationClass="org.jastadd.tooling.RelAstGrammarStructureViewFactory"/>
+                                      implementationClass="org.jastadd.tooling.grammar.GrammarStructureViewFactory"/>
 
         <lang.formatter language="JastAddGrammar"
-                        implementationClass="org.jastadd.tooling.RelAstGrammarFormattingModelBuilder"/>
+                        implementationClass="org.jastadd.tooling.grammar.GrammarFormattingModelBuilder"/>
 
-        <codeStyleSettingsProvider implementation="org.jastadd.tooling.RelAstGrammarCodeStyleSettingsProvider"/>
+        <codeStyleSettingsProvider implementation="org.jastadd.tooling.grammar.GrammarCodeStyleSettingsProvider"/>
 
         <langCodeStyleSettingsProvider
-            implementation="org.jastadd.tooling.RelAstGrammarLanguageCodeStyleSettingsProvider"/>
+            implementation="org.jastadd.tooling.grammar.GrammarLanguageCodeStyleSettingsProvider"/>
 
-        <lang.commenter language="JastAddGrammar" implementationClass="org.jastadd.tooling.RelAstGrammarCommenter"/>
+        <lang.commenter language="JastAddGrammar" implementationClass="org.jastadd.tooling.grammar.GrammarCommenter"/>
 
         <!-- Attribute/Aspect Language -->
 
-        <fileType name="JastAdd Attribute Aspect" implementationClass="org.jastadd.tooling.aspect.JastAddAttributeFileType"
+        <fileType name="JastAdd Attribute Aspect" implementationClass="org.jastadd.tooling.aspect.AttributeFileType"
                   fieldName="INSTANCE" language="JastAddAspect" extensions="jrag"/>
-        <fileType name="JastAdd Aspect" implementationClass="org.jastadd.tooling.aspect.JastAddAspectFileType"
+        <fileType name="JastAdd Aspect" implementationClass="org.jastadd.tooling.aspect.AspectFileType"
                   fieldName="INSTANCE" language="JastAddAspect" extensions="jadd"/>
 
         <lang.parserDefinition language="JastAddAspect"
-                               implementationClass="org.jastadd.tooling.aspect.JastAddAspectParserDefinition"/>
+                               implementationClass="org.jastadd.tooling.aspect.parser.AspectParserDefinition"/>
         <languageInjector implementation="org.jastadd.tooling.aspect.JavaBlockLanguageInjector"/>
     </extensions>