diff --git a/src/main/java/kieker/analysis/graph/export/dot/AbstractDotFileWriterStage.java b/src/main/java/kieker/analysis/graph/export/dot/AbstractDotFileWriterStage.java
new file mode 100644
index 0000000000000000000000000000000000000000..fdd6eefc9d141d0bac3733453718b9a5672d4fe7
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/dot/AbstractDotFileWriterStage.java
@@ -0,0 +1,24 @@
+package kieker.analysis.graph.export.dot;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+public abstract class AbstractDotFileWriterStage extends AbstractDotWriterStage {
+
+	public AbstractDotFileWriterStage() {
+		super();
+	}
+
+	@Override
+	protected Writer getWriter() {
+		try {
+			return new FileWriter(getFileName());
+		} catch (IOException e) {
+			throw new IllegalStateException(e);
+		}
+	}
+
+	protected abstract String getFileName();
+
+}
diff --git a/src/main/java/kieker/analysis/graph/export/dot/AbstractDotWriterStage.java b/src/main/java/kieker/analysis/graph/export/dot/AbstractDotWriterStage.java
new file mode 100644
index 0000000000000000000000000000000000000000..576314e124a4b1785ceb4bc6129fcdb3d432667e
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/dot/AbstractDotWriterStage.java
@@ -0,0 +1,23 @@
+package kieker.analysis.graph.export.dot;
+
+import java.io.Writer;
+
+import kieker.analysis.graph.Graph;
+
+import teetime.framework.AbstractConsumerStage;
+
+public abstract class AbstractDotWriterStage extends AbstractConsumerStage<Graph> {
+
+	public AbstractDotWriterStage() {
+		super();
+	}
+
+	@Override
+	protected final void execute(final Graph graph) {
+		DotExporter dotExporter = new DotExporter(graph, getWriter());
+		dotExporter.transform();
+	}
+
+	protected abstract Writer getWriter();
+
+}