diff --git a/src/main/java/teetime/stage/MultipleInstanceOfFilter.java b/src/main/java/teetime/stage/MultipleInstanceOfFilter.java
index f2d34990cb81da00e25986e50e6f50930678692a..23aea142b7ca1f37170242cd4ad7c1229b0f459f 100644
--- a/src/main/java/teetime/stage/MultipleInstanceOfFilter.java
+++ b/src/main/java/teetime/stage/MultipleInstanceOfFilter.java
@@ -13,6 +13,7 @@ import teetime.framework.OutputPort;
 public final class MultipleInstanceOfFilter<I> extends AbstractConsumerStage<I> {
 
 	private final Map<Class<? extends I>, OutputPort<? super I>> outputPortsMap = new HashMap<Class<? extends I>, OutputPort<? super I>>();
+	private Entry<Class<? extends I>, OutputPort<? super I>>[] cachedOutputPortsMap;
 
 	@SuppressWarnings("unchecked")
 	public <T extends I> OutputPort<T> getOutputPortForType(final Class<T> clazz) {
@@ -22,13 +23,21 @@ public final class MultipleInstanceOfFilter<I> extends AbstractConsumerStage<I>
 		return (OutputPort<T>) this.outputPortsMap.get(clazz);
 	}
 
+	@Override
+	@SuppressWarnings("unchecked")
+	public void onStarting() throws Exception {
+		super.onStarting();
+
+		// We cache the map to avoid the creating of iterators during runtime
+		cachedOutputPortsMap = (Entry<Class<? extends I>, OutputPort<? super I>>[]) outputPortsMap.entrySet().toArray(new Entry<?, ?>[outputPortsMap.size()]);
+	}
+
 	@Override
 	protected void execute(final I element) {
-		for (Entry<Class<? extends I>, OutputPort<? super I>> outputPortMapEntry : outputPortsMap.entrySet()) {
+		for (Entry<Class<? extends I>, OutputPort<? super I>> outputPortMapEntry : cachedOutputPortsMap) {
 			if (outputPortMapEntry.getKey().isInstance(element)) {
 				outputPortMapEntry.getValue().send(element);
 			}
 		}
 	}
-
 }