diff --git a/src/main/java/teetime/framework/pipe/measurements/ActivationEntry.java b/src/main/java/teetime/framework/pipe/measurements/ActivationEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..802c6194e2cc9b583b954ac319a662c51b4d4aea
--- /dev/null
+++ b/src/main/java/teetime/framework/pipe/measurements/ActivationEntry.java
@@ -0,0 +1,35 @@
+/**
+ *
+ */
+package teetime.framework.pipe.measurements;
+
+import teetime.framework.AbstractStage;
+
+/**
+ * @author marc
+ *
+ */
+public class ActivationEntry {
+	private final AbstractStage stage;
+	private final long startTime;
+	private final long endTime;
+
+	public ActivationEntry(final AbstractStage stage, final long startTime, final long endTime) {
+		this.stage = stage;
+		this.startTime = startTime;
+		this.endTime = endTime;
+	}
+
+	public AbstractStage getStage() {
+		return stage;
+	}
+
+	public long getStartTime() {
+		return startTime;
+	}
+
+	public long getEndTime() {
+		return endTime;
+	}
+
+}
diff --git a/src/main/java/teetime/framework/pipe/measurements/DeactivationEntry.java b/src/main/java/teetime/framework/pipe/measurements/DeactivationEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..c420d3806fde9cde2c103db058c001815b6f6ea4
--- /dev/null
+++ b/src/main/java/teetime/framework/pipe/measurements/DeactivationEntry.java
@@ -0,0 +1,34 @@
+package teetime.framework.pipe.measurements;
+
+import teetime.framework.AbstractStage;
+
+public class DeactivationEntry {
+	private final AbstractStage stage;
+	private final long startTime;
+	private final long threadTerminationTime;
+	private final long endTime;
+
+	public DeactivationEntry(final AbstractStage stage, final long startTime, final long threadTerminationTime, final long endTime) {
+		this.stage = stage;
+		this.startTime = startTime;
+		this.threadTerminationTime = threadTerminationTime;
+		this.endTime = endTime;
+	}
+
+	public AbstractStage getStage() {
+		return stage;
+	}
+
+	public long getStartTime() {
+		return startTime;
+	}
+
+	public long getThreadTerminationTime() {
+		return threadTerminationTime;
+	}
+
+	public long getEndTime() {
+		return endTime;
+	}
+
+}
diff --git a/src/main/java/teetime/framework/pipe/measurements/MeasureCollection.java b/src/main/java/teetime/framework/pipe/measurements/MeasureCollection.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd0844cba6e189c70697e88f57b70b18b4f91483
--- /dev/null
+++ b/src/main/java/teetime/framework/pipe/measurements/MeasureCollection.java
@@ -0,0 +1,102 @@
+/**
+ *
+ */
+package teetime.framework.pipe.measurements;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import teetime.framework.AbstractStage;
+
+/**
+ * @author marc
+ *
+ */
+public class MeasureCollection {
+
+	private static final MeasureCollection singleton = new MeasureCollection();
+	private final Map<AbstractStage, List<ActivationEntry>> activationEntries = new HashMap<AbstractStage, List<ActivationEntry>>();
+	private final Map<AbstractStage, List<DeactivationEntry>> deactivationEntries = new HashMap<AbstractStage, List<DeactivationEntry>>();
+
+	public static synchronized MeasureCollection getCollection() {
+		return singleton;
+	}
+
+	public void addDeactivationEntry(final DeactivationEntry deactivationEntry) {
+		AbstractStage stage = deactivationEntry.getStage();
+		List<DeactivationEntry> entryList = deactivationEntries.get(stage);
+		if (entryList == null) {
+			entryList = new LinkedList<DeactivationEntry>();
+		}
+
+		entryList.add(deactivationEntry);
+		deactivationEntries.put(stage, entryList);
+
+	}
+
+	public void addActivationEntry(final ActivationEntry activationEntry) {
+		AbstractStage stage = activationEntry.getStage();
+		List<ActivationEntry> entryList = activationEntries.get(stage);
+		if (entryList == null) {
+			entryList = new LinkedList<ActivationEntry>();
+		}
+
+		entryList.add(activationEntry);
+		activationEntries.put(stage, entryList);
+
+	}
+
+	public long averageActivationTime() {
+		long result = 0;
+		long count = 0;
+		for (AbstractStage stage : activationEntries.keySet()) {
+			for (ActivationEntry entry : activationEntries.get(stage)) {
+				result += entry.getEndTime() - entry.getStartTime();
+				count++;
+			}
+		}
+
+		if (count != 0) {
+			result = result / count;
+		}
+
+		return result;
+	}
+
+	public long averageDeactivationTime() {
+		long result = 0;
+		long count = 0;
+		for (AbstractStage stage : deactivationEntries.keySet()) {
+			for (DeactivationEntry entry : deactivationEntries.get(stage)) {
+				result += entry.getEndTime() - entry.getStartTime();
+				count++;
+			}
+		}
+
+		if (count != 0) {
+			result = result / count;
+		}
+
+		return result;
+	}
+
+	public long averageThreadStopTime() {
+		long result = 0;
+		long count = 0;
+		for (AbstractStage stage : deactivationEntries.keySet()) {
+			for (DeactivationEntry entry : deactivationEntries.get(stage)) {
+				result += entry.getEndTime() - entry.getThreadTerminationTime();
+				count++;
+			}
+		}
+
+		if (count != 0) {
+			result = result / count;
+		}
+
+		return result;
+	}
+
+}