diff --git a/src/main/java/teetime/framework/StageVisitor.java b/src/main/java/teetime/framework/StageVisitor.java
index d60b87bfbcd3f809173aad92e4ad1a0f49bbfad5..c24e52383305442b5dbf557bf966f740dd6f04fe 100644
--- a/src/main/java/teetime/framework/StageVisitor.java
+++ b/src/main/java/teetime/framework/StageVisitor.java
@@ -1,11 +1,13 @@
 package teetime.framework;
 
+import teetime.framework.pipe.IPipe;
+
 public interface StageVisitor {
 
 	public enum VisitorBehavior {
 		CONTINUE, STOP
 	}
 
-	VisitorBehavior visit(Stage stage);
+	VisitorBehavior visit(Stage stage, IPipe inputPipe);
 
 }
diff --git a/src/main/java/teetime/framework/Traversor.java b/src/main/java/teetime/framework/Traversor.java
index 9432b1cc42a7cb22f9d1e09ec8df7f62091a32eb..09e82ebcd07f35ff194b310b4a6008c69d5ffea0 100644
--- a/src/main/java/teetime/framework/Traversor.java
+++ b/src/main/java/teetime/framework/Traversor.java
@@ -1,18 +1,28 @@
 package teetime.framework;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import teetime.framework.StageVisitor.VisitorBehavior;
 import teetime.framework.pipe.IPipe;
 
 public class Traversor {
 
 	private final StageVisitor stageVisitor;
+	private final Set<Stage> visitedStage = new HashSet<Stage>();
 
 	public Traversor(final StageVisitor stageVisitor) {
 		this.stageVisitor = stageVisitor;
 	}
 
-	public void traverse(final Stage stage) {
-		VisitorBehavior visitorBehavior = stageVisitor.visit(stage);
+	public void traverse(final Stage stage, final IPipe inputPipe) {
+		if (!visitedStage.contains(stage)) {
+			visitedStage.add(stage);
+		} else {
+			return;
+		}
+
+		VisitorBehavior visitorBehavior = stageVisitor.visit(stage, inputPipe);
 		if (visitorBehavior == VisitorBehavior.STOP) {
 			return;
 		}
@@ -22,7 +32,7 @@ public class Traversor {
 			IPipe pipe = outputPort.getPipe();
 			if (null != pipe) {
 				Stage owningStage = pipe.getTargetPort().getOwningStage();
-				traverse(owningStage); // recursive call
+				traverse(owningStage, pipe); // recursive call
 			}
 		}
 	}