diff --git a/alib2std/src/extensions/compare.hpp b/alib2std/src/extensions/compare.hpp
index 071b7a757824897a14150d4b0ca2d1b387592934..f92be80ef7241f9807e724fce426a5f727709b58 100644
--- a/alib2std/src/extensions/compare.hpp
+++ b/alib2std/src/extensions/compare.hpp
@@ -8,6 +8,8 @@
 #ifndef COMPARE_HPP_
 #define COMPARE_HPP_
 
+#include <utility>
+
 namespace std {
 
 template < typename T, typename Enable = void >
@@ -34,6 +36,14 @@ struct compare<double> {
 	}
 };
 
+template<class T>
+struct compare<T*> {
+	int operator()( T * const & first, T * const & second) const {
+		compare<typename std::decay < T >::type > comp;
+		return comp(*first, *second);
+	}
+};
+
 } /* namespace std */
 
 #endif /* COMPARE_HPP_ */
diff --git a/alib2std/src/extensions/deque.hpp b/alib2std/src/extensions/deque.hpp
index 87fe60a448b2b922365a5beaf31291498e8d1e82..c2ac58f5b7f6a76e914243c906a4564d8f1ccc37 100644
--- a/alib2std/src/extensions/deque.hpp
+++ b/alib2std/src/extensions/deque.hpp
@@ -10,8 +10,8 @@
 
 namespace std {
 
-template < class T >
-std::ostream & operator <<( std::ostream & out, const std::deque < T > & list ) {
+template < class T, class ... Ts >
+std::ostream & operator <<( std::ostream & out, const std::deque < T, Ts ... > & list ) {
 	out << "[";
 
 	bool first = true;
@@ -27,14 +27,14 @@ std::ostream & operator <<( std::ostream & out, const std::deque < T > & list )
 	return out;
 }
 
-template < class T >
-struct compare < deque < T > > {
-	int operator ()( const deque < T > & first, const deque < T > & second ) const {
+template < class T, class ... Ts >
+struct compare < deque < T, Ts ... > > {
+	int operator ()( const deque < T, Ts ... > & first, const deque < T, Ts ... > & second ) const {
 		if ( first.size ( ) < second.size ( ) ) return -1;
 
 		if ( first.size ( ) > second.size ( ) ) return 1;
 
-		compare < T > comp;
+		compare < typename std::decay < T >::type > comp;
 
 		for ( auto iterF = first.begin ( ), iterS = second.begin ( ); iterF != first.end ( ); ++iterF, ++iterS ) {
 			int res = comp ( * iterF, * iterS );
diff --git a/alib2std/src/extensions/list.hpp b/alib2std/src/extensions/list.hpp
index 65fe68e730380aceee5e6125f79c59a29bc7370d..6dc9a317f92b194c6c721d8b913ca9c771c00d66 100644
--- a/alib2std/src/extensions/list.hpp
+++ b/alib2std/src/extensions/list.hpp
@@ -10,8 +10,8 @@
 
 namespace std {
 
-template< class T >
-std::ostream& operator<<(std::ostream& out, const std::list<T>& list) {
+template< class T, class ... Ts >
+std::ostream& operator<<(std::ostream& out, const std::list<T, Ts ... >& list) {
 	out << "[";
 
 	bool first = true;
@@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::list<T>& list) {
 	return out;
 }
 
-template<class T>
-struct compare<list<T>> {
-	int operator()(const list<T>& first, const list<T>& second) const {
+template<class T, class ... Ts >
+struct compare<list<T, Ts ... >> {
+	int operator()(const list<T, Ts ... >& first, const list<T, Ts ... >& second) const {
 		if(first.size() < second.size()) return -1;
 		if(first.size() > second.size()) return 1;
 
-		compare<T> comp;
+		compare<typename std::decay < T >::type > comp;
 		for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) {
 			int res = comp(*iterF, *iterS);
 			if(res != 0) return res;
diff --git a/alib2std/src/extensions/map.hpp b/alib2std/src/extensions/map.hpp
index 1d8bb3219e4f28c8eddef764775961925b0150f0..b2d0f167399f984956a7bf7193f1683cffd419be 100644
--- a/alib2std/src/extensions/map.hpp
+++ b/alib2std/src/extensions/map.hpp
@@ -12,8 +12,8 @@
 
 namespace std {
 
-template< class T, class R >
-std::ostream& operator<<(std::ostream& out, const std::map<T, R>& map) {
+template< class T, class R, class ... Ts >
+std::ostream& operator<<(std::ostream& out, const std::map<T, R, Ts ... >& map) {
 	out << "{";
 
 	bool first = true;
@@ -27,13 +27,13 @@ std::ostream& operator<<(std::ostream& out, const std::map<T, R>& map) {
 	return out;
 }
 
-template<class T, class R>
-struct compare<map<T, R>> {
-	int operator()(const map<T, R>& first, const map<T, R>& second) const {
+template<class T, class R, class ... Ts>
+struct compare<map<T, R, Ts ...>> {
+	int operator()(const map<T, R, Ts ...>& first, const map<T, R, Ts ...>& second) const {
 		if(first.size() < second.size()) return -1;
 		if(first.size() > second.size()) return 1;
 
-		compare<std::pair<T, R>> comp;
+		compare<std::pair<typename std::decay < T >::type, typename std::decay < R >::type >> comp;
 		for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) {
 			int res = comp(*iterF, *iterS);
 			if(res != 0) return res;
diff --git a/alib2std/src/extensions/pair.hpp b/alib2std/src/extensions/pair.hpp
index a6dae535266b5eda896fe8bfedd50a1e2656820f..dcf11667e5cc20c6e9758610ceaa7b8f598ba4dc 100644
--- a/alib2std/src/extensions/pair.hpp
+++ b/alib2std/src/extensions/pair.hpp
@@ -19,8 +19,8 @@ std::ostream& operator<<(std::ostream& out, const std::pair<T, R>& pair) {
 template<class T, class R>
 struct compare<pair<T, R>> {
 	int operator()(const pair<T, R>& first, const pair<T, R>& second) const {
-		compare<T> compT;
-		compare<R> compR;
+		compare<typename std::decay < T >::type > compT;
+		compare<typename std::decay < R >::type > compR;
 
 		int res = compT(first.first, second.first);
 		if(res == 0) res = compR(first.second, second.second);
diff --git a/alib2std/src/extensions/set.hpp b/alib2std/src/extensions/set.hpp
index 3d1f639e96804979e2ed78fa6a383da08314cb4f..ab34e6d25ea08a36a817125e3ec10952cdb858bb 100644
--- a/alib2std/src/extensions/set.hpp
+++ b/alib2std/src/extensions/set.hpp
@@ -10,8 +10,8 @@
 
 namespace std {
 
-template< class T >
-std::ostream& operator<<(std::ostream& out, const std::set<T>& list) {
+template< class T, class ... Ts >
+std::ostream& operator<<(std::ostream& out, const std::set<T, Ts ...>& list) {
 	out << "{";
 
 	bool first = true;
@@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::set<T>& list) {
 	return out;
 }
 
-template<class T>
-struct compare<set<T>> {
-	int operator()(const set<T>& first, const set<T>& second) const {
+template<class T, class ... Ts>
+struct compare<set<T, Ts ...>> {
+	int operator()(const set<T, Ts ...>& first, const set<T, Ts ...>& second) const {
 		if(first.size() < second.size()) return -1;
 		if(first.size() > second.size()) return 1;
 
-		compare<T> comp;
+		compare<typename std::decay < T >::type > comp;
 		for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) {
 			int res = comp(*iterF, *iterS);
 			if(res != 0) return res;
diff --git a/alib2std/src/extensions/unordered_map.hpp b/alib2std/src/extensions/unordered_map.hpp
index 9c075beb57675225b9547ba9822ffc0a244170c6..97d722dee48342d526f34148920d9d4d8815a914 100644
--- a/alib2std/src/extensions/unordered_map.hpp
+++ b/alib2std/src/extensions/unordered_map.hpp
@@ -10,8 +10,8 @@
 
 namespace std {
 
-template< class T, class R >
-std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R>& map) {
+template< class T, class R, class ... Ts >
+std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R, Ts ... >& map) {
 	out << "{";
 
 	bool first = true;
@@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R>& map)
 	return out;
 }
 
-template<class T, class R>
-struct compare<unordered_map<T, R>> {
-	int operator()(const unordered_map<T, R>& first, const unordered_map<T, R>& second) const {
+template<class T, class R, class ... Ts>
+struct compare<unordered_map<T, R, Ts ...>> {
+	int operator()(const unordered_map<T, R, Ts ...>& first, const unordered_map<T, R, Ts ...>& second) const {
 		if(first.size() < second.size()) return -1;
 		if(first.size() > second.size()) return 1;
 
-		compare<R> comp;
+		compare<typename std::decay < R >::type > comp;
 		for(auto iter = first.begin(); iter != first.end(); ++iter) {
 			auto search = second.find(iter->first);
 			if(search == second.end()) return -1;
diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp
index 7d5dc25a29851a776dfadce2c8e7935870385dc8..052d79b506b398752795b99f7a60295ff664f76f 100644
--- a/alib2std/src/extensions/variant.hpp
+++ b/alib2std/src/extensions/variant.hpp
@@ -83,7 +83,7 @@ struct variant_helper<F, Ts...> {
 		if (this_t != typeid(F).hash_code() && other_t == typeid(F).hash_code()) return 1;
 
 		if (this_t == typeid(F).hash_code() && other_t == typeid(F).hash_code()) {
-			compare<F> comp;
+			compare<typename std::decay < F >::type > comp;
 			return comp( *(reinterpret_cast<const F*>(this_v)), *(reinterpret_cast<const F*>(other_v)));
 		} else
 			return variant_helper<Ts...>::compareHelper(this_t, this_v, other_t, other_v);
diff --git a/alib2std/src/extensions/vector.hpp b/alib2std/src/extensions/vector.hpp
index 7efeaba3f70431b6418c407d220e1f0bc3c18fa9..db96b7888624cd9630e188d2a7ece30fa92e9867 100644
--- a/alib2std/src/extensions/vector.hpp
+++ b/alib2std/src/extensions/vector.hpp
@@ -10,8 +10,8 @@
 
 namespace std {
 
-template< class T , class Allocator >
-std::ostream& operator<<(std::ostream& out, const std::vector<T, Allocator>& vector) {
+template< class T , class ... Ts >
+std::ostream& operator<<(std::ostream& out, const std::vector<T, Ts ...>& vector) {
 	out << "[";
 
 	bool first = true;
@@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::vector<T, Allocator>& vec
 	return out;
 }
 
-template<class T, class Allocator>
-struct compare<vector<T, Allocator>> {
-	int operator()(const vector<T, Allocator>& first, const vector<T, Allocator>& second) const {
+template<class T, class ... Ts>
+struct compare<vector<T, Ts ...>> {
+	int operator()(const vector<T, Ts...>& first, const vector<T, Ts...>& second) const {
 		if(first.size() < second.size()) return -1;
 		if(first.size() > second.size()) return 1;
 
-		compare<T> comp;
+		compare<typename std::decay < T >::type > comp;
 		for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) {
 			int res = comp(*iterF, *iterS);
 			if(res != 0) return res;
diff --git a/alib2std/test-src/extensions/CompareTest.cpp b/alib2std/test-src/extensions/CompareTest.cpp
index 014405b436d836606e020c21bc03ad2d28d9c429..7f91019f86d940c6064ebcb7e2588d7149be45d2 100644
--- a/alib2std/test-src/extensions/CompareTest.cpp
+++ b/alib2std/test-src/extensions/CompareTest.cpp
@@ -2,6 +2,7 @@
 #include <set>
 #include <vector>
 #include <pair>
+#include <map>
 
 
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( CompareTest, "bits" );
@@ -31,5 +32,21 @@ void CompareTest::testCompare() {
 
 	std::compare<std::pair<std::set<std::vector<int>>, std::set<std::vector<int>>>> comp3;
 	CPPUNIT_ASSERT(comp3(pair1, pair2) < 0);
+
+	int two = 2;
+	int three = 3;
+	int four = 4;
+
+	std::map<int, const int*> map1 = { {1, &two}, {2, &three} };
+	std::map<int, const int*> map2 = { {2, &three}, {3, &four} };
+
+	std::compare<std::map<int, const int*>> comp4;
+	CPPUNIT_ASSERT(comp4(map1, map2) < 0);
+
+	auto first = std::tie(vector1, set1, pair1, map1);
+	auto second = std::tie(vector2, set2, pair2, map2);
+
+	std::compare<decltype ( first ) > comp5;
+	CPPUNIT_ASSERT(comp5(first, second) < 0);
 }