diff --git a/src/main/java/teetime/stage/basic/merger/Merger.java b/src/main/java/teetime/stage/basic/merger/Merger.java
index adeb4abbd0ee85aa343726b28b25fd7cf6e6cda3..52ef50be6df93ccbc3ca20fc4aedf7af65a4c3de 100644
--- a/src/main/java/teetime/stage/basic/merger/Merger.java
+++ b/src/main/java/teetime/stage/basic/merger/Merger.java
@@ -25,6 +25,7 @@ import teetime.framework.InputPort;
 import teetime.framework.OutputPort;
 import teetime.framework.signal.ISignal;
 import teetime.framework.signal.StartingSignal;
+import teetime.framework.signal.TerminatingSignal;
 
 /**
  *
@@ -88,19 +89,27 @@ public final class Merger<T> extends AbstractStage {
 			if (!set.add(inputPort)) {
 				this.logger.warn("Received more than one signal - " + signal + " - from input port: " + inputPort);
 			}
-
+			if (signalMap.get(signalClass).size() == this.getInputPorts().length && signalClass == TerminatingSignal.class) {
+				signal.trigger(this);
+				sendSignalToOutputPorts(signal);
+				signalMap.remove(signalClass);
+			}
 		} else {
 			Set<InputPort<?>> tempSet = new HashSet<InputPort<?>>();
 			tempSet.add(inputPort);
 			signalMap.put((Class<ISignal>) signalClass, tempSet);
+			if (signalClass == StartingSignal.class) {
+				signal.trigger(this);
+				sendSignalToOutputPorts(signal);
+			}
 		}
 
-		if (signalMap.get(signalClass).size() == this.getInputPorts().length || signalClass == StartingSignal.class) {
-			signal.trigger(this);
-			this.outputPort.sendSignal(signal);
-			signalMap.remove(signalClass);
-		}
+	}
 
+	private void sendSignalToOutputPorts(final ISignal signal) {
+		for (OutputPort<?> outputPort : getOutputPorts()) {
+			outputPort.sendSignal(signal);
+		}
 	}
 
 	public IMergerStrategy getMergerStrategy() {
diff --git a/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java b/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java
index 597cee060ae699ad1d4a2ad78deb6802b8843bc1..f4deb2bc2553ecb911ab49c33e46d1379896e670 100644
--- a/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java
+++ b/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java
@@ -15,7 +15,9 @@
  */
 package teetime.stage.basic.merger;
 
-import org.junit.Assert;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import org.junit.Test;
 
 import teetime.framework.InputPort;
@@ -43,59 +45,67 @@ public class MergerSignalTest {
 	public void testSameSignal() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-
+		assertTrue(testPipe.startSent());
+		testPipe.reset();
 		merger.onSignal(new StartingSignal(), secondPort);
-		Assert.assertTrue(testPipe.startSent());
+		assertFalse(testPipe.startSent());
 	}
 
 	@Test
 	public void testDifferentSignals() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertTrue(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), secondPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertFalse(testPipe.startSent());
 	}
 
 	@Test
 	public void testInterleavedSignals() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertFalse(testPipe.terminateSent());
+		assertTrue(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), secondPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertFalse(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertTrue(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertTrue(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertTrue(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), secondPort);
-		Assert.assertTrue(testPipe.startSent());
-		Assert.assertTrue(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
 	}
 
 	@Test
 	public void testMultipleSignals() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertTrue(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertFalse(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertFalse(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), secondPort);
-		Assert.assertTrue(testPipe.startSent());
+		assertFalse(testPipe.startSent());
 	}
 }
diff --git a/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java b/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
index 9b0e3904c1ef14a643ab5620fb6df67ce4f03747..9defb4511cadc946b212a1f857f3ffb2c464a712 100644
--- a/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
+++ b/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
@@ -46,6 +46,11 @@ public class MergerTestingPipe implements IPipe {
 		return this.terminateSent;
 	}
 
+	public void reset() {
+		this.startSent = false;
+		this.terminateSent = false;
+	}
+
 	@Override
 	public boolean add(final Object element) {
 		return false;