diff --git a/json_schemas/schema_MultiSlc.json b/json_schemas/schema_MultiSlc.json
index 94b232ea36e02c7f9a9fa7d94d1e244b8b5d7676..67d27d8a45306414419c4f22de3428fc5e2d881b 100644
--- a/json_schemas/schema_MultiSlc.json
+++ b/json_schemas/schema_MultiSlc.json
@@ -5,7 +5,8 @@
 
     "type": "object",
 
-    "allOf": [{"required": ["Global", "Pre_Processing", "Metadata_Correction", "DIn_SAR"]}],
+    "allOf": [{"required": ["Global", "Pre_Processing", "Metadata_Correction", "DIn_SAR",
+			   "Post_Processing"]}],
 
     "properties":
     {
@@ -121,14 +122,35 @@
 				   "Interferogram_mlran": {"type": "number"},
 				   "Interferogram_mlazi": {"type": "number"},
 				   "Activate_Interferogram": {"type": "string", "default": "yes"},
-				   "Activate_Ortho": {"type": "string"},
-				   "Spacingxy": {"type": "number", "default": 0.0001},
 				   "roi": {"type": "string"}
 				  }
 		}
 	    },
 	    "additionalProperties": false,
 	    "required": ["parameter"]
+	},
+
+	 "Post_Processing": 
+	{
+	    "type": "object",
+	    "properties": 
+	    {
+		"parameter": 
+		{
+		    "type": "object",
+		    "required": ["Activate_Ortho"],
+		    "additionalProperties": false,
+		    "properties": {"Activate_Ortho": {"type": "string"},
+				   "Spacingxy": {"type": "number", "default": 0.0001},
+				   "Activate_Filtering": {"type": "string"},
+				   "Filtered_Interferogram_mlran": {"type": "number"},
+				   "Filtered_Interferogram_mlazi": {"type": "number"},
+				   "Filtering_parameter_alpha": {"type": "number"}
+				  }
+		}
+	    },
+	    "additionalProperties": false,
+	    "required": ["parameter"]
 	}
     }
 }
diff --git a/json_schemas/schema_MultiSlc_IW.json b/json_schemas/schema_MultiSlc_IW.json
index 774f1cd9372bdabfc37e0dd30ae8b562e21549c1..cad9e7759b7f62cd1c2b401f685b4ec24a37b522 100644
--- a/json_schemas/schema_MultiSlc_IW.json
+++ b/json_schemas/schema_MultiSlc_IW.json
@@ -5,7 +5,7 @@
 
     "type": "object",
 
-    "allOf": [{"required": ["Global", "Pre_Processing", "DIn_SAR"]}],
+    "allOf": [{"required": ["Global", "Pre_Processing", "DIn_SAR", "Post_Processing"]}],
 
     "properties":
     {
@@ -93,8 +93,6 @@
 				   "Grid_Gap": {"type": "number"},
 				   "Interferogram_gain": {"type": "number"},
 				   "Activate_Interferogram": {"type": "string", "default": "yes"},
-				   "Activate_Ortho": {"type": "string"},
-				   "Spacingxy": {"type": "number", "default": 0.0001},
 				   "roi": {"type": "string"},
 				   "ESD_iter" : {"type": ["integer","string"]}
 				  }
@@ -102,6 +100,29 @@
 	    },
 	    "additionalProperties": false,
 	    "required": ["parameter"]
+	},
+
+	 "Post_Processing": 
+	{
+	    "type": "object",
+	    "properties": 
+	    {
+		"parameter": 
+		{
+		    "type": "object",
+		    "required": ["Activate_Ortho"],
+		    "additionalProperties": false,
+		    "properties": {"Activate_Ortho": {"type": "string"},
+				   "Spacingxy": {"type": "number", "default": 0.0001},
+				   "Activate_Filtering": {"type": "string"},
+				   "Filtered_Interferogram_mlran": {"type": "number"},
+				   "Filtered_Interferogram_mlazi": {"type": "number"},
+				   "Filtering_parameter_alpha": {"type": "number"}
+				  }
+		}
+	    },
+	    "additionalProperties": false,
+	    "required": ["parameter"]
 	}
     }
 }
diff --git a/python_src/SAR_MultiSlc.py b/python_src/SAR_MultiSlc.py
index fe7d6c901795ba4986d1fe3b43df854aa6733efa..e79d633f0d4c23b03e6620b08ad2d8db9e07b72e 100644
--- a/python_src/SAR_MultiSlc.py
+++ b/python_src/SAR_MultiSlc.py
@@ -51,6 +51,7 @@ import h5py
 from processings import Pre_Processing
 from processings import Ground
 from processings import DInSar
+from processings import Post_Processing
 
 import utils.DiapOTB_applications as diapOTBApp
 from utils import func_utils
@@ -80,6 +81,7 @@ if __name__ == "__main__":
     dict_PreProcessing = dataConfig['Pre_Processing']
     dict_Metadata_Correction = dataConfig['Metadata_Correction']
     dict_DInSAR = dataConfig['DIn_SAR']
+    dict_PostProcessing = dataConfig['Post_Processing']
 
     # ====== Check extension (if .h5 => HDF5 file => Cosmo Sensor)
     master_ext = dict_Global['in']['Master_Image'].split(".")[-1:]
@@ -161,19 +163,10 @@ if __name__ == "__main__":
     fine_metadata_file = dict_Metadata_Correction['out']['fine_metadata_file']
 
     # ====== DIn_SAR
-    spacingxy = "0.0001"
-    if "Spacingxy" in dict_DInSAR['parameter']:
-        spacingxy = str(dict_DInSAR['parameter']['Spacingxy'])
     roi = None
     if 'roi' in dict_DInSAR['parameter']:
         roi = dict_DInSAR['parameter']['roi']
     version_interferogram = dict_DInSAR['parameter']['Activate_Interferogram']
-    ortho_interferogram = "no"
-    if 'Activate_Ortho' in dict_DInSAR['parameter']:
-        ortho_interferogram = dict_DInSAR['parameter']['Activate_Ortho']
-    if roi:
-        ortho_interferogram = "yes"
-        print("ortho_interferogram", ortho_interferogram)
     geoGrid_gridstep_range = dict_DInSAR['parameter']['GridStep_range']
     geoGrid_gridstep_azimut = dict_DInSAR['parameter']['GridStep_azimut']
     geoGrid_threshold = dict_DInSAR['parameter']['Grid_Threshold']
@@ -191,6 +184,34 @@ if __name__ == "__main__":
     if "Interferogram_mlazi" in dict_DInSAR['parameter'] :
         ml_interf_azimut = int(dict_DInSAR['parameter']['Interferogram_mlazi'])
 
+    # ====== Post_Processing
+    spacingxy = "0.0001"
+    if "Spacingxy" in dict_PostProcessing['parameter']:
+        spacingxy = str(dict_PostProcessing['parameter']['Spacingxy'])
+
+    ortho_interferogram = "no"
+    if 'Activate_Ortho' in dict_PostProcessing['parameter']:
+        ortho_interferogram = dict_PostProcessing['parameter']['Activate_Ortho']
+    if roi:
+        ortho_interferogram = "yes"
+        print("ortho_interferogram", ortho_interferogram)
+
+    activateFiltering = "false"
+    if "Activate_Filtering" in dict_PostProcessing['parameter'] :
+        activateFiltering = dict_PostProcessing['parameter']['Activate_Filtering']
+
+    ml_interf_filt_range = 3
+    if "Filtered_Interferogram_mlran" in dict_PostProcessing['parameter'] :
+        ml_interf_filt_range = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlran'])
+
+    ml_interf_filt_azimut = 3
+    if "Filtered_Interferogram_mlazi" in dict_PostProcessing['parameter'] :
+        ml_interf_filt_azimut = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlazi'])
+
+    interf_filt_alpha = 0.7
+    if "Filtering_parameter_alpha" in dict_PostProcessing['parameter'] :
+        interf_filt_alpha = dict_PostProcessing['parameter']['Filtering_parameter_alpha']
+
 
     if (geoGrid_threshold < 0) or (geoGrid_threshold > 1):
         func_utils.log(logging.CRITICAL, "Error, Wrong Threshold for fine deformation grid")
@@ -202,6 +223,12 @@ if __name__ == "__main__":
         "If Ortho is required, please activate interferogram estimation in your json file")
         quit()
 
+    # ====== Check if interferogram is activated for filtering
+    if func_utils.str2bool(activateFiltering) and version_interferogram == "no":
+        func_utils.log(logging.CRITICAL, "Error, Impossible to have filering without interferogram\n"
+        "If Filtering is required, please activate interferogram estimation in your json file")
+        quit()
+
     # ====== Check if images exist
     func_utils.check_ifExist(srtm_shapefile)
     func_utils.check_ifExist(hgts_path)
@@ -265,10 +292,21 @@ if __name__ == "__main__":
     func_utils.log(logging.INFO, "gain_interfero : {param}".format(param=gain_interfero))
     func_utils.log(logging.INFO, "ml_interf_range : {param}".format(param=ml_interf_range))
     func_utils.log(logging.INFO, "ml_interf_azimut : {param}".format(param=ml_interf_azimut))
-    func_utils.log(logging.INFO, "Spacingxy : {param}".format(param=spacingxy))
     func_utils.log(logging.INFO, "roi : {param}".format(param=roi))
     func_utils.log(logging.INFO, "Activate_Interferogram : {param}".format(param=version_interferogram))
+
+    # Post_Processing
+    func_utils.log(logging.INFO, " Post_Processing : ")
     func_utils.log(logging.INFO, "Activate_Ortho : {param}".format(param=ortho_interferogram))
+    if func_utils.str2bool(ortho_interferogram):
+        func_utils.log(logging.INFO, "spacingxy : {param}".format(param=spacingxy))
+    func_utils.log(logging.INFO, "activateFiltering : {param}".format(param=activateFiltering))
+    if func_utils.str2bool(activateFiltering):
+        func_utils.log(logging.INFO, "ml_interf_filt_range : {param}".format(param=ml_interf_filt_range))
+        func_utils.log(logging.INFO, "ml_interf_filt_azimut : {param}".format(param=ml_interf_filt_azimut))
+        func_utils.log(logging.INFO, "interf_filt_alpha : {param}".format(param=interf_filt_alpha))
+
+  
 
 
     # Retrieve some information about our master image
@@ -528,6 +566,27 @@ if __name__ == "__main__":
         func_utils.printOnStd("\n Post Processing chain \n")
         func_utils.log(logging.INFO, "Post Processing chain")
 
+        # Phase Filtering (if required)
+        if func_utils.str2bool(activateFiltering):
+            # Default paramater 
+            step = 16
+            sizetiles = 64
+
+            paramPost = {}
+            paramPost['slave_CoRe_Name'] = slave_Image_CoRe
+            paramPost['ml_filt_interf_range'] = ml_interf_filt_range
+            paramPost['ml_filt_interf_azimut'] = ml_interf_filt_azimut
+            paramPost['geoGrid_gridstep_range'] = geoGrid_gridstep_range
+            paramPost['geoGrid_gridstep_azimut'] = geoGrid_gridstep_azimut
+            paramPost['ml_filt_interf_gain'] = gain_interfero
+            paramPost['filt_alpha'] = interf_filt_alpha
+
+            Post_Processing.filtering(master_Image, master_Image_base, slave_Image, 
+                                      slave_Image_base, master_data_dir, output_dir, paramPost, 
+                                      "Others", output_dir)
+
+            
+
         # === Multilook on Coregistrated Slave
         func_utils.silentremove(output_dir, slave_Image_ML)
         slave_Image_ML = os.path.splitext(slave_Image_base)[0] + "_ml" + str(ml_azimut) + str(ml_range) + ".tif"
@@ -603,7 +662,12 @@ if __name__ == "__main__":
         # Remove .tif.aux.xml files into output_dir
         aux_files = func_utils.get_AllFilesWithExt(output_dir, ".tif.aux.xml")
         for i_file in aux_files :
-            func_utils.silentremove(output_dir, i_file)
+            if i_file == "filfPhaCoh.tif.aux.xml":
+                filt_dir = os.path.join(output_dir, "filt")
+                func_utils.silentremove(filt_dir, i_file)
+            else :    
+                func_utils.silentremove(output_dir, i_file)
+            
 
 
     if light_version is True:
diff --git a/python_src/SAR_MultiSlc_IW.py b/python_src/SAR_MultiSlc_IW.py
index fee8b494dd02ac5d03456a6794c063f22534cdc0..03965645ef96069b1174219b180019ca66e4eeed 100644
--- a/python_src/SAR_MultiSlc_IW.py
+++ b/python_src/SAR_MultiSlc_IW.py
@@ -50,6 +50,7 @@ import errno
 from processings import Pre_Processing
 from processings import Ground
 from processings import DInSar
+from processings import Post_Processing
 
 import utils.DiapOTB_applications as diapOTBApp
 from utils import func_utils
@@ -86,6 +87,7 @@ if __name__ == "__main__":
     dict_PreProcessing = dataConfig['Pre_Processing']
     dict_Ground = dataConfig['Ground']
     dict_DInSAR = dataConfig['DIn_SAR']
+    dict_PostProcessing = dataConfig['Post_Processing']
          
     # ====== Get elements from dictionaries
     # ====== Global
@@ -146,18 +148,11 @@ if __name__ == "__main__":
     version_interferogram = "yes"
     if "Activate_Interferogram" in dict_DInSAR['parameter']:
         version_interferogram = dict_DInSAR['parameter']['Activate_Interferogram']
-    ortho_interferogram = None
-    if 'Activate_Ortho' in dict_DInSAR['parameter']:
-        ortho_interferogram = dict_DInSAR['parameter']['Activate_Ortho']
+
     roi = None
     if 'roi' in dict_DInSAR['parameter']:
         roi = dict_DInSAR['parameter']['roi']
-    if roi:
-        ortho_interferogram = "yes"
-        print("ortho_interferogram", ortho_interferogram)
-    spacingxy = '0.0001'
-    if "Spacingxy" in dict_DInSAR['parameter']:
-        spacingxy = str(dict_DInSAR['parameter']['Spacingxy'])
+
     geoGrid_gridstep_range = dict_DInSAR['parameter']['GridStep_range']
     geoGrid_gridstep_azimut = dict_DInSAR['parameter']['GridStep_azimut']
     geoGrid_threshold = dict_DInSAR['parameter']['Grid_Threshold']
@@ -178,12 +173,48 @@ if __name__ == "__main__":
         esd_AutoMode = True
         esd_NbIter = 10 # 10 iterations maximum for automatic mode
 
+
+    # ====== Post_Processing
+    spacingxy = "0.0001"
+    if "Spacingxy" in dict_PostProcessing['parameter']:
+        spacingxy = str(dict_PostProcessing['parameter']['Spacingxy'])
+        
+    ortho_interferogram = None
+    if 'Activate_Ortho' in dict_PostProcessing['parameter']:
+        ortho_interferogram = dict_PostProcessing['parameter']['Activate_Ortho']
+    if roi:
+        ortho_interferogram = "yes"
+        print("ortho_interferogram", ortho_interferogram)
+    
+    activateFiltering = "false"
+    if "Activate_Filtering" in dict_PostProcessing['parameter'] :
+        activateFiltering = dict_PostProcessing['parameter']['Activate_Filtering']
+
+    ml_interf_filt_range = 3
+    if "Filtered_Interferogram_mlran" in dict_PostProcessing['parameter'] :
+        ml_interf_filt_range = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlran'])
+
+    ml_interf_filt_azimut = 3
+    if "Filtered_Interferogram_mlazi" in dict_PostProcessing['parameter'] :
+        ml_interf_filt_azimut = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlazi'])
+
+    interf_filt_alpha = 0.7
+    if "Filtering_parameter_alpha" in dict_PostProcessing['parameter'] :
+        interf_filt_alpha = dict_PostProcessing['parameter']['Filtering_parameter_alpha']
+
+
     # ====== Check if interferogram is activated for ortho interferogram
     if ortho_interferogram == "yes" and version_interferogram == "no":
         func_utils.log(logging.CRITICAL, "Error, Impossible to have ortho interferogram without interferogram\n"
         "If Ortho is required, please activate interferogram estimation in your json file")
         quit()
 
+    # ====== Check if interferogram is activated for filtering
+    if func_utils.str2bool(activateFiltering) and version_interferogram == "no":
+        func_utils.log(logging.CRITICAL, "Error, Impossible to have filering without interferogram\n"
+        "If Filtering is required, please activate interferogram estimation in your json file")
+        quit()
+
     # ====== Check Threshold
     if (geoGrid_threshold < 0) or (geoGrid_threshold > 1) :
         func_utils.log(logging.CRITICAL, "Error, Wrong Threshold for fine deformation grid")
@@ -254,12 +285,22 @@ if __name__ == "__main__":
     func_utils.log(logging.INFO, "ml_geoGrid_azimut : {param}".format(param=ml_geoGrid_azimut))
     func_utils.log(logging.INFO, "gain_interfero : {param}".format(param=gain_interfero))
     func_utils.log(logging.INFO, "Activate_Interferogram : {param}".format(param=version_interferogram))
-    func_utils.log(logging.INFO, "Activate_Ortho : {param}".format(param=ortho_interferogram))
     func_utils.log(logging.INFO, "roi : {param}".format(param=roi))
-    func_utils.log(logging.INFO, "Spacingxy : {param}".format(param=spacingxy))
     func_utils.log(logging.INFO, "esd_NbIter : {param}".format(param=esd_NbIter))
     func_utils.log(logging.INFO, "esd_AutoMode : {param}".format(param=esd_AutoMode))    
 
+    # Post_Processing
+    func_utils.log(logging.INFO, " Post_Processing : ")
+    func_utils.log(logging.INFO, "Activate_Ortho : {param}".format(param=ortho_interferogram))
+    if func_utils.str2bool(ortho_interferogram):
+        func_utils.log(logging.INFO, "spacingxy : {param}".format(param=spacingxy))
+    func_utils.log(logging.INFO, "activateFiltering : {param}".format(param=activateFiltering))
+    if func_utils.str2bool(activateFiltering):
+        func_utils.log(logging.INFO, "ml_interf_filt_range : {param}".format(param=ml_interf_filt_range))
+        func_utils.log(logging.INFO, "ml_interf_filt_azimut : {param}".format(param=ml_interf_filt_azimut))
+        func_utils.log(logging.INFO, "interf_filt_alpha : {param}".format(param=interf_filt_alpha))
+
+
     # ============================
     # Get the elements from os.dirs
     # ============================
@@ -520,6 +561,25 @@ if __name__ == "__main__":
             os.rename(os.path.join(output_dir,
                       Interferogram_Multiband.split(".")[0]+".geom"), os.path.join(output_dir, Interferogram_.split(".")[0]+".geom"))
 
+
+        
+          # Phase Filtering (if required)
+        if func_utils.str2bool(activateFiltering):
+            # Default paramater 
+            step = 16
+            sizetiles = 64
+
+            paramPost = {}
+            paramPost['ml_filt_interf_range'] = ml_interf_filt_range
+            paramPost['ml_filt_interf_azimut'] = ml_interf_filt_azimut
+            paramPost['filt_alpha'] = interf_filt_alpha
+            paramPost['interf_Name'] = Con_Interf
+
+            Post_Processing.filtering(master_Image, master_Image_base, slave_Image, 
+                                      slave_Image_base, Master_temp_dir, temp_dir, paramPost, 
+                                      "S1_IW", output_dir)
+
+
         # C === Ortho Interferogram
         if version_interferogram == "yes" and ortho_interferogram == "yes":            
             Ortho_ = mib[:15]+"M"+mib[14:30]+"-"+mib[
diff --git a/python_src/processings/Post_Processing.py b/python_src/processings/Post_Processing.py
index 34622192f7fd1d88c2f27edb5f9862a7cb119fd1..f6932b1df17488057808126aec568a23d03ec60e 100644
--- a/python_src/processings/Post_Processing.py
+++ b/python_src/processings/Post_Processing.py
@@ -144,7 +144,7 @@ def filtering_Others(master_Image, master_Image_base, slave_Image, slave_Image_b
     # First SARTopographicPhase
     appTopoPhase = otb.Registry.CreateApplication("SARTopographicPhase")
     appTopoPhase.SetParameterString("insarslave", slave_Image)
-    appTopoPhase.SetParameterString("ingrid",  os.path.join(master_dir, fine_grid))
+    appTopoPhase.SetParameterString("ingrid",  os.path.join(slave_dir, fine_grid))
     appTopoPhase.SetParameterString("incartmeanmaster", 
                                     os.path.join(master_dir, master_cartesian_mean))
     appTopoPhase.SetParameterInt("mlran", 1)
@@ -160,7 +160,7 @@ def filtering_Others(master_Image, master_Image_base, slave_Image, slave_Image_b
         slave_Image_CoRe = param['slave_CoRe_Name']
         slave_Image_CoRe += "?&gdal:co:TILED=YES"
 
-    coRe_path = os.path.join(output_dir, slave_Image_CoRe)
+    coRe_path = os.path.join(slave_dir, slave_Image_CoRe)
 
     complexImg = "CompensatedComplex.tif" 
 
@@ -266,6 +266,10 @@ def filtering_S1IW(master_Image, master_Image_base, slave_Image, slave_Image_bas
 
     # Use directly the interferogram (ML 1x1)
     interf_name = "interferogram_swath.tif"
+    if "interf_Name" in param :
+        interf_name = param['interf_Name']
+      
+    
     
 
     # SARPhaseFiltering