diff --git a/ProcessLib/CalculateSurfaceFlux/Balance.h b/ProcessLib/CalculateSurfaceFlux/Balance.h
index a91a88cb8c03c9caf75bc4b6379bcd37e98557c0..44eff8c8b55e4c040240560db726a79ca9ba97bf 100644
--- a/ProcessLib/CalculateSurfaceFlux/Balance.h
+++ b/ProcessLib/CalculateSurfaceFlux/Balance.h
@@ -19,6 +19,7 @@
 #include "MeshLib/IO/writeMeshToFile.h"
 
 #include "ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFlux.h"
+#include "ProcessLib/CalculateSurfaceFlux/ParseCalculateSurfaceFluxData.h"
 
 namespace ProcessLib
 {
@@ -46,6 +47,28 @@ struct Balance
             output_mesh_file_name.c_str());
     }
 
+    static std::unique_ptr<Balance> createBalance(
+        BaseLib::ConfigTree const& config,
+        std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
+        std::string const& output_directory)
+    {
+        std::string mesh_name;  // surface mesh the balance will computed on
+        std::string balance_pv_name;
+        std::string balance_out_fname;
+        ProcessLib::parseCalculateSurfaceFluxData(
+            config, mesh_name, balance_pv_name, balance_out_fname);
+
+        if (mesh_name.empty())
+        {
+            return std::unique_ptr<ProcessLib::Balance>(nullptr);
+        }
+        balance_out_fname =
+            BaseLib::copyPathToFileName(balance_out_fname, output_directory);
+        return std::make_unique<Balance>(std::move(mesh_name), meshes,
+                                         std::move(balance_pv_name),
+                                         std::move(balance_out_fname));
+    }
+
     void integrate(GlobalVector const& x, double const t, Process const& p,
                    int const process_id, int const integration_order,
                    MeshLib::Mesh const& bulk_mesh)
@@ -76,6 +99,7 @@ struct Balance
         MeshLib::IO::writeMeshToFile(surface_mesh, fname);
     }
 
+private:
     MeshLib::Mesh& surface_mesh;
     std::string const mesh_name;
     std::string const property_vector_name;