diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
index 3f7dd58365e3f968552c32d80adffb7ed3f6541b..b1fbf3207367a64b595bb6e2a1517dfa86beb28c 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
@@ -25,21 +25,16 @@
 
 namespace tree {
 
-PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) {
-	setAlphabet ( std::move ( alphabet ) );
+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 < > ( ) ) {
 	setContent ( std::move ( data ) );
 }
 
-PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) {
-	arityChecksum ( data );
-
-	setAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
-	m_Data = std::move ( data );
+PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedTree, 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 ) ) {
+	arityChecksum ( m_Data );
 }
 
-PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) {
+PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) : std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::tuple < > ( ) ) {
 	toPrefixRanked ( tree.getRoot ( ) );
-	setAlphabet ( tree.getAlphabet ( ) );
 }
 
 void PrefixRankedTree::toPrefixRanked ( const RankedNode & node ) {
@@ -57,15 +52,6 @@ RankedTreeBase * PrefixRankedTree::plunder ( ) && {
 	return new PrefixRankedTree ( std::move ( * this ) );
 }
 
-bool PrefixRankedTree::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 > & PrefixRankedTree::getContent ( ) const {
 	return this->m_Data;
 }
@@ -75,7 +61,7 @@ void PrefixRankedTree::setContent ( std::vector < alphabet::RankedSymbol > data
 
 	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." );
@@ -99,8 +85,8 @@ bool PrefixRankedTree::isEmpty ( ) const {
 }
 
 int PrefixRankedTree::compare ( const PrefixRankedTree & 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;
 
@@ -140,13 +126,33 @@ PrefixRankedTree PrefixRankedTree::parse ( std::deque < sax::Token >::iterator &
 
 void PrefixRankedTree::compose ( std::deque < sax::Token > & out ) const {
 	out.emplace_back ( PrefixRankedTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT );
-	TreeToXMLComposer::composeAlphabet ( out, alphabet );
+	TreeToXMLComposer::composeAlphabet ( out, getAlphabet() );
 	TreeToXMLComposer::composeContent ( out, m_Data );
 	out.emplace_back ( PrefixRankedTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT );
 }
 
 } /* 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 e9b7ba31010037e0f0b295f5bb080a03a8f836c8..d1ac5be6fd5e59a3d04228155651eca036b88793 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.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 PrefixRankedTree : public RankedTreeBase, public RankedAlphabet {
+class PrefixRankedTree : public RankedTreeBase, public std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	void toPrefixRanked ( const RankedNode & node );
@@ -37,19 +38,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 );
 	}
 
 	void setContent ( std::vector < alphabet::RankedSymbol > data );