diff --git a/src/View/ASubWindow.py b/src/View/ASubWindow.py
index d9e121f4d0c411087eb80cfbcafa51d59b65c728..4e1c13279313adb77683afe7a3e9a4a9c36e6bba 100644
--- a/src/View/ASubWindow.py
+++ b/src/View/ASubWindow.py
@@ -78,13 +78,14 @@ class WindowToolKit(object):
 
         return header, values
 
-    def file_dialog(self, select_file=True, callback=lambda x: None):
+    def file_dialog(self, select_file=True, callback=lambda x: None, directory=None):
         """Open a new file dialog and send result to callback function
 
         Args:
             select_file: Select a file if True, else select a dir
             callback: The callback function with one arguments, files
                       selection list
+            directory: Defaut directory
 
         Returns:
             The returns of callback
@@ -97,6 +98,8 @@ class WindowToolKit(object):
             mode = QFileDialog.FileMode.Directory
 
         dialog.setFileMode(mode)
+        if directory is not None:
+            dialog.setDirectory(directory)
 
         if dialog.exec_():
             file_names = dialog.selectedFiles()
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 0808ba8f8d73a6c8f651e7e4438a7c6fdefc24f0..afb2de1e53d1c6dffba98bbe0f00c056c6d864d1 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -119,6 +119,9 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
         self.trans = QTranslator(self)
         #self.ui.retranslateUi()
 
+        if self.conf.last_study != "" and not self.conf.close_correctly:
+            self.dialog_reopen_study()
+
     def set_title(self):
         if self.model is not None:
             self.setWindowTitle(f"PAMHYR - {self.model.name}")
@@ -202,16 +205,24 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
         if self.model is not None and not self.model.is_saved:
             self._close_question = True
             if self.dialog_close():
+                # PAMHYR is close correctly (no crash)
+                self.conf.set_close_correctly()
+
                 super(ApplicationWindow, self).close()
             else:
                 self._close_question = False
         else:
+            # PAMHYR is close correctly (no crash)
+            self.conf.set_close_correctly()
+
             super(ApplicationWindow, self).close()
 
     def closeEvent(self, event):
         if not self._close_question:
             if self.model is not None and not self.model.is_saved:
                 if self.dialog_close(cancel = False):
+                    # PAMHYR is close correctly (no crash)
+                    self.conf.set_close_correctly()
                     super(ApplicationWindow, self).closeEvent(event)
         else:
             super(ApplicationWindow, self).closeEvent(event)
@@ -264,11 +275,13 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
     def set_model(self, model):
         self.model = model
         self.update_enable_action()
+        self.conf.set_last_study(self.model.filename)
         self.set_title()
 
     def close_model(self):
         self.model = None
         self.update_enable_action()
+        self.conf.set_close_correctly()
         self.set_title()
 
     def update_enable_action(self):
@@ -295,6 +308,19 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
     # FEATURES #
     ############
 
+    def open_study(self, filename):
+        """Open a study
+
+        Args:
+            filename: The study path
+
+        Returns:
+            Nothing
+        """
+        self.set_model(Study.open(filename))
+        logger.info(f"Open Study - {self.model.name}")
+        self.set_title()
+
     def save_study(self):
         """Save current study
 
@@ -351,6 +377,27 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
                          "Geometry edition need a reach selected "
                          "into river network window to work on it")
 
+    def dialog_reopen_study(self):
+        dlg = QMessageBox(self)
+
+        dlg.setWindowTitle("Last open study")
+        dlg.setText("Do you want to open again the last open study?")
+        opt = QMessageBox.Cancel | QMessageBox.Ok #| QMessageBox.Open
+
+        dlg.setStandardButtons(opt)
+        dlg.setIcon(QMessageBox.Question)
+
+        res = dlg.exec()
+
+        if res == QMessageBox.Ok:
+            self.open_study(self.conf.last_study)
+            return True
+        elif res == QMessageBox.Open:
+            self.open_model()
+            return True
+        elif res == QMessageBox.Cancel:
+            return False
+
     def dialog_close(self, cancel = True):
         dlg = QMessageBox(self)
 
@@ -411,12 +458,11 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
             dialog.setDefaultSuffix(".pamhyr")
             #dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden)
             dialog.setNameFilters(['PamHyr (*.pamhyr)'])
+            dialog.setDirectory(os.path.dirname(self.conf.last_study))
 
             if dialog.exec_():
                 file_name = dialog.selectedFiles()
-                self.set_model(Study.open(file_name[0]))
-                logger.info(f"Open Study - {self.model.name}")
-                self.set_title()
+                self.open_study(file_name[0])
 
     def open_new_study(self):
         """Open dialog to set new study
diff --git a/src/config.py b/src/config.py
index 89563ecbe6ec255438a68513a681d97293b2d8cc..d1ebb71ec8cdfb4df4bc9ae8ded5ca045c71a8f9 100644
--- a/src/config.py
+++ b/src/config.py
@@ -34,7 +34,7 @@ logger = logging.getLogger()
 
 class Config(SQL):
     def __init__(self):
-        self._version = '0.0.2'
+        self._version = '0.0.3'
         self.filename = Config.filename()
         self.set_default_value()
 
@@ -105,6 +105,10 @@ class Config(SQL):
                         ''
                       )
                     """)
+                if int(release) < 3:
+                    self.execute(f"INSERT INTO data VALUES ('last_study', '')")
+                    self.execute(f"INSERT INTO data VALUES ('close_correctly', 'True')")
+
             self.commit()
 
     def _load_solver(self):
@@ -176,6 +180,12 @@ class Config(SQL):
         v = self.execute("SELECT value FROM data WHERE key='lang'")
         self.lang = v[0]
 
+        # Last study
+        v = self.execute("SELECT value FROM data WHERE key='last_study'")
+        self.last_study = v[0]
+        v = self.execute("SELECT value FROM data WHERE key='close_correctly'")
+        self.close_correctly = v[0] == "True"
+
         # Debug
         v = self.execute("SELECT value FROM data WHERE key='debug'")
         self.debug = v[0] == "True"
@@ -228,6 +238,8 @@ class Config(SQL):
             "backup_max": self.backup_max,
             "editor": self.editor,
             "lang": self.lang,
+            "last_study": self.last_study,
+            "close_correctly": self.close_correctly,
             "debug": self.debug,
         }
 
@@ -279,9 +291,25 @@ class Config(SQL):
         # Stricklers
         self.stricklers = StricklersList()
 
+        # Last study
+        self.last_study = ""
+        self.close_correctly = False
+
         # Debug
         self.debug = False
 
+    def set_close_correctly(self):
+        self.close_correctly = True
+        self.execute(f"UPDATE data SET value='True' WHERE key='close_correctly'")
+        self.commit()
+
+    def set_last_study(self, filename):
+        self.last_study = filename
+        self.close_correctly = False
+        self.execute(f"UPDATE data SET value='{self._sql_format(self.last_study)}' WHERE key='last_study'")
+        self.execute(f"UPDATE data SET value='{self.close_correctly}' WHERE key='close_correctly'")
+        self.commit()
+
     @classmethod
     def filename(cls):
         file = ""