diff --git a/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java b/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java
index f90996ae90f9f4815772fc30321a74db8c471559..2624806999abdd538f8f05ceceb6ef65254fa2d0 100644
--- a/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java
+++ b/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java
@@ -12,6 +12,7 @@ import kieker.analysis.domain.AggregatedTrace;
 import kieker.analysis.domain.OperationCall;
 import kieker.analysis.domain.Trace;
 import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.export.dot.DotFileWriterStage;
 import kieker.analysis.graph.export.graphml.GraphMLFileWriterComposite;
 import kieker.analysis.stage.tracediagnosis.AllowedRecordsFilter;
 import kieker.analysis.stage.tracediagnosis.BeginEndOfMonitoringDetector;
@@ -19,7 +20,6 @@ import kieker.analysis.stage.tracediagnosis.OperationCallHandlerComposite;
 import kieker.analysis.stage.tracediagnosis.ReadingComposite;
 import kieker.analysis.stage.tracediagnosis.TraceAggregationComposite;
 import kieker.analysis.stage.tracediagnosis.TraceReconstructionComposite;
-import kieker.analysis.trace.graphoutput.DotGraphWriter;
 import kieker.analysis.trace.traversal.AggrTraceTraverserStage;
 import kieker.analysis.trace.traversal.TraceTraverserStage;
 import kieker.common.record.IMonitoringRecord;
@@ -75,28 +75,26 @@ public class TraceAnalysisConfiguration extends Configuration {
 
 		TraceTraverserStage traceTraverserStage = new TraceTraverserStage();
 		final Distributor<Graph> graphDistributor = new Distributor<>(new CopyByReferenceStrategy());
-		// TODO create mapping object
 		GraphMLFileWriterComposite graphMLFileWriterComposite = new GraphMLFileWriterComposite(graphFilesOutputDir);
-		DotGraphWriter dotGraphWriter = new DotGraphWriter(graphFilesOutputDir);
+		DotFileWriterStage dotFileWriterStage = new DotFileWriterStage(graphFilesOutputDir);
 
 		super.connectPorts(distributor.getNewOutputPort(), traceTraverserStage.getInputPort());
 		super.connectPorts(traceTraverserStage.getOutputPort(), graphDistributor.getInputPort());
 		super.connectPorts(graphDistributor.getNewOutputPort(), graphMLFileWriterComposite.getInputPort());
-		// super.connectPorts(graphDistributor.getNewOutputPort(), dotGraphWriter.getInputPort());
+		super.connectPorts(graphDistributor.getNewOutputPort(), dotFileWriterStage.getInputPort());
 
 		final Distributor<AggregatedTrace> aggregatedTraceDistributor = new Distributor<>(new CopyByReferenceStrategy());
 		AggrTraceTraverserStage aggrTraceTraverser = new AggrTraceTraverserStage();
 		final Distributor<Graph> graphDistributor2 = new Distributor<>(new CopyByReferenceStrategy());
-		// TODO create mapping object
 		GraphMLFileWriterComposite graphMLFileWriterComposite2 = new GraphMLFileWriterComposite(graphFilesOutputDir);
-		// DotGraphWriter dotGraphWriter2 = new DotGraphWriter(graphFilesOutputDir);
+		DotFileWriterStage dotFileWriterStage2 = new DotFileWriterStage(graphFilesOutputDir);
 
 		super.connectPorts(aggregation.getOutputPort(), aggregatedTraceDistributor.getInputPort());
 
 		super.connectPorts(aggregatedTraceDistributor.getNewOutputPort(), aggrTraceTraverser.getInputPort());
 		super.connectPorts(aggrTraceTraverser.getOutputPort(), graphDistributor2.getInputPort());
 		super.connectPorts(graphDistributor2.getNewOutputPort(), graphMLFileWriterComposite2.getInputPort());
-		// super.connectPorts(graphDistributor2.getNewOutputPort(), dotGraphWriter2.getInputPort());
+		super.connectPorts(graphDistributor2.getNewOutputPort(), dotFileWriterStage2.getInputPort());
 
 		// DependencyCreatorStage dependencyCreatorStage = new DependencyCreatorStage();
 		// DependencyStatisticsDecoratorStage dependencyStatisticsDecoratorStage = new DependencyStatisticsDecoratorStage();
diff --git a/src/main/java/kieker/analysis/graph/export/dot/AbstractDotFileWriterStage.java b/src/main/java/kieker/analysis/graph/export/dot/AbstractDotFileWriterStage.java
deleted file mode 100644
index 2368b3c8e659bb06ba011365cf88ad94c029c2e6..0000000000000000000000000000000000000000
--- a/src/main/java/kieker/analysis/graph/export/dot/AbstractDotFileWriterStage.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package kieker.analysis.graph.export.dot;
-
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-
-import kieker.analysis.graph.Graph;
-
-public abstract class AbstractDotFileWriterStage extends AbstractDotWriterStage {
-
-	public AbstractDotFileWriterStage() {
-		super();
-	}
-
-	@Override
-	protected Writer getWriter(final Graph graph) {
-		try {
-			return new FileWriter(getFileName(graph));
-		} catch (IOException e) {
-			throw new IllegalStateException(e);
-		}
-	}
-
-	protected abstract String getFileName(final Graph graph);
-
-}
diff --git a/src/main/java/kieker/analysis/graph/export/dot/AbstractDotWriterStage.java b/src/main/java/kieker/analysis/graph/export/dot/AbstractDotWriterStage.java
deleted file mode 100644
index 37a206bda28713843209036f9eb2850d6449680b..0000000000000000000000000000000000000000
--- a/src/main/java/kieker/analysis/graph/export/dot/AbstractDotWriterStage.java
+++ /dev/null
@@ -1,23 +0,0 @@
-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(graph));
-		dotExporter.transform();
-	}
-
-	protected abstract Writer getWriter(final Graph graph);
-
-}
diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotFileWriterStage.java b/src/main/java/kieker/analysis/graph/export/dot/DotFileWriterStage.java
new file mode 100644
index 0000000000000000000000000000000000000000..e82d1432d0913f1d5892bd622e7788bd2f6fad00
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/dot/DotFileWriterStage.java
@@ -0,0 +1,30 @@
+package kieker.analysis.graph.export.dot;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.mapping.GraphMapper;
+import kieker.analysis.graph.mapping.SimpleFileNameMapper;
+
+public class DotFileWriterStage extends DotWriterStage {
+
+	public DotFileWriterStage(final GraphMapper<String> fileNameMapper) {
+		super(new GraphMapper<Writer>() {
+			@Override
+			public Writer map(final Graph graph) {
+				try {
+					return new FileWriter(fileNameMapper.map(graph));
+				} catch (IOException e) {
+					throw new IllegalArgumentException(e);
+				}
+			}
+		});
+	}
+
+	public DotFileWriterStage(final String outputDirectory) {
+		this(new SimpleFileNameMapper(outputDirectory, "dot"));
+	}
+
+}
diff --git a/src/main/java/kieker/analysis/graph/export/dot/DotWriterStage.java b/src/main/java/kieker/analysis/graph/export/dot/DotWriterStage.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9e8f4470b01ca79434f59a6466818f923d27576
--- /dev/null
+++ b/src/main/java/kieker/analysis/graph/export/dot/DotWriterStage.java
@@ -0,0 +1,25 @@
+package kieker.analysis.graph.export.dot;
+
+import java.io.Writer;
+
+import kieker.analysis.graph.Graph;
+import kieker.analysis.graph.mapping.GraphMapper;
+
+import teetime.framework.AbstractConsumerStage;
+
+public class DotWriterStage extends AbstractConsumerStage<Graph> {
+
+	private final GraphMapper<Writer> writerMapper;
+
+	public DotWriterStage(final GraphMapper<Writer> writerMapper) {
+		super();
+		this.writerMapper = writerMapper;
+	}
+
+	@Override
+	protected final void execute(final Graph graph) {
+		DotExporter dotExporter = new DotExporter(graph, writerMapper.map(graph));
+		dotExporter.transform();
+	}
+
+}