diff --git a/.settings/edu.umd.cs.findbugs.core.prefs b/.settings/edu.umd.cs.findbugs.core.prefs
index 6428bfcdf4bd941fab0b1cff6b8148f19fc75747..272829c98a168fe30809408fb54fba974a022f37 100644
--- a/.settings/edu.umd.cs.findbugs.core.prefs
+++ b/.settings/edu.umd.cs.findbugs.core.prefs
@@ -1,5 +1,5 @@
 #FindBugs User Preferences
-#Tue Nov 18 10:57:28 CET 2014
+#Tue Nov 25 12:10:00 CET 2014
 detector_threshold=3
 effort=max
 excludefilter0=.fbExcludeFilterFile|true
diff --git a/src/main/java/teetime/stage/basic/merger/Merger.java b/src/main/java/teetime/stage/basic/merger/Merger.java
index 1ea6e2a1987d9ef99c19c0f4b68a0d6a84810519..bde21d7f9c3028ca6fa093c4aab7e2f93ca67735 100644
--- a/src/main/java/teetime/stage/basic/merger/Merger.java
+++ b/src/main/java/teetime/stage/basic/merger/Merger.java
@@ -17,7 +17,9 @@
 package teetime.stage.basic.merger;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import teetime.framework.AbstractStage;
 import teetime.framework.InputPort;
@@ -27,6 +29,7 @@ import teetime.framework.signal.ISignal;
 /**
  *
  * This stage merges data from the input ports, by taking elements according to the chosen merge strategy and by putting them to the output port.
+ * For its signal handling behavior see {@link #onSignal(ISignal, InputPort)}
  *
  * @author Christian Wulf
  *
@@ -41,7 +44,7 @@ public class Merger<T> extends AbstractStage {
 
 	private IMergerStrategy<T> strategy = new RoundRobinStrategy<T>();
 
-	private final Map<Class<?>, Integer> signalMap = new HashMap<Class<?>, Integer>();
+	private final Map<Class<?>, Set<InputPort<?>>> signalMap = new HashMap<Class<?>, Set<InputPort<?>>>();
 
 	@Override
 	public void executeWithPorts() {
@@ -53,22 +56,36 @@ public class Merger<T> extends AbstractStage {
 		this.send(this.outputPort, token);
 	}
 
+	/**
+	 * This method is executed, if a signal is sent to a instance of this class.
+	 * Multiple signals of one certain type are ignored, if they are sent to same port.
+	 * Hence a signal is only passed on, when it arrived on all input ports, regardless how often.
+	 *
+	 * @param signal
+	 *            Signal which is sent
+	 *
+	 * @param inputPort
+	 *            The port which the signal was sent to
+	 */
 	@Override
 	public void onSignal(final ISignal signal, final InputPort<?> inputPort) {
 		this.logger.trace("Got signal: " + signal + " from input port: " + inputPort);
 
 		if (signalMap.containsKey(signal.getClass())) {
-			int value = signalMap.get(signal.getClass());
-			value++;
-			if (value == this.getInputPorts().length) {
+			Set<InputPort<?>> set = signalMap.get(signal.getClass());
+			if (!set.add(inputPort)) {
+				this.logger.warn("Received more than one signal - " + signal + " - from input port: " + inputPort);
+			}
+
+			if (set.size() == this.getInputPorts().length) {
 				this.outputPort.sendSignal(signal);
 				signalMap.remove(signal.getClass());
-			} else {
-				signalMap.put(signal.getClass(), value);
 			}
 		} else {
 			signal.trigger(this);
-			signalMap.put(signal.getClass(), 1);
+			Set<InputPort<?>> tempSet = new HashSet<InputPort<?>>();
+			tempSet.add(inputPort);
+			signalMap.put(signal.getClass(), tempSet);
 		}
 
 	}
diff --git a/src/test/java/teetime/stage/basic/merger/MergerTest.java b/src/test/java/teetime/stage/basic/merger/MergerTest.java
index a5d235ad159f3710c847139ccf3b936e1b685c77..7afbb35d67f3af495dde66bd87f0a91ee219fa0f 100644
--- a/src/test/java/teetime/stage/basic/merger/MergerTest.java
+++ b/src/test/java/teetime/stage/basic/merger/MergerTest.java
@@ -63,8 +63,24 @@ public class MergerTest {
 		Assert.assertFalse(testPipe.startSent());
 		Assert.assertTrue(testPipe.terminateSent());
 
-		merger.onSignal(new StartingSignal(), firstPort);
+		merger.onSignal(new StartingSignal(), secondPort);
 		Assert.assertTrue(testPipe.startSent());
 		Assert.assertTrue(testPipe.terminateSent());
 	}
+
+	@Test
+	public void testMultipleSignals() {
+		this.beforeSignalTesting();
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), firstPort);
+		Assert.assertFalse(testPipe.startSent());
+
+		merger.onSignal(new StartingSignal(), secondPort);
+		Assert.assertTrue(testPipe.startSent());
+	}
 }