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;
+ }
+
+}