diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index 6a5bb110ba7473e0605a2f93f650cee62f92b3b4..d66cf9eaec02fc1169db02280a919ea57eb04561 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -30,27 +30,21 @@
 
 namespace tree {
 
-PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
-	addSymbolsToAlphabet ( std::move ( alphabet ) );
+PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) + std::set < alphabet::RankedSymbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
 	setContent ( std::move ( data ) );
 }
 
-PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
-	arityChecksum ( data );
-
-	addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
-	m_Data = std::move ( data );
+PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedBarPattern ( std::move ( bar ), std::move ( variablesBar ), std::move ( subtreeWildcard ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) {
 }
 
-PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
+PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::make_tuple ( tree.getSubtreeWildcard ( ) ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
 	toPrefixRankedBar ( tree.getRoot ( ) );
 
 	for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) {
-		addSymbolToAlphabet ( symbol );
-		addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) );
+		accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->bar, symbol.getRank ( ) ) );
 	}
 
-	addSymbolToAlphabet ( alphabet::RankedSymbol ( this->variablesBar, tree.getSubtreeWildcard ( ).getRank ( ) ) );
+	accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->variablesBar, tree.getSubtreeWildcard ( ).getRank ( ) ) );
 }
 
 PrefixRankedBarPattern::PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) {
@@ -60,7 +54,7 @@ PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) :
 }
 
 void PrefixRankedBarPattern::toPrefixRankedBar ( const RankedNode & node ) {
-	if ( node.getSymbol ( ) == subtreeWildcard ) {
+	if ( node.getSymbol ( ) == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) {
 		m_Data.push_back ( node.getSymbol ( ) );
 		m_Data.push_back ( alphabet::RankedSymbol ( variablesBar, node.getSymbol ( ).getRank ( ) ) );
 	} else {
@@ -81,18 +75,6 @@ RankedTreeBase * PrefixRankedBarPattern::plunder ( ) && {
 	return new PrefixRankedBarPattern ( std::move ( * this ) );
 }
 
-bool PrefixRankedBarPattern::removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol ) {
-	if ( std::any_of ( m_Data.begin ( ), m_Data.end ( ), [&] ( const alphabet::RankedSymbol & s ) {
-			return s == symbol;
-		} ) )
-		throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is used." );
-
-	if ( this->subtreeWildcard == symbol )
-		throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is subtreeWildcard." );
-
-	return alphabet.erase ( symbol );
-}
-
 const std::vector < alphabet::RankedSymbol > & PrefixRankedBarPattern::getContent ( ) const {
 	return this->m_Data;
 }
@@ -102,7 +84,7 @@ void PrefixRankedBarPattern::setContent ( std::vector < alphabet::RankedSymbol >
 
 	std::set < alphabet::RankedSymbol > minimalAlphabet ( data.begin ( ), data.end ( ) );
 	std::set < alphabet::RankedSymbol > unknownSymbols;
-	std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), alphabet.begin ( ), alphabet.end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) );
+	std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet().begin ( ), getAlphabet().end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) );
 
 	if ( unknownSymbols.size ( ) > 0 )
 		throw TreeException ( "Input symbols not in the alphabet." );
@@ -138,7 +120,8 @@ void PrefixRankedBarPattern::arityChecksum ( const std::vector < alphabet::Ranke
 	if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" );
 
 	for ( unsigned i = 0; i < data.size ( ); ++i )
-		if ( ( data[i] == subtreeWildcard ) && ( ( ( i + 1 ) == data.size ( ) ) || ( data[i + 1].getSymbol ( ) != variablesBar ) ) ) throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" );
+		if ( ( data[i] == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) && ( ( ( i + 1 ) == data.size ( ) ) || ( data[i + 1].getSymbol ( ) != variablesBar ) ) )
+			throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" );
 
 }
 
@@ -147,8 +130,8 @@ bool PrefixRankedBarPattern::isEmpty ( ) const {
 }
 
 int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const {
-	auto first = std::tie ( m_Data, alphabet );
-	auto second = std::tie ( other.m_Data, other.alphabet );
+	auto first = std::tie ( m_Data, getAlphabet() );
+	auto second = std::tie ( other.m_Data, other.getAlphabet() );
 
 	std::compare < decltype ( first ) > comp;
 
@@ -193,14 +176,44 @@ void PrefixRankedBarPattern::compose ( std::deque < sax::Token > & out ) const {
 	out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT );
 	TreeToXMLComposer::composeBar ( out, bar );
 	TreeToXMLComposer::composeVariablesBar ( out, variablesBar );
-	TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard );
-	TreeToXMLComposer::composeAlphabet ( out, alphabet );
+	TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() );
+	TreeToXMLComposer::composeAlphabet ( out, getAlphabet() );
 	TreeToXMLComposer::composeContent ( out, m_Data );
 	out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT );
 }
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
+	const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( 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::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
+	return true;
+}
+
+template < >
+void tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
+}
+
+template < >
+bool tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
+	return static_cast < const tree::PrefixRankedBarPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+}
+
+template < >
+void tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & ) const {
+}
+
+} /* namespace std */
+
 namespace alib {
 
 auto prefixRankedBarPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarPattern > ();
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index d44afefe1ac4f4b62056bbd6ad2fbb44ef525f1d..12f716fd6d3807aebb54b1d73c4a5175bd82a5f8 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -10,22 +10,24 @@
 
 #include <set>
 #include <vector>
+#include <core/components.hpp>
 
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
-#include "../common/RankedPatternAlphabet.h"
 #include "RankedNode.h"
 
 namespace tree {
 
 class RankedPattern;
 class PrefixRankedBarTree;
+class GeneralAlphabet;
+class SubtreeWildcard;
 
 /**
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedBarPattern : public RankedTreeBase, public RankedPatternAlphabet {
+class PrefixRankedBarPattern : public RankedTreeBase, public std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	alphabet::Symbol bar;
@@ -43,19 +45,21 @@ public:
 	virtual RankedTreeBase * clone ( ) const;
 	virtual RankedTreeBase * plunder ( ) &&;
 
-	virtual bool removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol );
-
 	/**
 	 * @return List of symbols forming tree (const version).
 	 */
 	const std::vector < alphabet::RankedSymbol > & getContent ( ) const;
 
 	const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const {
-		return RankedPatternAlphabet::getAlphabet ( );
+		return accessComponent < GeneralAlphabet > ( ).get ( );
 	}
 
 	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
-		addSymbolsToAlphabet ( symbols );
+		accessComponent < GeneralAlphabet > ( ).add ( symbols );
+	}
+
+	const alphabet::RankedSymbol & getSubtreeWildcard ( ) const {
+		return accessElement < SubtreeWildcard > ( ).get ( );
 	}
 
 	void setContent ( std::vector < alphabet::RankedSymbol > data );