diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index 91310085abb774a23fff32ce7d1ca7113aedceef..d4e53e0769b4c46ee7bb0e12b24bc7922d960720 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -31,23 +31,29 @@
 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 ) ) {
-	this->alphabet = std::move ( alphabet );
+	addSymbolsToAlphabet ( std::move ( alphabet ) );
 	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 );
 
-	alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) );
+	addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
 	m_Data = 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 ) ) {
 	toPrefixRankedBar ( tree.getRoot ( ) );
-	alphabet = std::set < alphabet::RankedSymbol > ( m_Data.begin ( ), m_Data.end ( ) );
+
+	for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) {
+		addSymbolToAlphabet ( symbol );
+		addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) );
+	}
+
+	addSymbolToAlphabet ( 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.getContent ( ) ) {
+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 ( ) ) {
 }
 
 PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), tree ) {
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index aa06c60caa9b52513fcd35fd18380b91e55e4f69..d44afefe1ac4f4b62056bbd6ad2fbb44ef525f1d 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -31,6 +31,8 @@ class PrefixRankedBarPattern : public RankedTreeBase, public RankedPatternAlphab
 	alphabet::Symbol bar;
 	alphabet::Symbol variablesBar;
 
+	void toPrefixRankedBar ( const RankedNode & node );
+
 public:
 	explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
 	explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data );
@@ -38,8 +40,6 @@ public:
 	explicit PrefixRankedBarPattern ( const PrefixRankedBarTree & tree );
 	explicit PrefixRankedBarPattern ( const RankedPattern & tree );
 
-	void toPrefixRankedBar ( const RankedNode & node );
-
 	virtual RankedTreeBase * clone ( ) const;
 	virtual RankedTreeBase * plunder ( ) &&;
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index cd81c36e436b83ebb7e112e85e317e62ecef3a10..33aa89a5e9d9fd7c494b7aaeb0b017b030602a95 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -28,20 +28,24 @@
 namespace tree {
 
 PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) {
-	this->alphabet = std::move ( alphabet );
+	addSymbolsToAlphabet ( std::move ( alphabet ) );
 	setContent ( std::move ( data ) );
 }
 
 PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) {
 	arityChecksum ( data );
 
-	alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) );
+	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 ) ) {
 	toPrefixRankedBar ( tree.getRoot ( ) );
-	alphabet = std::set < alphabet::RankedSymbol > ( m_Data.begin ( ), m_Data.end ( ) );
+
+	for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) {
+		addSymbolToAlphabet ( symbol );
+		addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) );
+	}
 }
 
 PrefixRankedBarTree::PrefixRankedBarTree ( const RankedTree & tree ) : PrefixRankedBarTree ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), tree ) {
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
index a0118e9c54d31bc820678b458d0a5f84bd2466a7..25e2e6bae3bcdceaa9c9404853af3e900845f837 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
@@ -29,14 +29,14 @@ class PrefixRankedBarTree : public RankedTreeBase, public RankedAlphabet {
 
 	alphabet::Symbol bar;
 
+	void toPrefixRankedBar ( const RankedNode & node );
+
 public:
 	explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
 	explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data );
 	explicit PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree );
 	explicit PrefixRankedBarTree ( const RankedTree & tree );
 
-	void toPrefixRankedBar ( const RankedNode & node );
-
 	virtual RankedTreeBase * clone ( ) const;
 	virtual RankedTreeBase * plunder ( ) &&;
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index 9158c35850310a7f28695b152d2ef64a3909ed62..bfbe168ad2fded7a126afdfb0f967e3c8f55919c 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -26,31 +26,30 @@
 namespace tree {
 
 PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) {
-	this->alphabet = std::move ( alphabet );
+	addSymbolsToAlphabet ( std::move ( alphabet ) );
 	setContent ( std::move ( data ) );
 }
 
 PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) {
 	arityChecksum ( data );
 
-	alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) );
+	addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
 	m_Data = std::move ( data );
 }
 
 PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ) {
-	alphabet = tree.getAlphabet ( );
-	std::deque < const RankedNode * > queue {
-		& tree.getRoot ( )
-	};
-
-	while ( !queue.empty ( ) ) {
-		const RankedNode * elem = queue.back ( );
-		queue.pop_back ( );
+	toPrefixRanked ( tree.getRoot ( ) );
+	addSymbolsToAlphabet ( tree.getAlphabet ( ) );
+}
 
-		m_Data.push_back ( elem->getSymbol ( ) );
+void PrefixRankedPattern::toPrefixRanked ( const RankedNode & node ) {
+	if ( node.getSymbol ( ) == subtreeWildcard ) {
+		m_Data.push_back ( node.getSymbol ( ) );
+	} else {
+		m_Data.push_back ( node.getSymbol ( ) );
 
-		for ( const RankedNode * child : elem->getChildren ( ) )
-			queue.push_back ( child );
+		for ( const RankedNode * child : node.getChildren ( ) )
+			toPrefixRanked ( * child );
 	}
 }
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h
index c1f14402d0953ff4b273498a42d0f1756a8aa637..d3dfddd3e6dc1e03815b30283753b9e63c71867f 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h
@@ -14,6 +14,7 @@
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "../common/RankedPatternAlphabet.h"
+#include "RankedNode.h"
 
 namespace tree {
 
@@ -26,6 +27,8 @@ class RankedPattern;
 class PrefixRankedPattern : public RankedTreeBase, public RankedPatternAlphabet {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
+	void toPrefixRanked ( const RankedNode & node );
+
 public:
 	explicit PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
 	explicit PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data );
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
index 37bcb2e91c4e5d2a79c650c8cd1e2d5891c8e892..3dc8a0d46c492e9bc7af103464419e8ee92c9121 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
@@ -26,32 +26,27 @@
 namespace tree {
 
 PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) {
-	this->alphabet = std::move ( alphabet );
+	setAlphabet ( std::move ( alphabet ) );
 	setContent ( std::move ( data ) );
 }
 
 PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) {
 	arityChecksum ( data );
 
-	alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) );
+	setAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
 	m_Data = std::move ( data );
 }
 
 PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) {
-	alphabet = tree.getAlphabet ( );
-	std::deque < const RankedNode * > queue {
-		& tree.getRoot ( )
-	};
-
-	while ( !queue.empty ( ) ) {
-		const RankedNode * elem = queue.back ( );
-		queue.pop_back ( );
+	toPrefixRanked ( tree.getRoot ( ) );
+	setAlphabet ( tree.getAlphabet ( ) );
+}
 
-		m_Data.push_back ( elem->getSymbol ( ) );
+void PrefixRankedTree::toPrefixRanked ( const RankedNode & node ) {
+	m_Data.push_back ( node.getSymbol ( ) );
 
-		for ( const RankedNode * child : elem->getChildren ( ) )
-			queue.push_back ( child );
-	}
+	for ( const RankedNode * child : node.getChildren ( ) )
+		toPrefixRanked ( * child );
 }
 
 RankedTreeBase * PrefixRankedTree::clone ( ) const {
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.h b/alib2data/src/tree/ranked/PrefixRankedTree.h
index 63dc05218deb3fde1ba12820a1b1a79b834b23a0..e9b7ba31010037e0f0b295f5bb080a03a8f836c8 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.h
@@ -14,6 +14,7 @@
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "../common/RankedAlphabet.h"
+#include "RankedNode.h"
 
 namespace tree {
 
@@ -26,6 +27,8 @@ class RankedTree;
 class PrefixRankedTree : public RankedTreeBase, public RankedAlphabet {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
+	void toPrefixRanked ( const RankedNode & node );
+
 public:
 	explicit PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
 	explicit PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data );