diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index faa6b5e59941e6dade6063d92effea8ae44b9f7a..f96b0c828a5c6e1cf9dec2342ffe93092f856dff 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -27,24 +27,19 @@
 
 namespace tree {
 
-PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) {
-	addSymbolsToAlphabet ( std::move ( alphabet ) );
+PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) {
 	setContent ( std::move ( data ) );
 }
 
-PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) {
+PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) ), std::tuple < > ( ) ), m_Data ( std::move ( data ) ), bar ( std::move ( bar ) ) {
 	arityChecksum ( data );
-
-	addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
-	m_Data = std::move ( data );
 }
 
-PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : bar ( std::move ( bar ) ) {
+PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) {
 	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 ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) );
 	}
 }
 
@@ -68,15 +63,6 @@ RankedTreeBase * PrefixRankedBarTree::plunder ( ) && {
 	return new PrefixRankedBarTree ( std::move ( * this ) );
 }
 
-bool PrefixRankedBarTree::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." );
-
-	return alphabet.erase ( symbol );
-}
-
 const std::vector < alphabet::RankedSymbol > & PrefixRankedBarTree::getContent ( ) const {
 	return this->m_Data;
 }
@@ -90,7 +76,7 @@ void PrefixRankedBarTree::setContent ( std::vector < alphabet::RankedSymbol > da
 
 	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." );
@@ -166,13 +152,33 @@ PrefixRankedBarTree PrefixRankedBarTree::parse ( std::deque < sax::Token >::iter
 void PrefixRankedBarTree::compose ( std::deque < sax::Token > & out ) const {
 	out.emplace_back ( PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT );
 	TreeToXMLComposer::composeBar ( out, bar );
-	TreeToXMLComposer::composeAlphabet ( out, alphabet );
+	TreeToXMLComposer::composeAlphabet ( out, getAlphabet() );
 	TreeToXMLComposer::composeContent ( out, m_Data );
 	out.emplace_back ( PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT );
 }
 
 } /* 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 {
+}
+
+} /* 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 25e2e6bae3bcdceaa9c9404853af3e900845f837..6a0431cfb987d771ca3f49b57eb784f2a53237cc 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
@@ -10,21 +10,22 @@
 
 #include <set>
 #include <vector>
+#include <core/components.hpp>
 
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
-#include "../common/RankedAlphabet.h"
 #include "RankedNode.h"
 
 namespace tree {
 
 class RankedTree;
+class GeneralAlphabet;
 
 /**
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedBarTree : public RankedTreeBase, public RankedAlphabet {
+class PrefixRankedBarTree : public RankedTreeBase, public std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	alphabet::Symbol bar;
@@ -40,19 +41,17 @@ 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 RankedAlphabet::getAlphabet ( );
+		return accessComponent < GeneralAlphabet > ( ).get ( );
 	}
 
 	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
-		addSymbolsToAlphabet ( symbols );
+		accessComponent < GeneralAlphabet > ( ).add ( symbols );
 	}
 
 	const alphabet::Symbol & getBarSymbol ( ) const;