diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 20ab32e227b131f075b52041ab17b624a6823b42..9fee3a7618be14ccf7bbd19cdc52fc276a468683 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -51,7 +51,7 @@ from View.InitialConditions.Window import InitialConditionsWindow
 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.SedimentLayers.Reach.Window import ReachSedimentLayersWindow
 # from View.SolverParameters.Window import SolverParametersWindow
 # from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow
 # from View.CheckList.Window import CheckListWindow
diff --git a/src/View/SedimentLayers/Reach/Plot.py b/src/View/SedimentLayers/Reach/Plot.py
index a312a8ceea6ffd9784cd8d56b83781f029250063..069a09d711c667e0882e89599be3a8726bcb48a5 100644
--- a/src/View/SedimentLayers/Reach/Plot.py
+++ b/src/View/SedimentLayers/Reach/Plot.py
@@ -5,7 +5,7 @@ import logging
 from functools import reduce
 
 from tools import timer
-from View.Plot.APlot import APlot
+from View.Tools.PamhyrPlot import PamhyrPlot
 
 from PyQt5.QtCore import (
     QCoreApplication
@@ -15,13 +15,16 @@ _translate = QCoreApplication.translate
 
 logger = logging.getLogger()
 
-class Plot(APlot):
-    def __init__(self, canvas=None, data=None, toolbar=None,
-                 display_current=True):
+class Plot(PamhyrPlot):
+    def __init__(self, data=None, display_current=True,
+                 canvas=None, trad=None, toolbar=None,
+                 parent=None):
         super(Plot, self).__init__(
-            canvas=canvas,
-            data=data,
-            toolbar=toolbar
+            canvas = canvas,
+            trad = trad,
+            data = data,
+            toolbar = toolbar,
+            parent = parent
         )
 
         self._display_current = display_current
@@ -41,11 +44,11 @@ class Plot(APlot):
             return
 
         self.canvas.axes.set_xlabel(
-            _translate("MainWindow_reach", "Kp (m)"),
+            self._trad["kp"],
             color='green', fontsize=12
         )
         self.canvas.axes.set_ylabel(
-            _translate("MainWindow_reach", "Height (m)"),
+            self._trad["height"],
             color='green', fontsize=12
         )
 
diff --git a/src/View/SedimentLayers/Reach/Profile/Plot.py b/src/View/SedimentLayers/Reach/Profile/Plot.py
index 50b4bba26c40ebaf4b10c04bbe82d9184407396d..01b2fe245b1e01bb73080ef5e403b4deec3b2128 100644
--- a/src/View/SedimentLayers/Reach/Profile/Plot.py
+++ b/src/View/SedimentLayers/Reach/Profile/Plot.py
@@ -5,7 +5,7 @@ import logging
 from functools import reduce
 
 from tools import timer
-from View.Plot.APlot import APlot
+from View.Tools.PamhyrPlot import PamhyrPlot
 
 from PyQt5.QtCore import (
     QCoreApplication
@@ -15,13 +15,16 @@ _translate = QCoreApplication.translate
 
 logger = logging.getLogger()
 
-class Plot(APlot):
-    def __init__(self, canvas=None, data=None, toolbar=None,
-                 display_current=True):
+class Plot(PamhyrPlot):
+    def __init__(self, data=None, display_current=True,
+                 canvas=None, trad=None, toolbar=None,
+                 parent=None):
         super(Plot, self).__init__(
-            canvas=canvas,
-            data=data,
-            toolbar=toolbar
+            canvas = canvas,
+            trad = trad,
+            data = data,
+            toolbar = toolbar,
+            parent = parent
         )
 
         self._display_current = display_current
diff --git a/src/View/SedimentLayers/Reach/Profile/Table.py b/src/View/SedimentLayers/Reach/Profile/Table.py
index 102bec3274033651495cb25ab06f78ff4517c3e8..3550940b50659715965d0d211593ff0071b14b03 100644
--- a/src/View/SedimentLayers/Reach/Profile/Table.py
+++ b/src/View/SedimentLayers/Reach/Profile/Table.py
@@ -20,6 +20,8 @@ from PyQt5.QtWidgets import (
 from View.SedimentLayers.Reach.Profile.UndoCommand import *
 from View.SedimentLayers.Reach.Profile.translate import *
 
+from View.Tools.PamhyrTable import PamhyrTableModel
+
 _translate = QCoreApplication.translate
 
 logger = logging.getLogger()
@@ -67,28 +69,10 @@ class ComboBoxDelegate(QItemDelegate):
         self.commitData.emit(self.sender())
 
 
-class TableModel(QAbstractTableModel):
-    def __init__(self, study=None, profile=None, undo=None):
-        super(QAbstractTableModel, self).__init__()
-        self._headers = list(table_headers.keys())
-        self._study = study
-        self._undo = undo
-        self._profile = profile
-
-    def flags(self, index):
-        column = index.column()
-
-        options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
-        if self._headers[column] == "sl":
-            options |= Qt.ItemIsEditable
-
-        return options
-
-    def rowCount(self, parent):
-        return self._profile.number_points
-
-    def columnCount(self, parent):
-        return len(self._headers)
+class TableModel(PamhyrTableModel):
+    def _setup_lst(self):
+        self._lst = self._data
+        self._study = self._opt_data
 
     def data(self, index, role):
         if role != Qt.ItemDataRole.DisplayRole:
@@ -98,25 +82,19 @@ class TableModel(QAbstractTableModel):
         column = index.column()
 
         if self._headers[column] == "name":
-            return self._profile.point(row).name
+            return self._data.point(row).name
         elif self._headers[column] == "sl":
-            value = self._profile.point(row).sl
+            value = self._data.point(row).sl
             if value == None:
                 text = _translate("SedimentLayers", "Not defined")
                 return text
             return str(value)
         elif self._headers[column] == "x":
-            return self._profile.point(row).x
+            return self._data.point(row).x
         elif self._headers[column] == "y":
-            return self._profile.point(row).y
+            return self._data.point(row).y
         elif self._headers[column] == "z":
-            return self._profile.point(row).z
-
-        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 self._data.point(row).z
 
         return QVariant()
 
@@ -139,7 +117,7 @@ class TableModel(QAbstractTableModel):
 
             self._undo.push(
                 SetSLCommand(
-                    self._profile, row, new
+                    self._data, row, new
                 )
             )
 
diff --git a/src/View/SedimentLayers/Reach/Profile/Window.py b/src/View/SedimentLayers/Reach/Profile/Window.py
index f424e06a8a3b64fab29a186d3af6463be448d362..e2c2464b0ffe8a23c278cafc6098ffe264bf33d9 100644
--- a/src/View/SedimentLayers/Reach/Profile/Window.py
+++ b/src/View/SedimentLayers/Reach/Profile/Window.py
@@ -27,10 +27,10 @@ from View.SedimentLayers.Reach.Profile.UndoCommand import *
 from View.SedimentLayers.Reach.Profile.Table import *
 from View.SedimentLayers.Reach.Profile.Plot import Plot
 
-from View.Plot.MplCanvas import MplCanvas
-from View.Plot.PamhyrToolbar import PamhyrPlotToolbar
+from View.Tools.Plot.PamhyrCanvas import MplCanvas
+from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
 
-from View.SedimentLayers.Reach.Profile.translate import table_headers, retranslate
+from View.SedimentLayers.Reach.Profile.translate import SedimentProfileTranslate
 from View.SedimentLayers.Window import SedimentLayersWindow
 
 _translate = QCoreApplication.translate
@@ -52,7 +52,8 @@ class ProfileSedimentLayersWindow(PamhyrWindow):
             title = name,
             study = study,
             config = config,
-            parent=parent
+            trad = SedimentProfileTranslate(),
+            parent = parent
         )
 
         self.setup_table()
@@ -80,26 +81,25 @@ class ProfileSedimentLayersWindow(PamhyrWindow):
         )
 
     def setup_table(self):
-        retranslate()
+        table_headers = self._trad.get_dict("table_headers")
 
-        table = self.find(QTableView, f"tableView")
-        self._table = TableModel(
-            study = self._study,
-            profile = self._profile,
-            undo = self._undo_stack,
-        )
-        table.setModel(self._table)
-
-        self._delegate_stricklers = ComboBoxDelegate(
+        self._delegate_sl = ComboBoxDelegate(
             study = self._study,
             parent=self
         )
 
-        table.setItemDelegateForColumn(
-            list(table_headers).index("sl"),
-            self._delegate_stricklers
+        table = self.find(QTableView, f"tableView")
+        self._table = TableModel(
+            table_view = table,
+            data = self._profile,
+            opt_data = self._study,
+            table_headers = table_headers,
+            editable_headers = ["sl"],
+            delegates = {"sl": self._delegate_sl},
+            trad = self._trad,
+            undo = self._undo_stack,
         )
-
+        table.setModel(self._table)
         table.setSelectionBehavior(QAbstractItemView.SelectRows)
         table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
         table.setAlternatingRowColors(True)
diff --git a/src/View/SedimentLayers/Reach/Profile/translate.py b/src/View/SedimentLayers/Reach/Profile/translate.py
index da256cbed561b7780ac2aae1969992e1b1c1d45c..b1c124051a5d108edd2f4f7af475acfcfad39019 100644
--- a/src/View/SedimentLayers/Reach/Profile/translate.py
+++ b/src/View/SedimentLayers/Reach/Profile/translate.py
@@ -2,19 +2,18 @@
 
 from PyQt5.QtCore import QCoreApplication
 
+from View.SedimentLayers.Reach.translate import SedimentReachTranslate
+
 _translate = QCoreApplication.translate
 
-table_headers = {
-    "x": _translate("SedimentLayers", "X (m)"),
-    "y": _translate("SedimentLayers", "Y (m)"),
-    "z": _translate("SedimentLayers", "Z (m)"),
-    "name": _translate("SedimentLayers", "Name"),
-    "sl": _translate("SedimentLayers", "Sediment layers"),
-}
+class SedimentProfileTranslate(SedimentReachTranslate):
+    def __init__(self):
+        super(SedimentProfileTranslate, self).__init__()
 
-def retranslate():
-    table_headers["x"] = _translate("SedimentLayers", "X (m)")
-    table_headers["y"] = _translate("SedimentLayers", "Y (m)")
-    table_headers["z"] = _translate("SedimentLayers", "Z (m)")
-    table_headers["name"] = _translate("SedimentLayers", "Name")
-    table_headers["sl"] = _translate("SedimentLayers", "Sediment layers")
+        self._sub_dict["table_headers"] = {
+            "x": _translate("SedimentLayers", "X (m)"),
+            "y": _translate("SedimentLayers", "Y (m)"),
+            "z": _translate("SedimentLayers", "Z (m)"),
+            "name": _translate("SedimentLayers", "Name"),
+            "sl": _translate("SedimentLayers", "Sediment layers"),
+        }
diff --git a/src/View/SedimentLayers/Reach/Table.py b/src/View/SedimentLayers/Reach/Table.py
index 8fdb8d7e87099902ccab21d6799edf3a1f65e8ae..250a47357f634aea59121c5761e8453923cef8aa 100644
--- a/src/View/SedimentLayers/Reach/Table.py
+++ b/src/View/SedimentLayers/Reach/Table.py
@@ -18,23 +18,25 @@ from PyQt5.QtWidgets import (
 )
 
 from View.SedimentLayers.Reach.UndoCommand import *
-from View.SedimentLayers.Reach.translate import *
+
+from View.Tools.PamhyrTable import PamhyrTableModel
 
 _translate = QCoreApplication.translate
 
 logger = logging.getLogger()
 
 class ComboBoxDelegate(QItemDelegate):
-    def __init__(self, study=None, parent=None):
+    def __init__(self, study=None, trad=None, parent=None):
         super(ComboBoxDelegate, self).__init__(parent)
 
         self._study = study
+        self._trad = trad
 
     def createEditor(self, parent, option, index):
         self.editor = QComboBox(parent)
 
         self.editor.addItems(
-            [_translate("SedimentLayers", "Not defined")] +
+            [self._trad["nd"]] +
             list(
                 map(
                     lambda sl: str(sl),
@@ -67,28 +69,10 @@ class ComboBoxDelegate(QItemDelegate):
         self.commitData.emit(self.sender())
 
 
-class TableModel(QAbstractTableModel):
-    def __init__(self, study=None, reach=None, undo=None):
-        super(QAbstractTableModel, self).__init__()
-        self._headers = list(table_headers.keys())
-        self._study = study
-        self._undo = undo
-        self._reach = reach
-
-    def flags(self, index):
-        column = index.column()
-
-        options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
-        if self._headers[column] == "sl":
-            options |= Qt.ItemIsEditable
-
-        return options
-
-    def rowCount(self, parent):
-        return self._reach.number_profiles
-
-    def columnCount(self, parent):
-        return len(self._headers)
+class TableModel(PamhyrTableModel):
+    def _setup_lst(self):
+        self._lst = self._data
+        self._study = self._opt_data
 
     def data(self, index, role):
         if role != Qt.ItemDataRole.DisplayRole:
@@ -98,11 +82,11 @@ class TableModel(QAbstractTableModel):
         column = index.column()
 
         if self._headers[column] == "name":
-            return self._reach.profile(row).name
+            return self._data.profile(row).name
         if self._headers[column] == "kp":
-            return self._reach.profile(row).kp
+            return self._data.profile(row).kp
         if self._headers[column] == "sl":
-            value = self._reach.profile(row).sl
+            value = self._data.profile(row).sl
             if value == None:
                 text = _translate("SedimentLayers", "Not defined")
                 return text
@@ -110,12 +94,6 @@ class TableModel(QAbstractTableModel):
 
         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
@@ -135,7 +113,7 @@ class TableModel(QAbstractTableModel):
 
             self._undo.push(
                 SetSLCommand(
-                    self._reach, row, new
+                    self._data, row, new
                 )
             )
 
@@ -145,7 +123,7 @@ class TableModel(QAbstractTableModel):
     def apply_sl_each_profile(self, sl):
         self._undo.push(
             ApplySLCommand(
-                self._reach, sl
+                self._data, sl
             )
         )
         self.layoutChanged.emit()
diff --git a/src/View/SedimentLayers/Reach/Window.py b/src/View/SedimentLayers/Reach/Window.py
index 2a655b7c3c7d7bbfcc2b57d28c25aad741838c32..829bf035b39d2b073c62044ecd2785f125d6d534 100644
--- a/src/View/SedimentLayers/Reach/Window.py
+++ b/src/View/SedimentLayers/Reach/Window.py
@@ -28,10 +28,10 @@ from View.SedimentLayers.Reach.Table import *
 from View.SedimentLayers.Reach.Plot import Plot
 from View.SedimentLayers.Reach.SLDialog import SLDialog
 
-from View.Plot.MplCanvas import MplCanvas
-from View.Plot.PamhyrToolbar import PamhyrPlotToolbar
+from View.Tools.Plot.PamhyrCanvas import MplCanvas
+from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
 
-from View.SedimentLayers.Reach.translate import table_headers, retranslate
+from View.SedimentLayers.Reach.translate import SedimentReachTranslate
 from View.SedimentLayers.Window import SedimentLayersWindow
 from View.SedimentLayers.Reach.Profile.Window import ProfileSedimentLayersWindow
 
@@ -57,39 +57,40 @@ class ReachSedimentLayersWindow(PamhyrWindow):
             title = name,
             study = study,
             config = config,
+            trad = SedimentReachTranslate(),
             parent = parent
         )
 
         self.setup_table()
-        self.setup_graph()
+        self.setup_plot()
         self.setup_connections()
 
     def setup_table(self):
-        retranslate()
+        table_headers = self._trad.get_dict("table_headers")
 
-        table = self.find(QTableView, f"tableView")
-        self._table = TableModel(
-            study = self._study,
-            reach = self._reach,
-            undo = self._undo_stack,
-        )
-        table.setModel(self._table)
-
-        self._delegate_stricklers = ComboBoxDelegate(
+        self._delegate_sl = ComboBoxDelegate(
             study = self._study,
+            trad = self._trad,
             parent=self
         )
 
-        table.setItemDelegateForColumn(
-            list(table_headers).index("sl"),
-            self._delegate_stricklers
+        table = self.find(QTableView, f"tableView")
+        self._table = TableModel(
+            table_view = table,
+            data = self._reach,
+            opt_data = self._study,
+            table_headers = table_headers,
+            editable_headers = ["sl"],
+            delegates = {"sl": self._delegate_sl},
+            trad = self._trad,
+            undo = self._undo_stack,
         )
-
+        table.setModel(self._table)
         table.setSelectionBehavior(QAbstractItemView.SelectRows)
         table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
         table.setAlternatingRowColors(True)
 
-    def setup_graph(self):
+    def setup_plot(self):
         self.canvas = MplCanvas(width=5, height=4, dpi=100)
         self.canvas.setObjectName("canvas")
         self.toolbar = PamhyrPlotToolbar(
@@ -106,6 +107,7 @@ class ReachSedimentLayersWindow(PamhyrWindow):
             canvas = self.canvas,
             data = self._reach,
             toolbar = self.toolbar,
+            trad = self._trad,
             display_current = False
         )
         self.plot.draw()
diff --git a/src/View/SedimentLayers/Reach/translate.py b/src/View/SedimentLayers/Reach/translate.py
index ef45f0766c14b9a885d5959bbd52ca6774608aba..34785f32b691f759a8cbb918ca06db71ecd1be4c 100644
--- a/src/View/SedimentLayers/Reach/translate.py
+++ b/src/View/SedimentLayers/Reach/translate.py
@@ -2,15 +2,20 @@
 
 from PyQt5.QtCore import QCoreApplication
 
+from View.SedimentLayers.translate import SedimentTranslate
+
 _translate = QCoreApplication.translate
 
-table_headers = {
-    "name": _translate("SedimentLayers", "Name"),
-    "kp": _translate("SedimentLayers", "KP (m)"),
-    "sl": _translate("SedimentLayers", "Sediment layers"),
-}
+class SedimentReachTranslate(SedimentTranslate):
+    def __init__(self):
+        super(SedimentReachTranslate, self).__init__()
+
+        self._dict["nd"] = _translate("SedimentLayers", "Not defined")
+        self._dict["kp"] = _translate("SedimentLayers", "Kp (m)")
+        self._dict["height"] = _translate("SedimentLayers", "Height (m)")
 
-def retranslate():
-    table_headers["name"] = _translate("SedimentLayers", "Name")
-    table_headers["kp"] = _translate("SedimentLayers", "KP (m)")
-    table_headers["sl"] = _translate("SedimentLayers", "Sediment layers")
+        self._sub_dict["table_headers"] = {
+            "name": _translate("SedimentLayers", "Name"),
+            "kp": _translate("SedimentLayers", "KP (m)"),
+            "sl": _translate("SedimentLayers", "Sediment layers"),
+        }