diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
index f55044dddb1582d41689a138818ad2114d2d6fd7..e8afb8ba2d4bb1485be30b543812b48e291dd4b3 100644
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -1,10 +1,10 @@
 aspect Analysis {
   // --- lookupTokenEndpointDefinition ---
   inh java.util.List<TokenEndpointDefinition> TokenEndpointDefinition.lookupTokenEndpointDefinitions(TokenComponent token);
-  eq RagConnect.getEndpointDefinition().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token);
+  eq RagConnect.getConnectSpecificationFile().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token);
   syn java.util.List<TokenEndpointDefinition> RagConnect.lookupTokenEndpointDefinitions(TokenComponent token) {
     java.util.List<TokenEndpointDefinition> result = new java.util.ArrayList<>();
-    for (EndpointDefinition def : getEndpointDefinitionList()) {
+    for (EndpointDefinition def : allEndpointDefinitionList()) {
       if (def.isTokenEndpointDefinition() && def.asTokenEndpointDefinition().getToken().equals(token)) {
         result.add(def.asTokenEndpointDefinition());
       }
@@ -14,10 +14,10 @@ aspect Analysis {
 
   // --- lookupTypeEndpointDefinition ---
   inh java.util.List<TypeEndpointDefinition> TypeEndpointDefinition.lookupTypeEndpointDefinitions(TypeComponent type);
-  eq RagConnect.getEndpointDefinition().lookupTypeEndpointDefinitions(TypeComponent type) = lookupTypeEndpointDefinitions(type);
+  eq RagConnect.getConnectSpecificationFile().lookupTypeEndpointDefinitions(TypeComponent type) = lookupTypeEndpointDefinitions(type);
   syn java.util.List<TypeEndpointDefinition> RagConnect.lookupTypeEndpointDefinitions(TypeComponent type) {
     java.util.List<TypeEndpointDefinition> result = new java.util.ArrayList<>();
-    for (EndpointDefinition def : getEndpointDefinitionList()) {
+    for (EndpointDefinition def : allEndpointDefinitionList()) {
       if (def.isTypeEndpointDefinition() && def.asTypeEndpointDefinition().getType().equals(type)) {
         result.add(def.asTypeEndpointDefinition());
       }
@@ -27,8 +27,8 @@ aspect Analysis {
 
   // --- lookupDependencyDefinition ---
   inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id);
-  eq RagConnect.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) {
-    for (DependencyDefinition def : getDependencyDefinitionList()) {
+  eq RagConnect.getConnectSpecificationFile().lookupDependencyDefinition(TypeDecl source, String id) {
+    for (DependencyDefinition def : allDependencyDefinitionList()) {
       if (def.getID().equals(id) && def.getSource().containingTypeDecl().equals(source)) {
         return def;
       }
diff --git a/ragconnect.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag
index 6b9171df4e85464b6711aa80e76b34f952d6864b..3b75bc0eb633830cb0e63c80d5d51e7d04e1b4f0 100644
--- a/ragconnect.base/src/main/jastadd/NameResolution.jrag
+++ b/ragconnect.base/src/main/jastadd/NameResolution.jrag
@@ -2,7 +2,7 @@ aspect NameResolution {
 
   refine RefResolverStubs eq EndpointDefinition.resolveMappingByToken(String id, int position) {
     // return a MappingDefinition
-    for (MappingDefinition mappingDefinition : ragconnect().getMappingDefinitionList()) {
+    for (MappingDefinition mappingDefinition : ragconnect().allMappingDefinitionList()) {
       if (mappingDefinition.getID().equals(id)) {
         return mappingDefinition;
       }
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index 217f564933d61ff5caf9a3e5ea231a6f398a411f..6ab782f07256aa39b97099ce6d0b982b5f02c1c8 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -1,3 +1,6 @@
+import java.util.List;
+import java.util.ArrayList;
+
 aspect Navigation {
 
   // --- program ---
@@ -16,9 +19,37 @@ aspect Navigation {
 
   // --- containedFileName ---
   eq Grammar.getChild().containedFileName() = null;  // should be in PP
-  eq RagConnect.getChild().containedFileName() = getFileName();
+  eq RagConnect.getChild().containedFileName() = null;
+  eq ConnectSpecificationFile.getChild().containedFileName() = getFileName();
   eq MRagConnect.getChild().containedFileName() = null;
 
+  //--- allEndpointDefinitionList ---
+  syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() {
+    List<EndpointDefinition> result = new ArrayList<>();
+    for (var spec : getConnectSpecificationFileList()) {
+      spec.getEndpointDefinitionList().forEach(result::add);
+    }
+    return result;
+  }
+
+  //--- allDependencyDefinitionList ---
+  syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() {
+    List<DependencyDefinition> result = new ArrayList<>();
+    for (var spec : getConnectSpecificationFileList()) {
+      spec.getDependencyDefinitionList().forEach(result::add);
+    }
+    return result;
+  }
+
+  //--- allMappingDefinitionList ---
+  syn List<MappingDefinition> RagConnect.allMappingDefinitionList() {
+    List<MappingDefinition> result = new ArrayList<>();
+    for (var spec : getConnectSpecificationFileList()) {
+      spec.getMappingDefinitionList().forEach(result::add);
+    }
+    return result;
+  }
+
   // --- isTokenEndpointDefinition ---
   syn boolean EndpointDefinition.isTokenEndpointDefinition() = false;
   eq TokenEndpointDefinition.isTokenEndpointDefinition() = true;
@@ -70,7 +101,7 @@ aspect Navigation {
   // --- targetEndpointDefinition ---
   syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() {
     // resolve definition in here, as we do not need resolveMethod in any other place (yet)
-    for (EndpointDefinition endpointDefinition : ragconnect().getEndpointDefinitionList()) {
+    for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) {
       if (endpointDefinition.isSendTokenEndpointDefinition() &&
           endpointDefinition.asSendTokenEndpointDefinition().getToken().equals(this.getTarget())) {
         return endpointDefinition;
diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast
index 426b90ee22b0aeeb1a9d0cb7a5d77e52838bc0ff..309c4776d923a6afd7b98b7bec190d96db74f28e 100644
--- a/ragconnect.base/src/main/jastadd/RagConnect.relast
+++ b/ragconnect.base/src/main/jastadd/RagConnect.relast
@@ -1,4 +1,7 @@
-RagConnect ::= EndpointDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ;
+RagConnect ::= ConnectSpecificationFile* Program ;
+
+abstract ConnectSpecification ::= EndpointDefinition* DependencyDefinition* MappingDefinition* ;
+ConnectSpecificationFile : ConnectSpecification ::= <FileName> ;
 
 abstract EndpointDefinition ::= <AlwaysApply:boolean> ;
 
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
index 67891ffb7a4918f843b9d152708455659d89f317..3b63bddfd2079518793308e0320fe2311724828e 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
@@ -177,7 +177,7 @@ aspect AttributesForMustache {
   syn lazy MRagConnect RagConnect.toMustache() {
     MRagConnect result = new MRagConnect();
     result.setRagConnect(this);
-    for (EndpointDefinition def : getEndpointDefinitionList()) {
+    for (EndpointDefinition def : allEndpointDefinitionList()) {
       if (def.isReceiveTokenEndpointDefinition()) {
         result.addTokenReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache());
       } else if (def.isSendTokenEndpointDefinition()) {
@@ -193,7 +193,7 @@ aspect AttributesForMustache {
     for (MappingDefinition def : allMappingDefinitions()) {
       result.addMappingDefinition(def.toMustache());
     }
-    for (DependencyDefinition def : getDependencyDefinitionList()) {
+    for (DependencyDefinition def : allDependencyDefinitionList()) {
       result.addDependencyDefinition(def.toMustache());
     }
     for (TokenComponent token : getProgram().allTokenComponents()) {
@@ -316,7 +316,7 @@ aspect AspectGeneration {
 aspect RelationGeneration {
   syn java.util.List<Relation> RagConnect.additionalRelations() {
     java.util.List<Relation> result = new java.util.ArrayList<>();
-    for (DependencyDefinition dd : getDependencyDefinitionList()) {
+    for (DependencyDefinition dd : allDependencyDefinitionList()) {
       result.add(dd.getRelationToCreate());
     }
     return result;
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
index 93f74e51d8acbf140b56e99e279a337506c3a6c0..47379bd06921509023f686ab05621b63eb5729d9 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
+++ b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
@@ -298,7 +298,7 @@ aspect Mappings {
   syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() {
     java.util.List<MappingDefinition> result = new java.util.ArrayList<>();
     // user-defined mappings
-    getMappingDefinitionList().iterator().forEachRemaining(result::add);
+    allMappingDefinitionList().iterator().forEachRemaining(result::add);
     // byte[] <-> primitive conversion
     result.add(defaultBytesToBooleanMapping());
     result.add(defaultBytesToIntMapping());
diff --git a/ragconnect.base/src/main/jastadd/parser/Preamble.parser b/ragconnect.base/src/main/jastadd/parser/Preamble.parser
index d701db19d6edb6d6c616bc79fc0145ea59d2713d..c157ae91f69b0e8d41c40a5bd7426bb2d7fae803 100644
--- a/ragconnect.base/src/main/jastadd/parser/Preamble.parser
+++ b/ragconnect.base/src/main/jastadd/parser/Preamble.parser
@@ -4,4 +4,4 @@ import org.jastadd.ragconnect.ast.*;
 :};
 
 %goal goal;
-%goal ragconnect;
+%goal connect_specification_file;
diff --git a/ragconnect.base/src/main/jastadd/parser/RagConnect.parser b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
index a9d4809331c0ea20e11b0ec2a04dfd1f2c76e95b..eefb64e8ec713991b1c8d214025e71586ad4a645 100644
--- a/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
+++ b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
@@ -1,9 +1,21 @@
-RagConnect ragconnect
-  = endpoint_definition.d ragconnect.r       {: r.getEndpointDefinitionList().insertChild(d, 0); return r; :}
-  | dependency_definition.d ragconnect.r   {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :}
-  | mapping_definition.d ragconnect.r      {: r.getMappingDefinitionList().insertChild(d, 0); return r; :}
-  | comment ragconnect.r                   {: return r; :}
-  |                                     {: return new RagConnect(); :}
+ConnectSpecificationFile connect_specification_file
+  = endpoint_definition.d connect_specification_file.r
+    {:
+      r.getEndpointDefinitionList().insertChild(d, 0); return r;
+    :}
+  | dependency_definition.d connect_specification_file.r
+    {:
+      r.getDependencyDefinitionList().insertChild(d, 0); return r;
+    :}
+  | mapping_definition.d connect_specification_file.r
+    {:
+      r.getMappingDefinitionList().insertChild(d, 0); return r;
+    :}
+  | comment connect_specification_file.r
+    {:
+      return r;
+    :}
+  | {: return new ConnectSpecificationFile(); :}
 ;
 
 %embed {:
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
index 5f7e914fa11630a4c5013b0cc6b2896fc5934dc1..8035d76e424cd813e62c400ffd70f84a6167a98f 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -204,14 +204,13 @@ public class Compiler extends AbstractCompiler {
         case "ast":
         case "relast":
           // processGrammar
-          parseGrammar(program, filename);
+          program.addGrammarFile(parseGrammar(filename));
           atLeastOneGrammar = true;
           break;
         case "connect":
         case "ragconnect":
           // process ragConnect
-          RagConnect parsedRagConnect = parseRagConnect(program, filename);
-          mergeRagConnectDefinitions(ragConnect, parsedRagConnect);
+          ragConnect.addConnectSpecificationFile(parseConnectSpec(filename));
           atLeastOneRagConnect = true;
           break;
         default:
@@ -247,7 +246,7 @@ public class Compiler extends AbstractCompiler {
     return ragConnect;
   }
 
-  private void parseGrammar(Program program, String filename) throws CompilerException {
+  private GrammarFile parseGrammar(String filename) throws CompilerException {
     try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
       RagConnectScanner scanner = new RagConnectScanner(reader);
       RagConnectParser parser = new RagConnectParser();
@@ -255,21 +254,20 @@ public class Compiler extends AbstractCompiler {
       if (optionVerbose.value()) {
         LOGGER.fine(grammarFile::dumpTree);
       }
-      program.addGrammarFile(grammarFile);
       grammarFile.setFileName(toBaseName(filename));
+      return grammarFile;
     } catch (IOException | Parser.Exception e) {
       throw new CompilerException("Could not parse grammar file " + filename, e);
     }
   }
 
-  private RagConnect parseRagConnect(Program program, String filename) throws CompilerException {
+  private ConnectSpecificationFile parseConnectSpec(String filename) throws CompilerException {
     try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
       RagConnectScanner scanner = new RagConnectScanner(reader);
       RagConnectParser parser = new RagConnectParser();
-      RagConnect ragConnect = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect);
-      ragConnect.setProgram(program);
-      ragConnect.setFileName(toBaseName(filename));
-      return ragConnect;
+      ConnectSpecificationFile specificationFile = (ConnectSpecificationFile) parser.parse(scanner, RagConnectParser.AltGoals.connect_specification_file);
+      specificationFile.setFileName(toBaseName(filename));
+      return specificationFile;
     } catch (IOException | Parser.Exception e) {
       throw new CompilerException("Could not parse connect file " + filename, e);
     }
@@ -284,13 +282,6 @@ public class Compiler extends AbstractCompiler {
     return new File(filename).getName();
   }
 
-  private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) {
-    ragConnectToIntegrate.getEndpointDefinitionList().forEach(ragConnect::addEndpointDefinition);
-    ragConnectToIntegrate.getMappingDefinitionList().forEach(ragConnect::addMappingDefinition);
-    ragConnectToIntegrate.getDependencyDefinitionList().forEach(ragConnect::addDependencyDefinition);
-    ragConnect.setFileName(ragConnect.getFileName().isEmpty() ? ragConnectToIntegrate.getFileName() : ragConnect.getFileName() + " + " + ragConnectToIntegrate.getFileName());
-  }
-
 //  protected void printUsage() {
 //    System.out.println("Usage: java -jar ragconnect.jar [--option1] [--option2=value] ...  <filename1> <filename2> ... ");
 //    System.out.println("Options:");
diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.expected b/ragconnect.tests/src/test/01-input/errors/Errors.expected
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/ragconnect.tests/src/test/01-input/errors/Part.expected b/ragconnect.tests/src/test/01-input/errors/Part.expected
new file mode 100644
index 0000000000000000000000000000000000000000..70ea4a4baeaffb5b35df672c03e90821eb3cec82
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/errors/Part.expected
@@ -0,0 +1,11 @@
+Part1.connect Line 3, column 1: Receive definition already defined for DoubledValue
+Part1.connect Line 4, column 1: Receive definition already defined for DoubledValue
+Part1.connect Line 10, column 1: Receiving target token must not be an NTA token!
+Part1.connect Line 13, column 1: No suitable default mapping found for type java.util.List
+Part1.connect Line 13, column 1: to-type of last mapping (java.util.List) not assignable to type of the Token (String)!
+Part1.connect Line 16, column 1: to-type of last mapping (List) not assignable to type of the Token (String)!
+Part1.connect Line 19, column 1: to-type of last mapping (int) not assignable to type of the Token (String)!
+Part2.connect Line 5, column 1: Send definition already defined for DoubledValue
+Part2.connect Line 6, column 1: Send definition already defined for DoubledValue
+Part2.connect Line 17, column 1: The name of a dependency definition must not be equal to a list-node on the source
+Part2.connect Line 22, column 1: Dependency definition already defined for D with name DoubledValue
diff --git a/ragconnect.tests/src/test/01-input/errors/Part1.connect b/ragconnect.tests/src/test/01-input/errors/Part1.connect
new file mode 100644
index 0000000000000000000000000000000000000000..a1be3918b36ee19561a278639555db14efb8da06
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/errors/Part1.connect
@@ -0,0 +1,33 @@
+// --- update receive definitions ---
+// Error: there must not be two receive definitions for the same token
+receive B.DoubledValue ;
+receive B.DoubledValue using IntToInt ;
+
+// NOT HANDLED \\ Error: the token must be resolvable within the parent type
+// NOT HANDLED \\ receive B.NonExisting ;
+
+// Error: the Token must not be a TokenNTA (i.e., check for !Token.getNTA())
+receive B.ErrorNTA ;
+
+// Error: from-type of first mapping must be byte[] or a supported primitive type
+receive B.ErrorTypeOfFirstMapping using ListToList ;
+
+// Error: to-type of last mapping must be type of the Token
+receive B.ErrorTypeOfLastMapping using StringToList ;
+
+// Error: types of mappings must match (modulo inheritance)
+receive B.ErrorTypeMismatch using StringToList, IntToInt ;
+
+// --- update send definitions ---
+// NOT HANDLED \\ Error: the token must be resolvable within the parent type
+// NOT HANDLED \\ receive C.NonExisting ;
+
+// Error: Token must be a TokenNTA (i.e., check for Token.getNTA())
+send C.ErrorNotNTA ;
+
+// Error: from-type of first mapping must be type of Token
+send C.ErrorTypeOfFirstMapping using IntToInt ;
+
+// Error: to-type of last mapping must be byte[] or a supported primitive type
+send C.ErrorTypeOfLastMapping1 using StringToList ;
+send C.ErrorTypeOfLastMapping2 ;
diff --git a/ragconnect.tests/src/test/01-input/errors/Part2.connect b/ragconnect.tests/src/test/01-input/errors/Part2.connect
new file mode 100644
index 0000000000000000000000000000000000000000..4d1148260a36855528b37f8b45020e076ff9ff1e
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/errors/Part2.connect
@@ -0,0 +1,38 @@
+// Error: types of mappings must match (modulo inheritance)
+send C.ErrorTypeMismatch using StringToList, IntToInt ;
+
+// Error: no more than one send mapping for each TokenComponent
+send C.DoubledValue ;
+send C.DoubledValue using IntToInt ;
+
+// --- dependency definitions ---
+// NOT HANDLED \\ Error: Both, source and target must be resolvable within the parent type
+// NOT HANDLED \\ D.SourceNonExistingTarget canDependOn D.NonExisting as NonExistingTarget ;
+// NOT HANDLED \\ D.NonExisting canDependOn D.TargetNonExistingSource as NonExistingSource ;
+
+// Error: There must be a send update definition for the target token
+D.SourceNoWriteDef canDependOn D.TargetNoWriteDef as NoWriteDef ;
+
+// Error: The name of a dependency definition must not be equal to a list-node on the source
+D.SourceSameAsListNode canDependOn D.TargetSameAsListNode as MyList ;
+send D.TargetSameAsListNode;
+
+// Error: There must not be two dependency definitions with the same name
+D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ;
+D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ;
+send D.TargetDoubledValue;
+
+// --- mapping definitions ---
+ListToList maps java.util.List<String> list to java.util.List<String> {:
+  return list;
+:}
+
+StringToList maps String s to List<String> {:
+  java.util.List<String> result = new java.util.ArrayList<>();
+  result.add(s);
+  return result;
+:}
+
+IntToInt maps int number to int {:
+  return number + 1;
+:}
diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.connect b/ragconnect.tests/src/test/01-input/errors/Standard.connect
similarity index 100%
rename from ragconnect.tests/src/test/01-input/errors/Errors.connect
rename to ragconnect.tests/src/test/01-input/errors/Standard.connect
diff --git a/ragconnect.tests/src/test/01-input/errors/Standard.expected b/ragconnect.tests/src/test/01-input/errors/Standard.expected
new file mode 100644
index 0000000000000000000000000000000000000000..3ee660570525834a63c41f26820966a7504f7789
--- /dev/null
+++ b/ragconnect.tests/src/test/01-input/errors/Standard.expected
@@ -0,0 +1,11 @@
+Standard.connect Line 3, column 1: Receive definition already defined for DoubledValue
+Standard.connect Line 4, column 1: Receive definition already defined for DoubledValue
+Standard.connect Line 10, column 1: Receiving target token must not be an NTA token!
+Standard.connect Line 13, column 1: No suitable default mapping found for type java.util.List
+Standard.connect Line 13, column 1: to-type of last mapping (java.util.List) not assignable to type of the Token (String)!
+Standard.connect Line 16, column 1: to-type of last mapping (List) not assignable to type of the Token (String)!
+Standard.connect Line 19, column 1: to-type of last mapping (int) not assignable to type of the Token (String)!
+Standard.connect Line 39, column 1: Send definition already defined for DoubledValue
+Standard.connect Line 40, column 1: Send definition already defined for DoubledValue
+Standard.connect Line 51, column 1: The name of a dependency definition must not be equal to a list-node on the source
+Standard.connect Line 56, column 1: Dependency definition already defined for D with name DoubledValue
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
index cc0596482e7559166947febb30144118ab4dbe10..47fa7c7c60d24d934ff2a979461a041319bdb49b 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
@@ -10,11 +10,13 @@ import org.junit.jupiter.api.Test;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.jastadd.ragconnect.tests.TestUtils.exec;
 import static org.jastadd.ragconnect.tests.TestUtils.readFile;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -26,6 +28,8 @@ public class Errors {
   private static final String INPUT_DIRECTORY = "./src/test/01-input/errors/";
   private static final String OUTPUT_DIRECTORY = "./src/test/02-after-ragconnect/errors/";
 
+  private static final String DEFAULT_GRAMMAR_NAME = "Errors";
+
   @BeforeAll
   public static void createOutputDirectory() {
     File outputDirectory = new File(OUTPUT_DIRECTORY);
@@ -34,35 +38,49 @@ public class Errors {
 
   @Test
   void testStandardErrors() throws IOException {
-    test("Errors", "A");
+    test("Standard", "A","Standard");
+  }
+
+  @Test
+  void testTwoPartsErrors() throws IOException {
+    test("Part", "A","Part1", "Part2");
   }
 
   @SuppressWarnings("SameParameterValue")
-  private void test(String name, String rootNode) throws IOException {
-    String grammarFile = INPUT_DIRECTORY + name + ".relast";
-    String ragconnectFile = INPUT_DIRECTORY + name + ".connect";
-    String outFile = OUTPUT_DIRECTORY + name + ".out";
-    String expectedFile = INPUT_DIRECTORY + name + ".expected";
+  private void test(String expectedName, String rootNode, String... connectNames) throws IOException {
+    String grammarFile = INPUT_DIRECTORY + DEFAULT_GRAMMAR_NAME + ".relast";
+//    String ragconnectFile = INPUT_DIRECTORY + name + ".connect";
+    String outFile = OUTPUT_DIRECTORY + expectedName + ".out";
+    String expectedFile = INPUT_DIRECTORY + expectedName + ".expected";
+
+    assertThat(connectNames).isNotEmpty();
 
     try {
       logger.debug("user.dir: {}", System.getProperty("user.dir"));
-      String[] args = {
-          "--o=" + OUTPUT_DIRECTORY,
-          grammarFile,
-          ragconnectFile,
-          "--rootNode=" + rootNode,
-          "--verbose"
-      };
-      int returnValue = exec(Compiler.class, args, new File(outFile));
+      List<String> args = new ArrayList<>() {{
+          add("--o=" + OUTPUT_DIRECTORY);
+          add("--rootNode=" + rootNode);
+          add("--verbose");
+          add(grammarFile);
+      }};
+      for (String connectName : connectNames) {
+        args.add(INPUT_DIRECTORY + connectName + ".connect");
+      }
+
+      int returnValue = exec(Compiler.class, args.toArray(new String[0]), new File(outFile));
       Assertions.assertEquals(1, returnValue, "RagConnect did not return with value 1");
     } catch (IOException | InterruptedException e) {
       e.printStackTrace();
     }
 
+    final String startOfErrorsPattern = "SEVERE: Errors:";
     String out = readFile(outFile, Charset.defaultCharset());
+    assertThat(out).contains(startOfErrorsPattern);
+    out = out.substring(out.indexOf(startOfErrorsPattern) + 16);
+
     String expected = readFile(expectedFile, Charset.defaultCharset());
 //    if (inFiles.size() == 1) {
-      expected = expected.replace(FILENAME_PATTERN, name);
+//      expected = expected.replace(FILENAME_PATTERN, name + ".connect");
 //    } else {
 //      for (int i = 0; i < inFiles.size(); i++) {
 //        expected = expected.replace(FILENAME_PATTERN + (i + 1), inFiles.get(i));
@@ -75,10 +93,9 @@ public class Errors {
         .filter(s -> !s.isEmpty() && !s.startsWith("//"))
         .collect(Collectors.toList());
 
-    // FIXME errors not handled correctly at the moment
-//    Assertions.assertLinesMatch(expectedList, outList);
+    Assertions.assertLinesMatch(expectedList, outList);
 
-    logger.info("ragconnect for " + name + " returned:\n{}", out);
+    logger.info("ragconnect for " + expectedName + " returned:\n{}", out);
   }
 
 }