diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py
index 93a407c60d09867e935d332b358997c157979ddf..eb91614a782299d94f9978d95792fe4f68b03e31 100644
--- a/src/Model/Network/Graph.py
+++ b/src/Model/Network/Graph.py
@@ -103,10 +103,29 @@ class Graph(object):
     def insert_node(self, node):
         return self._add_node(node)
 
+    def remove_node(self, node_name:str):
+        self._nodes = list(
+            filter(
+                lambda n: n.name != node_name,
+                self._nodes
+            )
+        )
+        self._status.modified()
+
     def create_node(self, x:float = 0.0, y:float = 0.0):
         node = self._create_node(x, y)
         return node
 
+    def _create_edge(self, n1:Node, n2:Node):
+        edge = self._edge_ctor(
+            self._edges_ids,
+            "", n1, n2,
+            status = self._status
+        )
+        self._edges_ids += 1
+        return edge
+
+
     def _add_edge(self, edge):
         # This edge already exists ?
         if any(filter(lambda e: (e.node1 == edge.node1 and
@@ -115,28 +134,19 @@ class Graph(object):
             return None
 
         self._edges.append(edge)
-        self._edges_ids += 1
 
         self._status.modified()
         return edge
 
     def add_edge(self, n1:Node, n2:Node):
-        edge = self._edge_ctor(self._edges_ids,
-                               "", n1, n2,
-                               status = self._status)
+        edge = self._create_edge(n1, n2)
         return self._add_edge(edge)
 
     def insert_edge(self, edge):
         return self._add_edge(edge)
 
-    def remove_node(self, node_name:str):
-        self._nodes = list(
-            filter(
-                lambda n: n.name != node_name,
-                self._nodes
-            )
-        )
-        self._status.modified()
+    def create_edge(self, n1:Node, n2:Node):
+        return self._create_edge(n1, n2)
 
     def remove_edge(self, edge_name:str):
         self._edges = list(
diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py
index eee76ee9eeae2c3c95d13bfae274133313370b73..13a7d4f4aaf4ddf411830b2da208ad905db03744 100644
--- a/src/View/Network/GraphWidget.py
+++ b/src/View/Network/GraphWidget.py
@@ -462,7 +462,12 @@ class GraphWidget(QGraphicsView):
         if node1 == node2:
             return
 
-        edge = self.graph.add_edge(node1.node, node2.node)
+        edge = self.graph.create_edge(node1.node, node2.node)
+        self._undo.push(
+            AddEdgeCommand(
+                self.graph, edge
+            )
+        )
         self.set_selected_item(None)
         self.set_selected_new_edge_src_node(None)
         # Reset the temporary line
@@ -484,7 +489,11 @@ class GraphWidget(QGraphicsView):
             Nothing
         """
         edge = item.edge
-        self.graph.remove_edge(edge.name)
+        self._undo.push(
+            DelEdgeCommand(
+                self.graph, edge
+            )
+        )
 
         # Clear all scene and redraw it
         self.scene().clear()
@@ -776,6 +785,7 @@ class GraphWidget(QGraphicsView):
 
     def _menu_edge(self, event, pos, items, menu):
         delete = menu.addAction(_translate("Network", "Delete the reach"))
+
         if self.graph.is_enable_edge(items[0].edge):
             enable = menu.addAction(_translate("Network", "Disable the reach"))
             is_enable = True
diff --git a/src/View/Network/UndoCommand.py b/src/View/Network/UndoCommand.py
index ea7e2657eae1eddb6603fe04cbf956a7bcc2b1df..72c4f8ae8f9a1ddeec47a9776f8e624025faf194 100644
--- a/src/View/Network/UndoCommand.py
+++ b/src/View/Network/UndoCommand.py
@@ -52,6 +52,33 @@ class DelNodeCommand(QUndoCommand):
 
         self._graph.remove_node(self._node.name)
 
+class AddEdgeCommand(QUndoCommand):
+    def __init__(self, graph, edge):
+        QUndoCommand.__init__(self)
+
+        self._graph = graph
+        self._edge = edge
+
+    def undo(self):
+        self._graph.remove_edge(self._edge.name)
+
+    def redo(self):
+        self._graph.insert_edge(self._edge)
+
+class DelEdgeCommand(QUndoCommand):
+    def __init__(self, graph, edge):
+        QUndoCommand.__init__(self)
+
+        self._graph = graph
+        self._edge = edge
+
+    def undo(self):
+        self._graph.insert_edge(self._edge)
+
+    def redo(self):
+        self._graph.remove_edge(self._edge.name)
+
+
 class SetCommand(QUndoCommand):
     def __init__(self, element, column, new_value):
         QUndoCommand.__init__(self)