diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py
index 52efc0712f9f1953efbc29b75575f007caac6dd3..b6e586f8071dad1f8e4d7f066a6fd736feac0995 100644
--- a/src/Solver/Mage.py
+++ b/src/Solver/Mage.py
@@ -125,7 +125,6 @@ class Mage(CommandLineSolver):
             qlog.put("Export ST file")
 
         os.makedirs(os.path.join(repertory, "net"), exist_ok=True)
-        gra_file = f"{name}.GRA"
 
         # Write header
         edges = study.river.edges()
@@ -149,72 +148,83 @@ class Mage(CommandLineSolver):
 
                 cnt_num = 1
                 for profile in edge.reach.profiles:
-                    num = f"{cnt_num:>6}"
-                    c1 = f"{profile.code1:>6}"
-                    c2 = f"{profile.code2:>6}"
-                    t = f"{len(profile.points):>6}"
-                    kp = f"{profile.kp:>12f}"[0:12]
-                    pname = profile.name
-                    if profile.name == "":
-                        # Generate name from profile id prefixed with
-                        # 'p' (and replace space char with '0' char)
-                        pname = f"p{profile.id:>3}".replace(" ", "0")
-                    name = f"{pname:<19}"
-
-                    # Generate sediment additional data if available
-                    sediment = ""
-                    if profile.sl is not None:
-                        if not any(filter(lambda f: ".GRA" in f, files)):
-                            files.append(gra_file)
-
-                        # Number of layers
-                        nl = len(profile.sl)
-                        sediment = f" {nl:>3}"
-
-                        # Layers data
-                        for layer in profile.sl.layers:
-                            sediment += (
-                                f" {layer.height:>10} {layer.d50:>10} " +
-                                f"{layer.sigma:>10} " +
-                                f"{layer.critical_constraint:>10}"
-                            )
-
-                    # Profile header line
-                    f.write(f"{num}{c1}{c2}{t} {kp} {name} {sediment}\n")
+                    self._export_ST_profile_header(
+                        f, files, profile, cnt_num
+                    )
                     cnt_num += 1
 
                     # Points
                     for point in profile.points:
-                        x = f"{point.x:<12f}"[0:12]
-                        y = f"{point.y:<12f}"[0:12]
-                        z = f"{point.z:<12f}"[0:12]
-                        n = f"{point.name:<3}"
-
-                        # Generate sediment additional data if available
-                        sediment = ""
-                        prev = point.z
-                        if point.sl is not None:
-                            # Number of layers
-                            nl = len(point.sl)
-                            sediment = f"{nl:>3}"
-
-                            # Layers data
-                            for layer in point.sl.layers:
-                                prev = round(prev - layer.height, 5)
-                                sediment += (
-                                    f" {prev:>10} {layer.d50:>10} " +
-                                    f"{layer.sigma:>10} " +
-                                    f"{layer.critical_constraint:>10}"
-                                )
-
-                        # Point line
-                        f.write(f"{x} {y} {z} {n} {sediment}\n")
+                        self._export_ST_point_line(
+                            f, files, point
+                        )
 
                     # Profile last line
                     f.write(f"     999.9990     999.9990     999.9990\n")
 
         return files
 
+    def _export_ST_profile_header(self, wfile, files,
+                                  profile, cnt):
+        num = f"{cnt:>6}"
+        c1 = f"{profile.code1:>6}"
+        c2 = f"{profile.code2:>6}"
+        t = f"{len(profile.points):>6}"
+        kp = f"{profile.kp:>12f}"[0:12]
+        pname = profile.name
+        if profile.name == "":
+            # Generate name from profile id prefixed with
+            # 'p' (and replace space char with '0' char)
+            pname = f"p{profile.id:>3}".replace(" ", "0")
+            name = f"{pname:<19}"
+
+        # Generate sediment additional data if available
+        sediment = ""
+        if profile.sl is not None:
+            if not any(filter(lambda f: ".GRA" in f, files)):
+                files.append(self._gra_file)
+
+                # Number of layers
+                nl = len(profile.sl)
+                sediment = f" {nl:>3}"
+
+                # Layers data
+                for layer in profile.sl.layers:
+                    sediment += (
+                        f" {layer.height:>10} {layer.d50:>10} " +
+                        f"{layer.sigma:>10} " +
+                        f"{layer.critical_constraint:>10}"
+                    )
+
+        # Profile header line
+        wfile.write(f"{num}{c1}{c2}{t} {kp} {name} {sediment}\n")
+
+    def _export_ST_point_line(self, wfile, files, point):
+        x = f"{point.x:<12f}"[0:12]
+        y = f"{point.y:<12f}"[0:12]
+        z = f"{point.z:<12f}"[0:12]
+        n = f"{point.name:<3}"
+
+        # Generate sediment additional data if available
+        sediment = ""
+        prev = point.z
+        if point.sl is not None:
+            # Number of layers
+            nl = len(point.sl)
+            sediment = f"{nl:>3}"
+
+            # Layers data
+            for layer in point.sl.layers:
+                prev = round(prev - layer.height, 5)
+                sediment += (
+                    f" {prev:>10} {layer.d50:>10} " +
+                    f"{layer.sigma:>10} " +
+                    f"{layer.critical_constraint:>10}"
+                )
+
+        # Point line
+        wfile.write(f"{x} {y} {z} {n} {sediment}\n")
+
     @timer
     def _export_BC(self, t, bounds, repertory, qlog, name="0"):
         files = []
@@ -429,6 +439,10 @@ class Mage(CommandLineSolver):
         self._study = study
         name = study.name.replace(" ", "_")
 
+        # Define GRA file name
+        self._gra_file = f"{name}.GRA"
+        self._bin_file = f"{name}.BIN"
+
         self._export_ST(study, repertory, qlog, name=name)
 
         return True
@@ -622,6 +636,11 @@ class Mage8(Mage):
         self._study = study
         name = study.name.replace(" ", "_")
 
+        # Define GRA file name
+        self._gra_file = f"{name}.GRA"
+        self._bin_file = f"{name}.BIN"
+
+        # Generate files
         files = []
 
         files = self._export_ST(study, repertory, qlog, name=name)