diff --git a/src/Scripts/Run.py b/src/Scripts/Run.py
new file mode 100644
index 0000000000000000000000000000000000000000..2c26f4d29f4f471223f187480c8624ee704113ce
--- /dev/null
+++ b/src/Scripts/Run.py
@@ -0,0 +1,106 @@
+# Run.py -- Pamhyr
+# 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 os
+import logging
+
+from queue import Queue
+
+from PyQt5.QtCore import QProcess
+
+from Scripts.AScript import AScript
+from Model.Study import Study
+
+logger = logging.getLogger()
+
+
+class ScriptRun(AScript):
+    name = "Run"
+    description = "Run solver on Pamhyr2 a study"
+
+    def usage(self):
+        logger.info(f"Usage : {self._args[0]} {self._args[1]} <SOLVER> <STUDY>")
+
+    def run(self):
+        if len(self._args) < 4:
+            return 1
+
+        command = self._args[1]
+        solver_name = self._args[2]
+        study_file = os.path.abspath(
+            self._args[3]
+        )
+
+        try:
+            solver = next(
+                filter(
+                    lambda solver: solver.name == solver_name,
+                    self._conf.solvers
+                )
+            )
+        except Exception as e:
+            logger.error(f"No solver found: {e}")
+            return 2
+
+        study = Study.open(study_file)
+
+        self._solver = solver
+        self._study = study
+
+        logger.info(f"Run {solver.name} ({solver.type}) on study '{study.name}' ({study_file})")
+
+        # Workdir
+        workdir = os.path.join(
+            os.path.dirname(study.filename),
+            "_PAMHYR_",
+            study.name.replace(" ", "_"),
+            solver.name.replace(" ", "_")
+        )
+        os.makedirs(workdir, exist_ok=True)
+        logger.info(f"Set working dir to {workdir}")
+
+        # Preparate process
+        p = QProcess(None)
+        p.setWorkingDirectory(workdir)
+
+        self._q = Queue()
+
+        # Export and Run
+        logger.info(f"~Export~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
+        solver.export(study, workdir, qlog=self._q)
+
+        while self._q.qsize() != 0:
+            s = self._q.get()
+            logger.info(s)
+
+        if command == "run":
+            logger.info(f"~Run~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
+            solver.run(
+                study,
+                process=p,
+                output_queue=self._q
+            )
+            p.waitForFinished()
+
+        logger.info(f"~End~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
+
+        return 0
+
+class ScriptExport(ScriptRun):
+    name = "Export"
+    description = "Export Pamhyr2 study for solver"
diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py
index 0603a5abc7a4c4ce5840ec7813d9280c9ec82b6a..b461d6025d93bd5d5e8a1c186e1d4b4aca20aea3 100644
--- a/src/Solver/ASolver.py
+++ b/src/Solver/ASolver.py
@@ -295,6 +295,7 @@ class AbstractSolver(object):
         self._process.start(
             exe, args,
         )
+        self._process.waitForStarted()
 
         self._status = STATUS.RUNNING
         return True
@@ -340,6 +341,8 @@ class AbstractSolver(object):
         self._run_next(study)
 
     def run(self, study, process=None, output_queue=None):
+        self._study = study
+
         if process is not None:
             self._process = process
         if output_queue is not None:
diff --git a/src/pamhyr.py b/src/pamhyr.py
index 2381da01dc01068e7d8119809a010722416fb7e0..f26526860baf43c20a03a2806aa6fb5ae070c057 100755
--- a/src/pamhyr.py
+++ b/src/pamhyr.py
@@ -37,6 +37,7 @@ from Model.Study import Study
 
 from Scripts.P3DST import Script3DST
 from Scripts.Hello import ScriptHello
+from Scripts.Run import ScriptExport, ScriptRun
 
 from init import legal_info, debug_info, setup_lang
 
@@ -44,6 +45,8 @@ logger = logging.getLogger()
 
 scripts = {
     "hello": ScriptHello,
+    "export": ScriptExport,
+    "run": ScriptRun,
     "3DST": Script3DST,
 }