diff --git a/alib2algo/src/graph/shortestpath/BellmanFord.cpp b/alib2algo/src/graph/shortestpath/BellmanFord.cpp
index 8f16e2312253bedae0353f69e6e4eb3056a97cdc..85c3f35fc797ca656e78852f6b7382742aa7f1b3 100644
--- a/alib2algo/src/graph/shortestpath/BellmanFord.cpp
+++ b/alib2algo/src/graph/shortestpath/BellmanFord.cpp
@@ -104,8 +104,7 @@ static BellmanFord::Result bellmanford_impl(const UndirectedGraph &graph, const
 
 BellmanFord::Result BellmanFord::bellmanford(const Graph &graph, const Node &start)
 {
-	Data data;
-	data.start = start;
+	Data data = {start, BellmanFord::Result {}};
 	graph.getData().Accept(static_cast<void*>(&data), BELLMAN_FORD);
 	return data.out;
 }
diff --git a/alib2algo/src/graph/shortestpath/Dijkstra.cpp b/alib2algo/src/graph/shortestpath/Dijkstra.cpp
index 098b5abfd7ef1f96ed68623e1157c4d64b77cbac..bb1ef7dc86737cb945b4a859186f8013f16fc25e 100644
--- a/alib2algo/src/graph/shortestpath/Dijkstra.cpp
+++ b/alib2algo/src/graph/shortestpath/Dijkstra.cpp
@@ -120,8 +120,7 @@ static Dijkstra::Result dijkstra_impl(const T &graph, const Node &start)
 
 Dijkstra::Result Dijkstra::dijkstra(const Graph &graph, const Node &start)
 {
-	Data data;
-	data.start = start;
+	Data data = {start, Dijkstra::Result {}};
 	graph.getData().Accept(static_cast<void*>(&data), DIJKSTRA);
 	return data.out;
 }
diff --git a/alib2algo/src/graph/spanningtree/JarnikPrim.cpp b/alib2algo/src/graph/spanningtree/JarnikPrim.cpp
index 61835e6a75c6eea197cff1c62e22eefb35224f0f..28f55bfbbe5c6b13763ba5ea54762ef02b02df59 100644
--- a/alib2algo/src/graph/spanningtree/JarnikPrim.cpp
+++ b/alib2algo/src/graph/spanningtree/JarnikPrim.cpp
@@ -88,7 +88,10 @@ static UndirectedGraph jarnikprim_impl(const UndirectedGraph &graph, const Node
 			int &dist = d[v];
 			if (q.find(Value(v, dist)) != q.end() && w[u][v] < dist) {
 				q.erase(q.find(Value(v, dist)));
-				p[v] = u;
+
+				if(p.find(v) == p.end()) p.insert(std::make_pair(v, u));
+				else p.find(v)->second = u;
+
 				dist = w[u][v];
 				q.insert(Value(v, dist));
 			}
diff --git a/alib2algo/src/graph/traverse/Bfs.cpp b/alib2algo/src/graph/traverse/Bfs.cpp
index e951bd4d76474b575a845e1a7b5de646735125ff..19e60188d13ac79303fea67ff733351b2e0e6ec3 100644
--- a/alib2algo/src/graph/traverse/Bfs.cpp
+++ b/alib2algo/src/graph/traverse/Bfs.cpp
@@ -50,18 +50,19 @@ static void bfs2_impl(const T &graph, const Node &start, Bfs::FunctionExt func)
 
 	q.push(start);
 	distances[start] = 0;
+	predecessors.insert(std::make_pair(start, start));
 
 	while (!q.empty()) {
 		Node n = q.front(); q.pop();
 
-		if (!func(n, predecessors[n], distances[n])) {
+		if (!func(n, predecessors.find(n)->second, distances.find(n)->second)) {
 			return;
 		}
 
 		for (const Node &e : graph.neighbors(n)) {
 			if (distances.find(e) == distances.end()) {
 				distances[e] = distances.at(n) + 1;
-				predecessors[e] = n;
+				predecessors.insert(std::make_pair(e, n));
 				q.push(e);
 			}
 		}
diff --git a/alib2algo/src/graph/traverse/Dfs.cpp b/alib2algo/src/graph/traverse/Dfs.cpp
index 1bef737f5c6fddcf1d87397beed76a1a28029127..2aa7fe3100ddcdc338b98495ffcefd10203ecce4 100644
--- a/alib2algo/src/graph/traverse/Dfs.cpp
+++ b/alib2algo/src/graph/traverse/Dfs.cpp
@@ -79,7 +79,7 @@ void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::FunctionExt fu
 {
 	int time = 0;
 	std::unordered_map<Node, bool> visited;
-	dfs2_impl(graph, start, Node(), visited, time, func);
+	dfs2_impl(graph, start, start, visited, time, func);
 }
 
 void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::Function func)
@@ -91,7 +91,7 @@ void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::FunctionExt
 {
 	int time = 0;
 	std::unordered_map<Node, bool> visited;
-	dfs2_impl(graph, start, Node(), visited, time, func);
+	dfs2_impl(graph, start, start, visited, time, func);
 }
 
 void Dfs::Visit(void *data, const DirectedGraph &graph) const
diff --git a/alib2algo/test-src/graph/spanningtree/JarnikPrimTest.cpp b/alib2algo/test-src/graph/spanningtree/JarnikPrimTest.cpp
index e1378e27639b24749e0c2289d8b111927b304863..26120004d8ccc8048041871432140a114bed3fbe 100644
--- a/alib2algo/test-src/graph/spanningtree/JarnikPrimTest.cpp
+++ b/alib2algo/test-src/graph/spanningtree/JarnikPrimTest.cpp
@@ -38,6 +38,9 @@ void GraphJarnikPrimTest::testSpanningTree1()
 	expected.addEdge(graph::UndirectedEdge(n4, n6), 4);
 	expected.addEdge(graph::UndirectedEdge(n6, n3), 2);
 
+	std::cout << expected << std::endl;
+	std::cout << res << std::endl;
+
 	CPPUNIT_ASSERT(expected == res);
 }
 
diff --git a/alib2algo/test-src/graph/traverse/BfsTest.cpp b/alib2algo/test-src/graph/traverse/BfsTest.cpp
index a1388e07372e0af370055440d8d28ab801f1cb58..4594c57fad4e3d397747f00d3451ae5e5f367544 100644
--- a/alib2algo/test-src/graph/traverse/BfsTest.cpp
+++ b/alib2algo/test-src/graph/traverse/BfsTest.cpp
@@ -184,7 +184,7 @@ void GraphBfsTest::testBfs2()
 
 	graph::traverse::Bfs::bfs(dg, n1, [&](const graph::Node &n, const graph::Node &p, int d) {
 		distances[n] = d;
-		predecessors[n] = p;
+		predecessors.insert(std::make_pair(n, p));
 		return true;
 	});
 
@@ -194,11 +194,11 @@ void GraphBfsTest::testBfs2()
 	CPPUNIT_ASSERT_EQUAL(1, distances[n4]);
 	CPPUNIT_ASSERT_EQUAL(2, distances[n5]);
 
-	CPPUNIT_ASSERT_EQUAL(graph::Node(), predecessors[n1]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n2]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n3]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n4]);
-	CPPUNIT_ASSERT_EQUAL(n2, predecessors[n5]);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n1)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n2)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n3)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n4)->second);
+	CPPUNIT_ASSERT_EQUAL(n2, predecessors.find(n5)->second);
 
 	// Undirected
 	graph::UndirectedGraph ug;
@@ -212,7 +212,7 @@ void GraphBfsTest::testBfs2()
 
 	graph::traverse::Bfs::bfs(ug, n1, [&](const graph::Node &n, const graph::Node &p, int d) {
 		distances[n] = d;
-		predecessors[n] = p;
+		predecessors.insert(std::make_pair(n, p));
 		return true;
 	});
 
@@ -222,9 +222,9 @@ void GraphBfsTest::testBfs2()
 	CPPUNIT_ASSERT_EQUAL(1, distances[n4]);
 	CPPUNIT_ASSERT_EQUAL(2, distances[n5]);
 
-	CPPUNIT_ASSERT_EQUAL(graph::Node(), predecessors[n1]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n2]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n3]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n4]);
-	CPPUNIT_ASSERT_EQUAL(n2, predecessors[n5]);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n1)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n2)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n3)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n4)->second);
+	CPPUNIT_ASSERT_EQUAL(n2, predecessors.find(n5)->second);
 }
diff --git a/alib2algo/test-src/graph/traverse/DfsTest.cpp b/alib2algo/test-src/graph/traverse/DfsTest.cpp
index ce5f5553e9c4d9f3f65a431a1c7fe27d9e93aa59..90db9b35d90efb47dfa80e585d7e804833d869bb 100644
--- a/alib2algo/test-src/graph/traverse/DfsTest.cpp
+++ b/alib2algo/test-src/graph/traverse/DfsTest.cpp
@@ -188,18 +188,18 @@ void GraphDfsTest::testDfs2()
 		counter++;
 		opened[n] = o;
 		closed[n] = c;
-		predecessors[n] = p;
+		predecessors.insert(std::make_pair(n, p));
 		return true;
 	});
 
 	CPPUNIT_ASSERT_EQUAL(5, counter);
 	CPPUNIT_ASSERT_EQUAL(4, closed[n5]);
 
-	CPPUNIT_ASSERT_EQUAL(graph::Node(), predecessors[n1]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n2]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n3]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n4]);
-	CPPUNIT_ASSERT_EQUAL(n2, predecessors[n5]);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n1)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n2)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n3)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n4)->second);
+	CPPUNIT_ASSERT_EQUAL(n2, predecessors.find(n5)->second);
 
 	// Undirected
 	graph::UndirectedGraph ug;
@@ -217,17 +217,17 @@ void GraphDfsTest::testDfs2()
 		counter++;
 		opened[n] = o;
 		closed[n] = c;
-		predecessors[n] = p;
+		predecessors.insert(std::make_pair(n, p));
 		return true;
 	});
 
 	CPPUNIT_ASSERT_EQUAL(5, counter);
 	CPPUNIT_ASSERT_EQUAL(4, closed[n5]);
 
-	CPPUNIT_ASSERT_EQUAL(graph::Node(), predecessors[n1]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n2]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n3]);
-	CPPUNIT_ASSERT_EQUAL(n1, predecessors[n4]);
-	CPPUNIT_ASSERT_EQUAL(n2, predecessors[n5]);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n1)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n2)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n3)->second);
+	CPPUNIT_ASSERT_EQUAL(n1, predecessors.find(n4)->second);
+	CPPUNIT_ASSERT_EQUAL(n2, predecessors.find(n5)->second);
 }
 
diff --git a/alib2data/src/graph/common/Node.cpp b/alib2data/src/graph/common/Node.cpp
index 90efd477ec0e0b0e862d9d97da4030c23e7a1c6b..caae93e534472457a42dfbe14acb146dad4d24d5 100644
--- a/alib2data/src/graph/common/Node.cpp
+++ b/alib2data/src/graph/common/Node.cpp
@@ -12,17 +12,7 @@
 
 namespace graph {
 
-Node::Node()
-	: name(label::labelFrom(std::string()))
-{
-}
-
-Node::Node(const label::Label &name)
-	: name(name)
-{
-}
-
-Node::Node(label::Label &&name)
+Node::Node(label::Label name)
 	: name(std::move(name))
 {
 }
diff --git a/alib2data/src/graph/common/Node.h b/alib2data/src/graph/common/Node.h
index c9a5ae748e59da6fd2485917c8de4ade2719e067..10621d68c934d5e0ab9de706b4ad0ce45b981ec1 100644
--- a/alib2data/src/graph/common/Node.h
+++ b/alib2data/src/graph/common/Node.h
@@ -9,9 +9,7 @@ namespace graph {
 class Node
 {
 public:
-	explicit Node();
-	explicit Node(const label::Label &name);
-	explicit Node(label::Label &&name);
+	explicit Node(label::Label name);
 	explicit Node(int number);
 	explicit Node(char character);
 	explicit Node(const std::string &name);
diff --git a/alib2data/src/graph/directed/DirectedEdge.cpp b/alib2data/src/graph/directed/DirectedEdge.cpp
index e80f06391c10f3bed0055cd40fbaacaa23619754..cfc57db294172bbded2ed09b960c7f7c1174e55b 100644
--- a/alib2data/src/graph/directed/DirectedEdge.cpp
+++ b/alib2data/src/graph/directed/DirectedEdge.cpp
@@ -6,83 +6,37 @@
  */
 
 #include "DirectedEdge.h"
+#include "../../label/ObjectLabel.h"
+#include "../../object/Void.h"
 
 #include <sstream>
 
 namespace graph {
 
-DirectedEdge::DirectedEdge()
-	: name(label::labelFrom('d'))
+DirectedEdge::DirectedEdge(Node from, Node to)
+	: DirectedEdge(std::move(from), std::move(to), label::labelFrom('d'))
 {
 }
 
-DirectedEdge::DirectedEdge(const Node &from, const Node &to)
-	: from(from)
-	, to(to)
-	, name(label::labelFrom('d'))
-{
-}
-
-DirectedEdge::DirectedEdge(Node &&from, Node &&to)
-	: from(std::move(from))
-	, to(std::move(to))
-	, name(label::labelFrom('d'))
-{
-}
-
-DirectedEdge::DirectedEdge(const Node &from, const Node &to, const label::Label &name)
-	: from(from)
-	, to(to)
-	, name(name)
-{
-}
-
-DirectedEdge::DirectedEdge(Node &&from, Node &&to, label::Label &&name)
+DirectedEdge::DirectedEdge(Node from, Node to, label::Label name)
 	: from(std::move(from))
 	, to(std::move(to))
 	, name(std::move(name))
 {
 }
 
-DirectedEdge::DirectedEdge(const Node &from, const Node &to, int number)
-	: from(from)
-	, to(to)
-	, name(label::labelFrom(number))
+DirectedEdge::DirectedEdge(Node from, Node to, int number)
+	: DirectedEdge(std::move(from), std::move(to), label::labelFrom(number))
 {
 }
 
-DirectedEdge::DirectedEdge(Node &&from, Node &&to, int number)
-	: from(std::move(from))
-	, to(std::move(to))
-	, name(label::labelFrom(number))
+DirectedEdge::DirectedEdge(Node from, Node to, char character)
+	: DirectedEdge(std::move(from), std::move(to), label::labelFrom(character))
 {
 }
 
-DirectedEdge::DirectedEdge(const Node &from, const Node &to, char character)
-	: from(from)
-	, to(to)
-	, name(label::labelFrom(character))
-{
-}
-
-DirectedEdge::DirectedEdge(Node &&from, Node &&to, char character)
-	: from(std::move(from))
-	, to(std::move(to))
-	, name(label::labelFrom(character))
-{
-}
-
-DirectedEdge::DirectedEdge(const Node &from, const Node &to, const std::string &name)
-	: from(from)
-	, to(to)
-	, name(label::labelFrom(name))
-{
-}
-
-DirectedEdge::DirectedEdge(Node &&from, Node &&to, const std::string &name)
-	: from(std::move(from))
-	, to(std::move(to))
-	, name(label::labelFrom(name))
+DirectedEdge::DirectedEdge(Node from, Node to, std::string name)
+	: DirectedEdge(std::move(from), std::move(to), label::labelFrom(name))
 {
 }
 
@@ -132,11 +86,6 @@ int DirectedEdge::compare(const DirectedEdge &other) const
 	return to.compare(other.to);
 }
 
-void DirectedEdge::operator>>(std::ostream &out) const
-{
-	dump(out);
-}
-
 DirectedEdge::operator std::string() const
 {
 	std::stringstream ss;
diff --git a/alib2data/src/graph/directed/DirectedEdge.h b/alib2data/src/graph/directed/DirectedEdge.h
index 9276ad1a0b079830add2c94ad11948a8a30e4c02..b8680dbb3d8614c7498c6026a7adc29e13471cbc 100644
--- a/alib2data/src/graph/directed/DirectedEdge.h
+++ b/alib2data/src/graph/directed/DirectedEdge.h
@@ -15,17 +15,11 @@ namespace graph {
 
 class DirectedEdge {
 public:
-	explicit DirectedEdge();
-	explicit DirectedEdge(const Node &from, const Node &to);
-	explicit DirectedEdge(Node &&from, Node &&to);
-	explicit DirectedEdge(const Node &from, const Node &to, const label::Label &name);
-	explicit DirectedEdge(Node &&from, Node &&to, label::Label &&name);
-	explicit DirectedEdge(const Node &from, const Node &to, int number);
-	explicit DirectedEdge(Node &&from, Node &&to, int number);
-	explicit DirectedEdge(const Node &from, const Node &to, char character);
-	explicit DirectedEdge(Node &&from, Node &&to, char character);
-	explicit DirectedEdge(const Node &from, const Node &to, const std::string &name);
-	explicit DirectedEdge(Node &&from, Node &&to, const std::string &name);
+	explicit DirectedEdge(Node from, Node to);
+	explicit DirectedEdge(Node from, Node to, label::Label name);
+	explicit DirectedEdge(Node from, Node to, int number);
+	explicit DirectedEdge(Node from, Node to, char character);
+	explicit DirectedEdge(Node from, Node to, std::string name);
 
 	DirectedEdge *clone() const;
 	DirectedEdge *plunder() &&;
@@ -39,8 +33,6 @@ public:
 	bool operator != (const DirectedEdge& other) const;
 	int compare(const DirectedEdge &other) const;
 
-	void operator>>(std::ostream &out) const;
-
 	explicit operator std::string() const;
 
 	friend std::ostream &operator<<(std::ostream &out, const DirectedEdge &node);
diff --git a/alib2data/src/graph/undirected/UndirectedEdge.cpp b/alib2data/src/graph/undirected/UndirectedEdge.cpp
index a0dc659196b0eeab20b03e0a0a99a2b8781146aa..c1d81e73bb2ab4e5ff90d29946d5b13d02bab840 100644
--- a/alib2data/src/graph/undirected/UndirectedEdge.cpp
+++ b/alib2data/src/graph/undirected/UndirectedEdge.cpp
@@ -6,83 +6,42 @@
  */
 
 #include "UndirectedEdge.h"
+#include "../../label/ObjectLabel.h"
+#include "../../object/Void.h"
 
 #include <sstream>
 
 namespace graph {
 
-UndirectedEdge::UndirectedEdge()
-	: name(label::labelFrom('u'))
+UndirectedEdge::UndirectedEdge(Node first, Node second)
+	: UndirectedEdge(std::move(first), std::move(second), label::labelFrom('u'))
 {
 }
 
-UndirectedEdge::UndirectedEdge(const Node &first, const Node &second)
-	: first(first)
-	, second(second)
-	, name(label::labelFrom('u'))
-{
-}
-
-UndirectedEdge::UndirectedEdge(Node &&first, Node &&second)
-	: first(std::move(first))
-	, second(std::move(second))
-	, name(label::labelFrom('u'))
-{
-}
-
-UndirectedEdge::UndirectedEdge(const Node &first, const Node &second, const label::Label &name)
-	: first(first)
-	, second(second)
-	, name(name)
-{
-}
-
-UndirectedEdge::UndirectedEdge(Node &&first, Node &&second, label::Label &&name)
+UndirectedEdge::UndirectedEdge(Node first, Node second, label::Label name)
 	: first(std::move(first))
 	, second(std::move(second))
 	, name(std::move(name))
 {
+	if(this->second < this->first) {
+		Node tmp = std::move(this->second);
+		this->second = std::move(this->first);
+		this->first = std::move(tmp);
+	}
 }
 
-UndirectedEdge::UndirectedEdge(const Node &first, const Node &second, int number)
-	: first(first)
-	, second(second)
-	, name(label::labelFrom(number))
-{
-}
-
-UndirectedEdge::UndirectedEdge(Node &&first, Node &&second, int number)
-	: first(std::move(first))
-	, second(std::move(second))
-	, name(label::labelFrom(number))
-{
-}
-
-UndirectedEdge::UndirectedEdge(const Node &first, const Node &second, char character)
-	: first(first)
-	, second(second)
-	, name(label::labelFrom(character))
+UndirectedEdge::UndirectedEdge(Node first, Node second, int number)
+	: UndirectedEdge(std::move(first), std::move(second), label::labelFrom(number))
 {
 }
 
-UndirectedEdge::UndirectedEdge(Node &&first, Node &&second, char character)
-	: first(std::move(first))
-	, second(std::move(second))
-	, name(label::labelFrom(character))
+UndirectedEdge::UndirectedEdge(Node first, Node second, char character)
+	: UndirectedEdge(std::move(first), std::move(second), label::labelFrom(character))
 {
 }
 
-UndirectedEdge::UndirectedEdge(const Node &first, const Node &second, const std::string &name)
-	: first(first)
-	, second(second)
-	, name(label::labelFrom(name))
-{
-}
-
-UndirectedEdge::UndirectedEdge(Node &&first, Node &&second, const std::string &name)
-	: first(std::move(first))
-	, second(std::move(second))
-	, name(label::labelFrom(name))
+UndirectedEdge::UndirectedEdge(Node first, Node second, std::string name)
+	: UndirectedEdge(std::move(first), std::move(second), label::labelFrom(name))
 {
 }
 
@@ -125,19 +84,11 @@ bool UndirectedEdge::operator != (const UndirectedEdge& other) const {
 
 int UndirectedEdge::compare(const UndirectedEdge &other) const
 {
-	auto a = sortedNodes();
-	auto b = other.sortedNodes();
-
 	int res = name.getData().compare(other.name.getData());
 	if (res != 0) return res;
-	res = a.first.compare(b.first);
+	res = first.compare(other.first);
 	if (res != 0) return res;
-	return a.second.compare(b.second);
-}
-
-void UndirectedEdge::operator>>(std::ostream &out) const
-{
-	dump(out);
+	return second.compare(other.second);
 }
 
 UndirectedEdge::operator std::string() const
@@ -155,23 +106,7 @@ std::ostream &operator<<(std::ostream &out, const UndirectedEdge &node)
 
 void UndirectedEdge::dump(std::ostream &os) const
 {
-	auto nodes = sortedNodes();
-	os << "(UndirectedEdge " << nodes.first << " -> ( " << name << " ) " << nodes.second << ")";
-}
-
-std::pair<Node, Node> UndirectedEdge::sortedNodes() const
-{
-	std::pair<Node, Node> out;
-
-	if (first < second) {
-		out.first = first;
-		out.second = second;
-	} else {
-		out.first = second;
-		out.second = first;
-	}
-
-	return out;
+	os << "(UndirectedEdge " << first << " -> ( " << name << " ) " << second << ")";
 }
 
 } // namespace graph
diff --git a/alib2data/src/graph/undirected/UndirectedEdge.h b/alib2data/src/graph/undirected/UndirectedEdge.h
index c92aebf5592130ec9d29e05c3ad6af7c3dd85bdf..255f7b30ace1be7e5ebde1b941e4855ca2209e43 100644
--- a/alib2data/src/graph/undirected/UndirectedEdge.h
+++ b/alib2data/src/graph/undirected/UndirectedEdge.h
@@ -15,17 +15,11 @@ namespace graph {
 
 class UndirectedEdge {
 public:
-	explicit UndirectedEdge();
-	explicit UndirectedEdge(const Node &first, const Node &second);
-	explicit UndirectedEdge(Node &&first, Node &&second);
-	explicit UndirectedEdge(const Node &first, const Node &second, const label::Label &name);
-	explicit UndirectedEdge(Node &&first, Node &&second, label::Label &&name);
-	explicit UndirectedEdge(const Node &first, const Node &second, int number);
-	explicit UndirectedEdge(Node &&first, Node &&second, int number);
-	explicit UndirectedEdge(const Node &first, const Node &second, char character);
-	explicit UndirectedEdge(Node &&first, Node &&second, char character);
-	explicit UndirectedEdge(const Node &first, const Node &second, const std::string &name);
-	explicit UndirectedEdge(Node &&first, Node &&second, const std::string &name);
+	explicit UndirectedEdge(Node first, Node second);
+	explicit UndirectedEdge(Node first, Node second, label::Label name);
+	explicit UndirectedEdge(Node first, Node second, int number);
+	explicit UndirectedEdge(Node first, Node second, char character);
+	explicit UndirectedEdge(Node first, Node second, std::string name);
 
 	UndirectedEdge *clone() const;
 	UndirectedEdge *plunder() &&;
@@ -39,15 +33,12 @@ public:
 	bool operator != (const UndirectedEdge& other) const;
 	int compare(const UndirectedEdge &other) const;
 
-	void operator>>(std::ostream &out) const;
-
 	explicit operator std::string() const;
 
 	friend std::ostream &operator<<(std::ostream &out, const UndirectedEdge &node);
 
 private:
 	void dump(std::ostream &os) const;
-	std::pair<Node, Node> sortedNodes() const;
 
 	Node first;
 	Node second;
diff --git a/alib2data/test-src/graph/GraphTest.cpp b/alib2data/test-src/graph/GraphTest.cpp
index 792acf135ca9a9d6062f7a1ac5ec79612a3854e3..c31c8b96d7d431218a30b62857253c4b35610654 100644
--- a/alib2data/test-src/graph/GraphTest.cpp
+++ b/alib2data/test-src/graph/GraphTest.cpp
@@ -231,6 +231,9 @@ void GraphTest::testStringParser_impl(graph::REPRESENTATION representation)
 	graph::Graph dg1(dg);
 	std::string tmp = alib::StringDataFactory::toString(dg1);
 	graph::Graph dg2 = alib::StringDataFactory::fromString<graph::Graph>(tmp);
+	std::string tmp2 = alib::StringDataFactory::toString(dg2);
+	std::cout << tmp << std::endl;
+	std::cout << tmp2 << std::endl;
 	CPPUNIT_ASSERT(dg1 == dg2);
 
 	dg.setEdgeValue(graph::DirectedEdge(n1, n2), 1);