diff --git a/alib2data/src/grammar/GrammarToStringComposer.cpp b/alib2data/src/grammar/GrammarToStringComposer.cpp
index 6a3f8247751ba2a97dd81c9c90fe777cbca6ee5a..00a616575821e46f316115ac92cd37a501ff2c5b 100644
--- a/alib2data/src/grammar/GrammarToStringComposer.cpp
+++ b/alib2data/src/grammar/GrammarToStringComposer.cpp
@@ -1,11 +1,14 @@
 #include "GrammarToStringComposer.h"
 #include "../alphabet/SymbolToStringComposer.h"
 #include <sstream>
+#include "ContextFree/CNF.h"
 
 namespace grammar {
 
 std::string GrammarToStringComposer::compose(const GrammarBase& grammar) const {
-
+	std::stringstream out;
+	grammar.Accept((void*) &out, *this);
+	return out.str();
 }
 
 std::string GrammarToStringComposer::compose(const Grammar& grammar) const {
@@ -50,8 +53,56 @@ std::string GrammarToStringComposer::compose(const EpsilonFreeCFG& grammar) cons
 }
 
 std::string GrammarToStringComposer::compose(const CNF& grammar) const {
-	// TODO
-	return "todo";
+	alphabet::SymbolToStringComposer sscomp;
+	std::stringstream ss;
+	bool first;
+
+	ss << "(CNF," << std::endl;
+
+	ss << "{";
+	first = false;
+	for(const auto& symbol : grammar.getNonterminalAlphabet() ) {
+		if(first)
+			ss << ", ";
+		else
+			first = true;
+		ss << sscomp.compose(symbol);
+	}
+	ss << "}," << std::endl;
+	ss << "{";
+	first = false;
+	for(const auto& symbol : grammar.getTerminalAlphabet() ) {
+		if(first)
+			ss << ", ";
+		else
+			first = true;
+		ss << sscomp.compose(symbol);
+	}
+	ss << "}," << std::endl;
+	ss << "{ ";
+	first = false;
+	for(const auto& rule : grammar.getRawRules() ) {
+		if(first)
+			ss << ", " << std::endl << "  ";
+		else
+			first = true;
+		ss << sscomp.compose(rule.first);
+		ss << " -> ";
+		bool innerFirst = false;
+		for(const auto& rhs : rule.second) {
+			if(innerFirst)
+				ss << " | ";
+			else
+				innerFirst = true;
+			for(const auto& symbol : rhs)
+				ss << sscomp.compose(symbol) << " ";
+		}
+	}
+	ss << "}," << std::endl;
+	ss << sscomp.compose(grammar.getInitialSymbol()) << std::endl;
+	ss << ")" << std::endl;
+
+	return std::move(ss).str();
 }
 
 std::string GrammarToStringComposer::compose(const GNF& grammar) const {