diff --git a/src/main/java/teetime/framework/AbstractCompositeStage.java b/src/main/java/teetime/framework/AbstractCompositeStage.java
index d430d233f9933104c9e62bd9fd22a85e569755ed..4eab1fb453bfc9beb3be3bb0a6f4d5bb13da8482 100644
--- a/src/main/java/teetime/framework/AbstractCompositeStage.java
+++ b/src/main/java/teetime/framework/AbstractCompositeStage.java
@@ -15,6 +15,8 @@
  */
 package teetime.framework;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
@@ -32,16 +34,24 @@ import teetime.framework.validation.InvalidPortConnection;
  * @author Christian Wulf, Nelson Tavares de Sousa
  *
  */
-@SuppressWarnings("PMD.AbstractNaming")
 public abstract class AbstractCompositeStage extends Stage {
 
 	private static final IPipeFactory INTRA_PIPE_FACTORY = PipeFactoryRegistry.INSTANCE
 			.getPipeFactory(ThreadCommunication.INTRA, PipeOrdering.ARBITRARY, false);
 
+	private final List<OutputPort<?>> outputPorts;
+
 	protected abstract Stage getFirstStage();
 
 	protected abstract Collection<? extends Stage> getLastStages();
 
+	public AbstractCompositeStage() {
+		outputPorts = new ArrayList<OutputPort<?>>();
+		for (final Stage s : getLastStages()) {
+			outputPorts.addAll(Arrays.asList(s.getOutputPorts()));
+		}
+	}
+
 	@Override
 	protected final void executeStage() {
 		getFirstStage().executeStage();
@@ -72,6 +82,11 @@ public abstract class AbstractCompositeStage extends Stage {
 		return getFirstStage().getInputPorts();
 	}
 
+	@Override
+	protected OutputPort<?>[] getOutputPorts() {
+		return outputPorts.toArray(new OutputPort[0]);
+	}
+
 	@Override
 	public final StageState getCurrentState() {
 		return getFirstStage().getCurrentState();
diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java
index c87593b7eac23b14790ce9f2939fb3d1a4484ed0..3e5df4db62909327019f19144c246bf1d3aa9fc6 100644
--- a/src/main/java/teetime/framework/Stage.java
+++ b/src/main/java/teetime/framework/Stage.java
@@ -119,6 +119,8 @@ public abstract class Stage {
 
 	protected abstract InputPort<?>[] getInputPorts();
 
+	protected abstract OutputPort<?>[] getOutputPorts();
+
 	// events
 
 	public abstract void onValidating(List<InvalidPortConnection> invalidPortConnections);
diff --git a/src/main/java/teetime/framework/StageVisitor.java b/src/main/java/teetime/framework/StageVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..d60b87bfbcd3f809173aad92e4ad1a0f49bbfad5
--- /dev/null
+++ b/src/main/java/teetime/framework/StageVisitor.java
@@ -0,0 +1,11 @@
+package teetime.framework;
+
+public interface StageVisitor {
+
+	public enum VisitorBehavior {
+		CONTINUE, STOP
+	}
+
+	VisitorBehavior visit(Stage stage);
+
+}
diff --git a/src/main/java/teetime/framework/Traversor.java b/src/main/java/teetime/framework/Traversor.java
new file mode 100644
index 0000000000000000000000000000000000000000..9432b1cc42a7cb22f9d1e09ec8df7f62091a32eb
--- /dev/null
+++ b/src/main/java/teetime/framework/Traversor.java
@@ -0,0 +1,29 @@
+package teetime.framework;
+
+import teetime.framework.StageVisitor.VisitorBehavior;
+import teetime.framework.pipe.IPipe;
+
+public class Traversor {
+
+	private final StageVisitor stageVisitor;
+
+	public Traversor(final StageVisitor stageVisitor) {
+		this.stageVisitor = stageVisitor;
+	}
+
+	public void traverse(final Stage stage) {
+		VisitorBehavior visitorBehavior = stageVisitor.visit(stage);
+		if (visitorBehavior == VisitorBehavior.STOP) {
+			return;
+		}
+
+		OutputPort<?>[] outputPorts = stage.getOutputPorts();
+		for (OutputPort<?> outputPort : outputPorts) {
+			IPipe pipe = outputPort.getPipe();
+			if (null != pipe) {
+				Stage owningStage = pipe.getTargetPort().getOwningStage();
+				traverse(owningStage); // recursive call
+			}
+		}
+	}
+}
diff --git a/src/site/markdown/wiki b/src/site/markdown/wiki
index 162510ff4d2f04011498ba6920aae0c78347c6c8..0e4474577e1f49bc96e734c286b2d9e0363895e8 160000
--- a/src/site/markdown/wiki
+++ b/src/site/markdown/wiki
@@ -1 +1 @@
-Subproject commit 162510ff4d2f04011498ba6920aae0c78347c6c8
+Subproject commit 0e4474577e1f49bc96e734c286b2d9e0363895e8