diff --git a/src/Model/InitialConditions/InitialConditionsDict.py b/src/Model/InitialConditions/InitialConditionsDict.py
index 48da56a0598e40d3426de80d72c7e6663988cbe2..c3b7d7c6d664cb9d79e74f130d187b9906abcf0a 100644
--- a/src/Model/InitialConditions/InitialConditionsDict.py
+++ b/src/Model/InitialConditions/InitialConditionsDict.py
@@ -20,28 +20,14 @@ from copy import copy
 from tools import trace, timer
 
 from Model.DB import SQLSubModel
+from Model.Tools.PamhyrDict import PamhyrModelDict
 from Model.InitialConditions.InitialConditions import InitialConditions
 
-class InitialConditionsDict(SQLSubModel):
+class InitialConditionsDict(PamhyrModelDict):
     _sub_classes = [
         InitialConditions,
     ]
 
-    def __init__(self, status = None):
-        super(InitialConditionsDict, self).__init__()
-
-        self._status = status
-
-        self._reach = {}
-
-    @classmethod
-    def _sql_create(cls, execute):
-        return cls._create_submodel(execute)
-
-    @classmethod
-    def _sql_update(cls, execute, version):
-        return cls._update_submodel(execute, version)
-
     @classmethod
     def _sql_load(cls, execute, data = None):
         new = cls(status = data["status"])
@@ -55,7 +41,7 @@ class InitialConditionsDict(SQLSubModel):
             )
 
             if ic is not None:
-                new._reach[reach] = ic
+                new._dict[reach] = ic
 
         return new
 
@@ -66,30 +52,12 @@ class InitialConditionsDict(SQLSubModel):
 
         execute("DELETE FROM initial_conditions")
 
-        for reach in self._reach:
+        for reach in self._dict:
             data["reach"] = reach
-            ok &= self._reach[reach]._sql_save(execute, data)
+            ok &= self._dict[reach]._sql_save(execute, data)
 
         return ok
 
-    def __len__(self):
-        return len(self._reach)
-
-    def is_defined(self, reach):
-        return reach in self._reach
-
-    def get(self, reach):
-        if reach in self._reach:
-            return self._reach[reach]
-
-        new = self.new(reach)
-        self.set(reach, new)
-        return new
-
-    def set(self, reach, new):
-        self._reach[reach] = new
-        self._status.modified()
-
     def new(self, reach):
         new = InitialConditions(reach = reach, status = self._status)
         self.set(reach, new)
diff --git a/src/Model/Tools/PamhyrDict.py b/src/Model/Tools/PamhyrDict.py
new file mode 100644
index 0000000000000000000000000000000000000000..0c1cc536f648020cabe18c70e217d106eee153f7
--- /dev/null
+++ b/src/Model/Tools/PamhyrDict.py
@@ -0,0 +1,73 @@
+# PamhyrDict.py -- Pamhyr abstract dict for model classes
+# Copyright (C) 2023  INRAE
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# -*- coding: utf-8 -*-
+
+import logging
+
+from copy import copy
+from tools import trace, timer
+
+from Model.DB import SQLSubModel
+
+logger = logging.getLogger()
+
+
+class PamhyrModelDict(SQLSubModel):
+    _sub_classes = []
+
+    def __init__(self, status = None):
+        super(PamhyrModelDict, self).__init__()
+
+        self._status = status
+
+        self._dict = {}
+
+    @classmethod
+    def _sql_create(cls, execute):
+        return cls._create_submodel(execute)
+
+    @classmethod
+    def _sql_update(cls, execute, version):
+        return cls._update_submodel(execute, version)
+
+    @classmethod
+    def _sql_load(cls, execute, data = None):
+        raise NotImplementedMethodeError(cls, cls._sql_load)
+
+    def _sql_save(self, execute, data = None):
+        raise NotImplementedMethodeError(self, self._sql_save)
+
+    def __len__(self):
+        return len(self._dict)
+
+    def is_defined(self, key):
+        return key in self._dict
+
+    def set(self, key, new):
+        self._dict[key] = new
+        self._status.modified()
+
+    def get(self, key):
+        if key in self._dict:
+            return self._dict[key]
+
+        new = self.new(key)
+        self.set(key, new)
+        return new
+
+    def new(self, key):
+        raise NotImplementedMethodeError(self, self.new)