diff --git a/src/java/org/jastadd/relast/compiler/Compiler.java b/src/java/org/jastadd/relast/compiler/Compiler.java
index 27f50ac2bad23c1ce3417adc90c4bf1e6acc6d55..a6f8a1dd7e2b09a209cbdf37b786e1a351ec06a5 100644
--- a/src/java/org/jastadd/relast/compiler/Compiler.java
+++ b/src/java/org/jastadd/relast/compiler/Compiler.java
@@ -20,6 +20,7 @@ import beaver.Parser;
 public class Compiler {
 	protected ArrayList<Option<?>> options;
 	protected FlagOption optionWriteToFile;
+	protected FlagOption optionPrintAST;
 	protected CommandLine commandLine;
 
 	public Compiler(String args[]) throws CommandLineException {
@@ -37,7 +38,9 @@ public class Compiler {
 		Program p = parseProgram(filename);
 
 		if (!p.errors().isEmpty()) {
-			System.out.println(p.dumpTree());
+			if (optionPrintAST.isSet()) {
+				System.out.println(p.dumpTree());
+			}
 			System.err.println("Errors:");
 			for (ErrorMessage e: p.errors()) {
 				System.err.println(e);
@@ -50,8 +53,9 @@ public class Compiler {
 				String absPathExclExt = absPath.substring(0, absPath.lastIndexOf('.'));
 				writeToFile(absPathExclExt + "Gen.ast", p.generateAbstractGrammar());
 				writeToFile(absPathExclExt + "Gen.jadd", p.generateAspect());
-			}
-			else {
+			} else if (optionPrintAST.isSet()) {
+				System.out.println(p.dumpTree());
+			} else {
 				System.out.println(p.generateAbstractGrammar());
 				System.out.println(p.generateAspect());
 			}
@@ -60,7 +64,7 @@ public class Compiler {
 
 	protected void writeToFile(String filename, String str) {
 		try {
-			PrintWriter writer = new PrintWriter(filename, "UTF-8");
+			PrintWriter writer = new PrintWriter(filename);
 			writer.print(str);
 			writer.close();
 		} catch (Exception e) {
@@ -70,7 +74,8 @@ public class Compiler {
 	}
 
 	protected void addOptions() {
-		optionWriteToFile = addOption(new FlagOption("file", "write output to file"));
+		optionWriteToFile = addOption(new FlagOption("file", "write output to files <filename>Gen.ast and <filename>Gen.jadd"));
+		optionPrintAST = addOption(new FlagOption("ast", "print AST"));
 	}
 
 	protected <OptionType extends Option<?>> OptionType addOption(OptionType option) {
@@ -101,24 +106,19 @@ public class Compiler {
 			System.err.println("Parse error in file " + file);
 			System.err.println(e.getMessage());
 			System.exit(1);
-		} /*catch (ScannerError e) {
-			System.err.println("Scanner error in file " + file);
-			System.err.println(e.getMessage());
-			System.exit(1);
-		}*/
+		}
 		return null;
 	}
 
 	protected void error(String message) {
 		System.err.println("Error: " + message);
+		System.err.println();
+		System.err.println("Usage: java -jar relast-compiler.jar <filename> [--option1] [--option2=value] ...  ");
+		System.err.println("Options:");
+		System.err.print(commandLine.printOptionHelp());
 		System.exit(1);
 	}
 
-	private void showUsageAndExit() {
-		//System.out.println("Usage: java -jar bloqqi-compiler.jar [--option1] [--option2=value] ...  <filename1> [filename2] [filename3] ...");
-		//System.exit(1);
-	}
-
 	public static void main(String[] args) {
 		try {
 			new Compiler(args);
diff --git a/test/Makefile b/test/Makefile
deleted file mode 100644
index 4f66686a2a0c34dfd5f9b4b6adb1aac23204b146..0000000000000000000000000000000000000000
--- a/test/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-all: compile run check-idempotent
-compile:
-	(cd .. && ant jar)
-	java -jar ../relast-compiler.jar All.relast --file
-	java -jar ../tools/jastadd2.jar --package=AST AllGen.ast AllGen.jadd Utils.jadd
-run:
-	javac AST/*.java Test.java
-	java Test
-check-idempotent:
-	java -jar ../relast-compiler.jar AllGen.ast --file
-	diff AllGen.ast AllGenGen.ast
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d65477dd3d9fa926ad44eb1e05ff4c19f3190c53
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,4 @@
+all:
+	cd ../ && ant jar
+	cd valid && make test
+	cd errors && make test
\ No newline at end of file
diff --git a/tests/errors/.gitignore b/tests/errors/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e87afd97c3b381b83d7829594d887e153a4534e7
--- /dev/null
+++ b/tests/errors/.gitignore
@@ -0,0 +1 @@
+/*.out
diff --git a/tests/errors/Errors.expected b/tests/errors/Errors.expected
new file mode 100644
index 0000000000000000000000000000000000000000..93b0d7d9e8e17a2399c0e5fca93b2af03c0d43e0
--- /dev/null
+++ b/tests/errors/Errors.expected
@@ -0,0 +1,5 @@
+Errors:
+Line 5, column 5: Role name missing for type 'A'
+Line 6, column 15: Role name missing for type 'B'
+Line 7, column 12: The target of a directed relation cannot have a role name
+Line 8, column 13: The target of a directed relation may only have multiplicity 1
diff --git a/tests/errors/Errors.relast b/tests/errors/Errors.relast
new file mode 100644
index 0000000000000000000000000000000000000000..c5bfd75f87b2ff697a558f0491211025d23e4ddc
--- /dev/null
+++ b/tests/errors/Errors.relast
@@ -0,0 +1,8 @@
+Program ::= A* B*;
+A;
+B;
+
+rel A -> B;
+rel A.bs* <-> B*;
+rel A.b -> B.b;
+rel A.b2 -> B*;
diff --git a/tests/errors/Makefile b/tests/errors/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..75b5ba0c224beffe7c5952ccac8ee88359dfc8dd
--- /dev/null
+++ b/tests/errors/Makefile
@@ -0,0 +1,7 @@
+all: build-jar test
+
+build-jar:
+	(cd ../../ && ant jar)
+test:
+	java -jar ../../relast-compiler.jar Errors.relast 2> Errors.out || true
+	diff Errors.out Errors.expected
\ No newline at end of file
diff --git a/test/.gitignore b/tests/valid/.gitignore
similarity index 100%
rename from test/.gitignore
rename to tests/valid/.gitignore
diff --git a/test/All.relast b/tests/valid/All.relast
similarity index 100%
rename from test/All.relast
rename to tests/valid/All.relast
diff --git a/tests/valid/Makefile b/tests/valid/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..a18b8217c5d12b9783c31e2b6aebbea11f1d7aff
--- /dev/null
+++ b/tests/valid/Makefile
@@ -0,0 +1,14 @@
+all: build-jar test
+test: compile run check-idempotent
+
+build-jar:
+	(cd ../../ && ant jar)
+compile:
+	java -jar ../../relast-compiler.jar All.relast --file
+	java -jar ../../tools/jastadd2.jar --package=AST AllGen.ast AllGen.jadd Utils.jadd
+run:
+	javac AST/*.java Test.java
+	java Test
+check-idempotent:
+	java -jar ../../relast-compiler.jar AllGen.ast --file
+	diff AllGen.ast AllGenGen.ast
diff --git a/test/Test.java b/tests/valid/Test.java
similarity index 100%
rename from test/Test.java
rename to tests/valid/Test.java
diff --git a/test/Utils.jadd b/tests/valid/Utils.jadd
similarity index 100%
rename from test/Utils.jadd
rename to tests/valid/Utils.jadd