diff --git a/CMake/CTestCustom.cmake.in b/CMake/CTestCustom.cmake.in
index 1e9635ac55e5148b5c6e38ae20cd809f5900b7ad..dab705a25ed37ee971ffaec65e1e25113a2da22a 100644
--- a/CMake/CTestCustom.cmake.in
+++ b/CMake/CTestCustom.cmake.in
@@ -114,4 +114,10 @@ set(CTEST_CUSTOM_WARNING_EXCEPTION
   ".*include.mpValue.h.*[Ww]arning.*\\[-Wc\\+\\+11-extensions\\]"
   ".*itksys.SharedForward.h.*warning.*itksys_shared_forward_to_real.*"
   ".*include.mpi_portable_platform.h.*warning.*invalid.suffix.on.literal.*"
+  # Silent latex warnings in ctest
+  ".*LaTeX Warning:.*"
+  ".*Package tabulary Warning:.*"
+  ".*Package rerunfilecheck Warning:.*"
+  # Silent warning: unknown option after ‘#pragma GCC diagnostic’ kind [-Wpragmas] from GCC 4.9
+  ".*warning: unknown option after \\‘\\#pragma GCC diagnostic\\’ kind \\[-Wpragmas\\]"
   )
diff --git a/Documentation/Cookbook/CTestConfig.cmake b/Documentation/Cookbook/CTestConfig.cmake
deleted file mode 100644
index 4c5367353e56fda293045177242aa849d02e9c40..0000000000000000000000000000000000000000
--- a/Documentation/Cookbook/CTestConfig.cmake
+++ /dev/null
@@ -1,7 +0,0 @@
-set(CTEST_PROJECT_NAME "Documentation")
-set(CTEST_NIGHTLY_START_TIME "20:00:00 CEST")
-
-set(CTEST_DROP_METHOD "https")
-set(CTEST_DROP_SITE "dash.orfeo-toolbox.org")
-set(CTEST_DROP_LOCATION "/submit.php?project=Documentation")
-set(CTEST_DROP_SITE_CDASH TRUE)
diff --git a/Documentation/Cookbook/Scripts/otb_warnings.py b/Documentation/Cookbook/Scripts/otb_warnings.py
index 61af6ff2b244b165f964632f6dc595ede845979d..1bace05986cf4cb357b89bd797697d1002695450 100644
--- a/Documentation/Cookbook/Scripts/otb_warnings.py
+++ b/Documentation/Cookbook/Scripts/otb_warnings.py
@@ -37,9 +37,6 @@ def application_documentation_warnings(app):
     for key in app.GetParametersKeys():
         parameter_warnings(warn, app, key)
 
-    if "ram" in keys and not keys[-3] == "ram":
-        warn("'ram' parameter is not third from last")
-
     if "inxml" in keys and not keys[-2] == "inxml":
         warn("'inxml' parameter is not second from last parameter")
 
diff --git a/Modules/Adapters/GdalAdapters/test/otbOGRDataSourceWrapperNew.cxx b/Modules/Adapters/GdalAdapters/test/otbOGRDataSourceWrapperNew.cxx
index 1cd253c767e9ae8918a4f71693d0fa0467ae2ea6..b31093ae8892c9dfa0931a4b5bb2b47db1f077df 100644
--- a/Modules/Adapters/GdalAdapters/test/otbOGRDataSourceWrapperNew.cxx
+++ b/Modules/Adapters/GdalAdapters/test/otbOGRDataSourceWrapperNew.cxx
@@ -24,7 +24,14 @@
 /*===========================================================================*/
 #define BOOST_TEST_MODULE "otb::org::DataSource creation unit testing"
 #define BOOST_TEST_DYN_LINK
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
 #include <boost/test/unit_test.hpp>
+#pragma GCC diagnostic pop
+#else
+#include <boost/test/unit_test.hpp>
+#endif
 #include <boost/foreach.hpp>
 #include "otb_boost_string_header.h"
 #include "itksys/SystemTools.hxx"
diff --git a/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx b/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx
index b7107b066b51ac4935036cc5ee3eca35b2633058..4738434b8d262648306d60099e7b0624a3bbb8af 100644
--- a/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx
+++ b/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx
@@ -96,25 +96,26 @@ private:
     SetParameterDescription("ip","This group allows setting parameters for classification map regularization by Majority Voting.");
 
     AddParameter(ParameterType_Int, "ip.radius", "Structuring element radius (in pixels)");
-    SetParameterDescription("ip.radius", "The radius of the ball shaped structuring element (expressed in pixels). By default, 'ip.radius = 1 pixel'.");
+    SetParameterDescription("ip.radius", "The radius of the ball shaped structuring element (in pixels).");
     SetDefaultParameterInt("ip.radius", 1.0);
 
-    AddParameter(ParameterType_Bool, "ip.suvbool", "Multiple majority: Undecided(X)/Original");
-    SetParameterDescription("ip.suvbool", "Pixels with more than 1 majority class are marked as Undecided if this parameter is checked (true), or keep their Original labels otherwise (false). Please note that the Undecided value must be different from existing labels in the input labeled image. By default, 'ip.suvbool = false'.");
+    AddParameter(ParameterType_Bool, "ip.suvbool", "Set tie pixels to undecided");
+    SetParameterDescription("ip.suvbool",
+                            "If true, set pixels with more than one majority class to an undecided value. If false, keep their original labels.");
 
     AddParameter(ParameterType_Int, "ip.nodatalabel", "Label for the NoData class");
-    SetParameterDescription("ip.nodatalabel", "Label for the NoData class. Such input pixels keep their NoData label in the output image. By default, 'ip.nodatalabel = 0'.");
+    SetParameterDescription("ip.nodatalabel", "Label for the NoData class. Such input pixels keep their NoData label in the output image.");
     SetDefaultParameterInt("ip.nodatalabel", 0.0);
 
     AddParameter(ParameterType_Int, "ip.undecidedlabel", "Label for the Undecided class");
-    SetParameterDescription("ip.undecidedlabel", "Label for the Undecided class. By default, 'ip.undecidedlabel = 0'.");
+    SetParameterDescription("ip.undecidedlabel", "Label for the Undecided class.");
     SetDefaultParameterInt("ip.undecidedlabel", 0.0);
 
     AddParameter(ParameterType_Bool, "ip.onlyisolatedpixels", "Process isolated pixels only");
-    SetParameterDescription("ip.onlyisolatedpixels", "Only pixels whose label is unique in the neighbordhood will be processed. By default, 'ip.onlyisolatedpixels = false'.");
+    SetParameterDescription("ip.onlyisolatedpixels", "Only pixels whose label is unique in the neighbordhood will be processed.");
 
     AddParameter(ParameterType_Int, "ip.isolatedthreshold", "Threshold for isolated pixels");
-    SetParameterDescription("ip.isolatedthreshold", "Maximum number of neighbours with the same label as the center pixel to consider that it is an isolated pixel. By default, 'ip.isolatedthreshold = 1'.");       
+    SetParameterDescription("ip.isolatedthreshold", "Maximum number of neighbours with the same label as the center pixel to consider that it is an isolated pixel.");
     SetDefaultParameterInt("ip.isolatedthreshold", 1);
 
 
diff --git a/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx b/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx
index d46483e294a22135c84d10ad18ddd013368185e2..fb5e582dae4dc6073b77a5a2f1f2659831e1b3e9 100644
--- a/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx
+++ b/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx
@@ -53,7 +53,7 @@ void TrainVectorBase::DoInit()
   MandatoryOff( "layer" );
   SetDefaultParameterInt( "layer", 0 );
 
-  AddParameter(ParameterType_ListView,  "feat", "Field names for training features.");
+  AddParameter(ParameterType_ListView,  "feat", "Field names for training features");
   SetParameterDescription("feat",
     "List of field names in the input vector data to be used as features for training.");
 
diff --git a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
index f77243cfcb7a7899c32242e84a0cae8a2bb6c7ed..45e44f352d9a74d9260762d10dbd8c3e59d2e007 100644
--- a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
+++ b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
@@ -328,11 +328,11 @@ private:
 
           fftShiftFilter->Update();
 
-          toComplexFilter->SetVariadicInputs( fftShiftFilter->GetOutput() );
+          toComplexFilter->SetInputs( fftShiftFilter->GetOutput() );
           }
         else
           {
-            toComplexFilter->SetVariadicInputs( inImage );
+            toComplexFilter->SetInputs( inImage );
           }
 
         toComplexFilter->Update();
diff --git a/Modules/Applications/AppHyperspectral/app/CMakeLists.txt b/Modules/Applications/AppHyperspectral/app/CMakeLists.txt
index 61f15688879ecaec8607c1bb163bdb3ac4cc6911..99abce6063425d7196376561bc27481d7c5e1e56 100644
--- a/Modules/Applications/AppHyperspectral/app/CMakeLists.txt
+++ b/Modules/Applications/AppHyperspectral/app/CMakeLists.txt
@@ -27,3 +27,8 @@ otb_create_application(
   NAME           VertexComponentAnalysis
   SOURCES        otbVertexComponentAnalysis.cxx
   LINK_LIBRARIES ${${otb-module}_LIBRARIES})
+
+otb_create_application(
+  NAME           EndmemberNumberEstimation
+  SOURCES        otbEndmemberNumberEstimation.cxx
+  LINK_LIBRARIES ${${otb-module}_LIBRARIES})
diff --git a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..cdfc36799d0b27c35d62efd367e83d34b1e3effc
--- /dev/null
+++ b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
+ *
+ * This file is part of Orfeo Toolbox
+ *
+ *     https://www.orfeo-toolbox.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "otbWrapperApplication.h"
+#include "otbWrapperApplicationFactory.h"
+
+#include "otbStreamingStatisticsVectorImageFilter.h"
+#include "otbEigenvalueLikelihoodMaximisation.h"
+#include "otbVirtualDimensionality.h"
+
+namespace otb
+{
+namespace Wrapper
+{
+
+class EndmemberNumberEstimation : public Application
+{
+public:
+  /** Standard class typedefs. */
+  typedef EndmemberNumberEstimation         Self;
+  typedef Application                       Superclass;
+  typedef itk::SmartPointer<Self>           Pointer;
+  typedef itk::SmartPointer<const Self>     ConstPointer;
+
+  /** Standard macro */
+  itkNewMacro(Self);
+
+  itkTypeMacro(EndmemberNumberEstimation, otb::Application);
+
+  typedef otb::StreamingStatisticsVectorImageFilter<FloatVectorImageType, float> StreamingStatisticsVectorImageFilterType;
+  typedef otb::VirtualDimensionality<float>                                      VirtualDimensionalityType;
+  typedef otb::EigenvalueLikelihoodMaximisation<float>                           EigenvalueLikelihoodMaximisationType;
+
+private:
+  void DoInit() override
+  {
+    SetName("EndmemberNumberEstimation");
+    SetDescription("Estimate the number of endmembers in a hyperspectral image");
+
+    // Documentation
+    SetDocName("Endmember Number Estimation");
+    SetDocLongDescription("Estimate the number of endmembers "
+    "in a hyperspectral image. First, compute statistics on the image and then "
+    "apply an endmember number estimation algorithm using these statistics. Two "
+    "algorithms are available:\n\n"
+
+    "1. Virtual Dimensionality (VD) [1][2]\n"
+    "2. Eigenvalue Likelihood Maximization (ELM) [3][4]\n\n"
+
+    "The application then returns the estimated number of endmembers.\n\n"
+
+    "[1] C.-I. Chang and Q. Du, Estimation of number of spectrally distinct signal "
+    "sources in hyperspectral imagery, IEEE Transactions on Geoscience and Remote "
+    "Sensing, vol. 43, no. 3, mar 2004.\n\n"
+
+    "[2] J. Wang and C.-I. Chang, Applications of independent component analysis "
+    "in endmember extraction and abundance quantification for hyperspectral imagery"
+    ", IEEE Transactions on Geoscience and Remote Sensing, vol. 44, no. 9, pp. "
+    "2601-1616, sep 2006.\n\n"
+
+    "[3] Unsupervised Endmember Extraction of Martian Hyperspectral Images, B.Luo, "
+    "J. Chanussot, S. Dout\'e and X. Ceamanos, IEEE Whispers 2009, Grenoble France, 2009\n\n"
+
+    "[4] Unsupervised classification of hyperspectral images by using "
+    "linear unmixing algorithm Luo, B. and Chanussot, J., IEEE Int. Conf. On Image"
+    "Processing(ICIP) 2009, Cairo, Egypte, 2009"
+    );
+
+    SetDocLimitations("None");
+    SetDocAuthors("OTB-Team");
+    SetDocSeeAlso("VertexComponentAnalysis, HyperspectralUnmixing");
+
+    AddDocTag(Tags::Hyperspectral);
+
+    AddParameter(ParameterType_InputImage,  "in", "Input Image Filename");
+    SetParameterDescription("in","The hyperspectral data cube input");
+
+    AddParameter(ParameterType_Int,"number","Number of endmembers");
+    SetParameterDescription("number", "The output estimated number of endmembers");
+    SetParameterRole("number", Role_Output);
+
+    AddParameter(ParameterType_Choice, "algo", "Unmixing algorithm");
+    SetParameterDescription("algo", "The algorithm to use for the estimation");
+    AddChoice("algo.elm", "Eigenvalue Likelihood Maximization");
+    SetParameterDescription("algo.elm", "");
+    AddChoice("algo.vd", "Virtual Dimensionality");
+    SetParameterDescription("algo.vd", "");
+
+    AddParameter( ParameterType_Float , "algo.vd.far" , "False alarm rate");
+    SetMinimumParameterFloatValue("algo.vd.far", 0);
+    SetMaximumParameterFloatValue("algo.vd.far", 1);
+    SetDefaultParameterFloat( "algo.vd.far" , 1.0E-3 );
+    SetParameterDescription( "algo.vd.far" , 
+      "False alarm rate for the virtual dimensionality algorithm");
+
+    AddRAMParameter();
+    
+    // Doc example parameter settings
+    SetDocExampleParameterValue("in", "cupriteSubHsi.tif");
+    SetDocExampleParameterValue("algo", "vd");
+    SetDocExampleParameterValue("algo.vd.far", "1.0E-3");
+
+    SetOfficialDocLink();
+  }
+
+  void DoUpdateParameters() override
+  {
+    // Nothing to do here : all parameters are independent
+  }
+
+  void DoExecute() override
+  {
+    // Load input image
+    auto inputImage = GetParameterImage("in");
+
+    otbAppLogINFO("Computing statistics on input image...");
+    auto statisticsFilter = StreamingStatisticsVectorImageFilterType::New();
+    statisticsFilter->SetInput(inputImage);
+    AddProcess(statisticsFilter->GetStreamer(), "Statistic estimation step");
+
+    statisticsFilter->Update();
+
+    auto correlationMatrix = statisticsFilter->GetCorrelation().GetVnlMatrix();
+    auto covarianceMatrix = statisticsFilter->GetCovariance().GetVnlMatrix();
+    auto numberOfPixels = inputImage->GetLargestPossibleRegion().GetNumberOfPixels();
+
+    int numberOfEndmembers = 0;
+    const std::string algorithm = GetParameterString("algo");
+    if (algorithm=="elm")
+      {
+      otbAppLogINFO("Estimation algorithm: Eigenvalue Likelihood Maximization.");
+      auto elm = EigenvalueLikelihoodMaximisationType::New();
+      elm->SetCovariance(covarianceMatrix);
+      elm->SetCorrelation(correlationMatrix);
+      elm->SetNumberOfPixels(numberOfPixels);
+      elm->Compute();
+      numberOfEndmembers = elm->GetNumberOfEndmembers();
+      }
+    else if (algorithm=="vd")
+      {
+      otbAppLogINFO("Estimation algorithm: Virtual Dimensionality.");
+      auto vd = VirtualDimensionalityType::New();
+      vd->SetCovariance(covarianceMatrix);
+      vd->SetCorrelation(correlationMatrix);
+      vd->SetNumberOfPixels(numberOfPixels);
+      vd->SetFAR(GetParameterFloat("algo.vd.far"));
+      vd->Compute();
+      numberOfEndmembers = vd->GetNumberOfEndmembers();
+      }
+    SetParameterInt("number", numberOfEndmembers);
+  }
+
+};
+
+}
+}
+
+OTB_APPLICATION_EXPORT(otb::Wrapper::EndmemberNumberEstimation)
diff --git a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
index 3eb2708aed87a5b5fbfbfde1705944dbbbbb9eff..0444e858d6f464a0907d956377035d87dcbb1b41 100644
--- a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
+++ b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
@@ -95,13 +95,13 @@ private:
 
     // Documentation
     SetDocName("Hyperspectral data unmixing");
-    SetDocLongDescription("The application applies a linear unmixing algorithm"
-    "to an hyperspectral data cube. This method supposes that the mixture between"
-    "aterials in the scene is macroscopic and simulates a linear mixing model of"
+    SetDocLongDescription("The application applies a linear unmixing algorithm "
+    "to an hyperspectral data cube. This method supposes that the mixture between "
+    "aterials in the scene is macroscopic and simulates a linear mixing model of "
     "spectra.\n\n"
-    "The Linear Mixing Model (LMM) acknowledges that reflectance"
-    "spectrum associated with each pixel is a linear combination of pure"
-    "materials in the recovery area, commonly known as endmembers. Endmembers can"
+    "The Linear Mixing Model (LMM) acknowledges that reflectance "
+    "spectrum associated with each pixel is a linear combination of pure "
+    "materials in the recovery area, commonly known as endmembers. Endmembers can "
     "be estimated using the VertexComponentAnalysis application.\n\n"
     "The application allows estimating the abundance maps with several algorithms:\n\n"
     "* Unconstrained Least Square (ucls)\n"
@@ -121,10 +121,14 @@ private:
     SetParameterDescription("in","The hyperspectral data cube input");
 
     AddParameter(ParameterType_OutputImage, "out",  "Output Image");
-    SetParameterDescription("out","The output abundance map. The abundance fraction are stored in a multispectral image where band N corresponds to the fraction of endmembers N in each pixel.");
+    SetParameterDescription("out","The output abundance map. The abundance "
+      "fraction are stored in a multispectral image where band N corresponds "
+      "to the fraction of endmembers N in each pixel.");
 
     AddParameter(ParameterType_InputImage,  "ie",   "Input endmembers");
-    SetParameterDescription("ie","The endmembers (estimated pure pixels) to use for unmixing. Must be stored as a multispectral image, where each pixel is interpreted as an endmember.");
+    SetParameterDescription("ie","The endmembers (estimated pure pixels) to "
+      "use for unmixing. Must be stored as a multispectral image, where "
+      "each pixel is interpreted as an endmember.");
 
     AddParameter(ParameterType_Choice, "ua", "Unmixing algorithm");
     SetParameterDescription("ua", "The algorithm to use for unmixing");
diff --git a/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx b/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx
index a481fbf5f849102c5035a657528dbd9924412f67..735b699d9c946580b462219f8a7d29f0d4fade80 100644
--- a/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx
+++ b/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx
@@ -50,25 +50,25 @@ private:
   void DoInit() override
   {
     SetName("VertexComponentAnalysis");
-    SetDescription("Given a set of mixed spectral vectors, estimate"
-    "reference substances also known as endmembers using the Vertex"
+    SetDescription("Given a set of mixed spectral vectors, estimate "
+    "reference substances also known as endmembers using the Vertex "
     "Component Analysis algorithm.");
 
     // Documentation
     SetDocName("Vertex Component Analysis");
-    SetDocLongDescription("Apply the Vertex Component Analysis [1] to"
-    "an hyperspectral image to extract endmembers. Given a set of mixed"
-    "spectral vectors (multispectral or hyperspectral), the application"
-    "estimates the spectral signature of reference substances also known"
+    SetDocLongDescription("Apply the Vertex Component Analysis [1] to "
+    "an hyperspectral image to extract endmembers. Given a set of mixed "
+    "spectral vectors (multispectral or hyperspectral), the application "
+    "estimates the spectral signature of reference substances also known "
     "as endmembers.");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
-    SetDocSeeAlso("[1] J. M. P. Nascimento and J. M. B. Dias, Vertex"
-    "component analysis: a fast algorithm to unmix hyperspectral data,"
-    "in IEEE Transactions on Geoscience and Remote Sensing, vol. 43,"
-    "no. 4, pp. 898-910, April 2005.J. M. P. Nascimento and"
-    "J. M. B. Dias, Vertex component analysis: a fast algorithm to"
-    "unmix hyperspectral data, in IEEE Transactions on Geoscience and"
+    SetDocSeeAlso("[1] J. M. P. Nascimento and J. M. B. Dias, Vertex "
+    "component analysis: a fast algorithm to unmix hyperspectral data, "
+    "in IEEE Transactions on Geoscience and Remote Sensing, vol. 43, "
+    "no. 4, pp. 898-910, April 2005.J. M. P. Nascimento and "
+    "J. M. B. Dias, Vertex component analysis: a fast algorithm to "
+    "unmix hyperspectral data, in IEEE Transactions on Geoscience and "
     "Remote Sensing, vol. 43, no. 4, pp. 898-910, April 2005.");
 
     AddDocTag(Tags::Hyperspectral);
@@ -78,9 +78,9 @@ private:
     SetParameterDescription("in","Input hyperspectral data cube");
 
     AddParameter(ParameterType_OutputImage, "outendm", "Output Endmembers");
-    SetParameterDescription("outendm","Endmembers, stored in a"
-    "one-line multi-spectral image.Each pixel corresponds to one"
-    "endmembers and each band values corresponds to the spectral"
+    SetParameterDescription("outendm","Endmembers, stored in a "
+    "one-line multi-spectral image.Each pixel corresponds to one "
+    "endmembers and each band values corresponds to the spectral "
     "signature of the corresponding endmember.");
     MandatoryOn("outendm");
 
diff --git a/Modules/Applications/AppHyperspectral/test/CMakeLists.txt b/Modules/Applications/AppHyperspectral/test/CMakeLists.txt
index ab2f939e9551880e947335b416d46f1efb6f82d5..9b439731a0360ef0287024c0c737de0f436a2a24 100644
--- a/Modules/Applications/AppHyperspectral/test/CMakeLists.txt
+++ b/Modules/Applications/AppHyperspectral/test/CMakeLists.txt
@@ -53,3 +53,24 @@ otb_test_application(NAME  apTvHyVertexComponentAnalysis
                   	             ${TEMP}/apTvHyVertexComponentAnalysis.tif
 )
 
+#----------- EndmemberNumberEstimation TESTS ----------------
+otb_test_application(NAME  apTvHyEndmemberNumberEstimation_vd
+                     APP  EndmemberNumberEstimation
+                     OPTIONS -in ${OTB_DATA_ROOT}/Input/Hyperspectral/synthetic/hsi_cube.tif
+                             -algo vd
+                             -algo.vd.far 0.001
+                     TESTENVOPTIONS ${TEMP}/aptTvHyEndmemberNumberEstimation_vd.txt
+                     VALID --compare-ascii ${EPSILON_7}
+                             ${BASELINE_FILES}/aptTvHyEndmemberNumberEstimation.txt
+                       ${TEMP}/aptTvHyEndmemberNumberEstimation_vd.txt
+)
+
+otb_test_application(NAME  apTvHyEndmemberNumberEstimation_elm
+                     APP  EndmemberNumberEstimation
+                     OPTIONS -in ${OTB_DATA_ROOT}/Input/Hyperspectral/synthetic/hsi_cube.tif
+                             -algo elm
+                     TESTENVOPTIONS ${TEMP}/aptTvHyEndmemberNumberEstimation_elm.txt
+                     VALID --compare-ascii ${EPSILON_7}
+                             ${BASELINE_FILES}/aptTvHyEndmemberNumberEstimation.txt
+                       ${TEMP}/aptTvHyEndmemberNumberEstimation_elm.txt
+)
\ No newline at end of file
diff --git a/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx b/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx
index 4859c7a77eafaddfee286fb12c3eeb2124c8f9fc..e86791307367318fd585223e2bbfecacb826dc3d 100644
--- a/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx
@@ -273,7 +273,7 @@ private:
       // save a reference to the functor
       m_Filters.push_back(transferLogFilter.GetPointer());
       
-      transferLogFilter->SetVariadicInputs(tempImage);
+      transferLogFilter->SetInputs(tempImage);
       transferLogFilter->UpdateOutputInformation();
       
       shrinkFilter->SetInput(transferLogFilter->GetOutput());
diff --git a/Modules/Applications/AppKMZ/app/otbKmzExport.cxx b/Modules/Applications/AppKMZ/app/otbKmzExport.cxx
index 77d4fede8832ad55469b4708fe1a66afc7b16b4b..63dd25d75123777b13b172c61939f8413a44ac72 100644
--- a/Modules/Applications/AppKMZ/app/otbKmzExport.cxx
+++ b/Modules/Applications/AppKMZ/app/otbKmzExport.cxx
@@ -61,7 +61,7 @@ private:
     AddParameter(ParameterType_InputImage,  "in",   "Input image");
     SetParameterDescription("in", "Input image");
 
-    AddParameter(ParameterType_OutputFilename, "out",  "Output .kmz product");
+    AddParameter(ParameterType_OutputFilename, "out",  "Output KMZ product");
     SetParameterDescription("out", "Output Kmz product directory (with .kmz extension)");
 
     AddParameter(ParameterType_Int, "tilesize",  "Tile Size");
diff --git a/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx b/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx
index f3f110aad72274d926122b3acfe715d099110559..09593c093fc49d11a332b5be6c5a08ecf382979e 100644
--- a/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx
+++ b/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx
@@ -271,10 +271,10 @@ private:
 
     classificationFilter = MultiScaleClassificationFilterType::New();
     using namespace Functor::MultiScaleConvexOrConcaveDecisionRule_tags;
-    classificationFilter->SetVariadicNamedInput<max_opening_profile_derivative>( omsCharFilter->GetOutput() );
-    classificationFilter->SetVariadicNamedInput<opening_profile_characteristics>( omsCharFilter->GetOutputCharacteristics() );
-    classificationFilter->SetVariadicNamedInput<max_closing_profile_derivative>( cmsCharFilter->GetOutput() );
-    classificationFilter->SetVariadicNamedInput<closing_profile_characteristics>( cmsCharFilter->GetOutputCharacteristics() );
+    classificationFilter->SetInput<max_opening_profile_derivative>( omsCharFilter->GetOutput() );
+    classificationFilter->SetInput<opening_profile_characteristics>( omsCharFilter->GetOutputCharacteristics() );
+    classificationFilter->SetInput<max_closing_profile_derivative>( cmsCharFilter->GetOutput() );
+    classificationFilter->SetInput<closing_profile_characteristics>( cmsCharFilter->GetOutputCharacteristics() );
     classificationFilter->GetModifiableFunctor().SetSigma( sigma );
     classificationFilter->GetModifiableFunctor().SetLabelSeparator( static_cast<unsigned short>(initValue + profileSize * step) );
     AddProcess(classificationFilter, "Classification");
diff --git a/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx b/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx
index 9afaeccc3ee3843ea8011dfcaaa9ee8bb9a4f9eb..54cf7681065a69bf95da1fb314808ef2d8774a51 100644
--- a/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx
+++ b/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx
@@ -82,7 +82,7 @@ private:
     AddRAMParameter();
 
     // Doc example parameter settings
-    SetDocExampleParameterValue("in","s1_iw_slc.tif");
+    SetDocExampleParameterValue("insar","s1_iw_slc.tif");
     SetDocExampleParameterValue("il", "Burst0.png Burst1.png");
     SetDocExampleParameterValue("out", "otbConcatenateBursts.tif");
 
diff --git a/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx b/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx
index 7e3bb84690331b2ec104275d8ff9860a04acbf6a..b96d2e70c3835825f99f19339de19ce23838a7a4 100644
--- a/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx
+++ b/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx
@@ -179,18 +179,18 @@ private:
 		case 0: // H-alpha-A
 
     if (inhv)
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
+      m_SRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
       else if (invh)
-        m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
+        m_SRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
 
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_SRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_SRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       radius.Fill(GetParameterInt("inco.kernelsize"));
       m_MeanFilter->GetFilter()->SetRadius(radius);
 
       m_MeanFilter->SetInput(m_SRFilter->GetOutput());
-      m_HAFilter->SetVariadicInput<0>(m_MeanFilter->GetOutput());
+      m_HAFilter->SetInput<0>(m_MeanFilter->GetOutput());
       SetParameterOutputImage("out", m_HAFilter->GetOutput());
 
       break;
@@ -198,18 +198,18 @@ private:
     case 1: // Barnes
 
 		if (inhv)
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
+      m_SRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
       else if (invh)
-        m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
+        m_SRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
 
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_SRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_SRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       radius.Fill(GetParameterInt("inco.kernelsize"));
       m_MeanFilter->GetFilter()->SetRadius(radius);
 
       m_MeanFilter->SetInput(m_SRFilter->GetOutput());
-      m_BarnesFilter->SetVariadicInput<0>(m_MeanFilter->GetOutput());
+      m_BarnesFilter->SetInput<0>(m_MeanFilter->GetOutput());
       SetParameterOutputImage("out", m_BarnesFilter->GetOutput());
 
       break;
@@ -217,18 +217,18 @@ private:
     case 2: // Huynen
 
 		if (inhv)
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
+      m_SRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
       else if (invh)
-        m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
+        m_SRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
 
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_SRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_SRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_SRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       radius.Fill(GetParameterInt("inco.kernelsize"));
       m_MeanFilter->GetFilter()->SetRadius(radius);
 
       m_MeanFilter->SetInput(m_SRFilter->GetOutput());
-      m_HuynenFilter->SetVariadicInput<0>(m_MeanFilter->GetOutput());
+      m_HuynenFilter->SetInput<0>(m_MeanFilter->GetOutput());
       SetParameterOutputImage("out", m_HuynenFilter->GetOutput());
 
       break;
@@ -245,7 +245,7 @@ private:
 		m_ImageList->PushBack(GetParameterComplexDoubleImage("invv"));
 
     m_Concatener->SetInput(m_ImageList);
-    m_PauliFilter->SetVariadicInput<0>(m_Concatener->GetOutput());
+    m_PauliFilter->SetInput<0>(m_Concatener->GetOutput());
 
     SetParameterOutputImage("out", m_PauliFilter->GetOutput() );
 
diff --git a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
index 4434518d823f15b5e338c5cb01ec194ab6049b65..d167e27dc9306e933f0f2d96b051d1cc24155a3c 100644
--- a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
+++ b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
@@ -395,12 +395,12 @@ private:
       m_RCohSRFilter = RCohSRFilterType::New();
 
       if (inhv)
-        m_RCohSRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
+        m_RCohSRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
       else if (invh)
-        m_RCohSRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
+        m_RCohSRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
 
-      m_RCohSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_RCohSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_RCohSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_RCohSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outc", m_RCohSRFilter->GetOutput()); // input: 3 x 1 complex channel | output :  6 complex channels
 
@@ -412,12 +412,12 @@ private:
       m_RCovSRFilter = RCovSRFilterType::New();
 
       if (inhv)
-        m_RCovSRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
+        m_RCovSRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
       else if (invh)
-        m_RCovSRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
+        m_RCovSRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
 
-      m_RCovSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_RCovSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_RCovSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_RCovSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outc", m_RCovSRFilter->GetOutput()); // input: 3 x 1 complex channel | output :  6 complex channels
 
@@ -429,12 +429,12 @@ private:
       m_RCCSRFilter = RCCSRFilterType::New();
 
       if (inhv)
-        m_RCCSRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
+        m_RCCSRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("inhv"));
       else if (invh)
-        m_RCCSRFilter->SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
+        m_RCCSRFilter->SetInput<polarimetry_tags::hv_or_vh>(GetParameterComplexDoubleImage("invh"));
 
-      m_RCCSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_RCCSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_RCCSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_RCCSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outc", m_RCCSRFilter->GetOutput()); // input: 3 x 1 complex channel | output :  6 complex channels
 
@@ -444,7 +444,7 @@ private:
     case 3: // ReciprocalCoherencyToReciprocalMuellerImageFilter
 
       m_RCRMFilter = RCRMFilterType::New();
-      m_RCRMFilter->SetVariadicInput<0>(GetParameterComplexDoubleVectorImage("inc"));
+      m_RCRMFilter->SetInput<0>(GetParameterComplexDoubleVectorImage("inc"));
 
       SetParameterOutputImage("outf", m_RCRMFilter->GetOutput()); // input: 6 complex channels | 16 real channels
 
@@ -454,7 +454,7 @@ private:
     case 4: // ReciprocalCovarianceToCoherencyDegreeImageFilter
 
       m_RCCDFilter = RCCDFilterType::New();
-      m_RCCDFilter->SetVariadicInput<0>(GetParameterComplexDoubleVectorImage("inc"));
+      m_RCCDFilter->SetInput<0>(GetParameterComplexDoubleVectorImage("inc"));
 
       SetParameterOutputImage("outc", m_RCCDFilter->GetOutput()); // input: 6 complex channels | 3 complex channels
 
@@ -464,7 +464,7 @@ private:
     case 5: // ReciprocalCovarianceToReciprocalCoherencyImageFilter
 
       m_RCRCFilter = RCRCFilterType::New();
-      m_RCRCFilter->SetVariadicInput<0>(GetParameterComplexDoubleVectorImage("inc"));
+      m_RCRCFilter->SetInput<0>(GetParameterComplexDoubleVectorImage("inc"));
 
       SetParameterOutputImage("outc", m_RCRCFilter->GetOutput()); // input: 6 complex channels | 6 complex channels
 
@@ -474,7 +474,7 @@ private:
     case 6: // ReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter
 
       m_RLCRCCFilter = RLCRCCFilterType::New();
-      m_RLCRCCFilter->SetVariadicInput<0>(GetParameterComplexDoubleVectorImage("inc"));
+      m_RLCRCCFilter->SetInput<0>(GetParameterComplexDoubleVectorImage("inc"));
 
       SetParameterOutputImage("outc", m_RLCRCCFilter->GetOutput()); // input: 6 complex channels | output : 6 complex channels
 
@@ -485,7 +485,7 @@ private:
 
       m_MRCFilter = MRCFilterType::New();
 
-      m_MRCFilter->SetVariadicInput<0>(GetParameterDoubleVectorImage("inf"));
+      m_MRCFilter->SetInput<0>(GetParameterDoubleVectorImage("inf"));
 
       SetParameterOutputImage("outc", m_MRCFilter->GetOutput()); // input: 16 real channels | output : 6 complex channels
 
@@ -499,10 +499,10 @@ private:
     case 8: // SinclairToCoherency
 
       m_CohSRFilter = CohSRFilterType::New();
-      m_CohSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_CohSRFilter->SetVariadicNamedInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
-      m_CohSRFilter->SetVariadicNamedInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
-      m_CohSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_CohSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_CohSRFilter->SetInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
+      m_CohSRFilter->SetInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
+      m_CohSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outc", m_CohSRFilter->GetOutput()); // input: 4 x 1 complex channel | 10 complex channels
 
@@ -512,10 +512,10 @@ private:
     case 9: // SinclairToCovariance
 
       m_CovSRFilter = CovSRFilterType::New();
-      m_CovSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_CovSRFilter->SetVariadicNamedInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
-      m_CovSRFilter->SetVariadicNamedInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
-      m_CovSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_CovSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_CovSRFilter->SetInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
+      m_CovSRFilter->SetInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
+      m_CovSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outc", m_CovSRFilter->GetOutput()); // input: 4 x 1 complex channel | output : 10 complex channels
 
@@ -525,10 +525,10 @@ private:
     case 10: // SinclairToCircularCovariance
 
       m_CCSRFilter = CCSRFilterType::New();
-      m_CCSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_CCSRFilter->SetVariadicNamedInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
-      m_CCSRFilter->SetVariadicNamedInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
-      m_CCSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_CCSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_CCSRFilter->SetInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
+      m_CCSRFilter->SetInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
+      m_CCSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outc", m_CCSRFilter->GetOutput()); // input: 4 x 1 complex channel | output : 10 complex channels
 
@@ -543,10 +543,10 @@ private:
     case 11: // SinclairToMueller
       m_MSRFilter = MSRFilterType::New();
 
-      m_MSRFilter->SetVariadicNamedInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
-      m_MSRFilter->SetVariadicNamedInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
-      m_MSRFilter->SetVariadicNamedInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
-      m_MSRFilter->SetVariadicNamedInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
+      m_MSRFilter->SetInput<polarimetry_tags::hh>(GetParameterComplexDoubleImage("inhh"));
+      m_MSRFilter->SetInput<polarimetry_tags::hv>(GetParameterComplexDoubleImage("inhv"));
+      m_MSRFilter->SetInput<polarimetry_tags::vh>(GetParameterComplexDoubleImage("invh"));
+      m_MSRFilter->SetInput<polarimetry_tags::vv>(GetParameterComplexDoubleImage("invv"));
 
       SetParameterOutputImage("outf", m_MSRFilter->GetOutput()); // input: 4 x 1 complex channel | output : 16 real channels
 
@@ -556,7 +556,7 @@ private:
     case 12: // MuellerToPolarisationDegreeAndPowerImageFilter
       m_MPDPFilter = MPDPFilterType::New();
 
-      m_MPDPFilter->SetVariadicInput<0>(GetParameterDoubleVectorImage("inf"));
+      m_MPDPFilter->SetInput<0>(GetParameterDoubleVectorImage("inf"));
 
       SetParameterOutputImage("outf", m_MPDPFilter->GetOutput()); //  input: 16 real channels | output : 4 real channels
 
diff --git a/Modules/Core/Common/include/otbImportVectorImageFilter.h b/Modules/Core/Common/include/otbImportVectorImageFilter.h
index 9498b2486e4751a9338229d32bc8c1e7d150e890..b6f48accfcf0ab0a11214b71dc723c63e4fd5075 100644
--- a/Modules/Core/Common/include/otbImportVectorImageFilter.h
+++ b/Modules/Core/Common/include/otbImportVectorImageFilter.h
@@ -148,16 +148,16 @@ public:
 protected:
   ImportVectorImageFilter();
   virtual ~ImportVectorImageFilter();
-  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
 
   /** This filter does not actually "produce" any data, rather it "wraps"
    * the user supplied data into an itk::Image.  */
-  virtual void GenerateData();
+   void GenerateData() override;
 
   /** This is a source, so it must set the spacing, size, and largest possible
    * region for the output image that it will produce.
    * \sa ProcessObject::GenerateOutputInformation() */
-  virtual void GenerateOutputInformation();
+   void GenerateOutputInformation() override;
 
   /** This filter can only produce the amount of data that it is given,
    * so we must override ProcessObject::EnlargeOutputRequestedRegion()
@@ -166,7 +166,7 @@ protected:
    * given.)
    *
    * \sa ProcessObject::EnlargeOutputRequestedRegion() */
-  virtual void EnlargeOutputRequestedRegion(itk::DataObject *output);
+   void EnlargeOutputRequestedRegion(itk::DataObject *output) override;
 
 private:
   ImportVectorImageFilter(const ImportVectorImageFilter &) = delete;
diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.h b/Modules/Core/Functor/include/otbFunctorImageFilter.h
index 7aeb88b3b4b58d258877b15e54afcb601bb675e0..e303687afb8f04365aeed5efd06ce427c30a98dc 100644
--- a/Modules/Core/Functor/include/otbFunctorImageFilter.h
+++ b/Modules/Core/Functor/include/otbFunctorImageFilter.h
@@ -234,7 +234,7 @@ template <typename C, typename R, typename... T, typename TNameMap> struct Funct
  * or returns void and has first parameter as output (i.e. T& or itk::VariableLengthVector<T>&)
  *
  * The returned filter is ready to use. Inputs can be set through the
- * SetVariadicInputs() method (see VariadicInputsImageFilter class for
+ * SetInputs() method (see VariadicInputsImageFilter class for
  * details)
  * 
  * \param[in] the Functor to build the filter from
diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx
index 4f1bcfbf260f6ee866ab4b32af9ce7fba4b7f2cd..4686961489593be4f820a0f9e5f6e9d3c115a53f 100644
--- a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx
+++ b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx
@@ -253,7 +253,7 @@ FunctorImageFilter<TFunction, TNameMap>
   // Propagate to each variadic inputs, including possible radius
   // TODO: For now all inputs are padded with the radius, even if they
   // are not neighborhood based
-  functor_filter_details::SetInputRequestedRegions<InputHasNeighborhood>(this->GetVariadicInputs(),requestedRegion, m_Radius);
+  functor_filter_details::SetInputRequestedRegions<InputHasNeighborhood>(this->GetInputs(),requestedRegion, m_Radius);
 }
 
 template <class TFunction, class TNameMap>
@@ -264,7 +264,7 @@ FunctorImageFilter<TFunction, TNameMap>::GenerateOutputInformation()
   Superclass::GenerateOutputInformation();
 
   // Get All variadic inputs
-  auto inputs = this->GetVariadicInputs();
+  auto inputs = this->GetInputs();
 
   // Retrieve an array of number of components per input
   auto inputNbComps = functor_filter_details::GetNumberOfComponentsPerInput(inputs);
@@ -286,7 +286,7 @@ FunctorImageFilter<TFunction, TNameMap>
   itk::ProgressReporter p(this,threadId,outputRegionForThread.GetNumberOfPixels());
 
   // This will build a tuple of iterators to be used
-  auto inputIterators = functor_filter_details::MakeIterators(this->GetVariadicInputs(),outputRegionForThread, m_Radius,InputHasNeighborhood{});
+  auto inputIterators = functor_filter_details::MakeIterators(this->GetInputs(),outputRegionForThread, m_Radius,InputHasNeighborhood{});
 
   // Build a default value
   typename OutputImageType::PixelType outputValueHolder;
diff --git a/Modules/Core/Functor/include/otbVariadicInputsImageFilter.h b/Modules/Core/Functor/include/otbVariadicInputsImageFilter.h
index 6a394b987389eea215f69b2752bfa392f1dbb4f0..519489ac8a87c3eef10cec1e0b025dc825b3666d 100644
--- a/Modules/Core/Functor/include/otbVariadicInputsImageFilter.h
+++ b/Modules/Core/Functor/include/otbVariadicInputsImageFilter.h
@@ -25,28 +25,33 @@
 namespace otb {
 
 /**
+ * \class VariadicInputsImageFilter
  * \brief Base class for image filter with variadic inputs.
  *
  * This filter act as a base class for all filters that will take
  * several input images with different types and produce an output
  * image.
- * 
+ *
  * Type for each input is taken from the variadic template parameter
  * TInputs.
- * 
- * Inputs get be set/get with SetVariadicInput<N>() and
- * GetVariadicInput<N>(), when N is the index (first input is 0) of
- * the input. This is resolved at compile time: you can not call 
- * SetVariadicInput<N>() with an argument not matching the Nth input
+ *
+ * Inputs get be set/get with SetInput<N>() and
+ * GetInput<N>(), when N is the index (first input is 0) of
+ * the input. This is resolved at compile time: you can not call
+ * SetInput<N>() with an argument not matching the Nth input
  * type (it will lead to type mismatch compilation error).
- * 
- * Alternatively, you can call SetVariadicInputs() with all the input
+ *
+ * Note that you can also call SetInput() and GetInput() which will
+ * automatically fetch the first input.
+ *
+ * Alternatively, you can call SetInputs() with all the input
  * image in the same order as in the template parameters.
  *
  * Last, there is a macro that generates SetInput1() ... SetInput10()
  * (iff the number of varidic input types is large enough) for
  * backward compatibility.
- * 
+ *
+ * \ingroup OTBFunctor
  */
 template<class TOuptut, class ... TInputs> class VariadicInputsImageFilter : public itk::ImageSource<TOuptut>
 {
@@ -64,20 +69,26 @@ public:
   // Good old new macro
   itkNewMacro(Self);
 
+  // Import definitions for SetInput and GetInput to avoid shadowing
+  // by SetInput<> and GetIntput<> defined in this method
+  using Superclass::GetInput;
+  using Superclass::SetInput;
+
   /**
    * \param Set the Ith input
    */
-  template <std::size_t I> void SetVariadicInput(const typename std::tuple_element<I,InputTypesTupleType>::type * inputPtr)
+  template <std::size_t I = 0>
+  void SetInput(const InputImageType<I>* inputPtr)
   {
-    static_assert(std::tuple_size<InputTypesTupleType>::value>I,"Template value I is out of range.");
-    this->SetNthInput(I,const_cast<typename std::tuple_element<I,InputTypesTupleType>::type *>(inputPtr));
+    static_assert(NumberOfInputs > I, "Template value I is out of range.");
+    this->SetNthInput(I, const_cast<InputImageType<I>*>(inputPtr));
   }
-  
-#define DefineLegacySetInputMacro(n)                                                                               \
-  template<typename Tuple = InputTypesTupleType, typename Check = typename std::enable_if<n<=std::tuple_size<Tuple>::value >::type> \
-  void SetInput ## n(const typename std::tuple_element<n-1,Tuple>::type * img)                                           \
-  {                                                                                                                \
-    this->template SetVariadicInput<n-1>(img);                                                                             \
+
+#define DefineLegacySetInputMacro(n)                                                                                                  \
+  template <typename Tuple = InputTypesTupleType, typename Check = typename std::enable_if<n <= std::tuple_size<Tuple>::value>::type> \
+  void SetInput##n(const typename std::tuple_element<n - 1, Tuple>::type* img)                                                        \
+  {                                                                                                                                   \
+    this->template SetInput<n - 1>(img);                                                                                              \
   }
 
   // The following defines legacy setters SetInput1()
@@ -95,20 +106,17 @@ public:
 
 #undef DefineLegacySetInputMacro
 
-  /**
-   * \return the Ith variadic input
-   */
-  template <std::size_t I> const typename std::tuple_element<I,InputTypesTupleType>::type * GetVariadicInput()
+  template <std::size_t I = 0>
+  const InputImageType<I>* GetInput()
   {
-    static_assert(std::tuple_size<InputTypesTupleType>::value>I,"Template value I is out of range.");
-    using ImageType = typename std::tuple_element<I,InputTypesTupleType>::type;
-    return dynamic_cast<const ImageType *>(this->GetInput(I));
+    static_assert(NumberOfInputs > I, "Template value I is out of range.");
+    return dynamic_cast<const InputImageType<I>*>(this->GetInput(I));
   }
 
   /**
    * \param inputs A vararg list of inputs 
    */
-  void SetVariadicInputs(TInputs*... inputs)
+  void SetInputs(TInputs*... inputs)
   {
     auto inTuple = std::make_tuple(inputs...);
     SetInputsImpl(inTuple,std::make_index_sequence<sizeof...(inputs)>{});
@@ -117,7 +125,7 @@ public:
   /**
    * \return A tuple with all inputs
    */
-  auto GetVariadicInputs()
+  auto GetInputs()
   {
     return GetInputsImpl(std::make_index_sequence<sizeof...(TInputs)>{});
   }
@@ -133,12 +141,12 @@ protected:
 private:
   template<class Tuple, size_t...Is> auto SetInputsImpl(Tuple& t, std::index_sequence<Is...>)
   {
-    return std::initializer_list<int>{(this->SetVariadicInput<Is>(std::get<Is>(t)),0)...};
+    return std::initializer_list<int>{(this->SetInput<Is>(std::get<Is>(t)), 0)...};
   }
 
   template <size_t...Is> auto GetInputsImpl(std::index_sequence<Is...>)
   {
-    return std::make_tuple(this->GetVariadicInput<Is>()...);
+    return std::make_tuple(this->GetInput<Is>()...);
   }
   
   VariadicInputsImageFilter(const Self&) = delete;
diff --git a/Modules/Core/Functor/include/otbVariadicNamedInputsImageFilter.h b/Modules/Core/Functor/include/otbVariadicNamedInputsImageFilter.h
index f91c556537d40678dc9ac044d5231a4325180fc2..cf601c519cf8745c78fefec4f1f827770d6d4a92 100644
--- a/Modules/Core/Functor/include/otbVariadicNamedInputsImageFilter.h
+++ b/Modules/Core/Functor/include/otbVariadicNamedInputsImageFilter.h
@@ -28,6 +28,16 @@ namespace otb {
 
 namespace internal
 {
+/**
+ * \struct tuple_index
+ * \brief retrieve index of a type in tuple if exists
+ *
+ * This struct allows to retrieve the index of the first occurence of type
+ * Arg in tuple Tuple. If type Arg can not be found, compilation will
+ * end with a static_assert failing.
+ *
+ * ::value holds the index of type Arg in tuple Tuple.
+ */
 template<typename Arg, typename Tuple> struct tuple_index;
 template<typename Arg, typename...Args> struct tuple_index<Arg, std::tuple<Arg,Args...> >
 {
@@ -41,6 +51,43 @@ template<typename Arg, typename NotMatching, typename...Args> struct tuple_index
 };
 }
 
+/**
+ * \class VariadicNamedInputsImageFilter
+ * \brief Adds tagged versions for Get/SetInput to otb::VariadicInputsImageFilter
+ *
+ * This class extends otb::VariadicInputsImageFilter with SetInput<>()
+ * and GetInput<>() with tags.
+ *
+ * Template parameter TInputNameMap should be a tuple of same size as
+ * variadic template parameter TInputs. Each type in the tuple will be
+ * used as a tag to set/get the corresponding input and thus should be
+ * unique in tuple.
+ *
+ * This allows to add semantic to inputs and remove the need for the
+ * user to know input orders and set them by their index.
+ *
+ * Example of use:
+ * \code
+ * struct Foo {};
+ * struct Bar {};
+ * using Names = std::tuple<<Foo,Bar>;
+ *
+ * using Filter = VariadicNamedInputsImageFilter<OutputType, Names,
+ * InputType1, InputType2>;
+ *
+ * // Set the input corresponding to Foo tag:
+ * filter->SetInput<Foo>(in);
+ *
+ * // Get the input corresponding to Bar tag:
+ * auto in = filter->GetInput<Bar>();
+ *
+ * \endcode
+ *
+ * \sa otb::VariadicNamedInputsImageFilter
+ * \sa otb::FunctorImageFilter
+ *
+ * \ingroup OTBFunctor
+ */
 template<class TOuptut, class TInputNameMap, class ... TInputs> class VariadicNamedInputsImageFilter : public VariadicInputsImageFilter<TOuptut,TInputs...>
 {
 public:
@@ -53,30 +100,61 @@ public:
   template <size_t I> using InputImageType = typename Superclass::template InputImageType<I>;
   static constexpr size_t NumberOfInputs   = Superclass::NumberOfInputs;
 
+  // This checks that TInputNameMap has the correct size
   static_assert(std::tuple_size<TInputNameMap>::value == NumberOfInputs,"Tuple for input name does not match the size of ... TInputs");
-  
+
+  // Good old new macro
   itkNewMacro(Self);
-  
-  template <typename Tag> void SetVariadicNamedInput(const InputImageType<internal::tuple_index<Tag, TInputNameMap>::value> * inputPtr)
+
+  // Import definitions for SetInput and GetInput to avoid shadowing
+  // by SetInput<> and GetIntput<> defined in this method
+  using Superclass::GetInput;
+  using Superclass::SetInput;
+
+  /**
+   * Set the input corresponding to tag Tag
+   * \tparam Tag tag of the input
+   * \param inputPtr the pointer to the input image
+   */
+  template <typename Tag>
+  void SetInput(const InputImageType<internal::tuple_index<Tag, TInputNameMap>::value>* inputPtr)
   {
     constexpr size_t idx = internal::tuple_index<Tag, TInputNameMap>::value;
     this->SetNthInput(idx,const_cast<InputImageType<idx> *>(inputPtr));
   }
 
-  template <typename Tag> void SetVariadicNamedInput(Tag,const InputImageType<internal::tuple_index<Tag, TInputNameMap>::value> * inputPtr)
+  /**
+   * Set the input corresponding to tag Tag
+   * \param tag tag of the input
+   * \param inputPtr the pointer to the input image
+   */
+  template <typename Tag>
+  void SetInput(Tag, const InputImageType<internal::tuple_index<Tag, TInputNameMap>::value>* inputPtr)
   {
-    SetVariadicNamedInput<Tag>(inputPtr);
+    SetInput<Tag>(inputPtr);
   }
-  
-  template <typename Tag> const InputImageType<internal::tuple_index<Tag,TInputNameMap>::value> * GetVariadicNamedInput()
+
+  /**
+   * Get the input corresponding to tag Tag
+   * \tparam Tag tag of the input
+   * \return the pointer to the input image
+   */
+  template <typename Tag>
+  const InputImageType<internal::tuple_index<Tag, TInputNameMap>::value>* GetInput()
   {
     constexpr size_t idx = internal::tuple_index<Tag, TInputNameMap>::value;
-    return dynamic_cast<const InputImageType<idx> *>(this->GetInput(idx));
+    return dynamic_cast<const InputImageType<idx>*>(this->Superclass::GetInput(idx));
   }
 
-  template <typename Tag> const InputImageType<internal::tuple_index<Tag,TInputNameMap>::value> * GetVariadicNamedInput(Tag)
+  /**
+   * Get the input corresponding to tag Tag
+   * \param tag tag of the input
+   * \return the pointer to the input image
+   */
+  template <typename Tag>
+  const InputImageType<internal::tuple_index<Tag, TInputNameMap>::value>* GetInput(Tag)
   {
-    return GetVariadicNamedInput<Tag>();
+    return GetInput<Tag>();
   }
 
 protected:
diff --git a/Modules/Core/Functor/test/otbFunctorImageFilter.cxx b/Modules/Core/Functor/test/otbFunctorImageFilter.cxx
index 0bba72c5aeb1e15bd7842af4ef579f124bd2d913..6155c35a409fb883adf389250957ddb8c5bdabc8 100644
--- a/Modules/Core/Functor/test/otbFunctorImageFilter.cxx
+++ b/Modules/Core/Functor/test/otbFunctorImageFilter.cxx
@@ -143,28 +143,28 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
   using FilterType = typename decltype(filter)::ObjectType;
   static_assert(FilterType::NumberOfInputs == 1,"");
   static_assert(std::is_same<typename FilterType::template InputImageType<0>, InputImageType>::value, "");
-  filter->SetVariadicInputs(in);
+  filter->SetInputs(in);
   filter->SetInput1(in);
-  filter->template SetVariadicInput<0>(in); // template keyword to
-                                            // avoid C++ parse
-                                            // ambiguity
-  auto res = filter->template GetVariadicInput<0>();
-  
+  filter->template SetInput<0>(in); // template keyword to
+                                    // avoid C++ parse
+                                    // ambiguity
+  auto res = filter->template GetInput<0>();
+
   filter->Update();
 
   // Test named input version
   struct tag{};
   using inputNames = std::tuple<tag>;
   auto filter1 = NewFunctorFilter<decltype(functor),inputNames>(functor);
-  filter1->template SetVariadicNamedInput<tag>(in);
-  filter1->SetVariadicNamedInput(tag{},in);
-  res = filter1->template GetVariadicNamedInput<tag>();
-  res = filter1->GetVariadicNamedInput(tag{});
+  filter1->template SetInput<tag>(in);
+  filter1->SetInput(tag{}, in);
+  res = filter1->template GetInput<tag>();
+  res = filter1->GetInput(tag{});
   filter1->Update();
 
   // Test static New() operator
   auto oldStyleNewFilter = FunctorImageFilter<decltype(functor)>::New();
-  oldStyleNewFilter->SetVariadicInputs(in);
+  oldStyleNewFilter->SetInputs(in);
   oldStyleNewFilter->Update();
 
   // Hack to silent -Wunused-but-set-variable
@@ -181,11 +181,11 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
   auto functorNonConstOperator = TestOperatorNonConst<TOut,TIn>{};
   auto filterWithNonConstOperator = NewFunctorFilter(functorNonConstOperator);
   filterWithNonConstOperator->SetInput1(in);
-  filterWithNonConstOperator->Update();  
+  filterWithNonConstOperator->Update();
 
-  filterWithVoidReturn->SetVariadicInputs(in);
+  filterWithVoidReturn->SetInputs(in);
   filterWithVoidReturn->SetInput1(in);
-  filterWithVoidReturn->template SetVariadicInput<0>(in); // template keyword to avoid C++ parse ambiguity
+  filterWithVoidReturn->template SetInput<0>(in); // template keyword to avoid C++ parse ambiguity
   filterWithVoidReturn->Update();
   
   // Test with simple lambda
@@ -195,7 +195,7 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
                   return ret;
                 };
   auto filterWithLambda = NewFunctorFilter(lambda,1, {{0,0}});
-  filterWithLambda->SetVariadicInputs(in);
+  filterWithLambda->SetInputs(in);
   filterWithLambda->Update();
 
   // Test with standard filter use
@@ -357,109 +357,105 @@ int otbFunctorImageFilter(int itkNotUsed(argc), char * itkNotUsed(argv) [])
   cimage->Allocate();
   cimage->FillBuffer(0);
 
-  // Test VariadicInputsImageFilter
+  // Test InputsImageFilter
   auto filter = otb::VariadicInputsImageFilter<VectorImageType,VectorImageType,ImageType>::New();
-  filter->SetVariadicInput<0>(vimage);
-  filter->SetVariadicInput<1>(image);
+  filter->SetInput(vimage);
+  filter->SetInput<0>(vimage);
+  filter->SetInput<1>(image);
 
   filter->SetInput1(vimage);
   filter->SetInput2(image);
 
-  filter->SetVariadicInputs(vimage,image);
-  std::cout<<filter->GetVariadicInput<0>()<< filter->GetVariadicInput<1>()<<std::endl;
+  filter->SetInputs(vimage, image);
+  std::cout << filter->GetInput<0>() << filter->GetInput<1>() << std::endl;
 
   // Test VariadicNamedInputsImageFilter
   struct xs {};
   struct pan {};
   using Names = std::tuple<xs,pan>; 
    auto filterWithNames = otb::VariadicNamedInputsImageFilter<VectorImageType, Names, VectorImageType,ImageType>::New();
-   filterWithNames->SetVariadicNamedInput<xs>(vimage);
-  
-  // Test FunctorImageFilter with a built-in math function
-  using CosType = double(double);
-  auto filterCos = NewFunctorFilter(static_cast<CosType *>(std::cos));
-  filterCos->SetVariadicInputs(image);
-  filterCos->Update();
-    
-   filterWithNames->SetVariadicNamedInput<pan>(image);
-
-   std::cout<<filterWithNames->GetVariadicNamedInput<xs>()<< filterWithNames->GetVariadicNamedInput<pan>()<<std::endl;
-
-  
-  
-  // test FunctorImageFilter with a lambda
-  double scale = 10.;  
-  auto Lambda1 = [scale](double p)
-               {
-                 return scale*p;
-               };
-  auto filterLambda = NewFunctorFilter(Lambda1);
-  filterLambda->SetVariadicInputs(image);
-  filterLambda->Update();
-
-  // test FunctorImageFilter with a lambda that returns a
-  // VariableLengthVector
-  // Converts a neighborhood to a VariableLengthVector
-  auto Lambda2 = [](const itk::Neighborhood<double> & in)
-                 {
-                   itk::VariableLengthVector<double> out(in.Size());
-                   std::size_t idx{0};
-                   for(auto it = in.Begin(); it!=in.End();++it,++idx)
-                     {
-                     out[idx]=*it;
-                     }
-                   return out;
-                 };
-
-  // In this case, we use the helper function which allows to specify
-  // the number of outputs
-  auto filterLambda2  = NewFunctorFilter(Lambda2,vimage->GetNumberOfComponentsPerPixel(),{{3,3}});
-  filterLambda2->SetVariadicInputs(image);
-  filterLambda2->Update();
-  
-  // Test FunctorImageFilter with the VariadicConcatenate operator
-  using ConcatFunctorType = Functor::VariadicConcatenate<double, double, itk::VariableLengthVector<double> >;
-  auto concatenate = NewFunctorFilter(ConcatFunctorType{});
-  concatenate->SetVariadicInputs(image,vimage);
-  concatenate->Update();
-  
-  // Test FunctorImageFilter With VariadicAdd functor
-  using AddFunctorType = Functor::VariadicAdd<double, double, double>;
-  auto add = NewFunctorFilter(AddFunctorType{});
-  add->SetVariadicInput<0>(image);
-  add->SetVariadicInput<1>(image);
-  add->Update();
-
-  // Test FunctorImageFilter with BandExtraction functor
-  using ExtractFunctorType = BandExtraction<double,double>;
-  ExtractFunctorType extractFunctor{1,2};
-  auto extract = NewFunctorFilter(extractFunctor);
-  extract->SetVariadicInputs(vimage);
-  extract->Update();
-  
-  // Test FunctorImageFilter With Mean functor
-  using MeanFunctorType = Mean<double,double>;
-  auto median = NewFunctorFilter(MeanFunctorType{},{{2,2}});
-  median->SetVariadicInputs(image);
-  median->Update();
-
-  // Test FunctorImageFilter with MaxInEachChannel
-  using MaxInEachChannelType = MaxInEachChannel<double>;
-  auto maxInEachChannel = NewFunctorFilter(MaxInEachChannelType{},{{3,3}});
-  maxInEachChannel->SetVariadicInputs(vimage);
-  maxInEachChannel->Update();
-
-  // Test FunctorImageFilter with Module (complex=
-  using ModulusType = VectorModulus<double>;
-  auto modulus = NewFunctorFilter(ModulusType{});
-  modulus->SetVariadicInputs(cvimage);
-  modulus->Update();
-
-  auto LambdaComplex = [] (const std::complex<double> & in) {return std::arg(in);};
-  auto argFilter = NewFunctorFilter(LambdaComplex);
-  argFilter->SetVariadicInputs(cimage);
-  argFilter->Update();
-  
- return EXIT_SUCCESS;
+   filterWithNames->SetInput<xs>(vimage);
+
+   // Test FunctorImageFilter with a built-in math function
+   using CosType  = double(double);
+   auto filterCos = NewFunctorFilter(static_cast<CosType*>(std::cos));
+   filterCos->SetInputs(image);
+   filterCos->Update();
+
+   filterWithNames->SetInput<pan>(image);
+
+   std::cout << filterWithNames->GetInput<xs>() << filterWithNames->GetInput<pan>() << std::endl;
+
+
+   // test FunctorImageFilter with a lambda
+   double scale        = 10.;
+   auto   Lambda1      = [scale](double p) { return scale * p; };
+   auto   filterLambda = NewFunctorFilter(Lambda1);
+   filterLambda->SetInputs(image);
+   filterLambda->Update();
+
+   // test FunctorImageFilter with a lambda that returns a
+   // VariableLengthVector
+   // Converts a neighborhood to a VariableLengthVector
+   auto Lambda2 = [](const itk::Neighborhood<double>& in) {
+     itk::VariableLengthVector<double> out(in.Size());
+     std::size_t                       idx{0};
+     for (auto it = in.Begin(); it != in.End(); ++it, ++idx)
+     {
+       out[idx] = *it;
+     }
+     return out;
+   };
+
+   // In this case, we use the helper function which allows to specify
+   // the number of outputs
+   auto filterLambda2 = NewFunctorFilter(Lambda2, vimage->GetNumberOfComponentsPerPixel(), {{3, 3}});
+   filterLambda2->SetInputs(image);
+   filterLambda2->Update();
+
+   // Test FunctorImageFilter with the VariadicConcatenate operator
+   using ConcatFunctorType = Functor::VariadicConcatenate<double, double, itk::VariableLengthVector<double>>;
+   auto concatenate        = NewFunctorFilter(ConcatFunctorType{});
+   concatenate->SetInputs(image, vimage);
+   concatenate->Update();
+
+   // Test FunctorImageFilter With VariadicAdd functor
+   using AddFunctorType = Functor::VariadicAdd<double, double, double>;
+   auto add             = NewFunctorFilter(AddFunctorType{});
+   add->SetInput<0>(image);
+   add->SetInput<1>(image);
+   add->Update();
+
+   // Test FunctorImageFilter with BandExtraction functor
+   using ExtractFunctorType = BandExtraction<double, double>;
+   ExtractFunctorType extractFunctor{1, 2};
+   auto               extract = NewFunctorFilter(extractFunctor);
+   extract->SetInputs(vimage);
+   extract->Update();
+
+   // Test FunctorImageFilter With Mean functor
+   using MeanFunctorType = Mean<double, double>;
+   auto median           = NewFunctorFilter(MeanFunctorType{}, {{2, 2}});
+   median->SetInputs(image);
+   median->Update();
+
+   // Test FunctorImageFilter with MaxInEachChannel
+   using MaxInEachChannelType = MaxInEachChannel<double>;
+   auto maxInEachChannel      = NewFunctorFilter(MaxInEachChannelType{}, {{3, 3}});
+   maxInEachChannel->SetInputs(vimage);
+   maxInEachChannel->Update();
+
+   // Test FunctorImageFilter with Module (complex=
+   using ModulusType = VectorModulus<double>;
+   auto modulus      = NewFunctorFilter(ModulusType{});
+   modulus->SetInputs(cvimage);
+   modulus->Update();
+
+   auto LambdaComplex = [](const std::complex<double>& in) { return std::arg(in); };
+   auto argFilter     = NewFunctorFilter(LambdaComplex);
+   argFilter->SetInputs(cimage);
+   argFilter->Update();
+
+   return EXIT_SUCCESS;
 }
 
diff --git a/Modules/Feature/Edge/include/otbLocalHoughFilter.hxx b/Modules/Feature/Edge/include/otbLocalHoughFilter.hxx
index bb7e70cdb43a0cc578575453dcccde9d9daba584..c3813ae207b487b79de1c09a9d81602d302d42ea 100644
--- a/Modules/Feature/Edge/include/otbLocalHoughFilter.hxx
+++ b/Modules/Feature/Edge/include/otbLocalHoughFilter.hxx
@@ -228,8 +228,7 @@ LocalHoughFilter<TInputImage>
       // ---------------------------------------
       // Get the list of LineSpatialObject lines
       // ---------------------------------------
-
-      #if !defined(ITK_LEGACY_REMOVE)
+      #if ITK_VERSION_MAJOR < 4 || (ITK_VERSION_MAJOR == 4 && ITK_VERSION_MINOR <= 12)
       lines = houghFilter->GetLines(m_NumberOfLines);
       #else
       lines = houghFilter->GetLines();
diff --git a/Modules/Filtering/MathParserX/include/otbParserXPlugins.h b/Modules/Filtering/MathParserX/include/otbParserXPlugins.h
index 8f5b6063b9f6b7878b6db12c1f1fb8193eead50c..1ee1d734182efa6f5a769a1ac7605e5dd858ae68 100644
--- a/Modules/Filtering/MathParserX/include/otbParserXPlugins.h
+++ b/Modules/Filtering/MathParserX/include/otbParserXPlugins.h
@@ -23,7 +23,15 @@
 
 #include "itkMacro.h"
 #include "otbMath.h"
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Winconsistent-missing-override"
+#include "mpParser.h"
+#pragma GCC diagnostic pop
+#else
 #include "mpParser.h"
+#endif
 #include <vector>
 
 namespace otb
diff --git a/Modules/Filtering/Path/include/otbRegionImageToRectangularPathListFilter.hxx b/Modules/Filtering/Path/include/otbRegionImageToRectangularPathListFilter.hxx
index 0ef024be81840576571a28c1a15600b840425ab1..e3a84c2ae9b42da1fcbf7e08352cd7e9700e1219 100644
--- a/Modules/Filtering/Path/include/otbRegionImageToRectangularPathListFilter.hxx
+++ b/Modules/Filtering/Path/include/otbRegionImageToRectangularPathListFilter.hxx
@@ -129,7 +129,7 @@ RegionImageToRectangularPathListFilter<TInputImage, TOutputPath>
   typedef typename TInputImage::IndexType IndexType;
   std::vector<IndexType>                    regionContainer; // Pb for growing from within loop
   typename std::vector<IndexType>::iterator regionIterator;
-  typename std::vector<IndexType>::iterator regionIterator2;
+
   regionContainer.reserve(Taille[0] * Taille[1]); // to avoid growth problems
   IndexType explorerIndex; // position whose neighbors are to be checked for inclusion in current region
 
diff --git a/Modules/Filtering/Polarimetry/include/otbMuellerToPolarisationDegreeAndPowerImageFilter.h b/Modules/Filtering/Polarimetry/include/otbMuellerToPolarisationDegreeAndPowerImageFilter.h
index 78cfada21c663fd8dfbbb15313b7d96cb3126930..da95ec0054c92a37d30224e6849eb8cbcdfc65b9 100644
--- a/Modules/Filtering/Polarimetry/include/otbMuellerToPolarisationDegreeAndPowerImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbMuellerToPolarisationDegreeAndPowerImageFilter.h
@@ -192,7 +192,7 @@ private:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbMuellerToReciprocalCovarianceImageFilter.h b/Modules/Filtering/Polarimetry/include/otbMuellerToReciprocalCovarianceImageFilter.h
index 26cb4c542469584a685a25f7b1ad1a357c24f8ae..1cb0cc0da99dc56a5e97dd420de4524f06962303 100644
--- a/Modules/Filtering/Polarimetry/include/otbMuellerToReciprocalCovarianceImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbMuellerToReciprocalCovarianceImageFilter.h
@@ -118,7 +118,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalBarnesDecompImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalBarnesDecompImageFilter.h
index a11d654692fa4d09bf6fefb34161ef41a96e7fc1..110885a4e2b781a02346269abf661d875d4d8337 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalBarnesDecompImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalBarnesDecompImageFilter.h
@@ -118,7 +118,7 @@ private:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalCoherencyToReciprocalMuellerImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalCoherencyToReciprocalMuellerImageFilter.h
index 2a74d4c20b441a138e000e9aca9df262c3d9df53..0874ef8bca80dd076969da697bb04ccde137df6f 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalCoherencyToReciprocalMuellerImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalCoherencyToReciprocalMuellerImageFilter.h
@@ -124,7 +124,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToCoherencyDegreeImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToCoherencyDegreeImageFilter.h
index 2dcea9a36a6a25afdba7c3825a1d8cbe75c3b907..9bfb0b0c4ef72ae1acd2d758a7b73e3e6fcb43ca 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToCoherencyDegreeImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToCoherencyDegreeImageFilter.h
@@ -107,7 +107,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.h
index e61f281c6c58c613cde0a155ce5812b7932dab85..f5de806d5cdf1020815d75413aadeba547467158 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.h
@@ -99,7 +99,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h
index 4392ea38be1d5d65df92d2d2a73d2cc29e4b4725..3de31807ec894e8d3940e6cb3e77a15c6f5d15e3 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h
@@ -187,7 +187,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalHuynenDecompImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalHuynenDecompImageFilter.h
index 56121ce8cf311fc405c064694a08f8ac7c9b2805..352f3864727a75e0e34498c5915aed97fd9cd31b 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalHuynenDecompImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalHuynenDecompImageFilter.h
@@ -84,7 +84,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.h
index 720e635c05592178f02147d4438e58227bfe8ddf..7898a6e0405d3ef174b28b3bbbbbf702cab5ce58 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.h
@@ -102,7 +102,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalPauliDecompImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalPauliDecompImageFilter.h
index 538c57cb8e65515696d1cba20bc3b28e04799888..9b6fe5442e952d7fcdd56a9673ef24458a4e494f 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalPauliDecompImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalPauliDecompImageFilter.h
@@ -76,7 +76,7 @@ public:
  *
  * Set inputs with:
  * \code
- * SetVariadicInput<0>(inputPtr);
+ * SetInput<0>(inputPtr);
  * \endcode
  *
  * \ingroup OTBPolarimetry
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToCircularCovarianceMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToCircularCovarianceMatrixImageFilter.h
index 8fd61421577bad320e951cef2d14b3b0e22cc85f..a7caf639cccc0790363ec41356926d2cc9cb9edc 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToCircularCovarianceMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToCircularCovarianceMatrixImageFilter.h
@@ -132,10 +132,10 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv>(inputPtr);
+ * SetInput<polarimetry_tags::vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToCoherencyMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToCoherencyMatrixImageFilter.h
index 43bd16fcffc9efe9f757428ba043fc5aacb8b75e..7d557086e3e2d17340c1e6de80f31eae56269804 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToCoherencyMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToCoherencyMatrixImageFilter.h
@@ -122,10 +122,10 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv>(inputPtr);
+ * SetInput<polarimetry_tags::vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToCovarianceMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToCovarianceMatrixImageFilter.h
index 557457cb66de13704c8b3cb855bdccbe5f87d8f8..a02b2ad74b8b462ae3e7e8f8b417ec37b478b7bf 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToCovarianceMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToCovarianceMatrixImageFilter.h
@@ -107,10 +107,10 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv>(inputPtr);
+ * SetInput<polarimetry_tags::vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToMuellerMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToMuellerMatrixImageFilter.h
index 665a48f5d6b39055e38e9e2f0f8516f2edea4cc4..fa5d0e0047c0d5344ab4f71180ed1423a60347bb 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToMuellerMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToMuellerMatrixImageFilter.h
@@ -147,10 +147,10 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv>(inputPtr);
+ * SetInput<polarimetry_tags::vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCircularCovarianceMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCircularCovarianceMatrixImageFilter.h
index 1ab5d8e1872ef3fbfa389141a49ef80adc21ed7c..ce840dea622814bbf1dfb5b7e489f9b372dcc54c 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCircularCovarianceMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCircularCovarianceMatrixImageFilter.h
@@ -112,9 +112,9 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv_or_vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCoherencyMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCoherencyMatrixImageFilter.h
index 3e7cf7631d9edd85eba0a6656c7421695a38d4c4..c2a5874c867459822896f76f3c33c3bd0adeb2ab 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCoherencyMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCoherencyMatrixImageFilter.h
@@ -113,9 +113,9 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv_or_vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCovarianceMatrixImageFilter.h b/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCovarianceMatrixImageFilter.h
index cd9d270388bb8ac074d57aa26feef50a06833951..e1ffcf88ffbf70081ad3c24484a7bf917fe77a6b 100644
--- a/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCovarianceMatrixImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbSinclairToReciprocalCovarianceMatrixImageFilter.h
@@ -111,9 +111,9 @@ public:
  * Set inputs with:
  * \code
  *
- * SetVariadicNamedInput<polarimetry_tags::hh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::hv_or_vh>(inputPtr);
- * SetVariadicNamedInput<polarimetry_tags::vv>(inputPtr);
+ * SetInput<polarimetry_tags::hh>(inputPtr);
+ * SetInput<polarimetry_tags::hv_or_vh>(inputPtr);
+ * SetInput<polarimetry_tags::vv>(inputPtr);
  *
  * \endcode
  *
diff --git a/Modules/Filtering/Polarimetry/test/otbMuellerToPolarisationDegreeAndPowerImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbMuellerToPolarisationDegreeAndPowerImageFilter.cxx
index 9d744c3c17143c299df70ac2259f8c10dbfe5d5a..70e0d209b84eb9e88a5ea827b20c63410f9d4867 100644
--- a/Modules/Filtering/Polarimetry/test/otbMuellerToPolarisationDegreeAndPowerImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbMuellerToPolarisationDegreeAndPowerImageFilter.cxx
@@ -48,7 +48,7 @@ int otbMuellerToPolarisationDegreeAndPowerImageFilter(int itkNotUsed(argc), char
   reader->SetFileName(inputFilename);
 
   FilterType::Pointer filter = FilterType::New();
-  filter->SetVariadicInput<0>(reader->GetOutput());
+  filter->SetInput<0>(reader->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(filter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbMuellerToReciprocalCovarianceImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbMuellerToReciprocalCovarianceImageFilter.cxx
index 058fb6c6e44303bec978f1d043974dd82f71b3f2..a4e2527469e551dffbae78b1a60434aaf61520c7 100644
--- a/Modules/Filtering/Polarimetry/test/otbMuellerToReciprocalCovarianceImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbMuellerToReciprocalCovarianceImageFilter.cxx
@@ -49,7 +49,7 @@ int otbMuellerToReciprocalCovarianceImageFilter(int itkNotUsed(argc), char * arg
   reader->SetFileName(inputFilename );
 
   FilterType::Pointer filter = FilterType::New();
-  filter->SetVariadicInput<0>(reader->GetOutput());
+  filter->SetInput<0>(reader->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(filter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalBarnesDecomp.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalBarnesDecomp.cxx
index c384ad3ba904de9f61cc40bc06e9262ec115e048..ab746c228609e774f27ad21ca7f60b99be5ec3b3 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalBarnesDecomp.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalBarnesDecomp.cxx
@@ -81,13 +81,13 @@ int otbReciprocalBarnesDecompImageFilter(int itkNotUsed(argc), char * argv[])
   readerHV->SetFileName(inputFilenameHV);
   readerVV->SetFileName(inputFilenameVV);
 
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::hh{}, readerHH->GetOutput());
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::hv_or_vh{}, readerHV->GetOutput());
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::vv{}, readerVV->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::hh{}, readerHH->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::hv_or_vh{}, readerHV->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::vv{}, readerVV->GetOutput());
 
   perBand->SetInput(sinclairtocov->GetOutput());
 
-  barnesfilter->SetVariadicInput<0>(perBand->GetOutput());
+  barnesfilter->SetInput<0>(perBand->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(barnesfilter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalCoherencyToReciprocalMuellerImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalCoherencyToReciprocalMuellerImageFilter.cxx
index c24b5e822230cca71b7cc6a51d0f14946b8198ac..51d516bdad5cad584f9396b61d6bf319da869962 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalCoherencyToReciprocalMuellerImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalCoherencyToReciprocalMuellerImageFilter.cxx
@@ -53,7 +53,7 @@ int otbReciprocalCoherencyToReciprocalMuellerImageFilter(int itkNotUsed(argc), c
   reader->SetFileName(inputFilename);
 
   FilterType::Pointer filter = FilterType::New();
-  filter->SetVariadicInput<0>(reader->GetOutput());
+  filter->SetInput<0>(reader->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(filter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToCoherencyDegreeImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToCoherencyDegreeImageFilter.cxx
index f5805c0f5d49959ac347c801186f707dd135dbea..c3c28c89c848b9ad72201de604feb808913408c0 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToCoherencyDegreeImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToCoherencyDegreeImageFilter.cxx
@@ -49,7 +49,7 @@ int otbReciprocalCovarianceToCoherencyDegreeImageFilter(int itkNotUsed(argc), ch
   reader->SetFileName(inputFilename);
 
   FilterType::Pointer filter = FilterType::New();
-  filter->SetVariadicInput<0>(reader->GetOutput());
+  filter->SetInput<0>(reader->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(filter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.cxx
index b6544e25a11e799068b4fdedc8106717d7c66ddc..4b9f0fd56ca2a7ec130f3d6c7e226a6dce7bfaf7 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalCovarianceToReciprocalCoherencyImageFilter.cxx
@@ -47,7 +47,7 @@ int otbReciprocalCovarianceToReciprocalCoherencyImageFilter(int itkNotUsed(argc)
   reader->SetFileName(inputFilename);
 
   FilterType::Pointer filter = FilterType::New();
-  filter->SetVariadicInput<0>(reader->GetOutput());
+  filter->SetInput<0>(reader->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(filter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalHAlphaImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalHAlphaImageFilter.cxx
index f4c272f322ffe64c6bc6787626d64c5f730333c8..e3980b0f6b53ad95ace0dbbca57cebf17128be37 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalHAlphaImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalHAlphaImageFilter.cxx
@@ -82,13 +82,13 @@ int otbReciprocalHAlphaImageFilter(int itkNotUsed(argc), char * argv[])
   readerHV->SetFileName(inputFilenameHV);
   readerVV->SetFileName(inputFilenameVV);
 
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::hh{}, readerHH->GetOutput());
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::hv_or_vh{}, readerHV->GetOutput());
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::vv{}, readerVV->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::hh{}, readerHH->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::hv_or_vh{}, readerHV->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::vv{}, readerVV->GetOutput());
 
   perBand->SetInput(sinclairtocov->GetOutput());
 
-  haafilter->SetVariadicInput<0>(perBand->GetOutput());
+  haafilter->SetInput<0>(perBand->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(haafilter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalHuynenDecomp.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalHuynenDecomp.cxx
index 2a5f99da75fff31b56e542fd5db00e27d7a9d831..1523c6c7d255d662420a2fb16aef562d8580f9b8 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalHuynenDecomp.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalHuynenDecomp.cxx
@@ -79,13 +79,13 @@ int otbReciprocalHuynenDecompImageFilter(int itkNotUsed(argc), char * argv[])
   readerHV->SetFileName(inputFilenameHV);
   readerVV->SetFileName(inputFilenameVV);
 
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::hh{}, readerHH->GetOutput());
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::hv_or_vh{}, readerHV->GetOutput());
-  sinclairtocov->SetVariadicNamedInput(otb::polarimetry_tags::vv{}, readerVV->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::hh{}, readerHH->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::hv_or_vh{}, readerHV->GetOutput());
+  sinclairtocov->SetInput(otb::polarimetry_tags::vv{}, readerVV->GetOutput());
 
   perBand->SetInput(sinclairtocov->GetOutput());
 
-  huynenfilter->SetVariadicInput<0>(perBand->GetOutput());
+  huynenfilter->SetInput<0>(perBand->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(huynenfilter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.cxx
index bf3f4d9f219a1cfb16be5bc92e2d2d07fdb96a59..61e960a228cfc7c5cbfca8ab1cb520a9fe81b086 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter.cxx
@@ -49,7 +49,7 @@ int otbReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter(int i
   reader->SetFileName(inputFilename);
 
   FilterType::Pointer filter = FilterType::New();
-  filter->SetVariadicInput<0>(reader->GetOutput());
+  filter->SetInput<0>(reader->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(filter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbReciprocalPauliDecomp.cxx b/Modules/Filtering/Polarimetry/test/otbReciprocalPauliDecomp.cxx
index a1566121c4d0dae32f978d798dd394d2f83cbb64..8b63d987fe0d269586b0c99c9525d633cb827839 100644
--- a/Modules/Filtering/Polarimetry/test/otbReciprocalPauliDecomp.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbReciprocalPauliDecomp.cxx
@@ -69,7 +69,7 @@ int otbReciprocalPauliDecompImageFilter(int itkNotUsed(argc), char * argv[])
   nriToOneCfilter->SetInput(1,readerHV->GetOutput());
   nriToOneCfilter->SetInput(2,readerVV->GetOutput());
 
-  paulifilter->SetVariadicInput<0>(nriToOneCfilter->GetOutput());
+  paulifilter->SetInput<0>(nriToOneCfilter->GetOutput());
 
   writer->SetFileName(outputFilename);
   writer->SetInput(paulifilter->GetOutput());
diff --git a/Modules/Filtering/Polarimetry/test/otbSinclairImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbSinclairImageFilter.cxx
index b855b40a3cb59ee3ab9cdffb18466ac977bd2997..dd446935d000770049f9d05bce03ebec5e8420e9 100644
--- a/Modules/Filtering/Polarimetry/test/otbSinclairImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbSinclairImageFilter.cxx
@@ -63,10 +63,10 @@ int generic_SinclairImageFilter(int itkNotUsed(argc), char* argv[])
   reader1->SetFileName(inputFilename1);
   reader2->SetFileName(inputFilename2);
   reader3->SetFileName(inputFilename3);
-  filter->SetVariadicNamedInput(polarimetry_tags::hh{}, reader1->GetOutput());
-  filter->SetVariadicNamedInput(polarimetry_tags::hv{}, reader2->GetOutput());
-  filter->SetVariadicNamedInput(polarimetry_tags::vh{}, reader2->GetOutput());
-  filter->SetVariadicNamedInput(polarimetry_tags::vv{}, reader3->GetOutput());
+  filter->SetInput(polarimetry_tags::hh{}, reader1->GetOutput());
+  filter->SetInput(polarimetry_tags::hv{}, reader2->GetOutput());
+  filter->SetInput(polarimetry_tags::vh{}, reader2->GetOutput());
+  filter->SetInput(polarimetry_tags::vv{}, reader3->GetOutput());
 
   filter->UpdateOutputInformation();
 
diff --git a/Modules/Filtering/Polarimetry/test/otbSinclairReciprocalImageFilter.cxx b/Modules/Filtering/Polarimetry/test/otbSinclairReciprocalImageFilter.cxx
index 606f2e9f0ba23b8f962c394b26c8d10eda18c164..38d7ae07590f9a6751f641475e703df5081ad102 100644
--- a/Modules/Filtering/Polarimetry/test/otbSinclairReciprocalImageFilter.cxx
+++ b/Modules/Filtering/Polarimetry/test/otbSinclairReciprocalImageFilter.cxx
@@ -61,9 +61,9 @@ int generic_SinclairReciprocalImageFilter(int itkNotUsed(argc), char* argv[])
   reader2->SetFileName(inputFilename2);
   reader3->SetFileName(inputFilename3);
 
-  filter->SetVariadicNamedInput(polarimetry_tags::hh{}, reader1->GetOutput());
-  filter->SetVariadicNamedInput(polarimetry_tags::hv_or_vh{}, reader2->GetOutput());
-  filter->SetVariadicNamedInput(polarimetry_tags::vv{}, reader3->GetOutput());
+  filter->SetInput(polarimetry_tags::hh{}, reader1->GetOutput());
+  filter->SetInput(polarimetry_tags::hv_or_vh{}, reader2->GetOutput());
+  filter->SetInput(polarimetry_tags::vv{}, reader3->GetOutput());
 
   typename ExtractROIType::Pointer  extract = ExtractROIType::New();
   extract->SetStartX(10);
diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx
index e056413539de23f8ce6a440c147ce7a78b186f71..a2a4546f87204fc0dc29905c4fe091acbbaf26d5 100644
--- a/Modules/Filtering/Projection/test/otbSensorModel.cxx
+++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx
@@ -35,7 +35,15 @@
 #include "otbGeographicalDistance.h"
 #include "otbGenericRSTransform.h"
 
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
 #include "ossim/projection/ossimProjection.h"
+#pragma GCC diagnostic pop
+#else
+#include "ossim/projection/ossimProjection.h"
+#endif
+
 #include "ossim/projection/ossimSensorModelFactory.h"
 #include "ossim/ossimPluginProjectionFactory.h"
 
diff --git a/Modules/Fusion/PanSharpening/include/otbBayesianFusionFilter.h b/Modules/Fusion/PanSharpening/include/otbBayesianFusionFilter.h
index b8389e8463389e18c0dce4ff7ee6b90ac472c733..7382e2659d4926c88e15a179cc087db5e134f538 100644
--- a/Modules/Fusion/PanSharpening/include/otbBayesianFusionFilter.h
+++ b/Modules/Fusion/PanSharpening/include/otbBayesianFusionFilter.h
@@ -264,32 +264,32 @@ public:
 
   void SetMultiSpect(const InputMultiSpectralImageType *multiSpect)
   {
-    this->template SetVariadicInput<0>(multiSpect);
+    this->template SetInput<0>(multiSpect);
   }
 
   void SetMultiSpectInterp(const InputMultiSpectralInterpImageType *multiSpectInterp)
   {
-    this->template SetVariadicInput<1>(multiSpectInterp);
+    this->template SetInput<1>(multiSpectInterp);
   }
 
   void SetPanchro(const InputPanchroImageType *panchro)
   {
-    this->template SetVariadicInput<2>(panchro);
+    this->template SetInput<2>(panchro);
   }
 
   const InputMultiSpectralImageType* GetMultiSpect()
   {
-    return this->template GetVariadicInput<0>();
+    return this->template GetInput<0>();
   }
 
   const InputMultiSpectralInterpImageType* GetMultiSpectInterp()
   {
-    return this->template GetVariadicInput<1>();
+    return this->template GetInput<1>();
   }
 
   const InputPanchroImageType* GetPanchro()
   {
-    return this->template GetVariadicInput<2>();
+    return this->template GetInput<2>();
   }
 
   /** Set the ponderation value. */
diff --git a/Modules/IO/IOKML/src/otbKMLVectorDataIO.cxx b/Modules/IO/IOKML/src/otbKMLVectorDataIO.cxx
index eedbedf97af7df9f46fa4158043f5ac260180d9c..36eeb1a749c63626e47a983c51b1f2fcaaad94fd 100644
--- a/Modules/IO/IOKML/src/otbKMLVectorDataIO.cxx
+++ b/Modules/IO/IOKML/src/otbKMLVectorDataIO.cxx
@@ -22,12 +22,23 @@
 #include "otbKMLVectorDataIO.h"
 
 #include <fstream>
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
 
 #include "kml/dom.h"
 #include "kml/dom/kml22.h"
 #include "kml/base/file.h"
 #include "kml/dom/kml_cast.h"
 #include "kml/engine/kml_file.h"
+#pragma GCC diagnostic pop
+#else
+#include "kml/dom.h"
+#include "kml/dom/kml22.h"
+#include "kml/base/file.h"
+#include "kml/dom/kml_cast.h"
+#include "kml/engine/kml_file.h"
+#endif
 
 #include "ogrsf_frmts.h"
 
diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.hxx b/Modules/IO/ImageIO/include/otbImageFileWriter.hxx
index 4c8fcb13793ec3f04ca4da3e05659e66d71a6d49..0e6f11f470ddaf0a35ddf988b1fdaf74532154b6 100644
--- a/Modules/IO/ImageIO/include/otbImageFileWriter.hxx
+++ b/Modules/IO/ImageIO/include/otbImageFileWriter.hxx
@@ -173,9 +173,6 @@ ImageFileWriter<TInputImage>
   m_StreamingManager = streamingManager;
 }
 
-#ifndef ITK_LEGACY_REMOVE
-
-#endif // ITK_LEGACY_REMOVE
 /**
  *
  */
diff --git a/Modules/IO/KMZWriter/include/otbKmzProductWriter.h b/Modules/IO/KMZWriter/include/otbKmzProductWriter.h
index 8188fdecb58cee1fb5bfd69ad483ea4a8f31451d..06dbbf9684db72f5832658b7018e26e6fdaaea7c 100644
--- a/Modules/IO/KMZWriter/include/otbKmzProductWriter.h
+++ b/Modules/IO/KMZWriter/include/otbKmzProductWriter.h
@@ -25,8 +25,16 @@
 #include "itkObjectFactory.h"
 
 //kmz creation
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
 #include "kml/engine/kmz_file.h"
 #include "kml/base/file.h"
+#pragma GCC diagnostic pop
+#else
+#include "kml/engine/kmz_file.h"
+#include "kml/base/file.h"
+#endif
 
 // Image Tiling
 #include "otbMultiChannelExtractROI.h"
diff --git a/Modules/Learning/LearningBase/include/otbDecisionTree.hxx b/Modules/Learning/LearningBase/include/otbDecisionTree.hxx
index e021b5d737845aeebeb558dfad6bc2ee2edfbf02..913603b3f296abdbca30601610e0702fb8139f73 100644
--- a/Modules/Learning/LearningBase/include/otbDecisionTree.hxx
+++ b/Modules/Learning/LearningBase/include/otbDecisionTree.hxx
@@ -98,7 +98,6 @@ DecisionTree<AttributeValueType, LabelType>
   otbMsgDevMacro( << "Trying to match attribute " << m_Attribute << " with value " << attrValue );
 
   bool found = false;
-  KeyType key;
   if( m_IsFinal )
     {
     typename LabelMapType::const_iterator lmIt = m_LabelMap.begin();
diff --git a/Modules/Learning/Supervised/include/otbOpenCVUtils.h b/Modules/Learning/Supervised/include/otbOpenCVUtils.h
index 0964ef7b9743d3aa1b1956db363fb3e69272e478..889f3dd3c8402e53d2e3b35b54b3f71e8ffc565a 100644
--- a/Modules/Learning/Supervised/include/otbOpenCVUtils.h
+++ b/Modules/Learning/Supervised/include/otbOpenCVUtils.h
@@ -21,15 +21,15 @@
 #ifndef otbOpenCVUtils_h
 #define otbOpenCVUtils_h
 
-#include <opencv2/core/core_c.h>
-
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-align"
 #include <opencv2/core/core.hpp>
+#include <opencv2/core/core_c.h>
 #pragma GCC diagnostic pop
 #else
 #include <opencv2/core/core.hpp>
+#include <opencv2/core/core_c.h>
 #endif
 
 #if defined(__GNUC__) || defined(__clang__)
diff --git a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.hxx b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.hxx
index 47ba2bbe19305bb035705daea6382b6d11bcd353..25639be0e8226747ff74da3e68b42abdcb01ad64 100644
--- a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.hxx
+++ b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.hxx
@@ -201,9 +201,6 @@ SimpleParallelTiffWriter<TInputImage>
   m_StreamingManager = streamingManager;
  }
 
-#ifndef ITK_LEGACY_REMOVE
-
-#endif // ITK_LEGACY_REMOVE
 /**
  *
  */
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyDecompositionImageFilter.hxx b/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyDecompositionImageFilter.hxx
index b2da4daabc70e62ec8ace6fc09a3e16e290341b1..82d0d91738d625678d6b8e9ce1c6e2a78f16d42b 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyDecompositionImageFilter.hxx
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyDecompositionImageFilter.hxx
@@ -91,9 +91,9 @@ GeodesicMorphologyDecompositionImageFilter<TInputImage, TOutputImage, TStructuri
   using namespace otb::Functor::LevelingFunctor_tags;
   // Template keyword mandatory to avoid parsing error when using
   // template methods within template code
-  m_LevelingFilter->template SetVariadicNamedInput<pixel>(this->GetInput());
-  m_LevelingFilter->template SetVariadicNamedInput<convex_pixel>(m_ConvexFilter->GetOutput());
-  m_LevelingFilter->template SetVariadicNamedInput<concave_pixel>(m_ConcaveFilter->GetOutput());
+  m_LevelingFilter->template SetInput<pixel>(this->GetInput());
+  m_LevelingFilter->template SetInput<convex_pixel>(m_ConvexFilter->GetOutput());
+  m_LevelingFilter->template SetInput<concave_pixel>(m_ConcaveFilter->GetOutput());
 
   m_ConvexFilter->GraftOutput(this->GetConvexMap());
   m_ConvexFilter->Update();
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalProfilesSegmentationFilter.hxx b/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalProfilesSegmentationFilter.hxx
index 37049cb492105c8bd34389e8a22535184c9fa4ba..881bf44a5f2305fe7542c45e4c2cb5dd08aa6b11 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalProfilesSegmentationFilter.hxx
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalProfilesSegmentationFilter.hxx
@@ -52,10 +52,10 @@ MorphologicalProfilesSegmentationFilter<TInputImage,TOutputImage,TInternalPrecis
   using namespace Functor::MultiScaleConvexOrConcaveDecisionRule_tags;
   // Template keyword mandatory to avoid parsing error when using
   // template methods within template code
-  m_ClassificationFilter->template SetVariadicNamedInput<max_opening_profile_derivative>(m_OpeningCharacteristicsFilter->GetOutput());
-  m_ClassificationFilter->template SetVariadicNamedInput<opening_profile_characteristics>(m_OpeningCharacteristicsFilter->GetOutputCharacteristics());
-  m_ClassificationFilter->template SetVariadicNamedInput<max_closing_profile_derivative>(m_ClosingCharacteristicsFilter->GetOutput());
-  m_ClassificationFilter->template SetVariadicNamedInput<closing_profile_characteristics>(m_ClosingCharacteristicsFilter->GetOutputCharacteristics());
+  m_ClassificationFilter->template SetInput<max_opening_profile_derivative>(m_OpeningCharacteristicsFilter->GetOutput());
+  m_ClassificationFilter->template SetInput<opening_profile_characteristics>(m_OpeningCharacteristicsFilter->GetOutputCharacteristics());
+  m_ClassificationFilter->template SetInput<max_closing_profile_derivative>(m_ClosingCharacteristicsFilter->GetOutput());
+  m_ClassificationFilter->template SetInput<closing_profile_characteristics>(m_ClosingCharacteristicsFilter->GetOutputCharacteristics());
 
   m_ConnectedComponentsFilter->SetInput(m_ClassificationFilter->GetOutput());
 
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h
index 1593576b7b7a07cd7243d02549d4a843a4499451..6733c105511dcdd3bbfff67874efe48aa6419d63 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h
@@ -161,10 +161,10 @@ private:
  * Set inputs with:
  * \code
  * 
- * SetVariadicNamedInput<MultiScaleConvexOrConcaveDecisionRule_tags::max_opening_profile_derivative>(in1);
- * SetVariadicNamedInput<MultiScaleConvexOrConcaveDecisionRule_tags::max_closing_profile_derivative>(in2);
- * SetVariadicNamedInput<MultiScaleConvexOrConcaveDecisionRule_tags::opening_profile_characteristics>(in3);
- * SetVariadicNamedInput<MultiScaleConvexOrConcaveDecisionRule_tags::closing_profile_characteristics>(in4); 
+ * SetInput<MultiScaleConvexOrConcaveDecisionRule_tags::max_opening_profile_derivative>(in1);
+ * SetInput<MultiScaleConvexOrConcaveDecisionRule_tags::max_closing_profile_derivative>(in2);
+ * SetInput<MultiScaleConvexOrConcaveDecisionRule_tags::opening_profile_characteristics>(in3);
+ * SetInput<MultiScaleConvexOrConcaveDecisionRule_tags::closing_profile_characteristics>(in4); 
  *
  * \endcode
  * 
diff --git a/Modules/Segmentation/MorphologicalProfiles/test/otbGeodesicMorphologyLevelingFilter.cxx b/Modules/Segmentation/MorphologicalProfiles/test/otbGeodesicMorphologyLevelingFilter.cxx
index f59e218d5467ec686fa9c1654abd702507bf90d1..2b7f26fa99b6b8de55d7dbdcc8ec214e248f14c4 100644
--- a/Modules/Segmentation/MorphologicalProfiles/test/otbGeodesicMorphologyLevelingFilter.cxx
+++ b/Modules/Segmentation/MorphologicalProfiles/test/otbGeodesicMorphologyLevelingFilter.cxx
@@ -47,9 +47,9 @@ int otbGeodesicMorphologyLevelingFilter(int itkNotUsed(argc), char * argv[])
   FilterType::Pointer filter = FilterType::New();
 
   using namespace otb::Functor::LevelingFunctor_tags;
-  filter->SetVariadicNamedInput<pixel>(reader->GetOutput());
-  filter->SetVariadicNamedInput<convex_pixel>(convreader->GetOutput());
-  filter->SetVariadicNamedInput<concave_pixel>(concreader->GetOutput());
+  filter->SetInput<pixel>(reader->GetOutput());
+  filter->SetInput<convex_pixel>(convreader->GetOutput());
+  filter->SetInput<concave_pixel>(concreader->GetOutput());
 
   WriterType::Pointer writer = WriterType::New();
   writer->SetFileName(outfname);
diff --git a/Modules/Segmentation/MorphologicalProfiles/test/otbMultiScaleConvexOrConcaveClassificationFilter.cxx b/Modules/Segmentation/MorphologicalProfiles/test/otbMultiScaleConvexOrConcaveClassificationFilter.cxx
index 6d277a5290ef3d7b7fd37a54203c6a51dfd04179..9328d117920db9a66b80ff52f5859294799542a3 100644
--- a/Modules/Segmentation/MorphologicalProfiles/test/otbMultiScaleConvexOrConcaveClassificationFilter.cxx
+++ b/Modules/Segmentation/MorphologicalProfiles/test/otbMultiScaleConvexOrConcaveClassificationFilter.cxx
@@ -97,10 +97,10 @@ int otbMultiScaleConvexOrConcaveClassificationFilter(int itkNotUsed(argc), char
 
   MultiScaleClassificationFilterType::Pointer classificationFilter = MultiScaleClassificationFilterType::New();
   using namespace otb::Functor::MultiScaleConvexOrConcaveDecisionRule_tags;
-  classificationFilter->SetVariadicNamedInput<max_opening_profile_derivative>(omsCharFilter->GetOutput());
-  classificationFilter->SetVariadicNamedInput<opening_profile_characteristics>(omsCharFilter->GetOutputCharacteristics());
-  classificationFilter->SetVariadicNamedInput<max_closing_profile_derivative>(cmsCharFilter->GetOutput());
-  classificationFilter->SetVariadicNamedInput<closing_profile_characteristics>(cmsCharFilter->GetOutputCharacteristics());
+  classificationFilter->SetInput<max_opening_profile_derivative>(omsCharFilter->GetOutput());
+  classificationFilter->SetInput<opening_profile_characteristics>(omsCharFilter->GetOutputCharacteristics());
+  classificationFilter->SetInput<max_closing_profile_derivative>(cmsCharFilter->GetOutput());
+  classificationFilter->SetInput<closing_profile_characteristics>(cmsCharFilter->GetOutputCharacteristics());
   classificationFilter->GetModifiableFunctor().SetSigma(sigma);
   classificationFilter->GetModifiableFunctor().SetLabelSeparator(initialValue + profileSize * step);