diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index d66cf9eaec02fc1169db02280a919ea57eb04561..1f17bbe9fa68d62c3a1537dc0678c8e891bc40c3 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -130,8 +130,8 @@ bool PrefixRankedBarPattern::isEmpty ( ) const {
 }
 
 int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet() );
-	auto second = std::tie ( other.m_Data, other.getAlphabet() );
+	auto first = std::tie ( m_Data, getAlphabet(), getSubtreeWildcard(), bar, variablesBar );
+	auto second = std::tie ( other.m_Data, other.getAlphabet(), other.getSubtreeWildcard(), bar, variablesBar );
 
 	std::compare < decltype ( first ) > comp;
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index 4b10df899052bfbd8825f2a57c28b2adbf1533b5..9c8fd9c4d77237b9ad1ec86149f457703f887812 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -108,8 +108,8 @@ bool PrefixRankedBarTree::isEmpty ( ) const {
 }
 
 int PrefixRankedBarTree::compare ( const PrefixRankedBarTree & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet() );
-	auto second = std::tie ( other.m_Data, other.getAlphabet() );
+	auto first = std::tie ( m_Data, getAlphabet(), bar );
+	auto second = std::tie ( other.m_Data, other.getAlphabet(), bar );
 
 	std::compare < decltype ( first ) > comp;
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index c500ddedb03aecf8e89cc7b25739174e79425973..9601d6c9625c495a49ca3ddb18e2e2a5f8aea098 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -94,8 +94,8 @@ bool PrefixRankedPattern::isEmpty ( ) const {
 }
 
 int PrefixRankedPattern::compare ( const PrefixRankedPattern & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet ( ) );
-	auto second = std::tie ( other.m_Data, other.getAlphabet (  ) );
+	auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ) );
+	auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ) );
 
 	std::compare < decltype ( first ) > comp;
 
diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h
index 83146a983028ebe0f569bca80d2ca9f4a2ef0f97..b389880358d1c6c5a075d9391388ad7f841dd838 100644
--- a/alib2data/src/tree/ranked/RankedNode.h
+++ b/alib2data/src/tree/ranked/RankedNode.h
@@ -133,4 +133,16 @@ struct xmlApi < const tree::RankedNode * > {
 
 } /* namespace alib */
 
+namespace std {
+
+template < >
+struct compare < tree::RankedNode > {
+	int operator ()( const tree::RankedNode & first, const tree::RankedNode & second ) const {
+		return first.compare ( second );
+	}
+
+};
+
+} /* namespace std */
+
 #endif /* RANKED_NODE_H_ */
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
index b132197087b9493515c0fd3e917367b146fbd038..b579ad3ebf30e4d8a73e2bc7448c51662de08268 100644
--- a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
@@ -101,24 +101,12 @@ void RankedNonlinearPattern::operator >>( std::ostream & out ) const {
 }
 
 int RankedNonlinearPattern::compare ( const RankedNonlinearPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard(), getNonlinearVariables() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard(), getNonlinearVariables() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::RankedSymbol > comp;
-		res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getNonlinearVariables(), other.getNonlinearVariables() );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getAlphabet(), other.getAlphabet() );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void RankedNonlinearPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp
index 3733ff6c5cd763c37283c6f17d5b7344bb4a559c..9cc23a6c635939103dffece5df93b73f8b043722 100644
--- a/alib2data/src/tree/ranked/RankedPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedPattern.cpp
@@ -101,19 +101,12 @@ void RankedPattern::operator >>( std::ostream & out ) const {
 }
 
 int RankedPattern::compare ( const RankedPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::RankedSymbol > comp;
-		res = comp ( getSubtreeWildcard(), other.getSubtreeWildcard() );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getAlphabet(), other.getAlphabet() );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void RankedPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp
index 3efe5e8154fc552c4cda0ffd983d584f811fdc5e..cc010d31836b15ae99ea85c733365730b1e9243c 100644
--- a/alib2data/src/tree/ranked/RankedTree.cpp
+++ b/alib2data/src/tree/ranked/RankedTree.cpp
@@ -100,14 +100,12 @@ void RankedTree::operator >>( std::ostream & out ) const {
 }
 
 int RankedTree::compare ( const RankedTree & other ) const {
-	int res = tree->compare ( * other.tree );
+	auto first = std::tie ( * tree, getAlphabet() );
+	auto second = std::tie ( * other.tree, other.getAlphabet() );
 
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void RankedTree::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/unranked/UnrankedNode.h b/alib2data/src/tree/unranked/UnrankedNode.h
index ac97498db2e13776f77eac94c3ea1d675501f5ab..e38ec80a02a39fba40007b7ea8e63c63dc1b28d3 100644
--- a/alib2data/src/tree/unranked/UnrankedNode.h
+++ b/alib2data/src/tree/unranked/UnrankedNode.h
@@ -136,4 +136,16 @@ struct xmlApi < const tree::UnrankedNode * > {
 
 } /* namespace alib */
 
+namespace std {
+
+template < >
+struct compare < tree::UnrankedNode > {
+	int operator ()( const tree::UnrankedNode & first, const tree::UnrankedNode & second ) const {
+		return first.compare ( second );
+	}
+
+};
+
+} /* namespace std */
+
 #endif /* UNRANKED_NODE_H_ */
diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
index 1bdc0049d95b9393f6283d2ae4458344ee9e5b69..5b33fe98ecc7502b26dff56f2a7eb550636d6f08 100644
--- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
@@ -101,24 +101,12 @@ void UnrankedNonlinearPattern::operator >>( std::ostream & out ) const {
 }
 
 int UnrankedNonlinearPattern::compare ( const UnrankedNonlinearPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard(), getNonlinearVariables() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard(), getNonlinearVariables() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::Symbol > comp;
-		res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getNonlinearVariables ( ), other.getNonlinearVariables ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void UnrankedNonlinearPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp
index 8ff896508e65cfbb6c3bc82f11f64e69ec59fe30..6c16330fd098c85cb8797c4ad9b16954831a4591 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp
@@ -103,19 +103,12 @@ void UnrankedPattern::operator >>( std::ostream & out ) const {
 }
 
 int UnrankedPattern::compare ( const UnrankedPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::Symbol > comp;
-		res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void UnrankedPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp
index 06497e42cbb9cb72bc798430337514aed49fbe81..7febf5f9ade51d8d0116880bc1df762963e0a289 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.cpp
+++ b/alib2data/src/tree/unranked/UnrankedTree.cpp
@@ -102,14 +102,12 @@ void UnrankedTree::operator >>( std::ostream & out ) const {
 }
 
 int UnrankedTree::compare ( const UnrankedTree & other ) const {
-	int res = tree->compare ( * other.tree );
+	auto first = std::tie ( * tree, getAlphabet() );
+	auto second = std::tie ( * other.tree, other.getAlphabet() );
 
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void UnrankedTree::nicePrint ( std::ostream & os ) const {
diff --git a/alib2std/src/extensions/compare.hpp b/alib2std/src/extensions/compare.hpp
index 08f4869e56b4845268f0348525aa31dbb3fe4246..c027efc02ecb2201559d04d9f6f0af5d6acdc0b8 100644
--- a/alib2std/src/extensions/compare.hpp
+++ b/alib2std/src/extensions/compare.hpp
@@ -11,9 +11,7 @@
 namespace std {
 
 template<class T>
-struct compare {
-	int operator()(T first, T second) const;
-};
+struct compare;
 
 template<>
 struct compare<bool> {