diff --git a/src/main/java/teetime/framework/test/InputHolder.java b/src/main/java/teetime/framework/test/InputHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..338a6a052cfe2f0d5e92657686d97ad74839bc5a
--- /dev/null
+++ b/src/main/java/teetime/framework/test/InputHolder.java
@@ -0,0 +1,39 @@
+package teetime.framework.test;
+
+import teetime.framework.InputPort;
+import teetime.framework.Stage;
+
+public final class InputHolder<I> {
+
+	private final StageTester stageTester;
+	private final Stage stage;
+	private final Iterable<Object> input;
+
+	private InputPort<Object> port;
+
+	@SuppressWarnings("unchecked")
+	InputHolder(final StageTester stageTester, final Stage stage, final Iterable<I> input) {
+		this.stageTester = stageTester;
+		this.stage = stage;
+		this.input = (Iterable<Object>) input;
+	}
+
+	@SuppressWarnings("unchecked")
+	public StageTester to(final InputPort<? extends I> port) {
+		if (port.getOwningStage() != stage) {
+			throw new AssertionError();
+		}
+		this.port = (InputPort<Object>) port;
+
+		return stageTester;
+	}
+
+	public Iterable<Object> getInput() {
+		return input;
+	}
+
+	public InputPort<Object> getPort() {
+		return port;
+	}
+
+}
diff --git a/src/main/java/teetime/framework/test/OutputHolder.java b/src/main/java/teetime/framework/test/OutputHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a5dece0f8f9665d18834638c8ca4f6f28f89be3
--- /dev/null
+++ b/src/main/java/teetime/framework/test/OutputHolder.java
@@ -0,0 +1,36 @@
+package teetime.framework.test;
+
+import java.util.List;
+
+import teetime.framework.OutputPort;
+import teetime.framework.Stage;
+
+public final class OutputHolder<O> {
+
+	private final StageTester stageTester;
+	private final List<Object> outputElements;
+
+	private OutputPort<Object> port;
+
+	@SuppressWarnings("unchecked")
+	OutputHolder(final StageTester stageTester, final Stage stage, final List<O> outputList) {
+		this.stageTester = stageTester;
+		this.outputElements = (List<Object>) outputList;
+	}
+
+	@SuppressWarnings("unchecked")
+	public StageTester from(final OutputPort<O> port) {
+		this.port = (OutputPort<Object>) port;
+
+		return stageTester;
+	}
+
+	public List<Object> getOutputElements() {
+		return outputElements;
+	}
+
+	public OutputPort<Object> getPort() {
+		return port;
+	}
+
+}
diff --git a/src/main/java/teetime/framework/test/StageTester.java b/src/main/java/teetime/framework/test/StageTester.java
index 2326e224d379b0204e35f28bf88b88244c4edc81..2dd7d3b05d9e75555dec4461412b4997574df5bd 100644
--- a/src/main/java/teetime/framework/test/StageTester.java
+++ b/src/main/java/teetime/framework/test/StageTester.java
@@ -22,8 +22,6 @@ import java.util.List;
 
 import teetime.framework.Analysis;
 import teetime.framework.AnalysisConfiguration;
-import teetime.framework.InputPort;
-import teetime.framework.OutputPort;
 import teetime.framework.Stage;
 import teetime.framework.pipe.IPipeFactory;
 import teetime.framework.pipe.PipeFactoryRegistry.PipeOrdering;
@@ -52,7 +50,7 @@ public final class StageTester {
 	}
 
 	public <I> InputHolder<I> send(final Iterable<I> input) {
-		final InputHolder<I> inputHolder = new InputHolder<I>(input);
+		final InputHolder<I> inputHolder = new InputHolder<I>(this, stage, input);
 		this.inputHolders.add(inputHolder);
 		return inputHolder;
 	}
@@ -62,7 +60,7 @@ public final class StageTester {
 	}
 
 	public <O> OutputHolder<O> receive(final List<O> outputList) {
-		final OutputHolder<O> outputHolder = new OutputHolder<O>(outputList);
+		final OutputHolder<O> outputHolder = new OutputHolder<O>(this, stage, outputList);
 		this.outputHolders.add(outputHolder);
 		return outputHolder;
 	}
@@ -72,71 +70,14 @@ public final class StageTester {
 	}
 
 	public Collection<Pair<Thread, Throwable>> start() {
-		final AnalysisConfiguration configuration = new Configuration();
+		final AnalysisConfiguration configuration = new Configuration(inputHolders, stage, outputHolders);
 		final Analysis analysis = new Analysis(configuration);
 		return analysis.start();
 	}
 
-	public final class InputHolder<I> {
-
-		private final Iterable<Object> input;
-		private InputPort<Object> port;
-
-		@SuppressWarnings("unchecked")
-		private InputHolder(final Iterable<I> input) {
-			this.input = (Iterable<Object>) input;
-		}
-
-		@SuppressWarnings("unchecked")
-		public StageTester to(final InputPort<? extends I> port) {
-			if (port.getOwningStage() != stage) {
-				throw new AssertionError();
-			}
-			this.port = (InputPort<Object>) port;
-
-			return StageTester.this;
-		}
-
-		public Iterable<Object> getInput() {
-			return input;
-		}
-
-		public InputPort<Object> getPort() {
-			return port;
-		}
-
-	}
-
-	public final class OutputHolder<O> {
-
-		private final List<Object> outputElements;
-		private OutputPort<Object> port;
-
-		@SuppressWarnings("unchecked")
-		private OutputHolder(final List<O> outputList) {
-			this.outputElements = (List<Object>) outputList;
-		}
-
-		@SuppressWarnings("unchecked")
-		public StageTester from(final OutputPort<O> port) {
-			this.port = (OutputPort<Object>) port;
-
-			return StageTester.this;
-		}
-
-		public List<Object> getOutputElements() {
-			return outputElements;
-		}
-
-		public OutputPort<Object> getPort() {
-			return port;
-		}
-
-	}
-
 	private final class Configuration extends AnalysisConfiguration {
 
-		public Configuration() {
+		public Configuration(final List<InputHolder<?>> inputHolders, final Stage stage, final List<OutputHolder<?>> outputHolders) {
 			final IPipeFactory interPipeFactory = PIPE_FACTORY_REGISTRY.getPipeFactory(ThreadCommunication.INTER, PipeOrdering.QUEUE_BASED, false);
 
 			for (InputHolder<?> inputHolder : inputHolders) {
diff --git a/src/site/markdown/wiki b/src/site/markdown/wiki
index 63ccbbc87bd2c0e6599ca91502149dba3cfb99de..0e4474577e1f49bc96e734c286b2d9e0363895e8 160000
--- a/src/site/markdown/wiki
+++ b/src/site/markdown/wiki
@@ -1 +1 @@
-Subproject commit 63ccbbc87bd2c0e6599ca91502149dba3cfb99de
+Subproject commit 0e4474577e1f49bc96e734c286b2d9e0363895e8