diff --git a/src/main/java/teetime/framework/A2ThreadableStageCollector.java b/src/main/java/teetime/framework/A1ThreadableStageCollector.java
similarity index 92%
rename from src/main/java/teetime/framework/A2ThreadableStageCollector.java
rename to src/main/java/teetime/framework/A1ThreadableStageCollector.java
index efe44233a97aaba468116dd51503c68c8f72047f..d19cb065092f498fd94b68db1ebbc2b79274ec90 100644
--- a/src/main/java/teetime/framework/A2ThreadableStageCollector.java
+++ b/src/main/java/teetime/framework/A1ThreadableStageCollector.java
@@ -5,7 +5,7 @@ import java.util.Set;
 
 import teetime.framework.pipe.IPipe;
 
-public class A2ThreadableStageCollector implements IPipeVisitor {
+public class A1ThreadableStageCollector implements IPipeVisitor {
 
 	private final Set<Stage> threadableStages = new HashSet<Stage>();
 	private final Set<IPipe<?>> visitedPipes = new HashSet<IPipe<?>>();
diff --git a/src/main/java/teetime/framework/A3InvalidThreadAssignmentCheck.java b/src/main/java/teetime/framework/A2InvalidThreadAssignmentCheck.java
similarity index 78%
rename from src/main/java/teetime/framework/A3InvalidThreadAssignmentCheck.java
rename to src/main/java/teetime/framework/A2InvalidThreadAssignmentCheck.java
index 83840262d19b66722ce4f5a6134091a7275b0a64..c04006f85817247aeb3203d05cbf5d2fc405b40c 100644
--- a/src/main/java/teetime/framework/A3InvalidThreadAssignmentCheck.java
+++ b/src/main/java/teetime/framework/A2InvalidThreadAssignmentCheck.java
@@ -7,13 +7,13 @@ import teetime.framework.pipe.IPipe;
 import com.carrotsearch.hppc.ObjectIntHashMap;
 import com.carrotsearch.hppc.ObjectIntMap;
 
-public class A3InvalidThreadAssignmentCheck {
+public class A2InvalidThreadAssignmentCheck {
 
 	private static final int DEFAULT_COLOR = 0;
 
 	private final Set<Stage> threadableStages;
 
-	public A3InvalidThreadAssignmentCheck(final Set<Stage> threadableStages) {
+	public A2InvalidThreadAssignmentCheck(final Set<Stage> threadableStages) {
 		this.threadableStages = threadableStages;
 	}
 
@@ -28,7 +28,6 @@ public class A3InvalidThreadAssignmentCheck {
 			ThreadPainter threadPainter = new ThreadPainter(colors, color, threadableStages);
 			Traverser traverser = new Traverser(threadPainter);
 			traverser.traverse(threadableStage);
-			// threadPainter.check(threadableStage);
 		}
 	}
 
@@ -45,19 +44,6 @@ public class A3InvalidThreadAssignmentCheck {
 			this.threadableStages = threadableStages;
 		}
 
-		// TODO consider to implement it as IPipeVisitor(FORWARD)
-
-		// public void check(final Stage stage) {
-		// for (OutputPort<?> outputPort : stage.getOutputPorts()) {
-		// if (outputPort.pipe != DummyPipe.INSTANCE) {
-		// Stage nextStage = checkPipe(outputPort.pipe);
-		// if (nextStage != null) {
-		// check(nextStage);
-		// }
-		// }
-		// }
-		// }
-
 		@Override
 		public VisitorBehavior visit(final IPipe<?> pipe) {
 			Stage targetStage = pipe.getTargetPort().getOwningStage();
diff --git a/src/main/java/teetime/framework/A1PipeInstantiation.java b/src/main/java/teetime/framework/A3PipeInstantiation.java
similarity index 96%
rename from src/main/java/teetime/framework/A1PipeInstantiation.java
rename to src/main/java/teetime/framework/A3PipeInstantiation.java
index 3b7c8aabd922c7419234a4d57239a61b698c0c7c..1e1e38c41edd116b1307ed0e96091e1b0aa838bc 100644
--- a/src/main/java/teetime/framework/A1PipeInstantiation.java
+++ b/src/main/java/teetime/framework/A3PipeInstantiation.java
@@ -10,7 +10,7 @@ import teetime.framework.pipe.SingleElementPipeFactory;
 import teetime.framework.pipe.SpScPipeFactory;
 import teetime.framework.pipe.UnboundedSpScPipeFactory;
 
-public class A1PipeInstantiation implements IPipeVisitor {
+public class A3PipeInstantiation implements IPipeVisitor {
 
 	private static final IPipeFactory interBoundedThreadPipeFactory = new SpScPipeFactory();
 	private static final IPipeFactory interUnboundedThreadPipeFactory = new UnboundedSpScPipeFactory();
diff --git a/src/main/java/teetime/framework/StageState.java b/src/main/java/teetime/framework/StageState.java
index 9ea6f9f32185167216eb9ee865baa1c524974a33..233948a80b595b97416961a5c20cb2aa17062d07 100644
--- a/src/main/java/teetime/framework/StageState.java
+++ b/src/main/java/teetime/framework/StageState.java
@@ -17,6 +17,7 @@ package teetime.framework;
 
 public enum StageState {
 
+	/** First state of a stage */
 	CREATED,
 	INITIALIZED,
 	VALIDATING, VALIDATED,
diff --git a/src/main/java/teetime/framework/ThreadService.java b/src/main/java/teetime/framework/ThreadService.java
index c33d9a075a6d91166ca62cfc2b00b986b151ef82..a48cadd139d1192fb4497fa0cda76c901e56cdec 100644
--- a/src/main/java/teetime/framework/ThreadService.java
+++ b/src/main/java/teetime/framework/ThreadService.java
@@ -45,12 +45,8 @@ class ThreadService extends AbstractService<ThreadService> {
 		// TODO visit(port) only
 		// TODO use decorator pattern to combine all analyzes so that only one traverser pass is necessary
 		IPortVisitor portVisitor = new A0UnconnectedPort();
-		IPipeVisitor pipeVisitor = new A1PipeInstantiation();
-		Traverser traversor = new Traverser(portVisitor, pipeVisitor, Direction.BOTH);
-		traversor.traverse(startStage);
-
-		A2ThreadableStageCollector stageCollector = new A2ThreadableStageCollector();
-		traversor = new Traverser(stageCollector, Direction.BOTH);
+		A1ThreadableStageCollector stageCollector = new A1ThreadableStageCollector();
+		Traverser traversor = new Traverser(portVisitor, stageCollector, Direction.BOTH);
 		traversor.traverse(startStage);
 
 		threadableStages = stageCollector.getThreadableStages();
@@ -58,9 +54,13 @@ class ThreadService extends AbstractService<ThreadService> {
 			throw new IllegalStateException("No stage was added using the addThreadableStage(..) method. Add at least one stage.");
 		}
 
-		A3InvalidThreadAssignmentCheck checker = new A3InvalidThreadAssignmentCheck(threadableStages);
+		A2InvalidThreadAssignmentCheck checker = new A2InvalidThreadAssignmentCheck(threadableStages);
 		checker.check();
 
+		IPipeVisitor pipeVisitor = new A3PipeInstantiation();
+		traversor = new Traverser(pipeVisitor, Direction.BOTH);
+		traversor.traverse(startStage);
+
 		A4StageAttributeSetter attributeSetter = new A4StageAttributeSetter(configuration, threadableStages);
 		attributeSetter.setAttributes();
 
diff --git a/src/main/java/teetime/framework/Traverser.java b/src/main/java/teetime/framework/Traverser.java
index d430e33de7ea9fa841604d858b8eebcefb06dfcd..ffd4cde1dad6414ef2a2ce80ffd49af4617fac10 100644
--- a/src/main/java/teetime/framework/Traverser.java
+++ b/src/main/java/teetime/framework/Traverser.java
@@ -65,7 +65,8 @@ public class Traverser {
 	}
 
 	public void traverse(final Stage stage) {
-		if (!visitedStages.add(stage)) {
+		if (!visitedStages.add(stage) || stage.getCurrentState() != StageState.CREATED) {
+			// do not visit (1) an already visited stage and (2) a stage that currently run (runtime visiting)
 			return;
 		}