diff --git a/src/main/java/teetime/framework/ConfigurationContext.java b/src/main/java/teetime/framework/ConfigurationContext.java
index 236f4c3808d5dce6801b62cc7b62ffdfad291b76..7d2edf220f0d4f7f985252942a58491be5f8253c 100644
--- a/src/main/java/teetime/framework/ConfigurationContext.java
+++ b/src/main/java/teetime/framework/ConfigurationContext.java
@@ -33,7 +33,7 @@ public class ConfigurationContext {
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationContext.class);
 
-	private final Map<Stage, String> threadableStages = new HashMap<Stage, String>();
+	private Map<Stage, String> threadableStages = new HashMap<Stage, String>();
 
 	ConfigurationContext() {}
 
@@ -63,21 +63,21 @@ public class ConfigurationContext {
 			LOGGER.warn("Overwriting existing pipe while connecting stages " +
 					sourcePort.getOwningStage().getId() + " and " + targetPort.getOwningStage().getId() + ".");
 		}
-		mergeContexts(sourcePort.getOwningStage(), targetPort.getOwningStage());
+		mergeContexts(sourcePort.getOwningStage());
+		mergeContexts(targetPort.getOwningStage());
 		new InstantiationPipe(sourcePort, targetPort, capacity);
 	}
 
-	final void mergeContexts(final Stage sourceStage, final Stage targetStage) {
-		if (!sourceStage.owningContext.equals(EmptyContext.getInstance())) {
-			this.threadableStages.putAll(sourceStage.owningContext.threadableStages);
-		} else {
-			sourceStage.owningContext = this;
-		}
-		if (!targetStage.owningContext.equals(EmptyContext.getInstance())) {
-			this.threadableStages.putAll(targetStage.owningContext.threadableStages);
+	final void mergeContexts(final Stage stage) {
+		if (!stage.owningContext.equals(EmptyContext.getInstance())) {
+			if (stage.owningContext != this) { // Performance
+				this.threadableStages.putAll(stage.owningContext.threadableStages);
+				stage.owningContext.threadableStages = this.threadableStages;
+			}
 		} else {
-			targetStage.owningContext = this;
+			stage.owningContext = this;
 		}
+
 	}
 
 }