From 9830b72abdef4d5813543c693bd999f2f6d1c672 Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nils@rhocas.de>
Date: Sat, 21 Nov 2015 22:52:57 +0100
Subject: [PATCH] Refactoring

---
 .../components/DurationTableCellFactory.java  | 63 -----------------
 .../components/DurationTreeCellFactory.java   | 63 -----------------
 .../components/FailedTreeCellFactory.java     | 68 -------------------
 .../components/PercentTreeCellFactory.java    | 61 -----------------
 .../components/ThresholdStringConverter.java  | 55 ---------------
 .../components/TimestampStringConverter.java  | 46 -------------
 .../components/TimestampTableCellFactory.java | 66 ------------------
 .../converter/AbstractStringConverter.java    | 51 ++++++++++++++
 .../ComponentNamesStringConverter.java        | 29 +++-----
 .../OperationNamesStringConverter.java        | 25 ++-----
 .../converter/ThresholdStringConverter.java   | 39 +++++++++++
 .../TimeUnitStringConverter.java              | 39 +++--------
 .../TimestampTypesStringConverter.java        | 35 ++++++++++
 .../AbstractTableCellFactory.java}            | 15 ++--
 .../ComponentCellValueFactory.java            |  2 +-
 .../{ => table}/DurationCellValueFactory.java |  2 +-
 .../table/DurationTableCellFactory.java       | 32 +++++++++
 .../table/FailedTableCellFactory.java         | 29 ++++++++
 .../OperationCellValueFactory.java            |  3 +-
 .../table/TimestampTableCellFactory.java      | 29 ++++++++
 .../AbstractLazyOperationCallTreeItem.java    |  2 +-
 .../AbstractTreeTableCellFactory.java}        | 10 +--
 .../ComponentTreeCellValueFactory.java        |  2 +-
 .../treetable/DurationTreeCellFactory.java    | 32 +++++++++
 .../DurationTreeCellValueFactory.java         |  2 +-
 .../treetable/FailedTreeCellFactory.java      | 29 ++++++++
 .../LazyAggregatedOperationCallTreeItem.java  |  2 +-
 .../LazyOperationCallTreeItem.java            |  2 +-
 .../OperationTreeCellValueFactory.java        |  2 +-
 .../treetable/PercentTreeCellFactory.java     | 29 ++++++++
 .../TimestampTreeTableCellFactory.java        | 29 ++++++++
 .../AggregatedTracesViewController.java       |  2 +-
 .../traces/TracesViewController.java          |  2 +-
 .../aggregatedcalls/AggregatedCallsView.fxml  | 33 ++++-----
 .../AggregatedTracesView.fxml                 | 37 +++++-----
 .../diagnosis/view/calls/CallsView.fxml       | 19 +++---
 .../view/settings/SettingsDialogView.fxml     | 11 +--
 .../diagnosis/view/traces/TracesView.fxml     | 25 +++----
 38 files changed, 450 insertions(+), 572 deletions(-)
 delete mode 100644 src/main/java/kieker/diagnosis/components/DurationTableCellFactory.java
 delete mode 100644 src/main/java/kieker/diagnosis/components/DurationTreeCellFactory.java
 delete mode 100644 src/main/java/kieker/diagnosis/components/FailedTreeCellFactory.java
 delete mode 100644 src/main/java/kieker/diagnosis/components/PercentTreeCellFactory.java
 delete mode 100644 src/main/java/kieker/diagnosis/components/ThresholdStringConverter.java
 delete mode 100644 src/main/java/kieker/diagnosis/components/TimestampStringConverter.java
 delete mode 100644 src/main/java/kieker/diagnosis/components/TimestampTableCellFactory.java
 create mode 100644 src/main/java/kieker/diagnosis/components/converter/AbstractStringConverter.java
 rename src/main/java/kieker/diagnosis/components/{ => converter}/ComponentNamesStringConverter.java (54%)
 rename src/main/java/kieker/diagnosis/components/{ => converter}/OperationNamesStringConverter.java (53%)
 create mode 100644 src/main/java/kieker/diagnosis/components/converter/ThresholdStringConverter.java
 rename src/main/java/kieker/diagnosis/components/{ => converter}/TimeUnitStringConverter.java (52%)
 create mode 100644 src/main/java/kieker/diagnosis/components/converter/TimestampTypesStringConverter.java
 rename src/main/java/kieker/diagnosis/components/{FailedTableCellFactory.java => table/AbstractTableCellFactory.java} (88%)
 rename src/main/java/kieker/diagnosis/components/{ => table}/ComponentCellValueFactory.java (98%)
 rename src/main/java/kieker/diagnosis/components/{ => table}/DurationCellValueFactory.java (98%)
 create mode 100644 src/main/java/kieker/diagnosis/components/table/DurationTableCellFactory.java
 create mode 100644 src/main/java/kieker/diagnosis/components/table/FailedTableCellFactory.java
 rename src/main/java/kieker/diagnosis/components/{ => table}/OperationCellValueFactory.java (95%)
 create mode 100644 src/main/java/kieker/diagnosis/components/table/TimestampTableCellFactory.java
 rename src/main/java/kieker/diagnosis/components/{ => treetable}/AbstractLazyOperationCallTreeItem.java (97%)
 rename src/main/java/kieker/diagnosis/components/{TimestampTreeTableCellFactory.java => treetable/AbstractTreeTableCellFactory.java} (84%)
 rename src/main/java/kieker/diagnosis/components/{ => treetable}/ComponentTreeCellValueFactory.java (98%)
 create mode 100644 src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellFactory.java
 rename src/main/java/kieker/diagnosis/components/{ => treetable}/DurationTreeCellValueFactory.java (98%)
 create mode 100644 src/main/java/kieker/diagnosis/components/treetable/FailedTreeCellFactory.java
 rename src/main/java/kieker/diagnosis/components/{ => treetable}/LazyAggregatedOperationCallTreeItem.java (96%)
 rename src/main/java/kieker/diagnosis/components/{ => treetable}/LazyOperationCallTreeItem.java (98%)
 rename src/main/java/kieker/diagnosis/components/{ => treetable}/OperationTreeCellValueFactory.java (98%)
 create mode 100644 src/main/java/kieker/diagnosis/components/treetable/PercentTreeCellFactory.java
 create mode 100644 src/main/java/kieker/diagnosis/components/treetable/TimestampTreeTableCellFactory.java

diff --git a/src/main/java/kieker/diagnosis/components/DurationTableCellFactory.java b/src/main/java/kieker/diagnosis/components/DurationTableCellFactory.java
deleted file mode 100644
index 90eb07db..00000000
--- a/src/main/java/kieker/diagnosis/components/DurationTableCellFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import javafx.scene.control.TableCell;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableRow;
-import javafx.util.Callback;
-import kieker.diagnosis.domain.AbstractOperationCall;
-import kieker.diagnosis.model.PropertiesModel;
-import kieker.diagnosis.util.NameConverter;
-
-/**
- * @author Nils Christian Ehmke
- */
-public final class DurationTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
-
-	@Override
-	public TableCell<S, T> call(final TableColumn<S, T> p) {
-		final TableCell<S, T> cell = new TableCell<S, T>() {
-			@SuppressWarnings("unchecked")
-			@Override
-			protected void updateItem(final Object item, final boolean empty) {
-				final TableRow<?> currentRow = this.getTableRow();
-				if (currentRow != null) {
-					final Object rowItem = currentRow.getItem();
-
-					this.getStyleClass().remove("failed");
-					if ((rowItem != null) && AbstractOperationCall.class.isAssignableFrom(rowItem.getClass())) {
-						if (((AbstractOperationCall<?>) rowItem).isFailed()) {
-							this.getStyleClass().add("failed");
-						}
-					}
-				}
-
-				super.updateItem((T) item, empty);
-
-				if (item != null) {
-					this.setText(item.toString() + " " + NameConverter.toShortTimeUnit(PropertiesModel.getInstance().getTimeUnit()));
-				} else {
-					this.setText("");
-				}
-			}
-		};
-
-		return cell;
-
-	}
-}
diff --git a/src/main/java/kieker/diagnosis/components/DurationTreeCellFactory.java b/src/main/java/kieker/diagnosis/components/DurationTreeCellFactory.java
deleted file mode 100644
index b64cf0e2..00000000
--- a/src/main/java/kieker/diagnosis/components/DurationTreeCellFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import javafx.scene.control.TreeTableCell;
-import javafx.scene.control.TreeTableColumn;
-import javafx.scene.control.TreeTableRow;
-import javafx.util.Callback;
-import kieker.diagnosis.domain.AbstractOperationCall;
-import kieker.diagnosis.model.PropertiesModel;
-import kieker.diagnosis.util.NameConverter;
-
-/**
- * @author Nils Christian Ehmke
- */
-public final class DurationTreeCellFactory<S, T> implements Callback<TreeTableColumn<S, T>, TreeTableCell<S, T>> {
-
-	@Override
-	public TreeTableCell<S, T> call(final TreeTableColumn<S, T> p) {
-		final TreeTableCell<S, T> cell = new TreeTableCell<S, T>() {
-			@SuppressWarnings("unchecked")
-			@Override
-			protected void updateItem(final Object item, final boolean empty) {
-				final TreeTableRow<?> currentRow = this.getTreeTableRow();
-				if (currentRow != null) {
-					final Object rowItem = currentRow.getItem();
-
-					this.getStyleClass().remove("failed");
-					if ((rowItem != null) && AbstractOperationCall.class.isAssignableFrom(rowItem.getClass())) {
-						if (((AbstractOperationCall<?>) rowItem).isFailed()) {
-							this.getStyleClass().add("failed");
-						}
-					}
-				}
-
-				super.updateItem((T) item, empty);
-
-				if (item != null) {
-					this.setText(item.toString() + " " + NameConverter.toShortTimeUnit(PropertiesModel.getInstance().getTimeUnit()));
-				} else {
-					this.setText("");
-				}
-			}
-		};
-
-		return cell;
-
-	}
-}
diff --git a/src/main/java/kieker/diagnosis/components/FailedTreeCellFactory.java b/src/main/java/kieker/diagnosis/components/FailedTreeCellFactory.java
deleted file mode 100644
index b9c9d7b2..00000000
--- a/src/main/java/kieker/diagnosis/components/FailedTreeCellFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import javafx.scene.control.TreeTableCell;
-import javafx.scene.control.TreeTableColumn;
-import javafx.scene.control.TreeTableRow;
-import javafx.util.Callback;
-import kieker.diagnosis.domain.AbstractOperationCall;
-
-/**
- * @author Nils Christian Ehmke
- */
-public final class FailedTreeCellFactory<S, T> implements Callback<TreeTableColumn<S, T>, TreeTableCell<S, T>> {
-
-	@Override
-	public TreeTableCell<S, T> call(final TreeTableColumn<S, T> p) {
-		return new FailedTreeCell();
-	}
-
-	private final class FailedTreeCell extends TreeTableCell<S, T> {
-
-		@Override
-		protected void updateItem(final T item, final boolean empty) {
-			setFailedStyle();
-
-			super.updateItem(item, empty);
-
-			if (empty || item == null) {
-				setText(null);
-				setGraphic(null);
-			} else {
-				setText(item.toString());
-			}
-		}
-
-		private void setFailedStyle() {
-			final TreeTableRow<?> currentRow = this.getTreeTableRow();
-			
-			if (currentRow != null) {
-				final Object rowItem = currentRow.getItem();
-
-				super.getStyleClass().remove("failed");
-				if (rowItem instanceof AbstractOperationCall) {
-					if (((AbstractOperationCall<?>) rowItem).isFailed()) {
-						super.getStyleClass().add("failed");
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/src/main/java/kieker/diagnosis/components/PercentTreeCellFactory.java b/src/main/java/kieker/diagnosis/components/PercentTreeCellFactory.java
deleted file mode 100644
index 2aeab1eb..00000000
--- a/src/main/java/kieker/diagnosis/components/PercentTreeCellFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import javafx.scene.control.TreeTableCell;
-import javafx.scene.control.TreeTableColumn;
-import javafx.scene.control.TreeTableRow;
-import javafx.util.Callback;
-import kieker.diagnosis.domain.AbstractOperationCall;
-
-/**
- * @author Nils Christian Ehmke
- */
-public final class PercentTreeCellFactory<S, T> implements Callback<TreeTableColumn<S, T>, TreeTableCell<S, T>> {
-
-	@Override
-	public TreeTableCell<S, T> call(final TreeTableColumn<S, T> p) {
-		final TreeTableCell<S, T> cell = new TreeTableCell<S, T>() {
-			@SuppressWarnings("unchecked")
-			@Override
-			protected void updateItem(final Object item, final boolean empty) {
-				final TreeTableRow<?> currentRow = this.getTreeTableRow();
-				if (currentRow != null) {
-					final Object rowItem = currentRow.getItem();
-
-					this.getStyleClass().remove("failed");
-					if ((rowItem != null) && AbstractOperationCall.class.isAssignableFrom(rowItem.getClass())) {
-						if (((AbstractOperationCall<?>) rowItem).isFailed()) {
-							this.getStyleClass().add("failed");
-						}
-					}
-				}
-
-				super.updateItem((T) item, empty);
-
-				if (item != null) {
-					this.setText(item.toString() + " %");
-				} else {
-					this.setText("");
-				}
-			}
-		};
-
-		return cell;
-
-	}
-}
diff --git a/src/main/java/kieker/diagnosis/components/ThresholdStringConverter.java b/src/main/java/kieker/diagnosis/components/ThresholdStringConverter.java
deleted file mode 100644
index 84b71a70..00000000
--- a/src/main/java/kieker/diagnosis/components/ThresholdStringConverter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import javafx.util.StringConverter;
-import kieker.diagnosis.model.PropertiesModel.Threshold;
-import kieker.diagnosis.util.Mapper;
-
-public class ThresholdStringConverter extends StringConverter<Threshold> {
-
-	private static Mapper<Threshold, String> thresholdMapper;
-
-	static {
-		final String bundleBaseName = "locale.kieker.diagnosis.components.components";
-		final ResourceBundle resourceBundle = ResourceBundle.getBundle(bundleBaseName, Locale.getDefault());
-		final String threshold = resourceBundle.getString("threshold");
-
-		ThresholdStringConverter.thresholdMapper = new Mapper<>();
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_0_5).to(threshold + " < 0.5 %");
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_1).to(threshold + " < 1 %");
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_10).to(threshold + " < 10 %");
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_20).to(threshold + " < 20 %");
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_30).to(threshold + " < 30 %");
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_40).to(threshold + " < 40 %");
-		ThresholdStringConverter.thresholdMapper.map(Threshold.THRESHOLD_50).to(threshold + " < 50 %");
-	}
-
-	@Override
-	public Threshold fromString(final String string) {
-		return ThresholdStringConverter.thresholdMapper.invertedResolve(string);
-	}
-
-	@Override
-	public String toString(final Threshold object) {
-		return ThresholdStringConverter.thresholdMapper.resolve(object);
-	}
-
-}
diff --git a/src/main/java/kieker/diagnosis/components/TimestampStringConverter.java b/src/main/java/kieker/diagnosis/components/TimestampStringConverter.java
deleted file mode 100644
index fda214d9..00000000
--- a/src/main/java/kieker/diagnosis/components/TimestampStringConverter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import javafx.util.StringConverter;
-import kieker.diagnosis.model.PropertiesModel.TimestampTypes;
-import kieker.diagnosis.util.Mapper;
-
-public class TimestampStringConverter extends StringConverter<TimestampTypes> {
-
-	private static Mapper<TimestampTypes, String> mapper;
-	
-	static {
-		TimestampStringConverter.mapper = new Mapper<>();
-		TimestampStringConverter.mapper.map(TimestampTypes.TIMESTAMP).to("1418993603113900610");
-		TimestampStringConverter.mapper.map(TimestampTypes.DATE).to("19.12.14");
-		TimestampStringConverter.mapper.map(TimestampTypes.SHORT_TIME).to("13:53");
-		TimestampStringConverter.mapper.map(TimestampTypes.LONG_TIME).to("13:53:23");
-		TimestampStringConverter.mapper.map(TimestampTypes.DATE_AND_TIME).to("19.12.2014 13:53:23");
-	}
-
-	@Override
-	public TimestampTypes fromString(final String string) {
-		return TimestampStringConverter.mapper.invertedResolve(string);
-	}
-
-	@Override
-	public String toString(final TimestampTypes object) {
-		return TimestampStringConverter.mapper.resolve(object);
-	}
-
-}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/components/TimestampTableCellFactory.java b/src/main/java/kieker/diagnosis/components/TimestampTableCellFactory.java
deleted file mode 100644
index aee5ea8f..00000000
--- a/src/main/java/kieker/diagnosis/components/TimestampTableCellFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************
- * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.diagnosis.components;
-
-import javafx.scene.control.TableCell;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableRow;
-import javafx.util.Callback;
-import kieker.diagnosis.domain.AbstractOperationCall;
-import kieker.diagnosis.model.DataModel;
-import kieker.diagnosis.util.NameConverter;
-
-public class TimestampTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
-
-	@Override
-	public TableCell<S, T> call(final TableColumn<S, T> p) {
-		return new FailedTableCell();
-	}
-
-	private final class FailedTableCell extends TableCell<S, T> {
-
-		@Override
-		protected void updateItem(final T item, final boolean empty) {
-			setFailedStyle();
-
-			super.updateItem(item, empty);
-
-			if (empty || item == null) {
-				setText(null);
-				setGraphic(null);
-			} else {
-				setText(NameConverter.toTimestampString((Long) item, DataModel.getInstance().getTimeUnit()));
-			}
-		}
-
-		private void setFailedStyle() {
-			final TableRow<?> currentRow = super.getTableRow();
-
-			if (currentRow != null) {
-				final Object rowItem = currentRow.getItem();
-
-				super.getStyleClass().remove("failed");
-				if (rowItem instanceof AbstractOperationCall) {
-					if (((AbstractOperationCall<?>) rowItem).isFailed()) {
-						super.getStyleClass().add("failed");
-					}
-				}
-			}
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/components/converter/AbstractStringConverter.java b/src/main/java/kieker/diagnosis/components/converter/AbstractStringConverter.java
new file mode 100644
index 00000000..1069e8b9
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/converter/AbstractStringConverter.java
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.converter;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javafx.util.StringConverter;
+import kieker.diagnosis.util.Mapper;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public abstract class AbstractStringConverter<T> extends StringConverter<T> {
+	
+	private final Mapper<T, String> mapper = new Mapper<>();
+	
+	public AbstractStringConverter() {
+		final String bundleBaseName = "locale.kieker.diagnosis.components.components";
+		final ResourceBundle resourceBundle = ResourceBundle.getBundle(bundleBaseName, Locale.getDefault());
+		
+		this.fillMapper(mapper, resourceBundle); 
+	}
+	
+	protected abstract void fillMapper(final Mapper<T, String> mapper, final ResourceBundle resourceBundle);
+	
+	@Override
+	public T fromString(final String string) {
+		return this.mapper.invertedResolve(string);
+	}
+
+	@Override
+	public String toString(final T object) {
+		return this.mapper.resolve(object);
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/ComponentNamesStringConverter.java b/src/main/java/kieker/diagnosis/components/converter/ComponentNamesStringConverter.java
similarity index 54%
rename from src/main/java/kieker/diagnosis/components/ComponentNamesStringConverter.java
rename to src/main/java/kieker/diagnosis/components/converter/ComponentNamesStringConverter.java
index 36c61287..6fd4d079 100644
--- a/src/main/java/kieker/diagnosis/components/ComponentNamesStringConverter.java
+++ b/src/main/java/kieker/diagnosis/components/converter/ComponentNamesStringConverter.java
@@ -14,33 +14,22 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.converter;
+
+import java.util.ResourceBundle;
 
-import javafx.util.StringConverter;
 import kieker.diagnosis.model.PropertiesModel.ComponentNames;
 import kieker.diagnosis.util.Mapper;
 
 /**
  * @author Nils Christian Ehmke
  */
-public class ComponentNamesStringConverter extends StringConverter<ComponentNames> {
-	
-	private static Mapper<ComponentNames, String> componentMapper;
-
-	static {
-		ComponentNamesStringConverter.componentMapper = new Mapper<>();
-		ComponentNamesStringConverter.componentMapper.map(ComponentNames.SHORT).to("Catalog");
-		ComponentNamesStringConverter.componentMapper.map(ComponentNames.LONG).to("kieker.examples.bookstore.Catalog");
-	}
-	
+public class ComponentNamesStringConverter extends AbstractStringConverter<ComponentNames> {
+		
 	@Override
-	public ComponentNames fromString(final String string) {
-		return ComponentNamesStringConverter.componentMapper.invertedResolve(string);
+	protected void fillMapper(final Mapper<ComponentNames, String> mapper, final ResourceBundle resourceBundle) {
+		mapper.map(ComponentNames.SHORT).to("Catalog");
+		mapper.map(ComponentNames.LONG).to("kieker.examples.bookstore.Catalog");
 	}
-
-	@Override
-	public String toString(final ComponentNames object) {
-		return ComponentNamesStringConverter.componentMapper.resolve(object);
-	}
-
+	
 }
diff --git a/src/main/java/kieker/diagnosis/components/OperationNamesStringConverter.java b/src/main/java/kieker/diagnosis/components/converter/OperationNamesStringConverter.java
similarity index 53%
rename from src/main/java/kieker/diagnosis/components/OperationNamesStringConverter.java
rename to src/main/java/kieker/diagnosis/components/converter/OperationNamesStringConverter.java
index 9c7b3dde..9aec4387 100644
--- a/src/main/java/kieker/diagnosis/components/OperationNamesStringConverter.java
+++ b/src/main/java/kieker/diagnosis/components/converter/OperationNamesStringConverter.java
@@ -14,33 +14,22 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.converter;
+
+import java.util.ResourceBundle;
 
-import javafx.util.StringConverter;
 import kieker.diagnosis.model.PropertiesModel.OperationNames;
 import kieker.diagnosis.util.Mapper;
 
 /**
  * @author Nils Christian Ehmke
  */
-public class OperationNamesStringConverter extends StringConverter<OperationNames> {
-
-	private static Mapper<OperationNames, String> operationMapper;
-
-	static {
-		OperationNamesStringConverter.operationMapper = new Mapper<>();
-		OperationNamesStringConverter.operationMapper.map(OperationNames.SHORT).to("getBook(...)");
-		OperationNamesStringConverter.operationMapper.map(OperationNames.LONG).to("public void kieker.examples.bookstore.Catalog.getBook(boolean)");
-	}
-
-	@Override
-	public OperationNames fromString(final String string) {
-		return OperationNamesStringConverter.operationMapper.invertedResolve(string);
-	}
+public class OperationNamesStringConverter extends AbstractStringConverter<OperationNames> {
 
 	@Override
-	public String toString(final OperationNames object) {
-		return OperationNamesStringConverter.operationMapper.resolve(object);
+	protected void fillMapper(final Mapper<OperationNames, String> mapper, final ResourceBundle resourceBundle) {
+		mapper.map(OperationNames.SHORT).to("getBook(...)");
+		mapper.map(OperationNames.LONG).to("public void kieker.examples.bookstore.Catalog.getBook(boolean)");
 	}
 
 }
diff --git a/src/main/java/kieker/diagnosis/components/converter/ThresholdStringConverter.java b/src/main/java/kieker/diagnosis/components/converter/ThresholdStringConverter.java
new file mode 100644
index 00000000..5c2c1160
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/converter/ThresholdStringConverter.java
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.converter;
+
+import java.util.ResourceBundle;
+
+import kieker.diagnosis.model.PropertiesModel.Threshold;
+import kieker.diagnosis.util.Mapper;
+
+public class ThresholdStringConverter extends AbstractStringConverter<Threshold> {
+
+	@Override
+	protected void fillMapper(Mapper<Threshold, String> mapper, final ResourceBundle resourceBundle) {
+		final String threshold = resourceBundle.getString("threshold");
+
+		mapper.map(Threshold.THRESHOLD_0_5).to(threshold + " < 0.5 %");
+		mapper.map(Threshold.THRESHOLD_1).to(threshold + " < 1 %");
+		mapper.map(Threshold.THRESHOLD_10).to(threshold + " < 10 %");
+		mapper.map(Threshold.THRESHOLD_20).to(threshold + " < 20 %");
+		mapper.map(Threshold.THRESHOLD_30).to(threshold + " < 30 %");
+		mapper.map(Threshold.THRESHOLD_40).to(threshold + " < 40 %");
+		mapper.map(Threshold.THRESHOLD_50).to(threshold + " < 50 %");
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/TimeUnitStringConverter.java b/src/main/java/kieker/diagnosis/components/converter/TimeUnitStringConverter.java
similarity index 52%
rename from src/main/java/kieker/diagnosis/components/TimeUnitStringConverter.java
rename to src/main/java/kieker/diagnosis/components/converter/TimeUnitStringConverter.java
index 1e0e5f3b..acd41cfd 100644
--- a/src/main/java/kieker/diagnosis/components/TimeUnitStringConverter.java
+++ b/src/main/java/kieker/diagnosis/components/converter/TimeUnitStringConverter.java
@@ -14,26 +14,20 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.converter;
 
-import java.util.Locale;
 import java.util.ResourceBundle;
 import java.util.concurrent.TimeUnit;
 
-import javafx.util.StringConverter;
 import kieker.diagnosis.util.Mapper;
 
 /**
  * @author Nils Christian Ehmke
  */
-public class TimeUnitStringConverter extends StringConverter<TimeUnit> {
-
-	private static Mapper<TimeUnit, String> timeUnitMapper;
-
-	static {
-		final String bundleBaseName = "locale.kieker.diagnosis.components.components";
-		final ResourceBundle resourceBundle = ResourceBundle.getBundle(bundleBaseName, Locale.getDefault());
+public class TimeUnitStringConverter extends AbstractStringConverter<TimeUnit> {
 
+	@Override
+	protected void fillMapper(Mapper<TimeUnit, String> mapper, final ResourceBundle resourceBundle) {
 		final String nanoseconds = resourceBundle.getString("nanoseconds");
 		final String microseconds = resourceBundle.getString("microseconds");
 		final String milliseconds = resourceBundle.getString("milliseconds");
@@ -41,23 +35,12 @@ public class TimeUnitStringConverter extends StringConverter<TimeUnit> {
 		final String minutes = resourceBundle.getString("minutes");
 		final String hours = resourceBundle.getString("hours");
 
-		TimeUnitStringConverter.timeUnitMapper = new Mapper<>();
-		TimeUnitStringConverter.timeUnitMapper.map(TimeUnit.NANOSECONDS).to(nanoseconds);
-		TimeUnitStringConverter.timeUnitMapper.map(TimeUnit.MICROSECONDS).to(microseconds);
-		TimeUnitStringConverter.timeUnitMapper.map(TimeUnit.MILLISECONDS).to(milliseconds);
-		TimeUnitStringConverter.timeUnitMapper.map(TimeUnit.SECONDS).to(seconds);
-		TimeUnitStringConverter.timeUnitMapper.map(TimeUnit.MINUTES).to(minutes);
-		TimeUnitStringConverter.timeUnitMapper.map(TimeUnit.HOURS).to(hours);
-	}
-
-	@Override
-	public TimeUnit fromString(final String string) {
-		return TimeUnitStringConverter.timeUnitMapper.invertedResolve(string);
-	}
-
-	@Override
-	public String toString(final TimeUnit object) {
-		return TimeUnitStringConverter.timeUnitMapper.resolve(object);
+		mapper.map(TimeUnit.NANOSECONDS).to(nanoseconds);
+		mapper.map(TimeUnit.MICROSECONDS).to(microseconds);
+		mapper.map(TimeUnit.MILLISECONDS).to(milliseconds);
+		mapper.map(TimeUnit.SECONDS).to(seconds);
+		mapper.map(TimeUnit.MINUTES).to(minutes);
+		mapper.map(TimeUnit.HOURS).to(hours);
 	}
 
-}
+}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/components/converter/TimestampTypesStringConverter.java b/src/main/java/kieker/diagnosis/components/converter/TimestampTypesStringConverter.java
new file mode 100644
index 00000000..ad858177
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/converter/TimestampTypesStringConverter.java
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.converter;
+
+import java.util.ResourceBundle;
+
+import kieker.diagnosis.model.PropertiesModel.TimestampTypes;
+import kieker.diagnosis.util.Mapper;
+
+public class TimestampTypesStringConverter extends AbstractStringConverter<TimestampTypes> {
+
+	@Override
+	protected void fillMapper(Mapper<TimestampTypes, String> mapper, final ResourceBundle resourceBundle) {
+		mapper.map(TimestampTypes.TIMESTAMP).to("1418993603113900610");
+		mapper.map(TimestampTypes.DATE).to("19.12.14");
+		mapper.map(TimestampTypes.SHORT_TIME).to("13:53");
+		mapper.map(TimestampTypes.LONG_TIME).to("13:53:23");
+		mapper.map(TimestampTypes.DATE_AND_TIME).to("19.12.2014 13:53:23");
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/components/FailedTableCellFactory.java b/src/main/java/kieker/diagnosis/components/table/AbstractTableCellFactory.java
similarity index 88%
rename from src/main/java/kieker/diagnosis/components/FailedTableCellFactory.java
rename to src/main/java/kieker/diagnosis/components/table/AbstractTableCellFactory.java
index 557e2e0e..bf54049f 100644
--- a/src/main/java/kieker/diagnosis/components/FailedTableCellFactory.java
+++ b/src/main/java/kieker/diagnosis/components/table/AbstractTableCellFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.table;
 
 import javafx.scene.control.TableCell;
 import javafx.scene.control.TableColumn;
@@ -22,29 +22,28 @@ import javafx.scene.control.TableRow;
 import javafx.util.Callback;
 import kieker.diagnosis.domain.AbstractOperationCall;
 
-/**
- * @author Nils Christian Ehmke
- */
-public final class FailedTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
+public abstract class AbstractTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
 
 	@Override
 	public TableCell<S, T> call(final TableColumn<S, T> p) {
 		return new FailedTableCell();
 	}
+	
+	protected abstract String getItemLabel(T item);
 
 	private final class FailedTableCell extends TableCell<S, T> {
 
 		@Override
 		protected void updateItem(final T item, final boolean empty) {
 			setFailedStyle();
-			 
+
 			super.updateItem(item, empty);
 
 			if (empty || item == null) {
 				setText(null);
 				setGraphic(null);
 			} else {
-				setText(item.toString());
+				setText(getItemLabel(item));
 			}
 		}
 
@@ -64,4 +63,4 @@ public final class FailedTableCellFactory<S, T> implements Callback<TableColumn<
 		}
 
 	}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/components/ComponentCellValueFactory.java b/src/main/java/kieker/diagnosis/components/table/ComponentCellValueFactory.java
similarity index 98%
rename from src/main/java/kieker/diagnosis/components/ComponentCellValueFactory.java
rename to src/main/java/kieker/diagnosis/components/table/ComponentCellValueFactory.java
index 7c5c65e3..ede562d1 100644
--- a/src/main/java/kieker/diagnosis/components/ComponentCellValueFactory.java
+++ b/src/main/java/kieker/diagnosis/components/table/ComponentCellValueFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.table;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/src/main/java/kieker/diagnosis/components/DurationCellValueFactory.java b/src/main/java/kieker/diagnosis/components/table/DurationCellValueFactory.java
similarity index 98%
rename from src/main/java/kieker/diagnosis/components/DurationCellValueFactory.java
rename to src/main/java/kieker/diagnosis/components/table/DurationCellValueFactory.java
index 5a6dfb7d..afccf51f 100644
--- a/src/main/java/kieker/diagnosis/components/DurationCellValueFactory.java
+++ b/src/main/java/kieker/diagnosis/components/table/DurationCellValueFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.table;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/src/main/java/kieker/diagnosis/components/table/DurationTableCellFactory.java b/src/main/java/kieker/diagnosis/components/table/DurationTableCellFactory.java
new file mode 100644
index 00000000..4394bda9
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/table/DurationTableCellFactory.java
@@ -0,0 +1,32 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.table;
+
+import kieker.diagnosis.model.PropertiesModel;
+import kieker.diagnosis.util.NameConverter;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public final class DurationTableCellFactory<S, T> extends AbstractTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return (item.toString() + " " + NameConverter.toShortTimeUnit(PropertiesModel.getInstance().getTimeUnit()));
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/table/FailedTableCellFactory.java b/src/main/java/kieker/diagnosis/components/table/FailedTableCellFactory.java
new file mode 100644
index 00000000..64091c1b
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/table/FailedTableCellFactory.java
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.table;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public final class FailedTableCellFactory<S, T> extends AbstractTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return item.toString();
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/OperationCellValueFactory.java b/src/main/java/kieker/diagnosis/components/table/OperationCellValueFactory.java
similarity index 95%
rename from src/main/java/kieker/diagnosis/components/OperationCellValueFactory.java
rename to src/main/java/kieker/diagnosis/components/table/OperationCellValueFactory.java
index 01ae5bc6..16465c9f 100644
--- a/src/main/java/kieker/diagnosis/components/OperationCellValueFactory.java
+++ b/src/main/java/kieker/diagnosis/components/table/OperationCellValueFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.table;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -28,6 +28,7 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
 import javafx.beans.value.ObservableValue;
 import javafx.scene.control.TableColumn.CellDataFeatures;
 import javafx.util.Callback;
+import kieker.diagnosis.components.treetable.DurationTreeCellValueFactory;
 import kieker.diagnosis.model.PropertiesModel;
 import kieker.diagnosis.model.PropertiesModel.OperationNames;
 import kieker.diagnosis.util.NameConverter;
diff --git a/src/main/java/kieker/diagnosis/components/table/TimestampTableCellFactory.java b/src/main/java/kieker/diagnosis/components/table/TimestampTableCellFactory.java
new file mode 100644
index 00000000..3ab7682a
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/table/TimestampTableCellFactory.java
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.table;
+
+import kieker.diagnosis.model.DataModel;
+import kieker.diagnosis.util.NameConverter;
+
+public class TimestampTableCellFactory<S, T> extends AbstractTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return (NameConverter.toTimestampString((Long) item, DataModel.getInstance().getTimeUnit()));
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/components/AbstractLazyOperationCallTreeItem.java b/src/main/java/kieker/diagnosis/components/treetable/AbstractLazyOperationCallTreeItem.java
similarity index 97%
rename from src/main/java/kieker/diagnosis/components/AbstractLazyOperationCallTreeItem.java
rename to src/main/java/kieker/diagnosis/components/treetable/AbstractLazyOperationCallTreeItem.java
index e4ca9d73..9d644eab 100644
--- a/src/main/java/kieker/diagnosis/components/AbstractLazyOperationCallTreeItem.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/AbstractLazyOperationCallTreeItem.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import javafx.collections.ObservableList;
 import javafx.scene.control.TreeItem;
diff --git a/src/main/java/kieker/diagnosis/components/TimestampTreeTableCellFactory.java b/src/main/java/kieker/diagnosis/components/treetable/AbstractTreeTableCellFactory.java
similarity index 84%
rename from src/main/java/kieker/diagnosis/components/TimestampTreeTableCellFactory.java
rename to src/main/java/kieker/diagnosis/components/treetable/AbstractTreeTableCellFactory.java
index 81138111..a87fc62f 100644
--- a/src/main/java/kieker/diagnosis/components/TimestampTreeTableCellFactory.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/AbstractTreeTableCellFactory.java
@@ -14,22 +14,22 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import javafx.scene.control.TreeTableCell;
 import javafx.scene.control.TreeTableColumn;
 import javafx.scene.control.TreeTableRow;
 import javafx.util.Callback;
 import kieker.diagnosis.domain.AbstractOperationCall;
-import kieker.diagnosis.model.DataModel;
-import kieker.diagnosis.util.NameConverter;
 
-public class TimestampTreeTableCellFactory<S, T> implements Callback<TreeTableColumn<S, T>, TreeTableCell<S, T>> {
+public abstract class AbstractTreeTableCellFactory<S, T> implements Callback<TreeTableColumn<S, T>, TreeTableCell<S, T>> {
 
 	@Override
 	public TreeTableCell<S, T> call(final TreeTableColumn<S, T> p) {
 		return new FailedTableCell();
 	}
+	
+	protected abstract String getItemLabel(T item);
 
 	private final class FailedTableCell extends TreeTableCell<S, T> {
 
@@ -43,7 +43,7 @@ public class TimestampTreeTableCellFactory<S, T> implements Callback<TreeTableCo
 				setText(null);
 				setGraphic(null);
 			} else {
-				setText(NameConverter.toTimestampString((Long) item, DataModel.getInstance().getTimeUnit()));
+				setText(getItemLabel(item));
 			}
 		}
 
diff --git a/src/main/java/kieker/diagnosis/components/ComponentTreeCellValueFactory.java b/src/main/java/kieker/diagnosis/components/treetable/ComponentTreeCellValueFactory.java
similarity index 98%
rename from src/main/java/kieker/diagnosis/components/ComponentTreeCellValueFactory.java
rename to src/main/java/kieker/diagnosis/components/treetable/ComponentTreeCellValueFactory.java
index 07a32fd3..edf52fa5 100644
--- a/src/main/java/kieker/diagnosis/components/ComponentTreeCellValueFactory.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/ComponentTreeCellValueFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellFactory.java b/src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellFactory.java
new file mode 100644
index 00000000..0e3b414f
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellFactory.java
@@ -0,0 +1,32 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.treetable;
+
+import kieker.diagnosis.model.PropertiesModel;
+import kieker.diagnosis.util.NameConverter;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public final class DurationTreeCellFactory<S, T> extends AbstractTreeTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return (item.toString() + " " + NameConverter.toShortTimeUnit(PropertiesModel.getInstance().getTimeUnit()));
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/DurationTreeCellValueFactory.java b/src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellValueFactory.java
similarity index 98%
rename from src/main/java/kieker/diagnosis/components/DurationTreeCellValueFactory.java
rename to src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellValueFactory.java
index 9d63d1ef..e2ac10c8 100644
--- a/src/main/java/kieker/diagnosis/components/DurationTreeCellValueFactory.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/DurationTreeCellValueFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/src/main/java/kieker/diagnosis/components/treetable/FailedTreeCellFactory.java b/src/main/java/kieker/diagnosis/components/treetable/FailedTreeCellFactory.java
new file mode 100644
index 00000000..ba6af095
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/treetable/FailedTreeCellFactory.java
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.treetable;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public final class FailedTreeCellFactory<S, T> extends AbstractTreeTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return item.toString();
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/LazyAggregatedOperationCallTreeItem.java b/src/main/java/kieker/diagnosis/components/treetable/LazyAggregatedOperationCallTreeItem.java
similarity index 96%
rename from src/main/java/kieker/diagnosis/components/LazyAggregatedOperationCallTreeItem.java
rename to src/main/java/kieker/diagnosis/components/treetable/LazyAggregatedOperationCallTreeItem.java
index 8d32b656..65a9156c 100644
--- a/src/main/java/kieker/diagnosis/components/LazyAggregatedOperationCallTreeItem.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/LazyAggregatedOperationCallTreeItem.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/kieker/diagnosis/components/LazyOperationCallTreeItem.java b/src/main/java/kieker/diagnosis/components/treetable/LazyOperationCallTreeItem.java
similarity index 98%
rename from src/main/java/kieker/diagnosis/components/LazyOperationCallTreeItem.java
rename to src/main/java/kieker/diagnosis/components/treetable/LazyOperationCallTreeItem.java
index 72f1b6f4..8cb994d8 100644
--- a/src/main/java/kieker/diagnosis/components/LazyOperationCallTreeItem.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/LazyOperationCallTreeItem.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import java.util.ArrayList;
 import java.util.Comparator;
diff --git a/src/main/java/kieker/diagnosis/components/OperationTreeCellValueFactory.java b/src/main/java/kieker/diagnosis/components/treetable/OperationTreeCellValueFactory.java
similarity index 98%
rename from src/main/java/kieker/diagnosis/components/OperationTreeCellValueFactory.java
rename to src/main/java/kieker/diagnosis/components/treetable/OperationTreeCellValueFactory.java
index 53a043f1..ff734098 100644
--- a/src/main/java/kieker/diagnosis/components/OperationTreeCellValueFactory.java
+++ b/src/main/java/kieker/diagnosis/components/treetable/OperationTreeCellValueFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.diagnosis.components;
+package kieker.diagnosis.components.treetable;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/src/main/java/kieker/diagnosis/components/treetable/PercentTreeCellFactory.java b/src/main/java/kieker/diagnosis/components/treetable/PercentTreeCellFactory.java
new file mode 100644
index 00000000..847e04c4
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/treetable/PercentTreeCellFactory.java
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.treetable;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public final class PercentTreeCellFactory<S, T> extends AbstractTreeTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return (item.toString() + " %");
+	}
+
+}
diff --git a/src/main/java/kieker/diagnosis/components/treetable/TimestampTreeTableCellFactory.java b/src/main/java/kieker/diagnosis/components/treetable/TimestampTreeTableCellFactory.java
new file mode 100644
index 00000000..e2a310d5
--- /dev/null
+++ b/src/main/java/kieker/diagnosis/components/treetable/TimestampTreeTableCellFactory.java
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.diagnosis.components.treetable;
+
+import kieker.diagnosis.model.DataModel;
+import kieker.diagnosis.util.NameConverter;
+
+public final class TimestampTreeTableCellFactory<S, T> extends AbstractTreeTableCellFactory<S, T> {
+
+	@Override
+	protected String getItemLabel(T item) {
+		return NameConverter.toTimestampString((Long) item, DataModel.getInstance().getTimeUnit());
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/kieker/diagnosis/controller/aggregatedtraces/AggregatedTracesViewController.java b/src/main/java/kieker/diagnosis/controller/aggregatedtraces/AggregatedTracesViewController.java
index a7a98766..3d446d81 100644
--- a/src/main/java/kieker/diagnosis/controller/aggregatedtraces/AggregatedTracesViewController.java
+++ b/src/main/java/kieker/diagnosis/controller/aggregatedtraces/AggregatedTracesViewController.java
@@ -31,7 +31,7 @@ import javafx.scene.control.TextField;
 import javafx.scene.control.TreeItem;
 import javafx.scene.control.TreeTableView;
 import javafx.scene.input.MouseEvent;
-import kieker.diagnosis.components.LazyAggregatedOperationCallTreeItem;
+import kieker.diagnosis.components.treetable.LazyAggregatedOperationCallTreeItem;
 import kieker.diagnosis.controller.AbstractController;
 import kieker.diagnosis.domain.AggregatedOperationCall;
 import kieker.diagnosis.domain.AggregatedTrace;
diff --git a/src/main/java/kieker/diagnosis/controller/traces/TracesViewController.java b/src/main/java/kieker/diagnosis/controller/traces/TracesViewController.java
index f9b390de..506845ec 100644
--- a/src/main/java/kieker/diagnosis/controller/traces/TracesViewController.java
+++ b/src/main/java/kieker/diagnosis/controller/traces/TracesViewController.java
@@ -33,7 +33,7 @@ import javafx.scene.control.TreeItem;
 import javafx.scene.control.TreeTableView;
 import javafx.scene.input.MouseEvent;
 import jfxtras.scene.control.CalendarTimeTextField;
-import kieker.diagnosis.components.LazyOperationCallTreeItem;
+import kieker.diagnosis.components.treetable.LazyOperationCallTreeItem;
 import kieker.diagnosis.controller.AbstractController;
 import kieker.diagnosis.domain.OperationCall;
 import kieker.diagnosis.domain.Trace;
diff --git a/src/main/resources/views/kieker/diagnosis/view/aggregatedcalls/AggregatedCallsView.fxml b/src/main/resources/views/kieker/diagnosis/view/aggregatedcalls/AggregatedCallsView.fxml
index 36cb598d..e10da09c 100644
--- a/src/main/resources/views/kieker/diagnosis/view/aggregatedcalls/AggregatedCallsView.fxml
+++ b/src/main/resources/views/kieker/diagnosis/view/aggregatedcalls/AggregatedCallsView.fxml
@@ -1,6 +1,7 @@
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.control.cell.*?>
+<?import kieker.diagnosis.components.table.*?>
 
 <GridPane xmlns:fx="http://javafx.com/fxml"
 	AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0"
@@ -43,7 +44,7 @@
 		<columns>
 			<TableColumn text="%AggregatedCallsView.tblclmnExecutionContainer.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<PropertyValueFactory property="container" />
@@ -52,25 +53,25 @@
 
 			<TableColumn text="%AggregatedCallsView.tblclmnComponent.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.ComponentCellValueFactory property="component" />
+					<ComponentCellValueFactory property="component" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%AggregatedCallsView.tblclmnOperation.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.OperationCellValueFactory property="operation" />
+					<OperationCellValueFactory property="operation" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%AggregatedCallsView.tblclmnNumberOfCalls.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<PropertyValueFactory property="calls" />
@@ -79,50 +80,50 @@
 
 			<TableColumn text="%AggregatedCallsView.tblclmnMinimalDuration.text">
 				<cellFactory>
-					<kieker.diagnosis.components.DurationTableCellFactory />
+					<DurationTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationCellValueFactory
+					<DurationCellValueFactory
 						property="minDuration" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%AggregatedCallsView.tblclmnMeanDuration.text">
 				<cellFactory>
-					<kieker.diagnosis.components.DurationTableCellFactory />
+					<DurationTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationCellValueFactory
+					<DurationCellValueFactory
 						property="meanDuration" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%AggregatedCallsView.tblclmnMedianDuration.text">
 				<cellFactory>
-					<kieker.diagnosis.components.DurationTableCellFactory />
+					<DurationTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationCellValueFactory
+					<DurationCellValueFactory
 						property="medianDuration" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%AggregatedCallsView.tblclmnMaximalDuration.text">
 				<cellFactory>
-					<kieker.diagnosis.components.DurationTableCellFactory />
+					<DurationTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationCellValueFactory
+					<DurationCellValueFactory
 						property="maxDuration" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%AggregatedCallsView.tblclmnTotalDuration.text">
 				<cellFactory>
-					<kieker.diagnosis.components.DurationTableCellFactory />
+					<DurationTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationCellValueFactory
+					<DurationCellValueFactory
 						property="totalDuration" />
 				</cellValueFactory>
 			</TableColumn>
diff --git a/src/main/resources/views/kieker/diagnosis/view/aggregatedtraces/AggregatedTracesView.fxml b/src/main/resources/views/kieker/diagnosis/view/aggregatedtraces/AggregatedTracesView.fxml
index 4d75fee2..b518c4c7 100644
--- a/src/main/resources/views/kieker/diagnosis/view/aggregatedtraces/AggregatedTracesView.fxml
+++ b/src/main/resources/views/kieker/diagnosis/view/aggregatedtraces/AggregatedTracesView.fxml
@@ -1,6 +1,7 @@
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.control.cell.*?>
+<?import kieker.diagnosis.components.treetable.*?>
 
 <GridPane fx:id="view" xmlns:fx="http://javafx.com/fxml"
 	AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0"
@@ -44,7 +45,7 @@
 	<columns>
 			<TreeTableColumn text="%AggregatedTracesView.trclmnExecutionContainer.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory/>
+					<FailedTreeCellFactory/>
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory property="container" />
@@ -53,25 +54,25 @@
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnComponent.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.ComponentTreeCellValueFactory property="component" />
+					<ComponentTreeCellValueFactory property="component" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnOperation.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.OperationTreeCellValueFactory property="operation" />
+					<OperationTreeCellValueFactory property="operation" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnCalls.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory property="calls" />
@@ -80,7 +81,7 @@
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnTraceDepth.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory property="stackDepth" />
@@ -89,7 +90,7 @@
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnTraceSize.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory property="stackSize" />
@@ -98,50 +99,50 @@
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnMinimalDuration.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.DurationTreeCellFactory />
+					<DurationTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationTreeCellValueFactory
+					<DurationTreeCellValueFactory
 						property="minDuration" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnAverageDuration.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.DurationTreeCellFactory />
+					<DurationTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationTreeCellValueFactory
+					<DurationTreeCellValueFactory
 						property="meanDuration" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnMeanDuration.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.DurationTreeCellFactory />
+					<DurationTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationTreeCellValueFactory
+					<DurationTreeCellValueFactory
 						property="medianDuration" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnMaximalDuration.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.DurationTreeCellFactory />
+					<DurationTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationTreeCellValueFactory
+					<DurationTreeCellValueFactory
 						property="maxDuration" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%AggregatedTracesView.trclmnTotalDuration.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.DurationTreeCellFactory />
+					<DurationTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationTreeCellValueFactory
+					<DurationTreeCellValueFactory
 						property="totalDuration" />
 				</cellValueFactory>
 			</TreeTableColumn>
diff --git a/src/main/resources/views/kieker/diagnosis/view/calls/CallsView.fxml b/src/main/resources/views/kieker/diagnosis/view/calls/CallsView.fxml
index a98c1c61..b38e787f 100644
--- a/src/main/resources/views/kieker/diagnosis/view/calls/CallsView.fxml
+++ b/src/main/resources/views/kieker/diagnosis/view/calls/CallsView.fxml
@@ -3,6 +3,7 @@
 <?import javafx.scene.control.cell.*?>
 <?import javafx.scene.layout.VBox?>
 <?import jfxtras.scene.control.*?>
+<?import kieker.diagnosis.components.table.*?>
 
 <GridPane xmlns:fx="http://javafx.com/fxml"
 	AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0"
@@ -52,7 +53,7 @@
 		<columns>
 			<TableColumn text="%CallsView.tblclmnExecutionContainer.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<PropertyValueFactory property="container" />
@@ -61,34 +62,34 @@
 
 			<TableColumn text="%CallsView.tblclmnComponent.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.ComponentCellValueFactory property="component" />
+					<ComponentCellValueFactory property="component" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%CallsView.tblclmnOperation.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.OperationCellValueFactory property="operation" />
+					<OperationCellValueFactory property="operation" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%CallsView.tblclmnDuration.text">
 				<cellFactory>
-					<kieker.diagnosis.components.DurationTableCellFactory />
+					<DurationTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationCellValueFactory property="duration" />
+					<DurationCellValueFactory property="duration" />
 				</cellValueFactory>
 			</TableColumn>
 
 			<TableColumn text="%CallsView.tblclmnTraceID.text">
 				<cellFactory>
-					<kieker.diagnosis.components.FailedTableCellFactory />
+					<FailedTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<PropertyValueFactory property="traceID" />
@@ -97,7 +98,7 @@
 
 			<TableColumn text="%CallsView.tblclmnTimestamp.text">
 				<cellFactory>
-					<kieker.diagnosis.components.TimestampTableCellFactory />
+					<TimestampTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<PropertyValueFactory property="timestamp" />
diff --git a/src/main/resources/views/kieker/diagnosis/view/settings/SettingsDialogView.fxml b/src/main/resources/views/kieker/diagnosis/view/settings/SettingsDialogView.fxml
index 63df492c..b7a1baf6 100644
--- a/src/main/resources/views/kieker/diagnosis/view/settings/SettingsDialogView.fxml
+++ b/src/main/resources/views/kieker/diagnosis/view/settings/SettingsDialogView.fxml
@@ -2,6 +2,7 @@
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.control.cell.*?>
 <?import javafx.scene.control.CheckBox?>
+<?import kieker.diagnosis.components.converter.*?>
 
 <VBox xmlns:fx="http://javafx.com/fxml" fx:id="view" AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
 
@@ -14,27 +15,27 @@
 
 			<Label text="%SettingsDialog.lblTimeUnit.text" GridPane.columnIndex="1" GridPane.rowIndex="1" />
 			<ComboBox fx:id="timeunits" GridPane.columnIndex="2" GridPane.rowIndex="1" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity">
-				<converter><kieker.diagnosis.components.TimeUnitStringConverter/></converter>
+				<converter><TimeUnitStringConverter/></converter>
 			</ComboBox>
 
 			<Label text="%SettingsDialog.lblOperationNames.text" GridPane.columnIndex="1" GridPane.rowIndex="2" />
 			<ComboBox fx:id="operationNames" GridPane.columnIndex="2" GridPane.rowIndex="2" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity" >
-				<converter><kieker.diagnosis.components.OperationNamesStringConverter/></converter>
+				<converter><OperationNamesStringConverter/></converter>
 			</ComboBox>
 			
 			<Label text="%SettingsDialog.lblComponentNames.text" GridPane.columnIndex="1" GridPane.rowIndex="3" />
 			<ComboBox fx:id="componentNames" GridPane.columnIndex="2" GridPane.rowIndex="3" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity">
-				<converter><kieker.diagnosis.components.ComponentNamesStringConverter/></converter>
+				<converter><ComponentNamesStringConverter/></converter>
 			</ComboBox>
 			
 			<Label text="%timestamps" GridPane.columnIndex="1" GridPane.rowIndex="4" />
 			<ComboBox fx:id="timestamps" GridPane.columnIndex="2" GridPane.rowIndex="4" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity">
-				<converter><kieker.diagnosis.components.TimestampStringConverter/></converter>
+				<converter><TimestampTypesStringConverter/></converter>
 			</ComboBox>
 			
  			<CheckBox text="%aggregateMethodCalls" fx:id="aggregateMethodCalls" GridPane.columnIndex="1" GridPane.rowIndex="5" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity"/>
 			<ComboBox fx:id="thresholds" GridPane.columnIndex="2" GridPane.rowIndex="5" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity">
-				<converter><kieker.diagnosis.components.ThresholdStringConverter/></converter>
+				<converter><ThresholdStringConverter/></converter>
 			</ComboBox>
 			
 		</GridPane>
diff --git a/src/main/resources/views/kieker/diagnosis/view/traces/TracesView.fxml b/src/main/resources/views/kieker/diagnosis/view/traces/TracesView.fxml
index 181861a3..070720c1 100644
--- a/src/main/resources/views/kieker/diagnosis/view/traces/TracesView.fxml
+++ b/src/main/resources/views/kieker/diagnosis/view/traces/TracesView.fxml
@@ -2,6 +2,7 @@
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.control.cell.*?>
 <?import jfxtras.scene.control.*?>
+<?import kieker.diagnosis.components.treetable.*?>
 
 <GridPane fx:id="view" xmlns:fx="http://javafx.com/fxml"
 	AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0"
@@ -52,7 +53,7 @@
 		<columns>
 			<TreeTableColumn text="%TracesView.trclmnExecutionContainer.text">
 			<cellFactory>
-						<kieker.diagnosis.components.FailedTreeCellFactory />
+						<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory
@@ -62,25 +63,25 @@
 
 			<TreeTableColumn text="%TracesView.trclmnComponent.text">
 			<cellFactory>
-						<kieker.diagnosis.components.FailedTreeCellFactory />
+						<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.ComponentTreeCellValueFactory property="component" />
+					<ComponentTreeCellValueFactory property="component" />
 				</cellValueFactory>
 			</TreeTableColumn>
 
 			<TreeTableColumn text="%TracesView.trclmnOperation.text">
 			<cellFactory>
-						<kieker.diagnosis.components.FailedTreeCellFactory />
+						<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.OperationTreeCellValueFactory property="operation" />
+					<OperationTreeCellValueFactory property="operation" />
 				</cellValueFactory>
 			</TreeTableColumn>
 
 			<TreeTableColumn text="%TracesView.trclmnTraceDepth.text">
 			<cellFactory>
-						<kieker.diagnosis.components.FailedTreeCellFactory />
+						<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory
@@ -90,7 +91,7 @@
 
 			<TreeTableColumn text="%TracesView.trclmnTraceSize.text">
 			<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory
@@ -100,17 +101,17 @@
 
 			<TreeTableColumn text="%TracesView.trclmnDuration.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.DurationTreeCellFactory />
+					<DurationTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
-					<kieker.diagnosis.components.DurationTreeCellValueFactory
+					<DurationTreeCellValueFactory
 						property="duration" />
 				</cellValueFactory>
 			</TreeTableColumn>
 			
 			<TreeTableColumn text="%TracesView.trclmnPercent.text" >
 			<cellFactory>
-						<kieker.diagnosis.components.PercentTreeCellFactory />
+						<PercentTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory
@@ -120,7 +121,7 @@
 			
 			<TreeTableColumn text="%TracesView.trclmnTraceId.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.FailedTreeCellFactory />
+					<FailedTreeCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory
@@ -130,7 +131,7 @@
 			
 			<TreeTableColumn text="%TracesView.trclmnTimestamp.text" >
 			<cellFactory>
-					<kieker.diagnosis.components.TimestampTreeTableCellFactory />
+					<TimestampTreeTableCellFactory />
 				</cellFactory>
 				<cellValueFactory>
 					<TreeItemPropertyValueFactory
-- 
GitLab