diff --git a/src/View/Frictions/PlotStricklers.py b/src/View/Frictions/PlotStricklers.py
index 71ff6e6f5ab8134374fe5ae22befef9a9ae64e92..c6b58dcd40a2287fe9a5cc84e803a992c800ea96 100644
--- a/src/View/Frictions/PlotStricklers.py
+++ b/src/View/Frictions/PlotStricklers.py
@@ -17,7 +17,7 @@
 # -*- coding: utf-8 -*-
 
 from tools import timer, flatten
-from View.Plot.APlot import APlot
+from View.Tools.PamhyrPlot import PamhyrPlot
 
 from PyQt5.QtCore import (
     QCoreApplication
@@ -25,14 +25,7 @@ from PyQt5.QtCore import (
 
 _translate = QCoreApplication.translate
 
-class PlotStricklers(APlot):
-    def __init__(self, canvas=None, data=None, toolbar=None):
-        super(PlotStricklers, self).__init__(
-            canvas=canvas,
-            data=data,
-            toolbar=toolbar
-        )
-
+class PlotStricklers(PamhyrPlot):
     def draw_frictions(self, frictions, color="r"):
         lst = frictions
         lst.sort(key = lambda s: s.begin_kp)
diff --git a/src/View/Frictions/Table.py b/src/View/Frictions/Table.py
index ef9dc32f5cce327fc5e10efbc17520c7dbaa0cd3..f4ad4f8ee638b0f97234dd1694d232bb8f76d8c0 100644
--- a/src/View/Frictions/Table.py
+++ b/src/View/Frictions/Table.py
@@ -41,6 +41,8 @@ from View.Frictions.UndoCommand import (
     MoveCommand, PasteCommand, DuplicateCommand,
 )
 
+from View.Tools.PamhyrTable import PamhyrTableModel
+
 from View.Frictions.translate import *
 
 logger = logging.getLogger()
@@ -93,26 +95,10 @@ class ComboBoxDelegate(QItemDelegate):
         self.commitData.emit(self.sender())
 
 
-class TableModel(QAbstractTableModel):
-    def __init__(self, data=None, study=None, undo=None):
-        super(QAbstractTableModel, self).__init__()
-        self._headers = list(table_headers.keys())
-        self._data = data
-        self._study = study
-        self._undo = undo
-        self._frictions = self._data.frictions
-
-    def flags(self, index):
-        options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
-        options |= Qt.ItemIsEditable
-
-        return options
-
-    def rowCount(self, parent):
-        return len(self._frictions)
-
-    def columnCount(self, parent):
-        return len(self._headers)
+class TableModel(PamhyrTableModel):
+    def _setup_lst(self):
+        self._lst = self._data.frictions
+        self._study = self._opt_data
 
     def data(self, index, role):
         if role != Qt.ItemDataRole.DisplayRole:
@@ -122,30 +108,24 @@ class TableModel(QAbstractTableModel):
         column = index.column()
 
         if self._headers[column] == "name":
-            return self._frictions.get(row).name
+            return self._lst.get(row).name
         elif self._headers[column] == "begin_kp":
-            return self._frictions.get(row).begin_kp
+            return self._lst.get(row).begin_kp
         elif self._headers[column] == "end_kp":
-            return self._frictions.get(row).end_kp
+            return self._lst.get(row).end_kp
         elif self._headers[column] == "begin_strickler":
-            value = self._frictions.get(row).begin_strickler
+            value = self._lst.get(row).begin_strickler
             if value == None:
                 return _translate("Frictions", "Not defined")
             return str(value)
         elif self._headers[column] == "end_strickler":
-            value = self._frictions.get(row).end_strickler
+            value = self._lst.get(row).end_strickler
             if value == None:
                 return _translate("Frictions", "Not defined")
             return str(value)
 
         return QVariant()
 
-    def headerData(self, friction, orientation, role):
-        if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
-            return table_headers[self._headers[friction]]
-
-        return QVariant()
-
     def setData(self, index, value, role=Qt.EditRole):
         if not index.isValid() or role != Qt.EditRole:
             return False
@@ -157,31 +137,31 @@ class TableModel(QAbstractTableModel):
             if self._headers[column] == "name":
                 self._undo.push(
                     SetNameCommand(
-                        self._frictions, row, value
+                        self._lst, row, value
                     )
                 )
             elif self._headers[column] == "begin_kp":
                 self._undo.push(
                     SetBeginCommand(
-                        self._frictions, row, value
+                        self._lst, row, value
                     )
                 )
             elif self._headers[column] == "end_kp":
                 self._undo.push(
                     SetEndCommand(
-                        self._frictions, row, value
+                        self._lst, row, value
                     )
                 )
             elif self._headers[column] == "begin_strickler":
                 self._undo.push(
                     SetBeginStricklerCommand(
-                        self._frictions, row, self._study.river.strickler(value)
+                        self._lst, row, self._study.river.strickler(value)
                     )
                 )
             elif self._headers[column] == "end_strickler":
                 self._undo.push(
                     SetEndStricklerCommand(
-                        self._frictions, row, self._study.river.strickler(value)
+                        self._lst, row, self._study.river.strickler(value)
                     )
                 )
         except Exception as e:
@@ -196,7 +176,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             AddCommand(
-                self._frictions, row, self._data
+                self._lst, row, self._data
             )
         )
 
@@ -208,7 +188,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             DelCommand(
-                self._frictions, rows
+                self._lst, rows
             )
         )
 
@@ -220,7 +200,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             SortCommand(
-                self._frictions, False
+                self._lst, False
             )
         )
 
@@ -237,7 +217,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo_stack.push(
             MoveCommand(
-                self._frictions, "up", row
+                self._lst, "up", row
             )
         )
 
@@ -245,7 +225,7 @@ class TableModel(QAbstractTableModel):
         self.layoutChanged.emit()
 
     def move_down(self, index, parent=QModelIndex()):
-        if row > len(self._frictions):
+        if row > len(self._lst):
             return
 
         target = row
@@ -254,7 +234,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo_stack.push(
             MoveCommand(
-                self._frictions, "down", row
+                self._lst, "down", row
             )
         )
 
diff --git a/src/View/Frictions/Window.py b/src/View/Frictions/Window.py
index 2a5475281b9e105d700c00bef392223b9dfd2f34..74d96b63de240ba78669362023bd5754a193d9a0 100644
--- a/src/View/Frictions/Window.py
+++ b/src/View/Frictions/Window.py
@@ -47,15 +47,13 @@ from View.Frictions.Table import (
     TableModel, ComboBoxDelegate
 )
 
-from View.Plot.MplCanvas import MplCanvas
+from View.Tools.Plot.PamhyrCanvas import MplCanvas
 from View.Geometry.PlotKPZ import PlotKPZ
 from View.Frictions.PlotStricklers import PlotStricklers
-from View.Frictions.translate import table_headers, retranslate
+from View.Frictions.translate import FrictionsTranslate
 
 from View.Stricklers.Window import StricklersWindow
 
-_translate = QCoreApplication.translate
-
 logger = logging.getLogger()
 
 class FrictionsWindow(PamhyrWindow):
@@ -80,6 +78,7 @@ class FrictionsWindow(PamhyrWindow):
             title = name,
             study = study,
             config = config,
+            trad = FrictionsTranslate(),
             parent = parent
         )
 
@@ -89,17 +88,8 @@ class FrictionsWindow(PamhyrWindow):
 
 
     def setup_table(self):
-        retranslate()
         self._table = {}
 
-        table = self.find(QTableView, f"tableView")
-        self._table = TableModel(
-            data = self._reach,
-            study = self._study,
-            undo = self._undo_stack,
-        )
-        table.setModel(self._table)
-
         self._delegate_stricklers = ComboBoxDelegate(
             data = self._reach,
             study = self._study,
@@ -107,13 +97,23 @@ class FrictionsWindow(PamhyrWindow):
             parent=self
         )
 
-        table.setItemDelegateForColumn(
-            3, self._delegate_stricklers
-        )
-        table.setItemDelegateForColumn(
-            4, self._delegate_stricklers
+        table = self.find(QTableView, f"tableView")
+        self._table = TableModel(
+            table_view = table,
+            table_headers = self._trad.get_dict("table_headers"),
+            editable_headers = [
+                "name", "begin_kp", "end_kp",
+                "begin_strickler", "end_strickler"
+            ],
+            delegates = {
+                "begin_strickler": self._delegate_stricklers,
+                "end_strickler": self._delegate_stricklers,
+            },
+            data = self._reach,
+            undo = self._undo_stack,
+            opt_data = self._study
         )
-
+        table.setModel(self._table)
         table.setSelectionBehavior(QAbstractItemView.SelectRows)
         table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
         table.setAlternatingRowColors(True)
diff --git a/src/View/Frictions/translate.py b/src/View/Frictions/translate.py
index 68bebb96c33e532c3ad6f0e48419dac83f8022e9..1014d8c1ef4b6c6e8b3fbe364b7b67d95a109742 100644
--- a/src/View/Frictions/translate.py
+++ b/src/View/Frictions/translate.py
@@ -18,21 +18,19 @@
 
 from PyQt5.QtCore import QCoreApplication
 
+from View.Tools.PamhyrTranslate import PamhyrTranslate
+
 _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"),
-}
+class FrictionsTranslate(PamhyrTranslate):
+    def __init__(self):
+        super(FrictionsTranslate, self).__init__()
 
-def retranslate():
-    table_headers["name"] = _translate("Frictions", "Name")
-    # table_headers["edge"] = _translate("Frictions", "Reach")
-    table_headers["begin_kp"] = _translate("Frictions", "Begin kp (m)")
-    table_headers["end_kp"] = _translate("Frictions", "End kp (m)")
-    table_headers["begin_strickler"] = _translate("Frictions", "Begin strickler")
-    table_headers["end_strickler"] = _translate("Frictions", "End strickler")
+        self._sub_dict["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 c3ec403cd1016d22ac2c37083513c24db039629c..9df2d45e18834620ff14ce66fb2869ed425722ad 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -48,8 +48,8 @@ from View.Geometry.Window import GeometryWindow
 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.Frictions.Window import FrictionsWindow
+from View.Stricklers.Window import StricklersWindow
+from View.Frictions.Window import FrictionsWindow
 # from View.SedimentLayers.Window import SedimentLayersWindow
 # from View.SedimentLayers.Reach.Window import ReachSedimentLayersWindow
 # from View.SolverParameters.Window import SolverParametersWindow
diff --git a/src/View/Stricklers/Window.py b/src/View/Stricklers/Window.py
index d9128d0050db8647f9bdd112e12ef443c9eea2e3..792ed4e3114690eac33b72f6f069193d9d91787e 100644
--- a/src/View/Stricklers/Window.py
+++ b/src/View/Stricklers/Window.py
@@ -43,7 +43,7 @@ from Model.Stricklers.Stricklers import Stricklers
 
 from View.Stricklers.UndoCommand import PasteCommand
 from View.Stricklers.Table import TableModel
-from View.Stricklers.translate import table_headers, retranslate
+from View.Stricklers.translate import StricklersTranslate
 
 _translate = QCoreApplication.translate
 
@@ -60,6 +60,7 @@ class StricklersWindow(PamhyrWindow):
             title = name,
             study = study,
             config = config,
+            trad = StricklersTranslate(),
             parent = parent
         )
 
@@ -67,7 +68,6 @@ class StricklersWindow(PamhyrWindow):
         self.setup_connections()
 
     def setup_table(self):
-        retranslate()
         self._table = {}
 
         for t in ["app", "study"]:
@@ -79,7 +79,7 @@ class StricklersWindow(PamhyrWindow):
 
             self._table[t] = TableModel(
                 table_view = table,
-                table_headers = table_headers,
+                table_headers = self._trad.get_dict("table_headers"),
                 editable_headers = ["name", "comment", "minor", "medium"],
                 data = data,
                 undo = self._undo_stack,
diff --git a/src/View/Stricklers/translate.py b/src/View/Stricklers/translate.py
index 9102ac6d016a5151e33498ccd74592c195ee78e4..489094cf0f99c9fce1b3f5721a03920b57f8f1c3 100644
--- a/src/View/Stricklers/translate.py
+++ b/src/View/Stricklers/translate.py
@@ -18,21 +18,18 @@
 
 from PyQt5.QtCore import QCoreApplication
 
-from Model.LateralContribution.LateralContributionTypes import (
-    NotDefined, LateralContrib, Rain, Evaporation,
-)
+from View.Tools.PamhyrTranslate import PamhyrTranslate
 
 _translate = QCoreApplication.translate
 
-table_headers = {
-    "name": _translate("LateralContribution", "Name"),
-    "minor": _translate("LateralContribution", "Minor bed"),
-    "medium": _translate("LateralContribution", "Medium bed"),
-    "comment": _translate("LateralContribution", "Comment"),
-}
 
-def retranslate():
-    table_headers["name"] = _translate("LateralContribution", "Name")
-    table_headers["minor"] = _translate("LateralContribution", "Minor bed")
-    table_headers["medium"] = _translate("LateralContribution", "Medium bed")
-    table_headers["comment"] = _translate("LateralContribution", "Comment")
+class StricklersTranslate(PamhyrTranslate):
+    def __init__(self):
+        super(StricklersTranslate, self).__init__()
+
+        self._sub_dict["table_headers"] = {
+            "name": _translate("LateralContribution", "Name"),
+            "minor": _translate("LateralContribution", "Minor bed"),
+            "medium": _translate("LateralContribution", "Medium bed"),
+            "comment": _translate("LateralContribution", "Comment"),
+        }