diff --git a/acompare2/src/GrammarCompare.cpp b/acompare2/src/GrammarCompare.cpp
index e6d963b0516d32f1cc828fa1661dfd7da2a2f5db..ed9178616f6f3c61513fc701a02e7f2a69947e24 100644
--- a/acompare2/src/GrammarCompare.cpp
+++ b/acompare2/src/GrammarCompare.cpp
@@ -107,14 +107,14 @@ bool GrammarCompare::testCompare(const grammar::NonContractingGrammar < > & a, c
 			a.getTerminalAlphabet()    == b.getTerminalAlphabet()    ;
 }
 
-bool GrammarCompare::testCompare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b) {
+bool GrammarCompare::testCompare(const grammar::ContextPreservingUnrestrictedGrammar < > & a, const grammar::ContextPreservingUnrestrictedGrammar < > & b) {
 	return  	a.getNonterminalAlphabet() == b.getNonterminalAlphabet() &&
 			a.getRules()               == b.getRules()               &&
 			a.getInitialSymbol()       == b.getInitialSymbol()       &&
 			a.getTerminalAlphabet()    == b.getTerminalAlphabet()    ;
 }
 
-bool GrammarCompare::testCompare(const grammar::UnrestrictedGrammar& a, const grammar::UnrestrictedGrammar& b) {
+bool GrammarCompare::testCompare(const grammar::UnrestrictedGrammar < > & a, const grammar::UnrestrictedGrammar < > & b) {
 	return  	a.getNonterminalAlphabet() == b.getNonterminalAlphabet() &&
 			a.getRules()               == b.getRules()               &&
 			a.getInitialSymbol()       == b.getInitialSymbol()       &&
@@ -499,7 +499,7 @@ void GrammarCompare::printCompare(const grammar::NonContractingGrammar < > & a,
 	}
 }
 
-void GrammarCompare::printCompare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b) {
+void GrammarCompare::printCompare(const grammar::ContextPreservingUnrestrictedGrammar < > & a, const grammar::ContextPreservingUnrestrictedGrammar < > & b) {
 	std::cout << "GrammarCompareer" << std::endl;
 
 	if(a.getNonterminalAlphabet() != b.getNonterminalAlphabet()) {
@@ -529,7 +529,7 @@ void GrammarCompare::printCompare(const grammar::ContextPreservingUnrestrictedGr
 	}
 }
 
-void GrammarCompare::printCompare(const grammar::UnrestrictedGrammar& a, const grammar::UnrestrictedGrammar& b) {
+void GrammarCompare::printCompare(const grammar::UnrestrictedGrammar < > & a, const grammar::UnrestrictedGrammar < > & b) {
 	std::cout << "GrammarCompareer" << std::endl;
 
 	if(a.getNonterminalAlphabet() != b.getNonterminalAlphabet()) {
@@ -680,7 +680,7 @@ int GrammarCompare::compare(const grammar::NonContractingGrammar < > & a, const
 
 auto GrammarCompareNonContractingGrammar = GrammarCompare::RegistratorWrapper<int, grammar::NonContractingGrammar < >, grammar::NonContractingGrammar < > >(GrammarCompare::compare);
 
-int GrammarCompare::compare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b) {
+int GrammarCompare::compare(const grammar::ContextPreservingUnrestrictedGrammar < > & a, const grammar::ContextPreservingUnrestrictedGrammar < > & b) {
 	if(!GrammarCompare::testCompare(a, b)) {
 	  GrammarCompare::printCompare(a, b);
 	  return 1;
@@ -689,9 +689,9 @@ int GrammarCompare::compare(const grammar::ContextPreservingUnrestrictedGrammar&
 	}
 }
 
-auto GrammarCompareContextPreservingUnrestrictedGrammar = GrammarCompare::RegistratorWrapper<int, grammar::ContextPreservingUnrestrictedGrammar, grammar::ContextPreservingUnrestrictedGrammar>(GrammarCompare::compare);
+auto GrammarCompareContextPreservingUnrestrictedGrammar = GrammarCompare::RegistratorWrapper<int, grammar::ContextPreservingUnrestrictedGrammar < >, grammar::ContextPreservingUnrestrictedGrammar < > >(GrammarCompare::compare);
 
-int GrammarCompare::compare(const grammar::UnrestrictedGrammar& a, const grammar::UnrestrictedGrammar& b) {
+int GrammarCompare::compare(const grammar::UnrestrictedGrammar < > & a, const grammar::UnrestrictedGrammar < > & b) {
 	if(!GrammarCompare::testCompare(a, b)) {
 	  GrammarCompare::printCompare(a, b);
 	  return 1;
@@ -700,7 +700,7 @@ int GrammarCompare::compare(const grammar::UnrestrictedGrammar& a, const grammar
 	}
 }
 
-auto GrammarCompareUnrestrictedGrammar = GrammarCompare::RegistratorWrapper<int, grammar::UnrestrictedGrammar, grammar::UnrestrictedGrammar>(GrammarCompare::compare);
+auto GrammarCompareUnrestrictedGrammar = GrammarCompare::RegistratorWrapper<int, grammar::UnrestrictedGrammar < >, grammar::UnrestrictedGrammar < > >(GrammarCompare::compare);
 
 int GrammarCompare::compare(const grammar::Grammar& a, const grammar::Grammar& b) {
 	return dispatch(a.getData(), b.getData());
diff --git a/acompare2/src/GrammarCompare.h b/acompare2/src/GrammarCompare.h
index ad2b8efb4db3f2af258bb5083c67f67e2c2a5678..e5057daf945b52b85a52dc0ab37ed7092e4f5a43 100644
--- a/acompare2/src/GrammarCompare.h
+++ b/acompare2/src/GrammarCompare.h
@@ -53,11 +53,11 @@ private:
 	static bool testCompare(const grammar::NonContractingGrammar < > & a, const grammar::NonContractingGrammar < > & b);
 	static void printCompare(const grammar::NonContractingGrammar < > & a, const grammar::NonContractingGrammar < > & b);
 
-	static bool testCompare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b);
-	static void printCompare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b);
+	static bool testCompare(const grammar::ContextPreservingUnrestrictedGrammar < > & a, const grammar::ContextPreservingUnrestrictedGrammar < > & b);
+	static void printCompare(const grammar::ContextPreservingUnrestrictedGrammar < > & a, const grammar::ContextPreservingUnrestrictedGrammar < > & b);
 
-	static bool testCompare(const grammar::UnrestrictedGrammar& a, const grammar::UnrestrictedGrammar& b);
-	static void printCompare(const grammar::UnrestrictedGrammar& a, const grammar::UnrestrictedGrammar& b);
+	static bool testCompare(const grammar::UnrestrictedGrammar < > & a, const grammar::UnrestrictedGrammar < > & b);
+	static void printCompare(const grammar::UnrestrictedGrammar < > & a, const grammar::UnrestrictedGrammar < > & b);
 
 	template <class T> static void setCompare(const std::set<T> a, const std::set<T> b);
 	template <class T> static void listCompare(const std::list<T> a, const std::list<T> b);
@@ -74,8 +74,8 @@ public:
 	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);
-	static int compare(const grammar::UnrestrictedGrammar& a, const grammar::UnrestrictedGrammar& b);
+	static int compare(const grammar::ContextPreservingUnrestrictedGrammar < > & a, const grammar::ContextPreservingUnrestrictedGrammar < > & b);
+	static int compare(const grammar::UnrestrictedGrammar < > & a, const grammar::UnrestrictedGrammar < > & b);
 
 	static int compare(const grammar::Grammar& a, const grammar::Grammar& b);
 };
diff --git a/alib2data/src/grammar/GrammarFeatures.h b/alib2data/src/grammar/GrammarFeatures.h
index f67d97e78bc9c8c21f3dde788b3fbd0ae9520df2..c480acffa1a84f5186094389678025521729c6ed 100644
--- a/alib2data/src/grammar/GrammarFeatures.h
+++ b/alib2data/src/grammar/GrammarFeatures.h
@@ -53,7 +53,9 @@ template<class SymbolType = typename alphabet::Symbol >
 class CSG;
 template<class SymbolType = typename alphabet::Symbol >
 class NonContractingGrammar;
+template<class SymbolType = typename alphabet::Symbol >
 class ContextPreservingUnrestrictedGrammar;
+template<class SymbolType = typename alphabet::Symbol >
 class UnrestrictedGrammar;
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
index e9cd7ca50f1977a9798bbe8d76036b8cc8ae5f4a..3824b5fdb45cc21f521860717c1dd56961cb1c7e 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
@@ -6,146 +6,13 @@
  */
 
 #include "ContextPreservingUnrestrictedGrammar.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 {
-
-ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar ( alphabet::Symbol initialSymbol ) : ContextPreservingUnrestrictedGrammar ( std::set < alphabet::Symbol > { initialSymbol }, std::set < alphabet::Symbol > ( ), initialSymbol ) {
-}
-
-ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components < ContextPreservingUnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) {
-}
-
-GrammarBase * ContextPreservingUnrestrictedGrammar::clone ( ) const {
-	return new ContextPreservingUnrestrictedGrammar ( * this );
-}
-
-GrammarBase * ContextPreservingUnrestrictedGrammar::plunder ( ) && {
-	return new ContextPreservingUnrestrictedGrammar ( std::move ( * this ) );
-}
-
-bool ContextPreservingUnrestrictedGrammar::addRule ( std::vector < alphabet::Symbol > lContext, alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rContext, std::vector < alphabet::Symbol > rightHandSide ) {
-	for ( const alphabet::Symbol & symbol : lContext )
-		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
-			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
-
-	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
-		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
-
-	for ( const alphabet::Symbol & symbol : rContext )
-		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
-			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
-
-	for ( const alphabet::Symbol & symbol : rightHandSide )
-		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
-			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
-
-	return rules[make_tuple ( std::move ( lContext ), std::move ( leftHandSide ), std::move ( rContext ) )].insert ( std::move ( rightHandSide ) ).second;
-}
-
-const std::map < std::tuple < std::vector < alphabet::Symbol >, alphabet::Symbol, std::vector < alphabet::Symbol > >, std::set < std::vector < alphabet::Symbol > > > & ContextPreservingUnrestrictedGrammar::getRules ( ) const {
-	return rules;
-}
-
-bool ContextPreservingUnrestrictedGrammar::removeRule ( const std::vector < alphabet::Symbol > & lContext, const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rContext, const std::vector < alphabet::Symbol > & rightHandSide ) {
-	return rules[make_tuple ( lContext, leftHandSide, rContext )].erase ( rightHandSide );
-}
-
-int ContextPreservingUnrestrictedGrammar::compare ( const ContextPreservingUnrestrictedGrammar & 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 ContextPreservingUnrestrictedGrammar::operator >>( std::ostream & out ) const {
-	out << "(ContextPreservingUnrestrictedGrammar "
-	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
-	    << "terminalAlphabet = " << getTerminalAlphabet ( )
-	    << "initialSymbol = " << getInitialSymbol ( )
-	    << "rules = " << rules << ")";
-}
-
-ContextPreservingUnrestrictedGrammar::operator std::string ( ) const {
-	std::stringstream ss;
-	ss << * this;
-	return ss.str ( );
-}
-
-ContextPreservingUnrestrictedGrammar ContextPreservingUnrestrictedGrammar::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, ContextPreservingUnrestrictedGrammar::getXmlTagName() );
-
-	std::set < alphabet::Symbol > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
-	std::set < alphabet::Symbol > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
-	alphabet::Symbol initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
-
-	ContextPreservingUnrestrictedGrammar grammar ( std::move ( initialSymbol ) );
-
-	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
-	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
-
-	GrammarFromXMLParser::parseRules ( input, grammar );
-
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, ContextPreservingUnrestrictedGrammar::getXmlTagName() );
-	return grammar;
-}
-
-void ContextPreservingUnrestrictedGrammar::parseRule ( std::deque < sax::Token >::iterator & input, ContextPreservingUnrestrictedGrammar & grammar ) {
-	std::vector < alphabet::Symbol > lContext = GrammarFromXMLParser::parseRuleLContext ( input );
-	alphabet::Symbol lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input );
-	std::vector < alphabet::Symbol > rContext = GrammarFromXMLParser::parseRuleRContext ( input );
-	std::vector < alphabet::Symbol > rhs = GrammarFromXMLParser::parseRuleRHS ( input );
-
-	grammar.addRule ( std::move ( lContext ), std::move ( lhs ), std::move ( rContext ), std::move ( rhs ) );
-}
-
-void ContextPreservingUnrestrictedGrammar::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( ContextPreservingUnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
-
-	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
-	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
-	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
-	composeRules ( out );
-
-	out.emplace_back ( ContextPreservingUnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
-}
-
-void ContextPreservingUnrestrictedGrammar::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::composeRuleLContext ( out, std::get < 0 > ( rule.first ) );
-			GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, std::get < 1 > ( rule.first ) );
-			GrammarToXMLComposer::composeRuleRContext ( out, std::get < 2 > ( rule.first ) );
-			GrammarToXMLComposer::composeRuleRHS ( 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 ContextPreservingUnrestrictedGrammarParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::ContextPreservingUnrestrictedGrammar > ( );
-auto ContextPreservingUnrestrictedGrammarParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::ContextPreservingUnrestrictedGrammar > ( );
+auto ContextPreservingUnrestrictedGrammarParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::ContextPreservingUnrestrictedGrammar < > > ( );
+auto ContextPreservingUnrestrictedGrammarParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::ContextPreservingUnrestrictedGrammar < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
index 75e0f591b984439522946f273be538b0cc107349..71c563ef054418d7e02554facbd4c78dcf73809e 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
@@ -8,12 +8,19 @@
 #ifndef CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR_H_
 #define CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR_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,54 +31,55 @@ class TerminalAlphabet;
 class NonterminalAlphabet;
 class InitialSymbol;
 
-class ContextPreservingUnrestrictedGrammar : public GrammarBase, public std::Components < ContextPreservingUnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
-	std::map < std::tuple < std::vector < alphabet::Symbol >, alphabet::Symbol, std::vector < alphabet::Symbol > >, std::set < std::vector < alphabet::Symbol > > > rules;
+template < class SymbolType >
+class ContextPreservingUnrestrictedGrammar : public GrammarBase, public std::Components < ContextPreservingUnrestrictedGrammar < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
+	std::map < std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > >, std::set < std::vector < SymbolType > > > rules;
 
 public:
-	explicit ContextPreservingUnrestrictedGrammar ( alphabet::Symbol initialSymbol );
+	explicit ContextPreservingUnrestrictedGrammar ( SymbolType initialSymbol );
 
-	explicit ContextPreservingUnrestrictedGrammar ( std::set < alphabet::Symbol > nonTerminalSymbols, std::set < alphabet::Symbol > terminalSymbols, alphabet::Symbol initialSymbol );
+	explicit ContextPreservingUnrestrictedGrammar ( std::set < SymbolType > nonTerminalSymbols, std::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
 
 	virtual GrammarBase * clone ( ) const;
 
 	virtual GrammarBase * plunder ( ) &&;
 
-	bool addRule ( std::vector < alphabet::Symbol > lContext, alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rContext, std::vector < alphabet::Symbol > rightHandSide );
+	bool addRule ( std::vector < SymbolType > lContext, SymbolType leftHandSide, std::vector < SymbolType > rContext, std::vector < SymbolType > rightHandSide );
 
-	const std::map < std::tuple < std::vector < alphabet::Symbol >, alphabet::Symbol, std::vector < alphabet::Symbol > >, std::set < std::vector < alphabet::Symbol > > > & getRules ( ) const;
+	const std::map < std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > >, std::set < std::vector < SymbolType > > > & getRules ( ) const;
 
-	bool removeRule ( const std::vector < alphabet::Symbol > & lContext, const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rContext, const std::vector < alphabet::Symbol > & rightHandSide );
+	bool removeRule ( const std::vector < SymbolType > & lContext, const SymbolType & leftHandSide, const std::vector < SymbolType > & rContext, 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 ) );
 	}
 
 	virtual int compare ( const ObjectBase & other ) const {
@@ -99,24 +107,159 @@ public:
 	void composeRules ( std::deque < sax::Token > & out ) const;
 };
 
+template < class SymbolType >
+ContextPreservingUnrestrictedGrammar < SymbolType >::ContextPreservingUnrestrictedGrammar ( SymbolType initialSymbol ) : ContextPreservingUnrestrictedGrammar ( std::set < SymbolType > { initialSymbol }, std::set < SymbolType > ( ), initialSymbol ) {
+}
+
+template < class SymbolType >
+ContextPreservingUnrestrictedGrammar < SymbolType >::ContextPreservingUnrestrictedGrammar ( std::set < SymbolType > nonterminalAlphabet, std::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : std::Components < ContextPreservingUnrestrictedGrammar, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) {
+}
+
+template < class SymbolType >
+GrammarBase * ContextPreservingUnrestrictedGrammar < SymbolType >::clone ( ) const {
+	return new ContextPreservingUnrestrictedGrammar ( * this );
+}
+
+template < class SymbolType >
+GrammarBase * ContextPreservingUnrestrictedGrammar < SymbolType >::plunder ( ) && {
+	return new ContextPreservingUnrestrictedGrammar ( std::move ( * this ) );
+}
+
+template < class SymbolType >
+bool ContextPreservingUnrestrictedGrammar < SymbolType >::addRule ( std::vector < SymbolType > lContext, SymbolType leftHandSide, std::vector < SymbolType > rContext, std::vector < SymbolType > rightHandSide ) {
+	for ( const SymbolType & symbol : lContext )
+		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
+			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
+
+	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
+		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
+
+	for ( const SymbolType & symbol : rContext )
+		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
+			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
+
+	for ( const SymbolType & symbol : rightHandSide )
+		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
+			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
+
+	return rules[make_tuple ( std::move ( lContext ), std::move ( leftHandSide ), std::move ( rContext ) )].insert ( std::move ( rightHandSide ) ).second;
+}
+
+template < class SymbolType >
+const std::map < std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > >, std::set < std::vector < SymbolType > > > & ContextPreservingUnrestrictedGrammar < SymbolType >::getRules ( ) const {
+	return rules;
+}
+
+template < class SymbolType >
+bool ContextPreservingUnrestrictedGrammar < SymbolType >::removeRule ( const std::vector < SymbolType > & lContext, const SymbolType & leftHandSide, const std::vector < SymbolType > & rContext, const std::vector < SymbolType > & rightHandSide ) {
+	return rules[make_tuple ( lContext, leftHandSide, rContext )].erase ( rightHandSide );
+}
+
+template < class SymbolType >
+int ContextPreservingUnrestrictedGrammar < SymbolType >::compare ( const ContextPreservingUnrestrictedGrammar & 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 ContextPreservingUnrestrictedGrammar < SymbolType >::operator >>( std::ostream & out ) const {
+	out << "(ContextPreservingUnrestrictedGrammar "
+	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
+	    << "terminalAlphabet = " << getTerminalAlphabet ( )
+	    << "initialSymbol = " << getInitialSymbol ( )
+	    << "rules = " << rules << ")";
+}
+
+template < class SymbolType >
+ContextPreservingUnrestrictedGrammar < SymbolType >::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << * this;
+	return ss.str ( );
+}
+
+template < class SymbolType >
+ContextPreservingUnrestrictedGrammar < SymbolType > ContextPreservingUnrestrictedGrammar < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, ContextPreservingUnrestrictedGrammar::getXmlTagName() );
+
+	std::set < SymbolType > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
+	std::set < SymbolType > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
+	SymbolType initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
+
+	ContextPreservingUnrestrictedGrammar < SymbolType > grammar ( std::move ( initialSymbol ) );
+
+	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
+	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
+
+	GrammarFromXMLParser::parseRules ( input, grammar );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, ContextPreservingUnrestrictedGrammar::getXmlTagName() );
+	return grammar;
+}
+
+template < class SymbolType >
+void ContextPreservingUnrestrictedGrammar < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, ContextPreservingUnrestrictedGrammar & grammar ) {
+	std::vector < SymbolType > lContext = GrammarFromXMLParser::parseRuleLContext ( input );
+	SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input );
+	std::vector < SymbolType > rContext = GrammarFromXMLParser::parseRuleRContext ( input );
+	std::vector < SymbolType > rhs = GrammarFromXMLParser::parseRuleRHS ( input );
+
+	grammar.addRule ( std::move ( lContext ), std::move ( lhs ), std::move ( rContext ), std::move ( rhs ) );
+}
+
+template < class SymbolType >
+void ContextPreservingUnrestrictedGrammar < SymbolType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( ContextPreservingUnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
+
+	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
+	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
+	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
+	composeRules ( out );
+
+	out.emplace_back ( ContextPreservingUnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
+}
+
+template < class SymbolType >
+void ContextPreservingUnrestrictedGrammar < 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::composeRuleLContext ( out, std::get < 0 > ( rule.first ) );
+			GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, std::get < 1 > ( rule.first ) );
+			GrammarToXMLComposer::composeRuleRContext ( out, std::get < 2 > ( rule.first ) );
+			GrammarToXMLComposer::composeRuleRHS ( 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::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::ContextPreservingUnrestrictedGrammar < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
 public:
-	static bool used ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const std::tuple < std::vector < alphabet::Symbol >, alphabet::Symbol, std::vector < alphabet::Symbol > >, std::set < std::vector < alphabet::Symbol > > > & rule : grammar.getRules ( ) ) {
-			for ( const alphabet::Symbol & lCont : std::get < 0 > ( rule.first ) )
+	static bool used ( const grammar::ContextPreservingUnrestrictedGrammar < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > >, std::set < std::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
+			for ( const SymbolType & lCont : std::get < 0 > ( rule.first ) )
 				if ( lCont == symbol )
 					return true;
 
-			for ( const alphabet::Symbol & rCont : std::get < 2 > ( rule.first ) )
+			for ( const SymbolType & rCont : std::get < 2 > ( rule.first ) )
 				if ( rCont == symbol )
 					return true;
 
-			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+			for ( const std::vector < SymbolType > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 					return true;
 
@@ -125,62 +268,62 @@ public:
 		return false;
 	}
 
-	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar < 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::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::ContextPreservingUnrestrictedGrammar < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
 public:
-	static bool used ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const std::tuple < std::vector < alphabet::Symbol >, alphabet::Symbol, std::vector < alphabet::Symbol > >, std::set < std::vector < alphabet::Symbol > > > & rule : grammar.getRules ( ) ) {
-			for ( const alphabet::Symbol & lCont : std::get < 0 > ( rule.first ) )
+	static bool used ( const grammar::ContextPreservingUnrestrictedGrammar < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > >, std::set < std::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
+			for ( const SymbolType & lCont : std::get < 0 > ( rule.first ) )
 				if ( lCont == symbol )
 					return true;
 
 			if ( std::get < 1 > ( rule.first ) == symbol )
 				return true;
 
-			for ( const alphabet::Symbol & rCont : std::get < 2 > ( rule.first ) )
+			for ( const SymbolType & rCont : std::get < 2 > ( rule.first ) )
 				if ( rCont == symbol )
 					return true;
 
-			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+			for ( const std::vector < SymbolType > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.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::ContextPreservingUnrestrictedGrammar &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar < 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::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol > {
+template < class SymbolType >
+class ElementConstraint< grammar::ContextPreservingUnrestrictedGrammar < SymbolType >, SymbolType, grammar::InitialSymbol > {
 public:
-	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar < SymbolType > & grammar, const SymbolType & symbol ) {
+		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar &, const alphabet::Symbol & ) {
+	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar < SymbolType > &, const SymbolType & ) {
 	}
 };
 
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
index a9f6bf77532bd7f07ace988e9983a7bd16567b6a..a9f70009f42aa08155471d725ed9ac94d105189e 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
@@ -6,140 +6,13 @@
  */
 
 #include "UnrestrictedGrammar.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 {
-
-UnrestrictedGrammar::UnrestrictedGrammar ( alphabet::Symbol initialSymbol ) : UnrestrictedGrammar ( std::set < alphabet::Symbol > { initialSymbol }, std::set < alphabet::Symbol > ( ), initialSymbol ) {
-}
-
-UnrestrictedGrammar::UnrestrictedGrammar ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components < UnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) {
-}
-
-GrammarBase * UnrestrictedGrammar::clone ( ) const {
-	return new UnrestrictedGrammar ( * this );
-}
-
-GrammarBase * UnrestrictedGrammar::plunder ( ) && {
-	return new UnrestrictedGrammar ( std::move ( * this ) );
-}
-
-bool UnrestrictedGrammar::addRule ( std::vector < alphabet::Symbol > leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) {
-	if ( std::all_of ( leftHandSide.begin ( ), leftHandSide.end ( ), [this] ( const alphabet::Symbol symbol ) {
-			return !getNonterminalAlphabet ( ).count ( symbol );
-		} ) )
-		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
-
-	for ( const alphabet::Symbol & symbol : leftHandSide )
-		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
-			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
-
-	for ( const alphabet::Symbol & symbol : rightHandSide )
-		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
-			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
-
-	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
-}
-
-const std::map < std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > & UnrestrictedGrammar::getRules ( ) const {
-	return rules;
-}
-
-bool UnrestrictedGrammar::removeRule ( const std::vector < alphabet::Symbol > & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) {
-	return rules[leftHandSide].erase ( rightHandSide );
-}
-
-int UnrestrictedGrammar::compare ( const UnrestrictedGrammar & 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 UnrestrictedGrammar::operator >>( std::ostream & out ) const {
-	out << "(UnrestrictedGrammar "
-	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
-	    << "terminalAlphabet = " << getTerminalAlphabet ( )
-	    << "initialSymbol = " << getInitialSymbol ( )
-	    << "rules = " << rules << ")";
-}
-
-UnrestrictedGrammar::operator std::string ( ) const {
-	std::stringstream ss;
-	ss << * this;
-	return ss.str ( );
-}
-
-UnrestrictedGrammar UnrestrictedGrammar::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, UnrestrictedGrammar::getXmlTagName() );
-
-	std::set < alphabet::Symbol > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
-	std::set < alphabet::Symbol > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
-	alphabet::Symbol initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
-
-	UnrestrictedGrammar grammar ( std::move ( initialSymbol ) );
-
-	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
-	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
-
-	GrammarFromXMLParser::parseRules ( input, grammar );
-
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, UnrestrictedGrammar::getXmlTagName() );
-	return grammar;
-}
-
-void UnrestrictedGrammar::parseRule ( std::deque < sax::Token >::iterator & input, UnrestrictedGrammar & grammar ) {
-	std::vector < alphabet::Symbol > lhs = GrammarFromXMLParser::parseRuleLHS ( input );
-	std::vector < alphabet::Symbol > rhs = GrammarFromXMLParser::parseRuleRHS ( input );
-
-	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
-}
-
-void UnrestrictedGrammar::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( UnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
-
-	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
-	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
-	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
-	composeRules ( out );
-
-	out.emplace_back ( UnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
-}
-
-void UnrestrictedGrammar::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::composeRuleLHS ( out, rule.first );
-			GrammarToXMLComposer::composeRuleRHS ( 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 UnrestrictedGrammarParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::UnrestrictedGrammar > ( );
-auto UnrestrictedGrammarParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::UnrestrictedGrammar > ( );
+auto UnrestrictedGrammarParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::UnrestrictedGrammar < > > ( );
+auto UnrestrictedGrammarParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::UnrestrictedGrammar < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
index dd37202da9c02e92247e9f54476e77bb504ab9c9..a907f91d0ce78654a48f5c00ea3c27747a253baf 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
@@ -8,12 +8,19 @@
 #ifndef UNRESTRICTED_GRAMMAR_H_
 #define UNRESTRICTED_GRAMMAR_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,54 +31,55 @@ class TerminalAlphabet;
 class NonterminalAlphabet;
 class InitialSymbol;
 
-class UnrestrictedGrammar : public GrammarBase, public std::Components < UnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
-	std::map < std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > rules;
+template < class SymbolType >
+class UnrestrictedGrammar : public GrammarBase, public std::Components < UnrestrictedGrammar < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
+	std::map < std::vector < SymbolType >, std::set < std::vector < SymbolType > > > rules;
 
 public:
-	explicit UnrestrictedGrammar ( alphabet::Symbol initialSymbol );
+	explicit UnrestrictedGrammar ( SymbolType initialSymbol );
 
-	explicit UnrestrictedGrammar ( std::set < alphabet::Symbol > nonTerminalSymbols, std::set < alphabet::Symbol > terminalSymbols, alphabet::Symbol initialSymbol );
+	explicit UnrestrictedGrammar ( std::set < SymbolType > nonTerminalSymbols, std::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
 
 	virtual GrammarBase * clone ( ) const;
 
 	virtual GrammarBase * plunder ( ) &&;
 
-	bool addRule ( std::vector < alphabet::Symbol > leftHandSide, std::vector < alphabet::Symbol > rightHandSide );
+	bool addRule ( std::vector < SymbolType > leftHandSide, std::vector < SymbolType > rightHandSide );
 
-	const std::map < std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > & getRules ( ) const;
+	const std::map < std::vector < SymbolType >, std::set < std::vector < SymbolType > > > & getRules ( ) const;
 
-	bool removeRule ( const std::vector < alphabet::Symbol > & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide );
+	bool removeRule ( const std::vector < 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 ) );
 	}
 
 	virtual int compare ( const ObjectBase & other ) const {
@@ -99,19 +107,148 @@ public:
 	void composeRules ( std::deque < sax::Token > & out ) const;
 };
 
+template < class SymbolType >
+UnrestrictedGrammar < SymbolType >::UnrestrictedGrammar ( SymbolType initialSymbol ) : UnrestrictedGrammar ( std::set < SymbolType > { initialSymbol }, std::set < SymbolType > ( ), initialSymbol ) {
+}
+
+template < class SymbolType >
+UnrestrictedGrammar < SymbolType >::UnrestrictedGrammar ( std::set < SymbolType > nonterminalAlphabet, std::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : std::Components < UnrestrictedGrammar, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) {
+}
+
+template < class SymbolType >
+GrammarBase * UnrestrictedGrammar < SymbolType >::clone ( ) const {
+	return new UnrestrictedGrammar ( * this );
+}
+
+template < class SymbolType >
+GrammarBase * UnrestrictedGrammar < SymbolType >::plunder ( ) && {
+	return new UnrestrictedGrammar ( std::move ( * this ) );
+}
+
+template < class SymbolType >
+bool UnrestrictedGrammar < SymbolType >::addRule ( std::vector < SymbolType > leftHandSide, std::vector < SymbolType > rightHandSide ) {
+	if ( std::all_of ( leftHandSide.begin ( ), leftHandSide.end ( ), [this] ( const SymbolType symbol ) {
+			return !getNonterminalAlphabet ( ).count ( symbol );
+		} ) )
+		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
+
+	for ( const SymbolType & symbol : leftHandSide )
+		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
+			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
+
+	for ( const SymbolType & symbol : rightHandSide )
+		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
+			throw GrammarException ( "Symbol \"" + std::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
+
+	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
+}
+
+template < class SymbolType >
+const std::map < std::vector < SymbolType >, std::set < std::vector < SymbolType > > > & UnrestrictedGrammar < SymbolType >::getRules ( ) const {
+	return rules;
+}
+
+template < class SymbolType >
+bool UnrestrictedGrammar < SymbolType >::removeRule ( const std::vector < SymbolType > & leftHandSide, const std::vector < SymbolType > & rightHandSide ) {
+	return rules[leftHandSide].erase ( rightHandSide );
+}
+
+template < class SymbolType >
+int UnrestrictedGrammar < SymbolType >::compare ( const UnrestrictedGrammar & 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 UnrestrictedGrammar < SymbolType >::operator >>( std::ostream & out ) const {
+	out << "(UnrestrictedGrammar "
+	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
+	    << "terminalAlphabet = " << getTerminalAlphabet ( )
+	    << "initialSymbol = " << getInitialSymbol ( )
+	    << "rules = " << rules << ")";
+}
+
+template < class SymbolType >
+UnrestrictedGrammar < SymbolType >::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << * this;
+	return ss.str ( );
+}
+
+template < class SymbolType >
+UnrestrictedGrammar < SymbolType > UnrestrictedGrammar < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, UnrestrictedGrammar::getXmlTagName() );
+
+	std::set < SymbolType > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
+	std::set < SymbolType > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
+	SymbolType initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
+
+	UnrestrictedGrammar < SymbolType > grammar ( std::move ( initialSymbol ) );
+
+	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
+	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
+
+	GrammarFromXMLParser::parseRules ( input, grammar );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, UnrestrictedGrammar::getXmlTagName() );
+	return grammar;
+}
+
+template < class SymbolType >
+void UnrestrictedGrammar < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, UnrestrictedGrammar & grammar ) {
+	std::vector < SymbolType > lhs = GrammarFromXMLParser::parseRuleLHS ( input );
+	std::vector < SymbolType > rhs = GrammarFromXMLParser::parseRuleRHS ( input );
+
+	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
+}
+
+template < class SymbolType >
+void UnrestrictedGrammar < SymbolType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( UnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
+
+	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
+	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
+	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
+	composeRules ( out );
+
+	out.emplace_back ( UnrestrictedGrammar::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
+}
+
+template < class SymbolType >
+void UnrestrictedGrammar < 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::composeRuleLHS ( out, rule.first );
+			GrammarToXMLComposer::composeRuleRHS ( 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::UnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::UnrestrictedGrammar < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
 public:
-	static bool used ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::UnrestrictedGrammar < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const std::vector < SymbolType >, std::set < std::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
 			if ( std::find ( rule.first.begin ( ), rule.first.end ( ), symbol ) != rule.first.end ( ) )
 				return true;
 
-			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+			for ( const std::vector < SymbolType > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 					return true;
 
@@ -120,54 +257,54 @@ public:
 		return false;
 	}
 
-	static bool available ( const grammar::UnrestrictedGrammar &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::UnrestrictedGrammar < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::UnrestrictedGrammar < 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::UnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::UnrestrictedGrammar < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
 public:
-	static bool used ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::UnrestrictedGrammar < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const std::vector < SymbolType >, std::set < std::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
 			if ( std::find ( rule.first.begin ( ), rule.first.end ( ), symbol ) != rule.first.end ( ) )
 				return true;
 
-			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+			for ( const std::vector < SymbolType > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.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::UnrestrictedGrammar &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::UnrestrictedGrammar < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::UnrestrictedGrammar < 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::UnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol > {
+template < class SymbolType >
+class ElementConstraint< grammar::UnrestrictedGrammar < SymbolType >, SymbolType, grammar::InitialSymbol > {
 public:
-	static bool available ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
-		return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const grammar::UnrestrictedGrammar < SymbolType > & grammar, const SymbolType & symbol ) {
+		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const grammar::UnrestrictedGrammar &, const alphabet::Symbol & ) {
+	static void valid ( const grammar::UnrestrictedGrammar < SymbolType > &, const SymbolType & ) {
 	}
 };
 
diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp
index e8495252fa58ce3dc17fcaf114a3458d78d3e2e5..118d5f8adf5a7411a536db47f632b55a84524e90 100644
--- a/alib2data/test-src/grammar/GrammarTest.cpp
+++ b/alib2data/test-src/grammar/GrammarTest.cpp
@@ -35,36 +35,37 @@ void GrammarTest::tearDown() {
 }
 
 void GrammarTest::testUnrestrictedParser() {
-	grammar::UnrestrictedGrammar grammar(alphabet::symbolFrom(1));
-
-	grammar.addNonterminalSymbol(alphabet::symbolFrom(1));
-	grammar.addNonterminalSymbol(alphabet::symbolFrom(2));
-	grammar.addNonterminalSymbol(alphabet::symbolFrom(3));
-	grammar.addTerminalSymbol(alphabet::symbolFrom("a"));
-	grammar.addTerminalSymbol(alphabet::symbolFrom("b"));
-
-	grammar.addRule({alphabet::symbolFrom(1)}, {alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
-	grammar.addRule({alphabet::symbolFrom(2)}, {alphabet::symbolFrom("b"), alphabet::symbolFrom(3)});
-	grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(2), alphabet::symbolFrom(2)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
-	grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(2)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("b"), alphabet::symbolFrom(3)});
-	grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(1)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom(3)});
-	grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(1)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("a"), alphabet::symbolFrom("a"), alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
-	grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(2)}, std::vector<alphabet::Symbol> {});
-
-	CPPUNIT_ASSERT( grammar == grammar );
 	{
+		grammar::UnrestrictedGrammar < > grammar(alphabet::symbolFrom(1));
+
+		grammar.addNonterminalSymbol(alphabet::symbolFrom(1));
+		grammar.addNonterminalSymbol(alphabet::symbolFrom(2));
+		grammar.addNonterminalSymbol(alphabet::symbolFrom(3));
+		grammar.addTerminalSymbol(alphabet::symbolFrom("a"));
+		grammar.addTerminalSymbol(alphabet::symbolFrom("b"));
+
+		grammar.addRule({alphabet::symbolFrom(1)}, {alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
+		grammar.addRule({alphabet::symbolFrom(2)}, {alphabet::symbolFrom("b"), alphabet::symbolFrom(3)});
+		grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(2), alphabet::symbolFrom(2)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
+		grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(2)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("b"), alphabet::symbolFrom(3)});
+		grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(1)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom(3)});
+		grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(1)}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("a"), alphabet::symbolFrom("a"), alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
+		grammar.addRule(std::vector<alphabet::Symbol> {alphabet::symbolFrom(2)}, std::vector<alphabet::Symbol> {});
+
+		CPPUNIT_ASSERT( grammar == grammar );
+
 		std::deque<sax::Token> tokens = alib::XmlDataFactory::toTokens(grammar);
 		std::string tmp;
 		sax::SaxComposeInterface::printMemory(tmp, tokens);
 
 		std::deque<sax::Token> tokens2;
 		sax::SaxParseInterface::parseMemory(tmp, tokens2);
-		grammar::UnrestrictedGrammar grammar2 = alib::XmlDataFactory::fromTokens<grammar::UnrestrictedGrammar>(std::move(tokens2));
+		grammar::UnrestrictedGrammar < > grammar2 = alib::XmlDataFactory::fromTokens<grammar::UnrestrictedGrammar < > >(std::move(tokens2));
 
 		CPPUNIT_ASSERT( grammar == grammar2 );
 	}
 	{
-		grammar::ContextPreservingUnrestrictedGrammar grammar(alphabet::symbolFrom(1));
+		grammar::ContextPreservingUnrestrictedGrammar < > grammar(alphabet::symbolFrom(1));
 
 		grammar.addNonterminalSymbol(alphabet::symbolFrom(1));
 		grammar.addNonterminalSymbol(alphabet::symbolFrom(2));
@@ -77,18 +78,18 @@ void GrammarTest::testUnrestrictedParser() {
 		grammar.addRule(std::vector<alphabet::Symbol> {}, alphabet::symbolFrom(1), std::vector<alphabet::Symbol> {}, std::vector<alphabet::Symbol> {alphabet::symbolFrom(3)});
 		grammar.addRule(std::vector<alphabet::Symbol> {}, alphabet::symbolFrom(1), std::vector<alphabet::Symbol> {}, std::vector<alphabet::Symbol> {alphabet::symbolFrom("a"), alphabet::symbolFrom("a"), alphabet::symbolFrom("a"), alphabet::symbolFrom(2)});
 		grammar.addRule(std::vector<alphabet::Symbol> {}, alphabet::symbolFrom(2), std::vector<alphabet::Symbol> {}, std::vector<alphabet::Symbol> {});
+
 		CPPUNIT_ASSERT( grammar == grammar );
-		{
-			std::deque<sax::Token> tokens = alib::XmlDataFactory::toTokens(grammar);
-			std::string tmp;
-			sax::SaxComposeInterface::printMemory(tmp, tokens);
 
-			std::deque<sax::Token> tokens2;
-			sax::SaxParseInterface::parseMemory(tmp, tokens2);
-			grammar::ContextPreservingUnrestrictedGrammar grammar2 = alib::XmlDataFactory::fromTokens<grammar::ContextPreservingUnrestrictedGrammar>(std::move(tokens2));
+		std::deque<sax::Token> tokens = alib::XmlDataFactory::toTokens(grammar);
+		std::string tmp;
+		sax::SaxComposeInterface::printMemory(tmp, tokens);
 
-			CPPUNIT_ASSERT( grammar == grammar2 );
-		}
+		std::deque<sax::Token> tokens2;
+		sax::SaxParseInterface::parseMemory(tmp, tokens2);
+		grammar::ContextPreservingUnrestrictedGrammar < > grammar2 = alib::XmlDataFactory::fromTokens<grammar::ContextPreservingUnrestrictedGrammar < > >(std::move(tokens2));
+
+		CPPUNIT_ASSERT( grammar == grammar2 );
 	}
 }
 
diff --git a/alib2str/src/grammar/GrammarFromStringParser.cpp b/alib2str/src/grammar/GrammarFromStringParser.cpp
index 4aea27dbb64b529dd7f343b05e99d7f19b233c4e..aa352b1c0882f9acad6e31a730b94ac44cda4d5a 100644
--- a/alib2str/src/grammar/GrammarFromStringParser.cpp
+++ b/alib2str/src/grammar/GrammarFromStringParser.cpp
@@ -548,22 +548,22 @@ CSG < > GrammarFromStringParser::parseCSG(std::istream& input) const {
 	return parsePreservingCSLikeGrammar< CSG < > >(input);
 }
 
-ContextPreservingUnrestrictedGrammar GrammarFromStringParser::parseContextPreservingUnrestrictedGrammar(std::istream& input) const {
+ContextPreservingUnrestrictedGrammar < > GrammarFromStringParser::parseContextPreservingUnrestrictedGrammar(std::istream& input) const {
 	GrammarFromStringLexer::Token token = m_GrammarLexer.next(input);
 	if(token.type != GrammarFromStringLexer::TokenType::CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR) {
 		throw exception::CommonException("Unrecognised ContextPreservingUnrestrictedGrammar token.");
 	}
 
-	return parsePreservingCSLikeGrammar<ContextPreservingUnrestrictedGrammar>(input);
+	return parsePreservingCSLikeGrammar<ContextPreservingUnrestrictedGrammar < > >(input);
 }
 
-UnrestrictedGrammar GrammarFromStringParser::parseUnrestrictedGrammar(std::istream& input) const {
+UnrestrictedGrammar < > GrammarFromStringParser::parseUnrestrictedGrammar(std::istream& input) const {
 	GrammarFromStringLexer::Token token = m_GrammarLexer.next(input);
 	if(token.type != GrammarFromStringLexer::TokenType::UNRESTRICTED_GRAMMAR) {
 		throw exception::CommonException("Unrecognised UnrestrictedGrammar token.");
 	}
 
-	return parseCSLikeGrammar<UnrestrictedGrammar>(input);
+	return parseCSLikeGrammar<UnrestrictedGrammar < > >(input);
 }
 
 } /* namespace grammar */
diff --git a/alib2str/src/grammar/GrammarFromStringParser.h b/alib2str/src/grammar/GrammarFromStringParser.h
index 6c452befaa679e120272ba5a1b5d6ffb3daa3885..1f5454b6b587051908d87873bc857e7d0ba7f27a 100644
--- a/alib2str/src/grammar/GrammarFromStringParser.h
+++ b/alib2str/src/grammar/GrammarFromStringParser.h
@@ -58,8 +58,8 @@ private:
 
 	NonContractingGrammar < > parseNonContractingGrammar(std::istream& input) const;
 	CSG < > parseCSG(std::istream& input) const;
-	ContextPreservingUnrestrictedGrammar parseContextPreservingUnrestrictedGrammar(std::istream& input) const;
-	UnrestrictedGrammar parseUnrestrictedGrammar(std::istream& input) const;
+	ContextPreservingUnrestrictedGrammar < > parseContextPreservingUnrestrictedGrammar(std::istream& input) const;
+	UnrestrictedGrammar < > parseUnrestrictedGrammar(std::istream& input) const;
 
 	template<typename T> friend struct alib::stringApi;
 };
diff --git a/alib2str/src/grammar/GrammarToStringComposer.cpp b/alib2str/src/grammar/GrammarToStringComposer.cpp
index 1c95721982b99e54555f2dd4da74b4bd49f2dc1e..ced274a23b47bcc71c49407d1350140135264bbc 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.cpp
+++ b/alib2str/src/grammar/GrammarToStringComposer.cpp
@@ -261,18 +261,18 @@ void GrammarToStringComposer::compose(std::ostream& output, const NonContracting
 
 GrammarToStringComposer::RegistratorWrapper<void, NonContractingGrammar < > > GrammarToStringComposerNonContractingGrammar = GrammarToStringComposer::RegistratorWrapper<void, NonContractingGrammar < > >(GrammarToStringComposer::compose);
 
-void GrammarToStringComposer::compose(std::ostream& output, const ContextPreservingUnrestrictedGrammar& grammar) {
+void GrammarToStringComposer::compose(std::ostream& output, const ContextPreservingUnrestrictedGrammar < > & grammar) {
 	output << "CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR";
 	composePreservingCSLikeGrammar(output, grammar);
 }
 
-GrammarToStringComposer::RegistratorWrapper<void, ContextPreservingUnrestrictedGrammar> GrammarToStringComposerContextPreservingUnrestructedGrammar = GrammarToStringComposer::RegistratorWrapper<void, ContextPreservingUnrestrictedGrammar>(GrammarToStringComposer::compose);
+GrammarToStringComposer::RegistratorWrapper<void, ContextPreservingUnrestrictedGrammar < > > GrammarToStringComposerContextPreservingUnrestructedGrammar = GrammarToStringComposer::RegistratorWrapper<void, ContextPreservingUnrestrictedGrammar < > >(GrammarToStringComposer::compose);
 
-void GrammarToStringComposer::compose(std::ostream& output, const UnrestrictedGrammar& grammar) {
+void GrammarToStringComposer::compose(std::ostream& output, const UnrestrictedGrammar < > & grammar) {
 	output << "UNRESTRICTED_GRAMMAR";
 	composeCSLikeGrammar(output, grammar);
 }
 
-GrammarToStringComposer::RegistratorWrapper<void, UnrestrictedGrammar> GrammarToStringComposerUnrestructedGrammar = GrammarToStringComposer::RegistratorWrapper<void, UnrestrictedGrammar>(GrammarToStringComposer::compose);
+GrammarToStringComposer::RegistratorWrapper<void, UnrestrictedGrammar < > > GrammarToStringComposerUnrestructedGrammar = GrammarToStringComposer::RegistratorWrapper<void, UnrestrictedGrammar < > >(GrammarToStringComposer::compose);
 
 }
diff --git a/alib2str/src/grammar/GrammarToStringComposer.h b/alib2str/src/grammar/GrammarToStringComposer.h
index 216dc73034fbba67de267f067f6ef1fcf100d382..d61fc55affc9d14623c774dbba2cd845f2d0fcd0 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.h
+++ b/alib2str/src/grammar/GrammarToStringComposer.h
@@ -35,8 +35,8 @@ public:
 	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);
-	static void compose(std::ostream& output, const UnrestrictedGrammar& grammar);
+	static void compose(std::ostream& output, const ContextPreservingUnrestrictedGrammar < > & grammar);
+	static void compose(std::ostream& output, const UnrestrictedGrammar < > & grammar);
 };
 
 }