diff --git a/alib2data/src/string/CyclicString.cpp b/alib2data/src/string/CyclicString.cpp
index c40c2519dc2a9203f50c12f0740f5d608ca5ef50..447759ae47069366790aeeba1809e58925a9b5a7 100644
--- a/alib2data/src/string/CyclicString.cpp
+++ b/alib2data/src/string/CyclicString.cpp
@@ -23,7 +23,7 @@
 
 namespace string {
 
-CyclicString::CyclicString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+CyclicString::CyclicString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components2 < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 	setContent(std::move(data));
 }
 
@@ -111,25 +111,6 @@ void CyclicString::compose(std::deque<sax::Token>& out) const {
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::CyclicString::Component < ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector<alphabet::Symbol>& content = static_cast < const ::string::CyclicString * > ( this )->getContent ( );
-	return std::find(content.begin(), content.end(), symbol) != content.end();
-}
-
-template < >
-bool ::string::CyclicString::Component < ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::CyclicString::Component < ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto cyclicStringParserRegister = xmlApi<string::String>::ParserRegister<string::CyclicString>();
diff --git a/alib2data/src/string/CyclicString.h b/alib2data/src/string/CyclicString.h
index 2dc7b101b2b327f48aa426a73a226ca1ea5f9c34..907e97ca8c98a607140b5800c0a23d0de7ee91e4 100644
--- a/alib2data/src/string/CyclicString.h
+++ b/alib2data/src/string/CyclicString.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace string {
 
@@ -24,7 +24,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of CyclicStringElement.
  */
-class CyclicString : public StringBase, public std::Components < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class CyclicString : public StringBase, public std::Components2 < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 public:
@@ -83,4 +83,24 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::CyclicString & string, const alphabet::Symbol & symbol ) {
+		const std::vector<alphabet::Symbol>& content = string.getContent ( );
+		return std::find(content.begin(), content.end(), symbol) != content.end();
+	}
+
+	static bool available ( const ::string::CyclicString &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::CyclicString &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* CYCLIC_STRING_H_ */
diff --git a/alib2data/src/string/Epsilon.cpp b/alib2data/src/string/Epsilon.cpp
index 6c88ae18026594e7c351e4165f04a22d55b74131..c7022f7fa7ef21830a23a4ea6bde992034b35406 100644
--- a/alib2data/src/string/Epsilon.cpp
+++ b/alib2data/src/string/Epsilon.cpp
@@ -16,7 +16,7 @@
 
 namespace string {
 
-Epsilon::Epsilon(std::set<alphabet::Symbol> alphabet) : std::Components < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+Epsilon::Epsilon(std::set<alphabet::Symbol> alphabet) : std::Components2 < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 }
 
 Epsilon::Epsilon() : Epsilon ( std::set< alphabet::Symbol > ( ) ) {
@@ -70,24 +70,6 @@ void Epsilon::compose(std::deque<sax::Token>& out) const {
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::Epsilon::Component < ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & ) const {
-	return false;
-}
-
-template < >
-bool ::string::Epsilon::Component < ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::Epsilon::Component < ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto epsilonParserRegister = xmlApi<string::String>::ParserRegister<string::Epsilon>();
diff --git a/alib2data/src/string/Epsilon.h b/alib2data/src/string/Epsilon.h
index b173a22a01ab496719ff42600722d07c4e6cb9af..ede29924e84d0efe3a9bf2fbb839bf1a349d9814 100644
--- a/alib2data/src/string/Epsilon.h
+++ b/alib2data/src/string/Epsilon.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace string {
 
@@ -23,7 +23,7 @@ class GeneralAlphabet;
  * Represents epsilon. Regular expression is stored
  * as a tree of EpsilonElement.
  */
-class Epsilon : public StringBase, public std::Components < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class Epsilon : public StringBase, public std::Components2 < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 public:
 	Epsilon ( );
 
@@ -79,4 +79,23 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::Epsilon &, const alphabet::Symbol & ) {
+		return false;
+	}
+
+	static bool available ( const ::string::Epsilon &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::Epsilon &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* EPSILON_H_ */
diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp
index 5b5fbc2e5d292252f65d05a1c502d1ddeac06e30..3f87b65df46b356da9a9e4e820f783a5c415b935 100644
--- a/alib2data/src/string/LinearString.cpp
+++ b/alib2data/src/string/LinearString.cpp
@@ -31,7 +31,7 @@
 
 namespace string {
 
-LinearString::LinearString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+LinearString::LinearString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components2 < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 	setContent(std::move(data));
 }
 
@@ -152,25 +152,6 @@ void LinearString::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::LinearString::Component < ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector<alphabet::Symbol>& content = static_cast < const ::string::LinearString * > ( this )->getContent ( );
-	return std::find(content.begin(), content.end(), symbol) != content.end();
-}
-
-template < >
-bool ::string::LinearString::Component < ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::LinearString::Component < ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto linearStringParserRegister = xmlApi < string::String >::ParserRegister < string::LinearString > ();
diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h
index 13bd6c5d09a26c2c929453f710e14e9cfb932f74..f38569014f1cd9b6636dd42368d978a6fc38a2a8 100644
--- a/alib2data/src/string/LinearString.h
+++ b/alib2data/src/string/LinearString.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace tree {
 
@@ -36,7 +36,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class LinearString : public StringBase, public std::Components < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class LinearString : public StringBase, public std::Components2 < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 public:
@@ -107,4 +107,24 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::LinearString & string, const alphabet::Symbol & symbol ) {
+		const std::vector<alphabet::Symbol>& content = string.getContent ( );
+		return std::find(content.begin(), content.end(), symbol) != content.end();
+	}
+
+	static bool available ( const ::string::LinearString &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::LinearString &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* LINEAR_STRING_H_ */
diff --git a/alib2data/src/string/LinearStringTerminatingSymbol.cpp b/alib2data/src/string/LinearStringTerminatingSymbol.cpp
index 498803f88a35293814a50cadf22cd030b70a37f7..598b75188aaee9bb3830d8f9c4414b5ed2c5abe8 100644
--- a/alib2data/src/string/LinearStringTerminatingSymbol.cpp
+++ b/alib2data/src/string/LinearStringTerminatingSymbol.cpp
@@ -22,7 +22,7 @@
 
 namespace string {
 
-LinearStringTerminatingSymbol::LinearStringTerminatingSymbol ( std::set < alphabet::Symbol > alphabet, alphabet::Symbol terminatingSymbol, std::vector < alphabet::Symbol > data ) : std::Components < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( terminatingSymbol ) ) ) {
+LinearStringTerminatingSymbol::LinearStringTerminatingSymbol ( std::set < alphabet::Symbol > alphabet, alphabet::Symbol terminatingSymbol, std::vector < alphabet::Symbol > data ) : std::Components2 < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( terminatingSymbol ) ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -118,34 +118,6 @@ void LinearStringTerminatingSymbol::compose ( std::deque < sax::Token > & out )
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::LinearStringTerminatingSymbol::Component < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector<alphabet::Symbol>& content = static_cast < const ::string::LinearStringTerminatingSymbol * > ( this )->getContent ( );
-	return std::find(content.begin(), content.end(), symbol) != content.end();
-}
-
-template < >
-bool ::string::LinearStringTerminatingSymbol::Component < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::LinearStringTerminatingSymbol::Component < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-template < >
-bool ::string::LinearStringTerminatingSymbol::Element < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::TerminatingSymbol >::available ( const alphabet::Symbol & symbol ) const {
-	return static_cast < const ::string::LinearStringTerminatingSymbol * > ( this )->getAlphabet ( ).count ( symbol );
-}
-
-template < >
-void ::string::LinearStringTerminatingSymbol::Element < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::TerminatingSymbol >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto linearStringTerminatingSymbolParserRegister = xmlApi < string::String >::ParserRegister < string::LinearStringTerminatingSymbol > ();
diff --git a/alib2data/src/string/LinearStringTerminatingSymbol.h b/alib2data/src/string/LinearStringTerminatingSymbol.h
index b7d087f251b911dd657d5286fc8a72fa198b1c9f..e2f9ef56bae5ecd6f65944cb0db2453fb8134e7e 100644
--- a/alib2data/src/string/LinearStringTerminatingSymbol.h
+++ b/alib2data/src/string/LinearStringTerminatingSymbol.h
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace string {
 
@@ -26,7 +26,7 @@ class TerminatingSymbol;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class LinearStringTerminatingSymbol : public StringBase, public std::Components < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > {
+class LinearStringTerminatingSymbol : public StringBase, public std::Components2 < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 public:
@@ -92,4 +92,35 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::LinearStringTerminatingSymbol & string, const alphabet::Symbol & symbol ) {
+		const std::vector<alphabet::Symbol>& content = string.getContent ( );
+		return std::find(content.begin(), content.end(), symbol) != content.end();
+	}
+
+	static bool available ( const ::string::LinearStringTerminatingSymbol &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::LinearStringTerminatingSymbol &, const alphabet::Symbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::TerminatingSymbol > {
+public:
+	static bool available ( const ::string::LinearStringTerminatingSymbol & string, const alphabet::Symbol & symbol ) {
+		return string.getAlphabet ( ).count ( symbol );
+	}
+
+	static void valid ( const ::string::LinearStringTerminatingSymbol &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* LINEAR_STRING_TERMINATING_SYMBOL_H_ */