diff --git a/alib2data/src/tree/common/RankedAlphabet.cpp b/alib2data/src/tree/common/RankedAlphabet.cpp
deleted file mode 100644
index 1e6324976001a34e7f142824e8b4e1c00bb8f6b3..0000000000000000000000000000000000000000
--- a/alib2data/src/tree/common/RankedAlphabet.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * RankedAlphabet.cpp
- *
- *  Created on: Apr 16, 2013
- *      Author: Stepan Plachy
- */
-
-#include "RankedAlphabet.h"
-
-#include <algorithm>
-
-namespace tree {
-
-const std::set<alphabet::RankedSymbol>& RankedAlphabet::getAlphabet() const {
-	return alphabet;
-}
-
-bool RankedAlphabet::addSymbolToAlphabet(alphabet::RankedSymbol symbol) {
-	return alphabet.insert(std::move(symbol)).second;
-}
-
-void RankedAlphabet::addSymbolsToAlphabet(const std::set<alphabet::RankedSymbol>& symbols) {
-	for(const alphabet::RankedSymbol& addedSymbol : symbols) {
-		addSymbolToAlphabet(addedSymbol);
-	}
-}
-
-void RankedAlphabet::setAlphabet(std::set<alphabet::RankedSymbol> newSymbols) {
-	std::set<alphabet::RankedSymbol> removed;
-	std::set_difference(alphabet.begin(), alphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
-
-	for(const alphabet::RankedSymbol& removedSymbol : removed) {
-		removeSymbolFromAlphabet(removedSymbol);
-	}
-
-	alphabet = std::move(newSymbols);
-}
-
-} /* namespace tree */
-
diff --git a/alib2data/src/tree/common/RankedAlphabet.h b/alib2data/src/tree/common/RankedAlphabet.h
deleted file mode 100644
index d976d3371ef0eddacda81cb557f5c52e46c97a58..0000000000000000000000000000000000000000
--- a/alib2data/src/tree/common/RankedAlphabet.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * RankedAlphabet.h
- *
- *  Created on: Apr 10, 2013
- *      Author: Stepan Plachy
- */
-
-#ifndef RANKED_ALPHABET_H_
-#define RANKED_ALPHABET_H_
-
-#include <set>
-#include "../../alphabet/RankedSymbol.h"
-
-namespace tree {
-
-/**
- * Abstract base class for all strings. Contains common elements of strings.
- */
-class RankedAlphabet {
-protected:
-	std::set<alphabet::RankedSymbol> alphabet;
-
-public:
-	/**
-	 * Adds input symbol to input alphabet.
-	 * @param symbol Symbol to add
-	 */
-	bool addSymbolToAlphabet(alphabet::RankedSymbol symbol);
-
-	/**
-	 * Adds input symbols to input alphabet.
-	 * @param symbols Symbol to add
-	 */
-	void addSymbolsToAlphabet(const std::set<alphabet::RankedSymbol>& symbols);
-
-	/**
-	 * Sets input symbols of the tree.
-	 * @param symbols Symbols to set
-	 */
-	void setAlphabet(std::set<alphabet::RankedSymbol> symbols);
-
-	/**
-	 * Removes input symbol from the input alphabet.
-	 * @param symbol Symbol to remove
-	 * @throws AutomatonException when symbol is not present in input alphabet
-	 * or when symbol is part of the transition
-	 */
-	virtual bool removeSymbolFromAlphabet(const alphabet::RankedSymbol& symbol) = 0;
-
-	/**
-	 * @return the input alphabet
-	 */
-	const std::set<alphabet::RankedSymbol>& getAlphabet() const;
-
-};
-
-} /* namespace tree */
-
-#endif /* RANKED_ALPHABET_H_ */
-
diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.cpp b/alib2data/src/tree/common/RankedPatternAlphabet.cpp
deleted file mode 100644
index eb567a40a7631f385edfb6ec4b644543a09a661d..0000000000000000000000000000000000000000
--- a/alib2data/src/tree/common/RankedPatternAlphabet.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * RankedAlphabet.cpp
- *
- *  Created on: Apr 16, 2013
- *      Author: Jan Travnicek
- */
-
-#include "RankedPatternAlphabet.h"
-#include "../TreeException.h"
-
-#include <algorithm>
-
-namespace tree {
-
-RankedPatternAlphabet::RankedPatternAlphabet(alphabet::RankedSymbol subtreeWildcard) : subtreeWildcard(subtreeWildcard) {
-	if(subtreeWildcard.getRank().getData() != 0)
-		throw TreeException("Subtree wildcard symbol " + (std::string) subtreeWildcard + " has nonzero rank");
-	alphabet.insert(std::move(subtreeWildcard));
-}
-
-void RankedPatternAlphabet::setSubtreeWildcard(alphabet::RankedSymbol symbol) {
-	if (!alphabet.count(symbol))
-		throw TreeException("Subtree wildcard symbol \"" + (std::string) symbol + "\" is not in the alphabet.");
-
-	if(subtreeWildcard.getRank().getData() != 0)
-		throw TreeException("Subtree wildcard symbol " + (std::string) symbol + " has nonzero rank");
-
-	subtreeWildcard = std::move(symbol);
-
-}
-
-const alphabet::RankedSymbol& RankedPatternAlphabet::getSubtreeWildcard() const {
-	return subtreeWildcard;
-}
-
-} /* namespace tree */
-
diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.h b/alib2data/src/tree/common/RankedPatternAlphabet.h
deleted file mode 100644
index 7be04046027a380e35ca74b4db449a6afe2d76d5..0000000000000000000000000000000000000000
--- a/alib2data/src/tree/common/RankedPatternAlphabet.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * RankedPatternAlphabet.h
- *
- *  Created on: Apr 10, 2013
- *      Author: Jan Travnicek
- */
-
-#ifndef RANKED_PATTERN_ALPHABET_H_
-#define RANKED_PATTERN_ALPHABET_H_
-
-#include "RankedAlphabet.h"
-
-namespace tree {
-
-/**
- * Abstract base class for all strings. Contains common elements of strings.
- */
-class RankedPatternAlphabet : public RankedAlphabet {
-protected:
-	alphabet::RankedSymbol subtreeWildcard;
-
-public:
-	RankedPatternAlphabet(alphabet::RankedSymbol subtreeWildcard);
-
-	/**
-	 * Sets the subtree variable = symbol representing subtree substitution place in the pattern
-	 * @param symbol Symbol to set
-	 */
-	void setSubtreeWildcard(alphabet::RankedSymbol symbol);
-
-	/**
-	 * @return symbol representing subtree variable
-	 */
-	const alphabet::RankedSymbol& getSubtreeWildcard() const;
-
-};
-
-} /* namespace tree */
-
-#endif /* RANKED_PATTERN_ALPHABET_H_ */
-
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index 63ac7e1b5e0078f489f6d09021ae9757052c92e2..c500ddedb03aecf8e89cc7b25739174e79425973 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -28,28 +28,22 @@
 
 namespace tree {
 
-PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) {
-	addSymbolsToAlphabet ( std::move ( alphabet ) );
+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::set < alphabet::RankedSymbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ) {
 	setContent ( std::move ( data ) );
 }
 
-PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) {
-	arityChecksum ( data );
-
-	addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
-	m_Data = std::move ( data );
+PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedPattern ( std::move ( subtreeWildcard ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) {
 }
 
 PrefixRankedPattern::PrefixRankedPattern ( const PrefixRankedTree & tree ) : PrefixRankedPattern ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) {
 }
 
-PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ) {
+PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::make_tuple ( tree.getSubtreeWildcard ( ) ) ) {
 	toPrefixRanked ( tree.getRoot ( ) );
-	addSymbolsToAlphabet ( tree.getAlphabet ( ) );
 }
 
 void PrefixRankedPattern::toPrefixRanked ( const RankedNode & node ) {
-	if ( node.getSymbol ( ) == subtreeWildcard ) {
+	if ( node.getSymbol ( ) == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) {
 		m_Data.push_back ( node.getSymbol ( ) );
 	} else {
 		m_Data.push_back ( node.getSymbol ( ) );
@@ -67,18 +61,6 @@ RankedTreeBase * PrefixRankedPattern::plunder ( ) && {
 	return new PrefixRankedPattern ( std::move ( * this ) );
 }
 
-bool PrefixRankedPattern::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 > & PrefixRankedPattern::getContent ( ) const {
 	return this->m_Data;
 }
@@ -88,7 +70,7 @@ void PrefixRankedPattern::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." );
@@ -112,8 +94,8 @@ bool PrefixRankedPattern::isEmpty ( ) const {
 }
 
 int PrefixRankedPattern::compare ( const PrefixRankedPattern & 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;
 
@@ -154,14 +136,45 @@ PrefixRankedPattern PrefixRankedPattern::parse ( std::deque < sax::Token >::iter
 
 void PrefixRankedPattern::compose ( std::deque < sax::Token > & out ) const {
 	out.emplace_back ( PrefixRankedPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT );
-	TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard );
-	TreeToXMLComposer::composeAlphabet ( out, alphabet );
+	TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() );
+	TreeToXMLComposer::composeAlphabet ( out, getAlphabet() );
 	TreeToXMLComposer::composeContent ( out, m_Data );
 	out.emplace_back ( PrefixRankedPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT );
 }
 
 } /* 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 & ) const {
+}
+
+} /* 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 c43e98bf5989ae9690a5910be52c49ebcd1004c7..d252f4e3a089d4a55e56b82439da5866d567715b 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.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 PrefixRankedTree;
+class GeneralAlphabet;
+class SubtreeWildcard;
 
 /**
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedPattern : public RankedTreeBase, public RankedPatternAlphabet {
+class PrefixRankedPattern : public RankedTreeBase, public std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	void toPrefixRanked ( const RankedNode & node );
@@ -39,19 +41,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 );
diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h
index f967ae40a6d8f453c4294f4d29ce1210052ab164..83146a983028ebe0f569bca80d2ca9f4a2ef0f97 100644
--- a/alib2data/src/tree/ranked/RankedNode.h
+++ b/alib2data/src/tree/ranked/RankedNode.h
@@ -12,7 +12,6 @@
 #include "../../alphabet/RankedSymbol.h"
 #include <vector>
 #include <set>
-#include "../common/RankedAlphabet.h"
 
 namespace tree {