diff --git a/src/main/java/kieker/analysis/trace/traversal/AggrTrace2Blueprint.java b/src/main/java/kieker/analysis/trace/traversal/AggrTrace2Blueprint.java
deleted file mode 100644
index c7a4306a14133be868a7ce535e02487ffa167c92..0000000000000000000000000000000000000000
--- a/src/main/java/kieker/analysis/trace/traversal/AggrTrace2Blueprint.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package kieker.analysis.trace.traversal;
-
-import com.tinkerpop.blueprints.Graph;
-import com.tinkerpop.blueprints.Vertex;
-import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
-
-import kieker.analysis.traceanalysisdomain.AggregatedOperationCall;
-
-public class AggrTrace2Blueprint extends OperationCallVisitor<AggregatedOperationCall> {
-
-	private final Graph graph;
-
-	public AggrTrace2Blueprint() {
-		super();
-		this.graph = new TinkerGraph();
-	}
-
-	@Override
-	public void visit(final AggregatedOperationCall operationCall) {
-
-		Vertex vertex = graph.addVertex(operationCall.hashCode());
-
-		vertex.setProperty("label", operationCall.getOperation());
-		// TODO maybe more properties?
-
-		AggregatedOperationCall parentCall = operationCall.getParent();
-
-		if (parentCall != null) {
-			Vertex parentVertex = graph.getVertex(operationCall.getParent().hashCode());
-			if (parentVertex != null) {
-				graph.addEdge(null, parentVertex, vertex, "");
-			}
-		}
-
-	}
-
-	public Graph getGraph() {
-		return graph;
-	}
-
-}
diff --git a/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java b/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b7b660363f688b19fd42f3e3abc11afad80aebe
--- /dev/null
+++ b/src/main/java/kieker/analysis/trace/traversal/AggrTraceToGraphTransformer.java
@@ -0,0 +1,32 @@
+package kieker.analysis.trace.traversal;
+
+import com.tinkerpop.blueprints.Edge;
+import com.tinkerpop.blueprints.Vertex;
+
+import kieker.analysis.traceanalysisdomain.AggregatedOperationCall;
+
+public class AggrTraceToGraphTransformer extends AbstractTraceToGraphTransformer<AggregatedOperationCall> {
+
+	@Override
+	protected Vertex addVertex(final AggregatedOperationCall operationCall) {
+		Vertex vertex = graph.addVertex(operationCall.hashCode());
+
+		vertex.setProperty("label", operationCall.getOperation());
+
+		return vertex;
+	}
+
+	@Override
+	protected Edge addEdge(final AggregatedOperationCall operationCall, final AggregatedOperationCall parentOperationCall) {
+
+		Vertex thisVertex = graph.getVertex(operationCall.hashCode());
+		Vertex parentVertex = graph.getVertex(operationCall.getParent().hashCode());
+
+		if (thisVertex == null || parentVertex == null) {
+			return null;
+		}
+
+		return graph.addEdge(null, parentVertex, thisVertex, "");
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java b/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java
index 61247db17cdd7ddd2e931eb723fa4f15ed43f93b..9cb2f91b166b71d331fa5fc88b5e0747cbe292c7 100644
--- a/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java
+++ b/src/main/java/kieker/analysis/trace/traversal/AggrTraceTraverserStage.java
@@ -10,7 +10,7 @@ public class AggrTraceTraverserStage extends AbstractTransformation<AggregatedTr
 	@Override
 	protected void execute(final AggregatedTrace trace) {
 
-		AggrTrace2Blueprint aggrTrace2Blueprint = new AggrTrace2Blueprint();
+		AggrTraceToGraphTransformer aggrTrace2Blueprint = new AggrTraceToGraphTransformer();
 
 		TraceTraverser<AggregatedTrace, AggregatedOperationCall> traverser = new TraceTraverser<>(aggrTrace2Blueprint);
 
diff --git a/src/main/java/kieker/analysis/trace/traversal/TraceToBlueprint.java b/src/main/java/kieker/analysis/trace/traversal/TraceToBlueprint.java
deleted file mode 100644
index 526e3b7e90c03fc3c983bf017fba8eb5d8d07dc8..0000000000000000000000000000000000000000
--- a/src/main/java/kieker/analysis/trace/traversal/TraceToBlueprint.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package kieker.analysis.trace.traversal;
-
-import com.tinkerpop.blueprints.Graph;
-import com.tinkerpop.blueprints.Vertex;
-import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
-
-import kieker.analysis.traceanalysisdomain.OperationCall;
-
-public class TraceToBlueprint extends OperationCallVisitor<OperationCall> {
-
-	private final Graph graph;
-
-	public TraceToBlueprint() {
-		super();
-		this.graph = new TinkerGraph();
-	}
-
-	@Override
-	public void visit(final OperationCall operationCall) {
-
-		Vertex vertex = graph.addVertex(operationCall.hashCode());
-
-		vertex.setProperty("label", operationCall.getOperation());
-		// TODO maybe more properties?
-
-		OperationCall parentCall = operationCall.getParent();
-
-		if (parentCall != null) {
-			Vertex parentVertex = graph.getVertex(operationCall.getParent().hashCode());
-			if (parentVertex != null) {
-				graph.addEdge(null, parentVertex, vertex, "");
-			}
-		}
-
-	}
-
-	public Graph getGraph() {
-		return graph;
-	}
-
-}
diff --git a/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java b/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java
new file mode 100644
index 0000000000000000000000000000000000000000..83abd319427d66dbf63e6f731b46f44509171fd7
--- /dev/null
+++ b/src/main/java/kieker/analysis/trace/traversal/TraceToGraphTransformer.java
@@ -0,0 +1,32 @@
+package kieker.analysis.trace.traversal;
+
+import com.tinkerpop.blueprints.Edge;
+import com.tinkerpop.blueprints.Vertex;
+
+import kieker.analysis.traceanalysisdomain.OperationCall;
+
+public class TraceToGraphTransformer extends AbstractTraceToGraphTransformer<OperationCall> {
+
+	@Override
+	protected Vertex addVertex(final OperationCall operationCall) {
+		Vertex vertex = graph.addVertex(operationCall.hashCode());
+
+		vertex.setProperty("label", operationCall.getOperation());
+
+		return vertex;
+	}
+
+	@Override
+	protected Edge addEdge(final OperationCall operationCall, final OperationCall parentOperationCall) {
+
+		Vertex thisVertex = graph.getVertex(operationCall.hashCode());
+		Vertex parentVertex = graph.getVertex(operationCall.getParent().hashCode());
+
+		if (thisVertex == null || parentVertex == null) {
+			return null;
+		}
+
+		return graph.addEdge(null, parentVertex, thisVertex, "");
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java b/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java
index 950a9a04782bfbaa05c2ea78df324909c266b96b..dd1e2c55e1f73e560b63bdb2fb62b3ba22dd2faf 100644
--- a/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java
+++ b/src/main/java/kieker/analysis/trace/traversal/TraceTraverserStage.java
@@ -10,15 +10,15 @@ public class TraceTraverserStage extends AbstractTransformation<Trace, NamedGrap
 	@Override
 	protected void execute(final Trace trace) {
 
-		TraceToBlueprint traceToBlueprint = new TraceToBlueprint();
+		TraceToGraphTransformer traceToGraph = new TraceToGraphTransformer();
 
-		TraceTraverser<Trace, OperationCall> traverser = new TraceTraverser<>(traceToBlueprint);
+		TraceTraverser<Trace, OperationCall> traverser = new TraceTraverser<>(traceToGraph);
 
 		traverser.traverse(trace);
 
 		String name = String.valueOf(trace.hashCode());
 
-		NamedGraph graph = new NamedGraph(name, name, traceToBlueprint.getGraph());
+		NamedGraph graph = new NamedGraph(name, name, traceToGraph.getGraph());
 
 		this.getOutputPort().send(graph);
 	}
diff --git a/src/main/java/kieker/analysis/traceanalysisdomain/AbstractOperationCall.java b/src/main/java/kieker/analysis/traceanalysisdomain/AbstractOperationCall.java
index f8454abca121a29f87adf39b313820304f477847..c1abd011db95e23147289e7493f1b337cea780f3 100644
--- a/src/main/java/kieker/analysis/traceanalysisdomain/AbstractOperationCall.java
+++ b/src/main/java/kieker/analysis/traceanalysisdomain/AbstractOperationCall.java
@@ -62,6 +62,8 @@ public abstract class AbstractOperationCall<T extends AbstractOperationCall<T>>
 		return this.children;
 	}
 
+	public abstract T getParent();
+
 	public final String getContainer() {
 		return this.container;
 	}