diff --git a/src/Model/Network/Edge.py b/src/Model/Network/Edge.py
index 08ae23e7bd0f6962b7f1cf0399afd91a8da9914a..0cc9701e3229a1da93416d2cc180cc5c8b3fc705 100644
--- a/src/Model/Network/Edge.py
+++ b/src/Model/Network/Edge.py
@@ -12,18 +12,18 @@ class Edge(object):
         self._status = status
 
         self.id = id
-        self._name = name if name != "" else f"{node1.name} -> {node2.name}"
+        self._name = name
 
         self.node1 = node1
         self.node2 = node2
 
-        self.enable = True
+        self._enable = True
 
     def __getitem__(self, name):
         ret = None
 
         if name == "name":
-            ret = self._name
+            ret = self.name
         elif name == "id":
             ret = self.id
         elif name == "node1":
@@ -31,7 +31,7 @@ class Edge(object):
         elif name == "node2":
             ret = self.node2.name
         elif name == "enable":
-            ret = self.enable
+            ret = self._enable
 
         return ret
 
@@ -45,16 +45,18 @@ class Edge(object):
         elif name == "node2":
             self.node2 = value
         elif name == "enable":
-            self.enable = value
+            self._enable = value
 
         self._status.modified()
 
     @property
     def name(self):
-        return self._name
+        return self._name if self._name != "" else f"{self.node1.name} -> {self.node2.name}"
 
-    def enable(self):
-        self.enable = True
+    def enable(self, enable=True):
+        self._enable = enable
+        self._status.modified()
 
     def disable(self):
-        self.enable = False
+        self._enable = False
+        self._status.modified()
diff --git a/src/View/Network/Window.py b/src/View/Network/Window.py
index 522d5dd523269054f707728c6dbe82020fcf99d8..1bdd676a2c70a0c01c05f8443c09af7794168f63 100644
--- a/src/View/Network/Window.py
+++ b/src/View/Network/Window.py
@@ -9,36 +9,52 @@ from PyQt5.QtWidgets import (
     QTableView, QItemDelegate, QComboBox, QLineEdit, QHBoxLayout, QSlider,
     QPushButton, QCheckBox, QStyledItemDelegate, QStyleOptionButton, QStyle,
     QApplication, QToolBar, QAction, QHeaderView, QAbstractItemView,
+    QUndoStack, QShortcut,
 )
 
 from Model.River import RiverNode, RiverReach, River
 
 from View.ASubWindow import ASubMainWindow
 from View.Network.GraphWidget import GraphWidget
+from View.Network.UndoCommand import *
 from View.Network.Table import (
     GraphTableModel, ComboBoxDelegate, TrueFalseComboBoxDelegate,
 )
 
 class NetworkWindow(ASubMainWindow):
     def __init__(self, model=None, title="River network", parent=None):
-        super(NetworkWindow, self).__init__(name=title, ui="Network", parent=parent)
-        self.ui.setWindowTitle(title)
+        self._title = title
+        self._model = model
+        self._graph = self._model.river
 
-        self.model = model
-        self.graph = self.model.river
+        self.setup_title()
 
-        # Graph Widget
+        super(NetworkWindow, self).__init__(name=self._title, ui="Network", parent=parent)
+        self.ui.setWindowTitle(self._title)
 
-        self.graph_widget = GraphWidget(self.graph, parent=self)
-        self.graph_layout = self.find(QHBoxLayout, "horizontalLayout_graph")
-        self.graph_layout.addWidget(self.graph_widget)
+        self.setup_graph()
+        self.setup_table()
+        self.setup_connections()
 
+    def setup_title(self):
+        self._title = self._title + " - " + self._model.name
+
+    def setup_sc(self):
+        self._undo_stack = QUndoStack()
+
+        self.undo_sc = QShortcut(QKeySequence.Undo, self)
+        self.redo_sc = QShortcut(QKeySequence.Redo, self)
+        self.copy_sc = QShortcut(QKeySequence.Copy, self)
+        self.paste_sc = QShortcut(QKeySequence.Paste, self)
+
+    def setup_table(self):
         # Nodes table
 
         self.nodes_model = GraphTableModel(
             headers = ["name", "type"],
-            graph = self.graph,
-            rows_type="nodes",
+            graph = self._graph,
+            rows_type = "nodes",
+            undo = self._undo_stack,
         )
         table = self.find(QTableView, "tableView_nodes")
         table.setModel(self.nodes_model)
@@ -51,11 +67,12 @@ class NetworkWindow(ASubMainWindow):
 
         self.reachs_model = GraphTableModel(
             headers = ["name", "enable", "node1", "node2"],
-            graph = self.graph,
-            rows_type="edges"
+            graph = self._graph,
+            rows_type = "edges",
+            undo = self._undo_stack,
         )
         self.delegate_combobox = ComboBoxDelegate(
-            graph = self.graph,
+            graph = self._graph,
             parent = self,
         )
         self.delegate_true_false_combobox = TrueFalseComboBoxDelegate(
@@ -71,14 +88,18 @@ class NetworkWindow(ASubMainWindow):
         table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
         #table.resizeColumnsToContents()
 
-        # Connection
+    def setup_graph(self):
+        self._graph_widget = GraphWidget(self._graph, parent=self)
+        self._graph_layout = self.find(QHBoxLayout, "horizontalLayout_graph")
+        self._graph_layout.addWidget(self._graph_widget)
 
+    def setup_connections(self):
         self.nodes_model.dataChanged.connect(self.reachs_model.update)
-        self.nodes_model.dataChanged.connect(self.graph_widget.rename_nodes)
-        self.reachs_model.dataChanged.connect(self.graph_widget.display_update)
+        self.nodes_model.dataChanged.connect(self._graph_widget.rename_nodes)
+        self.reachs_model.dataChanged.connect(self._graph_widget.display_update)
         self.reachs_model.dataChanged.connect(self.nodes_model.update)
-        self.graph_widget.changeEdge.connect(self.reachs_model.update)
-        self.graph_widget.changeNode.connect(self.nodes_model.update)
+        self._graph_widget.changeEdge.connect(self.reachs_model.update)
+        self._graph_widget.changeNode.connect(self.nodes_model.update)
 
         self.find(QAction, "action_toolBar_add").setCheckable(True)
         self.find(QAction, "action_toolBar_add").triggered.connect(
@@ -94,25 +115,26 @@ class NetworkWindow(ASubMainWindow):
             self.reverse_edge
         )
 
+
     def clicked_add(self):
         if self.get_action_checkable("action_toolBar_add"):
             self.set_action_checkable("action_toolBar_del", False)
-            self.graph_widget.state("add")
+            self._graph_widget.state("add")
         else:
-            self.graph_widget.state("move")
+            self._graph_widget.state("move")
 
     def clicked_del(self):
         if self.get_action_checkable("action_toolBar_del"):
             self.set_action_checkable("action_toolBar_add", False)
-            self.graph_widget.state("del")
+            self._graph_widget.state("del")
         else:
-            self.graph_widget.state("move")
+            self._graph_widget.state("move")
 
     def keyPressEvent(self, event):
         key = event.key()
 
         if key == Qt.Key_Escape:
-            self.graph_widget.reset_selection
+            self._graph_widget.reset_selection
 
     def reverse_edge(self):
         """Reverse edge direction of selected table rows