diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
index 57675813c5a832602ec2221635c3ea01ffeccd09..df7c4411b24881b3358b7e4b8be0c1c92048432a 100644
--- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
+++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
@@ -24,6 +24,14 @@ class TraceReconstructionBuffer {
 	private long lastBufferInsert = -1;
 	private int maxOrderIndex = -1;
 
+	public void clear() {
+		events.clear();
+		openEvents = 0;
+		updatedInThisPeriod = true;
+		lastBufferInsert = -1;
+		maxOrderIndex = -1;
+	}
+
 	public final void insertEvent(final AbstractEventRecord event) {
 		updatedInThisPeriod = true;
 		setMaxOrderIndex(event);
@@ -90,6 +98,6 @@ class TraceReconstructionBuffer {
 				}
 			}
 		}
-		return new Trace(events, valid);
+		return new Trace(new ArrayList<AbstractEventRecord>(events), valid);
 	}
 }
diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java
index d3498437ad165c21f997309d7fb91e966ba60b40..61fa7f05a0764f82dec3e1ed72ce1fc50b644343 100644
--- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java
+++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java
@@ -1,6 +1,7 @@
 package explorviz.live_trace_processing.filter.reconstruction;
 
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -20,6 +21,7 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 	private final long maxTraceTimeout;
 
 	private final Map<Long, TraceReconstructionBuffer> traceId2trace = new ConcurrentSkipListMap<Long, TraceReconstructionBuffer>();
+	private final LinkedList<TraceReconstructionBuffer> freeBufferCache = new LinkedList<TraceReconstructionBuffer>();
 
 	public TraceReconstructionFilter(final long maxTraceTimeout,
 			final ITraceReduction traceReduction) {
@@ -33,13 +35,15 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 		if (record instanceof AbstractEventRecord) {
 			final AbstractEventRecord abstractOperationEvent = ((AbstractEventRecord) record);
 
-			final long traceId = abstractOperationEvent.getTraceId();
+			final Long traceId = abstractOperationEvent.getTraceId();
 			final TraceReconstructionBuffer traceBuffer = getBufferForTraceId(abstractOperationEvent
 					.getTraceId());
 			traceBuffer.insertEvent(abstractOperationEvent);
 
 			if (traceBuffer.isFinished()) {
 				traceId2trace.remove(traceId);
+				traceBuffer.clear();
+				freeBufferCache.addLast(traceBuffer);
 				deliver(traceBuffer.toTrace(true));
 			}
 		} else if (record instanceof Trace) {
@@ -64,7 +68,11 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 	private final TraceReconstructionBuffer getBufferForTraceId(final long traceId) {
 		TraceReconstructionBuffer traceBuffer = traceId2trace.get(traceId);
 		if (traceBuffer == null) {
-			traceBuffer = new TraceReconstructionBuffer();
+			if (freeBufferCache.isEmpty()) {
+				traceBuffer = new TraceReconstructionBuffer();
+			} else {
+				traceBuffer = freeBufferCache.removeFirst();
+			}
 			traceId2trace.put(traceId, traceBuffer);
 		}
 		return traceBuffer;
@@ -84,6 +92,8 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 				if ((timestamp - traceBuffer.getLastBufferInsert()) <= traceTimeout) {
 					deliver(traceBuffer.toTrace(false));
 					traceIdsToRemove.add(entry.getKey());
+					traceBuffer.clear();
+					freeBufferCache.addLast(traceBuffer);
 				}
 			}
 		}
diff --git a/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java b/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java
index 6683064f919c951f22771d9201214c861df47545..90b0fbed77f77d200e3298df6071cd7ea4278cde 100644
--- a/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java
+++ b/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java
@@ -22,6 +22,8 @@ public class TracePatternSummarizationFilter extends AbstractFilter implements I
 	private final Map<Trace, TracePatternSummarizationBuffer> trace2buffer = new ConcurrentSkipListMap<Trace, TracePatternSummarizationBuffer>(
 			new TraceComperator());
 
+	// TODO cache for buffer objects
+
 	public TracePatternSummarizationFilter(final long maxCollectionDuration,
 			final IPipeReceiver sinkReceiver) {
 		super(sinkReceiver, Constants.TRACE_SUMMARIZATION_DISRUPTOR_SIZE,