diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp
index 620c218400bacd799302ba2dfe86e2f420994bbc..2681c537ff93f36800eb44cde081e8802131ddda 100644
--- a/alib2data/src/tree/TreeFromXMLParser.cpp
+++ b/alib2data/src/tree/TreeFromXMLParser.cpp
@@ -40,7 +40,7 @@ Tree TreeFromXMLParser::parseTree(std::deque<sax::Token>& input, const std::set<
 RankedPattern TreeFromXMLParser::parseRankedPattern(std::deque<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_RANKED_PATTERN);
 
-	alphabet::RankedSymbol subtreeWildcard = parseSubtreeVariable<alphabet::RankedSymbol>(input);
+	alphabet::RankedSymbol subtreeWildcard = parseSubtreeWildcard<alphabet::RankedSymbol>(input);
 	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
 	RankedNode * root = parseRankedNode(input);
 	RankedPattern tree(subtreeWildcard, std::move(rankedAlphabet), std::move(*root));
@@ -74,7 +74,7 @@ PrefixRankedNotation TreeFromXMLParser::parsePrefixRankedNotation(std::deque<sax
 UnrankedPattern TreeFromXMLParser::parseUnrankedPattern(std::deque<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_UNRANKED_PATTERN);
 
-	alphabet::Symbol subtreeWildcard = parseSubtreeVariable<alphabet::Symbol>(input);
+	alphabet::Symbol subtreeWildcard = parseSubtreeWildcard<alphabet::Symbol>(input);
 	std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
 	UnrankedNode * root = parseUnrankedNode(input);
 	UnrankedPattern tree(subtreeWildcard, std::move(alphabet), std::move(*root));
@@ -95,7 +95,7 @@ UnrankedTree TreeFromXMLParser::parseUnrankedTree(std::deque<sax::Token>& input)
 }
 
 template<class T>
-T TreeFromXMLParser::parseSubtreeVariable(std::deque<sax::Token>& input) const {
+T TreeFromXMLParser::parseSubtreeWildcard(std::deque<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard");
 	T subtreeWildcard(alib::xmlApi<T>::parse(input));
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "subtreeWildcard");
diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h
index c354e3362683ead4d4ed3ccbaebb2e170700e179..20bd15ef3d3e438433833b0286edc4b39c1c6240 100644
--- a/alib2data/src/tree/TreeFromXMLParser.h
+++ b/alib2data/src/tree/TreeFromXMLParser.h
@@ -43,7 +43,7 @@ private:
 	std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token> &input) const;
 
 	template<class T>
-	T parseSubtreeVariable(std::deque<sax::Token> &input) const;
+	T parseSubtreeWildcard(std::deque<sax::Token> &input) const;
 
 	Tree parseTree(std::deque<sax::Token>& input) const;
 	Tree parseTree(std::deque<sax::Token>& input, const std::set<FEATURES>& features) const;
diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp
index 9aa599b44d0d1271cc99191f484bf51ac3cc367e..4a7c7fd9124f1492661d5ad73416953a20f238a4 100644
--- a/alib2data/src/tree/TreeToXMLComposer.cpp
+++ b/alib2data/src/tree/TreeToXMLComposer.cpp
@@ -12,7 +12,7 @@
 namespace tree {
 
 template<class T>
-void TreeToXMLComposer::composeSubtreeWildCard(std::deque<sax::Token>& out, const T& symbol) const {
+void TreeToXMLComposer::composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const {
 	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::START_ELEMENT));
 	alib::xmlApi<T>::compose(out, symbol);
 	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::END_ELEMENT));
@@ -54,7 +54,7 @@ void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedTree& t
 void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedPattern& tree) const {
 	out.emplace_back(sax::Token(alib::Names::TREE_RANKED_PATTERN, sax::Token::TokenType::START_ELEMENT));
 
-	composeSubtreeWildCard(out, tree.getSubtreeWildCard());
+	composeSubtreeWildcard(out, tree.getSubtreeWildcard());
 	composeAlphabet(out, tree.getAlphabet());
 	composeNode(out, tree.getRoot());
 
@@ -86,7 +86,7 @@ void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedTree&
 void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedPattern& tree) const {
 	out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_PATTERN, sax::Token::TokenType::START_ELEMENT));
 
-	composeSubtreeWildCard(out, tree.getSubtreeWildCard());
+	composeSubtreeWildcard(out, tree.getSubtreeWildcard());
 	composeAlphabet(out, tree.getAlphabet());
 	composeNode(out, tree.getRoot());
 
diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h
index deeed832b01f14139ea97f4e2ea3870d4ab079ad..0fda3ae38ba09fa35b660aebd8296fc07047b9b9 100644
--- a/alib2data/src/tree/TreeToXMLComposer.h
+++ b/alib2data/src/tree/TreeToXMLComposer.h
@@ -38,7 +38,7 @@ private:
 	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols) const;
 	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const;
 	template<class T>
-	void composeSubtreeWildCard(std::deque<sax::Token>& out, const T& symbol) const;
+	void composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const;
 
 	/**
 	 * Prints XML representation of Tree to the output stream.
diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.cpp b/alib2data/src/tree/common/RankedPatternAlphabet.cpp
index 30720fb67ffdbb1bbbeb19f634013c9573cd6098..eb567a40a7631f385edfb6ec4b644543a09a661d 100644
--- a/alib2data/src/tree/common/RankedPatternAlphabet.cpp
+++ b/alib2data/src/tree/common/RankedPatternAlphabet.cpp
@@ -13,18 +13,23 @@
 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) {
+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 {
+const alphabet::RankedSymbol& RankedPatternAlphabet::getSubtreeWildcard() const {
 	return subtreeWildcard;
 }
 
diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.h b/alib2data/src/tree/common/RankedPatternAlphabet.h
index c174b33674a4f210723f48d5e18a8a97af890996..7be04046027a380e35ca74b4db449a6afe2d76d5 100644
--- a/alib2data/src/tree/common/RankedPatternAlphabet.h
+++ b/alib2data/src/tree/common/RankedPatternAlphabet.h
@@ -26,12 +26,12 @@ public:
 	 * Sets the subtree variable = symbol representing subtree substitution place in the pattern
 	 * @param symbol Symbol to set
 	 */
-	void setSubtreeWildCard(alphabet::RankedSymbol symbol);
+	void setSubtreeWildcard(alphabet::RankedSymbol symbol);
 
 	/**
 	 * @return symbol representing subtree variable
 	 */
-	const alphabet::RankedSymbol& getSubtreeWildCard() const;
+	const alphabet::RankedSymbol& getSubtreeWildcard() const;
 
 };
 
diff --git a/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp b/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp
index 31bd6c3fdcb42fb7dd9bd2fccd290729e74b21d4..1dcf1978651df9ca1fc6ef5147f29eb17cbc3e74 100644
--- a/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp
+++ b/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp
@@ -16,7 +16,7 @@ UnrankedPatternAlphabet::UnrankedPatternAlphabet(alphabet::Symbol subtreeWildcar
 	alphabet.insert(std::move(subtreeWildcard));
 }
 
-void UnrankedPatternAlphabet::setSubtreeWildCard(alphabet::Symbol symbol) {
+void UnrankedPatternAlphabet::setSubtreeWildcard(alphabet::Symbol symbol) {
 	if (!alphabet.count(symbol))
 		throw TreeException("Subtree wildcard symbol \"" + (std::string) symbol + "\" is not in the alphabet.");
 
@@ -24,7 +24,7 @@ void UnrankedPatternAlphabet::setSubtreeWildCard(alphabet::Symbol symbol) {
 
 }
 
-const alphabet::Symbol& UnrankedPatternAlphabet::getSubtreeWildCard() const {
+const alphabet::Symbol& UnrankedPatternAlphabet::getSubtreeWildcard() const {
 	return subtreeWildcard;
 }
 
diff --git a/alib2data/src/tree/common/UnrankedPatternAlphabet.h b/alib2data/src/tree/common/UnrankedPatternAlphabet.h
index 68438522647b53f1a2203f854b1ed4709881787f..22f41db833711f76fed4a106c0b8f17c9bdf149f 100644
--- a/alib2data/src/tree/common/UnrankedPatternAlphabet.h
+++ b/alib2data/src/tree/common/UnrankedPatternAlphabet.h
@@ -26,12 +26,12 @@ public:
 	 * Sets the subtree variable = symbol representing subtree substitution place in the pattern
 	 * @param symbol Symbol to set
 	 */
-	void setSubtreeWildCard(alphabet::Symbol symbol);
+	void setSubtreeWildcard(alphabet::Symbol symbol);
 
 	/**
 	 * @return symbol representing subtree variable
 	 */
-	const alphabet::Symbol& getSubtreeWildCard() const;
+	const alphabet::Symbol& getSubtreeWildcard() const;
 
 };
 
diff --git a/alib2data/src/tree/ranked/RankedNode.cpp b/alib2data/src/tree/ranked/RankedNode.cpp
index 514da467ba4ba74d080100a56ce1fa04d599fdf5..c97145e1cb0486f82b5ea45ef5e2a9aeb0085797 100644
--- a/alib2data/src/tree/ranked/RankedNode.cpp
+++ b/alib2data/src/tree/ranked/RankedNode.cpp
@@ -165,6 +165,8 @@ bool RankedNode::attachTree(const RankedAlphabet * tree ) {
 
 void RankedNode::computeMinimalAlphabet( std::set<alphabet::RankedSymbol>& alphabet ) const {
 	alphabet.insert(this->symbol);
+	for(const auto& child : this->children)
+		child->computeMinimalAlphabet(alphabet);
 }
 
 const alphabet::RankedSymbol& RankedNode::getSymbol() const {
diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h
index 36f8e1620255d737401781f9d0df10e12af4119e..826cf941fc286e2ea259ed6a83533976bc747c66 100644
--- a/alib2data/src/tree/ranked/RankedNode.h
+++ b/alib2data/src/tree/ranked/RankedNode.h
@@ -109,6 +109,7 @@ public:
 	void nicePrint(std::ostream &, const std::string & = "", const bool = true) const;
 
 	friend class UnrankedTree;
+	friend class UnrankedPattern;
 	friend class RankedTree;
 	friend class RankedPattern;
 };
diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp
index 9e46a137556b58f874b4c0efc8e15a001c4a4538..7bf22b03d00122d124db26d97f6292f0d163f639 100644
--- a/alib2data/src/tree/ranked/RankedPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedPattern.cpp
@@ -12,17 +12,17 @@
 #include <algorithm>
 #include <sstream>
 
-//#include "../unranked/UnrankedPattern.h"
+#include "../unranked/UnrankedPattern.h"
 
 namespace tree {
 
-/*RankedPattern::RankedPattern(const UnrankedPattern& other) {
+RankedPattern::RankedPattern(const UnrankedPattern& other) : RankedPatternAlphabet(alphabet::RankedSymbol(other.getSubtreeWildcard(), 0)) {
 	this->pattern = NULL;
 	RankedNode* element = other.getRoot().cloneAsRanked();
 	element->computeMinimalAlphabet(alphabet);
 	setTree(std::move(*element));
 	delete element;
-}*/
+}
 
 RankedPattern::RankedPattern(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, RankedNode pattern) : RankedPatternAlphabet(std::move(subtreeWildcard)) {
 	setAlphabet(std::move(alphabet));
diff --git a/alib2data/src/tree/ranked/RankedPattern.h b/alib2data/src/tree/ranked/RankedPattern.h
index d807b8e4b066c86c9593b13b3df3ba926c48b32d..6e87eeea4d4f0f7d461cb0898da12812b0e40452 100644
--- a/alib2data/src/tree/ranked/RankedPattern.h
+++ b/alib2data/src/tree/ranked/RankedPattern.h
@@ -39,7 +39,7 @@ public:
 	 */
 	virtual TreeBase* plunder() &&;
 
-//	explicit RankedPattern(const UnrankedPattern& other);
+	explicit RankedPattern(const UnrankedPattern& other);
 	explicit RankedPattern(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, RankedNode pattern);
 	explicit RankedPattern(alphabet::RankedSymbol subtreeWildcard, RankedNode pattern);
 
diff --git a/alib2data/src/tree/unranked/UnrankedNode.h b/alib2data/src/tree/unranked/UnrankedNode.h
index 3acbdc64beece34218297446f13d421b7844dfba..a4cabbaaf7b32bd01734d0604ebfd2f50d8d3c18 100644
--- a/alib2data/src/tree/unranked/UnrankedNode.h
+++ b/alib2data/src/tree/unranked/UnrankedNode.h
@@ -113,6 +113,7 @@ public:
 	friend class UnrankedTree;
 	friend class UnrankedPattern;
 	friend class RankedTree;
+	friend class RankedPattern;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp
index 9ab01b3f6ea6fa158913497b979fc54d71886ce7..3dc27ddc66c81d1a77a22f2c76a881fa32f0ddb7 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp
@@ -12,17 +12,17 @@
 #include <algorithm>
 #include <sstream>
 
-//#include "../unranked/RankedPattern.h"
+#include "../ranked/RankedPattern.h"
 
 namespace tree {
 
-/*UnrankedPattern::UnrankedPattern(const RankedPattern& other) {
+UnrankedPattern::UnrankedPattern(const RankedPattern& other) : UnrankedPatternAlphabet(other.getSubtreeWildcard().getSymbol()) {
 	this->pattern = NULL;
-	UnrankedNode* element = other.getRoot().cloneAsRanked();
+	UnrankedNode* element = other.getRoot().cloneAsUnranked();
 	element->computeMinimalAlphabet(alphabet);
 	setTree(std::move(*element));
 	delete element;
-}*/
+}
 
 UnrankedPattern::UnrankedPattern(alphabet::Symbol subtreeWildcard, std::set<alphabet::Symbol> alphabet, UnrankedNode pattern) : UnrankedPatternAlphabet(std::move(subtreeWildcard)) {
 	setAlphabet(std::move(alphabet));
@@ -96,7 +96,7 @@ bool UnrankedPattern::removeSymbolFromAlphabet(const alphabet::Symbol & symbol)
 		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used.");
 
 	if(this->subtreeWildcard == symbol)
-		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is subtreeWildcard.");
+		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is subtree wildcard.");
 
 	return alphabet.erase(symbol);
 }
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.h b/alib2data/src/tree/unranked/UnrankedPattern.h
index d671ae52820ff79181408cf2b481147a192bc9fa..28dca3bddf6d11e706b27e3f6ef73af3ddc650e0 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.h
+++ b/alib2data/src/tree/unranked/UnrankedPattern.h
@@ -39,7 +39,7 @@ public:
 	 */
 	virtual TreeBase* plunder() &&;
 
-//	explicit UnrankedPattern(const RankedPattern& other);
+	explicit UnrankedPattern(const RankedPattern& other);
 	explicit UnrankedPattern(alphabet::Symbol subtreeWildcard, std::set<alphabet::Symbol> alphabet, UnrankedNode pattern);
 	explicit UnrankedPattern(alphabet::Symbol subtreeWildcard, UnrankedNode pattern);
 
diff --git a/alib2data/test-src/tree/TreeTest.cpp b/alib2data/test-src/tree/TreeTest.cpp
index 59c0516f0bf38261044437e33172f6e0be25d5b4..66162edd7baf230ac6836c698a67aa4f0e6f3fb4 100644
--- a/alib2data/test-src/tree/TreeTest.cpp
+++ b/alib2data/test-src/tree/TreeTest.cpp
@@ -407,6 +407,24 @@ void TreeTest::testRankedPatternParser() {
 		std::cout << std::endl;
 		tree2.getRoot().nicePrint(std::cout);
 	}
+
+	const alphabet::Symbol ua = alphabet::symbolFrom('a');
+	const alphabet::Symbol ub = alphabet::symbolFrom('b');
+	const alphabet::Symbol uc = alphabet::symbolFrom('c');
+
+	const alphabet::Symbol uS { alphabet::SubtreeWildcardSymbol {} };
+	const std::set<alphabet::Symbol> ualphabet {ua, ub, uc, uS};
+
+	tree::UnrankedNode * unode3 = new tree::UnrankedNode(uc, {});
+	tree::UnrankedNode * unode4 = new tree::UnrankedNode(uS, {});
+	tree::UnrankedNode * unode2 = new tree::UnrankedNode(ub, {unode3});
+	tree::UnrankedNode unode1(ua, {unode2, unode4});
+
+	tree::UnrankedPattern tree2(uS, ualphabet, std::move(unode1));
+
+	tree::UnrankedPattern tree3 (tree );
+
+	CPPUNIT_ASSERT(tree3 == tree2);
 }
 
 void TreeTest::testUnrankedPatternParser() {
@@ -439,5 +457,23 @@ void TreeTest::testUnrankedPatternParser() {
 		std::cout << std::endl;
 		tree2.getRoot().nicePrint(std::cout);
 	}
+
+	const alphabet::RankedSymbol ra ('a', 2);
+	const alphabet::RankedSymbol rb ('b', 1);
+	const alphabet::RankedSymbol rc ('c', 0);
+
+	const alphabet::RankedSymbol rS { alphabet::Symbol { alphabet::SubtreeWildcardSymbol {} }, 0};
+	const std::set<alphabet::RankedSymbol> ralphabet {ra, rb, rc, rS};
+
+	tree::RankedNode * rnode3 = new tree::RankedNode(rc, {});
+	tree::RankedNode * rnode4 = new tree::RankedNode(rS, {});
+	tree::RankedNode * rnode2 = new tree::RankedNode(rb, {rnode3});
+	tree::RankedNode rnode1(ra, {rnode2, rnode4});
+
+	tree::RankedPattern tree2(rS, ralphabet, std::move(rnode1));
+
+	tree::RankedPattern tree3 (tree);
+
+	CPPUNIT_ASSERT(tree3 == tree2);
 }