diff --git a/src/main/java/kieker/gui/common/AbstractProxyDataModel.java b/src/main/java/kieker/gui/common/AbstractDataModelProxy.java
similarity index 78%
rename from src/main/java/kieker/gui/common/AbstractProxyDataModel.java
rename to src/main/java/kieker/gui/common/AbstractDataModelProxy.java
index 73185a1142befbc5832e61429605822fc0299c7b..cbbcc5b32e43fbfc0d9ad1c5b4009a240e70907e 100644
--- a/src/main/java/kieker/gui/common/AbstractProxyDataModel.java
+++ b/src/main/java/kieker/gui/common/AbstractDataModelProxy.java
@@ -3,11 +3,11 @@ package kieker.gui.common;
 import java.util.Observable;
 import java.util.Observer;
 
-public abstract class AbstractProxyDataModel<T> extends Observable implements IModel<T>, Observer {
+public abstract class AbstractDataModelProxy<T> extends Observable implements IModel<T>, Observer {
 
 	protected final DataModel dataModel;
 
-	public AbstractProxyDataModel(final DataModel dataModel) {
+	public AbstractDataModelProxy(final DataModel dataModel) {
 		this.dataModel = dataModel;
 		this.dataModel.addObserver(this);
 	}
diff --git a/src/main/java/kieker/gui/subview/aggregatedtraces/AbstractAggregatedTracesController.java b/src/main/java/kieker/gui/subview/aggregatedtraces/AbstractAggregatedTracesController.java
new file mode 100644
index 0000000000000000000000000000000000000000..41f5a7ca16f13e863dc14f11a83feb00eb5de424
--- /dev/null
+++ b/src/main/java/kieker/gui/subview/aggregatedtraces/AbstractAggregatedTracesController.java
@@ -0,0 +1,42 @@
+package kieker.gui.subview.aggregatedtraces;
+
+import kieker.gui.common.DataModel;
+import kieker.gui.common.IModel;
+import kieker.gui.common.ISubController;
+import kieker.gui.common.ISubView;
+import kieker.gui.common.PropertiesModel;
+import kieker.gui.common.domain.AggregatedExecution;
+
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+
+public abstract class AbstractAggregatedTracesController implements ISubController, SelectionListener {
+
+	private final ISubView view;
+	private final AggregatedTracesSubViewModel model;
+
+	public AbstractAggregatedTracesController(final DataModel dataModel, final PropertiesModel propertiesModel) {
+		final IModel<AggregatedExecution> modelProxy = this.createModelProxy(dataModel);
+		this.model = new AggregatedTracesSubViewModel();
+
+		this.view = new AggregatedTracesSubView(modelProxy, this.model, propertiesModel, this);
+	}
+
+	@Override
+	public ISubView getView() {
+		return this.view;
+	}
+
+	@Override
+	public void widgetSelected(final SelectionEvent e) {
+		if (e.item.getData() instanceof AggregatedExecution) {
+			this.model.setCurrentActiveTrace((AggregatedExecution) e.item.getData());
+		}
+	}
+
+	@Override
+	public void widgetDefaultSelected(final SelectionEvent e) {}
+
+	protected abstract IModel<AggregatedExecution> createModelProxy(final DataModel dataModel);
+
+}
diff --git a/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedFailedTracesSubViewController.java b/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedFailedTracesSubViewController.java
index 56f6a417668b6d28029ab5e357798936c51202f1..4dc1e290c9c8af91a104df587b27ad9c468a73ff 100644
--- a/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedFailedTracesSubViewController.java
+++ b/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedFailedTracesSubViewController.java
@@ -18,51 +18,39 @@ package kieker.gui.subview.aggregatedtraces;
 
 import java.util.List;
 
-import kieker.gui.common.AbstractProxyDataModel;
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
-import kieker.gui.common.ISubController;
-import kieker.gui.common.ISubView;
+import kieker.gui.common.IModel;
 import kieker.gui.common.PropertiesModel;
 import kieker.gui.common.domain.AggregatedExecution;
 
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-
 /**
  * The sub-controller responsible for the sub-view presenting the available aggregated traces.
  *
  * @author Nils Christian Ehmke
  */
-public final class AggregatedFailedTracesSubViewController implements SelectionListener, ISubController {
-
-	private final ISubView view;
-	private final AggregatedTracesSubViewModel model;
+public final class AggregatedFailedTracesSubViewController extends AbstractAggregatedTracesController {
 
 	public AggregatedFailedTracesSubViewController(final DataModel dataModel, final PropertiesModel propertiesModel) {
-		this.model = new AggregatedTracesSubViewModel();
-		this.view = new AggregatedTracesSubView(new AbstractProxyDataModel<AggregatedExecution>(dataModel) {
-
-			@Override
-			public List<AggregatedExecution> getContent() {
-				return super.dataModel.getFailedAggregatedTracesCopy();
-			}
-
-		}, this.model, propertiesModel, this);
+		super(dataModel, propertiesModel);
 	}
 
 	@Override
-	public ISubView getView() {
-		return this.view;
+	protected IModel<AggregatedExecution> createModelProxy(final DataModel dataModel) {
+		return new ModelProxy(dataModel);
 	}
 
-	@Override
-	public void widgetSelected(final SelectionEvent e) {
-		if (e.item.getData() instanceof AggregatedExecution) {
-			this.model.setCurrentActiveTrace((AggregatedExecution) e.item.getData());
+	private final class ModelProxy extends AbstractDataModelProxy<AggregatedExecution> {
+
+		private ModelProxy(final DataModel dataModel) {
+			super(dataModel);
 		}
-	}
 
-	@Override
-	public void widgetDefaultSelected(final SelectionEvent e) {}
+		@Override
+		public List<AggregatedExecution> getContent() {
+			return super.dataModel.getFailedAggregatedTracesCopy();
+		}
+
+	}
 
 }
diff --git a/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedTracesSubViewController.java b/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedTracesSubViewController.java
index 6a1e55a85e5d59f5a3478c5d8c9baf8303acaa12..a430026506406c3af3c68a3f8c7fb415954c6ed3 100644
--- a/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedTracesSubViewController.java
+++ b/src/main/java/kieker/gui/subview/aggregatedtraces/AggregatedTracesSubViewController.java
@@ -18,50 +18,44 @@ package kieker.gui.subview.aggregatedtraces;
 
 import java.util.List;
 
-import kieker.gui.common.AbstractProxyDataModel;
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
-import kieker.gui.common.ISubController;
-import kieker.gui.common.ISubView;
+import kieker.gui.common.IModel;
 import kieker.gui.common.PropertiesModel;
 import kieker.gui.common.domain.AggregatedExecution;
 
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 
 /**
  * The sub-controller responsible for the sub-view presenting the available aggregated traces.
  *
  * @author Nils Christian Ehmke
  */
-public final class AggregatedTracesSubViewController implements SelectionListener, ISubController {
-
-	private final ISubView view;
-	private final AggregatedTracesSubViewModel model;
+public final class AggregatedTracesSubViewController extends AbstractAggregatedTracesController {
 
 	public AggregatedTracesSubViewController(final DataModel dataModel, final PropertiesModel propertiesModel) {
-		this.model = new AggregatedTracesSubViewModel();
-		this.view = new AggregatedTracesSubView(new AbstractProxyDataModel<AggregatedExecution>(dataModel) {
-
-			@Override
-			public List<AggregatedExecution> getContent() {
-				return super.dataModel.getAggregatedTracesCopy();
-			}
-		}, this.model, propertiesModel, this);
+		super(dataModel, propertiesModel);
 	}
 
 	@Override
-	public ISubView getView() {
-		return this.view;
+	protected IModel<AggregatedExecution> createModelProxy(final DataModel dataModel) {
+		return new ModelProxy(dataModel);
 	}
 
 	@Override
-	public void widgetSelected(final SelectionEvent e) {
-		if (e.item.getData() instanceof AggregatedExecution) {
-			this.model.setCurrentActiveTrace((AggregatedExecution) e.item.getData());
+	public void widgetDefaultSelected(final SelectionEvent e) {}
+
+	private final class ModelProxy extends AbstractDataModelProxy<AggregatedExecution> {
+
+		private ModelProxy(final DataModel dataModel) {
+			super(dataModel);
 		}
-	}
 
-	@Override
-	public void widgetDefaultSelected(final SelectionEvent e) {}
+		@Override
+		public List<AggregatedExecution> getContent() {
+			return super.dataModel.getAggregatedTracesCopy();
+		}
+
+	}
 
 }
diff --git a/src/main/java/kieker/gui/subview/aggregatedtraces/FailureContainingAggregatedTracesSubViewController.java b/src/main/java/kieker/gui/subview/aggregatedtraces/FailureContainingAggregatedTracesSubViewController.java
index 5ca5406bbc48168d1fa6a2fab1cc75f299d4c3e3..6f05223865882ebee1470306b8ccd68d60c660e4 100644
--- a/src/main/java/kieker/gui/subview/aggregatedtraces/FailureContainingAggregatedTracesSubViewController.java
+++ b/src/main/java/kieker/gui/subview/aggregatedtraces/FailureContainingAggregatedTracesSubViewController.java
@@ -18,50 +18,39 @@ package kieker.gui.subview.aggregatedtraces;
 
 import java.util.List;
 
-import kieker.gui.common.AbstractProxyDataModel;
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
-import kieker.gui.common.ISubController;
-import kieker.gui.common.ISubView;
+import kieker.gui.common.IModel;
 import kieker.gui.common.PropertiesModel;
 import kieker.gui.common.domain.AggregatedExecution;
 
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-
 /**
  * The sub-controller responsible for the sub-view presenting the available aggregated traces.
  *
  * @author Nils Christian Ehmke
  */
-public final class FailureContainingAggregatedTracesSubViewController implements SelectionListener, ISubController {
-
-	private final ISubView view;
-	private final AggregatedTracesSubViewModel model;
+public final class FailureContainingAggregatedTracesSubViewController extends AbstractAggregatedTracesController {
 
 	public FailureContainingAggregatedTracesSubViewController(final DataModel dataModel, final PropertiesModel propertiesModel) {
-		this.model = new AggregatedTracesSubViewModel();
-		this.view = new AggregatedTracesSubView(new AbstractProxyDataModel<AggregatedExecution>(dataModel) {
-
-			@Override
-			public List<AggregatedExecution> getContent() {
-				return super.dataModel.getFailureContainingAggregatedTracesCopy();
-			}
-		}, this.model, propertiesModel, this);
+		super(dataModel, propertiesModel);
 	}
 
 	@Override
-	public ISubView getView() {
-		return this.view;
+	protected IModel<AggregatedExecution> createModelProxy(final DataModel dataModel) {
+		return new ModelProxy(dataModel);
 	}
 
-	@Override
-	public void widgetSelected(final SelectionEvent e) {
-		if (e.item.getData() instanceof AggregatedExecution) {
-			this.model.setCurrentActiveTrace((AggregatedExecution) e.item.getData());
+	private final class ModelProxy extends AbstractDataModelProxy<AggregatedExecution> {
+
+		private ModelProxy(final DataModel dataModel) {
+			super(dataModel);
 		}
-	}
 
-	@Override
-	public void widgetDefaultSelected(final SelectionEvent e) {}
+		@Override
+		public List<AggregatedExecution> getContent() {
+			return super.dataModel.getFailureContainingAggregatedTracesCopy();
+		}
+
+	}
 
 }
diff --git a/src/main/java/kieker/gui/subview/records/RecordsSubView.java b/src/main/java/kieker/gui/subview/records/RecordsSubView.java
index f8ff2535e40279117476c82d0ae967f880f7bb72..5c6ce782563cd09916c9561c92f21d4a04149fe1 100644
--- a/src/main/java/kieker/gui/subview/records/RecordsSubView.java
+++ b/src/main/java/kieker/gui/subview/records/RecordsSubView.java
@@ -20,7 +20,7 @@ import java.util.List;
 import java.util.Observable;
 import java.util.Observer;
 
-import kieker.gui.common.DataModel;
+import kieker.gui.common.IModel;
 import kieker.gui.common.ISubView;
 import kieker.gui.common.TableColumnSortListener;
 import kieker.gui.common.domain.Record;
@@ -39,11 +39,11 @@ import org.eclipse.swt.widgets.TableItem;
 
 public final class RecordsSubView implements Observer, ISubView {
 
-	private final DataModel model;
+	private final IModel<Record> model;
 	private Composite composite;
 	private Table table;
 
-	public RecordsSubView(final DataModel model, final RecordsSubViewController controller) {
+	public RecordsSubView(final IModel<Record> model, final RecordsSubViewController controller) {
 		this.model = model;
 
 		model.addObserver(this);
@@ -102,7 +102,7 @@ public final class RecordsSubView implements Observer, ISubView {
 	}
 
 	private void updateTable() {
-		final List<Record> records = this.model.getRecordsCopy();
+		final List<Record> records = this.model.getContent();
 
 		this.table.setData(records);
 		this.table.setItemCount(records.size());
diff --git a/src/main/java/kieker/gui/subview/records/RecordsSubViewController.java b/src/main/java/kieker/gui/subview/records/RecordsSubViewController.java
index a96643928d8a68e9400605c48ee13977e048d487..8181f62071a2fa9efeb80d975f73575c752fdeff 100644
--- a/src/main/java/kieker/gui/subview/records/RecordsSubViewController.java
+++ b/src/main/java/kieker/gui/subview/records/RecordsSubViewController.java
@@ -16,9 +16,14 @@
 
 package kieker.gui.subview.records;
 
+import java.util.List;
+
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
+import kieker.gui.common.IModel;
 import kieker.gui.common.ISubController;
 import kieker.gui.common.ISubView;
+import kieker.gui.common.domain.Record;
 
 /**
  * The sub-controller responsible for the sub-view presenting the available records.
@@ -30,7 +35,9 @@ public final class RecordsSubViewController implements ISubController {
 	private final ISubView view;
 
 	public RecordsSubViewController(final DataModel dataModel) {
-		this.view = new RecordsSubView(dataModel, this);
+		final IModel<Record> modelProxy = new RecordsModelProxy(dataModel);
+
+		this.view = new RecordsSubView(modelProxy, this);
 	}
 
 	@Override
@@ -38,4 +45,16 @@ public final class RecordsSubViewController implements ISubController {
 		return this.view;
 	}
 
+	private final class RecordsModelProxy extends AbstractDataModelProxy<Record> {
+
+		private RecordsModelProxy(final DataModel dataModel) {
+			super(dataModel);
+		}
+
+		@Override
+		public List<Record> getContent() {
+			return super.dataModel.getRecordsCopy();
+		}
+	}
+
 }
diff --git a/src/main/java/kieker/gui/subview/traces/FailedTracesSubViewController.java b/src/main/java/kieker/gui/subview/traces/FailedTracesSubViewController.java
index befa9cf5773c5cdf86c1a5dfba70a6c91ace7d09..c9c2e731f6b0791d3699427f1b88acb1264e2183 100644
--- a/src/main/java/kieker/gui/subview/traces/FailedTracesSubViewController.java
+++ b/src/main/java/kieker/gui/subview/traces/FailedTracesSubViewController.java
@@ -18,7 +18,7 @@ package kieker.gui.subview.traces;
 
 import java.util.List;
 
-import kieker.gui.common.AbstractProxyDataModel;
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
 import kieker.gui.common.ISubController;
 import kieker.gui.common.ISubView;
@@ -40,7 +40,7 @@ public final class FailedTracesSubViewController implements SelectionListener, I
 
 	public FailedTracesSubViewController(final DataModel dataModel, final PropertiesModel propertiesModel) {
 		this.model = new TracesSubViewModel();
-		this.view = new TracesSubView(new AbstractProxyDataModel<Execution>(dataModel) {
+		this.view = new TracesSubView(new AbstractDataModelProxy<Execution>(dataModel) {
 
 			@Override
 			public final List<Execution> getContent() {
diff --git a/src/main/java/kieker/gui/subview/traces/FailureContainingTracesSubViewController.java b/src/main/java/kieker/gui/subview/traces/FailureContainingTracesSubViewController.java
index 09d08d1e77b6ac2214c140205fc50fec874bd7c3..d336021fd31998d7e1bd4b01a50e88e4b47499ba 100644
--- a/src/main/java/kieker/gui/subview/traces/FailureContainingTracesSubViewController.java
+++ b/src/main/java/kieker/gui/subview/traces/FailureContainingTracesSubViewController.java
@@ -18,7 +18,7 @@ package kieker.gui.subview.traces;
 
 import java.util.List;
 
-import kieker.gui.common.AbstractProxyDataModel;
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
 import kieker.gui.common.ISubController;
 import kieker.gui.common.ISubView;
@@ -40,7 +40,7 @@ public final class FailureContainingTracesSubViewController implements Selection
 
 	public FailureContainingTracesSubViewController(final DataModel dataModel, final PropertiesModel propertiesModel) {
 		this.model = new TracesSubViewModel();
-		this.view = new TracesSubView(new AbstractProxyDataModel<Execution>(dataModel) {
+		this.view = new TracesSubView(new AbstractDataModelProxy<Execution>(dataModel) {
 
 			@Override
 			public final List<Execution> getContent() {
diff --git a/src/main/java/kieker/gui/subview/traces/TracesSubViewController.java b/src/main/java/kieker/gui/subview/traces/TracesSubViewController.java
index ed8d6b7ec7543e06fe8db342db28c840b98e4585..299f97d3ba3bb9759b4251dd1e68094b61a5e339 100644
--- a/src/main/java/kieker/gui/subview/traces/TracesSubViewController.java
+++ b/src/main/java/kieker/gui/subview/traces/TracesSubViewController.java
@@ -18,7 +18,7 @@ package kieker.gui.subview.traces;
 
 import java.util.List;
 
-import kieker.gui.common.AbstractProxyDataModel;
+import kieker.gui.common.AbstractDataModelProxy;
 import kieker.gui.common.DataModel;
 import kieker.gui.common.ISubController;
 import kieker.gui.common.ISubView;
@@ -40,7 +40,7 @@ public final class TracesSubViewController implements SelectionListener, ISubCon
 
 	public TracesSubViewController(final DataModel dataModel, final PropertiesModel propertiesModel) {
 		this.model = new TracesSubViewModel();
-		this.view = new TracesSubView(new AbstractProxyDataModel<Execution>(dataModel) {
+		this.view = new TracesSubView(new AbstractDataModelProxy<Execution>(dataModel) {
 
 			@Override
 			public final List<Execution> getContent() {