diff --git a/src/main/java/teetime/framework/Analysis.java b/src/main/java/teetime/framework/Analysis.java
index 3156529382e1febae7819cc925d2bbca304bea58..873e2fc10dacde581866a0674d32a9a85c9f6619 100644
--- a/src/main/java/teetime/framework/Analysis.java
+++ b/src/main/java/teetime/framework/Analysis.java
@@ -99,7 +99,6 @@ public class Analysis implements UncaughtExceptionHandler {
 				} else {
 					runnable = new RunnableConsumerStage(stage, newListener);
 				}
-				newListener.setRunnableStage(runnable);
 				final Thread thread = new Thread(runnable);
 				stage.setOwningThread(thread);
 				this.consumerThreads.add(thread);
@@ -107,7 +106,6 @@ public class Analysis implements UncaughtExceptionHandler {
 			}
 			case BY_SELF_DECISION: {
 				RunnableProducerStage runnable = new RunnableProducerStage(stage, newListener);
-				newListener.setRunnableStage(runnable);
 				final Thread thread = new Thread(runnable);
 				stage.setOwningThread(thread);
 				this.finiteProducerThreads.add(thread);
@@ -115,7 +113,6 @@ public class Analysis implements UncaughtExceptionHandler {
 			}
 			case BY_INTERRUPT: {
 				RunnableProducerStage runnable = new RunnableProducerStage(stage, newListener);
-				newListener.setRunnableStage(runnable);
 				final Thread thread = new Thread(runnable);
 				stage.setOwningThread(thread);
 				this.infiniteProducerThreads.add(thread);
diff --git a/src/main/java/teetime/framework/RunnableStage.java b/src/main/java/teetime/framework/RunnableStage.java
index 6a8453bab06a09d5e7f686bc3d2cd162ad376b17..3acf6db53542fc8d7244f6d79e9b6ece6973f8e9 100644
--- a/src/main/java/teetime/framework/RunnableStage.java
+++ b/src/main/java/teetime/framework/RunnableStage.java
@@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory;
 import teetime.framework.exceptionHandling.StageException;
 import teetime.framework.exceptionHandling.StageExceptionListener;
 
-public abstract class RunnableStage implements Runnable {
+abstract class RunnableStage implements Runnable {
 
 	protected final Stage stage;
 	@SuppressWarnings("PMD.LoggerIsNotStaticFinal")
@@ -30,7 +30,9 @@ public abstract class RunnableStage implements Runnable {
 				try {
 					executeStage();
 				} catch (StageException e) {
-					this.listener.onStageException(e, e.getThrowingStage());
+					if (!this.listener.onStageException(e, e.getThrowingStage())) {
+						this.stage.terminate();
+					}
 				}
 			} while (!this.stage.shouldBeTerminated());
 
@@ -47,11 +49,6 @@ public abstract class RunnableStage implements Runnable {
 		this.logger.debug("Finished runnable stage. (" + this.stage.getId() + ")");
 	}
 
-	public final void abortExecution() {
-		this.stage.terminate();
-		// TODO: flag error and throw exception
-	}
-
 	protected abstract void beforeStageExecution();
 
 	protected abstract void executeStage();
diff --git a/src/main/java/teetime/framework/exceptionHandling/DefaultListener.java b/src/main/java/teetime/framework/exceptionHandling/DefaultListener.java
index 26c2cfd2e22a5bc66b67d6fc394a3243148efaa0..1db8e36c65c6abfc5f9da5d4e6a77480a46e91dc 100644
--- a/src/main/java/teetime/framework/exceptionHandling/DefaultListener.java
+++ b/src/main/java/teetime/framework/exceptionHandling/DefaultListener.java
@@ -10,7 +10,7 @@ public class DefaultListener extends StageExceptionListener {
 	}
 
 	@Override
-	public void onStageException(final Exception e, final Stage throwingStage) {
-		// TODO Auto-generated method stub
+	public boolean onStageException(final Exception e, final Stage throwingStage) {
+		return true;
 	}
 }
diff --git a/src/main/java/teetime/framework/exceptionHandling/StageExceptionListener.java b/src/main/java/teetime/framework/exceptionHandling/StageExceptionListener.java
index 8283ebd2346e9bc85cb6dacb32092ddfa27ee09d..1ebe184b4464369dcec7008587f89af85bce1eff 100644
--- a/src/main/java/teetime/framework/exceptionHandling/StageExceptionListener.java
+++ b/src/main/java/teetime/framework/exceptionHandling/StageExceptionListener.java
@@ -3,7 +3,6 @@ package teetime.framework.exceptionHandling;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import teetime.framework.RunnableStage;
 import teetime.framework.Stage;
 
 /**
@@ -12,8 +11,6 @@ import teetime.framework.Stage;
  */
 public abstract class StageExceptionListener {
 
-	private RunnableStage runnable;
-
 	/**
 	 * The default logger, which can be used by all subclasses
 	 */
@@ -31,16 +28,6 @@ public abstract class StageExceptionListener {
 	 * @param throwingStage
 	 *            the stage, which has thrown the exception.
 	 */
-	public abstract void onStageException(Exception e, Stage throwingStage);
-
-	/**
-	 * This method can be used to terminate the execution of the thread.
-	 */
-	protected final void terminateExecution() {
-		this.runnable.abortExecution();
-	}
+	public abstract boolean onStageException(Exception e, Stage throwingStage);
 
-	public final void setRunnableStage(final RunnableStage runnableStage) {
-		this.runnable = runnableStage;
-	}
 }