diff --git a/src/main/java/de/prob/voparser/VOException.java b/src/main/java/de/prob/voparser/VOException.java
new file mode 100644
index 0000000000000000000000000000000000000000..918079a305614c9c38a108f87f6de7d490e5c5f9
--- /dev/null
+++ b/src/main/java/de/prob/voparser/VOException.java
@@ -0,0 +1,17 @@
+package de.prob.voparser;
+
+public class VOException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+	
+	public VOException(final String message, final Throwable cause) {
+		super(message, cause);
+	}
+	
+	public VOException(final String message) {
+		this(message, null);
+	}
+	
+	public VOException(final Throwable cause) {
+		this(cause == null ? null : cause.toString(), cause);
+	}
+}
diff --git a/src/main/java/de/prob/voparser/VOParseException.java b/src/main/java/de/prob/voparser/VOParseException.java
index 5f618c42f77b370830d34bc0738895d562fc3bc3..01cb83f389de2e681932f411bfc5eaa6728fbce7 100644
--- a/src/main/java/de/prob/voparser/VOParseException.java
+++ b/src/main/java/de/prob/voparser/VOParseException.java
@@ -1,19 +1,17 @@
 package de.prob.voparser;
 
-public class VOParseException extends Exception {
-
-	public enum ErrorType {
-		PARSING, SCOPING, TYPECHECKING
+public class VOParseException extends VOException {
+	private static final long serialVersionUID = 1L;
+	
+	public VOParseException(final String message, final Throwable cause) {
+		super(message, cause);
 	}
-
-	private ErrorType errorType;
-
-	public VOParseException(String message, ErrorType errorType) {
-		super(message);
-		this.errorType = errorType;
+	
+	public VOParseException(final String message) {
+		this(message, null);
 	}
-
-	public ErrorType getErrorType() {
-		return errorType;
+	
+	public VOParseException(final Throwable cause) {
+		this(cause == null ? null : cause.toString(), cause);
 	}
 }
diff --git a/src/main/java/de/prob/voparser/VOParser.java b/src/main/java/de/prob/voparser/VOParser.java
index 09f6533a30a65cb56a2f785f619e6480de2f6677..7eb0fac8786fcdbb10c8156a4c92779788daec98 100644
--- a/src/main/java/de/prob/voparser/VOParser.java
+++ b/src/main/java/de/prob/voparser/VOParser.java
@@ -26,11 +26,11 @@ public class VOParser {
 		this.typeChecker = new VOTypeChecker(this);
 	}
 
-	public Start parseFormula(String formula) throws VOParseException {
+	public Start parseFormula(String formula) {
 		return parseAST(formula);
 	}
 
-	public Start parseAST(String formula) throws VOParseException {
+	public Start parseAST(String formula) {
 		StringReader reader = new StringReader(formula);
 		PushbackReader r = new PushbackReader(reader);
 		Lexer l = new Lexer(r);
@@ -39,11 +39,11 @@ public class VOParser {
 		try {
 			ast = p.parse();
 		} catch (ParserException e) {
-			throw new VOParseException("Parsing VO formula failed at: " + e.getToken().getText(), VOParseException.ErrorType.PARSING);
+			throw new VOParseException("Parsing VO formula failed at: " + e.getToken().getText(), e);
 		} catch (IOException e) {
-			throw new VOParseException("Parsing VO formula failed", VOParseException.ErrorType.PARSING);
+			throw new VOParseException("Parsing VO formula failed", e);
 		} catch (LexerException e) {
-			throw new VOParseException("Parsing VO formula failed: " + e.getMessage(), VOParseException.ErrorType.PARSING);
+			throw new VOParseException("Parsing VO formula failed: " + e.getMessage(), e);
 		}
 		return ast;
 	}
@@ -56,22 +56,22 @@ public class VOParser {
 		tasks.remove(id);
 	}
 
-	public void semanticCheck(Start ast) throws VOParseException {
+	public void semanticCheck(Start ast) {
 		scopeChecker.scopeCheck(ast);
 		typeChecker.typeCheck(ast);
 	}
 
-	public void semanticCheck(String formula) throws VOParseException {
+	public void semanticCheck(String formula) {
 		scopeCheck(formula);
 		typeCheck(formula);
 	}
 
-	public void scopeCheck(String formula) throws VOParseException {
+	public void scopeCheck(String formula) {
 		Start start = parseFormula(formula);
 		scopeChecker.scopeCheck(start);
 	}
 
-	public void typeCheck(String formula) throws VOParseException {
+	public void typeCheck(String formula) {
 		Start start = parseFormula(formula);
 		typeChecker.typeCheck(start);
 	}
diff --git a/src/main/java/de/prob/voparser/VOScopeCheckException.java b/src/main/java/de/prob/voparser/VOScopeCheckException.java
new file mode 100644
index 0000000000000000000000000000000000000000..7bbe7e2f07114a9d7976140289e22ac97043c7a2
--- /dev/null
+++ b/src/main/java/de/prob/voparser/VOScopeCheckException.java
@@ -0,0 +1,17 @@
+package de.prob.voparser;
+
+public class VOScopeCheckException extends VOException {
+	private static final long serialVersionUID = 1L;
+	
+	public VOScopeCheckException(final String message, final Throwable cause) {
+		super(message, cause);
+	}
+	
+	public VOScopeCheckException(final String message) {
+		this(message, null);
+	}
+	
+	public VOScopeCheckException(final Throwable cause) {
+		this(cause == null ? null : cause.toString(), cause);
+	}
+}
diff --git a/src/main/java/de/prob/voparser/VOScopeChecker.java b/src/main/java/de/prob/voparser/VOScopeChecker.java
index 88070e2fa7fd499ef2e064b913302a28567b8f24..e6d97dc82e0b1c6ca2e1fd4eee96bf4c30d488fb 100644
--- a/src/main/java/de/prob/voparser/VOScopeChecker.java
+++ b/src/main/java/de/prob/voparser/VOScopeChecker.java
@@ -16,10 +16,10 @@ public class VOScopeChecker extends DepthFirstAdapter {
 		this.error = false;
 	}
 
-	public void scopeCheck(Start start) throws VOParseException {
+	public void scopeCheck(Start start) {
 		start.apply(this);
 		if(error) {
-			throw new VOParseException("Scope error in VO", VOParseException.ErrorType.SCOPING);
+			throw new VOScopeCheckException("Scope error in VO");
 		}
 	}
 
diff --git a/src/main/java/de/prob/voparser/VOTypeCheckException.java b/src/main/java/de/prob/voparser/VOTypeCheckException.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0b05559bf39557f6774689136456b55c5ed0273
--- /dev/null
+++ b/src/main/java/de/prob/voparser/VOTypeCheckException.java
@@ -0,0 +1,17 @@
+package de.prob.voparser;
+
+public class VOTypeCheckException extends VOException {
+	private static final long serialVersionUID = 1L;
+	
+	public VOTypeCheckException(final String message, final Throwable cause) {
+		super(message, cause);
+	}
+	
+	public VOTypeCheckException(final String message) {
+		this(message, null);
+	}
+	
+	public VOTypeCheckException(final Throwable cause) {
+		this(cause == null ? null : cause.toString(), cause);
+	}
+}
diff --git a/src/main/java/de/prob/voparser/VOTypeChecker.java b/src/main/java/de/prob/voparser/VOTypeChecker.java
index 0288979b8a8574b73a036540e15b380a3af0e2ed..177a5b76ad3a68260c8d523271fa7589171f7603 100644
--- a/src/main/java/de/prob/voparser/VOTypeChecker.java
+++ b/src/main/java/de/prob/voparser/VOTypeChecker.java
@@ -24,10 +24,10 @@ public class VOTypeChecker extends DepthFirstAdapter {
 		this.modifiedAnimatorState = PersistentHashSet.create(AnimatorState.STATE_SPACE, AnimatorState.TRACE);
 	}
 
-	public void typeCheck(Start start) throws VOParseException {
+	public void typeCheck(Start start) {
 		start.apply(this);
 		if (error) {
-			throw new VOParseException("Type error in VO", VOParseException.ErrorType.TYPECHECKING);
+			throw new VOTypeCheckException("Type error in VO");
 		}
 	}
 
diff --git a/src/test/java/de/prob/voparser/VOParserTest.java b/src/test/java/de/prob/voparser/VOParserTest.java
index 43fbe65c6b358bdcf462ba559d9c3e7b000af7a0..4e8956bbe3ddbc91d1cecf08513f6c664eb4772b 100644
--- a/src/test/java/de/prob/voparser/VOParserTest.java
+++ b/src/test/java/de/prob/voparser/VOParserTest.java
@@ -11,38 +11,38 @@ import org.junit.Test;
 public class VOParserTest {
 
 	@Test
-	public void testAtomic() throws VOParseException {
+	public void testAtomic() {
 		VOParser voParser = new VOParser();
 		voParser.parseFormula("MC1");
 	}
 
 	@Test
-	public void testSequential() throws VOParseException {
+	public void testSequential() {
 		VOParser voParser = new VOParser();
 		voParser.parseFormula("MC1;TR1");
 	}
 
 	@Test
-	public void testAnd() throws VOParseException {
+	public void testAnd() {
 		VOParser voParser = new VOParser();
 		voParser.parseFormula("MC1 & TR1");
 	}
 
 	@Test
-	public void testOr() throws VOParseException {
+	public void testOr() {
 		VOParser voParser = new VOParser();
 		voParser.parseFormula("MC1 or TR1");
 	}
 
 	@Test
-	public void testDot() throws VOParseException {
+	public void testDot() {
 		VOParser voParser = new VOParser();
 		voParser.parseFormula("MC.1");
 	}
 
 
 	@Test(expected = VOParseException.class)
-	public void testParseError() throws VOParseException {
+	public void testParseError() {
 		VOParser voParser = new VOParser();
 		voParser.parseFormula("MC.1;");
 	}
diff --git a/src/test/java/de/prob/voparser/VOScopingTest.java b/src/test/java/de/prob/voparser/VOScopingTest.java
index d033f722b6226135e9d5cc39b01b51beea9eafd2..2665b0914dde2a99e47f6860c19a4154c72e2fdd 100644
--- a/src/test/java/de/prob/voparser/VOScopingTest.java
+++ b/src/test/java/de/prob/voparser/VOScopingTest.java
@@ -11,29 +11,29 @@ import org.junit.Test;
 public class VOScopingTest {
 
 	@Test
-	public void testAtomic() throws VOParseException {
+	public void testAtomic() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.EXPLORE);
 		voParser.scopeCheck("MC1");
 	}
 
 	@Test
-	public void testSequential() throws VOParseException {
+	public void testSequential() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("TR1", VTType.TRACE);
 		voParser.scopeCheck("MC1;TR1");
 	}
 
-	@Test(expected = VOParseException.class)
-	public void testSequentialError() throws VOParseException {
+	@Test(expected = VOScopeCheckException.class)
+	public void testSequentialError() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.scopeCheck("MC1;TR1");
 	}
 
 	@Test
-	public void testAnd() throws VOParseException {
+	public void testAnd() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("TR1", VTType.TRACE);
@@ -41,7 +41,7 @@ public class VOScopingTest {
 	}
 
 	@Test
-	public void testAnd2() throws VOParseException {
+	public void testAnd2() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1.1", VTType.TRACE);
 		voParser.registerTask("TR1.1", VTType.TRACE);
@@ -51,7 +51,7 @@ public class VOScopingTest {
 	}
 
 	@Test
-	public void testOr() throws VOParseException {
+	public void testOr() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("TR1", VTType.TRACE);
@@ -59,15 +59,15 @@ public class VOScopingTest {
 	}
 
 	@Test
-	public void testDot() throws VOParseException {
+	public void testDot() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1.1", VTType.EXPLORE);
 		voParser.scopeCheck("MC1.1");
 	}
 
 
-	@Test(expected = VOParseException.class)
-	public void testScopingError() throws VOParseException {
+	@Test(expected = VOScopeCheckException.class)
+	public void testScopingError() {
 		VOParser voParser = new VOParser();
 		voParser.scopeCheck("MC1");
 	}
diff --git a/src/test/java/de/prob/voparser/VOTypeCheckingTest.java b/src/test/java/de/prob/voparser/VOTypeCheckingTest.java
index 16ed0c65a6caaa6a8a6412a7f3bb6cf8558a1c23..8d3eb826d8c92df31ccc489da2d25c622ec45e65 100644
--- a/src/test/java/de/prob/voparser/VOTypeCheckingTest.java
+++ b/src/test/java/de/prob/voparser/VOTypeCheckingTest.java
@@ -11,22 +11,22 @@ import org.junit.Test;
 public class VOTypeCheckingTest {
 
 	@Test
-	public void testAtomic() throws VOParseException {
+	public void testAtomic() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.EXPLORE);
 		voParser.typeCheck("MC1");
 	}
 
 	@Test
-	public void testSequential() throws VOParseException {
+	public void testSequential() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("MC2", VTType.EXPLORE);
 		voParser.typeCheck("MC1;MC2");
 	}
 
-	@Test(expected =  VOParseException.class)
-	public void testSequential2() throws VOParseException {
+	@Test(expected = VOTypeCheckException.class)
+	public void testSequential2() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("MC2", VTType.TRACE);
@@ -35,7 +35,7 @@ public class VOTypeCheckingTest {
 	}
 
 	@Test
-	public void testAnd() throws VOParseException {
+	public void testAnd() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("TR1", VTType.TRACE);
@@ -43,7 +43,7 @@ public class VOTypeCheckingTest {
 	}
 
 	@Test
-	public void testOr() throws VOParseException {
+	public void testOr() {
 		VOParser voParser = new VOParser();
 		voParser.registerTask("MC1", VTType.TRACE);
 		voParser.registerTask("TR1", VTType.TRACE);