diff --git a/scripts/MooBench-cmd/startMooBench.cmd b/scripts/MooBench-cmd/startMooBench.cmd
index a3735bd3a9c3485b317f8fea8e2ad49cf70fbd52..46e8aef4c1055e84fa30c8b4eb1b42bec2d3e8cb 100644
--- a/scripts/MooBench-cmd/startMooBench.cmd
+++ b/scripts/MooBench-cmd/startMooBench.cmd
@@ -1,9 +1,9 @@
 
 set cp=.;MooBench.jar;META-INF/kieker.monitoring.properties;META-INF/kieker.logging.properties
 set jvmParams=-javaagent:lib/kieker-1.9_aspectj.jar -Dorg.aspectj.weaver.loadtime.configuration=META-INF/kieker.aop.xml -Dorg.aspectj.weaver.showWeaveInfo=true -Daj.weaving.verbose=true -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter
-set params=-d 10 -h 1 -m 0 -t 1000000 -o tmp/test.txt -q
+set params=-d 10 -h 1 -m 0 -t 3000000 -o tmp/test.txt -q
 set runs=%1
 
-for %%i in (1,1,%runs%) do (
+for %%i in (%runs%) do (
 	java -cp %cp% %jvmParams% mooBench.benchmark.Benchmark %params%
 )
\ No newline at end of file
diff --git a/src/main/java/teetime/variant/methodcallWithPorts/stage/io/IRecordFactoryMethod.java b/src/main/java/teetime/variant/methodcallWithPorts/stage/io/IRecordFactoryMethod.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1d997c29e5d822a902a2eb240e98726357c5d11
--- /dev/null
+++ b/src/main/java/teetime/variant/methodcallWithPorts/stage/io/IRecordFactoryMethod.java
@@ -0,0 +1,12 @@
+package teetime.variant.methodcallWithPorts.stage.io;
+
+import java.nio.ByteBuffer;
+
+import kieker.common.record.IMonitoringRecord;
+import kieker.common.util.registry.ILookup;
+
+public interface IRecordFactoryMethod {
+
+	IMonitoringRecord create(ByteBuffer buffer, ILookup<String> stringRegistry);
+
+}
diff --git a/src/main/java/teetime/variant/methodcallWithPorts/stage/io/RecordFactory.java b/src/main/java/teetime/variant/methodcallWithPorts/stage/io/RecordFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e46798fa2ecf532c3dbb5169fd1887f886ba509
--- /dev/null
+++ b/src/main/java/teetime/variant/methodcallWithPorts/stage/io/RecordFactory.java
@@ -0,0 +1,27 @@
+package teetime.variant.methodcallWithPorts.stage.io;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+import kieker.common.exception.MonitoringRecordException;
+import kieker.common.record.IMonitoringRecord;
+import kieker.common.util.registry.ILookup;
+
+public final class RecordFactory {
+
+	private final Map<String, IRecordFactoryMethod> recordFactoryMethods = new HashMap<String, IRecordFactoryMethod>();
+
+	public IMonitoringRecord create(final int clazzId, final ByteBuffer buffer, final ILookup<String> stringRegistry) throws MonitoringRecordException {
+		String recordClassName = stringRegistry.get(clazzId);
+		IRecordFactoryMethod recordFactoryMethod = this.recordFactoryMethods.get(recordClassName);
+		if (recordFactoryMethod == null) {
+			throw new IllegalStateException("recordClassName: " + recordClassName);
+		}
+		return recordFactoryMethod.create(buffer, stringRegistry);
+	}
+
+	public void register(final String recordClassName, final IRecordFactoryMethod recordFactoryMethod) {
+		this.recordFactoryMethods.put(recordClassName, recordFactoryMethod);
+	}
+}
diff --git a/src/main/java/teetime/variant/methodcallWithPorts/stage/io/TCPReader.java b/src/main/java/teetime/variant/methodcallWithPorts/stage/io/TCPReader.java
index 9a775c4ead39e2f55cdce2c596a3558ccc07bb1d..4ad70dcc1f81978444fa958101b7c9d51fc6ab11 100644
--- a/src/main/java/teetime/variant/methodcallWithPorts/stage/io/TCPReader.java
+++ b/src/main/java/teetime/variant/methodcallWithPorts/stage/io/TCPReader.java
@@ -28,8 +28,11 @@ import teetime.variant.methodcallWithPorts.framework.core.ProducerStage;
 import kieker.common.exception.MonitoringRecordException;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.common.record.AbstractMonitoringRecord;
 import kieker.common.record.IMonitoringRecord;
+import kieker.common.record.flow.trace.operation.AfterOperationEvent;
+import kieker.common.record.flow.trace.operation.BeforeOperationEvent;
+import kieker.common.record.flow.trace.operation.CallOperationEvent;
+import kieker.common.record.misc.KiekerMetadataRecord;
 import kieker.common.record.misc.RegistryRecord;
 import kieker.common.util.registry.ILookup;
 import kieker.common.util.registry.Lookup;
@@ -52,6 +55,8 @@ public class TCPReader extends ProducerStage<Void, IMonitoringRecord> {
 
 	private TCPStringReader tcpStringReader;
 
+	private RecordFactory recordFactory;
+
 	// @Override // implement onStop
 	// public void onPipelineStops() {
 	// super.logger.info("Shutdown of TCPReader requested.");
@@ -77,11 +82,51 @@ public class TCPReader extends ProducerStage<Void, IMonitoringRecord> {
 
 	@Override
 	public void onStart() {
+		this.recordFactory = new RecordFactory();
+		this.register();
+
 		this.tcpStringReader = new TCPStringReader(this.port2, this.stringRegistry);
 		this.tcpStringReader.start();
 		super.onStart();
 	}
 
+	private void register() {
+		this.recordFactory.register(kieker.common.record.flow.trace.TraceMetadata.class.getCanonicalName(), new IRecordFactoryMethod() {
+			@Override
+			public IMonitoringRecord create(final ByteBuffer buffer, final ILookup<String> stringRegistry) {
+				return new kieker.common.record.flow.trace.TraceMetadata(buffer, stringRegistry);
+			}
+		});
+
+		this.recordFactory.register(KiekerMetadataRecord.class.getCanonicalName(), new IRecordFactoryMethod() {
+			@Override
+			public IMonitoringRecord create(final ByteBuffer buffer, final ILookup<String> stringRegistry) {
+				return new KiekerMetadataRecord(buffer, stringRegistry);
+			}
+		});
+
+		this.recordFactory.register(BeforeOperationEvent.class.getCanonicalName(), new IRecordFactoryMethod() {
+			@Override
+			public IMonitoringRecord create(final ByteBuffer buffer, final ILookup<String> stringRegistry) {
+				return new BeforeOperationEvent(buffer, stringRegistry);
+			}
+		});
+
+		this.recordFactory.register(AfterOperationEvent.class.getCanonicalName(), new IRecordFactoryMethod() {
+			@Override
+			public IMonitoringRecord create(final ByteBuffer buffer, final ILookup<String> stringRegistry) {
+				return new AfterOperationEvent(buffer, stringRegistry);
+			}
+		});
+
+		this.recordFactory.register(CallOperationEvent.class.getCanonicalName(), new IRecordFactoryMethod() {
+			@Override
+			public IMonitoringRecord create(final ByteBuffer buffer, final ILookup<String> stringRegistry) {
+				return new CallOperationEvent(buffer, stringRegistry);
+			}
+		});
+	}
+
 	@Override
 	protected void execute5(final Void element) {
 		ServerSocketChannel serversocket = null;
@@ -104,7 +149,8 @@ public class TCPReader extends ProducerStage<Void, IMonitoringRecord> {
 						final long loggingTimestamp = buffer.getLong();
 						final IMonitoringRecord record;
 						try { // NOCS (Nested try-catch)
-							record = AbstractMonitoringRecord.createFromByteBuffer(clazzid, buffer, this.stringRegistry);
+							record = this.recordFactory.create(clazzid, buffer, this.stringRegistry);
+							// record = AbstractMonitoringRecord.createFromByteBuffer(clazzid, buffer, this.stringRegistry);
 							record.setLoggingTimestamp(loggingTimestamp);
 							this.send(record);
 						} catch (final MonitoringRecordException ex) {