diff --git a/src/Model/DB.py b/src/Model/DB.py
index eb836c04e07957244dda1204e651cfdfb61b60a8..90869740a42bf6d456fd165851adde995241c4f3 100644
--- a/src/Model/DB.py
+++ b/src/Model/DB.py
@@ -29,7 +29,6 @@ class SQLModel(SQL):
             self._create()      # Create db
             # self._save()        # Save
         else:
-            logger.info("Update database")
             self._update()      # Update db scheme if necessary
             # self._load()        # Load data
 
diff --git a/src/Model/Section/Section.py b/src/Model/Friction/Friction.py
similarity index 93%
rename from src/Model/Section/Section.py
rename to src/Model/Friction/Friction.py
index 86bdff48ffa00e9b656411dbf98c7248823f43e1..f7328dd4277ae996261ccb5d63836b160b467116 100644
--- a/src/Model/Section/Section.py
+++ b/src/Model/Friction/Friction.py
@@ -4,9 +4,9 @@ from tools import trace, timer
 
 from Model.DB import SQLSubModel
 
-class Section(SQLSubModel):
+class Friction(SQLSubModel):
     def __init__(self, name:str = "", status = None):
-        super(Section, self).__init__()
+        super(Friction, self).__init__()
 
         self._status = status
 
@@ -20,7 +20,7 @@ class Section(SQLSubModel):
     @classmethod
     def _sql_create(cls, execute):
         execute("""
-          CREATE TABLE section(
+          CREATE TABLE friction(
             id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
             ind INTERGER NOT NULL,
             begin_kp REAL NOT NULL,
@@ -49,7 +49,7 @@ class Section(SQLSubModel):
 
         table = execute(
             "SELECT ind, begin_kp, end_kp, begin_strickler, end_strickler " +
-            f"FROM section WHERE reach = {reach.id}"
+            f"FROM friction WHERE reach = {reach.id}"
         )
 
         for _ in table:
@@ -61,7 +61,7 @@ class Section(SQLSubModel):
             bs = next(filter(lambda s: s.id == row[3], stricklers))
             es = next(filter(lambda s: s.id == row[4], stricklers))
 
-            # Create section
+            # Create friction
             sec = cls(status = status)
             sec.edge = reach
             sec.begin_kp = row[1]
@@ -77,7 +77,7 @@ class Section(SQLSubModel):
         ind = data["ind"]
         execute(
             "INSERT INTO " +
-            "section(ind, begin_kp, end_kp, reach, begin_strickler, end_strickler) " +
+            "friction(ind, begin_kp, end_kp, reach, begin_strickler, end_strickler) " +
             "VALUES (" +
             f"{ind}, {self._begin_kp}, {self._end_kp}, " +
             f"{self._edge.id}, " +
diff --git a/src/Model/Section/SectionList.py b/src/Model/Friction/FrictionList.py
similarity index 54%
rename from src/Model/Section/SectionList.py
rename to src/Model/Friction/FrictionList.py
index d1f88f0899aa24da0b5972905a45ac99211af0dd..a82c9f22227ae44bc07d0a6e784596d132eefa62 100644
--- a/src/Model/Section/SectionList.py
+++ b/src/Model/Friction/FrictionList.py
@@ -1,35 +1,47 @@
 # -*- coding: utf-8 -*-
 
+import logging
+
 from copy import copy
 from tools import trace, timer
 
 from Model.DB import SQLSubModel
-from Model.Section.Section import Section
+from Model.Friction.Friction import Friction
+
+logger = logging.getLogger()
 
-class SectionList(SQLSubModel):
+class FrictionList(SQLSubModel):
     _sub_classes = [
-        Section
+        Friction
     ]
 
     def __init__(self, status = None):
-        super(SectionList, self).__init__()
+        super(FrictionList, self).__init__()
 
         self._status = status
-        self._sections = []
+        self._frictions = []
 
     @classmethod
     def _sql_create(cls, execute):
         return cls._create_submodel(execute)
 
+    @classmethod
+    def _sql_update_0_0_1(cls, execute, version):
+        execute("ALTER TABLE `section` RENAME TO `friction`")
+
     @classmethod
     def _sql_update(cls, execute, version):
+        if version == "0.0.0":
+            logger.info(f"Update friction TABLE from {version}")
+            cls._sql_update_0_0_1(execute, version)
+
         return True
 
     @classmethod
     def _sql_load(cls, execute, data = None):
         new = cls(status = data['status'])
 
-        new._sections = Section._sql_load(
+        new._frictions = Friction._sql_load(
             execute, data
         )
 
@@ -37,67 +49,67 @@ class SectionList(SQLSubModel):
 
     def _sql_save(self, execute, data = None):
         reach = data["reach"]
-        execute(f"DELETE FROM section WHERE reach = {reach.id}")
+        execute(f"DELETE FROM friction WHERE reach = {reach.id}")
 
         ok = True
         ind = 0
-        for section in self._sections:
+        for friction in self._frictions:
             data["ind"] = ind
-            ok &= section._sql_save(execute, data = data)
+            ok &= friction._sql_save(execute, data = data)
             ind += 1
 
         return ok
 
     def __len__(self):
-        return len(self._sections)
+        return len(self._frictions)
 
     @property
-    def sections(self):
-        return self._sections.copy()
+    def frictions(self):
+        return self._frictions.copy()
 
     def get(self, row):
-        return self._sections[row]
+        return self._frictions[row]
 
     def set(self, row, new):
-        self._sections[row] = new
+        self._frictions[row] = new
         self._status.modified()
 
     def new(self, index):
-        n = Section(status = self._status)
-        self._sections.insert(index, n)
+        n = Friction(status = self._status)
+        self._frictions.insert(index, n)
         self._status.modified()
         return n
 
     def insert(self, index, new):
-        self._sections.insert(index, new)
+        self._frictions.insert(index, new)
         self._status.modified()
 
-    def delete(self, sections):
-        for section in sections:
-            self._sections.remove(section)
+    def delete(self, frictions):
+        for friction in frictions:
+            self._frictions.remove(friction)
         self._status.modified()
 
     def delete_i(self, indexes):
-        sections = list(
+        frictions = list(
             map(
                 lambda x: x[1],
                 filter(
                     lambda x: x[0] in indexes,
-                    enumerate(self._sections)
+                    enumerate(self._frictions)
                 )
             )
         )
-        self.delete(sections)
+        self.delete(frictions)
 
     def sort(self, reverse=False, key=None):
-        self._sections.sort(reverse=reverse, key=key)
+        self._frictions.sort(reverse=reverse, key=key)
         self._status.modified()
 
     def move_up(self, index):
-        if index < len(self._sections):
+        if index < len(self._frictions):
             next = index - 1
 
-            l = self._sections
+            l = self._frictions
             l[index], l[next] = l[next], l[index]
             self._status.modified()
 
@@ -105,6 +117,6 @@ class SectionList(SQLSubModel):
         if index >= 0:
             prev = index + 1
 
-            l = self._sections
+            l = self._frictions
             l[index], l[prev] = l[prev], l[index]
             self._status.modified()
diff --git a/src/Model/River.py b/src/Model/River.py
index cbc86f196ca7696af4d50d9ea0fc36700e2d5357..a19e6cc32bb2c49ef32f81bc9ba34d1b1bdc0cfb 100644
--- a/src/Model/River.py
+++ b/src/Model/River.py
@@ -13,7 +13,7 @@ from Model.BoundaryCondition.BoundaryConditionList import BoundaryConditionList
 from Model.LateralContribution.LateralContributionList import LateralContributionList
 from Model.InitialConditions.InitialConditionsDict import InitialConditionsDict
 from Model.Stricklers.StricklersList import StricklersList
-from Model.Section.SectionList import SectionList
+from Model.Friction.FrictionList import FrictionList
 from Model.SolverParameters.SolverParametersList import SolverParametersList
 
 from Solver.Solvers import solver_type_list
@@ -86,7 +86,7 @@ class RiverNode(Node, SQLSubModel):
 class RiverReach(Edge, SQLSubModel):
     _sub_classes = [
         Reach,
-        SectionList,
+        FrictionList,
     ]
 
     def __init__(self, id:str, name:str,
@@ -100,7 +100,7 @@ class RiverReach(Edge, SQLSubModel):
         )
 
         self._reach = Reach(status=self._status, parent=self)
-        self._sections = SectionList(status = self._status)
+        self._frictions = FrictionList(status = self._status)
 
     @classmethod
     def _sql_create(cls, execute):
@@ -121,7 +121,7 @@ class RiverReach(Edge, SQLSubModel):
 
     @classmethod
     def _sql_update(cls, execute, version):
-        return True
+        return cls._update_submodel(execute, version)
 
     @classmethod
     def _sql_load(cls, execute, data = None):
@@ -149,7 +149,7 @@ class RiverReach(Edge, SQLSubModel):
             data["parent"] = new
             new._reach = Reach._sql_load(execute, data)
 
-            new._sections = SectionList._sql_load(execute, data)
+            new._frictions = FrictionList._sql_load(execute, data)
 
             reachs.append(new)
 
@@ -172,7 +172,7 @@ class RiverReach(Edge, SQLSubModel):
 
         data["reach"] = self
 
-        objs = [self._reach, self._sections]
+        objs = [self._reach, self._frictions]
         return self._save_submodel(execute, objs, data)
 
     @property
@@ -180,8 +180,8 @@ class RiverReach(Edge, SQLSubModel):
         return self._reach
 
     @property
-    def sections(self):
-        return self._sections
+    def frictions(self):
+        return self._frictions
 
 class River(Graph, SQLSubModel):
     _sub_classes = [
@@ -286,8 +286,8 @@ class River(Graph, SQLSubModel):
         return self._reach
 
     @property
-    def sections(self):
-        return self._sections
+    def frictions(self):
+        return self._frictions
 
     @property
     def boundary_condition(self):
diff --git a/src/Model/Study.py b/src/Model/Study.py
index 413838ad5d9b3354a6bb4e98fc4ccb46a779ee63..bdebce474867ca24e46a8ff8731a4e972687dd89 100644
--- a/src/Model/Study.py
+++ b/src/Model/Study.py
@@ -24,7 +24,7 @@ class Study(SQLModel):
 
     def __init__(self, filename = None, init_new = True):
         # Metadata
-        self._version = "0.0.0"
+        self._version = "0.0.1"
         self.creation_date = datetime.now()
         self.last_modification_date = datetime.now()
         self.last_save_date = datetime.now()
@@ -194,7 +194,9 @@ class Study(SQLModel):
         if version[0] == self._version:
             return True
 
-        if self._update_submodel(version):
+        logger.info("Update database")
+
+        if self._update_submodel(version[0]):
             self.execute(f"UPDATE info SET value='{self._version}' WHERE key='version'")
             return True
 
diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py
index eedd12154e45f20d7b4bb2383d7e4c1ca36299a6..e7d95811ea25b2312d1e97893eabf1c2734ecf01 100644
--- a/src/Solver/Mage.py
+++ b/src/Solver/Mage.py
@@ -225,17 +225,17 @@ class Mage(AbstractSolver):
 
             id = 1
             for edge in edges:
-                sections = edge.sections
+                frictions = edge.frictions
 
-                for section in sections.sections:
+                for friction in frictions.frictions:
                     num = f"{id:>3}"
-                    bkp = f"{section.begin_kp:>10.3f}"
-                    ekp = f"{section.end_kp:>10.3f}"
+                    bkp = f"{friction.begin_kp:>10.3f}"
+                    ekp = f"{friction.end_kp:>10.3f}"
 
-                    # if section.begin_kp != section.end_kp:
+                    # if friction.begin_kp != friction.end_kp:
                     #     print("TODO")
 
-                    strickler = section.begin_strickler
+                    strickler = friction.begin_strickler
                     coef_1 = f"{strickler.minor:>10.3f}"
                     coef_2 = f"{strickler.medium:>10.3f}"
 
diff --git a/src/View/Sections/PlotStricklers.py b/src/View/Frictions/PlotStricklers.py
similarity index 88%
rename from src/View/Sections/PlotStricklers.py
rename to src/View/Frictions/PlotStricklers.py
index cdd7730398243b5289b89d52d56e95d50c13597d..8f706782eedafb72a895910dcfd87e6446d3ae8e 100644
--- a/src/View/Sections/PlotStricklers.py
+++ b/src/View/Frictions/PlotStricklers.py
@@ -17,8 +17,8 @@ class PlotStricklers(APlot):
             toolbar=toolbar
         )
 
-    def draw_sections(self, sections, color="r"):
-        lst = sections
+    def draw_frictions(self, frictions, color="r"):
+        lst = frictions
         lst.sort(key = lambda s: s.begin_kp)
 
         coef = flatten(
@@ -71,10 +71,10 @@ class PlotStricklers(APlot):
             left = min(kp), right = max(kp)
         )
 
-        sections = self.data.sections
-        if len(sections) != 0:
-            lst = sections.sections
-            self.draw_sections(lst)
+        frictions = self.data.frictions
+        if len(frictions) != 0:
+            lst = frictions.frictions
+            self.draw_frictions(lst)
 
             # HightLight
             kp_min, kp_max = (-1, -1)
@@ -85,10 +85,10 @@ class PlotStricklers(APlot):
                     filter(
                         lambda s: (s.begin_kp == kp_min and
                                    s.end_kp == kp_max),
-                        sections.sections
+                        frictions.frictions
                     )
                 )
-                self.draw_sections(lst, color="b")
+                self.draw_frictions(lst, color="b")
 
         self.canvas.figure.tight_layout()
         self.canvas.figure.canvas.draw_idle()
diff --git a/src/View/Sections/Table.py b/src/View/Frictions/Table.py
similarity index 81%
rename from src/View/Sections/Table.py
rename to src/View/Frictions/Table.py
index 47aff38e1b5050f2054b722ade6c472ac5f1d719..2c96ef97848efe46eed0e5a2bded85efab6bfeba 100644
--- a/src/View/Sections/Table.py
+++ b/src/View/Frictions/Table.py
@@ -15,14 +15,14 @@ from PyQt5.QtWidgets import (
     QComboBox,
 )
 
-from View.Sections.UndoCommand import (
+from View.Frictions.UndoCommand import (
     SetNameCommand, SetBeginCommand, SetEndCommand,
     SetBeginStricklerCommand, SetEndStricklerCommand,
     AddCommand, DelCommand, SortCommand,
     MoveCommand, PasteCommand, DuplicateCommand,
 )
 
-from View.Sections.translate import *
+from View.Frictions.translate import *
 
 _translate = QCoreApplication.translate
 
@@ -39,7 +39,7 @@ class ComboBoxDelegate(QItemDelegate):
 
         if self._mode == "stricklers":
             self.editor.addItems(
-                [_translate("Sections", "Not defined")] +
+                [_translate("Frictions", "Not defined")] +
                 list(
                     map(
                         lambda s: str(s),
@@ -79,7 +79,7 @@ class TableModel(QAbstractTableModel):
         self._data = data
         self._study = study
         self._undo = undo
-        self._sections = self._data.sections
+        self._frictions = self._data.frictions
 
     def flags(self, index):
         options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
@@ -88,7 +88,7 @@ class TableModel(QAbstractTableModel):
         return options
 
     def rowCount(self, parent):
-        return len(self._sections)
+        return len(self._frictions)
 
     def columnCount(self, parent):
         return len(self._headers)
@@ -101,27 +101,27 @@ class TableModel(QAbstractTableModel):
         column = index.column()
 
         if self._headers[column] == "name":
-            return self._sections.get(row).name
+            return self._frictions.get(row).name
         elif self._headers[column] == "begin_kp":
-            return self._sections.get(row).begin_kp
+            return self._frictions.get(row).begin_kp
         elif self._headers[column] == "end_kp":
-            return self._sections.get(row).end_kp
+            return self._frictions.get(row).end_kp
         elif self._headers[column] == "begin_strickler":
-            value = self._sections.get(row).begin_strickler
+            value = self._frictions.get(row).begin_strickler
             if value == None:
-                return _translate("Sections", "Not defined")
+                return _translate("Frictions", "Not defined")
             return str(value)
         elif self._headers[column] == "end_strickler":
-            value = self._sections.get(row).end_strickler
+            value = self._frictions.get(row).end_strickler
             if value == None:
-                return _translate("Sections", "Not defined")
+                return _translate("Frictions", "Not defined")
             return str(value)
 
         return QVariant()
 
-    def headerData(self, section, orientation, role):
+    def headerData(self, friction, orientation, role):
         if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
-            return table_headers[self._headers[section]]
+            return table_headers[self._headers[friction]]
 
         return QVariant()
 
@@ -135,31 +135,31 @@ class TableModel(QAbstractTableModel):
         if self._headers[column] == "name":
             self._undo.push(
                 SetNameCommand(
-                    self._sections, row, value
+                    self._frictions, row, value
                 )
             )
         elif self._headers[column] == "begin_kp":
             self._undo.push(
                 SetBeginCommand(
-                    self._sections, row, value
+                    self._frictions, row, value
                 )
             )
         elif self._headers[column] == "end_kp":
             self._undo.push(
                 SetEndCommand(
-                    self._sections, row, value
+                    self._frictions, row, value
                 )
             )
         elif self._headers[column] == "begin_strickler":
             self._undo.push(
                 SetBeginStricklerCommand(
-                    self._sections, row, self._study.river.strickler(value)
+                    self._frictions, row, self._study.river.strickler(value)
                 )
             )
         elif self._headers[column] == "end_strickler":
             self._undo.push(
                 SetEndStricklerCommand(
-                    self._sections, row, self._study.river.strickler(value)
+                    self._frictions, row, self._study.river.strickler(value)
                 )
             )
 
@@ -171,7 +171,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             AddCommand(
-                self._sections, row, self._data
+                self._frictions, row, self._data
             )
         )
 
@@ -183,7 +183,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             DelCommand(
-                self._sections, rows
+                self._frictions, rows
             )
         )
 
@@ -195,7 +195,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             SortCommand(
-                self._sections, False
+                self._frictions, False
             )
         )
 
@@ -212,7 +212,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo_stack.push(
             MoveCommand(
-                self._sections, "up", row
+                self._frictions, "up", row
             )
         )
 
@@ -220,7 +220,7 @@ class TableModel(QAbstractTableModel):
         self.layoutChanged.emit()
 
     def move_down(self, index, parent=QModelIndex()):
-        if row > len(self._sections):
+        if row > len(self._frictions):
             return
 
         target = row
@@ -229,7 +229,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo_stack.push(
             MoveCommand(
-                self._sections, "down", row
+                self._frictions, "down", row
             )
         )
 
diff --git a/src/View/Frictions/UndoCommand.py b/src/View/Frictions/UndoCommand.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d685ace8ada99c6a63b86a43dca930dc2007dce
--- /dev/null
+++ b/src/View/Frictions/UndoCommand.py
@@ -0,0 +1,226 @@
+# -*- coding: utf-8 -*-
+
+from copy import deepcopy
+from tools import trace, timer
+
+from PyQt5.QtWidgets import (
+    QMessageBox, QUndoCommand, QUndoStack,
+)
+
+from Model.Friction.Friction import Friction
+from Model.Friction.FrictionList import FrictionList
+
+class SetNameCommand(QUndoCommand):
+    def __init__(self, frictions, index, new_value):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._old = self._frictions.get(self._index).name
+        self._new = new_value
+
+    def undo(self):
+        self._frictions.get(self._index).name = self._old
+
+    def redo(self):
+        self._frictions.get(self._index).name = self._new
+
+class SetBeginCommand(QUndoCommand):
+    def __init__(self, frictions, index, new_value):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._old = self._frictions.get(self._index).begin_kp
+        self._new = new_value
+
+    def undo(self):
+        self._frictions.get(self._index).begin_kp = float(self._old)
+
+    def redo(self):
+        self._frictions.get(self._index).begin_kp = float(self._new)
+
+class SetEndCommand(QUndoCommand):
+    def __init__(self, frictions, index, new_value):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._old = self._frictions.get(self._index).end_kp
+        self._new = new_value
+
+    def undo(self):
+        self._frictions.get(self._index).end_kp = float(self._old)
+
+    def redo(self):
+        self._frictions.get(self._index).end_kp = float(self._new)
+
+
+class SetBeginStricklerCommand(QUndoCommand):
+    def __init__(self, frictions, index, new_value):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._old = self._frictions.get(self._index).begin_strickler
+        self._new = new_value
+
+    def undo(self):
+        self._frictions.get(self._index).begin_strickler = self._old
+
+    def redo(self):
+        self._frictions.get(self._index).begin_strickler = self._new
+
+class SetEndStricklerCommand(QUndoCommand):
+    def __init__(self, frictions, index, new_value):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._old = self._frictions.get(self._index).end_strickler
+        self._new = new_value
+
+    def undo(self):
+        self._frictions.get(self._index).end_strickler = self._old
+
+    def redo(self):
+        self._frictions.get(self._index).end_strickler = self._new
+
+
+class SetEdgeCommand(QUndoCommand):
+    def __init__(self, frictions, index, edge):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._old = self._frictions.get(self._index).edge
+        self._new = edge
+
+    def undo(self):
+        self._frictions.get(self._index).edge = self._old
+
+    def redo(self):
+        self._frictions.get(self._index).edge = self._new
+
+class AddCommand(QUndoCommand):
+    def __init__(self, frictions, index, reach):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._index = index
+        self._reach = reach
+        self._new = None
+
+    def undo(self):
+        self._frictions.delete_i([self._index])
+
+    def redo(self):
+        if self._new is None:
+            self._new = self._frictions.new(self._index)
+            self._new.edge = self._reach
+        else:
+            self._frictions.insert(self._index, self._new)
+
+class DelCommand(QUndoCommand):
+    def __init__(self, frictions, rows):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._rows = rows
+
+        self._friction = []
+        for row in rows:
+            self._friction.append((row, self._frictions.get(row)))
+        self._friction.sort()
+
+    def undo(self):
+        for row, el in self._friction:
+            self._frictions.insert(row, el)
+
+    def redo(self):
+        self._frictions.delete_i(self._rows)
+
+class SortCommand(QUndoCommand):
+    def __init__(self, frictions, _reverse):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._reverse = _reverse
+
+        self._old = self._frictions.frictions
+        self._indexes = None
+
+    def undo(self):
+        ll = self._frictions.frictions
+        self._frictions.sort(
+            key=lambda x: self._indexes[ll.index(x)]
+        )
+
+    def redo(self):
+        self._frictions.sort(
+            reverse=self._reverse,
+            key=lambda x: x.name
+        )
+        if self._indexes is None:
+            self._indexes = list(
+                map(
+                    lambda p: self._old.index(p),
+                    self._frictions.frictions
+                )
+            )
+            self._old = None
+
+
+class MoveCommand(QUndoCommand):
+    def __init__(self, frictions, up, i):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._up = up == "up"
+        self._i = i
+
+    def undo(self):
+        if self._up:
+            self._frictions.move_up(self._i)
+        else:
+            self._frictions.move_down(self._i)
+
+    def redo(self):
+        if self._up:
+            self._frictions.move_up(self._i)
+        else:
+            self._frictions.move_down(self._i)
+
+
+class PasteCommand(QUndoCommand):
+    def __init__(self, frictions, row, friction):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._row = row
+        self._friction = deepcopy(friction)
+        self._friction.reverse()
+
+    def undo(self):
+        self._frictions.delete(self._friction)
+
+    def redo(self):
+        for friction in self._friction:
+            self._frictions.insert(self._row, friction)
+
+
+class DuplicateCommand(QUndoCommand):
+    def __init__(self, frictions, rows, friction):
+        QUndoCommand.__init__(self)
+
+        self._frictions = frictions
+        self._rows = rows
+        self._friction = deepcopy(friction)
+        self._friction.reverse()
+
+    def undo(self):
+        self._frictions.delete(self._friction)
+
+    def redo(self):
+        for friction in self._frictions:
+            self._frictions.insert(self._rows[0], friction)
diff --git a/src/View/Sections/Window.py b/src/View/Frictions/Window.py
similarity index 90%
rename from src/View/Sections/Window.py
rename to src/View/Frictions/Window.py
index 63eb4b7e4d6b26325e1b29ecabeb549c05ac4e59..71a3e8e1036d1a96b244f686a8ba13eb378e635b 100644
--- a/src/View/Sections/Window.py
+++ b/src/View/Frictions/Window.py
@@ -24,18 +24,18 @@ from PyQt5.QtWidgets import (
     QComboBox, QVBoxLayout, QHeaderView, QTabWidget,
 )
 
-from View.Sections.UndoCommand import (
+from View.Frictions.UndoCommand import (
     PasteCommand, DuplicateCommand,
 )
 
-from View.Sections.Table import (
+from View.Frictions.Table import (
     TableModel, ComboBoxDelegate
 )
 
 from View.Plot.MplCanvas import MplCanvas
 from View.Geometry.PlotKPC import PlotKPC
-from View.Sections.PlotStricklers import PlotStricklers
-from View.Sections.translate import *
+from View.Frictions.PlotStricklers import PlotStricklers
+from View.Frictions.translate import *
 
 from View.Stricklers.Window import StricklersWindow
 
@@ -43,16 +43,16 @@ _translate = QCoreApplication.translate
 
 logger = logging.getLogger()
 
-class SectionsWindow(ASubMainWindow, ListedSubWindow):
-    def __init__(self, title="Sections", study=None, parent=None):
+class FrictionsWindow(ASubMainWindow, ListedSubWindow):
+    def __init__(self, title="Frictions", study=None, parent=None):
         self._study = study
-        self._reach = self._study.river._current_reach
-        self._sections = self._reach.sections
+        self._reach = self._study.river.current_reach()
+        self._frictions = self._reach.frictions
 
         self.setup_title(title)
 
-        super(SectionsWindow, self).__init__(
-            name=self._title, ui="Sections", parent=parent
+        super(FrictionsWindow, self).__init__(
+            name=self._title, ui="Frictions", parent=parent
         )
 
         self.setup_sc()
@@ -174,7 +174,7 @@ class SectionsWindow(ASubMainWindow, ListedSubWindow):
         if len(rows) > 0:
             data = self._reach
             reach = self._reach.reach
-            sec = self._sections.get(rows[0])
+            sec = self._frictions.get(rows[0])
             highlight = (sec.begin_kp, sec.end_kp)
 
         self.plot = PlotKPC(
@@ -194,7 +194,7 @@ class SectionsWindow(ASubMainWindow, ListedSubWindow):
 
     def add(self):
         rows = self.index_selected_rows()
-        if len(self._sections) == 0 or len(rows) == 0:
+        if len(self._frictions) == 0 or len(rows) == 0:
             self._table.add(0)
         else:
             self._table.add(rows[0])
diff --git a/src/View/Frictions/translate.py b/src/View/Frictions/translate.py
new file mode 100644
index 0000000000000000000000000000000000000000..c404f59c7bf68aee46347dd1d357c19fddc18dcc
--- /dev/null
+++ b/src/View/Frictions/translate.py
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+
+from PyQt5.QtCore import QCoreApplication
+
+_translate = QCoreApplication.translate
+
+table_headers = {
+    "name": _translate("Frictions", "Name"),
+    # "edge": _translate("Frictions", "Reach"),
+    "begin_kp": _translate("Frictions", "Begin kp (m)"),
+    "end_kp": _translate("Frictions", "End kp (m)"),
+    "begin_strickler": _translate("Frictions", "Begin strickler"),
+    "end_strickler": _translate("Frictions", "End strickler"),
+}
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 024f611fe3e68c51912cea77a4412bf2d91e1b77..10a35a6ed831704789141ab76ddb6ce6f0b43fdf 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -32,7 +32,7 @@ from View.BoundaryCondition.Window import BoundaryConditionWindow
 from View.LateralContribution.Window import LateralContributionWindow
 from View.InitialConditions.Window import InitialConditionsWindow
 from View.Stricklers.Window import StricklersWindow
-from View.Sections.Window import SectionsWindow
+from View.Frictions.Window import FrictionsWindow
 from View.SolverParameters.Window import SolverParametersWindow
 from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow
 from View.CheckList.Window import CheckListWindow
@@ -62,7 +62,7 @@ define_model_action = [
     "action_toolBar_network", "action_toolBar_geometry",
     "action_toolBar_mesh", "action_toolBar_run_meshing_tool",
     "action_toolBar_boundary_cond", "action_toolBar_lateral_contrib",
-    "action_toolBar_spills", "action_toolBar_sections",
+    "action_toolBar_spills", "action_toolBar_frictions",
     "action_toolBar_stricklers", "action_toolBar_building",
     "action_toolBar_initial_cond",
     # Menu
@@ -144,7 +144,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
             "action_menu_edit_geometry": self.open_geometry,
             "action_menu_boundary_conditions": self.open_boundary_cond,
             "action_menu_initial_conditions": self.open_initial_conditions,
-            "action_menu_edit_friction": self.open_sections,
+            "action_menu_edit_friction": self.open_frictions,
             "action_menu_edit_lateral_contribution": self.open_lateral_contrib,
             "action_menu_run_solver": self.run_solver,
             ## Help
@@ -164,12 +164,13 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
             "action_toolBar_lateral_contrib": self.open_lateral_contrib,
             "action_toolBar_spills": lambda: self.open_dummy("Deversement"),
             "action_toolBar_stricklers": self.open_stricklers,
-            "action_toolBar_sections": self.open_sections,
+            "action_toolBar_frictions": self.open_frictions,
             "action_toolBar_building": lambda: self.open_dummy("Ouvrages"),
             "action_toolBar_initial_cond": self.open_initial_conditions,
         }
 
         for action in actions:
+            logger.debug("Setup connection : " + action)
             self.findChild(QAction, action)\
                 .triggered.connect(actions[action])
             # action.triggered.connect(actions[action])
@@ -461,14 +462,14 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
         )
         strick.show()
 
-    def open_sections(self):
+    def open_frictions(self):
         if (self.model is not None and
             self.model.river.has_current_reach()):
-            sections = SectionsWindow(
+            frictions = FrictionsWindow(
                 study = self.model,
                 parent = self
             )
-            sections.show()
+            frictions.show()
         else:
             self.msg_select_reach()
 
diff --git a/src/View/Sections/UndoCommand.py b/src/View/Sections/UndoCommand.py
deleted file mode 100644
index 9ba5cff6131f1d014caa4b3c4996c18a659a18c6..0000000000000000000000000000000000000000
--- a/src/View/Sections/UndoCommand.py
+++ /dev/null
@@ -1,226 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from copy import deepcopy
-from tools import trace, timer
-
-from PyQt5.QtWidgets import (
-    QMessageBox, QUndoCommand, QUndoStack,
-)
-
-from Model.Section.Section import Section
-from Model.Section.SectionList import SectionList
-
-class SetNameCommand(QUndoCommand):
-    def __init__(self, sections, index, new_value):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._old = self._sections.get(self._index).name
-        self._new = new_value
-
-    def undo(self):
-        self._sections.get(self._index).name = self._old
-
-    def redo(self):
-        self._sections.get(self._index).name = self._new
-
-class SetBeginCommand(QUndoCommand):
-    def __init__(self, sections, index, new_value):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._old = self._sections.get(self._index).begin_kp
-        self._new = new_value
-
-    def undo(self):
-        self._sections.get(self._index).begin_kp = float(self._old)
-
-    def redo(self):
-        self._sections.get(self._index).begin_kp = float(self._new)
-
-class SetEndCommand(QUndoCommand):
-    def __init__(self, sections, index, new_value):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._old = self._sections.get(self._index).end_kp
-        self._new = new_value
-
-    def undo(self):
-        self._sections.get(self._index).end_kp = float(self._old)
-
-    def redo(self):
-        self._sections.get(self._index).end_kp = float(self._new)
-
-
-class SetBeginStricklerCommand(QUndoCommand):
-    def __init__(self, sections, index, new_value):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._old = self._sections.get(self._index).begin_strickler
-        self._new = new_value
-
-    def undo(self):
-        self._sections.get(self._index).begin_strickler = self._old
-
-    def redo(self):
-        self._sections.get(self._index).begin_strickler = self._new
-
-class SetEndStricklerCommand(QUndoCommand):
-    def __init__(self, sections, index, new_value):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._old = self._sections.get(self._index).end_strickler
-        self._new = new_value
-
-    def undo(self):
-        self._sections.get(self._index).end_strickler = self._old
-
-    def redo(self):
-        self._sections.get(self._index).end_strickler = self._new
-
-
-class SetEdgeCommand(QUndoCommand):
-    def __init__(self, sections, index, edge):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._old = self._sections.get(self._index).edge
-        self._new = edge
-
-    def undo(self):
-        self._sections.get(self._index).edge = self._old
-
-    def redo(self):
-        self._sections.get(self._index).edge = self._new
-
-class AddCommand(QUndoCommand):
-    def __init__(self, sections, index, reach):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._index = index
-        self._reach = reach
-        self._new = None
-
-    def undo(self):
-        self._sections.delete_i([self._index])
-
-    def redo(self):
-        if self._new is None:
-            self._new = self._sections.new(self._index)
-            self._new.edge = self._reach
-        else:
-            self._sections.insert(self._index, self._new)
-
-class DelCommand(QUndoCommand):
-    def __init__(self, sections, rows):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._rows = rows
-
-        self._section = []
-        for row in rows:
-            self._section.append((row, self._sections.get(row)))
-        self._section.sort()
-
-    def undo(self):
-        for row, el in self._section:
-            self._sections.insert(row, el)
-
-    def redo(self):
-        self._sections.delete_i(self._rows)
-
-class SortCommand(QUndoCommand):
-    def __init__(self, sections, _reverse):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._reverse = _reverse
-
-        self._old = self._sections.sections
-        self._indexes = None
-
-    def undo(self):
-        ll = self._sections.sections
-        self._sections.sort(
-            key=lambda x: self._indexes[ll.index(x)]
-        )
-
-    def redo(self):
-        self._sections.sort(
-            reverse=self._reverse,
-            key=lambda x: x.name
-        )
-        if self._indexes is None:
-            self._indexes = list(
-                map(
-                    lambda p: self._old.index(p),
-                    self._sections.sections
-                )
-            )
-            self._old = None
-
-
-class MoveCommand(QUndoCommand):
-    def __init__(self, sections, up, i):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._up = up == "up"
-        self._i = i
-
-    def undo(self):
-        if self._up:
-            self._sections.move_up(self._i)
-        else:
-            self._sections.move_down(self._i)
-
-    def redo(self):
-        if self._up:
-            self._sections.move_up(self._i)
-        else:
-            self._sections.move_down(self._i)
-
-
-class PasteCommand(QUndoCommand):
-    def __init__(self, sections, row, section):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._row = row
-        self._section = deepcopy(section)
-        self._section.reverse()
-
-    def undo(self):
-        self._sections.delete(self._section)
-
-    def redo(self):
-        for section in self._section:
-            self._sections.insert(self._row, section)
-
-
-class DuplicateCommand(QUndoCommand):
-    def __init__(self, sections, rows, section):
-        QUndoCommand.__init__(self)
-
-        self._sections = sections
-        self._rows = rows
-        self._section = deepcopy(section)
-        self._section.reverse()
-
-    def undo(self):
-        self._sections.delete(self._section)
-
-    def redo(self):
-        for section in self._sections:
-            self._sections.insert(self._rows[0], section)
diff --git a/src/View/Sections/translate.py b/src/View/Sections/translate.py
deleted file mode 100644
index 6868851a7917e04fc8d1a3240858ff971d4685fc..0000000000000000000000000000000000000000
--- a/src/View/Sections/translate.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from PyQt5.QtCore import QCoreApplication
-
-_translate = QCoreApplication.translate
-
-table_headers = {
-    "name": _translate("Sections", "Name"),
-    # "edge": _translate("Sections", "Reach"),
-    "begin_kp": _translate("Sections", "Begin kp (m)"),
-    "end_kp": _translate("Sections", "End kp (m)"),
-    "begin_strickler": _translate("Sections", "Begin strickler"),
-    "end_strickler": _translate("Sections", "End strickler"),
-}
diff --git a/src/View/ui/Sections.ui b/src/View/ui/Frictions.ui
similarity index 100%
rename from src/View/ui/Sections.ui
rename to src/View/ui/Frictions.ui
diff --git a/src/View/ui/MainWindow.ui b/src/View/ui/MainWindow.ui
index eb64701c2a7f3e66befe88cc401c1388301a4a84..b63f032c2f240e90c328ed4d72b66c96f054ae3b 100644
--- a/src/View/ui/MainWindow.ui
+++ b/src/View/ui/MainWindow.ui
@@ -292,7 +292,7 @@
    <addaction name="separator"/>
    <addaction name="action_toolBar_spills"/>
    <addaction name="separator"/>
-   <addaction name="action_toolBar_sections"/>
+   <addaction name="action_toolBar_frictions"/>
    <addaction name="separator"/>
    <addaction name="action_toolBar_building"/>
    <addaction name="separator"/>
@@ -858,12 +858,12 @@
     <string>Edit lateral spills</string>
    </property>
   </action>
-  <action name="action_toolBar_sections">
+  <action name="action_toolBar_frictions">
    <property name="text">
-    <string>Sections</string>
+    <string>Friction</string>
    </property>
    <property name="toolTip">
-    <string>Edit section frictions and lateral contributions</string>
+    <string>Edit friction frictions and lateral contributions</string>
    </property>
   </action>
   <action name="action_toolBar_stricklers">