diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
index 5012256a8eb26df3a2946dcaddddc84f04f4b84b..a74aff1100f93ee36e9d333fdc3fb1784ffb2dd8 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
@@ -11,8 +11,8 @@ namespace grammar {
 
 namespace convert {
 
-auto ToAutomatonBottomUpCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < >, const grammar::CFG < > & > ( ToAutomatonBottomUp::convert );
-auto ToAutomatonBottomUpEpsilonFreeCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < >, const grammar::EpsilonFreeCFG < > & > ( ToAutomatonBottomUp::convert );
+auto ToAutomatonBottomUpCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < DefaultSymbolType, DefaultEpsilonType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned >, const grammar::CFG < > & > ( ToAutomatonBottomUp::convert );
+auto ToAutomatonBottomUpEpsilonFreeCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < DefaultSymbolType, DefaultEpsilonType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned >, const grammar::EpsilonFreeCFG < > & > ( ToAutomatonBottomUp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h
index bcccf27e72a615cc842a23a94834713153497fa9..204d7fdc4a566c75c33fe9da02990f61e85aaf71 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h
@@ -11,6 +11,7 @@
 #include <grammar/Grammar.h>
 #include <grammar/ContextFree/CFG.h>
 #include <grammar/ContextFree/EpsilonFreeCFG.h>
+#include <grammar/RawRules.h>
 
 #include <automaton/PDA/NPDA.h>
 
@@ -29,35 +30,36 @@ public:
 	/**
 	 * Performs conversion.
 	 */
-	template <class T, class SymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class EpsilonType = DefaultEpsilonType, class StateType = DefaultStateType >
-	static automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > convert(const T& grammar);
+	template <class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class EpsilonType = DefaultEpsilonType, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
+	static automaton::NPDA < TerminalSymbolType, EpsilonType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > convert(const T& grammar);
 };
 
-template <class T, class SymbolType, class EpsilonType, class StateType >
-automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > ToAutomatonBottomUp::convert(const T& grammar) {
-	StateType q = label::InitialStateLabel::instance < StateType > ( );
-	StateType r = label::FinalStateLabel::instance < StateType > ( );
+template <class T, class TerminalSymbolType, class EpsilonType, class NonterminalSymbolType >
+automaton::NPDA < TerminalSymbolType, EpsilonType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > ToAutomatonBottomUp::convert ( const T & grammar ) {
+	unsigned q = label::InitialStateLabel::instance < unsigned > ( );
+	unsigned r = label::FinalStateLabel::instance < unsigned > ( );
 
-	automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > automaton(q, alphabet::BottomOfTheStackSymbol::instance < SymbolType > ( ) );
+	automaton::NPDA < TerminalSymbolType, EpsilonType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > automaton ( q, alphabet::BottomOfTheStackSymbol::instance < NonterminalSymbolType > ( ) );
 	automaton.addState(r);
 	automaton.addFinalState(r);
 
 	automaton.setInputAlphabet(grammar.getTerminalAlphabet());
 
-	for(const SymbolType& symbol : grammar.getNonterminalAlphabet())
+	for(const NonterminalSymbolType& symbol : grammar.getNonterminalAlphabet())
 		automaton.addPushdownStoreSymbol(symbol);
-	for(const SymbolType& symbol : grammar.getTerminalAlphabet())
+	for(const TerminalSymbolType& symbol : grammar.getTerminalAlphabet())
 		automaton.addPushdownStoreSymbol(symbol);
 
-	for(const SymbolType& symbol : grammar.getTerminalAlphabet())
-		automaton.addTransition(automaton.getInitialState(), symbol, ext::vector<SymbolType>{}, automaton.getInitialState(), ext::vector<SymbolType>{symbol});
+	for(const TerminalSymbolType& symbol : grammar.getTerminalAlphabet())
+		automaton.addTransition ( automaton.getInitialState ( ), symbol, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { }, automaton.getInitialState ( ), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { symbol } );
 
-	//for(const ext::map<SymbolType, ext::set<ext::vector<SymbolType>>>& kv : grammar.getRules())
-	for(const auto& kv : grammar.getRules())
-		for(const ext::vector<SymbolType>& rhs : kv.second)
-			automaton.addTransition(automaton.getInitialState(), rhs, automaton.getInitialState(), ext::vector<SymbolType>{kv.first});
+	auto rawRules = grammar::RawRules::getRawRules ( grammar );
+	for ( const auto & kv : rawRules )
+		for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : kv.second) {
+			automaton.addTransition ( automaton.getInitialState(), rhs, automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { kv.first } );
+		}
 
-	automaton.addTransition(automaton.getInitialState(), ext::vector<SymbolType>{ alphabet::BottomOfTheStackSymbol::instance < SymbolType > ( ), grammar.getInitialSymbol()}, r, ext::vector<SymbolType>{});
+	automaton.addTransition(automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { alphabet::BottomOfTheStackSymbol::instance < NonterminalSymbolType > ( ), grammar.getInitialSymbol ( ) }, r, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } );
 
 	return automaton;
 }
diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
index 8653e4ffe2a54ef4fa2c0d0a43346f293f35e01f..102175c865baa9bbf3a5688432ada38be993a603 100644
--- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
+++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
@@ -89,27 +89,27 @@ void GrammarCFGtoPDATest::testBottomUp()
 		grammar.addRule(nF, ext::vector<DefaultSymbolType>{tA});
 
 
-		DefaultStateType q = label::InitialStateLabel::instance < DefaultStateType > ( );
-		DefaultStateType r = label::FinalStateLabel::instance < DefaultStateType > ( );
+		unsigned q = label::InitialStateLabel::instance < unsigned > ( );
+		unsigned r = label::FinalStateLabel::instance < unsigned > ( );
 		DefaultSymbolType bots( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
 
-		automaton::NPDA < > pda(q, bots);
+		automaton::NPDA < DefaultStateType, DefaultEpsilonType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned > pda(q, bots);
 		pda.addState(r);
 		pda.addFinalState(r);
 		pda.setInputAlphabet(ext::set<DefaultSymbolType>{tP, tS, tL, tR, tA});
-		pda.setPushdownStoreAlphabet(ext::set<DefaultSymbolType>{tP, tS, tL, tR, tA, nE, nT, nF, bots});
+		pda.setPushdownStoreAlphabet ( ext::set < ext::variant < DefaultSymbolType, DefaultSymbolType > > { tP, tS, tL, tR, tA, nE, nT, nF, bots } );
 
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{nE, tP, nT}, q, ext::vector<DefaultSymbolType>{nE});
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{nT}, q, ext::vector<DefaultSymbolType>{nE});
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{nT, tS, nF}, q, ext::vector<DefaultSymbolType>{nT});
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{nF}, q, ext::vector<DefaultSymbolType>{nT});
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{tL, nE, tR}, q, ext::vector<DefaultSymbolType>{nF});
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{tA}, q, ext::vector<DefaultSymbolType>{nF});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nE, tP, nT}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nE});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nE});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT, tS, nF}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nF}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{tL, nE, tR}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nF});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{tA}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nF});
 
 		for(const auto& symbol: pda.getInputAlphabet())
-			pda.addTransition(q, symbol, ext::vector<DefaultSymbolType>{}, q, ext::vector<DefaultSymbolType>{symbol});
+			pda.addTransition(q, symbol, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{symbol});
 
-		pda.addTransition(q, ext::vector<DefaultSymbolType>{bots, nE}, r, ext::vector<DefaultSymbolType>{});
+		pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{bots, nE}, r, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{});
 
 		CPPUNIT_ASSERT(pda == grammar::convert::ToAutomatonBottomUp::convert(grammar));
 	}