diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h
index 996a107cce7b03044ceb3b863a13f5ec48e7ad0c..fbbe3fab974640a1c8acd2fd49792618a607da10 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.h
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.h
@@ -10,7 +10,7 @@
 
 #include "../AutomatonException.h"
 #include <map>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 #include "../AutomatonBase.h"
 #include "../common/State.h"
 #include "../../regexp/RegExp.h"
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
index 269fdda994f2db8128f6e875bbd1c3c17d7b74d3..2c4894380e164f59b590b7a601278f55e3661af0 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "ContextPreservingUnrestrictedGrammar.h"
-#include "../GrammarException.h"
 #include <algorithm>
 #include <sstream>
 
@@ -24,7 +23,7 @@ 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 ) ) ) {
+ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components2 < 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 {
@@ -144,97 +143,6 @@ void ContextPreservingUnrestrictedGrammar::composeRules ( std::deque < sax::Toke
 
 } /* namespace grammar */
 
-namespace std {
-
-template < >
-bool grammar::ContextPreservingUnrestrictedGrammar::Component < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const grammar::ContextPreservingUnrestrictedGrammar * grammar = static_cast < const grammar::ContextPreservingUnrestrictedGrammar * > ( this );
-
-	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 ) )
-			if ( lCont == symbol )
-				return true;
-
-		for ( const alphabet::Symbol & rCont : std::get < 2 > ( rule.first ) )
-			if ( rCont == symbol )
-				return true;
-
-		for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
-			if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
-				return true;
-
-	}
-
-	return false;
-}
-
-template < >
-bool grammar::ContextPreservingUnrestrictedGrammar::Component < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void grammar::ContextPreservingUnrestrictedGrammar::Component < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet >::valid ( const alphabet::Symbol & symbol ) const {
-	const grammar::ContextPreservingUnrestrictedGrammar * grammar = static_cast < const grammar::ContextPreservingUnrestrictedGrammar * > ( this );
-
-	if ( grammar->accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
-		throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
-}
-
-template < >
-bool grammar::ContextPreservingUnrestrictedGrammar::Component < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const grammar::ContextPreservingUnrestrictedGrammar * grammar = static_cast < const grammar::ContextPreservingUnrestrictedGrammar * > ( this );
-
-	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 ) )
-			if ( lCont == symbol )
-				return true;
-
-		if ( std::get < 1 > ( rule.first ) == symbol )
-			return true;
-
-		for ( const alphabet::Symbol & rCont : std::get < 2 > ( rule.first ) )
-			if ( rCont == symbol )
-				return true;
-
-		for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
-			if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
-				return true;
-
-	}
-
-	if ( grammar->accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
-		return true;
-
-	return false;
-}
-
-template < >
-bool grammar::ContextPreservingUnrestrictedGrammar::Component < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void grammar::ContextPreservingUnrestrictedGrammar::Component < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet >::valid ( const alphabet::Symbol & symbol ) const {
-	const grammar::ContextPreservingUnrestrictedGrammar * grammar = static_cast < const grammar::ContextPreservingUnrestrictedGrammar * > ( this );
-
-	if ( grammar->accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
-		throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
-}
-
-template < >
-bool grammar::ContextPreservingUnrestrictedGrammar::Element < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol >::available ( const alphabet::Symbol & symbol ) const {
-	const grammar::ContextPreservingUnrestrictedGrammar * grammar = static_cast < const grammar::ContextPreservingUnrestrictedGrammar * > ( this );
-
-	return grammar->accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void grammar::ContextPreservingUnrestrictedGrammar::Element < grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto ContextPreservingUnrestrictedGrammarParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::ContextPreservingUnrestrictedGrammar > ( );
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
index 380024ebef18c319f589f21ffdd57bda76f5691b..16fe60237655d2fcbf89f7caac9549481d62b93b 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
@@ -8,10 +8,11 @@
 #ifndef CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR_H_
 #define CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR_H_
 
+#include "../GrammarException.h"
 #include "../GrammarBase.h"
 #include <map>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 #include "../../alphabet/Symbol.h"
 
 namespace grammar {
@@ -23,7 +24,7 @@ class TerminalAlphabet;
 class NonterminalAlphabet;
 class InitialSymbol;
 
-class ContextPreservingUnrestrictedGrammar : public GrammarBase, public std::Components < ContextPreservingUnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
+class ContextPreservingUnrestrictedGrammar : public GrammarBase, public std::Components2 < 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;
 
 public:
@@ -100,4 +101,89 @@ public:
 
 } /* namespace grammar */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, 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 ) )
+				if ( lCont == symbol )
+					return true;
+
+			for ( const alphabet::Symbol & rCont : std::get < 2 > ( rule.first ) )
+				if ( rCont == symbol )
+					return true;
+
+			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
+					return true;
+
+		}
+
+		return false;
+	}
+
+	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
+		if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
+			throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
+	}
+};
+
+template < >
+class ComponentConstraint2< grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, 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 ) )
+				if ( lCont == symbol )
+					return true;
+
+			if ( std::get < 1 > ( rule.first ) == symbol )
+				return true;
+
+			for ( const alphabet::Symbol & rCont : std::get < 2 > ( rule.first ) )
+				if ( rCont == symbol )
+					return true;
+
+			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
+					return true;
+
+		}
+
+		if ( grammar.accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
+			return true;
+
+		return false;
+	}
+
+	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
+		if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
+			throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
+	}
+};
+
+template < >
+class ElementConstraint2< grammar::ContextPreservingUnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol > {
+public:
+	static bool available ( const grammar::ContextPreservingUnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
+		return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const grammar::ContextPreservingUnrestrictedGrammar &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR_H_ */
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
index da6290017f7d732510cff69777c7d17f20f44d20..33257a25ff5e78b7f5c71d37bd5d77dfd5117e8e 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "UnrestrictedGrammar.h"
-#include "../GrammarException.h"
 #include <algorithm>
 #include <sstream>
 
@@ -24,7 +23,7 @@ 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 ) ) ) {
+UnrestrictedGrammar::UnrestrictedGrammar ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components2 < 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 {
@@ -138,84 +137,6 @@ void UnrestrictedGrammar::composeRules ( std::deque < sax::Token > & out ) const
 
 } /* namespace grammar */
 
-namespace std {
-
-template < >
-bool grammar::UnrestrictedGrammar::Component < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const grammar::UnrestrictedGrammar * grammar = static_cast < const grammar::UnrestrictedGrammar * > ( this );
-
-	for ( const std::pair < const std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > & 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 )
-			if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
-				return true;
-
-	}
-
-	return false;
-}
-
-template < >
-bool grammar::UnrestrictedGrammar::Component < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void grammar::UnrestrictedGrammar::Component < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::TerminalAlphabet >::valid ( const alphabet::Symbol & symbol ) const {
-	const grammar::UnrestrictedGrammar * grammar = static_cast < const grammar::UnrestrictedGrammar * > ( this );
-
-	if ( grammar->accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
-		throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
-}
-
-template < >
-bool grammar::UnrestrictedGrammar::Component < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const grammar::UnrestrictedGrammar * grammar = static_cast < const grammar::UnrestrictedGrammar * > ( this );
-
-	for ( const std::pair < const std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > & 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 )
-			if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
-				return true;
-
-	}
-
-	if ( grammar->accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
-		return true;
-
-	return false;
-}
-
-template < >
-bool grammar::UnrestrictedGrammar::Component < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void grammar::UnrestrictedGrammar::Component < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::NonterminalAlphabet >::valid ( const alphabet::Symbol & symbol ) const {
-	const grammar::UnrestrictedGrammar * grammar = static_cast < const grammar::UnrestrictedGrammar * > ( this );
-
-	if ( grammar->accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
-		throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
-}
-
-template < >
-bool grammar::UnrestrictedGrammar::Element < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol >::available ( const alphabet::Symbol & symbol ) const {
-	const grammar::UnrestrictedGrammar * grammar = static_cast < const grammar::UnrestrictedGrammar * > ( this );
-
-	return grammar->accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void grammar::UnrestrictedGrammar::Element < grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto UnrestrictedGrammarParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::UnrestrictedGrammar > ( );
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
index 756c90c80ba2d55a5220260d7c92034b95d875bf..2ae172e00ec254d9ebf2a0caf191eb7116742abf 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
@@ -8,10 +8,11 @@
 #ifndef UNRESTRICTED_GRAMMAR_H_
 #define UNRESTRICTED_GRAMMAR_H_
 
+#include "../GrammarException.h"
 #include "../GrammarBase.h"
 #include <map>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 #include "../../alphabet/Symbol.h"
 
 namespace grammar {
@@ -23,7 +24,7 @@ class TerminalAlphabet;
 class NonterminalAlphabet;
 class InitialSymbol;
 
-class UnrestrictedGrammar : public GrammarBase, public std::Components < UnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
+class UnrestrictedGrammar : public GrammarBase, public std::Components2 < UnrestrictedGrammar, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
 	std::map < std::vector < alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > rules;
 
 public:
@@ -100,4 +101,76 @@ public:
 
 } /* namespace grammar */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< grammar::UnrestrictedGrammar, alphabet::Symbol, 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 ( ) ) {
+			if ( std::find ( rule.first.begin ( ), rule.first.end ( ), symbol ) != rule.first.end ( ) )
+				return true;
+
+			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
+					return true;
+
+		}
+
+		return false;
+	}
+
+	static bool available ( const grammar::UnrestrictedGrammar &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
+		if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
+			throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
+	}
+};
+
+template < >
+class ComponentConstraint2< grammar::UnrestrictedGrammar, alphabet::Symbol, 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 ( ) ) {
+			if ( std::find ( rule.first.begin ( ), rule.first.end ( ), symbol ) != rule.first.end ( ) )
+				return true;
+
+			for ( const std::vector < alphabet::Symbol > & rhs : rule.second )
+				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
+					return true;
+
+		}
+
+		if ( grammar.accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
+			return true;
+
+		return false;
+	}
+
+	static bool available ( const grammar::UnrestrictedGrammar &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
+		if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
+			throw grammar::GrammarException ( "Symbol " + ( std::string ) symbol + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
+	}
+};
+
+template < >
+class ElementConstraint2< grammar::UnrestrictedGrammar, alphabet::Symbol, grammar::InitialSymbol > {
+public:
+	static bool available ( const grammar::UnrestrictedGrammar & grammar, const alphabet::Symbol & symbol ) {
+		return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const grammar::UnrestrictedGrammar &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* UNRESTRICTED_GRAMMAR_H_ */