diff --git a/Dockerfile b/Dockerfile
index 141d4bb0f9ee7b54f4af4e882106c860d3088761..684ed0872f164f19df739369495228bb593b944a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -27,4 +27,8 @@ RUN cd /src/otb/otb/Modules/Remote/ && git clone https://gitlab.irstea.fr/remi.c
 COPY . /src/otb/otb/Modules/Remote/decloud/
 RUN cd /src/otb/build/OTB/build && cmake /src/otb/otb/ -DModule_SimpleExtractionTools=ON -DModule_MLUtils=ON -DBUILD_TESTING=OFF -DModule_OTBDecloud=ON 
 RUN cd /src/otb/build/OTB/build && make -j $(nproc --all) install
+
+# Install decloud
+RUN cd /src/otb/otb/Modules/Remote/decloud/ && python3 -m pip install .
+
 USER otbuser
diff --git a/decloud/production/crga_processor.py b/decloud/production/crga_processor.py
index eb599b1a6b98b2e59b84fa561202b9a7c77597b3..215c40da68758952ad9f110ef01fc2a8048ddc79 100644
--- a/decloud/production/crga_processor.py
+++ b/decloud/production/crga_processor.py
@@ -190,7 +190,7 @@ def crga_processor(il_s1after, il_s1before, il_s1, il_s2after, il_s2before, in_s
 
 
 # ------------------------------------------------------- Main ---------------------------------------------------------
-def main(args):
+def main():
     # Logger
     system.basic_logging_init()
 
@@ -230,7 +230,7 @@ def main(args):
         parser.print_help()
         parser.exit()
 
-    params = parser.parse_args(args)
+    params = parser.parse_args()
 
     crga_processor(params.il_s1after, params.il_s1before, params.il_s1, params.il_s2after, params.il_s2before,
                    params.in_s2, params.dem, params.savedmodel,
@@ -239,4 +239,4 @@ def main(args):
 
 
 if __name__ == "__main__":
-    system.run_and_terminate(main)
+    sys.exit(main())
diff --git a/decloud/production/meraner_processor.py b/decloud/production/meraner_processor.py
index bc5b9f06e3b125b94bff02e91f9766f7171d0b98..7ded518292dc8bf45af2536f069af7bd7cf350bc 100644
--- a/decloud/production/meraner_processor.py
+++ b/decloud/production/meraner_processor.py
@@ -142,7 +142,7 @@ def meraner_processor(il_s1, in_s2, savedmodel, dem=None, output=None, output_20
 
 
 # ------------------------------------------------------- Main ---------------------------------------------------------
-def main(args):
+def main():
     # Logger
     system.basic_logging_init()
 
@@ -180,4 +180,4 @@ def main(args):
 
 
 if __name__ == "__main__":
-    system.run_and_terminate(main)
+    sys.exit(main())
diff --git a/setup.py b/setup.py
index 6a678f5e7c0224eb84bf8d95b49c1d606b178d1d..579b3a50f2c658655b717362cbcfa6923123d22e 100644
--- a/setup.py
+++ b/setup.py
@@ -49,4 +49,10 @@ setuptools.setup(
     packages=setuptools.find_packages(),
     python_requires=">=3.6",
     keywords="remote sensing, deep learning, gapfilling, remove clouds, satellite imagery, otb, orfeotoolbox",
+    entry_points={
+        'console_scripts': [
+            'crga_processor=decloud.production.crga_processor:main',
+            'meraner_processor=decloud.production.meraner_processor:main'
+        ],
+    }
 )
diff --git a/tests/inference_unittest.py b/tests/inference_unittest.py
index 3af2b039a11d03c0f9c01aae64e7be9544ca3ab3..5f310c4e019765a28e230f57325c07e6690c1429 100644
--- a/tests/inference_unittest.py
+++ b/tests/inference_unittest.py
@@ -118,13 +118,11 @@ class InferenceTest(DecloudTest):
             self.get_path('baseline/PREPARE/S2_PREPARE/T31TEJ/SENTINEL2A_20201024-104859-766_L2A_T31TEJ_C_V2-2/')]
 
         outpath = '/tmp/reconstructed_w_preprocessor.tif'
-        crga_processor.main(["--il_s1before", *s1_tm1, "--il_s2before", *s2_tm1,
-                             "--il_s1", *s1_t, "--in_s2", s2_t,
-                             "--il_s1after", *s1_tp1, "--il_s2after", *s2_tp1,
-                             "--dem", self.get_path('baseline/PREPARE/DEM_PREPARE/T31TEJ.tif'),
-                             "--output", outpath, '--maxgap', '48',
-                             '--savedmodel', model_path])
-
+        crga_processor.crga_processor(il_s1before=s1_tm1, il_s2before=s2_tm1,
+                                      il_s1=s1_t, in_s2=s2_t,
+                                      il_s1after=s1_tp1, il_s2after=s2_tp1,
+                                      dem=self.get_path('baseline/PREPARE/DEM_PREPARE/T31TEJ.tif'),
+                                      output=outpath, maxgap=48, savedmodel=model_path)
 
         # Just a dummy test
         self.assertTrue(system.file_exists(outpath))