diff --git a/decloud/production/inference.py b/decloud/production/inference.py
index a4296d4d3eeeadea2aa04bce652078ff34ecb9f4..d2d4e5b7868d4ad2487030696c27cc7c18a5154c 100644
--- a/decloud/production/inference.py
+++ b/decloud/production/inference.py
@@ -66,7 +66,7 @@ def inference(sources, sources_scales, pad, ts, savedmodel_dir, out_tensor, out_
 
     # Setup TensorFlowModelServe
     system.set_env_var("OTB_TF_NSOURCES", str(len(sources)))
-    infer = pyotb.TensorflowModelServe(frozen=True)
+    parameters = {}
 
     # Inputs
     for i, (placeholder, source) in enumerate(sources.items()):
@@ -80,18 +80,18 @@ def inference(sources, sources_scales, pad, ts, savedmodel_dir, out_tensor, out_
         if placeholder in sources_scales:
             src_rfield = int(rfield / sources_scales[placeholder])
 
-        infer.set_parameters({get_key("il"): [source],
-                              get_key("rfieldx"): src_rfield,
-                              get_key("rfieldy"): src_rfield,
-                              get_key("placeholder"): placeholder})
+        parameters.update({get_key("il"): [source],
+                           get_key("rfieldx"): src_rfield,
+                           get_key("rfieldy"): src_rfield,
+                           get_key("placeholder"): placeholder})
 
     # Model
-    infer.set_parameters({"model.dir": savedmodel_dir, "model.fullyconv": "on",
-                          "output.names": [padded_tensor_name(out_tensor, pad)],
-                          "output.efieldx": efield, "output.efieldy": efield,
-                          "optim.tilesizex": efield, "optim.tilesizey": efield,
-                          "optim.disabletiling": 1})
-    infer.Execute()
+    parameters.update({"model.dir": savedmodel_dir, "model.fullyconv": 1,
+                       "output.names": [padded_tensor_name(out_tensor, pad)],
+                       "output.efieldx": efield, "output.efieldy": efield,
+                       "optim.tilesizex": efield, "optim.tilesizey": efield,
+                       "optim.disabletiling": 1})
+    infer = pyotb.TensorflowModelServe(parameters)
 
     # Post Processing
     # For ESA Sentinel-2, remove potential zeros the network may have introduced in the valid parts of the image
diff --git a/decloud/production/monthly_synthesis_processor_s2.py b/decloud/production/monthly_synthesis_processor_s2.py
index f2de7f42dc6f0acf4f300bd3659fa134c1c2fcce..fe2423d5829fbe927ee7c1d5ea2e2d7a37eb2f26 100644
--- a/decloud/production/monthly_synthesis_processor_s2.py
+++ b/decloud/production/monthly_synthesis_processor_s2.py
@@ -74,10 +74,10 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
 
     # Setup TensorFlowModelServe
     system.set_env_var("OTB_TF_NSOURCES", str(len(sources)))
-    infer = pyotb.App("TensorflowModelServe", frozen=True)
+    infer_params = {}
 
     # Setup BandMath for post processing
-    bm = pyotb.App("BandMath", frozen=True)
+    bm_params = {}
     mask_expr = "0"
 
     # Inputs
@@ -93,7 +93,7 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
         if placeholder in sources_scales:
             src_rfield = int(rfield / sources_scales[placeholder])
 
-        infer.set_parameters({get_key("il"): [source]})
+        infer_params.update({get_key("il"): [source]})
 
         # Update post processing BandMath expression
         if placeholder != 'dem' and '20m' not in placeholder:
@@ -101,33 +101,34 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
             n_channels = pyotb.get_nbchannels(source)
             mask_expr += "||"
             mask_expr += "&&".join(["im{}b{}=={}".format(k + 1, b, nodatavalue) for b in range(1, 1 + n_channels)])
-            bm.set_parameters(il=[source])
+            bm_params.update({'il': source})
             k += 1
 
-        infer.set_parameters({get_key("rfieldx"): src_rfield,
-                              get_key("rfieldy"): src_rfield,
-                              get_key("placeholder"): placeholder})
+        infer_params.update({get_key("rfieldx"): src_rfield,
+                             get_key("rfieldy"): src_rfield,
+                             get_key("placeholder"): placeholder})
 
     # Model
-    infer.set_parameters({"model.dir": savedmodel_dir, "model.fullyconv": "on",
-                          "output.names": [padded_tensor_name(out_tensor, pad)],
-                          "output.efieldx": efield, "output.efieldy": efield,
-                          "optim.tilesizex": efield, "optim.tilesizey": efield,
-                          "optim.disabletiling": 1})
-    infer.Execute()
+    infer_params.update({"model.dir": savedmodel_dir, "model.fullyconv": 1,
+                         "output.names": [padded_tensor_name(out_tensor, pad)],
+                         "output.efieldx": efield, "output.efieldy": efield,
+                         "optim.tilesizex": efield, "optim.tilesizey": efield,
+                         "optim.disabletiling": 1})
+    infer = pyotb.TensorflowModelServe(infer_params)
 
     # For ESA Sentinel-2, remove potential zeros the network may have introduced in the valid parts of the image
     if out_pixeltype == otbApplication.ImagePixelType_uint16:
-        n_channels = pyotb.get_nbchannels(infer.out)
+        n_channels = pyotb.get_nbchannels(infer)
         exp = ';'.join([f'(im1b{b}<=1 ? 1 : im1b{b})' for b in range(1, 1 + n_channels)])
-        rmzeros = pyotb.App("BandMathX", il=[infer.out], exp=exp)
+        rmzeros = pyotb.App("BandMathX", il=[infer], exp=exp)
         rmzeros.SetParameterOutputImagePixelType("out", out_pixeltype)
     else:
         rmzeros = infer
 
     # Mask for post processing
     mask_expr += "?0:255"
-    bm.set_parameters(exp=mask_expr)
+    bm_params.update({'exp': mask_expr})
+    bm = pyotb.BandMath(bm_params)
 
     # Closing post processing mask to remove small groups of NoData pixels
     closing = pyotb.App("BinaryMorphologicalOperation", bm, filter="closing", foreval=255, structype="box",
diff --git a/decloud/production/monthly_synthesis_processor_s2s1.py b/decloud/production/monthly_synthesis_processor_s2s1.py
index 38c02f9d41978bdaad58a466d96481df56f6fa98..f69dbc15c94d32e2bb3e00256b1987b3206a91c1 100644
--- a/decloud/production/monthly_synthesis_processor_s2s1.py
+++ b/decloud/production/monthly_synthesis_processor_s2s1.py
@@ -74,10 +74,10 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
 
     # Setup TensorFlowModelServe
     system.set_env_var("OTB_TF_NSOURCES", str(len(sources)))
-    infer = pyotb.App("TensorflowModelServe", frozen=True)
+    infer_params = {}
 
     # Setup BandMath for post processing
-    bm = pyotb.App("BandMath", frozen=True)
+    bm_params = {}
     mask_expr = "0"
 
     # Inputs
@@ -93,7 +93,7 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
         if placeholder in sources_scales:
             src_rfield = int(rfield / sources_scales[placeholder])
 
-        infer.set_parameters({get_key("il"): [source]})
+        infer_params.update({get_key("il"): [source]})
 
         # Update post processing BandMath expression
         if placeholder != 'dem' and '20m' not in placeholder:
@@ -101,20 +101,20 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
             n_channels = pyotb.get_nbchannels(source)
             mask_expr += "||"
             mask_expr += "&&".join(["im{}b{}=={}".format(k + 1, b, nodatavalue) for b in range(1, 1 + n_channels)])
-            bm.set_parameters(il=[source])
+            bm_params.update({'il': [source]})
             k += 1
 
-        infer.set_parameters({get_key("rfieldx"): src_rfield,
-                              get_key("rfieldy"): src_rfield,
-                              get_key("placeholder"): placeholder})
+        infer_params.update({get_key("rfieldx"): src_rfield,
+                             get_key("rfieldy"): src_rfield,
+                             get_key("placeholder"): placeholder})
 
     # Model
-    infer.set_parameters({"model.dir": savedmodel_dir, "model.fullyconv": "on",
-                          "output.names": [padded_tensor_name(out_tensor, pad)],
-                          "output.efieldx": efield, "output.efieldy": efield,
-                          "optim.tilesizex": efield, "optim.tilesizey": efield,
-                          "optim.disabletiling": 1})
-    infer.Execute()
+    infer_params.update({"model.dir": savedmodel_dir, "model.fullyconv": 1,
+                         "output.names": [padded_tensor_name(out_tensor, pad)],
+                         "output.efieldx": efield, "output.efieldy": efield,
+                         "optim.tilesizex": efield, "optim.tilesizey": efield,
+                         "optim.disabletiling": 1})
+    infer = pyotb.TensorflowModelServe(infer_params)
 
     # For ESA Sentinel-2, remove potential zeros the network may have introduced in the valid parts of the image
     if out_pixeltype == otbApplication.ImagePixelType_uint16:
@@ -127,7 +127,8 @@ def monthly_synthesis_inference(sources, sources_scales, pad, ts, savedmodel_dir
 
     # Mask for post processing
     mask_expr += "?0:255"
-    bm.set_parameters(exp=mask_expr)
+    bm_params.update({'exp': mask_expr})
+    bm = pyotb.BandMath(bm_params)
 
     # Closing post processing mask to remove small groups of NoData pixels
     closing = pyotb.App("BinaryMorphologicalOperation", bm, filter="closing", foreval=255, structype="box",
@@ -269,6 +270,7 @@ if __name__ == "__main__":
                 """
                 return abs(s2_product.get_timestamp() - x.get_timestamp())
 
+
             input_s1_products.sort(key=_closest_date, reverse=True)
             input_s1_images_10m = [product.get_raster_10m() for product in input_s1_products]
             # creating a mosaic with the N closest S1 images