diff --git a/dumpAst/src/main/jastadd/Generation.jadd b/dumpAst/src/main/jastadd/Generation.jadd
index 38c7db06366d76ea4062b8a475e119966bff3388..ee53e202e266792124b1ad83392e281e1d5533ab 100644
--- a/dumpAst/src/main/jastadd/Generation.jadd
+++ b/dumpAst/src/main/jastadd/Generation.jadd
@@ -53,32 +53,61 @@ import java.lang.String;aspect GenerationFrontend {
     }
 
     /**
-     * Exclude object with types matching at least one of the given regex strings.
-     * Exlcuding object won't be included in any output. However, their children are still processed.
+     * Disable all objects with types matching at least one of the given regex strings.
+     * Disabled objects won't be included in any output. However, their children are still processed.
      * @param regexes patterns to match type names
      * @return this
      * @see java.util.regex.Pattern#compile(java.lang.String)
      */
-    public DumpBuilder excludeTypes(String... regexes) {
+    public DumpBuilder disableTypes(String... regexes) {
       updateIgnored(() -> buildConfig.getTypeIgnore(), s -> buildConfig.setTypeIgnore(s), regexes);
       return this;
     }
+
+    /**
+     * Exclude tokens and their value if the token name matches at least one of the given regex strings.
+     * @param regexes regex patterns to match token names
+     * @return this
+     * @see java.util.regex.Pattern#compile(java.lang.String)
+     */
     public DumpBuilder excludeTokens(String... regexes) {
       updateIgnored(() -> buildConfig.getTokenIgnore(), s -> buildConfig.setTokenIgnore(s), regexes);
       return this;
     }
-    public DumpBuilder excludeAttributes(String... regexes) {
+    // not supported yet
+    public DumpBuilder includeAttributes(String... regexes) {
       updateIgnored(() -> buildConfig.getAttributeIgnore(), s -> buildConfig.setAttributeIgnore(s), regexes);
       return this;
     }
+    // not supported yet
+    public DumpBuilder includeNonterminalAttributes(String... regexes) {
+      // TODO
+      return this;
+    }
+
+    /**
+     * Exclude every child whose name (i.e., context) matches at least on of the given regex strings.
+     * Unlike disabling types, the complete object and its (transitive) children won't be included in any output.
+     * @param regexes regex patterns to match child names
+     * @return this
+     * @see java.util.regex.Pattern#compile(java.lang.String)
+     */
     public DumpBuilder excludeChildren(String... regexes) {
       updateIgnored(() -> buildConfig.getChildIgnore(), s -> buildConfig.setChildIgnore(s), regexes);
       return this;
     }
+    /**
+     * Exclude every relation whose role-name matches at least on of the given regex strings.
+     * Unlike disabling types, the complete object and its (transitive) children won't be included in any output, except.
+     * @param regexes regex patterns to match child names
+     * @return this
+     * @see java.util.regex.Pattern#compile(java.lang.String)
+     */
     public DumpBuilder excludeRelations(String... regexes) {
       updateIgnored(() -> buildConfig.getRelationIgnore(), s -> buildConfig.setRelationIgnore(s), regexes);
       return this;
     }
+
     private void updateIgnored(java.util.function.Supplier<String> getter, java.util.function.Consumer<String> setter, String... values) {
       for (String value : values) {
         if (getter.get().isEmpty()) {
@@ -93,6 +122,7 @@ import java.lang.String;aspect GenerationFrontend {
       printConfig.addHeader(new Header(option));
       return this;
     }
+
     public DumpBuilder skinParam(SkinParamStringSetting setting, String value) {
       customPreamble("skinparam " + setting.toString() + " " + value);
       return this;
@@ -101,6 +131,7 @@ import java.lang.String;aspect GenerationFrontend {
       customPreamble("skinparam " + setting.toString() + " " + value);
       return this;
     }
+
     public DumpBuilder setScale(double value) {
       printConfig.setScale(value);
       return this;
@@ -133,6 +164,13 @@ import java.lang.String;aspect GenerationFrontend {
       }
       return result;
     }
+
+    /**
+     * Write out content as plantuml source code.
+     * @param destination path of destination file
+     * @return this
+     * @throws java.io.IOException if an I/O error happend during opening or writing in that file
+     */
     public DumpBuilder dumpAsSource(java.nio.file.Path destination) throws java.io.IOException {
       String content = build().toPlantUml();
       try (java.io.Writer writer = java.nio.file.Files.newBufferedWriter(destination)) {
@@ -140,12 +178,26 @@ import java.lang.String;aspect GenerationFrontend {
       }
       return this;
     }
+
+    /**
+     * Write out content as PNG image generated by plantuml.
+     * @param destination path of destination file
+     * @return this
+     * @throws java.io.IOException if an I/O error happend during opening or writing in that file
+     */
     public DumpBuilder dumpAsPNG(java.nio.file.Path destination) throws java.io.IOException {
       String content = build().toPlantUml();
       net.sourceforge.plantuml.SourceStringReader reader = new net.sourceforge.plantuml.SourceStringReader(content);
       reader.outputImage(java.nio.file.Files.newOutputStream(destination));
       return this;
     }
+
+    /**
+     * Write out content as SVG image generated by plantuml.
+     * @param destination path of destination file
+     * @return this
+     * @throws java.io.IOException if an I/O error happend during opening or writing in that file
+     */
     public DumpBuilder dumpAsSVG(java.nio.file.Path destination) throws java.io.IOException {
       String content = build().toPlantUml();
       net.sourceforge.plantuml.SourceStringReader reader = new net.sourceforge.plantuml.SourceStringReader(content);
diff --git a/dumpAst/src/main/java/de/tudresden/inf/st/jastadd/dumpAst/SimpleMain.java b/dumpAst/src/main/java/de/tudresden/inf/st/jastadd/dumpAst/SimpleMain.java
index 0d1b70cc6eb18ad6f9d4b75149ebaedcf206481b..454a6ae77f3bd5594b979ef250ab2c1148d3d085 100644
--- a/dumpAst/src/main/java/de/tudresden/inf/st/jastadd/dumpAst/SimpleMain.java
+++ b/dumpAst/src/main/java/de/tudresden/inf/st/jastadd/dumpAst/SimpleMain.java
@@ -116,7 +116,7 @@ public class SimpleMain {
     Dumper.read(model.toMustache())
         .skinParam(SkinParamBooleanSetting.Monochrome, true)
         .enableDebug()
-        .excludeTypes(".*Comment")
+        .disableTypes(".*Comment")
         .dumpAsSource(Paths.get("temp.plantuml"))
         .dumpAsSVG(Paths.get("temp.svg"));
   }
diff --git a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestExcluded.java b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestExcluded.java
index 9e25685b089420f784648c8dddac2540f26722a2..4faf6639b16f68cd1fae55527a9a4a97425cec5f 100644
--- a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestExcluded.java
+++ b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestExcluded.java
@@ -5,6 +5,7 @@ import de.tudresden.inf.st.jastadd.dumpAst.ast.DumpNode;
 import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
 import org.jastadd.testDumper.ast.A;
 import org.jastadd.testDumper.ast.Root;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
@@ -46,7 +47,7 @@ public class TestExcluded {
     assertThat(valueTokens(actualB3)).containsOnly(entry("Name", B3_NAME), entry(TOKEN_LABEL_OTHER_VALUE, ""));
   }
 
-  private Root setupTypes() {
+  private Root setupAllRelations() {
     Root root = createRoot(createA(A_NAME), createC(C_NAME), createB(B_NAME, "A"));
     root.getC().setRawReference(root.getA());
     // rel B.oneA -> A ;
@@ -66,14 +67,14 @@ public class TestExcluded {
 
   @Test
   public void testTypesDefault() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
     List<DumpNode> nodes = TestUtils.dumpModel(root);
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, B_NAME, C_NAME);
-    assertTypeDefaultMatches(nodes);
+    assertAllRelationsDefaultMatches(nodes);
   }
 
-  private void assertTypeDefaultMatches(List<DumpNode> nodes) {
+  private void assertAllRelationsDefaultMatches(List<DumpNode> nodes) {
     // A
     assertThatMapOf(normalRelationChildren(findByName(nodes, A_NAME))).containsExactlyInAnyOrder(
         tuple("BiC1", C_NAME), tuple("BiC2", C_NAME), tuple("BiC3", C_NAME));
@@ -85,32 +86,32 @@ public class TestExcluded {
         tuple("BiA1", A_NAME), tuple("BiA3", A_NAME));
     assertThatMapOf(listRelationChildren(findByName(nodes, C_NAME)), "BiA2").containsExactlyInAnyOrder(A_NAME);
     assertThatMapOf(referenceTokens(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
-        tuple("RawReference", A_NAME));
+        tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
   }
 
   @Test
   public void testTypesNonMatching() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("NonExistingType"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("NonExistingType"));
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, B_NAME, C_NAME);
-    assertTypeDefaultMatches(nodes);
+    assertAllRelationsDefaultMatches(nodes);
   }
 
   @Test
   public void testTypesInheritanceNotIncluded() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("Nameable"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("Nameable"));
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, B_NAME, C_NAME);
-    assertTypeDefaultMatches(nodes);
+    assertAllRelationsDefaultMatches(nodes);
   }
 
   @Test
   public void testTypesExcludeOnlyA() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("A"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("A"));
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, B_NAME, C_NAME);
     // B
     assertThatMapOf(normalRelationChildren(findByName(nodes, B_NAME))).containsExactlyInAnyOrder(
@@ -123,60 +124,263 @@ public class TestExcluded {
 
   @Test
   public void testTypesExcludeMultipleArguments() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("A", "C"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("A", "C"));
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, B_NAME);
     // B
-    assertThatMapOf(normalRelationChildren(findByName(nodes, B_NAME))).isEmpty();
+    assertThat(normalRelationChildren(findByName(nodes, B_NAME))).isEmpty();
   }
 
   @Test
   public void testTypesExcludeMultipleCalls() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("A").excludeTypes("C"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("A").disableTypes("C"));
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, B_NAME);
     // B
-    assertThatMapOf(normalRelationChildren(findByName(nodes, B_NAME))).isEmpty();
+    assertThat(normalRelationChildren(findByName(nodes, B_NAME))).isEmpty();
   }
 
   @Test
   public void testTypesExcludeRegex() {
-    Root root = setupTypes();
+    Root root = setupAllRelations();
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("Ro*t"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("Ro*t"));
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(A_NAME, B_NAME, C_NAME);
-    assertTypeDefaultMatches(nodes);
+    assertAllRelationsDefaultMatches(nodes);
   }
 
   @Test
-  public void testTypesInvisiblePath() throws IOException {
+  public void testTypesInvisiblePath() {
     final String A2_Name = "a2";
     final String A3_Name = "a3";
     final String C2_Name = "c2";
-    A mostInnerA = createA(A3_Name);
-    mostInnerA.setB(createB(B_NAME));
     Root root = createRoot(createA(A_NAME,
         createC(C_NAME,
             createA(A2_Name,
-                createC(C2_Name, mostInnerA)))),
+                createC(C2_Name,
+                    createA(A3_Name, a -> a.setB(createB(B_NAME))))))),
         null);
 
-    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTypes("A", "C"));
-    Dumper.read(root).excludeTypes("A", "C").dumpAsPNG(Paths.get("test.png"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.disableTypes("A", "C"));
     DumpNode actualRoot = findByName(nodes, ROOT_NAME);
     assertThat(invisiblePath(actualRoot)).flatExtracting(NAME_EXTRACTOR).containsExactly(B_NAME);
   }
 
   @Test
   public void testTokenDefault() {
+    A a = createA(A_NAME);
+    Root root = createRoot(a, createC(C_NAME, c -> {
+      c.setRawReference(a);
+      c.setUnwanted(5);
+      c.setBiA1(a);
+    }));
 
+    List<DumpNode> nodes = TestUtils.dumpModel(root);
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, C_NAME);
+    DumpNode actualC = findByName(nodes, C_NAME);
+    assertThat(valueTokens(actualC)).containsOnly(
+        entry("Name", C_NAME),
+        entry(TOKEN_LABEL_UNWANTED, 5));
+    assertThatMapOf(referenceTokens(actualC)).containsOnly(tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
+    assertThatMapOf(normalRelationChildren(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple("BiA1", A_NAME));
+  }
+
+  @Test
+  public void testTokenExcludeValue() {
+    A a = createA(A_NAME);
+    Root root = createRoot(a, createC(C_NAME, c -> {
+      c.setRawReference(a);
+      c.setUnwanted(5);
+      c.setBiA1(a);
+    }));
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTokens(TOKEN_LABEL_UNWANTED));
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, C_NAME);
+    DumpNode actualC = findByName(nodes, C_NAME);
+    assertThat(valueTokens(actualC)).containsOnly(
+        entry("Name", C_NAME));
+    assertThatMapOf(referenceTokens(actualC)).containsOnly(tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
+    assertThatMapOf(normalRelationChildren(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple("BiA1", A_NAME));
+
+  }
+
+  @Test
+  public void testTokenExcludeValueAndReference() {
+    A a = createA(A_NAME);
+    Root root = createRoot(a, createC(C_NAME, c -> {
+      c.setRawReference(a);
+      c.setUnwanted(5);
+      c.setBiA1(a);
+    }));
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTokens(TOKEN_LABEL_UNWANTED, TOKEN_LABEL_RAW_REFERENCE));
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, C_NAME);
+    DumpNode actualC = findByName(nodes, C_NAME);
+    assertThat(valueTokens(actualC)).containsOnly(
+        entry("Name", C_NAME));
+    assertThat(referenceTokens(actualC)).isEmpty();
+    assertThatMapOf(normalRelationChildren(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple("BiA1", A_NAME));
+
+  }
+
+  @Test
+  public void testTokenExcludeRelationNameLowerCase() {
+    A a = createA(A_NAME);
+    Root root = createRoot(a, createC(C_NAME, c -> {
+      c.setRawReference(a);
+      c.setUnwanted(5);
+      c.setBiA1(a);
+    }));
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTokens("bi.*"));
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, C_NAME);
+    DumpNode actualC = findByName(nodes, C_NAME);
+    assertThat(valueTokens(actualC)).containsOnly(
+        entry("Name", C_NAME),
+        entry(TOKEN_LABEL_UNWANTED, 5));
+    assertThatMapOf(referenceTokens(actualC)).containsOnly(tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
+    assertThatMapOf(normalRelationChildren(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple("BiA1", A_NAME));
+  }
+
+  @Test
+  public void testTokenExcludeRelationNameTitleCase() {
+    A a = createA(A_NAME);
+    Root root = createRoot(a, createC(C_NAME, c -> {
+      c.setRawReference(a);
+      c.setUnwanted(5);
+      c.setBiA1(a);
+    }));
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeTokens("Bi.*"));
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, C_NAME);
+    DumpNode actualC = findByName(nodes, C_NAME);
+    assertThat(valueTokens(actualC)).containsOnly(
+        entry("Name", C_NAME),
+        entry(TOKEN_LABEL_UNWANTED, 5));
+    assertThatMapOf(referenceTokens(actualC)).containsOnly(tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
+    assertThatMapOf(normalRelationChildren(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple("BiA1", A_NAME));
+
+  }
+
+  @Test
+  public void testChildrenDefault() throws IOException {
+    /*  Root
+        |- a
+           |- b  - - -.
+           |-MyC: c   v
+                  |- a2
+                     |- b2
+    */
+    final String A2_Name = "a2";
+    Root root = createRoot(createA(A_NAME, a -> {
+      a.setB(createB(B_NAME));
+      a.setMyC(createC(C_NAME,
+          createA(A2_Name, a2 -> a2.setB(createB(B2_NAME)))));
+    }), null);
+    root.getA().getB().setOneA(root.getA().getMyC().getA());
+
+    Dumper.read(root).disableTypes("C").dumpAsPNG(Paths.get("test.png"));
+    List<DumpNode> nodes = TestUtils.dumpModel(root);
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(
+        ROOT_NAME, A_NAME, A2_Name, B_NAME, B2_NAME, C_NAME);
+    DumpNode actualA = findByName(nodes, A_NAME);
+    assertThatMapOf(normalChildren(actualA)).containsExactlyInAnyOrder(
+        tuple("MyC", C_NAME), tuple("B", B_NAME));
+  }
+
+  @Disabled("a2 and b2 are included in output, so currently not working as intended")
+  @Test
+  public void testChildrenExclude() {
+    /*  Root
+        |- a
+           |- b  - - -.
+           |-MyC: c   v
+                  |- a2
+                     |- b2
+    */
+    final String A2_Name = "a2";
+    Root root = createRoot(createA(A_NAME, a -> {
+      a.setB(createB(B_NAME));
+      a.setMyC(createC(C_NAME,
+          createA(A2_Name, a2 -> a2.setB(createB(B2_NAME)))));
+    }), null);
+    root.getA().getB().setOneA(root.getA().getMyC().getA());
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeChildren("MyC"));
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, B_NAME);
+    DumpNode actualA = findByName(nodes, A_NAME);
+    assertThatMapOf(normalChildren(actualA)).containsExactlyInAnyOrder(tuple("B", B_NAME));
+  }
+
+  @Test
+  public void testRelationsDefault() {
+    // actually the same test as #testTypesDefault, but can't hurt to test twice
+    Root root = setupAllRelations();
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root);
+    assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, B_NAME, C_NAME);
+    assertAllRelationsDefaultMatches(nodes);
   }
 
   @Test
-  public void testTokenExclude() {
+  public void testRelationsExclude() {
+    Root root = setupAllRelations();
 
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeRelations("BiC1"));
+    // A
+    assertThatMapOf(normalRelationChildren(findByName(nodes, A_NAME))).containsExactlyInAnyOrder(
+        tuple("BiC2", C_NAME), tuple("BiC3", C_NAME));
+    // B
+    assertThatMapOf(normalRelationChildren(findByName(nodes, B_NAME))).containsExactlyInAnyOrder(
+        tuple("OneA", A_NAME), tuple("MaybeC", C_NAME));
+    // C
+    assertThatMapOf(normalRelationChildren(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple("BiA1", A_NAME), tuple("BiA3", A_NAME));
+    assertThatMapOf(listRelationChildren(findByName(nodes, C_NAME)), "BiA2").containsExactlyInAnyOrder(A_NAME);
+    assertThatMapOf(referenceTokens(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
+  }
+
+  @Test
+  public void testRelationsExcludeRegex1() {
+    Root root = setupAllRelations();
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeRelations("Bi.*"));
+    // A
+    assertThat(normalRelationChildren(findByName(nodes, A_NAME))).isEmpty();
+    // B
+    assertThatMapOf(normalRelationChildren(findByName(nodes, B_NAME))).containsExactlyInAnyOrder(
+        tuple("OneA", A_NAME), tuple("MaybeC", C_NAME));
+    // C
+    assertThat(normalRelationChildren(findByName(nodes, C_NAME))).isEmpty();
+    assertThat(listRelationChildren(findByName(nodes, C_NAME))).isEmpty();
+    assertThatMapOf(referenceTokens(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
+  }
+
+  @Test
+  public void testRelationsExcludeRegex2() {
+    Root root = setupAllRelations();
+
+    List<DumpNode> nodes = TestUtils.dumpModel(root, db -> db.excludeRelations(".*A.*"));
+    // A
+    assertThatMapOf(normalRelationChildren(findByName(nodes, A_NAME))).containsExactlyInAnyOrder(
+        tuple("BiC1", C_NAME), tuple("BiC2", C_NAME), tuple("BiC3", C_NAME));
+    // B
+    assertThatMapOf(normalRelationChildren(findByName(nodes, B_NAME))).containsExactlyInAnyOrder(
+        tuple("MaybeC", C_NAME));
+    // C
+    assertThat(normalRelationChildren(findByName(nodes, C_NAME))).isEmpty();
+    assertThat(listRelationChildren(findByName(nodes, C_NAME))).isEmpty();
+    assertThatMapOf(referenceTokens(findByName(nodes, C_NAME))).containsExactlyInAnyOrder(
+        tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
   }
 
   // --- copy from below here ---
diff --git a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java
index 4dfb16c46f5ffcea4c75da01183e53cbea6a072d..d40a297d95223a7e989ccdbcdeac08516f53d9a6 100644
--- a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java
+++ b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java
@@ -88,8 +88,6 @@ public class TestSimple {
     List<DumpNode> nodes = TestUtils.dumpModel(root);
     assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, A2_NAME, B_NAME, C_NAME);
     DumpNode actualB = TestUtils.findByName(nodes, B_NAME);
-//    assertThatListMapOf(listRelationChildren(actualB)).containsExactlyInAnyOrder(
-//        tuple("ManyA", tuple(A_NAME, A2_NAME)));
     assertThatMapOf(listRelationChildren(actualB), "ManyA").containsExactlyInAnyOrder(A_NAME, A2_NAME);
   }
 
@@ -154,7 +152,7 @@ public class TestSimple {
     List<DumpNode> nodes = TestUtils.dumpModel(root);
     assertEquals(4, nodes.size());
     DumpNode actualC = TestUtils.findByName(nodes, C_NAME);
-    assertThatMapOf(referenceTokens(actualC)).containsExactlyInAnyOrder(tuple("RawReference", A_NAME));
+    assertThatMapOf(referenceTokens(actualC)).containsExactlyInAnyOrder(tuple(TOKEN_LABEL_RAW_REFERENCE, A_NAME));
   }
 
 }
diff --git a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestUtils.java b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestUtils.java
index 1398494b9b4a3be62f84196285641723f63b529a..b5b1fcf332a68076bb36cefb6fc31e1e82e303f9 100644
--- a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestUtils.java
+++ b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestUtils.java
@@ -20,6 +20,8 @@ public class TestUtils {
   public static final Random rand = new Random();
 
   public static final String TOKEN_LABEL_OTHER_VALUE = "OtherValue";
+  public static final String TOKEN_LABEL_UNWANTED = "Unwanted";
+  public static final String TOKEN_LABEL_RAW_REFERENCE = "RawReference";
 
   public static final String ROOT_NAME = "Root" + Integer.toHexString(rand.nextInt(0xFFFFFF));
   public static final String A_NAME = "A" + Integer.toHexString(rand.nextInt(0xFFFFFF));
@@ -45,41 +47,47 @@ public class TestUtils {
   }
 
   public static A createA(String name) {
+    return createA(name, a -> {});
+  }
+
+  public static A createA(String name, Consumer<A> additionalSettings) {
     A result = new A();
     result.setName(name);
+    additionalSettings.accept(result);
     return result;
   }
 
   public static A createA(String name, C myC) {
-    A result = new A();
-    result.setName(name);
-    result.setMyC(myC);
-    return result;
+    return createA(name, a -> a.setMyC(myC));
   }
 
   public static B createB(String name) {
-    B result = new B();
-    result.setName(name);
-    return result;
+    return createB(name, b -> {});
   }
 
   public static B createB(String name, String otherValue) {
+    return createB(name, b -> b.setOtherValue(otherValue));
+  }
+
+  public static B createB(String name, Consumer<B> additionalSettings) {
     B result = new B();
     result.setName(name);
-    result.setOtherValue(otherValue);
+    additionalSettings.accept(result);
     return result;
   }
 
   public static C createC(String name) {
-    C result = new C();
-    result.setName(name);
-    return result;
+    return createC(name, c -> {});
   }
 
   public static C createC(String name, A optA) {
+    return createC(name, c -> c.setA(optA));
+  }
+
+  public static C createC(String name, Consumer<C> additionalSettings) {
     C result = new C();
     result.setName(name);
-    result.setA(optA);
+    additionalSettings.accept(result);
     return result;
   }