diff --git a/alib2algo_experimental/src/graph/datastructs/Components.h b/alib2algo_experimental/src/graph/datastructs/Components.h
index 3db1f0080b2da3bb6d29e22fb623b8f4effbe44e..c3564e4ab4690460f1e106ff8f6179c17d098191 100644
--- a/alib2algo_experimental/src/graph/datastructs/Components.h
+++ b/alib2algo_experimental/src/graph/datastructs/Components.h
@@ -22,7 +22,7 @@ class Components {
 		int height;
 	};
 
-	std::unordered_map< Node, SetNode > nodes;
+	ext::unordered_map< Node, SetNode > nodes;
 
  public:
 
diff --git a/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.cpp b/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.cpp
index 28203a6ec73675e476c3f03cc8850a7a068d846f..3e9e1530e32be00bde29939c4987bc2d60c34799 100644
--- a/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.cpp
+++ b/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.cpp
@@ -22,10 +22,10 @@ namespace embedding
 // Helpers
 
 template <typename T>
-using edge_array = std::unordered_map<DirectedEdge, T>;
+using edge_array = ext::unordered_map<DirectedEdge, T>;
 
 template <typename T>
-using node_array = std::unordered_map<Node, T>;
+using node_array = ext::unordered_map<Node, T>;
 
 template<typename T>
 inline void conc(T &container, T &l)
diff --git a/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.h b/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.h
index 0a80c8935d375eaf552e2558cac2b61aa7808a3d..dd044613b33f6974d027a0892e3db2058314ed24 100644
--- a/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.h
+++ b/alib2algo_experimental/src/graph/embedding/HopcroftTarjan.h
@@ -19,10 +19,10 @@ namespace embedding
 {
 
 // Computes combinatorial embedding of bidirected biconnected simple planar graph
-class HopcroftTarjan : public alib::SingleDispatch<HopcroftTarjan, std::unordered_map<Node, ext::vector<Node>>, const graph::GraphBase &>
+class HopcroftTarjan : public alib::SingleDispatch<HopcroftTarjan, ext::unordered_map<Node, ext::vector<Node>>, const graph::GraphBase &>
 {
 public:
-	typedef std::unordered_map<Node, ext::vector<Node>> Result;
+	typedef ext::unordered_map<Node, ext::vector<Node>> Result;
 
 	static Result hopcrofttarjan(const Graph &graph);
 
diff --git a/alib2algo_experimental/src/graph/generate/RandomGraphFactory.cpp b/alib2algo_experimental/src/graph/generate/RandomGraphFactory.cpp
index fa9f8e48a9ba801ed440f1a8534a1a886ab24d3d..b07e5e7bc7399270bb0634526da6ab1bdb8b292c 100644
--- a/alib2algo_experimental/src/graph/generate/RandomGraphFactory.cpp
+++ b/alib2algo_experimental/src/graph/generate/RandomGraphFactory.cpp
@@ -355,7 +355,7 @@ AdjacencyListUndirectedGraph RandomGraphFactory::generateUndirectedTriConnectedP
 {
 	NODE_LABEL = 0;
 
-	std::unordered_map<size_t, ext::vector<std::function<FuncOut()>>> funcs;
+	ext::unordered_map<size_t, ext::vector<std::function<FuncOut()>>> funcs;
 	funcs[5] = {gen5_1, gen5_2, gen5_3};
 	funcs[6] = {gen6_1, gen6_2, gen6_3};
 	funcs[7] = {gen7_1, gen7_2, gen7_3};
@@ -377,7 +377,7 @@ AdjacencyListUndirectedGraph RandomGraphFactory::generateUndirectedTriConnectedP
 AdjacencyListUndirectedGraph RandomGraphFactory::generateUndirectedIsomorphicGraph(const UndirectedGraph &graph)
 {
 	AdjacencyListUndirectedGraph out;
-	std::unordered_map<Node, Node> mapping;
+	ext::unordered_map<Node, Node> mapping;
 
 	for (const Node &n : graph.getNodes()) {
 		Node node(std::string(n.getName()) + "i");
diff --git a/alib2algo_experimental/src/graph/isomorphism/HopcroftGraph.cpp b/alib2algo_experimental/src/graph/isomorphism/HopcroftGraph.cpp
index 6409efa0ead9a94f59ddc69a033b7e9e50b38387..4a8c29489ad4b97a07da607e47b36d59351b06d1 100644
--- a/alib2algo_experimental/src/graph/isomorphism/HopcroftGraph.cpp
+++ b/alib2algo_experimental/src/graph/isomorphism/HopcroftGraph.cpp
@@ -405,8 +405,8 @@ ext::vector<ext::vector<EdgeEnd*>> Graph::findClumps(Vertex *v, Vertex *w) const
 
 void Graph::init(const UndirectedGraph &graph)
 {
-	std::unordered_map<Node, Vertex*> v_map;
-	std::unordered_map<UndirectedEdge, EdgeEnd*> e_map;
+	ext::unordered_map<Node, Vertex*> v_map;
+	ext::unordered_map<UndirectedEdge, EdgeEnd*> e_map;
 
 	for (const Node &node : graph.getNodes()) {
 		Vertex *v = new Vertex;
@@ -433,7 +433,7 @@ void Graph::init(const UndirectedGraph &graph)
 	}
 
 	// Embedding
-	std::unordered_map<Node, ext::vector<EdgeEnd*>> sortedNodeEdges;
+	ext::unordered_map<Node, ext::vector<EdgeEnd*>> sortedNodeEdges;
 
 	for (const auto &p : graph.getEmbedding()) {
 		Vertex *vertex = v_map[p.first];
diff --git a/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.cpp b/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.cpp
index 8dd4d942c3e01c550ff29646fc3d3a8d1e385271..4c22ecde4c0f906d2d9e4375ec4a937195b49d6f 100644
--- a/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.cpp
+++ b/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.cpp
@@ -1073,8 +1073,8 @@ bool HopcroftImpl::removeVertexWithSolitaryFace(int sides)
 
 	PREPARE_FUNCTION(Graph *graph, ARG_REF(trees_g), ARG_REF(circles_g)) {
 		// Find distinguished edges + vertices
-		std::unordered_map<EdgeEnd*, EdgeEnd*> omap;
-		std::unordered_map<Vertex*, ext::vector<EdgeEnd*>> rmap;
+		ext::unordered_map<EdgeEnd*, EdgeEnd*> omap;
+		ext::unordered_map<Vertex*, ext::vector<EdgeEnd*>> rmap;
 		for (Vertex *v : graph->vertices) {
 			if (v->degree < 3)
 				continue;
@@ -1373,7 +1373,7 @@ bool HopcroftImpl::testByDefinition()
 	if (m_g1->vertices.size() == 1)
 		return m_g1->vertices.front()->vlabel == m_g2->vertices.front()->vlabel;
 
-	std::unordered_map<Vertex*, Vertex*> mapping;
+	ext::unordered_map<Vertex*, Vertex*> mapping;
 	return isomorphism_r(m_g1->vertices, m_g2->vertices, mapping);
 }
 
@@ -1423,7 +1423,7 @@ bool HopcroftImpl::regularDegreeTwoGraphIsomorphism()
 }
 
 // Recursive exhaustive matching isomorphism test
-bool HopcroftImpl::isomorphism_r(ext::vector<Vertex*> vertices1, ext::vector<Vertex*> vertices2, std::unordered_map<Vertex*, Vertex*> &mapping)
+bool HopcroftImpl::isomorphism_r(ext::vector<Vertex*> vertices1, ext::vector<Vertex*> vertices2, ext::unordered_map<Vertex*, Vertex*> &mapping)
 {
 	if (vertices1.empty())
 		return isomorphism_mapping(mapping);
@@ -1444,7 +1444,7 @@ bool HopcroftImpl::isomorphism_r(ext::vector<Vertex*> vertices1, ext::vector<Ver
 	return false;
 }
 
-bool HopcroftImpl::isomorphism_mapping(std::unordered_map<Vertex*, Vertex*> &mapping)
+bool HopcroftImpl::isomorphism_mapping(ext::unordered_map<Vertex*, Vertex*> &mapping)
 {
 	auto createCircle = [](Vertex *v, Direction d) {
 		ext::vector<int> circle;
diff --git a/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.h b/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.h
index c34c3d9291f5806639752940df26292a2bfa2668..225e7c86f450eb7654281312ecad3363d32addc8 100644
--- a/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.h
+++ b/alib2algo_experimental/src/graph/isomorphism/HopcroftImpl.h
@@ -76,8 +76,8 @@ public:
 	bool isRegularDegreeTwoGraph();
 	bool regularDegreeTwoGraphIsomorphism();
 
-	bool isomorphism_r(ext::vector<Vertex*> vertices1, ext::vector<Vertex*> vertices2, std::unordered_map<Vertex*, Vertex*> &mapping);
-	bool isomorphism_mapping(std::unordered_map<Vertex*, Vertex*> &mapping);
+	bool isomorphism_r(ext::vector<Vertex*> vertices1, ext::vector<Vertex*> vertices2, ext::unordered_map<Vertex*, Vertex*> &mapping);
+	bool isomorphism_mapping(ext::unordered_map<Vertex*, Vertex*> &mapping);
 
 	void dumpGraphs();
 	void dumpLabels();
diff --git a/alib2algo_experimental/src/graph/isomorphism/Isomorphism.cpp b/alib2algo_experimental/src/graph/isomorphism/Isomorphism.cpp
index f1c6502629581079d507725d820344afd1014d52..9590fb396f7b5515c31ec50ea935cefdf49b8aad 100644
--- a/alib2algo_experimental/src/graph/isomorphism/Isomorphism.cpp
+++ b/alib2algo_experimental/src/graph/isomorphism/Isomorphism.cpp
@@ -31,7 +31,7 @@ static inline ext::set<DirectedEdge> stripNames(const ext::set<DirectedEdge> &s)
 	return out;
 }
 
-static bool is_equal(const ext::set<UndirectedEdge> &first, const ext::set<UndirectedEdge> &second, const std::unordered_map<Node, Node> &mapping)
+static bool is_equal(const ext::set<UndirectedEdge> &first, const ext::set<UndirectedEdge> &second, const ext::unordered_map<Node, Node> &mapping)
 {
 	if (first.size() != second.size())
 		return false;
@@ -49,7 +49,7 @@ static bool is_equal(const ext::set<UndirectedEdge> &first, const ext::set<Undir
 	return true;
 }
 
-static bool is_equal(const ext::set<DirectedEdge> &first, const ext::set<DirectedEdge> &second, const std::unordered_map<Node, Node> &mapping)
+static bool is_equal(const ext::set<DirectedEdge> &first, const ext::set<DirectedEdge> &second, const ext::unordered_map<Node, Node> &mapping)
 {
 	if (first.size() != second.size())
 		return false;
@@ -67,7 +67,7 @@ static bool is_equal(const ext::set<DirectedEdge> &first, const ext::set<Directe
 }
 
 template<typename T>
-static bool impl_r(const T &first, const T &second, const ext::vector<Node> &nodes1, const ext::vector<Node> &nodes2, std::unordered_map<Node, Node> &mapping)
+static bool impl_r(const T &first, const T &second, const ext::vector<Node> &nodes1, const ext::vector<Node> &nodes2, ext::unordered_map<Node, Node> &mapping)
 {
 	if (nodes1.empty()) {
 		for (const Node &n : first.getNodes()) {
@@ -105,7 +105,7 @@ static bool impl(const T &first, const T &second)
 
 	ext::vector<Node> n1;
 	ext::vector<Node> n2;
-	std::unordered_map<Node, Node> mapping;
+	ext::unordered_map<Node, Node> mapping;
 	std::copy(nodes1.begin(), nodes1.end(), std::back_inserter(n1));
 	std::copy(nodes2.begin(), nodes2.end(), std::back_inserter(n2));
 	return impl_r(first, second, n1, n2, mapping);
diff --git a/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp b/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp
index 495d8c9c1962e7684ccfea7cccd342c84706f07e..067dce1b63b8ad03016af932dbb04533140c51f6 100644
--- a/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp
+++ b/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp
@@ -54,9 +54,9 @@ enum State { FRESH, OPEN, CLOSED };
 struct Context {
 	Capacity capacity;
 	Flow flow;
-	std::unordered_map<Node,Node> prev;
-	std::unordered_map<Node,int> sgn;
-	std::unordered_map<Node,int> maxFlowTo;
+	ext::unordered_map<Node,Node> prev;
+	ext::unordered_map<Node,int> sgn;
+	ext::unordered_map<Node,int> maxFlowTo;
 };
 
 static Capacity getCapacity( const DirectedGraph & graph )
@@ -83,7 +83,7 @@ static Capacity getCapacity( const DirectedGraph & graph )
 
 static bool findPath_dir( const DirectedGraph & graph, Node source, Node sink, Context & ctx )
 {
-	std::unordered_map<Node,State> state;
+	ext::unordered_map<Node,State> state;
 	std::queue<Node> open;
 	Node actual;
 
@@ -124,7 +124,7 @@ static bool findPath_dir( const DirectedGraph & graph, Node source, Node sink, C
 
 static bool findPath_undir( const DirectedGraph & graph, Node source, Node sink, Context & ctx )
 {
-	std::unordered_map<Node,State> state;
+	ext::unordered_map<Node,State> state;
 	std::queue<Node> open;
 	Node actual;
 
diff --git a/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.h b/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.h
index 54599cbfb69d93947f97b0fd7d44d1571b7beabd..1f998128bfa537d01edab0125bc7310bb48d4bb6 100644
--- a/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.h
+++ b/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.h
@@ -17,8 +17,8 @@ namespace graph {
 
 namespace maximumflow {
 
-typedef std::unordered_map< Node, std::unordered_map< Node, int > > Capacity;
-typedef std::unordered_map< Node, std::unordered_map< Node, int > > Flow;
+typedef ext::unordered_map< Node, ext::unordered_map< Node, int > > Capacity;
+typedef ext::unordered_map< Node, ext::unordered_map< Node, int > > Flow;
 
 class FordFulkerson : public alib::SingleDispatch< FordFulkerson, Flow, const graph::GraphBase &, Node, Node > {
 
diff --git a/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp b/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp
index 7d5a825c0f39971893b8c2b6cb0962baeb69286b..4313c2c8b7153d3751d9ade3e8b60b49548357eb 100644
--- a/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp
+++ b/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp
@@ -79,7 +79,7 @@ static Cut fordfulkerson_impl_dir( const DirectedGraph & graph, Node source, Nod
 	graph::maximumflow::Flow flow = graph::maximumflow::FordFulkerson::fordfulkerson( graph, source, sink );
 
 	// mark nodes, which are reachable from source
-	std::unordered_map<Node,int> state;
+	ext::unordered_map<Node,int> state;
 	std::queue<Node> open;
 	ext::vector<std::pair<Node,Node>> candidates;
 	for (const Node & node : graph.getNodes())
@@ -126,7 +126,7 @@ static Cut fordfulkerson_impl_undir( const UndirectedGraph & ugraph, Node source
 	graph::maximumflow::Flow flow = graph::maximumflow::FordFulkerson::fordfulkerson( ugraph, source, sink );
 
 	// mark nodes, which are reachable from source
-	std::unordered_map<Node,int> state;
+	ext::unordered_map<Node,int> state;
 	std::queue<Node> open;
 	ext::vector<std::pair<Node,Node>> candidates;
 	for (const Node & node : ugraph.getNodes())
diff --git a/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp b/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp
index c1544ba951c0bf76fcd6e6545d910f04fc3b911f..7192a3416895a4ca04c545f269ea05b1cd049bce 100644
--- a/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp
+++ b/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp
@@ -23,7 +23,7 @@ public:
 	BellmanFord::Result out;
 };
 
-typedef std::unordered_map<Node, std::unordered_map<Node, int>> weights_t;
+typedef ext::unordered_map<Node, ext::unordered_map<Node, int>> weights_t;
 
 static BellmanFord::Result bellmanford_impl(const DirectedGraph &graph, const Node &start)
 {
diff --git a/alib2algo_experimental/src/graph/shortestpath/BellmanFord.h b/alib2algo_experimental/src/graph/shortestpath/BellmanFord.h
index df7d1437b4c38d9889580bf61804cb9ff24b423e..fc2db83f5279881567206af16a668f19652b0769 100644
--- a/alib2algo_experimental/src/graph/shortestpath/BellmanFord.h
+++ b/alib2algo_experimental/src/graph/shortestpath/BellmanFord.h
@@ -22,9 +22,9 @@ namespace shortestpath {
 //
 // note: negative-weight undirected edge = negative-weight cycle
 
-class BellmanFord : public alib::SingleDispatch<BellmanFord, std::unordered_map<Node, int>, const graph::GraphBase &, const Node&> {
+class BellmanFord : public alib::SingleDispatch<BellmanFord, ext::unordered_map<Node, int>, const graph::GraphBase &, const Node&> {
 public:
-	typedef std::unordered_map<Node, int> Result;
+	typedef ext::unordered_map<Node, int> Result;
 
 	static Result bellmanford(const Graph &graph, const Node &start);
 
diff --git a/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp b/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp
index 3eb712797ec57d4085acdf726e6f1d4497d06b3e..58ac9a62b4b06bdcf00c98e2b63e13be48f077c3 100644
--- a/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp
+++ b/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp
@@ -41,7 +41,7 @@ public:
 	int value;
 };
 
-typedef std::unordered_map<Node, std::unordered_map<Node, int>> weights_t;
+typedef ext::unordered_map<Node, ext::unordered_map<Node, int>> weights_t;
 
 static weights_t weights(const DirectedGraph &g)
 {
diff --git a/alib2algo_experimental/src/graph/shortestpath/Dijkstra.h b/alib2algo_experimental/src/graph/shortestpath/Dijkstra.h
index f00593927ca89bae2f891ef3647812f2ba28f07c..c5321845668d5d355b4ddda8a0b71285ad050522 100644
--- a/alib2algo_experimental/src/graph/shortestpath/Dijkstra.h
+++ b/alib2algo_experimental/src/graph/shortestpath/Dijkstra.h
@@ -19,9 +19,9 @@ namespace shortestpath {
 
 // Dijkstra only works on graphs without negative-weight edges (>= 0)
 
-class Dijkstra : public alib::SingleDispatch < Dijkstra, std::unordered_map<Node, int>, const graph::GraphBase &, const Node&> {
+class Dijkstra : public alib::SingleDispatch < Dijkstra, ext::unordered_map<Node, int>, const graph::GraphBase &, const Node&> {
 public:
-	typedef std::unordered_map<Node, int> Result;
+	typedef ext::unordered_map<Node, int> Result;
 
 	static Result dijkstra(const Graph &graph, const Node &start);
 
diff --git a/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.h b/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.h
index fcf2499121004ba909af8a4fd335ae378b7ba633..131680323a017dae6b7bd2040875e12973794797 100644
--- a/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.h
+++ b/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.h
@@ -23,9 +23,9 @@ namespace shortestpath {
 // note: negative-weight undirected edge = negative-weight cycle
 // note: std::numeric_limits<int>::max() is used as infinity
 
-class FloydWarshall : public alib::SingleDispatch<FloydWarshall, std::unordered_map<Node, std::unordered_map<Node, int>>, const graph::GraphBase & > {
+class FloydWarshall : public alib::SingleDispatch<FloydWarshall, ext::unordered_map<Node, ext::unordered_map<Node, int>>, const graph::GraphBase & > {
 public:
-	typedef std::unordered_map<Node, std::unordered_map<Node, int>> Result;
+	typedef ext::unordered_map<Node, ext::unordered_map<Node, int>> Result;
 
 	static Result floydwarshall(const Graph &graph);
 
diff --git a/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp b/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp
index 99c053b635615c06db19c3a403965c05b1d74d33..69633bbc113193f39a4241347b114bc7b72cb6ee 100644
--- a/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp
+++ b/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp
@@ -15,7 +15,7 @@ namespace sort {
 
 static TopologicalSort::Result topsort_impl(const DirectedGraph &graph) {
 	TopologicalSort::Result s;
-	std::unordered_map<Node, bool> visited;
+	ext::unordered_map<Node, bool> visited;
 
 	for (const Node &n : graph.getNodes()) {
 		traverse::Dfs::dfs(graph, n, [&s, &visited](const Node &node, const Node&, int, int) {
diff --git a/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp b/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp
index 667646db4aa75b1a4d9528391d1e1beac12f2dac..cddcd4fa57c0fb3d463ccd9f046598b8e015da1c 100644
--- a/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp
+++ b/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp
@@ -110,8 +110,8 @@ static AdjacencyListDirectedGraph edmonds_impl( const DirectedGraph & graph )
 	// this algorithm works on number identification of nodes and edges
 	ext::vector<Node> id2node( nodeCnt );
 	ext::vector<DirectedEdge> id2edge( edgeCnt );
-	std::unordered_map<Node,unsigned> node2id;
-	std::unordered_map<DirectedEdge,unsigned> edge2id;
+	ext::unordered_map<Node,unsigned> node2id;
+	ext::unordered_map<DirectedEdge,unsigned> edge2id;
 	unsigned id = 0;
 	for (const Node & node : graph.getNodes()) {
 		id2node[ id ] = node;
diff --git a/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp b/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp
index 4fa988c24c0220171d32fe1394a62e5f70e65800..838b1184b8b44ea22043fea06f2e27fb15cdc49e 100644
--- a/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp
+++ b/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp
@@ -40,7 +40,7 @@ public:
 	int value;
 };
 
-typedef std::unordered_map<Node, std::unordered_map<Node, int>> weights_t;
+typedef ext::unordered_map<Node, ext::unordered_map<Node, int>> weights_t;
 
 static weights_t weights(const UndirectedGraph &g) {
 	int val;
@@ -68,8 +68,8 @@ static AdjacencyListUndirectedGraph jarnikprim_impl(const UndirectedGraph &graph
 	AdjacencyListUndirectedGraph res;              // spanning tree
 	ext::set<Value> q;                // priority queue
 	weights_t w = weights(graph);     // minimum weights
-	std::unordered_map<Node, int> d;  // distances
-	std::unordered_map<Node, Node> p; // predecessors
+	ext::unordered_map<Node, int> d;  // distances
+	ext::unordered_map<Node, Node> p; // predecessors
 
 	for (const Node &n : graph.getNodes()) {
 		int value = n == start ? 0 : std::numeric_limits<int>::max();
diff --git a/alib2algo_experimental/src/graph/traverse/Bfs.cpp b/alib2algo_experimental/src/graph/traverse/Bfs.cpp
index 51989f509ec196446493cea214d21594a1f9b814..3ae4c0e37e0f15620317f6b374abe41d9cdb0225 100644
--- a/alib2algo_experimental/src/graph/traverse/Bfs.cpp
+++ b/alib2algo_experimental/src/graph/traverse/Bfs.cpp
@@ -17,7 +17,7 @@ namespace traverse {
 
 template <typename T>
 static void bfs_impl(const T &graph, const Node &start, Bfs::Function func) {
-	std::unordered_map<Node, bool> visited;
+	ext::unordered_map<Node, bool> visited;
 	std::queue<Node> q;
 
 	q.push(start);
@@ -41,8 +41,8 @@ static void bfs_impl(const T &graph, const Node &start, Bfs::Function func) {
 
 template <typename T>
 static void bfs2_impl(const T &graph, const Node &start, Bfs::FunctionExt func) {
-	std::unordered_map<Node, int> distances;
-	std::unordered_map<Node, Node> predecessors;
+	ext::unordered_map<Node, int> distances;
+	ext::unordered_map<Node, Node> predecessors;
 	std::queue<Node> q;
 
 	q.push(start);
diff --git a/alib2algo_experimental/src/graph/traverse/Dfs.cpp b/alib2algo_experimental/src/graph/traverse/Dfs.cpp
index eafa43dda3aaaefc137439a428dc2213292ea18b..d0f892f6c42cc14aa8d04e6224ff522f1fd971da 100644
--- a/alib2algo_experimental/src/graph/traverse/Dfs.cpp
+++ b/alib2algo_experimental/src/graph/traverse/Dfs.cpp
@@ -17,7 +17,7 @@ namespace traverse {
 
 template <typename T>
 static void dfs_impl(const T &graph, const Node &start, Dfs::Function func) {
-	std::unordered_map<Node, bool> visited;
+	ext::unordered_map<Node, bool> visited;
 	std::stack<Node> s;
 
 	s.push(start);
@@ -40,7 +40,7 @@ static void dfs_impl(const T &graph, const Node &start, Dfs::Function func) {
 }
 
 template <typename T>
-static bool dfs2_impl(const T &graph, const Node &n, const Node &p, std::unordered_map<Node, bool> &visited, int &time, Dfs::FunctionExt func) {
+static bool dfs2_impl(const T &graph, const Node &n, const Node &p, ext::unordered_map<Node, bool> &visited, int &time, Dfs::FunctionExt func) {
 	int opened = ++time;
 	visited[n] = true;
 
@@ -71,7 +71,7 @@ auto DfsDirectedGraph1 = registration::OverloadRegister < alib::SingleDispatch<D
 
 void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::FunctionExt func) {
 	int time = 0;
-	std::unordered_map<Node, bool> visited;
+	ext::unordered_map<Node, bool> visited;
 	dfs2_impl(graph, start, start, visited, time, func);
 }
 
@@ -85,7 +85,7 @@ auto DfsUndirectedGraph1 = registration::OverloadRegister < alib::SingleDispatch
 
 void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::FunctionExt func) {
 	int time = 0;
-	std::unordered_map<Node, bool> visited;
+	ext::unordered_map<Node, bool> visited;
 	dfs2_impl(graph, start, start, visited, time, func);
 }
 
diff --git a/alib2algo_experimental/test-src/graph/TestUtils.cpp b/alib2algo_experimental/test-src/graph/TestUtils.cpp
index b03e442a58207ad95960c876f9c6e77a47eefe71..be562038d6f310e8af9996ab195d98a1448cf9f5 100644
--- a/alib2algo_experimental/test-src/graph/TestUtils.cpp
+++ b/alib2algo_experimental/test-src/graph/TestUtils.cpp
@@ -5,8 +5,8 @@
 void printGraphData( const graph::DirectedGraph & graph )
 {
 	unsigned int id;
-	std::unordered_map<graph::Node, unsigned int> nodes;
-	std::unordered_map<graph::DirectedEdge, unsigned int> edges;
+	ext::unordered_map<graph::Node, unsigned int> nodes;
+	ext::unordered_map<graph::DirectedEdge, unsigned int> edges;
 	id = 0;
 	for (const graph::Node & node : graph.getNodes()) {
 		nodes[ node ] = id;
diff --git a/alib2algo_experimental/test-src/graph/isomorphism/HopcroftTest.cpp b/alib2algo_experimental/test-src/graph/isomorphism/HopcroftTest.cpp
index c6cbd7a0a4c48a9a8b61c4ca648b021d71a786f6..c33c7cbb968d03db1791bb4c29f50f12979b5571 100644
--- a/alib2algo_experimental/test-src/graph/isomorphism/HopcroftTest.cpp
+++ b/alib2algo_experimental/test-src/graph/isomorphism/HopcroftTest.cpp
@@ -92,7 +92,7 @@ static graph::AdjacencyListUndirectedGraph getGraph2()
 	ug1.addEdge(graph::UndirectedEdge(n5, n3));
 	ug1.addEdge(graph::UndirectedEdge(n5, n2));
 
-	std::unordered_map<graph::Node, ext::vector<graph::Node>> embedding;
+	ext::unordered_map<graph::Node, ext::vector<graph::Node>> embedding;
 	embedding[n1] = { n4, n2, n2, n2, n2, n3, n4 };
 	embedding[n2] = { n1, n1, n5, n3, n3, n1, n1 };
 	embedding[n3] = { n4, n1, n2, n2, n5 };
@@ -132,7 +132,7 @@ static graph::AdjacencyListUndirectedGraph getGraph2_I()
 	ug1.addEdge(graph::UndirectedEdge(n1, n2, "multi-edge1"));
 	ug1.addEdge(graph::UndirectedEdge(n5, n2));
 
-	std::unordered_map<graph::Node, ext::vector<graph::Node>> embedding;
+	ext::unordered_map<graph::Node, ext::vector<graph::Node>> embedding;
 	embedding[n1] = { n3, n4, n4, n2, n2, n2, n2 };
 	embedding[n2] = { n5, n3, n3, n1, n1, n1, n1 };
 	embedding[n3] = { n5, n4, n1, n2, n2 };
diff --git a/alib2algo_experimental/test-src/graph/spanningtree/EdmondsTest.cpp b/alib2algo_experimental/test-src/graph/spanningtree/EdmondsTest.cpp
index f35ea41e79ae32c226bd8ea10884e107f6fe2389..427f3cd56c06ab7b8d38bf81ed0b54a77aea7ef3 100644
--- a/alib2algo_experimental/test-src/graph/spanningtree/EdmondsTest.cpp
+++ b/alib2algo_experimental/test-src/graph/spanningtree/EdmondsTest.cpp
@@ -145,8 +145,8 @@ void testGraph( unsigned graphID, const Type1 * graphDef, const Type2 * spanTree
 {
 	ext::vector<graph::Node> id2node( graphDef->nodeCnt );
 	ext::vector<graph::DirectedEdge> id2edge( graphDef->edgeCnt );
-	std::unordered_map<graph::Node,unsigned> node2id;
-	std::unordered_map<graph::DirectedEdge,unsigned> edge2id;
+	ext::unordered_map<graph::Node,unsigned> node2id;
+	ext::unordered_map<graph::DirectedEdge,unsigned> edge2id;
 
 	graph::AdjacencyListDirectedGraph graph;
 
diff --git a/alib2algo_experimental/test-src/graph/spanningtree/KruskalTest.cpp b/alib2algo_experimental/test-src/graph/spanningtree/KruskalTest.cpp
index 736cd78fccc6bae3f16bf607602e0375307da2e4..fe92b94a89560a029db319f47a3f337a36934ef3 100644
--- a/alib2algo_experimental/test-src/graph/spanningtree/KruskalTest.cpp
+++ b/alib2algo_experimental/test-src/graph/spanningtree/KruskalTest.cpp
@@ -113,8 +113,8 @@ void testGraph( unsigned graphID, const Type1 * graphDef, const Type2 * spanTree
 {
 	ext::vector<graph::Node> id2node( graphDef->nodeCnt );
 	ext::vector<graph::UndirectedEdge> id2edge( graphDef->edgeCnt );
-	std::unordered_map<graph::Node,unsigned> node2id;
-	std::unordered_map<graph::UndirectedEdge,unsigned> edge2id;
+	ext::unordered_map<graph::Node,unsigned> node2id;
+	ext::unordered_map<graph::UndirectedEdge,unsigned> edge2id;
 
 	graph::AdjacencyListUndirectedGraph graph;
 
diff --git a/alib2algo_experimental/test-src/graph/traverse/BfsTest.cpp b/alib2algo_experimental/test-src/graph/traverse/BfsTest.cpp
index c50af22ea2b00f589abd792adfea27c470bbf6ac..238e6e3ec62ab75467b7598ab85d733fdca58118 100644
--- a/alib2algo_experimental/test-src/graph/traverse/BfsTest.cpp
+++ b/alib2algo_experimental/test-src/graph/traverse/BfsTest.cpp
@@ -192,8 +192,8 @@ void GraphBfsTest::testDisconnectedGraph()
 void GraphBfsTest::testBfs2()
 {
 	// Common
-	std::unordered_map<graph::Node, int> distances;
-	std::unordered_map<graph::Node, graph::Node> predecessors;
+	ext::unordered_map<graph::Node, int> distances;
+	ext::unordered_map<graph::Node, graph::Node> predecessors;
 
 	graph::Node n1("n1");
 	graph::Node n2("n2");
diff --git a/alib2algo_experimental/test-src/graph/traverse/DfsTest.cpp b/alib2algo_experimental/test-src/graph/traverse/DfsTest.cpp
index 0fa087b81a02ba2432a3be6734275937a7217d6b..2ea20a3d3e4886df73d6ddb50934bff5e183ea34 100644
--- a/alib2algo_experimental/test-src/graph/traverse/DfsTest.cpp
+++ b/alib2algo_experimental/test-src/graph/traverse/DfsTest.cpp
@@ -191,9 +191,9 @@ void GraphDfsTest::testDfs2()
 {
 	// Common
 	int counter;
-	std::unordered_map<graph::Node, int> opened;
-	std::unordered_map<graph::Node, int> closed;
-	std::unordered_map<graph::Node, graph::Node> predecessors;
+	ext::unordered_map<graph::Node, int> opened;
+	ext::unordered_map<graph::Node, int> closed;
+	ext::unordered_map<graph::Node, graph::Node> predecessors;
 
 	graph::Node n1("n1");
 	graph::Node n2("n2");
diff --git a/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.h b/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.h
index 065c584e0247172fd349b6d341538575f45b2aae..f8842e2237880044787c5df2013c71e9344a01b7 100644
--- a/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.h
+++ b/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.h
@@ -34,8 +34,8 @@ class UndirectedGraph;
  */
 
 class AdjacencyListDirectedGraph final : public DirectedGraph {
-	std::unordered_map< Node, ext::list< Node > > succ;
-	std::unordered_map< Node, ext::list< Node > > pred;
+	ext::unordered_map< Node, ext::list< Node > > succ;
+	ext::unordered_map< Node, ext::list< Node > > pred;
 	ext::set< DirectedEdge > edges;
 
 public:
diff --git a/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.h b/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.h
index 8d7d8ca32144df548e898f82df16c2cedf9d4b79..049b74d7fd1d90812bbe6be9c09bc1962c5e94ba 100644
--- a/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.h
+++ b/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.h
@@ -38,7 +38,7 @@ class UndirectedGraph;
  */
 
 class AdjacencyMatrixDirectedGraph final : public DirectedGraph {
-	std::unordered_map<Node, std::unordered_map<Node, int>> adj;
+	ext::unordered_map<Node, ext::unordered_map<Node, int>> adj;
 	ext::set<DirectedEdge> edges;
 
 public:
diff --git a/alib2data_experimental/src/graph/directed/DirectedGraph.cpp b/alib2data_experimental/src/graph/directed/DirectedGraph.cpp
index e9f72d6bf89147734f6f1d68933ee21032dde1b7..9c4b2255f9f0861f50c8bdc3eab3a236db7e8c2b 100644
--- a/alib2data_experimental/src/graph/directed/DirectedGraph.cpp
+++ b/alib2data_experimental/src/graph/directed/DirectedGraph.cpp
@@ -145,12 +145,12 @@ void DirectedGraph::setEdgeValue( const DirectedEdge & edge, int value )
 	edgeValues.insert( {edge, value} );
 }
 
-std::unordered_map< Node, ext::vector< Node > > DirectedGraph::getEmbedding() const
+ext::unordered_map< Node, ext::vector< Node > > DirectedGraph::getEmbedding() const
 {
 	return m_embedding;
 }
 
-void DirectedGraph::setEmbedding( const std::unordered_map< Node, ext::vector< Node > > embedding )
+void DirectedGraph::setEmbedding( const ext::unordered_map< Node, ext::vector< Node > > embedding )
 {
 	this->m_embedding = embedding;
 }
diff --git a/alib2data_experimental/src/graph/directed/DirectedGraph.h b/alib2data_experimental/src/graph/directed/DirectedGraph.h
index 0931bb936115e4e73258b08850fdfdf0073836cc..84f09a46b38528ee66845ec7616c4ac6cb2067d8 100644
--- a/alib2data_experimental/src/graph/directed/DirectedGraph.h
+++ b/alib2data_experimental/src/graph/directed/DirectedGraph.h
@@ -25,9 +25,9 @@ namespace graph {
 class UndirectedGraph;
 
 class DirectedGraph : public GraphBase {
-	std::unordered_map< Node, int > nodeValues;
-	std::unordered_map< DirectedEdge, int > edgeValues;
-	std::unordered_map< Node, ext::vector< Node > > m_embedding;
+	ext::unordered_map< Node, int > nodeValues;
+	ext::unordered_map< DirectedEdge, int > edgeValues;
+	ext::unordered_map< Node, ext::vector< Node > > m_embedding;
 
 public:
 	DirectedGraph();
@@ -88,8 +88,8 @@ public:
 	int getEdgeValue( const DirectedEdge & edge ) const;
 	void setEdgeValue( const DirectedEdge & edge, int value );
 
-	std::unordered_map< Node, ext::vector< Node > > getEmbedding() const;
-	void setEmbedding( const std::unordered_map< Node, ext::vector< Node > > embedding );
+	ext::unordered_map< Node, ext::vector< Node > > getEmbedding() const;
+	void setEmbedding( const ext::unordered_map< Node, ext::vector< Node > > embedding );
 
 
 	// commmon methods
diff --git a/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.h b/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.h
index a0a5daf458865bc671170ec26c393ef58e6eb1c0..3e36593d6527a322a5a3dbe1c884b33567b4c267 100644
--- a/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.h
+++ b/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.h
@@ -37,7 +37,7 @@ class DirectedGraph;
  */
 
 class AdjacencyListUndirectedGraph final : public UndirectedGraph {
-	std::unordered_map< Node, ext::list< Node > > adj;
+	ext::unordered_map< Node, ext::list< Node > > adj;
 	ext::set< UndirectedEdge > edges;
 
 public:
diff --git a/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h b/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h
index 254d921ae58023abf5723b1c850cdd9676ded914..7501698c1dfec24cbc7676f4006801cc4cf446da 100644
--- a/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h
+++ b/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h
@@ -40,7 +40,7 @@ class DirectedGraph;
  */
 
 class AdjacencyMatrixUndirectedGraph final : public UndirectedGraph {
-	std::unordered_map< Node, std::unordered_map< Node, int > > adj;
+	ext::unordered_map< Node, ext::unordered_map< Node, int > > adj;
 	ext::set< UndirectedEdge > edges;
 
 public:
diff --git a/alib2data_experimental/src/graph/undirected/UndirectedGraph.cpp b/alib2data_experimental/src/graph/undirected/UndirectedGraph.cpp
index 6e486b1defd169c2d7c7f3d381c6126e8394b3ee..4386df3b79fc6e48301e94070bb1dee402d6804d 100644
--- a/alib2data_experimental/src/graph/undirected/UndirectedGraph.cpp
+++ b/alib2data_experimental/src/graph/undirected/UndirectedGraph.cpp
@@ -144,12 +144,12 @@ void UndirectedGraph::setEdgeValue( const UndirectedEdge & edge, int value )
 	edgeValues.insert( {edge, value} );
 }
 
-std::unordered_map< Node, ext::vector< Node > > UndirectedGraph::getEmbedding() const
+ext::unordered_map< Node, ext::vector< Node > > UndirectedGraph::getEmbedding() const
 {
 	return m_embedding;
 }
 
-void UndirectedGraph::setEmbedding( const std::unordered_map< Node, ext::vector< Node > > embedding )
+void UndirectedGraph::setEmbedding( const ext::unordered_map< Node, ext::vector< Node > > embedding )
 {
 	this->m_embedding = embedding;
 }
diff --git a/alib2data_experimental/src/graph/undirected/UndirectedGraph.h b/alib2data_experimental/src/graph/undirected/UndirectedGraph.h
index 0a0d9cd35b5ca211f300f984dcea3d5c7035f127..53f9ff09db2c1e47c5541dd3d9e7e6aed26aae86 100644
--- a/alib2data_experimental/src/graph/undirected/UndirectedGraph.h
+++ b/alib2data_experimental/src/graph/undirected/UndirectedGraph.h
@@ -25,9 +25,9 @@ namespace graph {
 class DirectedGraph;
 
 class UndirectedGraph : public GraphBase {
-	std::unordered_map< Node, int > nodeValues;
-	std::unordered_map< UndirectedEdge, int > edgeValues;
-	std::unordered_map< Node, ext::vector< Node > > m_embedding;
+	ext::unordered_map< Node, int > nodeValues;
+	ext::unordered_map< UndirectedEdge, int > edgeValues;
+	ext::unordered_map< Node, ext::vector< Node > > m_embedding;
 
 public:
 	UndirectedGraph();
@@ -80,8 +80,8 @@ public:
 	int getEdgeValue( const UndirectedEdge & edge ) const;
 	void setEdgeValue( const UndirectedEdge & edge, int value );
 
-	std::unordered_map< Node, ext::vector < Node > > getEmbedding() const;
-	void setEmbedding( const std::unordered_map< Node, ext::vector< Node > > embedding );
+	ext::unordered_map< Node, ext::vector < Node > > getEmbedding() const;
+	void setEmbedding( const ext::unordered_map< Node, ext::vector< Node > > embedding );
 
 
 	// common methods
diff --git a/alib2std/src/extensions/unordered_map.hpp b/alib2std/src/extensions/unordered_map.hpp
index 6fa30c9b2785e2f0bc01ef679dd60959aeb8c6de..d6ae42b28333a40670d6f4da968856a697a3c290 100644
--- a/alib2std/src/extensions/unordered_map.hpp
+++ b/alib2std/src/extensions/unordered_map.hpp
@@ -15,10 +15,42 @@
 
 #include "compare.hpp"
 
-namespace std {
+namespace ext {
+
+template < class T, class R, class Hash = std::hash < T >, class KeyEqual = std::equal_to < T >, class Alloc = std::allocator < std::pair < const T, R > > >
+class unordered_map : public std::unordered_map < T, R, Hash, KeyEqual, Alloc > {
+public:
+#ifdef __clang__
+	using std::unordered_map < T, R, Hash, KeyEqual, Alloc >::unordered_map;
+	using std::unordered_map < T, R, Hash, KeyEqual, Alloc >::operator =;
+#else
+	unordered_map ( ) noexcept : std::unordered_map < T, R, Hash, KeyEqual, Alloc > ( ) {
+	}
+
+	unordered_map ( const unordered_map & other ) noexcept : std::unordered_map < T, R, Hash, KeyEqual, Alloc > ( other ) {
+	}
+
+	unordered_map ( unordered_map && other ) noexcept : std::unordered_map < T, R, Hash, KeyEqual, Alloc > ( std::move ( other ) ) {
+	}
+
+	using std::unordered_map < T, R, Hash, KeyEqual, Alloc >::unordered_map;
+
+	unordered_map & operator = ( unordered_map && other ) noexcept {
+		static_cast < std::unordered_map < T, R, Hash, KeyEqual, Alloc > & > ( * this ) = std::move ( other );
+		return * this;
+	}
+
+	unordered_map & operator = ( const unordered_map & other ) noexcept {
+		static_cast < std::unordered_map < T, R, Hash, KeyEqual, Alloc > & > ( * this ) = other;
+		return * this;
+	}
+
+	using std::unordered_map < T, R, Hash, KeyEqual, Alloc >::operator =;
+#endif
+};
 
 template< class T, class R, class ... Ts >
-std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R, Ts ... >& map) {
+std::ostream& operator<<(std::ostream& out, const ext::unordered_map<T, R, Ts ... >& map) {
 	out << "{";
 
 	bool first = true;
@@ -32,13 +64,9 @@ std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R, Ts ..
 	return out;
 }
 
-} /* namespace std */
-
-namespace ext {
-
 template<class T, class R, class ... Ts>
-struct compare<std::unordered_map<T, R, Ts ...>> {
-	int operator()(const std::unordered_map<T, R, Ts ...>& first, const std::unordered_map<T, R, Ts ...>& second) const {
+struct compare<ext::unordered_map<T, R, Ts ...>> {
+	int operator()(const ext::unordered_map<T, R, Ts ...>& first, const ext::unordered_map<T, R, Ts ...>& second) const {
 		if(first.size() < second.size()) return -1;
 		if(first.size() > second.size()) return 1;
 
@@ -54,7 +82,7 @@ struct compare<std::unordered_map<T, R, Ts ...>> {
 };
 
 template < class T, class R >
-std::string to_string ( const std::unordered_map < T, R > & value ) {
+std::string to_string ( const ext::unordered_map < T, R > & value ) {
 	std::stringstream ss;
 	ss << value;
 	return ss.str();