diff --git a/src/View/InitialConditions/DialogDischarge.py b/src/View/InitialConditions/DialogDischarge.py
index 7bbe8abd81324948bf19ef5479367b57c40b0f3b..7be75bafe17e745fe6db0339499dd835fed3ee6a 100644
--- a/src/View/InitialConditions/DialogDischarge.py
+++ b/src/View/InitialConditions/DialogDischarge.py
@@ -37,7 +37,7 @@ class DischargeDialog(PamhyrDialog):
 
     def __init__(self, title="Discharge", parent=None):
         super(DischargeDialog, self).__init__(
-            title = _pamhyr_name,
+            title = self._pamhyr_name,
             options = [],
             parent = parent
         )
diff --git a/src/View/InitialConditions/DialogHeight.py b/src/View/InitialConditions/DialogHeight.py
index 9ccadbd6126bacb0809624b678606205c43dd5eb..8a2a3c122667779e78054cd22fed7b32e3accc30 100644
--- a/src/View/InitialConditions/DialogHeight.py
+++ b/src/View/InitialConditions/DialogHeight.py
@@ -37,7 +37,7 @@ class HeightDialog(PamhyrDialog):
 
     def __init__(self, parent=None):
         super(HeightDialog, self).__init__(
-            title = name,
+            title = self._pamhyr_name,
             options = [],
             parent = parent
         )
diff --git a/src/View/InitialConditions/PlotDKP.py b/src/View/InitialConditions/PlotDKP.py
index 58a83219e3afea0ccc3672433ded6550a080f17e..d604179a0082760d8ae98f0b33b19478b66b5330 100644
--- a/src/View/InitialConditions/PlotDKP.py
+++ b/src/View/InitialConditions/PlotDKP.py
@@ -17,7 +17,7 @@
 # -*- coding: utf-8 -*-
 
 from tools import timer
-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 PlotDKP(APlot):
-    def __init__(self, canvas=None, data=None, toolbar=None):
-        super(PlotDKP, self).__init__(
-            canvas=canvas,
-            data=data,
-            toolbar=toolbar
-        )
-
+class PlotDKP(PamhyrPlot):
     @timer
     def draw(self, highlight=None):
         self.canvas.axes.cla()
@@ -42,11 +35,11 @@ class PlotDKP(APlot):
             return
 
         self.canvas.axes.set_ylabel(
-            _translate("MainWindow_reach", "Elevation (m)"),
+            self._trad["elevation"],
             color='green', fontsize=11
         )
         self.canvas.axes.set_xlabel(
-            _translate("MainWindow_reach", "KP (m)"),
+            self._trad["kp"],
             color='green', fontsize=11
         )
 
diff --git a/src/View/InitialConditions/PlotDischarge.py b/src/View/InitialConditions/PlotDischarge.py
index 1fe05defc0abfe05d64b17bae5c2f79e515a3ac6..1ad2a266eb0c9e2a59acb06e07dbc16566596ffb 100644
--- a/src/View/InitialConditions/PlotDischarge.py
+++ b/src/View/InitialConditions/PlotDischarge.py
@@ -17,22 +17,9 @@
 # -*- coding: utf-8 -*-
 
 from tools import timer
-from View.Plot.APlot import APlot
-
-from PyQt5.QtCore import (
-    QCoreApplication
-)
-
-_translate = QCoreApplication.translate
-
-class PlotDischarge(APlot):
-    def __init__(self, canvas=None, data=None, toolbar=None):
-        super(PlotDischarge, self).__init__(
-            canvas=canvas,
-            data=data,
-            toolbar=toolbar
-        )
+from View.Tools.PamhyrPlot import PamhyrPlot
 
+class PlotDischarge(PamhyrPlot):
     @timer
     def draw(self, highlight=None):
         self.canvas.axes.cla()
@@ -42,11 +29,11 @@ class PlotDischarge(APlot):
             return
 
         self.canvas.axes.set_ylabel(
-            _translate("MainWindow_reach", "Discharge (m^3/s)"),
+            self._trad["discharge"],
             color='green', fontsize=11
         )
         self.canvas.axes.set_xlabel(
-            _translate("MainWindow_reach", "KP (m)"),
+            self._trad["kp"],
             color='green', fontsize=11
         )
 
diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py
index 5e704ba921635b633a2c947cc0b922d8bfaa422d..f7ad1020cb4827d407180e3bcb4000227101d0e1 100644
--- a/src/View/InitialConditions/Table.py
+++ b/src/View/InitialConditions/Table.py
@@ -33,14 +33,14 @@ from PyQt5.QtWidgets import (
     QComboBox,
 )
 
+from View.Tools.PamhyrTable import PamhyrTableModel
+
 from View.InitialConditions.UndoCommand import (
     SetCommand, AddCommand, DelCommand,
     SortCommand, MoveCommand, PasteCommand,
     DuplicateCommand, GenerateCommand,
 )
 
-from View.InitialConditions.translate import *
-
 logger = logging.getLogger()
 
 _translate = QCoreApplication.translate
@@ -87,29 +87,13 @@ class ComboBoxDelegate(QItemDelegate):
         self.commitData.emit(self.sender())
 
 
-class TableModel(QAbstractTableModel):
-    def __init__(self, river=None, reach=None, undo=None):
-        super(QAbstractTableModel, self).__init__()
-        self._headers = list(table_headers.keys())
-        self._river = river
+class InitialConditionTableModel(PamhyrTableModel):
+    def __init__(self, reach=None, **kwargs):
         self._reach = reach
-        self._undo = undo
-        self._ics = self._river.initial_conditions.get(reach)
-
-    def flags(self, index):
-        column = index.column()
-
-        options = Qt.ItemIsSelectable
-        if self._headers[column] != "speed":
-            options |= Qt.ItemIsEnabled | Qt.ItemIsEditable
+        super(InitialConditionTableModel, self).__init__(**kwargs)
 
-        return options
-
-    def rowCount(self, parent):
-        return len(self._ics)
-
-    def columnCount(self, parent):
-        return len(self._headers)
+    def _setup_lst(self):
+        self._lst = self._data.river.initial_conditions.get(self._reach)
 
     def data(self, index, role):
         if role != Qt.ItemDataRole.DisplayRole:
@@ -119,16 +103,10 @@ class TableModel(QAbstractTableModel):
         column = index.column()
 
         if self._headers[column] not in ["name", "comment"]:
-            v = self._ics.get(row)[self._headers[column]]
+            v = self._lst.get(row)[self._headers[column]]
             return f"{v:.4f}"
         else:
-            return self._ics.get(row)[self._headers[column]]
-
-        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 self._lst.get(row)[self._headers[column]]
 
         return QVariant()
 
@@ -143,7 +121,7 @@ class TableModel(QAbstractTableModel):
             if self._headers[column] is not None:
                 self._undo.push(
                     SetCommand(
-                        self._ics, row, self._headers[column], value
+                        self._lst, row, self._headers[column], value
                     )
                 )
         except Exception as e:
@@ -158,7 +136,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             AddCommand(
-                self._ics, row
+                self._lst, row
             )
         )
 
@@ -170,7 +148,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             DelCommand(
-                self._ics, rows
+                self._lst, rows
             )
         )
 
@@ -182,7 +160,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             SortCommand(
-                self._ics, False
+                self._lst, False
             )
         )
 
@@ -199,7 +177,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             MoveCommand(
-                self._ics, "up", row
+                self._lst, "up", row
             )
         )
 
@@ -207,7 +185,7 @@ class TableModel(QAbstractTableModel):
         self.layoutChanged.emit()
 
     def move_down(self, index, parent=QModelIndex()):
-        if row > len(self._ics):
+        if row > len(self._lst):
             return
 
         target = row
@@ -216,7 +194,7 @@ class TableModel(QAbstractTableModel):
 
         self._undo.push(
             MoveCommand(
-                self._ics, "down", row
+                self._lst, "down", row
             )
         )
 
@@ -234,7 +212,7 @@ class TableModel(QAbstractTableModel):
     def generate(self, generator, param):
         self._undo.push(
             GenerateCommand(
-                self._ics, generator, param
+                self._lst, generator, param
             )
         )
         self.layoutChanged.emit()
diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py
index 3f5ee1d8508f45cadef04eab0376badde6a6bcef..90cf8e0889f88ee0b87997b22f8350e041628099 100644
--- a/src/View/InitialConditions/Window.py
+++ b/src/View/InitialConditions/Window.py
@@ -45,14 +45,14 @@ from View.InitialConditions.UndoCommand import (
     DuplicateCommand,
 )
 
-from View.InitialConditions.Table import TableModel, ComboBoxDelegate
+from View.InitialConditions.Table import InitialConditionTableModel, ComboBoxDelegate
 
-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.InitialConditions.PlotDKP import PlotDKP
 from View.InitialConditions.PlotDischarge import PlotDischarge
-from View.InitialConditions.translate import table_headers, retranslate
+from View.InitialConditions.translate import ICTranslate
 from View.InitialConditions.DialogHeight import HeightDialog
 from View.InitialConditions.DialogDischarge import DischargeDialog
 
@@ -80,43 +80,42 @@ class InitialConditionsWindow(PamhyrWindow):
             title = name,
             study = study,
             config = config,
+            trad = ICTranslate(),
             parent = parent
         )
 
         self._ics = study.river.initial_conditions.get(self._reach)
 
         self.setup_table()
-        self.setup_graph()
+        self.setup_plot()
         self.setup_connections()
 
         self.ui.setWindowTitle(self._title)
 
     def setup_table(self):
-        retranslate()
-
         table = self.find(QTableView, f"tableView")
-        self._table = TableModel(
-            river = self._study.river,
-            reach = self._reach,
-            undo = self._undo_stack,
-        )
-        table.setModel(self._table)
-
         self._delegate_kp = ComboBoxDelegate(
             reach = self._reach,
-            parent=self
+            parent = self
         )
 
-        table.setItemDelegateForColumn(
-            list(table_headers).index("kp"),
-            self._delegate_kp
+        self._table = InitialConditionTableModel(
+            reach = self._reach,
+            table_view = table,
+            table_headers = self._trad.get_dict("table_headers"),
+            editable_headers = ["kp", "discharge", "elevation", "height"],
+            delegates = {"kp": self._delegate_kp},
+            data = self._study,
+            undo = self._undo_stack,
+            trad = self._trad
         )
 
+        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_1 = MplCanvas(width=5, height=4, dpi=100)
         self.canvas_1.setObjectName("canvas_1")
         self.toolbar_1 = PamhyrPlotToolbar(
@@ -129,7 +128,9 @@ class InitialConditionsWindow(PamhyrWindow):
         self.plot_1 = PlotDKP(
             canvas = self.canvas_1,
             data = self._ics,
+            trad = self._trad,
             toolbar = self.toolbar_1,
+            parent = self
         )
         self.plot_1.draw()
 
@@ -145,7 +146,9 @@ class InitialConditionsWindow(PamhyrWindow):
         self.plot_2 = PlotDischarge(
             canvas = self.canvas_2,
             data = self._ics,
+            trad = self._trad,
             toolbar = self.toolbar_2,
+            parent = self
         )
         self.plot_2.draw()
 
diff --git a/src/View/InitialConditions/translate.py b/src/View/InitialConditions/translate.py
index 54f194e9f014c1ed01e93e365239d039553a6a64..f65306cb4752d969b3bcf8473b1fe1cdc1e0fb32 100644
--- a/src/View/InitialConditions/translate.py
+++ b/src/View/InitialConditions/translate.py
@@ -18,23 +18,24 @@
 
 from PyQt5.QtCore import QCoreApplication
 
+from View.Tools.PamhyrTranslate import PamhyrTranslate
+
 _translate = QCoreApplication.translate
 
-table_headers = {
-    # "name": _translate("LateralContribution", "Name"),
-    "kp": _translate("LateralContribution", "KP (m)"),
-    # "speed": _translate("LateralContribution", "Speed (m/s)"),
-    "discharge": _translate("LateralContribution", "Discharge (m³/s)"),
-    "elevation": _translate("LateralContribution", "Elevation (m)"),
-    "height": _translate("LateralContribution", "Height (m)"),
-    # "comment": _translate("LateralContribution", "Comment"),
-}
+class ICTranslate(PamhyrTranslate):
+    def __init__(self):
+        super(ICTranslate, self).__init__()
+
+        self._dict["elevation"] = _translate("InitialCondition", "Elevation (m)")
+        self._dict["discharge"] = _translate("InitialCondition", "Discharge (m³/s)")
+        self._dict["kp"] = _translate("InitialCondition", "KP (m)")
 
-def retranslate():
-    # table_headers["name"] = _translate("LateralContribution", "Name")
-    table_headers["kp"] = _translate("LateralContribution", "KP (m)")
-    # table_headers["speed"] = _translate("LateralContribution", "Speed (m/s)")
-    table_headers["discharge"] = _translate("LateralContribution", "Discharge (m³/s)")
-    table_headers["elevation"] = _translate("LateralContribution", "Elevation (m)")
-    table_headers["height"] = _translate("LateralContribution", "Height (m)")
-    # table_headers["comment"] = _translate("LateralContribution", "Comment")
+        self._sub_dict["table_headers"] = {
+            # "name": _translate("InitialCondition", "Name"),
+            "kp": _translate("InitialCondition", "KP (m)"),
+            # "speed": _translate("InitialCondition", "Speed (m/s)"),
+            "discharge": _translate("InitialCondition", "Discharge (m³/s)"),
+            "elevation": _translate("InitialCondition", "Elevation (m)"),
+            "height": _translate("InitialCondition", "Height (m)"),
+            # "comment": _translate("InitialCondition", "Comment"),
+        }
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 5ee7a3828fd8ccbdcf3d6d26b3122f16f92f3e27..c3ec403cd1016d22ac2c37083513c24db039629c 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -47,7 +47,7 @@ from View.Network.Window import NetworkWindow
 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.InitialConditions.Window import InitialConditionsWindow
 # from View.Stricklers.Window import StricklersWindow
 # from View.Frictions.Window import FrictionsWindow
 # from View.SedimentLayers.Window import SedimentLayersWindow
diff --git a/src/View/Tools/PamhyrTranslate.py b/src/View/Tools/PamhyrTranslate.py
index 83c8da644d3ed35da282f961526789bcde610904..67befa2359778ba7eae322a78eb5ca2036aa02d3 100644
--- a/src/View/Tools/PamhyrTranslate.py
+++ b/src/View/Tools/PamhyrTranslate.py
@@ -28,6 +28,8 @@ class PamhyrTranslate(object):
         # Module sub dictionnary
         self._sub_dict = {}
 
+        self._dict["pamhyr"] = _translate("Pamhyr", "Pamhyr2")
+
     def __getitem__(self, index):
         if index not in self._dict:
             return None