diff --git a/src/main/java/teetime/framework/AbstractBasicStage.java b/src/main/java/teetime/framework/AbstractBasicStage.java
deleted file mode 100644
index 0bbcb5a56ab23230eaa44988ede9d7dad5d537fe..0000000000000000000000000000000000000000
--- a/src/main/java/teetime/framework/AbstractBasicStage.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package teetime.framework;
-
-import teetime.framework.signal.ISignal;
-
-public abstract class AbstractBasicStage implements IStage {
-
-	protected abstract void executeWithPorts();
-
-	protected abstract void onSignal(ISignal signal, InputPort<?> inputPort);
-
-	protected abstract TerminationStrategy getTerminationStrategy();
-
-	protected abstract void terminate();
-
-	protected abstract boolean shouldBeTerminated();
-}
diff --git a/src/main/java/teetime/framework/AbstractStage.java b/src/main/java/teetime/framework/AbstractStage.java
index 06d80bfe8c44642113599e12b4e487f5f245be20..b56eb2ae89e375c5217fb1b1c5b2f5b019cba595 100644
--- a/src/main/java/teetime/framework/AbstractStage.java
+++ b/src/main/java/teetime/framework/AbstractStage.java
@@ -14,7 +14,7 @@ import teetime.framework.pipe.IPipe;
 import teetime.framework.signal.ISignal;
 import teetime.framework.validation.InvalidPortConnection;
 
-public abstract class AbstractStage extends AbstractBasicStage {
+public abstract class AbstractStage extends Stage {
 
 	private final String id;
 	/**
@@ -22,7 +22,7 @@ public abstract class AbstractStage extends AbstractBasicStage {
 	 */
 	protected final Logger logger; // NOPMD
 
-	private IStage parentStage;
+	private Stage parentStage;
 
 	private final List<InputPort<?>> inputPortList = new ArrayList<InputPort<?>>();
 	private final List<OutputPort<?>> outputPortList = new ArrayList<OutputPort<?>>();
@@ -75,12 +75,12 @@ public abstract class AbstractStage extends AbstractBasicStage {
 	}
 
 	@Override
-	public IStage getParentStage() {
+	public Stage getParentStage() {
 		return this.parentStage;
 	}
 
 	@Override
-	public void setParentStage(final IStage parentStage, final int index) {
+	public void setParentStage(final Stage parentStage, final int index) {
 		this.parentStage = parentStage;
 	}
 
diff --git a/src/main/java/teetime/framework/Analysis.java b/src/main/java/teetime/framework/Analysis.java
index 286db07a5da6d43605f55562ffd67654477eff98..fc3b26ae8a331ed3aebbce382dd2cac6a104dc6b 100644
--- a/src/main/java/teetime/framework/Analysis.java
+++ b/src/main/java/teetime/framework/Analysis.java
@@ -28,8 +28,8 @@ public class Analysis implements UncaughtExceptionHandler {
 	}
 
 	public void init() {
-		final List<AbstractBasicStage> threadableStageJobs = this.configuration.getThreadableStageJobs();
-		for (AbstractBasicStage stage : threadableStageJobs) {
+		final List<Stage> threadableStageJobs = this.configuration.getThreadableStageJobs();
+		for (Stage stage : threadableStageJobs) {
 			final Thread thread = new Thread(new RunnableStage(stage));
 			switch (stage.getTerminationStrategy()) {
 			case BY_SIGNAL:
diff --git a/src/main/java/teetime/framework/AnalysisConfiguration.java b/src/main/java/teetime/framework/AnalysisConfiguration.java
index 81f41e1a953ff0796a644f50adb45048f4fab89e..c6a0436bc33783ac7d044c817729389d3a61fafe 100644
--- a/src/main/java/teetime/framework/AnalysisConfiguration.java
+++ b/src/main/java/teetime/framework/AnalysisConfiguration.java
@@ -8,15 +8,15 @@ import teetime.framework.pipe.PipeFactoryRegistry;
 public class AnalysisConfiguration {
 
 	protected static final PipeFactoryRegistry PIPE_FACTORY_REGISTRY = PipeFactoryRegistry.INSTANCE;
-	private final List<AbstractBasicStage> threadableStageJobs = new LinkedList<AbstractBasicStage>();
+	private final List<Stage> threadableStageJobs = new LinkedList<Stage>();
 
 	public AnalysisConfiguration() {}
 
-	List<AbstractBasicStage> getThreadableStageJobs() {
+	List<Stage> getThreadableStageJobs() {
 		return this.threadableStageJobs;
 	}
 
-	public void addThreadableStage(final AbstractBasicStage stage) {
+	public void addThreadableStage(final Stage stage) {
 		this.threadableStageJobs.add(stage);
 	}
 
diff --git a/src/main/java/teetime/framework/IStage.java b/src/main/java/teetime/framework/IStage.java
deleted file mode 100644
index a9033bba0caf9f08b247035fa717ee94dd098c53..0000000000000000000000000000000000000000
--- a/src/main/java/teetime/framework/IStage.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package teetime.framework;
-
-import java.util.List;
-
-import teetime.framework.validation.InvalidPortConnection;
-
-@Deprecated
-public interface IStage {
-
-	public String getId();
-
-	public IStage getParentStage();
-
-	public void setParentStage(IStage parentStage, int index);
-
-	/**
-	 *
-	 * @param invalidPortConnections
-	 *            <i>(Passed as parameter for performance reasons)</i>
-	 */
-	public void validateOutputPorts(List<InvalidPortConnection> invalidPortConnections);
-}
diff --git a/src/main/java/teetime/framework/InputPort.java b/src/main/java/teetime/framework/InputPort.java
index 942f06f76afc56decf83c5113331cbfff0640edb..62b14d9bf8452ad4ae7defc8bbfda1ba10abdf75 100644
--- a/src/main/java/teetime/framework/InputPort.java
+++ b/src/main/java/teetime/framework/InputPort.java
@@ -4,9 +4,9 @@ import teetime.framework.pipe.IPipe;
 
 public class InputPort<T> extends AbstractPort<T> {
 
-	private final AbstractBasicStage owningStage;
+	private final Stage owningStage;
 
-	InputPort(final AbstractBasicStage owningStage) {
+	InputPort(final Stage owningStage) {
 		super();
 		this.owningStage = owningStage;
 	}
@@ -33,7 +33,7 @@ public class InputPort<T> extends AbstractPort<T> {
 		this.pipe = pipe;
 	}
 
-	public AbstractBasicStage getOwningStage() {
+	public Stage getOwningStage() {
 		return this.owningStage;
 	}
 
diff --git a/src/main/java/teetime/framework/RunnableStage.java b/src/main/java/teetime/framework/RunnableStage.java
index 89796f9020836da664edf609c52e7916c7a7d4a4..89340d200883e727de82844f2d9bc6ff800de20f 100644
--- a/src/main/java/teetime/framework/RunnableStage.java
+++ b/src/main/java/teetime/framework/RunnableStage.java
@@ -10,11 +10,11 @@ import teetime.framework.validation.AnalysisNotValidException;
 
 public class RunnableStage implements Runnable {
 
-	private final AbstractBasicStage stage;
+	private final Stage stage;
 	private final Logger logger; // NOPMD
 	private boolean validationEnabled;
 
-	public RunnableStage(final AbstractBasicStage stage) {
+	public RunnableStage(final Stage stage) {
 		this.stage = stage;
 		this.logger = LoggerFactory.getLogger(stage.getClass());
 	}
diff --git a/src/main/java/teetime/framework/Stage.java b/src/main/java/teetime/framework/Stage.java
new file mode 100644
index 0000000000000000000000000000000000000000..d490bc631a669a4b43509bda8c511331f80e754b
--- /dev/null
+++ b/src/main/java/teetime/framework/Stage.java
@@ -0,0 +1,32 @@
+package teetime.framework;
+
+import java.util.List;
+
+import teetime.framework.signal.ISignal;
+import teetime.framework.validation.InvalidPortConnection;
+
+public abstract class Stage {
+
+	public abstract String getId();
+
+	public abstract Stage getParentStage();
+
+	public abstract void setParentStage(Stage parentStage, int index);
+
+	/**
+	 *
+	 * @param invalidPortConnections
+	 *            <i>(Passed as parameter for performance reasons)</i>
+	 */
+	public abstract void validateOutputPorts(List<InvalidPortConnection> invalidPortConnections);
+
+	protected abstract void executeWithPorts();
+
+	protected abstract void onSignal(ISignal signal, InputPort<?> inputPort);
+
+	protected abstract TerminationStrategy getTerminationStrategy();
+
+	protected abstract void terminate();
+
+	protected abstract boolean shouldBeTerminated();
+}
diff --git a/src/main/java/teetime/framework/pipe/AbstractPipe.java b/src/main/java/teetime/framework/pipe/AbstractPipe.java
index cc28ecf90584eb6807682d0dac1d320cf9e04c85..1790a4451479385452b89422bf43d75a5dfd9429 100644
--- a/src/main/java/teetime/framework/pipe/AbstractPipe.java
+++ b/src/main/java/teetime/framework/pipe/AbstractPipe.java
@@ -1,6 +1,6 @@
 package teetime.framework.pipe;
 
-import teetime.framework.AbstractBasicStage;
+import teetime.framework.Stage;
 import teetime.framework.InputPort;
 import teetime.framework.OutputPort;
 
@@ -13,7 +13,7 @@ public abstract class AbstractPipe implements IPipe {
 	 * this.getPipe().getTargetPort().getOwningStage()
 	 * </pre>
 	 */
-	protected AbstractBasicStage cachedTargetStage;
+	protected Stage cachedTargetStage;
 
 	private InputPort<?> targetPort;
 
diff --git a/src/performancetest/java/teetime/examples/experiment09/MethodCallThroughputAnalysis9.java b/src/performancetest/java/teetime/examples/experiment09/MethodCallThroughputAnalysis9.java
index 18476d0ca6e46e8d11f02e7f158d098a0f107c3d..e5e38cab4f897c29787c68774b51c24d8f2d5b58 100644
--- a/src/performancetest/java/teetime/examples/experiment09/MethodCallThroughputAnalysis9.java
+++ b/src/performancetest/java/teetime/examples/experiment09/MethodCallThroughputAnalysis9.java
@@ -17,7 +17,7 @@ package teetime.examples.experiment09;
 
 import java.util.List;
 
-import teetime.framework.AbstractBasicStage;
+import teetime.framework.Stage;
 import teetime.framework.OldHeadPipeline;
 import teetime.framework.RunnableStage;
 import teetime.framework.pipe.CommittablePipe;
@@ -43,7 +43,7 @@ public class MethodCallThroughputAnalysis9 {
 	private Runnable runnable;
 
 	public void init() {
-		AbstractBasicStage pipeline = this.buildPipeline();
+		Stage pipeline = this.buildPipeline();
 		this.runnable = new RunnableStage(pipeline);
 	}
 
diff --git a/src/performancetest/java/teetime/examples/experiment11/MethodCallThroughputAnalysis11.java b/src/performancetest/java/teetime/examples/experiment11/MethodCallThroughputAnalysis11.java
index e1598de80e5a1f79ebc05e5866869eeb7df1b260..ac70216dab166fb436ea93937ff58ba5f9a035f7 100644
--- a/src/performancetest/java/teetime/examples/experiment11/MethodCallThroughputAnalysis11.java
+++ b/src/performancetest/java/teetime/examples/experiment11/MethodCallThroughputAnalysis11.java
@@ -17,7 +17,7 @@ package teetime.examples.experiment11;
 
 import java.util.List;
 
-import teetime.framework.AbstractBasicStage;
+import teetime.framework.Stage;
 import teetime.framework.OldHeadPipeline;
 import teetime.framework.RunnableStage;
 import teetime.framework.pipe.UnorderedGrowablePipe;
@@ -43,7 +43,7 @@ public class MethodCallThroughputAnalysis11 {
 	private Runnable runnable;
 
 	public void init() {
-		AbstractBasicStage pipeline = this.buildPipeline(this.numInputObjects, this.inputObjectCreator);
+		Stage pipeline = this.buildPipeline(this.numInputObjects, this.inputObjectCreator);
 		this.runnable = new RunnableStage(pipeline);
 	}
 
diff --git a/src/performancetest/java/teetime/examples/experiment14/MethodCallThroughputAnalysis14.java b/src/performancetest/java/teetime/examples/experiment14/MethodCallThroughputAnalysis14.java
index 1546da21c2a9975f14037d0167cab39cc5ebe1e8..658ce7a02980b7127307373fc08df924317b01fe 100644
--- a/src/performancetest/java/teetime/examples/experiment14/MethodCallThroughputAnalysis14.java
+++ b/src/performancetest/java/teetime/examples/experiment14/MethodCallThroughputAnalysis14.java
@@ -17,7 +17,7 @@ package teetime.examples.experiment14;
 
 import java.util.List;
 
-import teetime.framework.AbstractBasicStage;
+import teetime.framework.Stage;
 import teetime.framework.OldHeadPipeline;
 import teetime.framework.RunnableStage;
 import teetime.framework.pipe.IPipeFactory;
@@ -47,7 +47,7 @@ public class MethodCallThroughputAnalysis14 {
 	private final PipeFactoryRegistry pipeFactory = PipeFactoryRegistry.INSTANCE;
 
 	public void init() {
-		AbstractBasicStage pipeline = this.buildPipeline();
+		Stage pipeline = this.buildPipeline();
 		this.runnable = new RunnableStage(pipeline);
 	}
 
diff --git a/src/performancetest/java/teetime/examples/experiment15/MethodCallThroughputAnalysis15.java b/src/performancetest/java/teetime/examples/experiment15/MethodCallThroughputAnalysis15.java
index 059611424d23726eb525705674d84dd06ac68db8..f6c65eed58ff0f2c0910271db603c0b0be886636 100644
--- a/src/performancetest/java/teetime/examples/experiment15/MethodCallThroughputAnalysis15.java
+++ b/src/performancetest/java/teetime/examples/experiment15/MethodCallThroughputAnalysis15.java
@@ -17,7 +17,7 @@ package teetime.examples.experiment15;
 
 import java.util.List;
 
-import teetime.framework.AbstractBasicStage;
+import teetime.framework.Stage;
 import teetime.framework.OldHeadPipeline;
 import teetime.framework.RunnableStage;
 import teetime.framework.pipe.OrderedGrowableArrayPipe;
@@ -58,7 +58,7 @@ public class MethodCallThroughputAnalysis15 {
 		OldHeadPipeline<Clock, Sink<Long>> clockPipeline = this.buildClockPipeline();
 		this.clockRunnable = new RunnableStage(clockPipeline);
 
-		AbstractBasicStage pipeline = this.buildPipeline(this.clock);
+		Stage pipeline = this.buildPipeline(this.clock);
 		this.runnable = new RunnableStage(pipeline);
 	}
 
diff --git a/src/performancetest/java/teetime/examples/experiment17/MethodCallThroughputAnalysis17.java b/src/performancetest/java/teetime/examples/experiment17/MethodCallThroughputAnalysis17.java
index 503e8b832082255ab6d1abf5813bde10c8e11ba2..c9d8f6d5a0319c08aaa3dc7477dff8326df4e709 100644
--- a/src/performancetest/java/teetime/examples/experiment17/MethodCallThroughputAnalysis17.java
+++ b/src/performancetest/java/teetime/examples/experiment17/MethodCallThroughputAnalysis17.java
@@ -19,9 +19,9 @@ import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
+import teetime.framework.Stage;
 import teetime.framework.OldHeadPipeline;
 import teetime.framework.RunnableStage;
-import teetime.framework.IStage;
 import teetime.framework.pipe.DummyPipe;
 import teetime.framework.pipe.IPipe;
 import teetime.framework.pipe.PipeFactoryRegistry;
@@ -34,7 +34,6 @@ import teetime.stage.ObjectProducer;
 import teetime.stage.Relay;
 import teetime.stage.StartTimestampFilter;
 import teetime.stage.StopTimestampFilter;
-import teetime.stage.basic.Sink;
 import teetime.stage.basic.distributor.Distributor;
 import teetime.util.ConstructorClosure;
 import teetime.util.TimestampObject;
@@ -133,7 +132,7 @@ public class MethodCallThroughputAnalysis17 {
 	 * @param numNoopFilters
 	 * @since 1.10
 	 */
-	private OldHeadPipeline<Relay<TimestampObject>, CollectorSink<TimestampObject>> buildPipeline(final IStage previousStage,
+	private OldHeadPipeline<Relay<TimestampObject>, CollectorSink<TimestampObject>> buildPipeline(final Stage previousStage,
 			final List<TimestampObject> timestampObjects) {
 		// create stages
 		Relay<TimestampObject> relay = new Relay<TimestampObject>();
diff --git a/src/performancetest/java/teetime/framework/OldHeadPipeline.java b/src/performancetest/java/teetime/framework/OldHeadPipeline.java
index 976baa44dcb4c436e7cb2a3fec705da7ca6317ab..57015b5d868a7112726b67b4a4a44b997b963610 100644
--- a/src/performancetest/java/teetime/framework/OldHeadPipeline.java
+++ b/src/performancetest/java/teetime/framework/OldHeadPipeline.java
@@ -1,7 +1,7 @@
 package teetime.framework;
 
 @Deprecated
-public class OldHeadPipeline<FirstStage extends AbstractBasicStage, LastStage extends IStage> extends OldPipeline<FirstStage, LastStage> implements IStage {
+public class OldHeadPipeline<FirstStage extends Stage, LastStage extends Stage> extends OldPipeline<FirstStage, LastStage> {
 
 	public OldHeadPipeline() {}
 
diff --git a/src/performancetest/java/teetime/framework/OldPipeline.java b/src/performancetest/java/teetime/framework/OldPipeline.java
index e883cfc92495a9ed562a18c55b59b7804331ce1b..05bdb62f3e148053f9906947f9271fd7dd9341fd 100644
--- a/src/performancetest/java/teetime/framework/OldPipeline.java
+++ b/src/performancetest/java/teetime/framework/OldPipeline.java
@@ -6,7 +6,7 @@ import teetime.framework.signal.ISignal;
 import teetime.framework.validation.InvalidPortConnection;
 
 @Deprecated
-public class OldPipeline<FirstStage extends AbstractBasicStage, LastStage extends IStage> extends AbstractBasicStage {
+public class OldPipeline<FirstStage extends Stage, LastStage extends Stage> extends Stage {
 
 	protected FirstStage firstStage;
 	protected LastStage lastStage;
@@ -38,12 +38,12 @@ public class OldPipeline<FirstStage extends AbstractBasicStage, LastStage extend
 	}
 
 	@Override
-	public IStage getParentStage() {
+	public Stage getParentStage() {
 		return this.firstStage.getParentStage();
 	}
 
 	@Override
-	public void setParentStage(final IStage parentStage, final int index) {
+	public void setParentStage(final Stage parentStage, final int index) {
 		this.firstStage.setParentStage(parentStage, index);
 	}