diff --git a/acompare2/src/GrammarCompare.cpp b/acompare2/src/GrammarCompare.cpp
index a11b92167fec966d288213880ab6db7cb3c2ace2..59d88097c555a9b16098d0bd37693567f29cb667 100644
--- a/acompare2/src/GrammarCompare.cpp
+++ b/acompare2/src/GrammarCompare.cpp
@@ -86,7 +86,7 @@ bool GrammarCompare::testCompare(const grammar::CNF < > & a, const grammar::CNF
 			a.getTerminalAlphabet()    == b.getTerminalAlphabet()    ;
 }
 
-bool GrammarCompare::testCompare(const grammar::GNF& a, const grammar::GNF& b) {
+bool GrammarCompare::testCompare(const grammar::GNF < > & a, const grammar::GNF < > & b) {
 	return  	a.getNonterminalAlphabet() == b.getNonterminalAlphabet() &&
 			a.getRules()               == b.getRules()               &&
 			a.getInitialSymbol()       == b.getInitialSymbol()       &&
@@ -409,7 +409,7 @@ void GrammarCompare::printCompare(const grammar::CNF < > & a, const grammar::CNF
 	}
 }
 
-void GrammarCompare::printCompare(const grammar::GNF& a, const grammar::GNF& b) {
+void GrammarCompare::printCompare(const grammar::GNF < > & a, const grammar::GNF < > & b) {
 	std::cout << "GrammarCompareer" << std::endl;
 
 	if(a.getNonterminalAlphabet() != b.getNonterminalAlphabet()) {
@@ -647,7 +647,7 @@ int GrammarCompare::compare(const grammar::CNF < > & a, const grammar::CNF < > &
 
 auto GrammarCompareCNF = GrammarCompare::RegistratorWrapper<int, grammar::CNF < >, grammar::CNF < > >(GrammarCompare::compare);
 
-int GrammarCompare::compare(const grammar::GNF& a, const grammar::GNF& b) {
+int GrammarCompare::compare(const grammar::GNF < > & a, const grammar::GNF < > & b) {
 	if(!GrammarCompare::testCompare(a, b)) {
 	  GrammarCompare::printCompare(a, b);
 	  return 1;
@@ -656,7 +656,7 @@ int GrammarCompare::compare(const grammar::GNF& a, const grammar::GNF& b) {
 	}
 }
 
-auto GrammarCompareGNF = GrammarCompare::RegistratorWrapper<int, grammar::GNF, grammar::GNF>(GrammarCompare::compare);
+auto GrammarCompareGNF = GrammarCompare::RegistratorWrapper<int, grammar::GNF < >, grammar::GNF < > >(GrammarCompare::compare);
 
 int GrammarCompare::compare(const grammar::CSG& a, const grammar::CSG& b) {
 	if(!GrammarCompare::testCompare(a, b)) {
diff --git a/acompare2/src/GrammarCompare.h b/acompare2/src/GrammarCompare.h
index 2d77583672b063266c824ea36d44c89c57609d78..c261c76b603459b56b4bfe349d289cd6a187f9e4 100644
--- a/acompare2/src/GrammarCompare.h
+++ b/acompare2/src/GrammarCompare.h
@@ -44,8 +44,8 @@ private:
 	static bool testCompare(const grammar::CNF < > & a, const grammar::CNF < > & b);
 	static void printCompare(const grammar::CNF < > & a, const grammar::CNF < > & b);
 
-	static bool testCompare(const grammar::GNF& a, const grammar::GNF& b);
-	static void printCompare(const grammar::GNF& a, const grammar::GNF& b);
+	static bool testCompare(const grammar::GNF < > & a, const grammar::GNF < > & b);
+	static void printCompare(const grammar::GNF < > & a, const grammar::GNF < > & b);
 
 	static bool testCompare(const grammar::CSG& a, const grammar::CSG& b);
 	static void printCompare(const grammar::CSG& a, const grammar::CSG& b);
@@ -71,7 +71,7 @@ public:
 	static int compare(const grammar::CFG < > & a, const grammar::CFG < > & b);
 	static int compare(const grammar::EpsilonFreeCFG < > & a, const grammar::EpsilonFreeCFG < > & b);
 	static int compare(const grammar::CNF < > & a, const grammar::CNF < > & b);
-	static int compare(const grammar::GNF& a, const grammar::GNF& b);
+	static int compare(const grammar::GNF < > & a, const grammar::GNF < > & b);
 	static int compare(const grammar::CSG& a, const grammar::CSG& b);
 	static int compare(const grammar::NonContractingGrammar& a, const grammar::NonContractingGrammar& b);
 	static int compare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b);
diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
index 4220054ae1d91acb23e710add22c7f5a09994f55..3f6ca4fa6ab9a299e7037892a3d6e6e1b2fac786 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
@@ -62,7 +62,7 @@ std::set<string::LinearString < >> GenerateUpToLength::generate( const T & gramm
 }
 
 auto GenerateUpToLengthEpsilonFreeCFG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::EpsilonFreeCFG < > >(GenerateUpToLength::generate);
-auto GenerateUpToLengthGNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::GNF>(GenerateUpToLength::generate);
+auto GenerateUpToLengthGNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::GNF < > >(GenerateUpToLength::generate);
 auto GenerateUpToLengthCNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::CNF < > >(GenerateUpToLength::generate);
 auto GenerateUpToLengthLeftRG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::LeftRG>(GenerateUpToLength::generate);
 auto GenerateUpToLengthRightRG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::RightRG>(GenerateUpToLength::generate);
diff --git a/alib2algo/src/grammar/parsing/First.cpp b/alib2algo/src/grammar/parsing/First.cpp
index 85bf976a710f509d1bab4c86ff229b88a64fc3ba..ac0af059dd171d76864047be03a61e95fa9eba43 100644
--- a/alib2algo/src/grammar/parsing/First.cpp
+++ b/alib2algo/src/grammar/parsing/First.cpp
@@ -106,11 +106,11 @@ std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > First::first
 
 auto FirstCFG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CFG < > > ( First::first );
 auto FirstEpsilonFreeCFG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::EpsilonFreeCFG < > > ( First::first );
-auto FirstGNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::GNF > ( First::first );
+auto FirstGNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::GNF < > > ( First::first );
 auto FirstCNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CNF < > > ( First::first );
-auto FirstLG  = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LG > ( First::first );
-auto FirstLeftLG  = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftLG > ( First::first );
-auto FirstLeftRG  = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftRG > ( First::first );
+auto FirstLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LG > ( First::first );
+auto FirstLeftLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftLG > ( First::first );
+auto FirstLeftRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftRG > ( First::first );
 auto FirstRightLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightLG > ( First::first );
 auto FirstRightRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightRG > ( First::first );
 
@@ -120,11 +120,11 @@ std::map < std::vector < alphabet::Symbol >, std::set < std::variant < alphabet:
 
 auto FirstCFG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CFG < > > ( First::first );
 auto FirstEpsilonFreeCFG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::EpsilonFreeCFG < > > ( First::first );
-auto FirstGNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::GNF > ( First::first );
+auto FirstGNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::GNF < > > ( First::first );
 auto FirstCNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CNF < > > ( First::first );
-auto FirstLG2  = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LG > ( First::first );
-auto FirstLeftLG2  = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftLG > ( First::first );
-auto FirstLeftRG2  = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftRG > ( First::first );
+auto FirstLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LG > ( First::first );
+auto FirstLeftLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftLG > ( First::first );
+auto FirstLeftRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftRG > ( First::first );
 auto FirstRightLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightLG > ( First::first );
 auto FirstRightRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightRG > ( First::first );
 
diff --git a/alib2algo/src/grammar/parsing/Follow.cpp b/alib2algo/src/grammar/parsing/Follow.cpp
index 6b1cde9505c2f39010fd07ee2331f414fd6ed227..a457091414184f5b2a840900fd063217700caf2a 100644
--- a/alib2algo/src/grammar/parsing/Follow.cpp
+++ b/alib2algo/src/grammar/parsing/Follow.cpp
@@ -94,11 +94,11 @@ std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > Follow::foll
 
 auto FollowCFG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CFG < > > ( Follow::follow );
 auto FollowEpsilonFreeCFG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::EpsilonFreeCFG < > > ( Follow::follow );
-auto FollowGNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::GNF > ( Follow::follow );
+auto FollowGNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::GNF < > > ( Follow::follow );
 auto FollowCNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CNF < > > ( Follow::follow );
-auto FollowLG  = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LG > ( Follow::follow );
-auto FollowLeftLG  = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftLG > ( Follow::follow );
-auto FollowLeftRG  = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftRG > ( Follow::follow );
+auto FollowLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LG > ( Follow::follow );
+auto FollowLeftLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftLG > ( Follow::follow );
+auto FollowLeftRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftRG > ( Follow::follow );
 auto FollowRightLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightLG > ( Follow::follow );
 auto FollowRightRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightRG > ( Follow::follow );
 
@@ -108,11 +108,11 @@ std::map < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, string:
 
 auto FollowCFG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CFG < > > ( Follow::follow );
 auto FollowEpsilonFreeCFG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::EpsilonFreeCFG < > > ( Follow::follow );
-auto FollowGNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::GNF > ( Follow::follow );
+auto FollowGNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::GNF < > > ( Follow::follow );
 auto FollowCNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CNF < > > ( Follow::follow );
-auto FollowLG2	= FollowBase2::RegistratorWrapper < FollowResult2, grammar::LG > ( Follow::follow );
-auto FollowLeftLG2	= FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftLG > ( Follow::follow );
-auto FollowLeftRG2	= FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftRG > ( Follow::follow );
+auto FollowLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LG > ( Follow::follow );
+auto FollowLeftLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftLG > ( Follow::follow );
+auto FollowLeftRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftRG > ( Follow::follow );
 auto FollowRightLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightLG > ( Follow::follow );
 auto FollowRightRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightRG > ( Follow::follow );
 
diff --git a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp
index 8f8e6934a114ea7d9f0d5d3cf8dd035146a45d17..0da6a227ef3f94888b7e48b862abbc14c918aa5a 100644
--- a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp
+++ b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp
@@ -52,7 +52,7 @@ std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, a
 
 auto LL1ParseTableCFG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::CFG < > > ( LL1ParseTable::parseTable );
 auto LL1ParseTableEpsilonFreeCFG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::EpsilonFreeCFG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableGNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::GNF > ( LL1ParseTable::parseTable );
+auto LL1ParseTableGNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::GNF < > > ( LL1ParseTable::parseTable );
 auto LL1ParseTableCNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::CNF < > > ( LL1ParseTable::parseTable );
 auto LL1ParseTableLG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LG > ( LL1ParseTable::parseTable );
 auto LL1ParseTableLeftLG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LeftLG > ( LL1ParseTable::parseTable );
diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
index ce3c2c41f3df987e82f34e26d6a3feeba1b0c6aa..2c6440b9c4e16911f3aeb55f1f2e459cb18e9194 100644
--- a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
+++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
@@ -30,7 +30,7 @@ bool IsLanguageEmpty::isLanguageEmpty( const T & grammar ) {
 
 auto IsLanguageEmptyCFG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CFG < > >(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyEpsilonFreeCFG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::EpsilonFreeCFG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyGNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::GNF>(IsLanguageEmpty::isLanguageEmpty);
+auto IsLanguageEmptyGNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::GNF < > >(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyCNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CNF < > >(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LG>(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyLeftLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftLG>(IsLanguageEmpty::isLanguageEmpty);
diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
index dc8feab5bed90acb8bf0f560df61f39e0ecb2f3e..192998c3b8fa07fbbadde932472af9b88fe49b61 100644
--- a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
+++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
@@ -30,7 +30,7 @@ bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const T & grammar
 
 auto IsLanguageGeneratingEpsilonCFG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::CFG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonEpsilonFreeCFG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::EpsilonFreeCFG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonGNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::GNF>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
+auto IsLanguageGeneratingEpsilonGNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::GNF < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonCNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::CNF < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonLeftLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftLG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
diff --git a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
index 9aba9aed95196d6faa06aa6032fa73e69908b816..459642d63d0fca4891b7c2855194e4251845e3b4 100644
--- a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
+++ b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
@@ -59,7 +59,7 @@ std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle
 
 auto NonterminalUnitRuleCycleCFG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleEpsilonFreeCFG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleGNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
+auto NonterminalUnitRuleCycleGNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleCNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleLeftLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
diff --git a/alib2algo/src/grammar/properties/NullableNonterminals.cpp b/alib2algo/src/grammar/properties/NullableNonterminals.cpp
index c9e5e6c281f99ad8ce12a9a5a3b078d781c74cc3..c64dae41e71461f7e73e67d01ea4fe46f1f401c4 100644
--- a/alib2algo/src/grammar/properties/NullableNonterminals.cpp
+++ b/alib2algo/src/grammar/properties/NullableNonterminals.cpp
@@ -53,7 +53,7 @@ std::set<alphabet::Symbol> NullableNonterminals::getNullableNonterminals(const T
 
 auto NullableNonterminalsCFG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsEpsilonFreeCFG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsGNF = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(NullableNonterminals::getNullableNonterminals);
+auto NullableNonterminalsGNF = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsCNF = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsLeftLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(NullableNonterminals::getNullableNonterminals);
diff --git a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
index 4714eb206aab6760294a8b3e2466ca013f906cbd..1ff0035172e8aee40f79d6d5b230c385d93c3be3 100644
--- a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
+++ b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
@@ -58,7 +58,7 @@ std::set<alphabet::Symbol> ProductiveNonterminals::getProductiveNonterminals( co
 
 auto ProductiveNonterminalsCFG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsEpsilonFreeCFG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsGNF = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(ProductiveNonterminals::getProductiveNonterminals);
+auto ProductiveNonterminalsGNF = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsCNF = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsLeftLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(ProductiveNonterminals::getProductiveNonterminals);
diff --git a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
index 1273afd732bb527c2b59f8130d1f8241d956d1bd..9883def5b92e3f5ab14348f26ba6f088d7237e32 100644
--- a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
+++ b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
@@ -65,7 +65,7 @@ bool RecursiveNonterminal::isNonterminalRecursive ( const T & grammar, const alp
 
 auto RecursiveNonterminalCFG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::CFG < > > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalEpsilonFreeCFG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::EpsilonFreeCFG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalGNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::GNF > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalGNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::GNF < > > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalCNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::CNF < > > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalLG	 = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LG > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalLeftLG	 = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftLG > ( RecursiveNonterminal::isNonterminalRecursive );
diff --git a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
index e2ee315a80ae991c7a3abd2b3b65275e7e7d812c..d3c0c6917bb83e5deba60bd105bdb4b0a4faccc6 100644
--- a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
+++ b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
@@ -59,7 +59,7 @@ std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( const T &
 
 auto UnreachableSymbolsCFG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsEpsilonFreeCFG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsGNF = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(UnreachableSymbols::getUnreachableSymbols);
+auto UnreachableSymbolsGNF = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsCNF = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsLeftLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(UnreachableSymbols::getUnreachableSymbols);
diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
index 4f1b57041461e77b53189527adcc44fad07f510a..cf4ba01055708b75cb24aa1b24009e393b147736 100644
--- a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
+++ b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
@@ -70,11 +70,11 @@ grammar::CNF < > EpsilonRemover::remove(const grammar::CNF < > & origGrammar) {
 
 auto EpsilonRemoverCNF = EpsilonRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(EpsilonRemover::remove);
 
-grammar::GNF EpsilonRemover::remove(const grammar::GNF& origGrammar) {
+grammar::GNF < > EpsilonRemover::remove(const grammar::GNF < > & origGrammar) {
 	return origGrammar;
 }
 
-auto EpsilonRemoverGNF = EpsilonRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(EpsilonRemover::remove);
+auto EpsilonRemoverGNF = EpsilonRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(EpsilonRemover::remove);
 
 grammar::EpsilonFreeCFG < > EpsilonRemover::remove(const grammar::LG& origGrammar) {
 	return removeInternal(origGrammar);
diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.h b/alib2algo/src/grammar/simplify/EpsilonRemover.h
index c750fb2dc104ca0eb3471947720349cdc162b290..3b9cf5d06a1f30a211648e494fd95ba7ddcee5c8 100644
--- a/alib2algo/src/grammar/simplify/EpsilonRemover.h
+++ b/alib2algo/src/grammar/simplify/EpsilonRemover.h
@@ -34,7 +34,7 @@ public:
 
 	static grammar::EpsilonFreeCFG < > remove( const grammar::CFG < > & grammar );
 	static grammar::EpsilonFreeCFG < > remove( const grammar::EpsilonFreeCFG < > & grammar );
-	static grammar::GNF remove( const grammar::GNF & grammar );
+	static grammar::GNF < > remove( const grammar::GNF < > & grammar );
 	static grammar::CNF < > remove( const grammar::CNF < > & grammar );
 	static grammar::EpsilonFreeCFG < > remove( const grammar::LG & grammar );
 	static grammar::EpsilonFreeCFG < > remove( const grammar::LeftLG & grammar );
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
index 93998afb698fd0fb333e9dfb4ce932b76c99441f..9e46c2a44bb326f5cbf99d17457c1abd2e40e0b4 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
@@ -148,11 +148,11 @@ grammar::EpsilonFreeCFG < > LeftRecursionRemover::remove(const grammar::CNF < >
 
 auto LeftRecursionRemoverCNF = LeftRecursionRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::CNF < > >(LeftRecursionRemover::remove);
 
-grammar::GNF LeftRecursionRemover::remove(const grammar::GNF& origGrammar) {
+grammar::GNF < > LeftRecursionRemover::remove(const grammar::GNF < > & origGrammar) {
 	return origGrammar;
 }
 
-auto LeftRecursionRemoverGNF = LeftRecursionRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(LeftRecursionRemover::remove);
+auto LeftRecursionRemoverGNF = LeftRecursionRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(LeftRecursionRemover::remove);
 
 grammar::RightRG LeftRecursionRemover::remove(const grammar::RightRG& origGrammar) {
 	return origGrammar;
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
index 085891a4cc9d368a6224572c0818f18000518e29..43513684e3a5dcd14033abb9bf2573b4a1adbe99 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
@@ -34,7 +34,7 @@ public:
 
 	static grammar::EpsilonFreeCFG < > remove( const grammar::EpsilonFreeCFG < > & grammar );
 	static grammar::EpsilonFreeCFG < > remove( const grammar::CNF < > & grammar );
-	static grammar::GNF remove( const grammar::GNF & grammar );
+	static grammar::GNF < > remove( const grammar::GNF < > & grammar );
 	static grammar::RightRG remove( const grammar::RightRG & grammar );
 	static grammar::RightLG remove( const grammar::RightLG & grammar );
 	static grammar::RightRG remove( const grammar::LeftRG & grammar );
diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
index 69b5de52d98685af10822e01c117fcd73852d11d..16b9aa51e4d4c94fca71f8222464014953f182dc 100644
--- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
+++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
@@ -85,11 +85,11 @@ grammar::CNF < > SimpleRulesRemover::remove(const grammar::CNF < > & origGrammar
 
 auto SimpleRulesRemoverCNF = SimpleRulesRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(SimpleRulesRemover::remove);
 
-grammar::GNF SimpleRulesRemover::remove(const grammar::GNF& origGrammar) {
+grammar::GNF < > SimpleRulesRemover::remove(const grammar::GNF < > & origGrammar) {
 	return origGrammar;
 }
 
-auto SimpleRulesRemoverGNF = SimpleRulesRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(SimpleRulesRemover::remove);
+auto SimpleRulesRemoverGNF = SimpleRulesRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(SimpleRulesRemover::remove);
 
 grammar::LG SimpleRulesRemover::remove(const grammar::LG& origGrammar) {
 	return removeNonEpsilonFree(origGrammar);
diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h
index ef1d51fdf8636d296868ad8e047d2d90fd456ae6..3b81011a10f421f5f91b9ddef977fc4a0f380846 100644
--- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h
+++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h
@@ -34,7 +34,7 @@ public:
 
 	static grammar::CFG < > remove( const grammar::CFG < > & grammar );
 	static grammar::EpsilonFreeCFG < > remove( const grammar::EpsilonFreeCFG < > & grammar );
-	static grammar::GNF remove( const grammar::GNF & grammar );
+	static grammar::GNF < > remove( const grammar::GNF < > & grammar );
 	static grammar::CNF < > remove( const grammar::CNF < > & grammar );
 	static grammar::LG remove( const grammar::LG & grammar );
 	static grammar::LeftLG remove( const grammar::LeftLG & grammar );
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index bbdd2d2e612baf746823e3c4c8f0c5a9812dca48..f49c05ae388dab1bb9ae4934bfd323ae34391ba8 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -135,11 +135,11 @@ grammar::CNF < > ToCNF::convert(const grammar::CNF < > & origGrammar) {
 
 auto ToCNFCNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(ToCNF::convert);
 
-grammar::CNF < > ToCNF::convert(const grammar::GNF& origGrammar) {
+grammar::CNF < > ToCNF::convert(const grammar::GNF < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-auto ToCNFGNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::GNF>(ToCNF::convert);
+auto ToCNFGNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::GNF < > >(ToCNF::convert);
 
 grammar::CNF < > ToCNF::convert(const grammar::LG& origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h
index 0c1d79965be745d610c81257bff860b25d20647d..a933ce220344b2ad0fa5b1cf23fa574f37da7303 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.h
+++ b/alib2algo/src/grammar/simplify/ToCNF.h
@@ -34,7 +34,7 @@ public:
 
 	static grammar::CNF < > convert( const grammar::CFG < > & grammar );
 	static grammar::CNF < > convert( const grammar::EpsilonFreeCFG < > & grammar );
-	static grammar::CNF < > convert( const grammar::GNF & grammar );
+	static grammar::CNF < > convert( const grammar::GNF < > & grammar );
 	static grammar::CNF < > convert( const grammar::CNF < > & grammar );
 	static grammar::CNF < > convert( const grammar::LG & grammar );
 	static grammar::CNF < > convert( const grammar::LeftLG & grammar );
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index e6fac9c785e509a66ca44326320f30c565f60914..9d0138067c3f323ccc6fbf2ac553303b72a71092 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -46,7 +46,7 @@ grammar::EpsilonFreeCFG < > assignNonterminals(const grammar::EpsilonFreeCFG < >
 	return res;
 }
 
-grammar::GNF convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar ) {
+grammar::GNF < > convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar ) {
 	grammar::EpsilonFreeCFG < > step(origGrammar);
 	while(true) {
 		grammar::EpsilonFreeCFG < > nextStep = assignNonterminals(step);
@@ -55,7 +55,7 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar )
 		step = std::move(nextStep);
 	}
 
-	grammar::GNF res(step.getInitialSymbol());
+	grammar::GNF < > res(step.getInitialSymbol());
 	res.setTerminalAlphabet(step.getTerminalAlphabet());
 	res.setNonterminalAlphabet(step.getNonterminalAlphabet());
 	res.setGeneratesEpsilon(step.getGeneratesEpsilon());
@@ -87,41 +87,41 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar )
 	return res;
 }
 
-grammar::GNF ToGNF::convert(const grammar::CFG < > & origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::CFG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
-auto ToGNFCFG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::CFG < > >(ToGNF::convert);
+auto ToGNFCFG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::CFG < > >(ToGNF::convert);
 
-grammar::GNF ToGNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(origGrammar)));
 }
 
-auto ToGNFEpsilonFreeCFG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::EpsilonFreeCFG < > >(ToGNF::convert);
+auto ToGNFEpsilonFreeCFG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::EpsilonFreeCFG < > >(ToGNF::convert);
 
-grammar::GNF ToGNF::convert(const grammar::CNF < > & origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::CNF < > & origGrammar) {
 	return convertInternal(grammar::simplify::LeftRecursionRemover::remove(origGrammar));
 }
 
-auto ToGNFCNF = ToGNF::RegistratorWrapper<grammar::GNF, grammar::CNF < > >(ToGNF::convert);
+auto ToGNFCNF = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::CNF < > >(ToGNF::convert);
 
-grammar::GNF ToGNF::convert(const grammar::GNF& origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::GNF < > & origGrammar) {
 	return origGrammar;
 }
 
-auto ToGNFGNF = ToGNF::RegistratorWrapper<grammar::GNF, grammar::GNF>(ToGNF::convert);
+auto ToGNFGNF = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(ToGNF::convert);
 
-grammar::GNF ToGNF::convert(const grammar::LG& origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::LG& origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
-auto ToGNFLG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::LG>(ToGNF::convert);
+auto ToGNFLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::LG>(ToGNF::convert);
 
-grammar::GNF ToGNF::convert(const grammar::LeftLG& origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::LeftLG& origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
-auto ToGNFLeftLG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::LeftLG>(ToGNF::convert);
+auto ToGNFLeftLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::LeftLG>(ToGNF::convert);
 
 grammar::RightRG ToGNF::convert(const grammar::LeftRG& origGrammar) {
 	return convert::ToGrammarRightRG::convert(origGrammar);
@@ -129,11 +129,11 @@ grammar::RightRG ToGNF::convert(const grammar::LeftRG& origGrammar) {
 
 auto ToGNFLeftRG = ToGNF::RegistratorWrapper<grammar::RightRG, grammar::LeftRG>(ToGNF::convert);
 
-grammar::GNF ToGNF::convert(const grammar::RightLG& origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::RightLG& origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
-auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::RightLG>(ToGNF::convert);
+auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::RightLG>(ToGNF::convert);
 
 grammar::RightRG ToGNF::convert(const grammar::RightRG& origGrammar) {
 	return origGrammar;
diff --git a/alib2algo/src/grammar/simplify/ToGNF.h b/alib2algo/src/grammar/simplify/ToGNF.h
index 022ed759e6fff62129323c5aaed13fa1c3f3391d..42ad2e2bb343be3d0e5686d8b09b1f3a30f74f87 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.h
+++ b/alib2algo/src/grammar/simplify/ToGNF.h
@@ -32,14 +32,14 @@ class ToGNF : public std::SingleDispatch<ToGNF, grammar::Grammar, const grammar:
 public:
 	static grammar::Grammar convert( const grammar::Grammar & grammar );
 
-	static grammar::GNF convert( const grammar::CFG < > & grammar );
-	static grammar::GNF convert( const grammar::EpsilonFreeCFG < > & grammar );
-	static grammar::GNF convert( const grammar::CNF < > & grammar );
-	static grammar::GNF convert( const grammar::GNF & grammar );
-	static grammar::GNF convert( const grammar::LG & grammar );
-	static grammar::GNF convert( const grammar::LeftLG & grammar );
+	static grammar::GNF < > convert( const grammar::CFG < > & grammar );
+	static grammar::GNF < > convert( const grammar::EpsilonFreeCFG < > & grammar );
+	static grammar::GNF < > convert( const grammar::CNF < > & grammar );
+	static grammar::GNF < > convert( const grammar::GNF < > & grammar );
+	static grammar::GNF < > convert( const grammar::LG & grammar );
+	static grammar::GNF < > convert( const grammar::LeftLG & grammar );
 	static grammar::RightRG convert( const grammar::LeftRG & grammar );
-	static grammar::GNF convert( const grammar::RightLG & grammar );
+	static grammar::GNF < > convert( const grammar::RightLG & grammar );
 	static grammar::RightRG convert( const grammar::RightRG & grammar );
 };
 
diff --git a/alib2algo/src/grammar/simplify/Trim.cpp b/alib2algo/src/grammar/simplify/Trim.cpp
index 2285218ef7930fbc1a0acdfff1c0527ec59cd008..a1cf13b050fa8f079bcfbf033ae4800cafb5f9e2 100644
--- a/alib2algo/src/grammar/simplify/Trim.cpp
+++ b/alib2algo/src/grammar/simplify/Trim.cpp
@@ -31,7 +31,7 @@ T Trim::trim( const T & grammar ) {
 
 auto TrimCFG = Trim::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(Trim::trim);
 auto TrimEpsilonFreeCFG = Trim::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(Trim::trim);
-auto TrimGNF = Trim::RegistratorWrapper<grammar::GNF, grammar::GNF>(Trim::trim);
+auto TrimGNF = Trim::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(Trim::trim);
 auto TrimCNF = Trim::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(Trim::trim);
 auto TrimLG = Trim::RegistratorWrapper<grammar::LG, grammar::LG>(Trim::trim);
 auto TrimLeftLG = Trim::RegistratorWrapper<grammar::LeftLG, grammar::LeftLG>(Trim::trim);
diff --git a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
index a4b996120d46f06363beabd47bc37026d818c223..3aa2efdaca9d59d48bbd59722638b11e74fe75d2 100644
--- a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
+++ b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
@@ -62,7 +62,7 @@ T UnproductiveSymbolsRemover::remove( const T & grammar ) {
 
 auto UnproductiveSymbolsRemoverCFG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverEpsilonFreeCFG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverGNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(UnproductiveSymbolsRemover::remove);
+auto UnproductiveSymbolsRemoverGNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverCNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LG, grammar::LG>(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverLeftLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftLG, grammar::LeftLG>(UnproductiveSymbolsRemover::remove);
diff --git a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
index 2ee301db4935144b479055ae53dd25f76d9effc7..d9492f74b071932ad234f5f708f5b84a14a0e7a6 100644
--- a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
+++ b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
@@ -61,7 +61,7 @@ T UnreachableSymbolsRemover::remove( const T & grammar) {
 
 auto UnreachableSymbolsRemoverCFG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverEpsilonFreeCFG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverGNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(UnreachableSymbolsRemover::remove);
+auto UnreachableSymbolsRemoverGNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverCNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LG, grammar::LG>(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverLeftLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftLG, grammar::LeftLG>(UnreachableSymbolsRemover::remove);
diff --git a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
index 83c59ee9cef83011cc6b6b32983ca2a3bf6fa73b..50ef9c98ba105a436783d536947677f9f6076099 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
@@ -36,9 +36,9 @@ void GrammarToGNFTest::testRemoveToGNFRules1() {
 	alphabet::Symbol aprimed = createUniqueSymbol(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 	alphabet::Symbol bprimed = createUniqueSymbol(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
-	grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
-	grammar::GNF grammar3(S);
+	grammar::GNF < > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, B, C, D, aprimed, bprimed});
 	grammar3.setTerminalAlphabet({a, b});
 	grammar3.addRule(aprimed, std::make_pair(a, std::vector<alphabet::Symbol>{}));
@@ -76,9 +76,9 @@ void GrammarToGNFTest::testRemoveToGNFRules2() {
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
-	grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
-	grammar::GNF grammar3(S);
+	grammar::GNF < > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, Aprimed, B, C, D, aprimed, bprimed, cprimed});
 	grammar3.setTerminalAlphabet({a, b, c});
 	grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{Aprimed}));
@@ -124,9 +124,9 @@ void GrammarToGNFTest::testRemoveToGNFRules3() {
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
-	grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
-	grammar::GNF grammar3(S);
+	grammar::GNF < > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, B, Bprimed, C, aprimed, bprimed, cprimed});
 	grammar3.setTerminalAlphabet({a, b, c});
 	grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{}));
@@ -168,7 +168,7 @@ void GrammarToGNFTest::testRemoveToGNFRules4() {
 	grammar1.addRule(C, {C, C});
 	grammar1.addRule(C, {a});
 
-	grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
 	CPPUNIT_ASSERT(grammar::generate::GenerateUpToLength::generate(grammar1, 7) == grammar::generate::GenerateUpToLength::generate(grammar2, 7));
 }
diff --git a/alib2data/src/grammar/ContextFree/GNF.cpp b/alib2data/src/grammar/ContextFree/GNF.cpp
index eb57ebe390e61073f6992c0892220706e117bcc5..c4ce05df60bdc199e4d41fc80fb36fe48275cd3b 100644
--- a/alib2data/src/grammar/ContextFree/GNF.cpp
+++ b/alib2data/src/grammar/ContextFree/GNF.cpp
@@ -6,193 +6,13 @@
  */
 
 #include "GNF.h"
-#include <algorithm>
-#include <sstream>
-
-#include "../../alphabet/Symbol.h"
-
-#include <sax/FromXMLParserHelper.h>
-#include "../common/GrammarFromXMLParser.h"
-#include "../common/GrammarToXMLComposer.h"
 #include "../Grammar.h"
 #include <object/Object.h>
 #include <XmlApi.hpp>
 
-namespace grammar {
-
-GNF::GNF ( alphabet::Symbol initialSymbol ) : GNF ( std::set < alphabet::Symbol > { initialSymbol }, std::set < alphabet::Symbol > ( ), initialSymbol ) {
-}
-
-GNF::GNF ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components < GNF, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ), generatesEpsilon ( false ) {
-}
-
-GrammarBase * GNF::clone ( ) const {
-	return new GNF ( * this );
-}
-
-GrammarBase * GNF::plunder ( ) && {
-	return new GNF ( std::move ( * this ) );
-}
-
-bool GNF::addRule ( alphabet::Symbol leftHandSide, std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > rightHandSide ) {
-	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
-		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
-
-	if ( !getTerminalAlphabet ( ).count ( rightHandSide.first ) )
-		throw GrammarException ( "Rule must rewrite to terminal symbol" );
-
-	for ( const alphabet::Symbol & rhsNTs : rightHandSide.second )
-		if ( !getNonterminalAlphabet ( ).count ( rhsNTs ) )
-			throw GrammarException ( "Symbol \"" + std::to_string ( rhsNTs ) + "\" is not a nonterminal symbol" );
-
-	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
-}
-
-const std::map < alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & GNF::getRules ( ) const {
-	return rules;
-}
-
-bool GNF::removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rightHandSide ) {
-	return rules[leftHandSide].erase ( rightHandSide );
-}
-
-bool GNF::addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) {
-	if ( rightHandSide.size ( ) == 0 ) {
-		if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" );
-
-		bool res = getGeneratesEpsilon ( );
-		setGeneratesEpsilon ( true );
-		return !res;
-	} else {
-		alphabet::Symbol first = std::move ( rightHandSide[0] );
-		std::vector < alphabet::Symbol > rest ( std::make_move_iterator ( rightHandSide.begin ( ) ) + 1, std::make_move_iterator ( rightHandSide.end ( ) ) );
-		return addRule ( std::move ( leftHandSide ), std::make_pair ( std::move ( first ), std::move ( rest ) ) );
-	}
-}
-
-std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > GNF::getRawRules ( ) const {
-	std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > res;
-
-	for ( const auto & rule : getRules ( ) )
-		for ( const auto & rhs : rule.second ) {
-			std::vector < alphabet::Symbol > tmp { rhs.first };
-			tmp.insert ( tmp.end ( ), rhs.second.begin ( ), rhs.second.end ( ) );
-			res[rule.first].insert ( std::move ( tmp ) );
-		}
-
-	if ( getGeneratesEpsilon ( ) )
-		res[getInitialSymbol ( )].insert ( std::vector < alphabet::Symbol > { } );
-
-	return res;
-}
-
-bool GNF::removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) {
-	if ( rightHandSide.size ( ) == 0 ) {
-		if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" );
-
-		bool res = getGeneratesEpsilon ( );
-		setGeneratesEpsilon ( false );
-		return res;
-	} else {
-		alphabet::Symbol first = rightHandSide[0];
-		std::vector < alphabet::Symbol > rest ( rightHandSide.begin ( ) + 1, rightHandSide.end ( ) );
-		return removeRule ( leftHandSide, std::make_pair ( first, rest ) );
-	}
-}
-
-void GNF::setGeneratesEpsilon ( bool genEps ) {
-	generatesEpsilon = genEps;
-}
-
-bool GNF::getGeneratesEpsilon ( ) const {
-	return generatesEpsilon;
-}
-
-int GNF::compare ( const GNF & other ) const {
-	auto first = std::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
-	auto second = std::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
-
-	std::compare < decltype ( first ) > comp;
-
-	return comp ( first, second );
-}
-
-void GNF::operator >>( std::ostream & out ) const {
-	out << "(GNF "
-	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
-	    << "terminalAlphabet = " << getTerminalAlphabet ( )
-	    << "initialSymbol = " << getInitialSymbol ( )
-	    << "rules = " << rules << ")";
-}
-
-GNF::operator std::string ( ) const {
-	std::stringstream ss;
-	ss << * this;
-	return ss.str ( );
-}
-
-GNF GNF::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, GNF::getXmlTagName() );
-
-	std::set < alphabet::Symbol > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
-	std::set < alphabet::Symbol > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
-	alphabet::Symbol initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
-
-	GNF grammar ( std::move ( initialSymbol ) );
-
-	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
-	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
-
-	GrammarFromXMLParser::parseRules ( input, grammar );
-
-	bool generatesEpsilon = GrammarFromXMLParser::parseGeneratesEpsilon ( input );
-	grammar.setGeneratesEpsilon ( generatesEpsilon );
-
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, GNF::getXmlTagName() );
-	return grammar;
-}
-
-void GNF::parseRule ( std::deque < sax::Token >::iterator & input, GNF & grammar ) {
-	alphabet::Symbol lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input );
-	std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > rhs = GrammarFromXMLParser::parseRuleGNFRHS ( input );
-
-	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
-}
-
-void GNF::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
-
-	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
-	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
-	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
-	composeRules ( out );
-	GrammarToXMLComposer::composeGeneratesEpsilon ( out, this->getGeneratesEpsilon ( ) );
-
-	out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
-}
-
-void GNF::composeRules ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
-
-	for ( const auto & rule : this->getRules ( ) )
-
-		for ( const auto & rhs : rule.second ) {
-			out.emplace_back ( "rule", sax::Token::TokenType::START_ELEMENT );
-
-			GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, rule.first );
-			GrammarToXMLComposer::composeRuleGNFRHS ( out, rhs );
-
-			out.emplace_back ( "rule", sax::Token::TokenType::END_ELEMENT );
-		}
-
-	out.emplace_back ( "rules", sax::Token::TokenType::END_ELEMENT );
-}
-
-} /* namespace grammar */
-
 namespace alib {
 
-auto GNFParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::GNF > ( );
-auto GNFParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::GNF > ( );
+auto GNFParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::GNF < > > ( );
+auto GNFParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::GNF < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/grammar/ContextFree/GNF.h b/alib2data/src/grammar/ContextFree/GNF.h
index 9b93b2f3453268026660c9d0c5f11859d4777f1a..11f3ef8905d24b76b0bc7ef18913f8744c4171ca 100644
--- a/alib2data/src/grammar/ContextFree/GNF.h
+++ b/alib2data/src/grammar/ContextFree/GNF.h
@@ -8,12 +8,19 @@
 #ifndef GNF_H_
 #define GNF_H_
 
-#include "../GrammarException.h"
-#include "../GrammarBase.h"
 #include <map>
 #include <vector>
+#include <algorithm>
+#include <sstream>
+
 #include <core/components.hpp>
-#include "../../alphabet/Symbol.h"
+#include <sax/FromXMLParserHelper.h>
+
+#include "../GrammarBase.h"
+#include "../GrammarFeatures.h"
+#include "../GrammarException.h"
+#include "../common/GrammarFromXMLParser.h"
+#include "../common/GrammarToXMLComposer.h"
 
 namespace grammar {
 
@@ -24,61 +31,62 @@ class TerminalAlphabet;
 class NonterminalAlphabet;
 class InitialSymbol;
 
-class GNF : public GrammarBase, public std::Components < GNF, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
-	std::map < alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > rules;
+template < class SymbolType >
+class GNF : public GrammarBase, public std::Components < GNF < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
+	std::map < SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > rules;
 	bool generatesEpsilon;
 
 public:
-	explicit GNF ( alphabet::Symbol initialSymbol );
+	explicit GNF ( SymbolType initialSymbol );
 
-	explicit GNF ( std::set < alphabet::Symbol > nonTerminalSymbols, std::set < alphabet::Symbol > terminalSymbols, alphabet::Symbol initialSymbol );
+	explicit GNF ( std::set < SymbolType > nonTerminalSymbols, std::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
 
 	virtual GrammarBase * clone ( ) const;
 
 	virtual GrammarBase * plunder ( ) &&;
 
-	bool addRule ( alphabet::Symbol leftHandSide, std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > rightHandSide );
+	bool addRule ( SymbolType leftHandSide, std::pair < SymbolType, std::vector < SymbolType > > rightHandSide );
 
-	const std::map < alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & getRules ( ) const;
+	const std::map < SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & getRules ( ) const;
 
-	bool removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rightHandSide );
+	bool removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, std::vector < SymbolType > > & rightHandSide );
 
-	bool addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide );
+	bool addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide );
 
-	std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > getRawRules ( ) const;
+	std::map < SymbolType, std::set < std::vector < SymbolType > > > getRawRules ( ) const;
 
-	bool removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide );
+	bool removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide );
 
-	const alphabet::Symbol & getInitialSymbol ( ) const {
-		return accessElement < InitialSymbol > ( ).get ( );
+	const SymbolType & getInitialSymbol ( ) const {
+		return this->template accessElement < InitialSymbol > ( ).get ( );
 	}
 
-	bool setInitialSymbol ( alphabet::Symbol symbol ) {
-		return accessElement < InitialSymbol > ( ).set ( std::move ( symbol ) );
+	bool setInitialSymbol ( SymbolType symbol ) {
+		return this->template accessElement < InitialSymbol > ( ).set ( std::move ( symbol ) );
 	}
 
-	const std::set < alphabet::Symbol > & getNonterminalAlphabet ( ) const {
-		return accessComponent < NonterminalAlphabet > ( ).get ( );
+	const std::set < SymbolType > & getNonterminalAlphabet ( ) const {
+		return this->template accessComponent < NonterminalAlphabet > ( ).get ( );
 	}
 
-	bool addNonterminalSymbol ( alphabet::Symbol symbol ) {
-		return accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
+	bool addNonterminalSymbol ( SymbolType symbol ) {
+		return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
-	void setNonterminalAlphabet ( std::set < alphabet::Symbol > symbols ) {
-		accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
+	void setNonterminalAlphabet ( std::set < SymbolType > symbols ) {
+		this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
-	const std::set < alphabet::Symbol > & getTerminalAlphabet ( ) const {
-		return accessComponent < TerminalAlphabet > ( ).get ( );
+	const std::set < SymbolType > & getTerminalAlphabet ( ) const {
+		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
-	bool addTerminalSymbol ( alphabet::Symbol symbol ) {
-		return accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
+	bool addTerminalSymbol ( SymbolType symbol ) {
+		return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
-	void setTerminalAlphabet ( std::set < alphabet::Symbol > symbols ) {
-		accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
+	void setTerminalAlphabet ( std::set < SymbolType > symbols ) {
+		this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
 	void setGeneratesEpsilon ( bool genEps );
@@ -110,69 +118,256 @@ public:
 	void composeRules ( std::deque < sax::Token > & out ) const;
 };
 
+template < class SymbolType >
+GNF < SymbolType >::GNF ( SymbolType initialSymbol ) : GNF ( std::set < SymbolType > { initialSymbol }, std::set < SymbolType > ( ), initialSymbol ) {
+}
+
+template < class SymbolType >
+GNF < SymbolType >::GNF ( std::set < SymbolType > nonterminalAlphabet, std::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : std::Components < GNF, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ), generatesEpsilon ( false ) {
+}
+
+template < class SymbolType >
+GrammarBase * GNF < SymbolType >::clone ( ) const {
+	return new GNF ( * this );
+}
+
+template < class SymbolType >
+GrammarBase * GNF < SymbolType >::plunder ( ) && {
+	return new GNF ( std::move ( * this ) );
+}
+
+template < class SymbolType >
+bool GNF < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < SymbolType, std::vector < SymbolType > > rightHandSide ) {
+	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
+		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
+
+	if ( !getTerminalAlphabet ( ).count ( rightHandSide.first ) )
+		throw GrammarException ( "Rule must rewrite to terminal symbol" );
+
+	for ( const SymbolType & rhsNTs : rightHandSide.second )
+		if ( !getNonterminalAlphabet ( ).count ( rhsNTs ) )
+			throw GrammarException ( "Symbol \"" + std::to_string ( rhsNTs ) + "\" is not a nonterminal symbol" );
+
+	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
+}
+
+template < class SymbolType >
+const std::map < SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & GNF < SymbolType >::getRules ( ) const {
+	return rules;
+}
+
+template < class SymbolType >
+bool GNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, std::vector < SymbolType > > & rightHandSide ) {
+	return rules[leftHandSide].erase ( rightHandSide );
+}
+
+template < class SymbolType >
+bool GNF < SymbolType >::addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) {
+	if ( rightHandSide.size ( ) == 0 ) {
+		if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" );
+
+		bool res = getGeneratesEpsilon ( );
+		setGeneratesEpsilon ( true );
+		return !res;
+	} else {
+		SymbolType first = std::move ( rightHandSide[0] );
+		std::vector < SymbolType > rest ( std::make_move_iterator ( rightHandSide.begin ( ) ) + 1, std::make_move_iterator ( rightHandSide.end ( ) ) );
+		return addRule ( std::move ( leftHandSide ), std::make_pair ( std::move ( first ), std::move ( rest ) ) );
+	}
+}
+
+template < class SymbolType >
+std::map < SymbolType, std::set < std::vector < SymbolType > > > GNF < SymbolType >::getRawRules ( ) const {
+	std::map < SymbolType, std::set < std::vector < SymbolType > > > res;
+
+	for ( const auto & rule : getRules ( ) )
+		for ( const auto & rhs : rule.second ) {
+			std::vector < SymbolType > tmp { rhs.first };
+			tmp.insert ( tmp.end ( ), rhs.second.begin ( ), rhs.second.end ( ) );
+			res[rule.first].insert ( std::move ( tmp ) );
+		}
+
+	if ( getGeneratesEpsilon ( ) )
+		res[getInitialSymbol ( )].insert ( std::vector < SymbolType > { } );
+
+	return res;
+}
+
+template < class SymbolType >
+bool GNF < SymbolType >::removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) {
+	if ( rightHandSide.size ( ) == 0 ) {
+		if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" );
+
+		bool res = getGeneratesEpsilon ( );
+		setGeneratesEpsilon ( false );
+		return res;
+	} else {
+		SymbolType first = rightHandSide[0];
+		std::vector < SymbolType > rest ( rightHandSide.begin ( ) + 1, rightHandSide.end ( ) );
+		return removeRule ( leftHandSide, std::make_pair ( first, rest ) );
+	}
+}
+
+template < class SymbolType >
+void GNF < SymbolType >::setGeneratesEpsilon ( bool genEps ) {
+	generatesEpsilon = genEps;
+}
+
+template < class SymbolType >
+bool GNF < SymbolType >::getGeneratesEpsilon ( ) const {
+	return generatesEpsilon;
+}
+
+template < class SymbolType >
+int GNF < SymbolType >::compare ( const GNF & other ) const {
+	auto first = std::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
+	auto second = std::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
+
+	std::compare < decltype ( first ) > comp;
+
+	return comp ( first, second );
+}
+
+template < class SymbolType >
+void GNF < SymbolType >::operator >>( std::ostream & out ) const {
+	out << "(GNF "
+	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
+	    << "terminalAlphabet = " << getTerminalAlphabet ( )
+	    << "initialSymbol = " << getInitialSymbol ( )
+	    << "rules = " << rules << ")";
+}
+
+template < class SymbolType >
+GNF < SymbolType >::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << * this;
+	return ss.str ( );
+}
+
+template < class SymbolType >
+GNF < SymbolType > GNF < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, GNF::getXmlTagName() );
+
+	std::set < SymbolType > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
+	std::set < SymbolType > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
+	SymbolType initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
+
+	GNF < SymbolType > grammar ( std::move ( initialSymbol ) );
+
+	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
+	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
+
+	GrammarFromXMLParser::parseRules ( input, grammar );
+
+	bool generatesEpsilon = GrammarFromXMLParser::parseGeneratesEpsilon ( input );
+	grammar.setGeneratesEpsilon ( generatesEpsilon );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, GNF::getXmlTagName() );
+	return grammar;
+}
+
+template < class SymbolType >
+void GNF < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, GNF & grammar ) {
+	SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input );
+	std::pair < SymbolType, std::vector < SymbolType > > rhs = GrammarFromXMLParser::parseRuleGNFRHS ( input );
+
+	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
+}
+
+template < class SymbolType >
+void GNF < SymbolType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
+
+	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
+	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
+	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
+	composeRules ( out );
+	GrammarToXMLComposer::composeGeneratesEpsilon ( out, this->getGeneratesEpsilon ( ) );
+
+	out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
+}
+
+template < class SymbolType >
+void GNF < SymbolType >::composeRules ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
+
+	for ( const auto & rule : this->getRules ( ) )
+
+		for ( const auto & rhs : rule.second ) {
+			out.emplace_back ( "rule", sax::Token::TokenType::START_ELEMENT );
+
+			GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, rule.first );
+			GrammarToXMLComposer::composeRuleGNFRHS ( out, rhs );
+
+			out.emplace_back ( "rule", sax::Token::TokenType::END_ELEMENT );
+		}
+
+	out.emplace_back ( "rules", sax::Token::TokenType::END_ELEMENT );
+}
+
 } /* namespace grammar */
 
 namespace std {
 
-template < >
-class ComponentConstraint< grammar::GNF, alphabet::Symbol, grammar::TerminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
 public:
-	static bool used ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & rule : grammar.getRules ( ) )
-			for ( const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rhs : rule.second )
+	static bool used ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & rule : grammar.getRules ( ) )
+			for ( const std::pair < SymbolType, std::vector < SymbolType > > & rhs : rule.second )
 				if ( rhs.first == symbol )
 					return true;
 
 		return false;
 	}
 
-	static bool available ( const grammar::GNF &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::GNF < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+		if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + std::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
 	}
 };
 
-template < >
-class ComponentConstraint< grammar::GNF, alphabet::Symbol, grammar::NonterminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
 public:
-	static bool used ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rhs : rule.second )
+			for ( const std::pair < SymbolType, std::vector < SymbolType > > & rhs : rule.second )
 				if ( std::find ( rhs.second.begin ( ), rhs.second.end ( ), symbol ) != rhs.second.end ( ) )
 					return true;
 		}
 
-		if ( grammar.accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
+		if ( grammar.template accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
 			return true;
 
 		return false;
 	}
 
-	static bool available ( const grammar::GNF &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::GNF < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+		if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + std::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
 	}
 };
 
-template < >
-class ElementConstraint< grammar::GNF, alphabet::Symbol, grammar::InitialSymbol > {
+template < class SymbolType >
+class ElementConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::InitialSymbol > {
 public:
-	static bool available ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) {
-		return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const grammar::GNF &, const alphabet::Symbol & ) {
+	static void valid ( const grammar::GNF < SymbolType > &, const SymbolType & ) {
 	}
 };
 
diff --git a/alib2data/src/grammar/GrammarFeatures.h b/alib2data/src/grammar/GrammarFeatures.h
index 74736f17ab40be53929abb6e2a46a65e01b44555..2a248b92911c4177d0f96d755667da2798355c9b 100644
--- a/alib2data/src/grammar/GrammarFeatures.h
+++ b/alib2data/src/grammar/GrammarFeatures.h
@@ -42,6 +42,7 @@ template<class SymbolType = typename alphabet::Symbol >
 class EpsilonFreeCFG;
 template<class SymbolType = typename alphabet::Symbol >
 class CNF;
+template<class SymbolType = typename alphabet::Symbol >
 class GNF;
 class CSG;
 class NonContractingGrammar;
diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp
index 26123aa32fa92691beeaf3c26f16c8d4195f55ce..1be85f15ff61a2141d93da42eab43fe5bb588271 100644
--- a/alib2data/test-src/grammar/GrammarTest.cpp
+++ b/alib2data/test-src/grammar/GrammarTest.cpp
@@ -263,7 +263,7 @@ void GrammarTest::testContextFreeParser() {
 		}
 	}
 	{
-		grammar::GNF grammar(alphabet::symbolFrom(1));
+		grammar::GNF < > grammar(alphabet::symbolFrom(1));
 
 		grammar.addNonterminalSymbol(alphabet::symbolFrom(1));
 		grammar.addNonterminalSymbol(alphabet::symbolFrom(2));
@@ -285,7 +285,7 @@ void GrammarTest::testContextFreeParser() {
 
 			std::deque<sax::Token> tokens2;
 			sax::SaxParseInterface::parseMemory(tmp, tokens2);
-			grammar::GNF grammar2 = alib::XmlDataFactory::fromTokens<grammar::GNF>(std::move(tokens2));
+			grammar::GNF < > grammar2 = alib::XmlDataFactory::fromTokens<grammar::GNF < > >(std::move(tokens2));
 
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
diff --git a/alib2str/src/grammar/GrammarFromStringParser.cpp b/alib2str/src/grammar/GrammarFromStringParser.cpp
index 8046cf1a632b0b1c683f7308f0cd0149f76660d2..5943290aad7bc76525ae65f77deebe2939b3b503 100644
--- a/alib2str/src/grammar/GrammarFromStringParser.cpp
+++ b/alib2str/src/grammar/GrammarFromStringParser.cpp
@@ -512,13 +512,13 @@ EpsilonFreeCFG < > GrammarFromStringParser::parseEpsilonFreeCFG(std::istream& in
 	return parseCFLikeGrammar<EpsilonFreeCFG < > >(input);
 }
 
-GNF GrammarFromStringParser::parseGNF(std::istream& input) const {
+GNF < > GrammarFromStringParser::parseGNF(std::istream& input) const {
 	GrammarFromStringLexer::Token token = m_GrammarLexer.next(input);
 	if(token.type != GrammarFromStringLexer::TokenType::GNF) {
 		throw exception::CommonException("Unrecognised GNF token.");
 	}
 
-	return parseCFLikeGrammar<GNF>(input);
+	return parseCFLikeGrammar<GNF < > >(input);
 }
 
 CNF < > GrammarFromStringParser::parseCNF(std::istream& input) const {
diff --git a/alib2str/src/grammar/GrammarFromStringParser.h b/alib2str/src/grammar/GrammarFromStringParser.h
index ea6c2fcdc1a5a8bfdffedcf9c5d8cd503799654a..6c825dbf7050559fd0a8c5930264648793ecf220 100644
--- a/alib2str/src/grammar/GrammarFromStringParser.h
+++ b/alib2str/src/grammar/GrammarFromStringParser.h
@@ -53,7 +53,7 @@ private:
 	LG parseLG(std::istream& input) const;
 	CFG < > parseCFG(std::istream& input) const;
 	EpsilonFreeCFG < > parseEpsilonFreeCFG(std::istream& input) const;
-	GNF parseGNF(std::istream& input) const;
+	GNF < > parseGNF(std::istream& input) const;
 	CNF < > parseCNF(std::istream& input) const;
 
 	NonContractingGrammar parseNonContractingGrammar(std::istream& input) const;
diff --git a/alib2str/src/grammar/GrammarToStringComposer.cpp b/alib2str/src/grammar/GrammarToStringComposer.cpp
index 6ecc53abf2847fe0935ec6040db95395e8a082c4..9b3ef3cf5c1f8d5c16c5c3150554fe922e15ad13 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.cpp
+++ b/alib2str/src/grammar/GrammarToStringComposer.cpp
@@ -240,12 +240,12 @@ void GrammarToStringComposer::compose(std::ostream& output, const CNF < > & gram
 
 GrammarToStringComposer::RegistratorWrapper<void, CNF < > > GrammarToStringComposerCNF = GrammarToStringComposer::RegistratorWrapper<void, CNF < > >(GrammarToStringComposer::compose);
 
-void GrammarToStringComposer::compose(std::ostream& output, const GNF& grammar) {
+void GrammarToStringComposer::compose(std::ostream& output, const GNF < > & grammar) {
 	output << "GNF";
 	composeCFLikeGrammar(output, grammar);
 }
 
-GrammarToStringComposer::RegistratorWrapper<void, GNF> GrammarToStringComposerGNF = GrammarToStringComposer::RegistratorWrapper<void, GNF>(GrammarToStringComposer::compose);
+GrammarToStringComposer::RegistratorWrapper<void, GNF < > > GrammarToStringComposerGNF = GrammarToStringComposer::RegistratorWrapper<void, GNF < > >(GrammarToStringComposer::compose);
 
 void GrammarToStringComposer::compose(std::ostream& output, const CSG& grammar) {
 	output << "CSG";
diff --git a/alib2str/src/grammar/GrammarToStringComposer.h b/alib2str/src/grammar/GrammarToStringComposer.h
index 0b8ce7eec4448b0f3436f82ea65791239a292f6f..b79246b0978b154adf5dc5b8558988f9924a4157 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.h
+++ b/alib2str/src/grammar/GrammarToStringComposer.h
@@ -32,7 +32,7 @@ public:
 	static void compose(std::ostream& output, const CFG < > & grammar);
 	static void compose(std::ostream& output, const EpsilonFreeCFG < > & grammar);
 	static void compose(std::ostream& output, const CNF < > & grammar);
-	static void compose(std::ostream& output, const GNF& grammar);
+	static void compose(std::ostream& output, const GNF < > & grammar);
 	static void compose(std::ostream& output, const CSG& grammar);
 	static void compose(std::ostream& output, const NonContractingGrammar& grammar);
 	static void compose(std::ostream& output, const ContextPreservingUnrestrictedGrammar& grammar);