diff --git a/src/main/java/teetime/framework/Analysis.java b/src/main/java/teetime/framework/Analysis.java
index b71cfd5552aec86300e196ab2e3e31599a1e3329..dfbc4bbb472f3cce5b734574f73556ab83ea7477 100644
--- a/src/main/java/teetime/framework/Analysis.java
+++ b/src/main/java/teetime/framework/Analysis.java
@@ -17,7 +17,6 @@ package teetime.framework;
 
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
@@ -162,8 +161,6 @@ public final class Analysis<T extends AnalysisConfiguration> implements Uncaught
 
 	private Thread createThread(final AbstractExceptionListener newListener, final Set<Stage> intraStages, final Stage stage, final AbstractRunnableStage runnable) {
 		final Thread thread = new Thread(runnable);
-		stage.setExceptionHandler(newListener);
-		stage.setOwningThread(thread);
 		for (Stage intraStage : intraStages) {
 			intraStage.setOwningThread(thread);
 			intraStage.setExceptionHandler(newListener);
@@ -324,10 +321,7 @@ public final class Analysis<T extends AnalysisConfiguration> implements Uncaught
 
 	private Set<Stage> traverseIntraStages(final Stage stage) {
 		final Traversor traversor = new Traversor(new IntraStageVisitor());
-		if (stage.getOutputPorts().length == 0) {
-			return new HashSet<Stage>();
-		}
-		traversor.traverse(stage, stage.getOutputPorts()[0].getPipe());
+		traversor.traverse(stage);
 		return traversor.getVisitedStage();
 	}
 }
diff --git a/src/main/java/teetime/framework/IStageVisitor.java b/src/main/java/teetime/framework/IStageVisitor.java
index 2b27c598cbed948ff987fa8783f4c416dea14d1e..e6ff08c7b3d9a0da7d3510e1310af190dd6a508d 100644
--- a/src/main/java/teetime/framework/IStageVisitor.java
+++ b/src/main/java/teetime/framework/IStageVisitor.java
@@ -23,6 +23,6 @@ public interface IStageVisitor {
 		CONTINUE, STOP
 	}
 
-	VisitorBehavior visit(Stage stage, IPipe inputPipe);
+	VisitorBehavior visit(IPipe inputPipe);
 
 }
diff --git a/src/main/java/teetime/framework/IntraStageVisitor.java b/src/main/java/teetime/framework/IntraStageVisitor.java
index fb903e06262dc16d5b18dc8bad48c7697fb4dcf3..b3dba3954ad6bbef4529a5dda4e5d2495aa6a716 100644
--- a/src/main/java/teetime/framework/IntraStageVisitor.java
+++ b/src/main/java/teetime/framework/IntraStageVisitor.java
@@ -22,7 +22,7 @@ public class IntraStageVisitor implements IStageVisitor {
 	public IntraStageVisitor() {}
 
 	@Override
-	public VisitorBehavior visit(final Stage stage, final IPipe inputPipe) {
+	public VisitorBehavior visit(final IPipe inputPipe) {
 		if (inputPipe instanceof AbstractIntraThreadPipe) {
 			return VisitorBehavior.CONTINUE;
 		}
diff --git a/src/main/java/teetime/framework/Traversor.java b/src/main/java/teetime/framework/Traversor.java
index dd873d1b1711275f09c5a0191880246c88783deb..f81aaefda3988d82ec88ac3f9ba85d45b1b7fe7a 100644
--- a/src/main/java/teetime/framework/Traversor.java
+++ b/src/main/java/teetime/framework/Traversor.java
@@ -30,12 +30,7 @@ public class Traversor {
 		this.stageVisitor = stageVisitor;
 	}
 
-	public void traverse(final Stage stage, final IPipe inputPipe) {
-
-		VisitorBehavior visitorBehavior = stageVisitor.visit(stage, inputPipe);
-		if (visitorBehavior == VisitorBehavior.STOP) {
-			return;
-		}
+	public void traverse(final Stage stage) {
 
 		if (!visitedStage.add(stage)) {
 			return;
@@ -44,9 +39,9 @@ public class Traversor {
 		OutputPort<?>[] outputPorts = stage.getOutputPorts();
 		for (OutputPort<?> outputPort : outputPorts) {
 			IPipe pipe = outputPort.getPipe();
-			if (null != pipe) {
+			if (null != pipe && stageVisitor.visit(pipe) == VisitorBehavior.CONTINUE) {
 				Stage owningStage = pipe.getTargetPort().getOwningStage();
-				traverse(owningStage, pipe); // recursive call
+				traverse(owningStage); // recursive call
 			}
 		}
 	}
diff --git a/src/test/java/teetime/framework/TraversorTest.java b/src/test/java/teetime/framework/TraversorTest.java
index 197a66d2483bdf305205f961fa2f452d19ac4ebe..209fb6c81a5a0e0e383345ccee82ae9510a193bc 100644
--- a/src/test/java/teetime/framework/TraversorTest.java
+++ b/src/test/java/teetime/framework/TraversorTest.java
@@ -28,7 +28,7 @@ public class TraversorTest {
 	@Test
 	public void traverse() {
 		TestConfiguration tc = new TestConfiguration();
-		traversor.traverse(tc.init, tc.init.getOutputPort().getPipe());
+		traversor.traverse(tc.init);
 		Set<Stage> comparingSet = new HashSet<Stage>();
 		comparingSet.add(tc.init);
 		comparingSet.add(tc.f2b);
diff --git a/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java b/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java
index 0b2d44c12bda0c0c2d6e024de7a7a0330b933e98..e50b59f6dba08bde949f104db58aac364cf084f9 100644
--- a/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java
+++ b/src/test/java/teetime/framework/exceptionHandling/ExceptionHandlingTest.java
@@ -18,6 +18,7 @@ package teetime.framework.exceptionHandling;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 
@@ -52,12 +53,14 @@ public class ExceptionHandlingTest {
 	@Test
 	public void forAFewTimes() {
 		for (int i = 0; i < 100; i++) {
+			boolean exceptionArised = false;
 			try {
 				exceptionPassingAndTermination();
 				terminatesAllStages();
 			} catch (AnalysisException e) {
-				// Correct behavior
+				exceptionArised = true;
 			}
+			assertTrue(exceptionArised);
 		}
 	}
 }