diff --git a/src/main/java/kieker/analysis/graph/traversal/DeepGraphTraverser.java b/src/main/java/kieker/analysis/graph/traversal/DeepGraphTraverser.java
new file mode 100644
index 0000000000000000000000000000000000000000..18773f3e2ee0305b5ad50029de1783e1c737a6ec
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/traversal/DeepGraphTraverser.java
@@ -0,0 +1,27 @@
+package kieker.analysis.graph.traversal;
+
+import kieker.analysis.graph.Edge;
+import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.Vertex;
+
+public class DeepGraphTraverser extends GraphTraverser {
+
+	@Override
+	public void traverse(final Graph graph) {
+		for (final Vertex vertex : graph.getVertices()) {
+			for (final VertexVisitor visitor : vertexVisitors) {
+				visitor.visitVertex(vertex);
+			}
+			if (vertex.hasChildGraph()) {
+				traverse(vertex.getChildGraph());
+			}
+		}
+
+		for (final Edge edge : graph.getEdges()) {
+			for (final EdgeVisitor visitor : edgeVisitors) {
+				visitor.visitEdge(edge);
+			}
+		}
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/graph/traversal/EdgeVisitor.java b/src/main/java/kieker/analysis/graph/traversal/EdgeVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a5de1d3e88765517bb759adbfcacec40015d5cf
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/traversal/EdgeVisitor.java
@@ -0,0 +1,9 @@
+package kieker.analysis.graph.traversal;
+
+import kieker.analysis.graph.Edge;
+
+public interface EdgeVisitor {
+
+	public void visitEdge(Edge edge);
+
+}
diff --git a/src/main/java/kieker/analysis/graph/traversal/FlatGraphTraverser.java b/src/main/java/kieker/analysis/graph/traversal/FlatGraphTraverser.java
index 182bad4333d775b6b36c8a116b8c75571adb113f..46b3f56263cbdaabed1e7068eb1d42b0133a3cdc 100644
--- a/src/main/java/kieker/analysis/graph/traversal/FlatGraphTraverser.java
+++ b/src/main/java/kieker/analysis/graph/traversal/FlatGraphTraverser.java
@@ -4,16 +4,21 @@ import kieker.analysis.graph.Edge;
 import kieker.analysis.graph.Graph;
 import kieker.analysis.graph.Vertex;
 
-public class FlatGraphTraverser {
+public class FlatGraphTraverser extends GraphTraverser {
 
+	@Override
 	public void traverse(final Graph graph) {
 
 		for (Vertex vertex : graph.getVertices()) {
-			// TODO call (vertex) visitor
+			for (VertexVisitor visitor : vertexVisitors) {
+				visitor.visitVertex(vertex);
+			}
 		}
 
 		for (Edge edge : graph.getEdges()) {
-			// TODO Call (edge)visitor
+			for (EdgeVisitor visitor : edgeVisitors) {
+				visitor.visitEdge(edge);
+			}
 		}
 
 	}
diff --git a/src/main/java/kieker/analysis/graph/traversal/GraphTraverser.java b/src/main/java/kieker/analysis/graph/traversal/GraphTraverser.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1bce427bdce93708bc490afdd2be3d4ed2877d3
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/traversal/GraphTraverser.java
@@ -0,0 +1,55 @@
+package kieker.analysis.graph.traversal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import kieker.analysis.graph.Graph;
+
+public abstract class GraphTraverser {
+
+	protected List<VertexVisitor> vertexVisitors;
+	protected List<EdgeVisitor> edgeVisitors;
+
+	public GraphTraverser() {
+		this.vertexVisitors = new ArrayList<>();
+		this.edgeVisitors = new ArrayList<>();
+	}
+
+	public GraphTraverser(final VertexVisitor vertexVisitor, final EdgeVisitor edgeVisitor) {
+		this();
+		vertexVisitors.add(vertexVisitor);
+		edgeVisitors.add(edgeVisitor);
+	}
+
+	public GraphTraverser(final List<VertexVisitor> vertexVisitors, final List<EdgeVisitor> edgeVisitors) {
+		this.vertexVisitors = vertexVisitors;
+		this.edgeVisitors = edgeVisitors;
+	}
+
+	public List<VertexVisitor> getVertexVisitors() {
+		return vertexVisitors;
+	}
+
+	public void setVertexVisitors(final List<VertexVisitor> vertexVisitors) {
+		this.vertexVisitors = vertexVisitors;
+	}
+
+	public void addVertexVisitor(final VertexVisitor vertexVisitor) {
+		vertexVisitors.add(vertexVisitor);
+	}
+
+	public List<EdgeVisitor> getEdgeVisitors() {
+		return edgeVisitors;
+	}
+
+	public void setEdgeVisitors(final List<EdgeVisitor> edgeVisitors) {
+		this.edgeVisitors = edgeVisitors;
+	}
+
+	public void addEdgeVisitor(final EdgeVisitor edgeVisitor) {
+		edgeVisitors.add(edgeVisitor);
+	}
+
+	public abstract void traverse(final Graph graph);
+
+}
diff --git a/src/main/java/kieker/analysis/graph/traversal/NestedGraphTraverser.java b/src/main/java/kieker/analysis/graph/traversal/NestedGraphTraverser.java
index 046ac6cec66f674c942448d60cc49479abdcf969..ed74bb2324fa6d2eceb68f8d6957639193407426 100644
--- a/src/main/java/kieker/analysis/graph/traversal/NestedGraphTraverser.java
+++ b/src/main/java/kieker/analysis/graph/traversal/NestedGraphTraverser.java
@@ -5,6 +5,7 @@ import kieker.analysis.graph.Graph;
 import kieker.analysis.graph.Vertex;
 
 //TODO unused
+//TODO remove!
 public class NestedGraphTraverser {
 
 	public void traverse(final Graph graph) {
diff --git a/src/main/java/kieker/analysis/graph/traversal/VertexVisitor.java b/src/main/java/kieker/analysis/graph/traversal/VertexVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed5039947d79e2092e33ea212dcbf63e5a1901c2
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/traversal/VertexVisitor.java
@@ -0,0 +1,9 @@
+package kieker.analysis.graph.traversal;
+
+import kieker.analysis.graph.Vertex;
+
+public interface VertexVisitor {
+
+	public void visitVertex(Vertex vertex);
+
+}