diff --git a/alib2algo/test-src/grammar/simplify/GrammarEpsilonRemoverTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarEpsilonRemoverTest.cpp
index 40382fa8537e07c91a27e0e709befce0f4650cba..833c6544f98e08dded79a0084d076fe131f5a075 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarEpsilonRemoverTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarEpsilonRemoverTest.cpp
@@ -17,14 +17,14 @@ void GrammarEpsilonRemoverTest::tearDown() {
 }
 
 void GrammarEpsilonRemoverTest::testRemoveEpsilonRules1() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
 
 	grammar::CFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -40,16 +40,16 @@ void GrammarEpsilonRemoverTest::testRemoveEpsilonRules1() {
 }
 
 void GrammarEpsilonRemoverTest::testRemoveEpsilonRules2() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
-	alphabet::Symbol c = alphabet::Symbol('c');
-	alphabet::Symbol d = alphabet::Symbol('d');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
+	DefaultSymbolType c = DefaultSymbolType('c');
+	DefaultSymbolType d = DefaultSymbolType('d');
 
 	grammar::CFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -89,16 +89,16 @@ void GrammarEpsilonRemoverTest::testRemoveEpsilonRules2() {
 }
 
 void GrammarEpsilonRemoverTest::testRemoveEpsilonRules3() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
-
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
-	alphabet::Symbol c = alphabet::Symbol('c');
-	alphabet::Symbol d = alphabet::Symbol('d');
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
+
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
+	DefaultSymbolType c = DefaultSymbolType('c');
+	DefaultSymbolType d = DefaultSymbolType('d');
 
 	grammar::CFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
diff --git a/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp
index c339d118eb388417b2e437695d45ea4bb0b11e89..440d5a5a0c79c50e3b67ad9482f2002e69f105b7 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp
@@ -21,14 +21,14 @@ void GrammarLeftRecursionRemoverTest::tearDown() {
 }
 
 void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion1() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -44,15 +44,15 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion1() {
 }
 
 void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion2() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
-	alphabet::Symbol c = alphabet::Symbol('c');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
+	DefaultSymbolType c = DefaultSymbolType('c');
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -62,7 +62,7 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion2() {
 	grammar1.addRule(A, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Aprimed = common::createUnique(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType Aprimed = common::createUnique(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -87,14 +87,14 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion2() {
 }
 
 void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion3() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
-	alphabet::Symbol c = alphabet::Symbol('c');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
+	DefaultSymbolType c = DefaultSymbolType('c');
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C});
@@ -104,7 +104,7 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion3() {
 	grammar1.addRule(B, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -130,12 +130,12 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion3() {
 }
 
 void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion4() {
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
 
 	grammar::EpsilonFreeCFG < > grammar1(A);
 	grammar1.setNonterminalAlphabet({A, B, C});
@@ -148,8 +148,8 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion4() {
 	grammar1.addRule(C, {C, C});
 	grammar1.addRule(C, {a});
 
-	alphabet::Symbol Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol Cprimed = common::createUnique(C, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType Cprimed = common::createUnique(C, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -188,12 +188,12 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion4() {
 }
 
 void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion5() {
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
 
 	grammar::EpsilonFreeCFG < > grammar1(A);
 	grammar1.setNonterminalAlphabet({A, B, C});
diff --git a/alib2algo/test-src/grammar/simplify/GrammarSimpleRulesRemoverTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarSimpleRulesRemoverTest.cpp
index f9c5c3f7a953d42907d8a5f34ca3a5eb19f463fd..bc0b1b92a9120d8ee63237b287bc31741edcba77 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarSimpleRulesRemoverTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarSimpleRulesRemoverTest.cpp
@@ -19,14 +19,14 @@ void GrammarSimpleRulesRemoverTest::tearDown() {
 }
 
 void GrammarSimpleRulesRemoverTest::testRemoveSimpleRulesRules1() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
 
 	grammar::CFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -42,16 +42,16 @@ void GrammarSimpleRulesRemoverTest::testRemoveSimpleRulesRules1() {
 }
 
 void GrammarSimpleRulesRemoverTest::testRemoveSimpleRulesRules2() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
-	alphabet::Symbol c = alphabet::Symbol('c');
-	alphabet::Symbol d = alphabet::Symbol('d');
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
+	DefaultSymbolType c = DefaultSymbolType('c');
+	DefaultSymbolType d = DefaultSymbolType('d');
 
 	grammar::CFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -88,16 +88,16 @@ void GrammarSimpleRulesRemoverTest::testRemoveSimpleRulesRules2() {
 }
 
 void GrammarSimpleRulesRemoverTest::testRemoveSimpleRulesRules3() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
-
-	alphabet::Symbol a = alphabet::Symbol('a');
-	alphabet::Symbol b = alphabet::Symbol('b');
-	alphabet::Symbol c = alphabet::Symbol('c');
-	alphabet::Symbol d = alphabet::Symbol('d');
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
+
+	DefaultSymbolType a = DefaultSymbolType('a');
+	DefaultSymbolType b = DefaultSymbolType('b');
+	DefaultSymbolType c = DefaultSymbolType('c');
+	DefaultSymbolType d = DefaultSymbolType('d');
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
diff --git a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
index 2d34fa6ffc41421a8f55188ad8f0dba1ca924a4f..166eea59c83c4eed5fbb856320166fbff77cc9cd 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
@@ -21,29 +21,29 @@ void GrammarToGNFTest::tearDown() {
 }
 
 void GrammarToGNFTest::testRemoveToGNFRules1() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol("a");
-	alphabet::Symbol b = alphabet::Symbol("b");
+	DefaultSymbolType a = DefaultSymbolType("a");
+	DefaultSymbolType b = DefaultSymbolType("b");
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
 	grammar1.setTerminalAlphabet({a, b});
 
-	alphabet::Symbol aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
 	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>{}));
-	grammar3.addRule(bprimed, std::make_pair(b, std::vector<alphabet::Symbol>{}));
+	grammar3.addRule(aprimed, std::make_pair(a, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(bprimed, std::make_pair(b, std::vector<DefaultSymbolType>{}));
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar2)) << std::endl;
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar3)) << std::endl;
@@ -52,15 +52,15 @@ void GrammarToGNFTest::testRemoveToGNFRules1() {
 }
 
 void GrammarToGNFTest::testRemoveToGNFRules2() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
-	alphabet::Symbol D = alphabet::Symbol("D");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
+	DefaultSymbolType D = DefaultSymbolType("D");
 
-	alphabet::Symbol a = alphabet::Symbol("a");
-	alphabet::Symbol b = alphabet::Symbol("b");
-	alphabet::Symbol c = alphabet::Symbol("c");
+	DefaultSymbolType a = DefaultSymbolType("a");
+	DefaultSymbolType b = DefaultSymbolType("b");
+	DefaultSymbolType c = DefaultSymbolType("c");
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
@@ -70,10 +70,10 @@ void GrammarToGNFTest::testRemoveToGNFRules2() {
 	grammar1.addRule(A, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Aprimed = common::createUnique(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType Aprimed = common::createUnique(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -82,17 +82,17 @@ void GrammarToGNFTest::testRemoveToGNFRules2() {
 	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}));
-	grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(A, std::make_pair(c, std::vector<alphabet::Symbol>{Aprimed}));
-	grammar3.addRule(A, std::make_pair(c, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(Aprimed, std::make_pair(a, std::vector<alphabet::Symbol>{Aprimed}));
-	grammar3.addRule(Aprimed, std::make_pair(a, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(Aprimed, std::make_pair(b, std::vector<alphabet::Symbol>{Aprimed}));
-	grammar3.addRule(Aprimed, std::make_pair(b, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(aprimed, std::make_pair(a, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(bprimed, std::make_pair(b, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(cprimed, std::make_pair(c, std::vector<alphabet::Symbol>{}));
+	grammar3.addRule(S, std::make_pair(c, std::vector<DefaultSymbolType>{Aprimed}));
+	grammar3.addRule(S, std::make_pair(c, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(A, std::make_pair(c, std::vector<DefaultSymbolType>{Aprimed}));
+	grammar3.addRule(A, std::make_pair(c, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(Aprimed, std::make_pair(a, std::vector<DefaultSymbolType>{Aprimed}));
+	grammar3.addRule(Aprimed, std::make_pair(a, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(Aprimed, std::make_pair(b, std::vector<DefaultSymbolType>{Aprimed}));
+	grammar3.addRule(Aprimed, std::make_pair(b, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(aprimed, std::make_pair(a, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(bprimed, std::make_pair(b, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(cprimed, std::make_pair(c, std::vector<DefaultSymbolType>{}));
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar2)) << std::endl;
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar3)) << std::endl;
@@ -101,14 +101,14 @@ void GrammarToGNFTest::testRemoveToGNFRules2() {
 }
 
 void GrammarToGNFTest::testRemoveToGNFRules3() {
-	alphabet::Symbol S = alphabet::Symbol("S");
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
+	DefaultSymbolType S = DefaultSymbolType("S");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
 
-	alphabet::Symbol a = alphabet::Symbol("a");
-	alphabet::Symbol b = alphabet::Symbol("b");
-	alphabet::Symbol c = alphabet::Symbol("c");
+	DefaultSymbolType a = DefaultSymbolType("a");
+	DefaultSymbolType b = DefaultSymbolType("b");
+	DefaultSymbolType c = DefaultSymbolType("c");
 
 	grammar::EpsilonFreeCFG < > grammar1(S);
 	grammar1.setNonterminalAlphabet({S, A, B, C});
@@ -118,10 +118,10 @@ void GrammarToGNFTest::testRemoveToGNFRules3() {
 	grammar1.addRule(B, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	DefaultSymbolType cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -130,19 +130,19 @@ void GrammarToGNFTest::testRemoveToGNFRules3() {
 	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>{}));
-	grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{bprimed, Bprimed, aprimed}));
-	grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{bprimed, aprimed}));
-	grammar3.addRule(A, std::make_pair(c, std::vector<alphabet::Symbol>{bprimed, aprimed}));
-	grammar3.addRule(A, std::make_pair(c, std::vector<alphabet::Symbol>{bprimed, Bprimed, aprimed}));
-	grammar3.addRule(A, std::make_pair(c, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(B, std::make_pair(c, std::vector<alphabet::Symbol>{bprimed}));
-	grammar3.addRule(B, std::make_pair(c, std::vector<alphabet::Symbol>{bprimed, Bprimed}));
-	grammar3.addRule(Bprimed, std::make_pair(a, std::vector<alphabet::Symbol>{bprimed, Bprimed}));
-	grammar3.addRule(Bprimed, std::make_pair(a, std::vector<alphabet::Symbol>{bprimed}));
-	grammar3.addRule(aprimed, std::make_pair(a, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(bprimed, std::make_pair(b, std::vector<alphabet::Symbol>{}));
-	grammar3.addRule(cprimed, std::make_pair(c, std::vector<alphabet::Symbol>{}));
+	grammar3.addRule(S, std::make_pair(c, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(S, std::make_pair(c, std::vector<DefaultSymbolType>{bprimed, Bprimed, aprimed}));
+	grammar3.addRule(S, std::make_pair(c, std::vector<DefaultSymbolType>{bprimed, aprimed}));
+	grammar3.addRule(A, std::make_pair(c, std::vector<DefaultSymbolType>{bprimed, aprimed}));
+	grammar3.addRule(A, std::make_pair(c, std::vector<DefaultSymbolType>{bprimed, Bprimed, aprimed}));
+	grammar3.addRule(A, std::make_pair(c, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(B, std::make_pair(c, std::vector<DefaultSymbolType>{bprimed}));
+	grammar3.addRule(B, std::make_pair(c, std::vector<DefaultSymbolType>{bprimed, Bprimed}));
+	grammar3.addRule(Bprimed, std::make_pair(a, std::vector<DefaultSymbolType>{bprimed, Bprimed}));
+	grammar3.addRule(Bprimed, std::make_pair(a, std::vector<DefaultSymbolType>{bprimed}));
+	grammar3.addRule(aprimed, std::make_pair(a, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(bprimed, std::make_pair(b, std::vector<DefaultSymbolType>{}));
+	grammar3.addRule(cprimed, std::make_pair(c, std::vector<DefaultSymbolType>{}));
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar2)) << std::endl;
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar3)) << std::endl;
@@ -151,12 +151,12 @@ void GrammarToGNFTest::testRemoveToGNFRules3() {
 }
 
 void GrammarToGNFTest::testRemoveToGNFRules4() {
-	alphabet::Symbol A = alphabet::Symbol("A");
-	alphabet::Symbol B = alphabet::Symbol("B");
-	alphabet::Symbol C = alphabet::Symbol("C");
+	DefaultSymbolType A = DefaultSymbolType("A");
+	DefaultSymbolType B = DefaultSymbolType("B");
+	DefaultSymbolType C = DefaultSymbolType("C");
 
-	alphabet::Symbol a = alphabet::Symbol("a");
-	alphabet::Symbol b = alphabet::Symbol("b");
+	DefaultSymbolType a = DefaultSymbolType("a");
+	DefaultSymbolType b = DefaultSymbolType("b");
 
 	grammar::EpsilonFreeCFG < > grammar1(A);
 	grammar1.setNonterminalAlphabet({A, B, C});