diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index cb4d4f907b9d63f214ad601701d214c3df64a284..c716d8efa3327763cb8857773d53d250000fb9a4 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -111,7 +111,7 @@ template < >
 class ComponentConstraint2< tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
 public:
 	static bool used ( const tree::PrefixRankedBarPattern & pattern, const alphabet::RankedSymbol & symbol ) {
-	const std::vector < alphabet::RankedSymbol > & content = pattern.getContent ( );
+		const std::vector < alphabet::RankedSymbol > & content = pattern.getContent ( );
 
 		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol || pattern.accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
 	}
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index f430304b38c84b084634752f8523a56bbcc1f15d..21e311ee85f18504cb6c227cb9ced207eb859858 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "PrefixRankedBarTree.h"
-#include "../TreeException.h"
 
 #include <sstream>
 #include <algorithm>
@@ -28,7 +27,7 @@
 
 namespace tree {
 
-PrefixRankedBarTree::PrefixRankedBarTree ( std::set < alphabet::RankedSymbol > bars, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ), std::move ( bars ) ), std::tuple < > ( ) ) {
+PrefixRankedBarTree::PrefixRankedBarTree ( std::set < alphabet::RankedSymbol > bars, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components2 < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ), std::move ( bars ) ), std::tuple < > ( ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -154,44 +153,6 @@ void PrefixRankedBarTree::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const std::vector < alphabet::RankedSymbol > & content = static_cast < const tree::PrefixRankedBarTree * > ( this )->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
-}
-
-template < >
-bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const std::vector < alphabet::RankedSymbol > & content = static_cast < const tree::PrefixRankedBarTree * > ( this )->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
-}
-
-template < >
-bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarTree * tree = static_cast < const tree::PrefixRankedBarTree * > ( this );
-
-	return tree->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto prefixRankedBarTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarTree > ();
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
index e098af96a0080191fd43890329ee6d02a9f2f524..e51e867b68279cee28b536e9ee6426c90d84f282 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
@@ -10,8 +10,9 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "RankedNode.h"
@@ -26,7 +27,7 @@ class BarSymbols;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedBarTree : public RankedTreeBase, public std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < > > {
+class PrefixRankedBarTree : public RankedTreeBase, public std::Components2 < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	static void toPrefixRankedBar ( const RankedNode & node, const alphabet::Symbol & barBase, std::vector < alphabet::RankedSymbol > & linearNotation );
@@ -92,4 +93,42 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedBarTree & tree, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = tree.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
+	}
+
+	static bool available ( const tree::PrefixRankedBarTree &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixRankedBarTree &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols > {
+public:
+	static bool used ( const tree::PrefixRankedBarTree & tree, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = tree.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
+	}
+
+	static bool available ( const tree::PrefixRankedBarTree & tree, const alphabet::RankedSymbol & symbol ) {
+		return tree.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarTree &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_RANKED_BAR_TREE_H_ */
diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
index 46152b78a734bd21fbdc8e19debe8b3ee4d715c2..a3eda5ef29d8065f9b2dcc132d433fa384e977d9 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "PrefixRankedNonlinearPattern.h"
-#include "../TreeException.h"
 
 #include <sstream>
 #include <algorithm>
@@ -31,7 +30,7 @@
 
 namespace tree {
 
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( subtreeWildcard ) ) {
+PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components2 < PrefixRankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( subtreeWildcard ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -170,68 +169,6 @@ void PrefixRankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) c
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixRankedNonlinearPattern::Component < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedNonlinearPattern * pattern = static_cast < const tree::PrefixRankedNonlinearPattern * > ( this );
-	const std::vector < alphabet::RankedSymbol > & content = pattern->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
-}
-
-template < >
-bool tree::PrefixRankedNonlinearPattern::Component < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixRankedNonlinearPattern::Component < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedNonlinearPattern::Component < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::used ( const alphabet::RankedSymbol & ) const {
-	return false;
-}
-
-template < >
-bool tree::PrefixRankedNonlinearPattern::Component < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedNonlinearPattern * pattern = static_cast < const tree::PrefixRankedNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedNonlinearPattern::Component < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedNonlinearPattern * pattern = static_cast < const tree::PrefixRankedNonlinearPattern * > ( this );
-
-	if ( symbol.getRank ( ).getData ( ) != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-
-	if ( pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
-}
-
-template < >
-bool tree::PrefixRankedNonlinearPattern::Element < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedNonlinearPattern * pattern = static_cast < const tree::PrefixRankedNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedNonlinearPattern::Element < tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedNonlinearPattern * pattern = static_cast < const tree::PrefixRankedNonlinearPattern * > ( this );
-
-	if ( symbol.getRank ( ).getData ( ) != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-
-	if ( pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto prefixRankedNonlinearPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedNonlinearPattern > ( );
diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
index f65e2647992c987c55f82a4260a9d1f64de8ed7f..915e334c73b2c691c6395ddf8bc4843261ee4682 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
@@ -10,8 +10,9 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "RankedNode.h"
@@ -32,7 +33,7 @@ class NonlinearAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
+class PrefixRankedNonlinearPattern : public RankedTreeBase, public std::Components2 < PrefixRankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	static std::vector < alphabet::RankedSymbol > toPrefixRanked ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const std::set < alphabet::RankedSymbol > & nonlinearVariables );
@@ -106,4 +107,61 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = pattern.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
+	}
+
+	static bool available ( const tree::PrefixRankedNonlinearPattern &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixRankedNonlinearPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedNonlinearPattern &, const alphabet::RankedSymbol & ) {
+		return false;
+	}
+
+	static bool available ( const tree::PrefixRankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol) {
+		if ( symbol.getRank ( ).getData ( ) != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+
+		if ( pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixRankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::PrefixRankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol) {
+		if ( symbol.getRank ( ).getData ( ) != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+
+		if ( pattern.accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_RANKED_NONLINEAR_PATTERN_H_ */
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index fad5af6a8d9aeb8b904999b5aa7f5b11c9c45fc8..c5efa441ae4ebb1577bd926e4f38bca61ffc3cbb 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "PrefixRankedPattern.h"
-#include "../TreeException.h"
 
 #include <sstream>
 #include <algorithm>
@@ -28,7 +27,7 @@
 
 namespace tree {
 
-PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( subtreeWildcard ) ) {
+PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components2 < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( subtreeWildcard ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -147,39 +146,6 @@ void PrefixRankedPattern::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixRankedPattern::Component < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedPattern * pattern = static_cast < const tree::PrefixRankedPattern * > ( this );
-	const std::vector < alphabet::RankedSymbol > & content = pattern->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
-}
-
-template < >
-bool tree::PrefixRankedPattern::Component < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixRankedPattern::Component < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
-	return static_cast < const tree::PrefixRankedPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	if( symbol.getRank().getData() != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-}
-
-} /* namespace std */
-
-
 namespace alib {
 
 auto prefixRankedPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedPattern > ();
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h
index 8f9c18588993ec96ed73c7f6291325e74e376cca..873c625f14b31178d0ca3b7a0e8957837d8f31d2 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h
@@ -10,8 +10,9 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "RankedNode.h"
@@ -27,7 +28,7 @@ class SubtreeWildcard;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedPattern : public RankedTreeBase, public std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
+class PrefixRankedPattern : public RankedTreeBase, public std::Components2 < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	static std::vector < alphabet::RankedSymbol > toPrefixRanked ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard );
@@ -93,4 +94,38 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = pattern.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
+	}
+
+	static bool available ( const tree::PrefixRankedPattern &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixRankedPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::PrefixRankedPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedPattern &, const alphabet::RankedSymbol & symbol) {
+		if( symbol.getRank().getData() != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_RANKED_PATTERN_H_ */
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
index 9ce420f2327e90f6d1542824bea78dce56aa113f..5a4f270abc86700a01d73ca0d5489306d681b914 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "PrefixRankedTree.h"
-#include "../TreeException.h"
 
 #include <sstream>
 #include <algorithm>
@@ -25,7 +24,7 @@
 
 namespace tree {
 
-PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components2 < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -135,26 +134,6 @@ void PrefixRankedTree::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixRankedTree::Component < tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const std::vector < alphabet::RankedSymbol > & content = static_cast < const tree::PrefixRankedTree * > ( this )->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
-}
-
-template < >
-bool tree::PrefixRankedTree::Component < tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixRankedTree::Component < tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto prefixRankedTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedTree > ();
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.h b/alib2data/src/tree/ranked/PrefixRankedTree.h
index 52e8a829a379d29526dd43e24ab4dc356dd6bb3c..2d7ffec159272a5e9d646b92abf66c78ca994b1a 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.h
@@ -10,8 +10,9 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "RankedNode.h"
@@ -25,7 +26,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedTree : public RankedTreeBase, public std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class PrefixRankedTree : public RankedTreeBase, public std::Components2 < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	static std::vector < alphabet::RankedSymbol > toPrefixRanked ( const RankedNode & node );
@@ -86,4 +87,25 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedTree & tree, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = tree.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
+	}
+
+	static bool available ( const tree::PrefixRankedTree &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixRankedTree &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_RANKED_TREE_H_ */
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
index c5c344b5f171a88591b8bd74946d4e2b01bb869e..11dd146d2f964aa812380491637bec009f7d4ccf 100644
--- a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "RankedNonlinearPattern.h"
-#include "../TreeException.h"
 
 #include <iostream>
 #include <algorithm>
@@ -25,7 +24,7 @@
 
 namespace tree {
 
-RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
+RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : std::Components2 < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
 	setTree ( std::move ( pattern ) );
 }
 
@@ -35,11 +34,11 @@ RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeW
 RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, RankedNode pattern ) : RankedNonlinearPattern ( subtreeWildcard, std::set < alphabet::RankedSymbol > { }, pattern ) {
 }
 
-RankedNonlinearPattern::RankedNonlinearPattern ( const RankedNonlinearPattern & other ) : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
+RankedNonlinearPattern::RankedNonlinearPattern ( const RankedNonlinearPattern & other ) : std::Components2 < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet() ) );
 }
 
-RankedNonlinearPattern::RankedNonlinearPattern ( RankedNonlinearPattern && other ) noexcept : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
+RankedNonlinearPattern::RankedNonlinearPattern ( RankedNonlinearPattern && other ) noexcept : std::Components2 < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet() ) );
 }
 
@@ -133,67 +132,6 @@ void RankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this );
-
-	return pattern->getRoot ( ).testSymbol ( symbol ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::used ( const alphabet::RankedSymbol & ) const {
-	return false;
-}
-
-template < >
-bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this );
-
-	if( symbol.getRank().getData() != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-
-	if ( pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
-}
-
-template < >
-bool tree::RankedNonlinearPattern::Element < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::RankedNonlinearPattern::Element < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this );
-
-	if( symbol.getRank().getData() != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-
-	if ( pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto RankedNonlinearPatternParserRegister  = xmlApi < tree::Tree >::ParserRegister < tree::RankedNonlinearPattern > ( );
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.h b/alib2data/src/tree/ranked/RankedNonlinearPattern.h
index f52d02ce1089f78e47f0c40673b572c23d2f4875..25a72b4c9e722800afcef51de1ea48805de2ce5e 100644
--- a/alib2data/src/tree/ranked/RankedNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.h
@@ -10,8 +10,9 @@
 
 #include <string>
 #include <set>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "RankedNode.h"
 #include "../RankedTreeBase.h"
 
@@ -27,7 +28,7 @@ class NonlinearAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a pattern of RegExpElement.
  */
-class RankedNonlinearPattern : public RankedTreeBase, public std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
+class RankedNonlinearPattern : public RankedTreeBase, public std::Components2 < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::smart_ptr < RankedNode > pattern;
 
 public:
@@ -119,4 +120,59 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::RankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.getRoot ( ).testSymbol ( symbol ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern.accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static bool available ( const tree::RankedNonlinearPattern &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::RankedNonlinearPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet > {
+public:
+	static bool used ( const tree::RankedNonlinearPattern &, const alphabet::RankedSymbol & ) {
+		return false;
+	}
+
+	static bool available ( const tree::RankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+}
+
+	static void valid ( const tree::RankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol) {
+		if( symbol.getRank().getData() != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+
+		if ( pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
+	}
+};
+
+template < >
+class ElementConstraint2< tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::RankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::RankedNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol) {
+		if( symbol.getRank().getData() != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+
+		if ( pattern.accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* RANKED_NONLINEAR_PATTERN_H_ */
diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp
index 4f6548c76ff888d480bf3f0817c1cb0ada665ef3..8f7e1f2c5e7f0ebcd49702323655f947eafafb79 100644
--- a/alib2data/src/tree/ranked/RankedPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "RankedPattern.h"
-#include "../TreeException.h"
 
 #include <iostream>
 #include <algorithm>
@@ -25,7 +24,7 @@
 
 namespace tree {
 
-RankedPattern::RankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : std::Components < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
+RankedPattern::RankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : std::Components2 < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
 	setTree ( std::move ( pattern ) );
 }
 
@@ -35,11 +34,11 @@ RankedPattern::RankedPattern ( alphabet::RankedSymbol subtreeWildcard, RankedNod
 RankedPattern::RankedPattern ( const UnrankedPattern & other ) : RankedPattern ( alphabet::RankedSymbol ( other.getSubtreeWildcard ( ), 0 ), other.getRoot ( ).asRanked ( ) ) {
 }
 
-RankedPattern::RankedPattern ( const RankedPattern & other ) : std::Components < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
+RankedPattern::RankedPattern ( const RankedPattern & other ) : std::Components2 < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet() ) );
 }
 
-RankedPattern::RankedPattern ( RankedPattern && other ) noexcept : std::Components < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
+RankedPattern::RankedPattern ( RankedPattern && other ) noexcept : std::Components2 < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet() ) );
 }
 
@@ -130,37 +129,6 @@ void RankedPattern::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::RankedPattern::Component < tree::RankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::RankedPattern * pattern = static_cast < const tree::RankedPattern * > ( this );
-
-	return pattern->getRoot ( ).testSymbol ( symbol ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
-}
-
-template < >
-bool tree::RankedPattern::Component < tree::RankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::RankedPattern::Component < tree::RankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::RankedPattern::Element < tree::RankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
-	return static_cast < const tree::RankedPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::RankedPattern::Element < tree::RankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	if( symbol.getRank().getData() != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto rankedPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::RankedPattern > ();
diff --git a/alib2data/src/tree/ranked/RankedPattern.h b/alib2data/src/tree/ranked/RankedPattern.h
index edcfa94ba6686b172f3ba498d52464a8f2119197..d0fa2fedea4bf37506dd27bdde319dedccab7485 100644
--- a/alib2data/src/tree/ranked/RankedPattern.h
+++ b/alib2data/src/tree/ranked/RankedPattern.h
@@ -10,8 +10,9 @@
 
 #include <string>
 #include <set>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "RankedNode.h"
 #include "../RankedTreeBase.h"
 
@@ -26,7 +27,7 @@ class SubtreeWildcard;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a pattern of RegExpElement.
  */
-class RankedPattern : public RankedTreeBase, public std::Components < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
+class RankedPattern : public RankedTreeBase, public std::Components2 < RankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::smart_ptr < RankedNode > pattern;
 
 public:
@@ -114,4 +115,36 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::RankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::RankedPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.getRoot ( ).testSymbol ( symbol ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
+	}
+
+	static bool available ( const tree::RankedPattern &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::RankedPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< tree::RankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::RankedPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::RankedPattern &, const alphabet::RankedSymbol & symbol) {
+		if( symbol.getRank().getData() != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* RANKED_PATTERN_H_ */
diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp
index 3f3dcf9d90edf5226301496aa9a3e189c3c2de9f..0c42ca5e7d5fe4a447fdb4a429effe95dd0cefab 100644
--- a/alib2data/src/tree/ranked/RankedTree.cpp
+++ b/alib2data/src/tree/ranked/RankedTree.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "RankedTree.h"
-#include "../TreeException.h"
 
 #include <iostream>
 #include <algorithm>
@@ -25,7 +24,7 @@
 
 namespace tree {
 
-RankedTree::RankedTree ( std::set < alphabet::RankedSymbol > alphabet, RankedNode tree ) : std::Components < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), tree ( nullptr ) {
+RankedTree::RankedTree ( std::set < alphabet::RankedSymbol > alphabet, RankedNode tree ) : std::Components2 < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), tree ( nullptr ) {
 	setTree ( std::move ( tree ) );
 }
 
@@ -35,11 +34,11 @@ RankedTree::RankedTree ( RankedNode tree ) : RankedTree ( tree.computeMinimalAlp
 RankedTree::RankedTree ( const UnrankedTree & other ) : RankedTree ( other.getRoot ( ).asRanked ( ) ) {
 }
 
-RankedTree::RankedTree ( const RankedTree & other ) : std::Components < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ) ), std::tuple < > ( ) ), tree ( other.tree ) {
+RankedTree::RankedTree ( const RankedTree & other ) : std::Components2 < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ) ), std::tuple < > ( ) ), tree ( other.tree ) {
 	this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
-RankedTree::RankedTree ( RankedTree && other ) noexcept : std::Components < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), tree ( std::move ( other.tree ) ) {
+RankedTree::RankedTree ( RankedTree && other ) noexcept : std::Components2 < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), tree ( std::move ( other.tree ) ) {
 	this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
@@ -127,24 +126,6 @@ void RankedTree::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::RankedTree::Component < tree::RankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	return static_cast < const tree::RankedTree * > ( this )->getRoot ( ).testSymbol ( symbol );
-}
-
-template < >
-bool tree::RankedTree::Component < tree::RankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::RankedTree::Component < tree::RankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto rankedTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::RankedTree > ();
diff --git a/alib2data/src/tree/ranked/RankedTree.h b/alib2data/src/tree/ranked/RankedTree.h
index 6b3b0f0f59be6bf41186a84de89e22bf72e45eba..5c7eec37d5409e9d08c6fe98d01cc43e2b5a6e91 100644
--- a/alib2data/src/tree/ranked/RankedTree.h
+++ b/alib2data/src/tree/ranked/RankedTree.h
@@ -10,8 +10,9 @@
 
 #include <string>
 #include <set>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "RankedNode.h"
 #include "../RankedTreeBase.h"
 
@@ -25,7 +26,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of RegExpElement.
  */
-class RankedTree : public RankedTreeBase, public std::Components < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class RankedTree : public RankedTreeBase, public std::Components2 < RankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::smart_ptr < RankedNode > tree;
 
 public:
@@ -109,4 +110,23 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::RankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::RankedTree & tree, const alphabet::RankedSymbol & symbol ) {
+		return tree.getRoot ( ).testSymbol ( symbol );
+	}
+
+	static bool available ( const tree::RankedTree &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::RankedTree &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* RANKED_TREE_H_ */
diff --git a/alib2data/src/tree/unranked/PrefixBarTree.cpp b/alib2data/src/tree/unranked/PrefixBarTree.cpp
index cdd2578b151a2ea1dec6b1baf4aaa145bdc0c1de..20894294ada4519c26d2702ad09644ecae201394 100644
--- a/alib2data/src/tree/unranked/PrefixBarTree.cpp
+++ b/alib2data/src/tree/unranked/PrefixBarTree.cpp
@@ -27,7 +27,7 @@
 
 namespace tree {
 
-PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, std::set < alphabet::Symbol > alphabet, std::vector < alphabet::Symbol > data ) : std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < BarSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( bar ) ) ) {
+PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, std::set < alphabet::Symbol > alphabet, std::vector < alphabet::Symbol > data ) : std::Components2 < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < BarSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( bar ) ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -146,35 +146,6 @@ void PrefixBarTree::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixBarTree::Component < tree::PrefixBarTree, alphabet::Symbol, tree::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector < alphabet::Symbol > & content = static_cast < const tree::PrefixBarTree * > ( this )->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
-}
-
-template < >
-bool tree::PrefixBarTree::Component < tree::PrefixBarTree, alphabet::Symbol, tree::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixBarTree::Component < tree::PrefixBarTree, alphabet::Symbol, tree::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-template < >
-bool tree::PrefixBarTree::Element < tree::PrefixBarTree, alphabet::Symbol, tree::BarSymbol >::available ( const alphabet::Symbol & symbol ) const {
-	return static_cast < const tree::PrefixBarTree * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixBarTree::Element < tree::PrefixBarTree, alphabet::Symbol, tree::BarSymbol >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto prefixBarTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixBarTree > ( );
diff --git a/alib2data/src/tree/unranked/PrefixBarTree.h b/alib2data/src/tree/unranked/PrefixBarTree.h
index 4d696fd774b91a2c4f4859a985c7c6cc6b367401..2edf0e3f014a4d3baf5d346e9ed065e47bb2d5a5 100644
--- a/alib2data/src/tree/unranked/PrefixBarTree.h
+++ b/alib2data/src/tree/unranked/PrefixBarTree.h
@@ -10,7 +10,7 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 #include "../../alphabet/Symbol.h"
 #include "../UnrankedTreeBase.h"
@@ -26,7 +26,7 @@ class BarSymbol;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixBarTree : public UnrankedTreeBase, public std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < BarSymbol > > {
+class PrefixBarTree : public UnrankedTreeBase, public std::Components2 < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < BarSymbol > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 	static std::vector < alphabet::Symbol > toPrefixBar ( const UnrankedNode & node, const alphabet::Symbol & bar );
@@ -92,4 +92,36 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixBarTree, alphabet::Symbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixBarTree & tree, const alphabet::Symbol & symbol ) {
+		const std::vector < alphabet::Symbol > & content = tree.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( );
+	}
+
+	static bool available ( const tree::PrefixBarTree &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixBarTree &, const alphabet::Symbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixBarTree, alphabet::Symbol, tree::BarSymbol > {
+public:
+	static bool available ( const tree::PrefixBarTree & tree, const alphabet::Symbol & symbol ) {
+		return tree.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixBarTree &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_BAR_TREE_H_ */
diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
index 9a573fe3d0b5a80e6bce92e7f3daf410fbffe501..5afbb8baaea56c755124b6bc18693156860b9dd8 100644
--- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "UnrankedNonlinearPattern.h"
-#include "../TreeException.h"
 
 #include <iostream>
 #include <algorithm>
@@ -25,7 +24,7 @@
 
 namespace tree {
 
-UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > nonlinearVariables, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
+UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > nonlinearVariables, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components2 < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
 	setTree ( std::move ( pattern ) );
 }
 
@@ -35,11 +34,11 @@ UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWil
 UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, UnrankedNode pattern ) : UnrankedNonlinearPattern ( subtreeWildcard, std::set < alphabet::Symbol > { }, pattern ) {
 }
 
-UnrankedNonlinearPattern::UnrankedNonlinearPattern ( const UnrankedNonlinearPattern & other ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
+UnrankedNonlinearPattern::UnrankedNonlinearPattern ( const UnrankedNonlinearPattern & other ) : std::Components2 < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
-UnrankedNonlinearPattern::UnrankedNonlinearPattern ( UnrankedNonlinearPattern && other ) noexcept : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
+UnrankedNonlinearPattern::UnrankedNonlinearPattern ( UnrankedNonlinearPattern && other ) noexcept : std::Components2 < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
@@ -133,61 +132,6 @@ void UnrankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::UnrankedNonlinearPattern::Component < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const tree::UnrankedNonlinearPattern * pattern = static_cast < const tree::UnrankedNonlinearPattern * > ( this );
-
-	return pattern->getRoot ( ).testSymbol ( symbol ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-bool tree::UnrankedNonlinearPattern::Component < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void tree::UnrankedNonlinearPattern::Component < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-template < >
-bool tree::UnrankedNonlinearPattern::Component < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::NonlinearAlphabet >::used ( const alphabet::Symbol & ) const {
-	return false;
-}
-
-template < >
-bool tree::UnrankedNonlinearPattern::Component < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::NonlinearAlphabet >::available ( const alphabet::Symbol & symbol ) const {
-	const tree::UnrankedNonlinearPattern * pattern = static_cast < const tree::UnrankedNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::UnrankedNonlinearPattern::Component < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::NonlinearAlphabet >::valid ( const alphabet::Symbol & symbol ) const {
-	const tree::UnrankedNonlinearPattern * pattern = static_cast < const tree::UnrankedNonlinearPattern * > ( this );
-
-	if ( pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
-}
-
-template < >
-bool tree::UnrankedNonlinearPattern::Element < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::SubtreeWildcard >::available ( const alphabet::Symbol & symbol ) const {
-	const tree::UnrankedNonlinearPattern * pattern = static_cast < const tree::UnrankedNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::UnrankedNonlinearPattern::Element < tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::SubtreeWildcard >::valid ( const alphabet::Symbol & symbol ) const {
-	const tree::UnrankedNonlinearPattern * pattern = static_cast < const tree::UnrankedNonlinearPattern * > ( this );
-
-	if ( pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto UnrankedNonlinearPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::UnrankedNonlinearPattern > ( );
diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h
index 40db0cd44a3c5ca8864c7a8b50e35f87908828ba..c4f03749d7f8da0c71fa81bbc630064f31a1ca89 100644
--- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h
+++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h
@@ -10,8 +10,9 @@
 
 #include <string>
 #include <set>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "UnrankedNode.h"
 #include "../UnrankedTreeBase.h"
 
@@ -27,7 +28,7 @@ class NonlinearAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a pattern of RegExpElement.
  */
-class UnrankedNonlinearPattern : public UnrankedTreeBase, public std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
+class UnrankedNonlinearPattern : public UnrankedTreeBase, public std::Components2 < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::smart_ptr < UnrankedNode > pattern;
 
 public:
@@ -125,4 +126,53 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::UnrankedNonlinearPattern & pattern, const alphabet::Symbol & symbol ) {
+		return pattern.getRoot ( ).testSymbol ( symbol ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern.accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static bool available ( const tree::UnrankedNonlinearPattern &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::UnrankedNonlinearPattern &, const alphabet::Symbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::NonlinearAlphabet > {
+public:
+	static bool used ( const tree::UnrankedNonlinearPattern &, const alphabet::Symbol & ) {
+		return false;
+	}
+
+	static bool available ( const tree::UnrankedNonlinearPattern & pattern, const alphabet::Symbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::UnrankedNonlinearPattern & pattern, const alphabet::Symbol & symbol) {
+		if ( pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
+	}
+};
+
+template < >
+class ElementConstraint2< tree::UnrankedNonlinearPattern, alphabet::Symbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::UnrankedNonlinearPattern & pattern, const alphabet::Symbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::UnrankedNonlinearPattern & pattern, const alphabet::Symbol & symbol) {
+		if ( pattern.accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* UNRANKED_NONLINEAR_PATTERN_H_ */
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp
index c60e28a252388385646691bf1d6d7fa2a0482622..8e9d2c962f7fc4a5ef636e7075835000eb9ea7e0 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "UnrankedPattern.h"
-#include "../TreeException.h"
 
 #include <iostream>
 #include <algorithm>
@@ -26,7 +25,7 @@
 
 namespace tree {
 
-UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
+UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components2 < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) {
 	setTree ( std::move ( pattern ) );
 }
 
@@ -36,11 +35,11 @@ UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, UnrankedNod
 UnrankedPattern::UnrankedPattern ( const RankedPattern & other ) : UnrankedPattern ( other.getSubtreeWildcard ( ).getSymbol ( ), TreeAuxiliary::unrankSymbols ( other.getAlphabet ( ) ), other.getRoot ( ).asUnranked ( ) ) {
 }
 
-UnrankedPattern::UnrankedPattern ( const UnrankedPattern & other ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
+UnrankedPattern::UnrankedPattern ( const UnrankedPattern & other ) : std::Components2 < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
-UnrankedPattern::UnrankedPattern ( UnrankedPattern && other ) noexcept : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
+UnrankedPattern::UnrankedPattern ( UnrankedPattern && other ) noexcept : std::Components2 < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) {
 	this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
@@ -131,35 +130,6 @@ void UnrankedPattern::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::UnrankedPattern::Component < tree::UnrankedPattern, alphabet::Symbol, tree::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const tree::UnrankedPattern * pattern = static_cast < const tree::UnrankedPattern * > ( this );
-
-	return pattern->getRoot ( ).testSymbol ( symbol ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
-}
-
-template < >
-bool tree::UnrankedPattern::Component < tree::UnrankedPattern, alphabet::Symbol, tree::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void tree::UnrankedPattern::Component < tree::UnrankedPattern, alphabet::Symbol, tree::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-template < >
-bool tree::UnrankedPattern::Element < tree::UnrankedPattern, alphabet::Symbol, tree::SubtreeWildcard >::available ( const alphabet::Symbol & symbol ) const {
-	return static_cast < const tree::UnrankedPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::UnrankedPattern::Element < tree::UnrankedPattern, alphabet::Symbol, tree::SubtreeWildcard >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto unrankedPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::UnrankedPattern > ( );
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.h b/alib2data/src/tree/unranked/UnrankedPattern.h
index b691ae6ea32dd8a507868b670fdf5833380defe5..74e6bd25a1b7a1c978c22c367e088867931f7815 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.h
+++ b/alib2data/src/tree/unranked/UnrankedPattern.h
@@ -10,8 +10,9 @@
 
 #include <string>
 #include <set>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "UnrankedNode.h"
 #include "../UnrankedTreeBase.h"
 
@@ -28,7 +29,7 @@ class SubtreeWildcard;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a pattern of RegExpElement.
  */
-class UnrankedPattern : public UnrankedTreeBase, public std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
+class UnrankedPattern : public UnrankedTreeBase, public std::Components2 < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::smart_ptr < UnrankedNode > pattern;
 
 public:
@@ -116,4 +117,34 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::UnrankedPattern, alphabet::Symbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::UnrankedPattern & pattern, const alphabet::Symbol & symbol ) {
+		return pattern.getRoot ( ).testSymbol ( symbol ) || pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol;
+	}
+
+	static bool available ( const tree::UnrankedPattern &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::UnrankedPattern &, const alphabet::Symbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< tree::UnrankedPattern, alphabet::Symbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::UnrankedPattern & pattern, const alphabet::Symbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::UnrankedPattern &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* UNRANKED_PATTERN_H_ */
diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp
index 7d44e61bed5c054603aac284b6308ea031b1b79a..828c9b52cb32a3da9a00ae4dd35ac7663d3d7c6e 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.cpp
+++ b/alib2data/src/tree/unranked/UnrankedTree.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "UnrankedTree.h"
-#include "../TreeException.h"
 
 #include <iostream>
 #include <algorithm>
@@ -26,7 +25,7 @@
 
 namespace tree {
 
-UnrankedTree::UnrankedTree ( std::set < alphabet::Symbol > alphabet, UnrankedNode tree ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), tree ( nullptr ) {
+UnrankedTree::UnrankedTree ( std::set < alphabet::Symbol > alphabet, UnrankedNode tree ) : std::Components2 < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), tree ( nullptr ) {
 	setTree ( std::move ( tree ) );
 }
 
@@ -36,11 +35,11 @@ UnrankedTree::UnrankedTree ( UnrankedNode pattern ) : UnrankedTree ( pattern.com
 UnrankedTree::UnrankedTree ( const RankedTree & other ) : UnrankedTree ( TreeAuxiliary::unrankSymbols ( other.getAlphabet ( ) ), other.getRoot ( ).asUnranked ( ) ) {
 }
 
-UnrankedTree::UnrankedTree ( const UnrankedTree & other ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ) ), std::tuple < > ( ) ), tree ( other.tree ) {
+UnrankedTree::UnrankedTree ( const UnrankedTree & other ) : std::Components2 < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ) ), std::tuple < > ( ) ), tree ( other.tree ) {
 	this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
-UnrankedTree::UnrankedTree ( UnrankedTree && other ) noexcept : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), tree ( std::move ( other.tree ) ) {
+UnrankedTree::UnrankedTree ( UnrankedTree && other ) noexcept : std::Components2 < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), tree ( std::move ( other.tree ) ) {
 	this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) );
 }
 
@@ -128,24 +127,6 @@ void UnrankedTree::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::UnrankedTree::Component < tree::UnrankedTree, alphabet::Symbol, tree::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	return static_cast < const tree::UnrankedTree * > ( this )->getRoot ( ).testSymbol ( symbol );
-}
-
-template < >
-bool tree::UnrankedTree::Component < tree::UnrankedTree, alphabet::Symbol, tree::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void tree::UnrankedTree::Component < tree::UnrankedTree, alphabet::Symbol, tree::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto unrankedTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::UnrankedTree > ( );
diff --git a/alib2data/src/tree/unranked/UnrankedTree.h b/alib2data/src/tree/unranked/UnrankedTree.h
index 1c1f2dabdf9d35ca7a01abca9a2d371fb69e827c..66529d4d5761ad50eba2f0662ec656d74474e454 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.h
+++ b/alib2data/src/tree/unranked/UnrankedTree.h
@@ -10,8 +10,9 @@
 
 #include <string>
 #include <set>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "UnrankedNode.h"
 #include "../UnrankedTreeBase.h"
 
@@ -27,7 +28,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of RegExpElement.
  */
-class UnrankedTree : public UnrankedTreeBase, public std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class UnrankedTree : public UnrankedTreeBase, public std::Components2 < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::smart_ptr < UnrankedNode > tree;
 
 	static std::set < alphabet::Symbol > unrankSymbols ( const std::set < alphabet::RankedSymbol > & alphabet );
@@ -113,4 +114,23 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::UnrankedTree, alphabet::Symbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::UnrankedTree & tree, const alphabet::Symbol & symbol ) {
+		return tree.getRoot ( ).testSymbol ( symbol );
+	}
+
+	static bool available ( const tree::UnrankedTree &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::UnrankedTree &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* UNRANKED_TREE_H_ */