diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
index 2626b1667352e9dbb8f507a7ffe383ce0ad052f3..19f61ea4e3258e1668b039d9aacee0a6d7f83016 100644
--- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
+++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
@@ -5,10 +5,10 @@ import java.util.List;
 
 import explorviz.live_trace_processing.Constants;
 import explorviz.live_trace_processing.reader.TimeProvider;
+import explorviz.live_trace_processing.record.event.AbstractAfterEventRecord;
+import explorviz.live_trace_processing.record.event.AbstractAfterFailedEventRecord;
+import explorviz.live_trace_processing.record.event.AbstractBeforeEventRecord;
 import explorviz.live_trace_processing.record.event.AbstractEventRecord;
-import explorviz.live_trace_processing.record.event.normal.AfterFailedOperationEventRecord;
-import explorviz.live_trace_processing.record.event.normal.AfterOperationEventRecord;
-import explorviz.live_trace_processing.record.event.normal.BeforeOperationEventRecord;
 import explorviz.live_trace_processing.record.trace.Trace;
 
 class TraceReconstructionBuffer {
@@ -28,14 +28,14 @@ class TraceReconstructionBuffer {
 		updatedInThisPeriod = true;
 		final int orderIndex = setMaxOrderIndex(event);
 
-		if (event instanceof BeforeOperationEventRecord) {
+		if (event instanceof AbstractBeforeEventRecord) {
 			if (orderIndex == 0) {
 				closeable = true;
 			}
 			openEvents++;
-		} else if (event instanceof AfterOperationEventRecord) {
+		} else if (event instanceof AbstractAfterFailedEventRecord) {
 			openEvents--;
-		} else if (event instanceof AfterFailedOperationEventRecord) {
+		} else if (event instanceof AbstractAfterEventRecord) {
 			openEvents--;
 		}
 
diff --git a/src/explorviz/live_trace_processing/reader/TCPReaderOneClient.java b/src/explorviz/live_trace_processing/reader/TCPReaderOneClient.java
index a1e64d1a068112089571b183bbafd642d380a776..ef6fd8c352ff722ea13d8ef87f21bd4760794008 100644
--- a/src/explorviz/live_trace_processing/reader/TCPReaderOneClient.java
+++ b/src/explorviz/live_trace_processing/reader/TCPReaderOneClient.java
@@ -15,6 +15,9 @@ import explorviz.live_trace_processing.StringRegistry;
 import explorviz.live_trace_processing.filter.RecordArrayEvent;
 import explorviz.live_trace_processing.record.IRecord;
 import explorviz.live_trace_processing.record.event.AbstractEventRecord;
+import explorviz.live_trace_processing.record.event.constructor.AfterConstructorEventRecord;
+import explorviz.live_trace_processing.record.event.constructor.AfterFailedConstructorEventRecord;
+import explorviz.live_trace_processing.record.event.constructor.BeforeConstructorEventRecord;
 import explorviz.live_trace_processing.record.event.normal.AfterFailedOperationEventRecord;
 import explorviz.live_trace_processing.record.event.normal.AfterOperationEventRecord;
 import explorviz.live_trace_processing.record.event.normal.BeforeOperationEventRecord;
@@ -194,6 +197,36 @@ public class TCPReaderOneClient extends Thread implements IPeriodicTimeSignalRec
 
 					break;
 				}
+				case BeforeConstructorEventRecord.CLAZZ_ID: {
+					if (buffer.remaining() >= BeforeConstructorEventRecord.COMPRESSED_BYTE_LENGTH) {
+						readInBeforeConstructorEvent(buffer);
+					} else {
+						buffer.position(buffer.position() - 1);
+						buffer.compact();
+						return;
+					}
+					break;
+				}
+				case AfterFailedConstructorEventRecord.CLAZZ_ID: {
+					if (buffer.remaining() >= AfterFailedConstructorEventRecord.COMPRESSED_BYTE_LENGTH) {
+						readInAfterFailedConstructorEvent(buffer);
+					} else {
+						buffer.position(buffer.position() - 1);
+						buffer.compact();
+						return;
+					}
+					break;
+				}
+				case AfterConstructorEventRecord.CLAZZ_ID: {
+					if (buffer.remaining() >= AfterConstructorEventRecord.COMPRESSED_BYTE_LENGTH) {
+						readInAfterConstructorEvent(buffer);
+					} else {
+						buffer.position(buffer.position() - 1);
+						buffer.compact();
+						return;
+					}
+					break;
+				}
 				default: {
 					System.out.println("unknown class id " + clazzId + " at offset "
 							+ (buffer.position() - 1));
@@ -224,13 +257,15 @@ public class TCPReaderOneClient extends Thread implements IPeriodicTimeSignalRec
 		final long timestamp = buffer.getLong();
 		final long traceId = buffer.getLong();
 		final int orderIndex = buffer.getInt();
+		final int objectId = buffer.getInt();
 		final int operationId = buffer.getInt();
 
 		try {
 			final String operation = stringRegistry.getStringFromId(operationId);
 
 			putInRingBuffer(new BeforeOperationEventRecord(timestamp, traceId, orderIndex,
-					operation, hostApplicationMetadata, new RuntimeStatisticInformation(timestamp)));
+					objectId, operation, hostApplicationMetadata, new RuntimeStatisticInformation(
+							timestamp)));
 		} catch (final IdNotAvailableException e) {
 			putInWaitingMessages(buffer,
 					BeforeOperationEventRecord.COMPRESSED_BYTE_LENGTH_WITH_CLAZZ_ID);
@@ -241,6 +276,7 @@ public class TCPReaderOneClient extends Thread implements IPeriodicTimeSignalRec
 		final long timestamp = buffer.getLong();
 		final long traceId = buffer.getLong();
 		final int orderIndex = buffer.getInt();
+		final int objectId = buffer.getInt();
 		final int operationId = buffer.getInt();
 		final int causeId = buffer.getInt();
 
@@ -249,8 +285,8 @@ public class TCPReaderOneClient extends Thread implements IPeriodicTimeSignalRec
 			final String cause = stringRegistry.getStringFromId(causeId);
 
 			putInRingBuffer(new AfterFailedOperationEventRecord(timestamp, traceId, orderIndex,
-					operation, cause, hostApplicationMetadata, new RuntimeStatisticInformation(
-							timestamp)));
+					objectId, operation, cause, hostApplicationMetadata,
+					new RuntimeStatisticInformation(timestamp)));
 		} catch (final IdNotAvailableException e) {
 			putInWaitingMessages(buffer,
 					AfterFailedOperationEventRecord.COMPRESSED_BYTE_LENGTH_WITH_CLAZZ_ID);
@@ -261,12 +297,13 @@ public class TCPReaderOneClient extends Thread implements IPeriodicTimeSignalRec
 		final long timestamp = buffer.getLong();
 		final long traceId = buffer.getLong();
 		final int orderIndex = buffer.getInt();
+		final int objectId = buffer.getInt();
 		final int operationId = buffer.getInt();
 
 		try {
 			final String operation = stringRegistry.getStringFromId(operationId);
 
-			putInRingBuffer(new AfterOperationEventRecord(timestamp, traceId, orderIndex,
+			putInRingBuffer(new AfterOperationEventRecord(timestamp, traceId, orderIndex, objectId,
 					operation, hostApplicationMetadata, new RuntimeStatisticInformation(timestamp)));
 		} catch (final IdNotAvailableException e) {
 			putInWaitingMessages(buffer,
@@ -284,6 +321,66 @@ public class TCPReaderOneClient extends Thread implements IPeriodicTimeSignalRec
 				hostApplicationMetadata));
 	}
 
+	private final void readInBeforeConstructorEvent(final ByteBuffer buffer) {
+		final long timestamp = buffer.getLong();
+		final long traceId = buffer.getLong();
+		final int orderIndex = buffer.getInt();
+		final int objectId = buffer.getInt();
+		final int operationId = buffer.getInt();
+
+		try {
+			final String operation = stringRegistry.getStringFromId(operationId);
+
+			putInRingBuffer(new BeforeConstructorEventRecord(timestamp, traceId, orderIndex,
+					objectId, operation, hostApplicationMetadata, new RuntimeStatisticInformation(
+							timestamp)));
+		} catch (final IdNotAvailableException e) {
+			putInWaitingMessages(buffer,
+					BeforeConstructorEventRecord.COMPRESSED_BYTE_LENGTH_WITH_CLAZZ_ID);
+		}
+	}
+
+	private final void readInAfterFailedConstructorEvent(final ByteBuffer buffer) {
+		final long timestamp = buffer.getLong();
+		final long traceId = buffer.getLong();
+		final int orderIndex = buffer.getInt();
+		final int objectId = buffer.getInt();
+		final int operationId = buffer.getInt();
+		final int causeId = buffer.getInt();
+
+		try {
+			final String operation = stringRegistry.getStringFromId(operationId);
+			final String cause = stringRegistry.getStringFromId(causeId);
+
+			putInRingBuffer(new AfterFailedConstructorEventRecord(timestamp, traceId, orderIndex,
+					objectId, operation, cause, hostApplicationMetadata,
+					new RuntimeStatisticInformation(timestamp)));
+		} catch (final IdNotAvailableException e) {
+			putInWaitingMessages(buffer,
+					AfterFailedConstructorEventRecord.COMPRESSED_BYTE_LENGTH_WITH_CLAZZ_ID);
+		}
+	}
+
+	private final void readInAfterConstructorEvent(final ByteBuffer buffer) {
+		final long timestamp = buffer.getLong();
+		final long traceId = buffer.getLong();
+		final int orderIndex = buffer.getInt();
+		final int objectId = buffer.getInt();
+		final int operationId = buffer.getInt();
+
+		try {
+			final String operation = stringRegistry.getStringFromId(operationId);
+
+			putInRingBuffer(new AfterConstructorEventRecord(timestamp, traceId, orderIndex,
+					objectId, operation, hostApplicationMetadata, new RuntimeStatisticInformation(
+							timestamp)));
+		} catch (final IdNotAvailableException e) {
+			putInWaitingMessages(buffer,
+					AfterConstructorEventRecord.COMPRESSED_BYTE_LENGTH_WITH_CLAZZ_ID);
+		}
+
+	}
+
 	private final void putInWaitingMessages(final ByteBuffer buffer, final int length) {
 		final byte[] message = new byte[length];
 		buffer.position(buffer.position() - length);
diff --git a/test/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBufferTest.java b/test/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBufferTest.java
index 3cd10dcbef25f845b22cfca1554799f9032080d4..9a452571dbfcfe1dc4917e83cfc5e9fd45cc8a1f 100644
--- a/test/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBufferTest.java
+++ b/test/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBufferTest.java
@@ -13,7 +13,7 @@ public class TraceReconstructionBufferTest {
 	@Test
 	public void testInsertEvent() throws Exception {
 		final TraceReconstructionBuffer traceReconstructionBuffer = new TraceReconstructionBuffer();
-		traceReconstructionBuffer.insertEvent(new BeforeOperationEventRecord(1000, 1, 0, "test",
+		traceReconstructionBuffer.insertEvent(new BeforeOperationEventRecord(1000, 1, 0, 0, "test",
 				new HostApplicationMetaDataRecord("testHost", "testApp"),
 				new RuntimeStatisticInformation(1000)));
 		assertTrue(true); // TODO