diff --git a/src/main/java/kieker/analysis/util/DotBuilder.java b/src/main/java/kieker/analysis/util/DotBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4c50f1ee2c03fdff18efab9d2d72fd969c8ae37
--- /dev/null
+++ b/src/main/java/kieker/analysis/util/DotBuilder.java
@@ -0,0 +1,96 @@
+package kieker.analysis.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.common.base.Joiner;
+
+public class DotBuilder {
+
+	private final String start;
+	private final String end = "}";
+	private final StringBuilder body = new StringBuilder();
+
+	private Map<String, String> defaultNodeProperties;
+	private Map<String, String> defaultEdgeProperties;
+	private Map<String, String> defaultProperties;
+
+	/*
+	 * TODO: Use default properties
+	 */
+
+	public DotBuilder() {
+		this("G");
+	}
+
+	public DotBuilder(final String name) {
+		start = "digraph " + name + " {";
+	}
+
+	public DotBuilder(final String name, final Map<String, String> defaultNodeProperties, final Map<String, String> defaultEdgeProperties) {
+		this(name);
+		this.defaultNodeProperties = defaultNodeProperties;
+		this.defaultEdgeProperties = defaultEdgeProperties;
+	}
+
+	public DotBuilder(final String name, final Map<String, String> defaultNodeProperties, final Map<String, String> defaultEdgeProperties,
+			final Map<String, String> defaultProperties) {
+		this(name, defaultNodeProperties, defaultEdgeProperties);
+		this.defaultProperties = defaultProperties;
+	}
+
+	public void setDefaultNodeProperties(final Map<String, String> defaultNodeProperties) {
+		this.defaultNodeProperties = defaultNodeProperties;
+	}
+
+	public void setDefaultEdgeProperties(final Map<String, String> defaultEdgeProperties) {
+		this.defaultEdgeProperties = defaultEdgeProperties;
+	}
+
+	public void setDefaultProperties(final Map<String, String> defaultProperties) {
+		this.defaultProperties = defaultProperties;
+	}
+
+	public String get() {
+		return start + body.toString() + end;
+	}
+
+	public void addNode(final String id) {
+		addNode(id, new HashMap<>());
+	}
+
+	public void addNode(final String id, final String label) {
+		Map<String, String> properties = new HashMap<String, String>();
+		properties.put("label", label);
+		addNode(id, properties);
+	}
+
+	public void addNode(final String id, final Map<String, String> properties) {
+		addElement('"' + id + '"', properties);
+	}
+
+	public void addEdge(final String from, final String to) {
+		addEdge(from, to, new HashMap<>());
+	}
+
+	public void addEdge(final String from, final String to, final String label) {
+		Map<String, String> properties = new HashMap<String, String>();
+		properties.put("label", label);
+		addEdge(from, to, properties);
+	}
+
+	public void addEdge(final String from, final String to, final Map<String, String> properties) {
+		addElement('"' + from + '"' + " -> " + '"' + to + '"', properties);
+	}
+
+	private void addElement(final String element, final Map<String, String> properties) {
+		body.append(element);
+		if (properties != null && !properties.isEmpty()) {
+			body.append('[');
+			Joiner.on(", ").withKeyValueSeparator("=").appendTo(body, properties);
+			body.append(']');
+		}
+		body.append('\n');
+	}
+
+}