diff --git a/relast2uml.base/src/main/jastadd/Analysis.jrag b/relast2uml.base/src/main/jastadd/Analysis.jrag
index 84a3af2c07d0b22e676686229b88fb5654426719..317cf9dab8f3d0beb71e38fa7a2410b3c04090e2 100644
--- a/relast2uml.base/src/main/jastadd/Analysis.jrag
+++ b/relast2uml.base/src/main/jastadd/Analysis.jrag
@@ -1,2 +1,12 @@
 aspect Analysis {
+  syn lazy Folder GrammarFile.defaultFolder() {
+    Folder result = new Folder();
+    result.setName(new java.io.File(getFileName()).getName().replace(".relast", "").replace(".ast", ""));
+    for (Declaration decl : getDeclarationList()) {
+      if (decl.isTypeDecl() && !decl.asTypeDecl().hasSourceFolder()) {
+        result.addType(decl.asTypeDecl());
+      }
+    }
+    return result;
+  }
 }
diff --git a/relast2uml.base/src/main/jastadd/Navigation.jrag b/relast2uml.base/src/main/jastadd/Navigation.jrag
index a5d0889ba9607e9139f4f71dfc17cf3235831d34..09c9ae19da6a995a0c24e27afff0d0739604b1c7 100644
--- a/relast2uml.base/src/main/jastadd/Navigation.jrag
+++ b/relast2uml.base/src/main/jastadd/Navigation.jrag
@@ -13,6 +13,14 @@ aspect Navigation {
   eq Program.getChild().containedFile() = null;
   eq Relast2Uml.getChild().containedFile() = null;
 
+  // --- isTypeDecl (should be in preprocessor) ---
+  syn boolean Declaration.isTypeDecl() = false;
+  eq TypeDecl.isTypeDecl() = true;
+
+  // --- asTypeDecl (should be in preprocessor) ---
+  syn TypeDecl Declaration.asTypeDecl() = null;
+  eq TypeDecl.asTypeDecl() = this;
+
   // --- isTypeComponent (should be in preprocessor) ---
   syn boolean Component.isTypeComponent() = false;
   eq TypeComponent.isTypeComponent() = true;
diff --git a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
index bb60cd810082c4f557b5d8a54e166d84006ee620..1e76de88a4e7d1cce18e7e33ca191abb7bfec17f 100644
--- a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
+++ b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
@@ -1,10 +1,7 @@
 package org.jastadd.relast2uml.compiler;
 
 import beaver.Parser;
-import org.jastadd.relast2uml.ast.ErrorMessage;
-import org.jastadd.relast2uml.ast.GrammarFile;
-import org.jastadd.relast2uml.ast.Program;
-import org.jastadd.relast2uml.ast.Relast2Uml;
+import org.jastadd.relast2uml.ast.*;
 import org.jastadd.relast2uml.compiler.options.CommandLine;
 import org.jastadd.relast2uml.compiler.options.FlagOption;
 import org.jastadd.relast2uml.compiler.options.Option;
@@ -25,6 +22,7 @@ public class Compiler {
 
   private StringOption optionOutputFile;
   private StringOption optionInputRelast2Uml;
+  private FlagOption optionDefaultFolders;
   private FlagOption optionHelp;
   private FlagOption optionVersion;
   private FlagOption optionVerbose;
@@ -165,6 +163,8 @@ public class Compiler {
         "output", "target file to be generated.", "uml.md").makeOptional());
     optionInputRelast2Uml = addOption(new StringOption(
         "inputRelast2Uml", "relast2uml definition file.").makeOptional());
+    optionDefaultFolders = addOption(new FlagOption(
+        "defaultFolders", "Creates a default folder per grammar file."));
     optionHelp = addOption(new FlagOption(
         "help", "Print usage and exit."));
     optionVersion = addOption(new FlagOption(
@@ -193,7 +193,6 @@ public class Compiler {
           inputGrammar.dumpTree(System.out);
         }
         program.addGrammarFile(inputGrammar);
-        inputGrammar.treeResolveAll();
         inputGrammar.setFileName(inputGrammarFileName);
       } catch (IOException | Parser.Exception e) {
         throw new CompilerException("Could not parse grammar file " + inputGrammarFileName, e);
@@ -217,6 +216,11 @@ public class Compiler {
     }
     relast2Uml.setProgram(program);
     relast2Uml.treeResolveAll();
+    if (optionDefaultFolders.isSet()) {
+      for (GrammarFile grammarFile : program.getGrammarFileList()) {
+        relast2Uml.addFolder(grammarFile.defaultFolder());
+      }
+    }
     return relast2Uml;
   }
 
diff --git a/relast2uml.base/src/main/resources/TypeDecl.mustache b/relast2uml.base/src/main/resources/TypeDecl.mustache
index 48eff2c7c8caed5a4bb0974bc2218173536cfb64..a72b5dcfcdc2b8fe11ca240402d98cc787340d83 100644
--- a/relast2uml.base/src/main/resources/TypeDecl.mustache
+++ b/relast2uml.base/src/main/resources/TypeDecl.mustache
@@ -1,4 +1,5 @@
-{{=<% %>=}}<%#isAbstract%>abstract <%/isAbstract%>class <%name%><%#InnerTokenComponents%><%#first%> {<%/first%>
+{{=<% %>=}}<%#isAbstract%>abstract <%/isAbstract%>class <%name%><%#InnerTokenComponents%><%#first%> {
+<%/first%>
   <%name%>
-<%#last%>}<%/last%>
-<%/InnerTokenComponents%><%={{ }}=%>
+<%#last%>
+}<%/last%><%/InnerTokenComponents%><%={{ }}=%>
diff --git a/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java b/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java
index 871500ba6f059b4926fb6b4eb655b79362f16f5d..14de18e22bd30cb474cf9548c92641066667cd8f 100644
--- a/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java
+++ b/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java
@@ -35,6 +35,7 @@ public class CompilerTest {
     String[] args = {
         "--output=" + output,
         "--inputRelast2Uml=" + inputRelast2Uml,
+        "--defaultFolders",
         inputGrammar
     };
 
diff --git a/relast2uml.base/src/test/resources/Example.relast b/relast2uml.base/src/test/resources/Example.relast
index a4a05b6faacc8ae1dde380126f78d12f571801f5..0eb3846f541bdf720d7adf3687defa446c8c30bd 100644
--- a/relast2uml.base/src/test/resources/Example.relast
+++ b/relast2uml.base/src/test/resources/Example.relast
@@ -11,7 +11,7 @@ Funktionsprinzip ::= Dateneingangswert* Verarbeitungsschritt* Datenausgangswert*
 
 abstract Datenquelle;
 // Beispiel für Wert: FB_links, ist_diff, max_diff
-Wert : Datenquelle ::= <Datentyp> ;
+Wert : Datenquelle ::= <Datentyp> <A> <B>;
 
 // Ein Wert, der bei "Dateneingang" steht, z.B. für ReLi: max_Diff oder FB,links
 // Beispiel für Dateneingangswert: Zuordnung, aus welcher Quelle der Wert ausgelesen werden soll