diff --git a/src/test/java/teetime/stage/basic/merger/MergerTest.java b/src/test/java/teetime/stage/basic/merger/MergerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5d235ad159f3710c847139ccf3b936e1b685c77
--- /dev/null
+++ b/src/test/java/teetime/stage/basic/merger/MergerTest.java
@@ -0,0 +1,70 @@
+package teetime.stage.basic.merger;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import teetime.framework.InputPort;
+import teetime.framework.signal.StartingSignal;
+import teetime.framework.signal.TerminatingSignal;
+
+public class MergerTest {
+
+	private Merger<Integer> merger;
+	private InputPort<Integer> firstPort;
+	private InputPort<Integer> secondPort;
+	private MergerTestingPipe testPipe;
+
+	public void beforeSignalTesting() {
+		merger = new Merger<Integer>();
+
+		firstPort = merger.getNewInputPort();
+		secondPort = merger.getNewInputPort();
+
+		testPipe = new MergerTestingPipe();
+		merger.getOutputPort().setPipe(testPipe);
+	}
+
+	@Test
+	public void testSameSignal() {
+		this.beforeSignalTesting();
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), secondPort);
+		Assert.assertTrue(testPipe.startSent());
+	}
+
+	@Test
+	public void testDifferentSignals() {
+		this.beforeSignalTesting();
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new TerminatingSignal(), secondPort);
+		Assert.assertFalse(testPipe.startSent());
+	}
+
+	@Test
+	public void testInterleavedSignals() {
+		this.beforeSignalTesting();
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+		Assert.assertFalse(testPipe.terminateSent());
+
+		merger.onSignal(new TerminatingSignal(), secondPort);
+		Assert.assertFalse(testPipe.startSent());
+		Assert.assertFalse(testPipe.terminateSent());
+
+		merger.onSignal(new TerminatingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+		Assert.assertTrue(testPipe.terminateSent());
+
+		merger.onSignal(new TerminatingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+		Assert.assertTrue(testPipe.terminateSent());
+
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertTrue(testPipe.startSent());
+		Assert.assertTrue(testPipe.terminateSent());
+	}
+}
diff --git a/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java b/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4c47289d5d6b9fc18b17b5093ba7e4c2ab9864a
--- /dev/null
+++ b/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
@@ -0,0 +1,81 @@
+package teetime.stage.basic.merger;
+
+import teetime.framework.InputPort;
+import teetime.framework.OutputPort;
+import teetime.framework.pipe.IPipe;
+import teetime.framework.signal.ISignal;
+import teetime.framework.signal.StartingSignal;
+import teetime.framework.signal.TerminatingSignal;
+
+public class MergerTestingPipe implements IPipe {
+
+	private boolean startSent = false;
+	private boolean terminateSent = false;
+
+	public MergerTestingPipe() {}
+
+	@Override
+	public void sendSignal(final ISignal signal) {
+		if (signal.getClass().equals(StartingSignal.class)) {
+			this.startSent = true;
+		} else if (signal.getClass().equals(TerminatingSignal.class)) {
+			this.terminateSent = true;
+		}
+	}
+
+	public boolean startSent() {
+		return this.startSent;
+	}
+
+	public boolean terminateSent() {
+		return this.terminateSent;
+	}
+
+	@Override
+	public boolean add(final Object element) {
+		return false;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public int size() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public Object removeLast() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Object readLast() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public InputPort<?> getTargetPort() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public <T> void connectPorts(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void reportNewElement() {
+		// TODO Auto-generated method stub
+
+	}
+
+}