diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 61a4ab6ffc2839ead886b7c591bfe3dfb34cf098..31672cf2e640ce9d4e4de5fef900dd9f0ef2324e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -33,7 +33,7 @@ dl-mage-linux:
   rules:
     - if: $CI_COMMIT_BRANCH == 'ci-test' || $CI_COMMIT_BRANCH == 'master' || $CI_COMMIT_TAG
   script:
-    - curl -L -o mage.tgz https://gitlab.irstea.fr/jean-baptiste.faure/mage/-/releases/Test6/downloads/packages/mage_linux.tgz
+    - curl -L -o mage.tgz https://gitlab.irstea.fr/jean-baptiste.faure/mage/-/releases/v8.3.0/downloads/packages/mage_linux.tgz
     - mkdir -p mage-linux
     - cd mage-linux
     - tar xvf ../mage.tgz
@@ -50,7 +50,7 @@ dl-mage-windows:
   rules:
     - if: $CI_COMMIT_BRANCH == 'ci-test' || $CI_COMMIT_BRANCH == 'master' || $CI_COMMIT_TAG
   script:
-    - curl -L -o mage.tgz https://gitlab.irstea.fr/jean-baptiste.faure/mage/-/releases/Test6/downloads/packages/mage_windows.tgz
+    - curl -L -o mage.tgz https://gitlab.irstea.fr/jean-baptiste.faure/mage/-/releases/v8.3.0/downloads/packages/mage_windows.tgz
     - mkdir -p mage-windows
     - cd mage-windows
     - tar xvf ../mage.tgz
diff --git a/src/Solver/CommandLine.py b/src/Solver/CommandLine.py
index b3614ca3538e92134743772dd6ae8c2d2ed83768..2a6d9ec8b0a4fc578735b6b8c0ade520a874dcb2 100644
--- a/src/Solver/CommandLine.py
+++ b/src/Solver/CommandLine.py
@@ -132,7 +132,7 @@ class CommandLineSolver(AbstractSolver):
         return os.path.abspath(
             os.path.join(
                 os.path.dirname(__file__),
-                "..", ".."
+                "..", "..", ".."
             )
         )
 
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 4ce865db72b513fb371b577034cf67677894c8c2..ac1bef1299b96168bebc1b1f60608476dc0fe32d 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -435,7 +435,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
             "", "Pamhyr(*.pamhyr)"
         )
 
-        if file_name[-4:] == ".pamhyr":
+        if  file_name.rsplit(".", 1)[-1] == ".pamhyr":
             self._study.filename = file_name
         else:
             self._study.filename = file_name + ".pamhyr"
diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py
index 75e95f2181feef09739553d0f8db434c98dcc2e9..bbb62e858ee91e1d51d706bc7378065257b1eb2a 100644
--- a/src/View/Results/Window.py
+++ b/src/View/Results/Window.py
@@ -16,9 +16,10 @@
 
 # -*- coding: utf-8 -*-
 
+import os
 import logging
-from datetime import datetime
 
+from datetime import datetime
 from tools import trace, timer
 
 from View.Tools.PamhyrWindow import PamhyrWindow
@@ -69,6 +70,14 @@ class ResultsWindow(PamhyrWindow):
     _pamhyr_ui = "Results"
     _pamhyr_name = "Results"
 
+    def _path_file(self, filename):
+        return os.path.abspath(
+            os.path.join(
+                os.path.dirname(__file__),
+                "..", "..", filename
+            )
+        )
+
     def __init__(self, study=None, config=None,
                  solver=None, results=None,
                  parent=None):
@@ -124,13 +133,15 @@ class ResultsWindow(PamhyrWindow):
         self._slider_time.setMaximum(len(self._timestamps) - 1)
         self._slider_time.setValue(len(self._timestamps) - 1)
 
+        file_path = os.path.abspath(os.path.dirname(__file__))
+
         self._icon_start = QIcon()
         self._icon_start.addPixmap(
-            QPixmap('./src/View/ui/ressources/media-playback-start.png')
+            QPixmap(f'{file_path}/../ui/ressources/media-playback-start.png')
         )
         self._icon_pause = QIcon()
         self._icon_pause.addPixmap(
-            QPixmap('./src/View/ui/ressources/media-playback-pause.png')
+            QPixmap(f'{file_path}/../ui/ressources/media-playback-pause.png')
         )
         self._button_play = self.find(QPushButton, f"playButton")
         self._button_play.setIcon(self._icon_start)
@@ -254,6 +265,10 @@ class ResultsWindow(PamhyrWindow):
             )
             self.plot_sed_profile.draw()
 
+    def closeEvent(self, event):
+        self._timer.stop()
+        super(ResultsWindow, self).closeEvent(event)
+
     def _compute_status_label(self):
         # Timestamp
         ts = self._timestamps[self._slider_time.value()]
diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py
index 6067f5e12b9e21011b897dec7bdb13c151d7e710..b950b92956ee9d0aa0296d260355647ad5183604 100644
--- a/src/View/RunSolver/Window.py
+++ b/src/View/RunSolver/Window.py
@@ -21,7 +21,7 @@ import logging
 import tempfile
 
 from queue import Queue
-from tools import trace, timer
+from tools import trace, timer, logger_exception
 
 from View.Tools.PamhyrWindow import PamhyrDialog, PamhyrWindow
 
@@ -195,7 +195,7 @@ class SolverLogWindow(PamhyrWindow):
             os.makedirs(self._workdir, exist_ok=True)
 
     def setup_process(self):
-        self._alarm.start(500)
+        self._alarm.start(100)
         self._output = Queue()
         self._process = self.new_process(self._parent)
 
@@ -210,6 +210,10 @@ class SolverLogWindow(PamhyrWindow):
         self._solver.export(self._study, self._workdir, qlog=self._output)
         self.update()
 
+    def closeEvent(self, event):
+        self._alarm.stop()
+        super(SolverLogWindow, self).closeEvent(event)
+
     #######
     # LOG #
     #######
@@ -259,16 +263,21 @@ class SolverLogWindow(PamhyrWindow):
             if self._solver.log_file() != "":
                 self.find(QAction, "action_log_file").setEnabled(True)
 
+            self._update_logs_all()
             self._update_get_results()
 
         self._update_logs_all()
 
     def _update_get_results(self):
         if self._results is None:
-            self._results = self._solver.results(
-                self._study, self._workdir, qlog=self._output
-            )
-            self._parent.set_results(self._solver, self._results)
+            try:
+                self._results = self._solver.results(
+                    self._study, self._workdir, qlog=self._output
+                )
+                self._parent.set_results(self._solver, self._results)
+            except Exception as e:
+                logger.error(f"Failed to open results")
+                logger_exception(e)
 
     def _update_logs_all(self):
         while self._output.qsize() != 0:
diff --git a/src/View/Tools/Plot/PamhyrToolbar.py b/src/View/Tools/Plot/PamhyrToolbar.py
index 977087d053f68342bc686e9ef592e06648d20bb2..489d47b108a9e7378305c71b13bf543a60878b90 100644
--- a/src/View/Tools/Plot/PamhyrToolbar.py
+++ b/src/View/Tools/Plot/PamhyrToolbar.py
@@ -98,7 +98,7 @@ class PamhyrPlotToolbar(NavigationToolbar2QT):
 
             icon_zoom = QtGui.QIcon()
             icon_zoom.addPixmap(QtGui.QPixmap(
-                os.path.abspath(f"{file_path}/../ui/ressources/zoom.png")
+                os.path.abspath(f"{file_path}/../../ui/ressources/zoom.png")
             ))
 
             icons.append(("zoom", icon_zoom))
@@ -122,7 +122,7 @@ class PamhyrPlotToolbar(NavigationToolbar2QT):
             icon_btn_isometric_view.addPixmap(
                 QtGui.QPixmap(
                     os.path.abspath(
-                        f"{file_path}/../ui/ressources/zoom_fit_11.png"
+                        f"{file_path}/../../ui/ressources/zoom_fit_11.png"
                     )
                 )
             )
@@ -131,7 +131,7 @@ class PamhyrPlotToolbar(NavigationToolbar2QT):
             icon_btn_global_view.addPixmap(
                 QtGui.QPixmap(
                     os.path.abspath(
-                        f"{file_path}/../ui/ressources/zoom_fit.png"
+                        f"{file_path}/../../ui/ressources/zoom_fit.png"
                     )
                 )
             )
diff --git a/src/View/ui/Results.ui b/src/View/ui/Results.ui
index 9d879e2dc5ffacf071ac91ba7369ac386794c0a0..7ff3f594b271d94c5f590dd8420aa849c4ef3d79 100644
--- a/src/View/ui/Results.ui
+++ b/src/View/ui/Results.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>874</width>
-    <height>745</height>
+    <width>1280</width>
+    <height>720</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -34,7 +34,7 @@
         <enum>Qt::Vertical</enum>
        </property>
        <widget class="QTableView" name="tableView_reach"/>
-       <widget class="QWidget" name="">
+       <widget class="QWidget" name="layoutWidget">
         <layout class="QHBoxLayout" name="horizontalLayout">
          <item>
           <widget class="QTableView" name="tableView_profile"/>
@@ -55,7 +55,7 @@
         </layout>
        </widget>
       </widget>
-      <widget class="QWidget" name="">
+      <widget class="QWidget" name="layoutWidget">
        <layout class="QGridLayout" name="gridLayout_2">
         <item row="0" column="0">
          <widget class="QTabWidget" name="tabWidget">
@@ -228,7 +228,7 @@
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>874</width>
+     <width>1280</width>
      <height>22</height>
     </rect>
    </property>
diff --git a/src/pamhyr.py b/src/pamhyr.py
index 5d2741667b40db263ad455fc806fb3f82bddd6c2..8a125fc34595063018868e37a7d20a6d5cbee5a8 100755
--- a/src/pamhyr.py
+++ b/src/pamhyr.py
@@ -39,6 +39,7 @@ from Scripts.P3DST import Script3DST
 from Scripts.Hello import ScriptHello
 from Scripts.ListSolver import ScriptListSolver
 from Scripts.Run import ScriptExport, ScriptRun
+from Scripts.MageMesh import MageMesh
 
 from init import legal_info, debug_info, setup_lang
 
@@ -50,6 +51,7 @@ scripts = {
     "export": ScriptExport,
     "run": ScriptRun,
     "3DST": Script3DST,
+    "mesh": MageMesh,
 }