diff --git a/src/View/BoundaryCondition/Edit/Table.py b/src/View/BoundaryCondition/Edit/Table.py
index 6536bd0d14a7e948e1f157a603ca6299da89c9b9..8850ec4681c84a35c2b133e6fc14d08f08f4aa1b 100644
--- a/src/View/BoundaryCondition/Edit/Table.py
+++ b/src/View/BoundaryCondition/Edit/Table.py
@@ -25,6 +25,7 @@ from tools import trace, timer
 
 from View.ASubWindow import ASubMainWindow, AWidget
 from View.ListedSubWindow import ListedSubWindow
+from View.Tools.PamhyrTable import PamhyrTableModel
 
 from PyQt5.QtCore import (
     Qt, QVariant, QAbstractTableModel,
@@ -152,26 +153,7 @@ class ExTimeDelegate(QItemDelegate):
         self.commitData.emit(self.sender())
 
 
-class TableModel(QAbstractTableModel):
-    def __init__(self, data=None, mode="time", undo=None):
-        super(QAbstractTableModel, self).__init__()
-        self._headers = data.header
-        self._data = data
-        self._mode = mode
-        self._undo = undo
-
-    def flags(self, index):
-        options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
-        options |= Qt.ItemIsEditable
-
-        return options
-
-    def rowCount(self, parent):
-        return len(self._data)
-
-    def columnCount(self, parent):
-        return len(self._headers)
-
+class TableModel(PamhyrTableModel):
     def data(self, index, role):
         if role == Qt.TextAlignmentRole:
             return Qt.AlignHCenter | Qt.AlignVCenter
@@ -189,7 +171,7 @@ class TableModel(QAbstractTableModel):
             if self._data.get_type_column(column) == float:
                 value = f"{v:.4f}"
             elif self._data.header[column] == "time":
-                if self._mode == "time":
+                if self._opt_data == "time":
                     t0 = datetime.fromtimestamp(0)
                     t = datetime.fromtimestamp(v)
                     value = str(t - t0)
@@ -200,12 +182,6 @@ class TableModel(QAbstractTableModel):
 
         return value
 
-    def headerData(self, section, orientation, role):
-        if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
-            return table_headers[self._headers[section]]
-
-        return QVariant()
-
     def setData(self, index, value, role=Qt.EditRole):
         if not index.isValid() or role != Qt.EditRole:
             return False
@@ -315,12 +291,3 @@ class TableModel(QAbstractTableModel):
 
         self.layoutAboutToBeChanged.emit()
         self.layoutChanged.emit()
-
-
-    def undo(self):
-        self._undo.undo()
-        self.layoutChanged.emit()
-
-    def redo(self):
-        self._undo.redo()
-        self.layoutChanged.emit()
diff --git a/src/View/BoundaryCondition/Edit/Window.py b/src/View/BoundaryCondition/Edit/Window.py
index 7f35759f99bd966624aa0a5ee4a33675eac6803d..180eb11b655c2a598d104e35e0d8d993bbd4c9f0 100644
--- a/src/View/BoundaryCondition/Edit/Window.py
+++ b/src/View/BoundaryCondition/Edit/Window.py
@@ -16,6 +16,8 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+
 from tools import timer, trace
 
 from View.ASubWindow import ASubMainWindow, AWidget
@@ -42,12 +44,15 @@ from View.Plot.MplCanvas import MplCanvas
 from View.Plot.navigation_toolbar_2qt import PamHyrNavigationToolbar2QT
 
 from View.BoundaryCondition.translate import long_types
+from View.BoundaryCondition.Edit.translate import table_headers
 from View.BoundaryCondition.Edit.UndoCommand import SetMetaDataCommand
 from View.BoundaryCondition.Edit.Table import TableModel, ExTimeDelegate
 from View.BoundaryCondition.Edit.Plot import Plot
 
 _translate = QCoreApplication.translate
 
+logger = logging.getLogger()
+
 class WD50Sigma(AWidget):
     d50Changed = pyqtSignal(float)
     sigmaChanged = pyqtSignal(float)
@@ -141,24 +146,29 @@ class EditBoundaryConditionWindow(ASubMainWindow, ListedSubWindow):
             self._d50sigma.set_sigma(self._data.sigma)
 
     def setup_table(self):
+        headers = {}
+        for h in self._data.header:
+            headers[h] = table_headers[h]
+
+        self._delegate_time = ExTimeDelegate(
+            data = self._data,
+            mode = self._study.time_system,
+            parent = self
+        )
+
         table = self.find(QTableView, "tableView")
         self._table = TableModel(
+            table_view = table,
+            table_headers = headers,
+            editable_headers = self._data.header,
+            delegates = {
+                "time": self._delegate_time,
+            },
             data = self._data,
             undo = self._undo_stack,
-            mode = self._study.time_system
+            opt_data = self._study.time_system
         )
 
-        if self._data.header[0] == "time":
-            self._delegate_time = ExTimeDelegate(
-                data = self._data,
-                mode = self._study.time_system,
-                parent = self
-            )
-
-            table.setItemDelegateForColumn(
-                0, self._delegate_time
-            )
-
         table.setModel(self._table)
         table.setSelectionBehavior(QAbstractItemView.SelectRows)
         table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
diff --git a/src/View/BoundaryCondition/Table.py b/src/View/BoundaryCondition/Table.py
index fd39a13aff69623acbfe805d358d8824cbc23b99..377d9aab41c6cec5dd78ea8bb2f085ad89c94d32 100644
--- a/src/View/BoundaryCondition/Table.py
+++ b/src/View/BoundaryCondition/Table.py
@@ -39,6 +39,8 @@ from Model.BoundaryCondition.BoundaryConditionTypes import (
     TimeOverZ, TimeOverDischarge, ZOverDischarge
 )
 
+from View.Tools.PamhyrTable import PamhyrTableModel
+
 from View.BoundaryCondition.UndoCommand import (
     SetNameCommand, SetNodeCommand, SetTypeCommand,
     AddCommand, DelCommand, SortCommand,
@@ -104,26 +106,13 @@ class ComboBoxDelegate(QItemDelegate):
         self.commitData.emit(self.sender())
 
 
-class TableModel(QAbstractTableModel):
-    def __init__(self, data=None, undo=None, tab=""):
-        super(QAbstractTableModel, self).__init__()
-        self._headers = list(table_headers.keys())
-        self._data = data
-        self._undo = undo
-        self._tab = tab
-        self._bcs = self._data.boundary_condition
-
-    def flags(self, index):
-        options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
-        options |= Qt.ItemIsEditable
-
-        return options
+class TableModel(PamhyrTableModel):
+    def _setup_lst(self):
+        self._lst = self._data.boundary_condition
+        self._tab = self._opt_data
 
     def rowCount(self, parent):
-        return self._bcs.len(self._tab)
-
-    def columnCount(self, parent):
-        return len(self._headers)
+        return self._lst.len(self._tab)
 
     def data(self, index, role):
         if role != Qt.ItemDataRole.DisplayRole:
@@ -133,24 +122,18 @@ class TableModel(QAbstractTableModel):
         column = index.column()
 
         if self._headers[column] == "name":
-            return self._bcs.get(self._tab, row).name
+            return self._lst.get(self._tab, row).name
         elif self._headers[column] == "type":
-            t = self._bcs.get(self._tab, row).bctype
+            t = self._lst.get(self._tab, row).bctype
             return long_types[t]
         elif self._headers[column] == "node":
-            n = self._bcs.get(self._tab, row).node
+            n = self._lst.get(self._tab, row).node
             if n is None:
                 return _translate("BoundaryCondition", "Not associate")
             return n.name
 
         return QVariant()
 
-    def headerData(self, section, orientation, role):
-        if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
-            return table_headers[self._headers[section]]
-
-        return QVariant()
-
     def setData(self, index, value, role=Qt.EditRole):
         if not index.isValid() or role != Qt.EditRole:
             return False
@@ -162,20 +145,20 @@ class TableModel(QAbstractTableModel):
             if self._headers[column] == "name":
                 self._undo.push(
                     SetNameCommand(
-                        self._bcs, self._tab,row, value
+                        self._lst, self._tab,row, value
                     )
                 )
             elif self._headers[column] == "type":
                 key = next(k for k, v in long_types.items() if v == value)
                 self._undo.push(
                     SetTypeCommand(
-                        self._bcs, self._tab,row, BC_types[key]
+                        self._lst, self._tab,row, BC_types[key]
                     )
                 )
             elif self._headers[column] == "node":
                 self._undo.push(
                     SetNodeCommand(
-                        self._bcs, self._tab,row, self._data.node(value)
+                        self._lst, self._tab,row, self._data.node(value)
                     )
                 )
         except Exception as e:
@@ -190,7 +173,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             AddCommand(
-                self._bcs, self._tab,row
+                self._lst, self._tab,row
             )
         )
 
@@ -202,7 +185,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             DelCommand(
-                self._bcs, self._tab,rows
+                self._lst, self._tab, rows
             )
         )
 
@@ -214,7 +197,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             SortCommand(
-                self._bcs, self._tab,False
+                self._lst, self._tab, False
             )
         )
 
@@ -231,7 +214,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo_stack.push(
             MoveCommand(
-                self._bcs, self._tab,"up", row
+                self._lst, self._tab, "up", row
             )
         )
 
@@ -239,7 +222,7 @@ class TableModel(QAbstractTableModel):
         self.layoutChanged.emit()
 
     def move_down(self, index, parent=QModelIndex()):
-        if row > len(self._bcs):
+        if row > len(self._lst):
             return
 
         target = row
@@ -248,7 +231,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo_stack.push(
             MoveCommand(
-                self._bcs, self._tab,"down", row
+                self._lst, self._tab, "down", row
             )
         )
 
diff --git a/src/View/BoundaryCondition/Window.py b/src/View/BoundaryCondition/Window.py
index a2853590260278704db9f768cd50a8e6f17cc1cd..09372dcabed1de2b6d9a8f9af29a583f74346937 100644
--- a/src/View/BoundaryCondition/Window.py
+++ b/src/View/BoundaryCondition/Window.py
@@ -93,14 +93,6 @@ class BoundaryConditionWindow(ASubMainWindow, ListedSubWindow):
         self._table = {}
 
         for t in ["liquid", "solid", "suspenssion"]:
-            table = self.find(QTableView, f"tableView_{t}")
-            self._table[t] = TableModel(
-                data = self._study.river,
-                undo = self._undo_stack,
-                tab = t,
-            )
-            table.setModel(self._table[t])
-
             self._delegate_type = ComboBoxDelegate(
                 data = self._study.river,
                 mode = "type",
@@ -114,13 +106,20 @@ class BoundaryConditionWindow(ASubMainWindow, ListedSubWindow):
                 parent=self
             )
 
-            table.setItemDelegateForColumn(
-                1, self._delegate_type
-            )
-            table.setItemDelegateForColumn(
-                2, self._delegate_node
+            table = self.find(QTableView, f"tableView_{t}")
+            self._table[t] = TableModel(
+                table_view = table,
+                table_headers = table_headers,
+                editable_headers = ["name", "type", "node"],
+                delegates = {
+                    "type": self._delegate_type,
+                    "node": self._delegate_node,
+                },
+                data = self._study.river,
+                undo = self._undo_stack,
+                opt_data = t,
             )
-
+            table.setModel(self._table[t])
             table.setSelectionBehavior(QAbstractItemView.SelectRows)
             table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
             table.setAlternatingRowColors(True)
diff --git a/src/View/Tools/PamhyrTable.py b/src/View/Tools/PamhyrTable.py
index 8d266ca2eb3dc5243fee205d4918ea192b761fc1..44e765e70b33ed825d6d2ec2a7fd89f544adb8f5 100644
--- a/src/View/Tools/PamhyrTable.py
+++ b/src/View/Tools/PamhyrTable.py
@@ -80,7 +80,8 @@ class PamhyrTableModel(QAbstractTableModel):
                  editable_headers=[],
                  delegates = {},
                  data=None,
-                 undo=None):
+                 undo=None,
+                 opt_data=None):
         super(PamhyrTableModel, self).__init__()
 
         self._table_view = table_view
@@ -91,6 +92,7 @@ class PamhyrTableModel(QAbstractTableModel):
         self._delegates = delegates
 
         self._data = data
+        self._opt_data = opt_data
         self._undo = undo
         self._lst = []
 
@@ -98,7 +100,7 @@ class PamhyrTableModel(QAbstractTableModel):
         self._setup_lst()
 
     def _setup_lst(self):
-        self._lst = self.data
+        self._lst = self._data
 
     def flags(self, index):
         column = index.column()
@@ -135,18 +137,3 @@ class PamhyrTableModel(QAbstractTableModel):
     def redo(self):
         self._undo.redo()
         self.layoutChanged.emit()
-
-    def add(self, row, parent=QModelIndex()):
-        raise NotImplementedMethodeError(self, self.add)
-
-    def delete(self, rows, parent=QModelIndex()):
-        raise NotImplementedMethodeError(self, self.delete)
-
-    def sort(self, _reverse, parent=QModelIndex()):
-        raise NotImplementedMethodeError(self, self.sort)
-
-    def move_up(self, row, parent=QModelIndex()):
-        raise NotImplementedMethodeError(self, self.move_up)
-
-    def move_down(self, index, parent=QModelIndex()):
-        raise NotImplementedMethodeError(self, self.move_down)