diff --git a/src/Model/Study.py b/src/Model/Study.py
index d29910bba1564282de30dc8d2eeb1a086aa18e37..18d986eabef858e1b033046392da16e98c75ae2b 100644
--- a/src/Model/Study.py
+++ b/src/Model/Study.py
@@ -86,7 +86,7 @@ class Study(SQLModel):
     def is_saved(self):
         return self.status.is_saved()
 
-    def save(self):
+    def save(self, progress=None):
         # Save a copy of database
         fdir, fname = os.path.split(self.filename)
 
@@ -110,7 +110,7 @@ class Study(SQLModel):
 
         # Save
         self.last_save_date = datetime.now()
-        self._save()
+        self._save(progress=progress)
         self.status.save()
 
     @property
@@ -266,38 +266,53 @@ class Study(SQLModel):
 
         return new
 
-    def _save(self):
+    def _save(self, progress=lambda: None):
         self.execute(
             f"UPDATE info SET " +
             f"value='{self._db_format(self.name)}' WHERE key='name'"
         )
+        progress()
         self.execute(
             f"UPDATE info SET " +
             f"value='{self._db_format(self.description)}' " +
             "WHERE key='description'"
         )
+        progress()
         self.execute(
             f"UPDATE info SET " +
             f"value='{self._time_system}' WHERE key='time_system'"
         )
+        progress()
         self.execute(
             f"UPDATE info SET " +
             f"value='{timestamp(self._date)}' WHERE key='date'"
         )
+        progress()
         self.execute(
             f"UPDATE info SET " +
             f"value='{timestamp(self.creation_date)}' " +
             "WHERE key='creation_date'"
         )
+        progress()
         self.execute(
             f"UPDATE info SET " +
             f"value='{timestamp(self.last_save_date)}' " +
             "WHERE key='last_save_date'"
         )
+        progress()
 
-        self._save_submodel([self._river])
+        self._save_submodel([self._river], data=progress)
         self.commit()
 
+
+    def sql_save_request_count(self):
+        return self._count()
+
+    def _count(self):
+        cnt = self._save_count([self._river])
+        logger.debug(cnt)
+        return cnt + 6
+
     def close(self):
         """Close db connection
 
diff --git a/src/Model/Tools/PamhyrDB.py b/src/Model/Tools/PamhyrDB.py
index 8ee134fc97f7c725e0cbe1ebdc6fedb94ecb942f..1f0be1495877691419384344fbb44b2246bacb0e 100644
--- a/src/Model/Tools/PamhyrDB.py
+++ b/src/Model/Tools/PamhyrDB.py
@@ -21,6 +21,7 @@ import sqlite3
 import logging
 
 from pathlib import Path
+from functools import reduce
 
 from tools import SQL
 from Model.Except import NotImplementedMethodeError
@@ -87,11 +88,18 @@ class SQLModel(SQL):
         raise NotImplementedMethodeError(self, self._update)
 
     def _save_submodel(self, objs, data=None):
-        def fn(sql): return self.execute(
-            sql,
-            fetch_one=False,
-            commit=False
-        )
+        progress = lambda: None
+        if data is not None:
+            progress = data
+
+        def fn(sql):
+            res = self.execute(
+                sql,
+                fetch_one=False,
+                commit=False
+            )
+            progress()
+            return res
 
         ok = True
         for obj in objs:
@@ -100,9 +108,43 @@ class SQLModel(SQL):
         self.commit()
         return ok
 
-    def _save(self):
+    def _save(self, progress=None):
         raise NotImplementedMethodeError(self, self._save)
 
+    def _count(self):
+        raise NotImplementedMethodeError(self, self._count)
+
+    def _save_count(self, objs, data=None):
+        counter = {
+            "insert" : 0,
+            "update" : 0,
+            "delete" : 0,
+            "other" : 0,
+        }
+
+        def fn(sql):
+            if "insert" in sql.lower():
+                counter["insert"] = counter["insert"] + 1
+            elif "update" in sql.lower():
+                counter["update"] = counter["update"] + 1
+            elif "delete" in sql.lower():
+                counter["delete"] = counter["delete"] + 1
+            else:
+                counter["other"] = counter["other"] + 1
+            return []
+
+        ok = True
+        for obj in objs:
+            ok &= obj._db_save(fn)
+
+        logger.debug(counter)
+
+        return reduce(
+            lambda acc, k: acc + counter[k],
+            counter,
+            0
+        )
+
     @classmethod
     def _load(cls, filename=None):
         raise NotImplementedMethodeError(cls, cls._load)
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 89df56f38c4f315ab16667a667182313ddfeedde..e8a2d847828630caf39e0e60233a979777c57cb8 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -28,12 +28,12 @@ from PyQt5.QtGui import (
 )
 
 from PyQt5.QtCore import (
-    QTranslator, QEvent, QUrl,
+    Qt, QTranslator, QEvent, QUrl,
 )
 from PyQt5.QtWidgets import (
     QMainWindow, QApplication, QAction,
     QFileDialog, QShortcut, QMenu, QToolBar,
-    QMessageBox,
+    QMessageBox, QProgressDialog,
 )
 from PyQt5.uic import loadUi
 
@@ -406,8 +406,21 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
         if self._study.is_saved:
             return
 
+        sql_request_count = self._study.sql_save_request_count()
+        progress = QProgressDialog(
+            "Saving...", "Cancel",
+            0, sql_request_count,
+            parent=self
+        )
+        progress.setWindowModality(Qt.WindowModal)
+
+        progress.setValue(0)
+
         logger.info("Save...")
-        self._study.save()
+        self._study.save(
+            progress=lambda: progress.setValue(progress.value() + 1)
+        )
+        logger.info("Done")
 
     def save_as_study(self):
         """Save current study as new file