[otb] 01/08: Imported Upstream version 5.10.0+dfsg

Bas Couwenberg sebastic at debian.org
Tue Feb 14 19:48:46 UTC 2017


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository otb.

commit e3db9814bbfd6bb3759ac55946e867c0f5a59db7
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Feb 14 18:31:01 2017 +0100

    Imported Upstream version 5.10.0+dfsg
---
 .hgignore                                          |   10 -
 .hgsigs                                            |    3 -
 .travis.yml                                        |    8 +-
 CMake/FindGBenchmark.cmake                         |    9 +-
 CMake/FindMuParserX.cmake                          |    2 +-
 CMake/OTBCheckCpp11Keywords.cmake                  |    7 +-
 CMake/OTBConfig.cmake.in                           |    2 +
 CMake/OTBModuleEnablement.cmake                    |    5 +
 CMake/OTBModuleMacros.cmake                        |   10 +-
 CMake/SourceStatus.cmake                           |    2 +-
 CMake/UseOTB.cmake                                 |    8 +
 CMake/otbcli.bat.in                                |    9 +-
 CMake/otbcli.sh.in                                 |    7 +-
 CMake/otbgui.sh.in                                 |    6 +-
 CMakeLists.txt                                     |   21 +-
 .../AsymmetricFusionOfLineDetectorExample.cxx      |   11 +-
 Examples/Markov/MarkovRestorationExample.cxx       |   11 +-
 .../GdalAdapters/include/otbOGRVersionProxy.h      |   16 +
 .../GdalAdapters/src/otbOGRVersionProxy1x.cxx      |    8 +
 .../GdalAdapters/src/otbOGRVersionProxy2x.cxx      |    5 +
 Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx  |   52 +-
 .../app/otbComputeConfusionMatrix.cxx              |   52 +-
 .../app/otbComputeImagesStatistics.cxx             |  118 +-
 .../app/otbDSFuzzyModelEstimation.cxx              |    8 +-
 .../app/otbKMeansClassification.cxx                |    5 +-
 .../app/otbMultiImageSamplingRate.cxx              |   21 +-
 .../app/otbOGRLayerClassifier.cxx                  |    2 +-
 .../app/otbPolygonClassStatistics.cxx              |   57 +-
 .../AppClassification/app/otbSOMClassification.cxx |    2 +-
 .../AppClassification/app/otbSampleExtraction.cxx  |   57 +-
 .../AppClassification/app/otbSampleSelection.cxx   |  109 +-
 .../app/otbTrainImagesClassifier.cxx               |  805 ++++-----
 .../app/otbTrainOGRLayersClassifier.cxx            |    2 +-
 .../AppClassification/app/otbTrainRegression.cxx   |    2 +-
 .../app/otbTrainVectorClassifier.cxx               |   64 +-
 .../app/otbVectorDataDSValidation.cxx              |    4 +-
 .../AppClassification/include/otbTrainBoost.txx    |    8 +-
 .../include/otbTrainDecisionTree.txx               |   10 +-
 .../include/otbTrainGradientBoostedTree.txx        |    8 +-
 .../AppClassification/include/otbTrainKNN.txx      |    2 +-
 .../AppClassification/include/otbTrainLibSVM.txx   |   12 +-
 .../include/otbTrainNeuralNetwork.txx              |   22 +-
 .../include/otbTrainRandomForests.txx              |   14 +-
 .../AppClassification/include/otbTrainSVM.txx      |   34 +-
 .../include/otbTrainSharkRandomForests.txx         |    8 +-
 .../AppClassification/test/CMakeLists.txt          |   12 +-
 .../app/otbDimensionalityReduction.cxx             |   12 +-
 .../Applications/AppDomainTransform/CMakeLists.txt |    2 +
 .../AppDomainTransform/app/CMakeLists.txt          |    4 +
 .../AppDomainTransform/app/otbDomainTransform.cxx  |  425 +++++
 .../AppDomainTransform/otb-module.cmake            |   15 +
 .../AppDomainTransform/test/CMakeLists.txt         |   38 +
 .../Applications/AppEdge/app/otbEdgeExtraction.cxx |    2 +-
 .../Applications/AppFiltering/app/otbDespeckle.cxx |    2 +-
 .../Applications/AppFiltering/app/otbSmoothing.cxx |    2 +-
 .../AppFusion/app/otbBundleToPerfectSensor.cxx     |  209 +--
 Modules/Applications/AppFusion/otb-module.cmake    |    1 +
 .../app/otbHyperspectralUnmixing.cxx               |    3 +-
 .../app/otbVertexComponentAnalysis.cxx             |    3 +-
 .../AppImageUtils/app/otbColorMapping.cxx          |   16 +-
 .../AppImageUtils/app/otbCompareImages.cxx         |   10 +-
 .../Applications/AppImageUtils/app/otbConvert.cxx  |    5 +-
 .../AppImageUtils/app/otbDownloadSRTMTiles.cxx     |    2 +-
 .../AppImageUtils/app/otbExtractROI.cxx            |   16 +-
 .../AppImageUtils/app/otbManageNoData.cxx          |    7 +-
 .../app/otbMultiResolutionPyramid.cxx              |    2 +-
 .../AppImageUtils/app/otbPixelValue.cxx            |    3 +-
 .../AppImageUtils/app/otbQuicklook.cxx             |   16 +-
 .../AppImageUtils/app/otbReadImageInfo.cxx         |   76 +-
 .../Applications/AppImageUtils/app/otbRescale.cxx  |    6 +-
 .../AppIndices/app/otbRadiometricIndices.cxx       |    2 +-
 Modules/Applications/AppKMZ/app/otbKmzExport.cxx   |    1 +
 .../Applications/AppMathParser/app/otbBandMath.cxx |    4 +-
 .../AppMathParserX/app/otbBandMathX.cxx            |    4 +-
 .../AppMoments/app/otbLocalStatisticExtraction.cxx |    2 +-
 .../app/otbBinaryMorphologicalOperation.cxx        |    2 +-
 .../app/otbGrayScaleMorphologicalOperation.cxx     |    2 +-
 .../app/otbOpticalCalibration.cxx                  |   24 +-
 .../app/otbConvertCartoToGeoPoint.cxx              |    6 +-
 .../app/otbConvertSensorToGeoPoint.cxx             |    8 +-
 .../app/otbGenerateRPCSensorModel.cxx              |   26 +-
 .../app/otbGridBasedImageResampling.cxx            |    2 +-
 .../app/otbObtainUTMZoneFromGeoPoint.cxx           |    3 +-
 .../AppProjection/app/otbOrthoRectification.cxx    |   79 +-
 .../app/otbRigidTransformResample.cxx              |    7 +-
 .../AppProjection/app/otbSuperimpose.cxx           |   20 +-
 .../app/otbVectorDataReprojection.cxx              |    2 +-
 .../Applications/AppProjection/test/CMakeLists.txt |    1 +
 .../AppSARCalibration/test/CMakeLists.txt          |   12 +-
 .../app/otbConnectedComponentSegmentation.cxx      |    2 +-
 .../app/otbHooverCompareSegmentation.cxx           |    8 +-
 .../AppSegmentation/app/otbMeanShiftSmoothing.cxx  |    2 +-
 .../AppSegmentation/app/otbSegmentation.cxx        |    4 +-
 .../AppStereo/app/otbStereoFramework.cxx           |    4 +-
 .../AppTest/app/otbTestApplication.cxx             |    7 +-
 Modules/Applications/AppTest/test/CMakeLists.txt   |   23 +
 .../AppTest/test/otbWrapperApplicationDocTests.cxx |    1 +
 .../app/otbHaralickTextureExtraction.cxx           |   21 +-
 .../AppTextures/app/otbSFSTextureExtraction.cxx    |    2 +-
 .../app/otbRasterization.cxx                       |    2 +-
 .../AppVectorUtils/app/otbOSMDownloader.cxx        |    2 +
 .../AppVectorUtils/app/otbVectorDataExtractROI.cxx |    1 +
 Modules/Core/ImageBase/test/CMakeLists.txt         |   17 -
 .../include/otbBCOInterpolateImageFunction.txx     |   28 +-
 .../src/otbSentinel1ImageMetadataInterface.cxx     |    4 +-
 Modules/Core/Metadata/test/CMakeLists.txt          |    2 +-
 .../include/otbStreamingWarpImageFilter.h          |    2 +-
 .../include/otbDescriptorsListSampleGenerator.txx  |   24 +-
 .../otbScalarImageToAdvancedTexturesFilter.h       |   19 +
 .../otbScalarImageToAdvancedTexturesFilter.txx     |   53 +-
 .../otbScalarImageToHigherOrderTexturesFilter.h    |   20 +
 .../otbScalarImageToHigherOrderTexturesFilter.txx  |   61 +-
 .../include/otbScalarImageToTexturesFilter.h       |   19 +
 .../include/otbScalarImageToTexturesFilter.txx     |   52 +-
 .../otbOverlapSaveConvolutionImageFilter.txx       |    6 +
 .../include/otbStreamingShrinkImageFilter.h        |    4 +-
 .../include/otbStreamingShrinkImageFilter.txx      |   21 +-
 .../include/otbVectorRescaleIntensityImageFilter.h |    5 +
 .../src/otbStreamingShrinkImageFilter.cxx          |   26 +-
 Modules/Filtering/MathParserX/include/otbParserX.h |    9 +-
 .../include/otbMeanShiftSmoothingImageFilter.txx   |    2 +-
 .../Statistics/include/otbPeriodicSampler.h        |    6 +
 .../otbStreamingStatisticsVectorImageFilter.h      |   31 +-
 .../otbStreamingStatisticsVectorImageFilter.txx    |   56 +-
 .../Statistics/src/otbPeriodicSampler.cxx          |   23 +-
 .../Filtering/Statistics/test/otbSamplerTest.cxx   |    1 +
 .../Wavelet/include/otbSubsampleImageFilter.h      |    1 -
 .../Wavelet/include/otbSubsampleImageFilter.txx    |    7 +-
 .../Wavelet/include/otbWaveletFilterBank.h         |    5 +
 .../Wavelet/include/otbWaveletFilterBank.txx       |   27 +-
 .../Wavelet/include/otbWaveletImageFilter.h        |  112 ++
 .../Wavelet/include/otbWaveletImageFilter.txx      |   95 ++
 .../Wavelet/include/otbWaveletInverseImageFilter.h |  113 ++
 .../include/otbWaveletInverseImageFilter.txx       |  109 ++
 ...aveletsBandsListToWaveletsSynopsisImageFilter.h |  103 ++
 ...eletsBandsListToWaveletsSynopsisImageFilter.txx |  222 +++
 ...aveletsSynopsisImageToWaveletsBandsListFilter.h |  122 ++
 ...eletsSynopsisImageToWaveletsBandsListFilter.txx |  179 ++
 Modules/Filtering/Wavelet/test/CMakeLists.txt      |    9 +
 .../Wavelet/test/otbWaveletImageToImageFilter.cxx  |   87 +
 .../Wavelet/test/otbWaveletTestDriver.cxx          |    1 +
 .../otbNeighborhoodMajorityVotingImageFilter.txx   |   24 +-
 .../otbSimpleRcsPanSharpeningFusionImageFilter.h   |  101 +-
 .../otbSimpleRcsPanSharpeningFusionImageFilter.txx |   95 +-
 Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx  |    2 +-
 Modules/IO/IOJPEG2000/CMakeLists.txt               |    4 -
 Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h |  175 --
 .../IOJPEG2000/include/otbJPEG2000ImageIOFactory.h |   69 -
 Modules/IO/IOJPEG2000/otb-module.cmake             |   22 -
 Modules/IO/IOJPEG2000/src/CMakeLists.txt           |   18 -
 Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIO.cxx   | 1796 --------------------
 .../IOJPEG2000/src/otbJPEG2000ImageIOFactory.cxx   |   65 -
 Modules/IO/IOJPEG2000/test/CMakeLists.txt          |   80 -
 .../test/otbGenerateClassicalQLWithJPEG2000.cxx    |   65 -
 .../IO/IOJPEG2000/test/otbIOJPEG2000TestDriver.cxx |    7 -
 .../test/otbJPEG2000ImageIOTestCanRead.cxx         |   36 -
 .../test/otbJPEG2000ImageIOTestCanWrite.cxx        |   37 -
 Modules/IO/ImageIO/include/otbImageFileReader.txx  |    3 -
 Modules/IO/ImageIO/otb-module.cmake                |    3 -
 Modules/IO/ImageIO/src/CMakeLists.txt              |    1 -
 Modules/IO/ImageIO/src/otbImageIOFactory.cxx       |    7 -
 .../include/otbOGRDataToSamplePositionFilter.h     |    6 +-
 .../include/otbOGRDataToSamplePositionFilter.txx   |   12 +-
 .../Sampling/src/otbSamplingRateCalculator.cxx     |   30 +-
 .../Sampling/src/otbSamplingRateCalculatorList.cxx |   26 +-
 .../include/otbImageClassificationFilter.txx       |    9 +-
 .../otbSharkRandomForestsMachineLearningModel.h    |    3 +
 .../Learning/Supervised/include/otbSharkUtils.h    |    1 +
 Modules/MPI/MPIConfig/src/otbMPIConfig.cxx         |    1 +
 .../include/otbSimpleParallelTiffWriter.h          |    1 +
 Modules/Remote/Mosaic.remote.cmake                 |    2 +-
 Modules/Remote/otb-bv.remote.cmake                 |    2 +-
 Modules/Remote/otbFFSforGMM.remote.cmake           |    4 +-
 Modules/Remote/phenotb.remote.cmake                |    2 +-
 Modules/Remote/temporal-gapfilling.remote.cmake    |    2 +-
 Modules/ThirdParty/GDAL/otb-module-init.cmake      |   26 +-
 Modules/ThirdParty/MuParserX/CMakeLists.txt        |    8 -
 Modules/ThirdParty/MuParserX/otb-module.cmake      |    2 +
 Modules/ThirdParty/MuParserX/src/mpCompat.h.in     |   46 -
 Modules/ThirdParty/OpenGL/CMakeLists.txt           |    2 +-
 Modules/ThirdParty/OpenGL/otb-module-init.cmake    |   68 +-
 Modules/ThirdParty/OpenJPEG/CMakeLists.txt         |   32 -
 Modules/ThirdParty/OpenJPEG/otb-module-init.cmake  |    2 -
 Modules/ThirdParty/OpenJPEG/otb-module.cmake       |   12 -
 Modules/ThirdParty/OpenJPEG/src/otb_openjpeg.h.in  |   29 -
 .../OssimPlugins/src/ossim/ossimSentinel1Model.cpp |   37 +-
 .../ThirdParty/OssimPlugins/test/CMakeLists.txt    |   56 +-
 Modules/ThirdParty/Shark/src/otb_shark.h.in        |    2 +-
 Modules/ThirdParty/SiftFast/src/CMakeLists.txt     |    4 +-
 Modules/ThirdParty/SiftFast/src/libsiftfast.cpp    |    2 +
 Modules/Visualization/Ice/include/otbGlView.h      |   13 +-
 .../Visualization/Ice/include/otbStandardShader.h  |   12 +-
 Modules/Visualization/Ice/src/otbGlImageActor.cxx  |    4 +-
 .../Visualization/Ice/src/otbStandardShader.cxx    |  138 +-
 .../Visualization/IceViewer/src/otbIceViewer.cxx   |   30 +
 .../Mapla/src/mvdMaplaApplication.cxx              |    2 +
 .../Monteverdi/include/mvdMainWindow.h             |   15 +-
 .../Visualization/Monteverdi/src/CMakeLists.txt    |    8 +
 Modules/Visualization/Monteverdi/src/main.cxx      |   75 +-
 .../Monteverdi/src/mvdApplication.cxx              |    8 +
 .../Visualization/Monteverdi/src/mvdMainWindow.cxx |  130 +-
 .../Visualization/Monteverdi/src/mvdMainWindow.qrc |    2 +-
 .../Visualization/Monteverdi/src/mvdMainWindow.ui  |   25 +
 .../Visualization/MonteverdiCore/include/mvdCore.h |   12 +-
 .../MonteverdiCore/include/mvdImageSettings.h      |   14 +-
 .../MonteverdiCore/include/mvdTypes.h              |    1 +
 .../include/mvdVectorImageSettings.h               |   12 +
 .../Visualization/MonteverdiCore/src/mvdCore.cxx   |   12 +-
 .../MonteverdiCore/src/mvdI18nCoreApplication.cxx  |   11 +-
 .../MonteverdiCore/src/mvdImageSettings.cxx        |   50 +
 .../MonteverdiCore/src/mvdStackedLayerModel.cxx    |    6 +-
 .../MonteverdiCore/src/mvdVectorImageModel.cxx     |    4 +-
 Modules/Visualization/MonteverdiGui/CMakeLists.txt |   41 +
 .../include/mvdAbstractImageViewRenderer.h         |   13 +-
 .../MonteverdiGui/include/mvdColorDynamicsWidget.h |    2 +
 .../MonteverdiGui/include/mvdImageViewRenderer.h   |    1 +
 .../MonteverdiGui/include/mvdImageViewWidget.h     |    1 +
 .../MonteverdiGui/include/mvdImportImagesDialog.h  |    4 -
 .../include/mvdLayerStackController.h              |    1 +
 .../MonteverdiGui/include/mvdLayerStackWidget.h    |    5 +
 .../MonteverdiGui/include/mvdShaderWidget.h        |    6 +-
 .../Visualization/MonteverdiGui/src/CMakeLists.txt |    2 +-
 .../src/mvdColorBandDynamicsWidget.ui              |    2 +-
 .../MonteverdiGui/src/mvdColorDynamicsWidget.cxx   |    7 +
 .../MonteverdiGui/src/mvdColorDynamicsWidget.ui    |   15 +-
 .../MonteverdiGui/src/mvdColorSetupWidget.ui       |   39 +-
 .../MonteverdiGui/src/mvdHistogramWidget.ui        |    2 +-
 .../MonteverdiGui/src/mvdI18nMainWindow.cxx        |   14 +
 .../Visualization/MonteverdiGui/src/mvdIcons.qrc   |    2 +
 .../MonteverdiGui/src/mvdImageViewRenderer.cxx     |  112 +-
 .../MonteverdiGui/src/mvdImageViewWidget.cxx       |   24 +
 .../MonteverdiGui/src/mvdImportImagesDialog.cxx    |   33 +-
 .../MonteverdiGui/src/mvdLayerStackController.cxx  |   18 +
 .../MonteverdiGui/src/mvdLayerStackItemModel.cxx   |    7 +-
 .../MonteverdiGui/src/mvdLayerStackWidget.cxx      |   20 +
 .../MonteverdiGui/src/mvdLayerStackWidget.ui       |   45 +-
 .../MonteverdiGui/src/mvdShaderWidget.cxx          |   39 +-
 .../include/otbWrapperApplication.h                |  120 +-
 .../include/otbWrapperCompositeApplication.h       |  158 ++
 .../include/otbWrapperListViewParameter.h          |   54 +-
 .../include/otbWrapperOutputImageParameter.h       |    2 +
 .../include/otbWrapperOutputProcessXMLParameter.h  |    2 +
 .../include/otbWrapperParameterGroup.h             |   12 +-
 .../include/otbWrapperParameterKey.h               |    4 +-
 .../include/otbWrapperProxyParameter.h             |   71 +
 .../Wrappers/ApplicationEngine/src/CMakeLists.txt  |    1 +
 .../src/otbWrapperApplication.cxx                  |  403 +++--
 .../src/otbWrapperApplicationHtmlDocGenerator.cxx  |  110 +-
 .../src/otbWrapperChoiceParameter.cxx              |   11 +-
 .../src/otbWrapperComplexOutputImageParameter.cxx  |    4 +-
 .../src/otbWrapperCompositeApplication.cxx         |  216 +++
 .../src/otbWrapperElevationParametersHandler.cxx   |   24 +-
 .../src/otbWrapperListViewParameter.cxx            |   32 +-
 .../src/otbWrapperOutputImageParameter.cxx         |   43 +
 .../src/otbWrapperOutputProcessXMLParameter.cxx    |   20 +-
 .../src/otbWrapperParameterGroup.cxx               |  183 +-
 .../Wrappers/ApplicationEngine/test/CMakeLists.txt |    4 +
 .../test/otbApplicationEngineTestDriver.cxx        |    1 +
 .../test/otbApplicationMemoryConnectTest.cxx       |    1 +
 .../test/otbWrapperParameterListTest.cxx           |   66 +
 .../src/otbWrapperCommandLineLauncher.cxx          |   26 +-
 .../QtWidget/include/otbWrapperQtWidgetModel.h     |    5 +
 .../QtWidget/include/otbWrapperQtWidgetView.h      |    1 +
 .../QtWidget/src/otbApplicationLauncherQt.cxx      |    9 +-
 .../src/otbWrapperQtWidgetListViewParameter.cxx    |   14 +-
 .../QtWidget/src/otbWrapperQtWidgetModel.cxx       |  127 +-
 .../src/otbWrapperQtWidgetParameterGroup.cxx       |    5 +-
 .../src/otbWrapperQtWidgetParameterLabel.cxx       |    2 +-
 .../src/otbWrapperQtWidgetSimpleProgressReport.cxx |    3 +-
 .../QtWidget/src/otbWrapperQtWidgetView.cxx        |   19 +-
 .../QtWidget/test/otbWrapperQtWidgetShowWidget.cxx |    2 +
 Modules/Wrappers/SWIG/src/CMakeLists.txt           |   11 +-
 Modules/Wrappers/SWIG/src/otbApplication.i         |   20 +-
 .../SWIG/test/python/PythonConnectApplications.py  |    1 +
 RELEASE_NOTES.txt                                  |   60 +-
 Utilities/Data/CMakeLists.txt                      |   43 -
 Utilities/Data/Icons/edit-clear.png                |  Bin 0 -> 773 bytes
 Utilities/Data/Icons/layer-delete.png              |  Bin 0 -> 925 bytes
 Utilities/Data/Icons/layer-delete_24x24.png        |  Bin 489 -> 0 bytes
 Utilities/Data/Icons/layers-remove_24x24.png       |  Bin 658 -> 391 bytes
 Utilities/Data/Icons/view-refresh.png              |  Bin 0 -> 912 bytes
 .../{monteverdi.desktop => monteverdi.desktop.in}  |    5 +-
 Utilities/Maintenance/TravisBuild.cmake            |    4 +-
 i18n/fr_FR.ts                                      |   92 +-
 284 files changed, 6073 insertions(+), 4492 deletions(-)

diff --git a/.hgignore b/.hgignore
deleted file mode 100644
index 7e84294..0000000
--- a/.hgignore
+++ /dev/null
@@ -1,10 +0,0 @@
-syntax: glob
-*~
-.*.swp
-*.orig
-*.pyc
-.\#*
-\#*\#
-tags
-*vim*
-*.template
diff --git a/.hgsigs b/.hgsigs
deleted file mode 100644
index 3a827ea..0000000
--- a/.hgsigs
+++ /dev/null
@@ -1,3 +0,0 @@
-68eebc1b170a636794feda66523e6c0135ebfef2 0 iEYEABECAAYFAkmvX3cACgkQwRJnCg+r8KFSCgCfVYSnx2ev+hIlpbM/arxzLVf3KvsAn3nqaJXaj62RcNUIjv+qcNWlJ5WG
-e0fdaae06d33190d9b17356c5d51f878fd8fa0b6 0 iEYEABECAAYFAkoNOJEACgkQwRJnCg+r8KHMrACeJMcezNBgXjfx57UNdd/WfXw8kf8An1VEqFVTeG/wUd6QiiVy2icgfLGl
-c07af3906a803b43018e1a7e15db5c11f54d14b4 0 iEYEABECAAYFAkw68W0ACgkQwRJnCg+r8KGhjgCfR4LL9xW8xYGFXWEpbxSSRsCFVhIAn2nPMTqZvUW0cQvU6pkJD1+eENNj
diff --git a/.travis.yml b/.travis.yml
index 57e2a46..ec99d4d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,10 +6,10 @@ dist: trusty
 compiler:
 - clang
 
-addons:
-  apt:
-    packages:
-    - libboost-all-dev
+# addons:
+#   apt:
+#     packages:
+#     - libboost-all-dev
 
 cache: ccache
 
diff --git a/CMake/FindGBenchmark.cmake b/CMake/FindGBenchmark.cmake
index ed2a367..72d7926 100644
--- a/CMake/FindGBenchmark.cmake
+++ b/CMake/FindGBenchmark.cmake
@@ -4,10 +4,11 @@
 #  GBENCHMARK_LIBRARY      - gbenchmark library file
 #  GBENCHMARK_FOUND        - TRUE if gbenchmark is found
 
-if (GBENCHMARK_INCLUDE_DIR)
- #check cache
-  set(GBENCHMARK_FIND_QUIETLY TRUE)
-endif ()
+set(GBENCHMARK_FIND_QUIETLY TRUE)
+# if (GBENCHMARK_INCLUDE_DIR)
+#  #check cache
+#   set(GBENCHMARK_FIND_QUIETLY TRUE)
+# endif ()
 
 if (NOT GBENCHMARK_INCLUDE_DIR)
   find_path(GBENCHMARK_INCLUDE_DIR NAMES benchmark.h PATH_SUFFIXES benchmark)
diff --git a/CMake/FindMuParserX.cmake b/CMake/FindMuParserX.cmake
index 095aacc..467d335 100644
--- a/CMake/FindMuParserX.cmake
+++ b/CMake/FindMuParserX.cmake
@@ -16,7 +16,7 @@ if( MUPARSERX_INCLUDE_DIR )
 endif()
 
 find_path( MUPARSERX_INCLUDE_DIR mpParser.h
-           PATH_SUFFIXES mpParser )
+           PATH_SUFFIXES mpParser muparserx)
 
 if(EXISTS "${MUPARSERX_INCLUDE_DIR}/mpDefines.h")
   file(READ "${MUPARSERX_INCLUDE_DIR}/mpDefines.h" _mpDefines_h_CONTENTS)
diff --git a/CMake/OTBCheckCpp11Keywords.cmake b/CMake/OTBCheckCpp11Keywords.cmake
index da30226..8afdcf0 100644
--- a/CMake/OTBCheckCpp11Keywords.cmake
+++ b/CMake/OTBCheckCpp11Keywords.cmake
@@ -1,6 +1,7 @@
 include(CheckCXXSourceCompiles)
 
-unset(OTB_HAS_CXX11 CACHE)
+set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS})
+
 CHECK_CXX_SOURCE_COMPILES("
 #ifdef _MSC_VER
   #if _MSC_VER <= 1700
@@ -20,7 +21,7 @@ int main(int argc, char *argv[])
 "
 OTB_HAS_CXX11 )
 
-unset(OTB_CXX_HAS_UNIQUE_PTR CACHE)
+
 CHECK_CXX_SOURCE_COMPILES("
 #include <memory>
 struct Foo
@@ -38,7 +39,6 @@ int main(int argc, char *argv[])
 "
 OTB_CXX_HAS_UNIQUE_PTR )
 
-unset(OTB_CXX_HAS_OVERRIDE_SPECIFIER CACHE)
 CHECK_CXX_SOURCE_COMPILES("
 struct A
 {
@@ -64,7 +64,6 @@ int main(int argc, char *argv[])
 "
 OTB_CXX_HAS_OVERRIDE_SPECIFIER )
 
-unset(OTB_CXX_HAS_NULLPTR CACHE)
 CHECK_CXX_SOURCE_COMPILES("
 #include <cstddef>
 int main(int argc, char *argv[])
diff --git a/CMake/OTBConfig.cmake.in b/CMake/OTBConfig.cmake.in
index 479674c..1ecbbc5 100644
--- a/CMake/OTBConfig.cmake.in
+++ b/CMake/OTBConfig.cmake.in
@@ -28,6 +28,8 @@ set(OTB_BUILD_SHARED "@BUILD_SHARED_LIBS@")
 # List of available OTB modules.
 set(OTB_MODULES_ENABLED "@OTB_CONFIG_MODULES_ENABLED@")
 
+set(OTB_APPLICATION_PATH "@OTB_CONFIG_APPLICATION_PATH@")
+
 # Import OTB targets.
 set(OTB_CONFIG_TARGETS_FILE "@OTB_CONFIG_TARGETS_FILE@")
 if(NOT OTB_TARGETS_IMPORTED at OTB_CONFIG_TARGETS_CONDITION@)
diff --git a/CMake/OTBModuleEnablement.cmake b/CMake/OTBModuleEnablement.cmake
index a2d78ac..be1475f 100644
--- a/CMake/OTBModuleEnablement.cmake
+++ b/CMake/OTBModuleEnablement.cmake
@@ -169,6 +169,11 @@ set(OTB_MODULES_ENABLED "")
 set(OTB_MODULES_DISABLED "")
 foreach(otb-module ${OTB_MODULES_ALL})
   if(${otb-module}_ENABLED)
+    # check cxx11 requirement after all enable/disable macros have been passed
+    if(OTB_MODULE_${otb-module}_REQUIRES_CXX11 AND NOT OTB_HAS_CXX11)
+      message(FATAL_ERROR "Module ${otb-module} requires C++11 support. Consider adding --std=c++11 to your compiler flags or disabling it.")
+    endif()
+
     list(APPEND OTB_MODULES_ENABLED ${otb-module})
 
     # We will sort modules according to their dependency graph,
diff --git a/CMake/OTBModuleMacros.cmake b/CMake/OTBModuleMacros.cmake
index 5a3e256..0580f8e 100644
--- a/CMake/OTBModuleMacros.cmake
+++ b/CMake/OTBModuleMacros.cmake
@@ -284,8 +284,10 @@ endmacro()
 macro(otb_module_target_name _name)
   get_property(_target_type TARGET ${_name} PROPERTY TYPE)
   if (NOT ${_target_type} STREQUAL "EXECUTABLE")
-    set_property(TARGET ${_name} PROPERTY VERSION 1)
-    set_property(TARGET ${_name} PROPERTY SOVERSION 1)
+    if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
+      set_property(TARGET ${_name} PROPERTY VERSION 1)
+      set_property(TARGET ${_name} PROPERTY SOVERSION 1)
+    endif()
     if("${_name}" MATCHES "^[Oo][Tt][Bb]")
       set(_otb "")
     else()
@@ -334,7 +336,5 @@ macro(otb_module_target _name)
 endmacro()
 
 macro(otb_module_requires_cxx11)
-  if(${otb-module}_ENABLED AND NOT ${OTB_HAS_CXX11})
-    message(FATAL_ERROR "Module ${otb-module} requires C++11 support. Consider adding --std=c++11 to your compiler flags or disabling it.")
-  endif()  
+  set(OTB_MODULE_${otb-module}_REQUIRES_CXX11 1)
 endmacro()
diff --git a/CMake/SourceStatus.cmake b/CMake/SourceStatus.cmake
index 4b245c8..19d6fac 100644
--- a/CMake/SourceStatus.cmake
+++ b/CMake/SourceStatus.cmake
@@ -61,7 +61,7 @@ function(repository_status root_repo_dir result_var1)
   if(OTB_WC_STATUS)
     message(STATUS "  Local file modifications (${dir_name}) :")
     string(REPLACE "\n" "\n--     " OTB_WC_STATUS_PRETTYPRINT "    ${OTB_WC_STATUS}")
-    message(WARNING "${OTB_WC_STATUS_PRETTYPRINT}")
+    message(STATUS "${OTB_WC_STATUS_PRETTYPRINT}")
   else()
     message(STATUS "  No files modified locally (${dir_name})")
   endif()
diff --git a/CMake/UseOTB.cmake b/CMake/UseOTB.cmake
index 5a891e4..d09ea33 100644
--- a/CMake/UseOTB.cmake
+++ b/CMake/UseOTB.cmake
@@ -27,3 +27,11 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ITK_REQUIRED_LINK_
 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${ITK_REQUIRED_LINK_FLAGS}")
 
 # OpenCV : no USE_FILE defined
+
+#PYTHONPATH
+
+if( OTB_PYTHONPATH )
+  if(DEFINED ENV{PYTHONPATH})
+    set(ENV{PYTHONPATH} "${OTB_PYTHONPATH};$ENV{PYTHONPATH}")
+  endif()
+endif()
diff --git a/CMake/otbcli.bat.in b/CMake/otbcli.bat.in
index ffe1fb2..165d833 100644
--- a/CMake/otbcli.bat.in
+++ b/CMake/otbcli.bat.in
@@ -16,8 +16,13 @@ if exist %CURRENT_SCRIPT_DIR%otbApplicationLauncherCommandLine.exe (
 
 setlocal
 :: works for install tree
-if exist %CURRENT_SCRIPT_DIR%../@OTB_INSTALL_APP_DIR@ (
-  set OTB_APPLICATION_PATH=%CURRENT_SCRIPT_DIR%../@OTB_INSTALL_APP_DIR@;%OTB_APPLICATION_PATH%
+if exist %CURRENT_SCRIPT_DIR%..\@OTB_INSTALL_APP_DIR_NATIVE@ (
+  set OTB_APPLICATION_PATH=%CURRENT_SCRIPT_DIR%..\@OTB_INSTALL_APP_DIR_NATIVE@;%OTB_APPLICATION_PATH%
+)
+
+::set GDAL_DATA, EPSG_CSV and update PATH
+if exist %CURRENT_SCRIPT_DIR%\..\otbenv.cmd (
+    call %CURRENT_SCRIPT_DIR%\..\otbenv.cmd
 )
 
 set LC_NUMERIC=C
diff --git a/CMake/otbcli.sh.in b/CMake/otbcli.sh.in
index 3fd44c7..3026dad 100644
--- a/CMake/otbcli.sh.in
+++ b/CMake/otbcli.sh.in
@@ -28,9 +28,10 @@ export OTB_APPLICATION_PATH
 # avoid numerical issues caused by locale
 export LC_NUMERIC=C
 
-# Source GDAL_DATA, EPSG_CSV
-if [ -f "$CURRENT_SCRIPT_DIR/env_exports" ]; then
-    . "$CURRENT_SCRIPT_DIR/env_exports"
+# Export GDAL_DATA, EPSG_CSV
+# Note that OTB_APPLICATION_PATH is reset here.
+if [ -f "$CURRENT_SCRIPT_DIR/../otbenv.profile" ]; then
+    . "$CURRENT_SCRIPT_DIR/../otbenv.profile"
 fi
 
 # start the application
diff --git a/CMake/otbgui.sh.in b/CMake/otbgui.sh.in
index 5b389e1..5f6354a 100644
--- a/CMake/otbgui.sh.in
+++ b/CMake/otbgui.sh.in
@@ -28,9 +28,9 @@ export OTB_APPLICATION_PATH
 # avoid numerical issues caused by locale
 export LC_NUMERIC=C
 
-# Source GDAL_DATA, EPSG_CSV
-if [ -f "$CURRENT_SCRIPT_DIR/env_exports" ]; then
-    . "$CURRENT_SCRIPT_DIR/env_exports"
+# Export GDAL_DATA, EPSG_CSV
+if [ -f "$CURRENT_SCRIPT_DIR/../otbenv.profile" ]; then
+    . "$CURRENT_SCRIPT_DIR/../otbenv.profile"
 fi
 
 # start the application
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 998f039..fb6ce64 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -86,7 +86,7 @@ set(main_project_name ${_OTBModuleMacros_DEFAULT_LABEL})
 #-----------------------------------------------------------------------------
 # OTB version number.
 set(OTB_VERSION_MAJOR "5")
-set(OTB_VERSION_MINOR "8")
+set(OTB_VERSION_MINOR "10")
 set(OTB_VERSION_PATCH "0")
 set(OTB_VERSION_STRING "${OTB_VERSION_MAJOR}.${OTB_VERSION_MINOR}.${OTB_VERSION_PATCH}")
 
@@ -134,6 +134,9 @@ if(NOT OTB_INSTALL_PACKAGE_DIR)
   set(OTB_INSTALL_PACKAGE_DIR "${OTB_INSTALL_LIBRARY_DIR}/cmake/OTB-${OTB_VERSION_MAJOR}.${OTB_VERSION_MINOR}")
 endif()
 
+#convert path to native for reconfiguring otbcli.bat.in
+file(TO_NATIVE_PATH "${OTB_INSTALL_APP_DIR}" OTB_INSTALL_APP_DIR_NATIVE)
+
 # Override CMake's built-in add_* commands: assign LABELS to tests and targets
 # automatically. Depends on the CMake variable otb-module being set to the
 # "current" module when add_* is called.
@@ -305,6 +308,17 @@ set(OTB_CONFIG_CODE "
 set(OTB_MODULES_DIR \"${OTB_MODULES_DIR}\")")
 set(OTB_CONFIG_CMAKE_DIR "${OTB_SOURCE_DIR}/CMake")
 set(OTB_USE_FILE "${OTB_CONFIG_CMAKE_DIR}/UseOTB.cmake")
+if(OTB_WRAP_PYTHON)
+set(OTB_CONFIG_CODE "${OTB_CONFIG_CODE}
+set(OTB_PYTHONPATH \"${OTB_BINARY_DIR}/${OTB_INSTALL_PYTHON_DIR}\")")
+endif()
+if(OTB_HAS_CXX11)
+  if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
+     "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+    set(OTB_REQUIRED_CXX_FLAGS " -std=c++11")
+  endif()
+endif()
+set(OTB_CONFIG_APPLICATION_PATH "${OTB_BINARY_DIR}/${OTB_INSTALL_APP_DIR}")
 set(OTB_CONFIG_TARGETS_CONDITION " AND NOT OTB_BINARY_DIR")
 set(OTB_CONFIG_TARGETS_FILE "${OTB_BINARY_DIR}/OTBTargets.cmake")
 set(OTB_CONFIG_MODULE_API_FILE "${OTB_SOURCE_DIR}/CMake/OTBModuleAPI.cmake")
@@ -326,6 +340,11 @@ set(OTB_CONFIG_CODE "${OTB_CONFIG_CODE}
 set(OTB_MODULES_DIR \"\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_PACKAGE_DIR}/Modules\")")
 set(OTB_USE_FILE "\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_PACKAGE_DIR}/UseOTB.cmake")
 set(OTB_CONFIG_CMAKE_DIR "\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_PACKAGE_DIR}")
+if(OTB_WRAP_PYTHON)
+set(OTB_CONFIG_CODE "${OTB_CONFIG_CODE}
+set(OTB_PYTHONPATH \"\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_PYTHON_DIR}\")")
+endif()
+set(OTB_CONFIG_APPLICATION_PATH "\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_APP_DIR}")
 set(OTB_CONFIG_TARGETS_CONDITION "")
 set(OTB_CONFIG_TARGETS_FILE "\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_PACKAGE_DIR}/OTBTargets.cmake")
 set(OTB_CONFIG_MODULE_API_FILE "\${OTB_INSTALL_PREFIX}/${OTB_INSTALL_PACKAGE_DIR}/OTBModuleAPI.cmake")
diff --git a/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx b/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx
index 7a8e700..3cac449 100644
--- a/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx
+++ b/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx
@@ -203,7 +203,16 @@ int main(int argc, char * argv[])
   //  Software Guide : EndLatex
 
   // Software Guide : BeginCodeSnippet
-  filter->Update();
+  try
+    {
+    filter->Update();
+    }
+  catch (itk::ExceptionObject& err)
+    {
+    std::cerr << "ExceptionObject caught !" << std::endl;
+    std::cerr << err << std::endl;
+    return -1;
+    }
   // Software Guide : EndCodeSnippet
 
   writer->SetFileName(argv[2]);
diff --git a/Examples/Markov/MarkovRestorationExample.cxx b/Examples/Markov/MarkovRestorationExample.cxx
index 3821d19..1886ec4 100644
--- a/Examples/Markov/MarkovRestorationExample.cxx
+++ b/Examples/Markov/MarkovRestorationExample.cxx
@@ -223,7 +223,16 @@ int main(int argc, char* argv[])
 
   writer->SetInput(rescaleFilter->GetOutput());
 
-  writer->Update();
+  try
+    {
+    writer->Update();
+    }
+  catch (itk::ExceptionObject& err)
+    {
+    std::cerr << "ExceptionObject caught !" << std::endl;
+    std::cerr << err << std::endl;
+    return -1;
+    }
   // Software Guide : EndCodeSnippet
 
   // Software Guide : BeginLatex
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h b/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
index 140520a..87f19d4 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
@@ -23,6 +23,16 @@
 #include "otbConfigure.h"
 #include "itkMacro.h"
 
+#if defined(_MSC_VER)
+#pragma warning ( push )
+#pragma warning ( disable: 4251 )
+#include "ogr_core.h" // OGR enums
+#pragma warning ( pop )
+#else
+#include "ogr_core.h" // OGR enums
+#endif
+
+
 #ifdef OTB_USE_GDAL_20
 class GDALDataset;
 class GDALDriver;
@@ -40,6 +50,12 @@ namespace ogr
 namespace version_proxy
 {
 
+/**
+* With Gdal >= 2.0, this function will test equality between type and
+* OFTInteger64 enum. Otherwise, it returns false. 
+*/
+OTBGdalAdapters_EXPORT bool IsOFTInteger64(OGRFieldType type);
+
 /** 
  * This namespace holds proxy functions hiding interface changes in gdal 2.0 
  *
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx
index 8a21d09..b81eb37 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbOGRVersionProxy.h"
 
+#include "itkMacro.h"
+
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wshadow"
@@ -33,6 +35,12 @@ namespace ogr
 namespace version_proxy
 {
 
+OTBGdalAdapters_EXPORT bool IsOFTInteger64(OGRFieldType itkNotUsed(type))
+{
+  return false;
+}
+
+
 GDALDatasetType * Open(const char * filename, bool readOnly)
 {
   return OGRSFDriverRegistrar::Open(filename,!readOnly);
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
index 81d0ff8..1872586 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
@@ -34,6 +34,11 @@ namespace ogr
 namespace version_proxy
 {
 
+OTBGdalAdapters_EXPORT bool IsOFTInteger64(OGRFieldType type)
+{
+  return type == OFTInteger64;
+}
+
 GDALDatasetType * Open(const char * filename, bool readOnly)
 {
   return (GDALDatasetType *)GDALOpenEx(filename, (readOnly? GDAL_OF_READONLY : GDAL_OF_UPDATE) | GDAL_OF_VECTOR,NULL,NULL,NULL);
diff --git a/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx b/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx
index b36d66c..d665845 100644
--- a/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx
+++ b/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx
@@ -66,13 +66,18 @@ GetExistingDirectory( QWidget * p,
 		      const QString& dir,
 		      QFileDialog::Options options )
 {
+  QString dialogCaption(caption.isEmpty()
+    ? QObject::tr( "Select directory..." )
+    : caption);
+  QString dialogDir(dir.isEmpty()
+    ? RecentDirectory
+    : dir);
+
   QString path(
     QFileDialog::getExistingDirectory(
       p,
-      caption.isEmpty()
-      ? QObject::tr( "Select directory..." )
-      : caption,
-      dir.isEmpty() ? RecentDirectory : dir,
+      dialogCaption,
+      dialogDir,
       options
     )
   );
@@ -95,13 +100,18 @@ GetOpenFileName( QWidget * p,
 		 QString* selectedFilter,
 		 QFileDialog::Options options )
 {
+  QString dialogCaption(caption.isEmpty()
+    ? QObject::tr( "Open file..." )
+    : caption);
+  QString dialogDir(dir.isEmpty()
+    ? RecentDirectory
+    : dir);
+
   QString filename(
     QFileDialog::getOpenFileName(
       p,
-      caption.isEmpty()
-      ? QObject::tr( "Open file..." )
-      : caption,
-      dir.isEmpty() ? RecentDirectory : dir,
+      dialogCaption,
+      dialogDir,
       filter,
       selectedFilter,
       options
@@ -124,13 +134,18 @@ GetOpenFileNames( QWidget * p,
 		  QString * selectedFilter,
 		  QFileDialog::Options options )
 {
+  QString dialogCaption(caption.isEmpty()
+    ? QObject::tr( "Open file..." )
+    : caption);
+  QString dialogDir(dir.isEmpty()
+    ? RecentDirectory
+    : dir);
+
   QStringList filenames(
     QFileDialog::getOpenFileNames(
       p,
-      caption.isEmpty()
-      ? QObject::tr( "Open file..." )
-      : caption,
-      dir.isEmpty() ? RecentDirectory : dir,
+      dialogCaption,
+      dialogDir,
       filter,
       selectedFilter,
       options
@@ -153,13 +168,18 @@ GetSaveFileName( QWidget * p,
 		 QString * selectedFilter,
 		 QFileDialog::Options options )
 {
+  QString dialogCaption(caption.isEmpty()
+    ? QObject::tr( "Save file..." )
+    : caption);
+  QString dialogDir(dir.isEmpty()
+    ? RecentDirectory
+    : dir);
+
   QString filename(
     QFileDialog::getSaveFileName(
       p,
-      caption.isEmpty()
-      ? QObject::tr( "Save file..." )
-      : caption,
-      dir.isEmpty() ? RecentDirectory : dir,
+      dialogCaption,
+      dialogDir,
       filter,
       selectedFilter,
       options
diff --git a/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx b/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx
index f320538..240e55d 100644
--- a/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx
+++ b/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx
@@ -30,6 +30,11 @@ namespace otb
 {
 namespace Wrapper
 {
+/** Utility function to negate std::isalnum */
+bool IsNotAlphaNum(char c)
+  {
+  return !std::isalnum(c);
+  }
 
 class ComputeConfusionMatrix : public Application
 {
@@ -108,12 +113,10 @@ private:
   AddParameter(ParameterType_InputFilename,"ref.vector.in","Input reference vector data");
   SetParameterDescription("ref.vector.in", "Input vector data of the ground truth");
 
-  AddParameter(ParameterType_String,"ref.vector.field","Field name");
+  AddParameter(ParameterType_ListView,"ref.vector.field","Field name");
   SetParameterDescription("ref.vector.field","Field name containing the label values");
-  SetParameterString("ref.vector.field","Class");
-  MandatoryOff("ref.vector.field");
-  DisableParameter("ref.vector.field");
-
+  SetListViewSingleSelectionMode("ref.vector.field",true);
+  
   AddParameter(ParameterType_Int,"nodatalabel","Value for nodata pixels");
   SetParameterDescription("nodatalabel", "Label for the NoData class. Such input pixels will be discarded from the "
       "ground truth and from the input classification map. By default, 'nodatalabel = 0'.");
@@ -134,7 +137,32 @@ private:
 
   void DoUpdateParameters() ITK_OVERRIDE
   {
-    // Nothing to do here : all parameters are independent
+    if ( HasValue("ref.vector.in") )
+      {
+      std::string vectorFile = GetParameterString("ref.vector.in");
+      ogr::DataSource::Pointer ogrDS =
+        ogr::DataSource::New(vectorFile, ogr::DataSource::Modes::Read);
+      ogr::Layer layer = ogrDS->GetLayer(0);
+      ogr::Feature feature = layer.ogr().GetNextFeature();
+      
+      ClearChoices("ref.vector.field");
+      
+      for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
+        {
+        std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
+        key = item;
+        std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
+        std::transform(key.begin(), end, key.begin(), tolower);
+        
+        OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
+        
+        if(fieldType == OFTString || fieldType == OFTInteger || ogr::version_proxy::IsOFTInteger64(fieldType))
+          {
+          std::string tmpKey="ref.vector.field."+key.substr(0, end - key.begin());
+          AddChoice(tmpKey,item);
+          }
+        }
+      }    
   }
 
   std::string LogConfusionMatrix(MapOfClassesType* mapOfClasses, ConfusionMatrixType* matrix)
@@ -228,8 +256,18 @@ private:
     else
       {
       ogrRef = otb::ogr::DataSource::New(GetParameterString("ref.vector.in"), otb::ogr::DataSource::Modes::Read);
-      field = this->GetParameterString("ref.vector.field");
 
+    // Get field name
+    std::vector<int> selectedCFieldIdx = GetSelectedItems("ref.vector.field");
+    
+    if(selectedCFieldIdx.empty())
+      {
+      otbAppLogFATAL(<<"No field has been selected for data labelling!");
+      }
+      
+      std::vector<std::string> cFieldNames = GetChoiceNames("ref.vector.field");  
+      field = cFieldNames[selectedCFieldIdx.front()];
+      
       rasterizeReference->AddOGRDataSource(ogrRef);
       rasterizeReference->SetOutputParametersFromImage(input);
       rasterizeReference->SetBackgroundValue(nodata);
diff --git a/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx b/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx
index b3e2a04..3de87d8 100644
--- a/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx
+++ b/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx
@@ -86,44 +86,39 @@ private:
     // Samples
     typedef double ValueType;
     typedef itk::VariableLengthVector<ValueType> MeasurementType;
+    typedef itk::VariableSizeMatrix<ValueType> MatrixValueType;
 
-    unsigned int nbSamples = 0;
     unsigned int nbBands = 0;
 
+    FloatVectorImageListType* imageList = GetParameterImageList("il");
+    FloatVectorImageListType::InternalContainerSizeType nbImages = imageList->Size();
+
+    // Initialization, all image have same size and number of band/component
+    FloatVectorImageType* firstImage = imageList->GetNthElement(0);
+    nbBands = firstImage->GetNumberOfComponentsPerPixel();
+
     // Build a Measurement Vector of mean
-    MeasurementType mean;
+    MatrixValueType mean(nbBands, static_cast<unsigned int>(nbImages));
+    mean.Fill(itk::NumericTraits<MatrixValueType::ValueType>::Zero);
 
-    // Build a MeasurementVector of variance
-    MeasurementType variance;
+    // Build a Measurement Matrix of variance
+    MatrixValueType variance(nbBands, static_cast<unsigned int>(nbImages));
+    variance.Fill(itk::NumericTraits<MatrixValueType::ValueType>::Zero);
 
-    FloatVectorImageListType* imageList = GetParameterImageList("il");
+    // Build a Measurement Matrix of nbSamples
+    MatrixValueType nbSamples(nbBands, static_cast<unsigned int>(nbImages));
+    nbSamples.Fill(itk::NumericTraits<MatrixValueType::ValueType>::Zero);
 
     //Iterate over all input images
-    for (unsigned int imageId = 0; imageId < imageList->Size(); ++imageId)
+    for (unsigned int imageId = 0; imageId < nbImages; ++imageId)
       {
       FloatVectorImageType* image = imageList->GetNthElement(imageId);
-
-      if (nbBands == 0)
-        {
-        nbBands = image->GetNumberOfComponentsPerPixel();
-        }
-      else if (nbBands != image->GetNumberOfComponentsPerPixel())
+      if (nbBands != image->GetNumberOfComponentsPerPixel())
         {
         itkExceptionMacro(<< "The image #" << imageId + 1 << " has " << image->GetNumberOfComponentsPerPixel()
             << " bands, while the image #1 has " << nbBands );
         }
 
-      FloatVectorImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();
-
-      //Set the measurement vectors size if it's the first iteration
-      if (imageId == 0)
-        {
-        mean.SetSize(nbBands);
-        mean.Fill(0.);
-        variance.SetSize(nbBands);
-        variance.Fill(0.);
-        }
-
       // Compute Statistics of each VectorImage
       StreamingStatisticsVImageFilterType::Pointer statsEstimator = StreamingStatisticsVImageFilterType::New();
       std::ostringstream processName;
@@ -131,41 +126,88 @@ private:
       AddProcess(statsEstimator->GetStreamer(), processName.str().c_str());
       statsEstimator->SetInput(image);
       statsEstimator->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
-      if( HasValue( "bv" )==true )
+
+      if( HasValue( "bv" ) )
         {
         statsEstimator->SetIgnoreUserDefinedValue(true);
         statsEstimator->SetUserIgnoredValue(GetParameterFloat("bv"));
         }
       statsEstimator->Update();
-      mean += statsEstimator->GetMean();
-      for (unsigned int itBand = 0; itBand < nbBands; itBand++)
+
+      MeasurementType nbRelevantPixels = statsEstimator->GetNbRelevantPixels();
+      MeasurementType meanPerBand = statsEstimator->GetMean();
+
+      for(unsigned int itBand = 0; itBand < nbBands; itBand++)
+        {
+        mean(itBand, imageId) = meanPerBand[itBand];
+        variance(itBand, imageId) = (statsEstimator->GetCovariance())( itBand, itBand );
+        nbSamples(itBand, imageId) = nbRelevantPixels[itBand];
+        }
+      }
+
+    // Compute total mean and pooled variation for each band of the image list
+    MeasurementType totalSamplesPerBand;
+    totalSamplesPerBand.SetSize(nbBands);
+    totalSamplesPerBand.Fill(itk::NumericTraits<MeasurementType::ValueType>::Zero);
+
+    MeasurementType totalMeanPerBand;
+    totalMeanPerBand.SetSize(nbBands);
+    totalMeanPerBand.Fill(itk::NumericTraits<MeasurementType::ValueType>::Zero);
+
+    MeasurementType totalVariancePerBand;
+    totalVariancePerBand.SetSize(nbBands);
+    totalVariancePerBand.Fill(itk::NumericTraits<MeasurementType::ValueType>::Zero);
+
+    for (unsigned int imageId = 0; imageId < nbImages; ++imageId)
+      {
+      for(unsigned int itBand = 0; itBand < nbBands; itBand++)
         {
-        variance[itBand] += (size[0] * size[1] - 1) * (statsEstimator->GetCovariance())(itBand, itBand);
+        MeasurementType::ValueType nbSample = nbSamples(itBand, imageId);
+        totalSamplesPerBand[itBand] += nbSample;
+        totalMeanPerBand[itBand] += mean(itBand, imageId) * nbSample;
+        totalVariancePerBand[itBand] += variance(itBand, imageId) * (nbSample  - 1);
         }
-      //Increment nbSamples
-      nbSamples += size[0] * size[1];
       }
 
-    //Divide by the number of input images to get the mean over all layers
-    mean /= imageList->Size();
-    //Apply the pooled variance formula
-    variance /= (nbSamples - imageList->Size());
+    // Check 0 division
+    for(unsigned int itBand = 0; itBand < nbBands; itBand++)
+      {
+      MeasurementType::ValueType nbSample = totalSamplesPerBand[itBand];
+
+      if ( nbSample > nbImages )
+        {
+        totalVariancePerBand[itBand] /= (nbSample - nbImages);
+        }
+      else
+        {
+        totalVariancePerBand[itBand] = itk::NumericTraits<ValueType>::Zero;
+        }
+
+      if ( nbSample != 0 )
+        {
+        totalMeanPerBand[itBand] /= nbSample;
+        }
+      else
+        {
+        totalMeanPerBand[itBand] = itk::NumericTraits<ValueType>::Zero;
+        }
+      }
 
     MeasurementType stddev;
     stddev.SetSize(nbBands);
-    stddev.Fill(0.);
-    for (unsigned int i = 0; i < variance.GetSize(); ++i)
+    stddev.Fill(itk::NumericTraits<MeasurementType::ValueType>::Zero);
+    for (unsigned int i = 0; i < totalVariancePerBand.GetSize(); ++i)
       {
-      stddev[i] = vcl_sqrt(variance[i]);
+      stddev[i] = vcl_sqrt(totalVariancePerBand[i]);
       }
 
-    if( HasValue( "out" )==true )
+    if( HasValue( "out" ) )
       {
       // Write the Statistics via the statistic writer
       typedef otb::StatisticsXMLFileWriter<MeasurementType> StatisticsWriter;
       StatisticsWriter::Pointer writer = StatisticsWriter::New();
       writer->SetFileName(GetParameterString("out"));
-      writer->AddInput("mean", mean);
+      writer->AddInput("mean", totalMeanPerBand);
       writer->AddInput("stddev", stddev);
       writer->Update();
       }
diff --git a/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx b/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx
index dd9d347..29a2b45 100644
--- a/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx
+++ b/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx
@@ -140,12 +140,12 @@ private:
     AddParameter(ParameterType_String, "cri", "Criterion");
     SetParameterDescription("cri", "Dempster Shafer criterion (by default (belief+plausibility)/2)");
     MandatoryOff("cri");
-    SetParameterString("cri","((Belief + Plausibility)/2.)");
+    SetParameterString("cri","((Belief + Plausibility)/2.)", false);
 
     AddParameter(ParameterType_Float,"wgt","Weighting");
     SetParameterDescription("wgt","Coefficient between 0 and 1 to promote undetection or false detections (default 0.5)");
     MandatoryOff("wgt");
-    SetParameterFloat("wgt", 0.5);
+    SetParameterFloat("wgt",0.5, false);
 
     AddParameter(ParameterType_InputFilename,"initmod","initialization model");
     SetParameterDescription("initmod","Initialization model (xml file) to be used. If the xml initialization model is set, the descriptor list is not used (specified using the option -desclist)");
@@ -154,12 +154,12 @@ private:
     AddParameter(ParameterType_StringList, "desclist","Descriptor list");
     SetParameterDescription("desclist","List of the descriptors to be used in the model (must be specified to perform an automatic initialization)");
     MandatoryOff("desclist");
-    SetParameterString("desclist","");
+    SetParameterString("desclist","", false);
 
     AddParameter(ParameterType_Int,"maxnbit","Maximum number of iterations");
     MandatoryOff("maxnbit");
     SetParameterDescription("maxnbit","Maximum number of optimizer iteration (default 200)");
-    SetParameterInt("maxnbit", 200);
+    SetParameterInt("maxnbit",200, false);
 
     AddParameter(ParameterType_Empty,"optobs","Optimizer Observer");
     SetParameterDescription("optobs","Activate the optimizer observer");
diff --git a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx
index e713cda..d511384 100644
--- a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx
+++ b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx
@@ -175,8 +175,9 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag(Tags::Segmentation);
     AddDocTag(Tags::Learning);
+	AddDocTag(Tags::Segmentation);
+	
     AddParameter(ParameterType_InputImage, "in", "Input Image");
     SetParameterDescription("in", "Input image to classify.");
     AddParameter(ParameterType_OutputImage, "out", "Output Image");
@@ -244,7 +245,7 @@ private:
         {
         otbAppLogWARNING("The available RAM is too small to process this sample size of " << GetParameterInt("ts") <<
             " pixels. The sample size will be reduced to " << maxPixNb << " pixels." << std::endl);
-        this->SetParameterInt("ts", maxPixNb);
+        this->SetParameterInt("ts",maxPixNb, false);
         }
 
       this->SetMaximumParameterIntValue("ts", maxPixNb);
diff --git a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx
index 826af62..8bbd605 100644
--- a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx
+++ b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx
@@ -161,7 +161,7 @@ private:
     SetParameterDescription("strategy.all","Take all samples");
 
     // Default strategy : smallest
-    SetParameterString("strategy","smallest");
+    SetParameterString("strategy","smallest", false);
 
     AddParameter(ParameterType_Choice, "mim", "Multi-Image Mode");
 
@@ -253,9 +253,16 @@ private:
         m_CalculatorList->SetNbOfSamplesAllClasses(countList, partitionMode);
         }
       break;
-      // percent 
+      // smallest class
       case 2:
         {
+        otbAppLogINFO("Sampling strategy : fit the number of samples based on the smallest class");
+        m_CalculatorList->SetMinimumNbOfSamplesByClass(partitionMode);
+        }
+      break;
+      // percent
+      case 3:
+        {
         std::vector<itksys::String> parts = itksys::SystemTools::SplitString(this->GetParameterString("strategy.percent.p"),' ');
         std::vector<double> percentList;
         for (unsigned int i=0 ; i<parts.size() ; i++)
@@ -283,7 +290,7 @@ private:
       break;
 
       // total
-      case 3:
+      case 4:
         {
         std::vector<itksys::String> parts = itksys::SystemTools::SplitString(this->GetParameterString("strategy.total.v"),' ');
         std::vector<unsigned long> totalList;
@@ -305,14 +312,6 @@ private:
         m_CalculatorList->SetTotalNumberOfSamples(totalList, partitionMode);
         }
       break;
-
-      // smallest class
-      case 4:
-        {
-        otbAppLogINFO("Sampling strategy : fit the number of samples based on the smallest class");
-        m_CalculatorList->SetMinimumNbOfSamplesByClass(partitionMode);
-        }
-      break;
       // all samples
       case 5:
         {
diff --git a/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx b/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx
index b1161dd..6ec4a44 100644
--- a/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx
@@ -78,7 +78,7 @@ private:
 
     AddParameter(ParameterType_String,"cfield","Field containing the predicted class.");
     SetParameterDescription("cfield","Field containing the predicted class");
-    SetParameterString("cfield","predicted");
+    SetParameterString("cfield","predicted", false);
 
     // Doc example parameter settings
     SetDocExampleParameterValue("inshp", "vectorData.shp");
diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
index a6167fe..d2272b5 100644
--- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
+++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
@@ -22,12 +22,19 @@
 #include "otbStatisticsXMLFileWriter.h"
 #include "otbGeometriesProjectionFilter.h"
 #include "otbGeometriesSet.h"
+#include "otbWrapperElevationParametersHandler.h"
 
 namespace otb
 {
 namespace Wrapper
 {
 
+/** Utility function to negate std::isalnum */
+bool IsNotAlphaNum(char c)
+  {
+  return !std::isalnum(c);
+  }
+
 class PolygonClassStatistics : public Application
 {
 public:
@@ -95,16 +102,17 @@ private:
     AddParameter(ParameterType_OutputFilename, "out", "Output Statistics");
     SetParameterDescription("out","Output file to store statistics (XML format)");
 
-    AddParameter(ParameterType_String, "field", "Field Name");
+    AddParameter(ParameterType_ListView, "field", "Field Name");
     SetParameterDescription("field","Name of the field carrying the class name in the input vectors.");
-    MandatoryOff("field");
-    SetParameterString("field", "class");
+    SetListViewSingleSelectionMode("field",true);
     
     AddParameter(ParameterType_Int, "layer", "Layer Index");
     SetParameterDescription("layer", "Layer index to read in the input vector file.");
     MandatoryOff("layer");
     SetDefaultParameterInt("layer",0);
-    
+
+    ElevationParametersHandler::AddElevationParameters(this, "elev");
+
     AddRAMParameter();
 
     // Doc example parameter settings
@@ -116,14 +124,51 @@ private:
 
   void DoUpdateParameters() ITK_OVERRIDE
   {
-    // Nothing to do
+     if ( HasValue("vec") )
+      {
+      std::string vectorFile = GetParameterString("vec");
+      ogr::DataSource::Pointer ogrDS =
+        ogr::DataSource::New(vectorFile, ogr::DataSource::Modes::Read);
+      ogr::Layer layer = ogrDS->GetLayer(this->GetParameterInt("layer"));
+      ogr::Feature feature = layer.ogr().GetNextFeature();
+
+      ClearChoices("field");
+      
+      for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
+        {
+        std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
+        key = item;
+        std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
+        std::transform(key.begin(), end, key.begin(), tolower);
+        
+        OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
+        
+        if(fieldType == OFTString || fieldType == OFTInteger || ogr::version_proxy::IsOFTInteger64(fieldType))
+          {
+          std::string tmpKey="field."+key.substr(0, end - key.begin());
+          AddChoice(tmpKey,item);
+          }
+        }
+      }
   }
 
   void DoExecute() ITK_OVERRIDE
   {
   otb::ogr::DataSource::Pointer vectors = 
     otb::ogr::DataSource::New(this->GetParameterString("vec"));
-  std::string fieldName = this->GetParameterString("field");
+
+  // Retrieve the field name
+  std::vector<int> selectedCFieldIdx = GetSelectedItems("field");
+
+  if(selectedCFieldIdx.empty())
+    {
+    otbAppLogFATAL(<<"No field has been selected for data labelling!");
+    }
+
+  std::vector<std::string> cFieldNames = GetChoiceNames("field");  
+  std::string fieldName = cFieldNames[selectedCFieldIdx.front()];
+
+  otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
 
   // Reproject geometries
   FloatVectorImageType::Pointer inputImg = this->GetParameterImage("in");
diff --git a/Modules/Applications/AppClassification/app/otbSOMClassification.cxx b/Modules/Applications/AppClassification/app/otbSOMClassification.cxx
index d7f9075..64a2887 100644
--- a/Modules/Applications/AppClassification/app/otbSOMClassification.cxx
+++ b/Modules/Applications/AppClassification/app/otbSOMClassification.cxx
@@ -85,8 +85,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
+	AddDocTag(Tags::Learning);
     AddDocTag(Tags::Segmentation);
-    AddDocTag(Tags::Learning);
 
     AddParameter(ParameterType_InputImage,  "in",   "InputImage");
     SetParameterDescription("in", "Input image to classify.");
diff --git a/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx b/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx
index f1cc0f9..0eb1e3a 100644
--- a/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx
+++ b/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx
@@ -24,6 +24,11 @@ namespace otb
 {
 namespace Wrapper
 {
+/** Utility function to negate std::isalnum */
+bool IsNotAlphaNum(char c)
+  {
+  return !std::isalnum(c);
+  }
 
 class SampleExtraction : public Application
 {
@@ -81,7 +86,7 @@ private:
     AddParameter(ParameterType_String, "outfield.prefix.name", "Output field prefix");
     SetParameterDescription("outfield.prefix.name","Prefix used to form the field names that"
       "will contain the extracted values.");
-    SetParameterString("outfield.prefix.name", "value_");
+    SetParameterString("outfield.prefix.name", "value_", false);
 
     AddChoice("outfield.list","Use the given name list");
     SetParameterDescription("outfield.list","Use the given name list");
@@ -89,12 +94,10 @@ private:
     AddParameter(ParameterType_StringList, "outfield.list.names", "Output field names");
     SetParameterDescription("outfield.list.names","Full list of output field names.");
 
-    AddParameter(ParameterType_String, "field", "Field Name");
-    SetParameterDescription("field","Name of the field carrying the class"
-      "name in the input vectors. This field is copied to output.");
-    MandatoryOff("field");
-    SetParameterString("field", "class");
-
+    AddParameter(ParameterType_ListView, "field", "Field Name");
+    SetParameterDescription("field","Name of the field carrying the class name in the input vectors.");
+    SetListViewSingleSelectionMode("field",true);
+    
     AddParameter(ParameterType_Int, "layer", "Layer Index");
     SetParameterDescription("layer", "Layer index to read in the input vector file.");
     MandatoryOff("layer");
@@ -113,7 +116,32 @@ private:
 
   void DoUpdateParameters()
   {
-    // Nothing to do
+    if ( HasValue("vec") )
+      {
+      std::string vectorFile = GetParameterString("vec");
+      ogr::DataSource::Pointer ogrDS =
+        ogr::DataSource::New(vectorFile, ogr::DataSource::Modes::Read);
+      ogr::Layer layer = ogrDS->GetLayer(this->GetParameterInt("layer"));
+      ogr::Feature feature = layer.ogr().GetNextFeature();
+
+      ClearChoices("field");
+      
+      for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
+        {
+        std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
+        key = item;
+        std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
+        std::transform(key.begin(), end, key.begin(), tolower);
+        
+        OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
+        
+        if(fieldType == OFTString || fieldType == OFTInteger || ogr::version_proxy::IsOFTInteger64(fieldType))
+          {
+          std::string tmpKey="field."+key.substr(0, end - key.begin());
+          AddChoice(tmpKey,item);
+          }
+        }
+      }
   }
 
   void DoExecute()
@@ -134,6 +162,17 @@ private:
       output = vectors;
       }
 
+    // Retrieve the field name
+    std::vector<int> selectedCFieldIdx = GetSelectedItems("field");
+
+    if(selectedCFieldIdx.empty())
+      {
+      otbAppLogFATAL(<<"No field has been selected for data labelling!");
+      }
+
+  std::vector<std::string> cFieldNames = GetChoiceNames("field");  
+  std::string fieldName = cFieldNames[selectedCFieldIdx.front()];
+    
     std::vector<std::string> nameList;
     std::string namePrefix("");
     if (this->GetParameterString("outfield").compare("prefix") == 0)
@@ -155,7 +194,7 @@ private:
     filter->SetLayerIndex(this->GetParameterInt("layer"));
     filter->SetSamplePositions(vectors);
     filter->SetOutputSamples(output);
-    filter->SetClassFieldName(this->GetParameterString("field"));
+    filter->SetClassFieldName(fieldName);
     filter->SetOutputFieldPrefix(namePrefix);
     filter->SetOutputFieldNames(nameList);
     filter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
index c4472b3..81b2b33 100644
--- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
+++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
@@ -23,12 +23,19 @@
 #include "otbRandomSampler.h"
 #include "otbGeometriesProjectionFilter.h"
 #include "otbGeometriesSet.h"
+#include "otbWrapperElevationParametersHandler.h"
 
 namespace otb
 {
 namespace Wrapper
 {
 
+/** Utility function to negate std::isalnum */
+bool IsNotAlphaNum(char c)
+  {
+  return !std::isalnum(c);
+  }
+
 class SampleSelection : public Application
 {
 public:
@@ -66,8 +73,6 @@ public:
 private:
   SampleSelection()
     {
-    m_Periodic = PeriodicSamplerType::New();
-    m_Random = RandomSamplerType::New();
     m_ReaderStat = XMLReaderType::New();
     m_RateCalculator = RateCalculatorType::New();
     }
@@ -192,18 +197,19 @@ private:
     SetParameterDescription("strategy.all","Take all samples");
 
     // Default strategy : smallest
-    SetParameterString("strategy","smallest");
+    SetParameterString("strategy","smallest", false);
 
-    AddParameter(ParameterType_String, "field", "Field Name");
+    AddParameter(ParameterType_ListView, "field", "Field Name");
     SetParameterDescription("field","Name of the field carrying the class name in the input vectors.");
-    MandatoryOff("field");
-    SetParameterString("field", "class");
+    SetListViewSingleSelectionMode("field",true);
 
     AddParameter(ParameterType_Int, "layer", "Layer Index");
     SetParameterDescription("layer", "Layer index to read in the input vector file.");
     MandatoryOff("layer");
     SetDefaultParameterInt("layer",0);
 
+    ElevationParametersHandler::AddElevationParameters(this, "elev");
+
     AddRAMParameter();
 
     AddRANDParameter();
@@ -218,18 +224,51 @@ private:
 
   void DoUpdateParameters()
   {
+ if ( HasValue("vec") )
+      {
+      std::string vectorFile = GetParameterString("vec");
+      ogr::DataSource::Pointer ogrDS =
+        ogr::DataSource::New(vectorFile, ogr::DataSource::Modes::Read);
+      ogr::Layer layer = ogrDS->GetLayer(this->GetParameterInt("layer"));
+      ogr::Feature feature = layer.ogr().GetNextFeature();
+
+      ClearChoices("field");
+      
+      for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
+        {
+        std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
+        key = item;
+        std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
+        std::transform(key.begin(), end, key.begin(), tolower);
+        
+        OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
+        
+        if(fieldType == OFTString || fieldType == OFTInteger || ogr::version_proxy::IsOFTInteger64(fieldType))
+          {
+          std::string tmpKey="field."+key.substr(0, end - key.begin());
+          AddChoice(tmpKey,item);
+          }
+        }
+      }
   }
 
   void DoExecute()
     {
     // Clear state
     m_RateCalculator->ClearRates();
-    m_Periodic->GetFilter()->ClearOutputs();
-    m_Random->GetFilter()->ClearOutputs();
 
-    // Setup ram
-    m_Periodic->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
-    m_Random->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+    otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
+
+    // Get field name
+    std::vector<int> selectedCFieldIdx = GetSelectedItems("field");
+    
+    if(selectedCFieldIdx.empty())
+      {
+      otbAppLogFATAL(<<"No field has been selected for data labelling!");
+      }
+    
+    std::vector<std::string> cFieldNames = GetChoiceNames("field");  
+    std::string fieldName = cFieldNames[selectedCFieldIdx.front()];
     
     m_ReaderStat->SetFileName(this->GetParameterString("instats"));
     ClassCountMapType classCount = m_ReaderStat->GetStatisticMapByName<ClassCountMapType>("samplesPerClass");
@@ -368,37 +407,41 @@ private:
         PeriodicSamplerType::SamplerParameterType param;
         param.Offset = 0;
         param.MaxJitter = this->GetParameterInt("sampler.periodic.jitter");
-
-        m_Periodic->SetInput(this->GetParameterImage("in"));
-        m_Periodic->SetOGRData(reprojVector);
-        m_Periodic->SetOutputPositionContainerAndRates(outputSamples, rates);
-        m_Periodic->SetFieldName(this->GetParameterString("field"));
-        m_Periodic->SetLayerIndex(this->GetParameterInt("layer"));
-        m_Periodic->SetSamplerParameters(param);
+        param.MaxBufferSize = 100000000UL;
+        PeriodicSamplerType::Pointer periodicFilt = PeriodicSamplerType::New();
+        periodicFilt->SetInput(this->GetParameterImage("in"));
+        periodicFilt->SetOGRData(reprojVector);
+        periodicFilt->SetOutputPositionContainerAndRates(outputSamples, rates);
+        periodicFilt->SetFieldName(fieldName);
+        periodicFilt->SetLayerIndex(this->GetParameterInt("layer"));
+        periodicFilt->SetSamplerParameters(param);
         if (IsParameterEnabled("mask") && HasValue("mask"))
           {
-          m_Periodic->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
+          periodicFilt->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
           }
-        m_Periodic->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
-        AddProcess(m_Periodic->GetStreamer(),"Selecting positions with periodic sampler...");
-        m_Periodic->Update();
+        periodicFilt->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
+        AddProcess(periodicFilt->GetStreamer(),"Selecting positions with periodic sampler...");
+        periodicFilt->Update();
         }
       break;
       // random
       case 1:
         {
-        m_Random->SetInput(this->GetParameterImage("in"));
-        m_Random->SetOGRData(reprojVector);
-        m_Random->SetOutputPositionContainerAndRates(outputSamples, rates);
-        m_Random->SetFieldName(this->GetParameterString("field"));
-        m_Random->SetLayerIndex(this->GetParameterInt("layer"));
+        RandomSamplerType::Pointer randomFilt = RandomSamplerType::New();
+        randomFilt->SetInput(this->GetParameterImage("in"));
+        randomFilt->SetOGRData(reprojVector);
+        randomFilt->SetOutputPositionContainerAndRates(outputSamples, rates);
+        randomFilt->SetFieldName(fieldName);
+        randomFilt->SetLayerIndex(this->GetParameterInt("layer"));
         if (IsParameterEnabled("mask") && HasValue("mask"))
           {
-          m_Random->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
+          randomFilt->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
           }
-        m_Random->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
-        AddProcess(m_Random->GetStreamer(),"Selecting positions with random sampler...");
-        m_Random->Update();
+        randomFilt->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
+        AddProcess(randomFilt->GetStreamer(),"Selecting positions with random sampler...");
+        randomFilt->Update();
+
+        randomFilt = RandomSamplerType::New();
         }
       break;
       default:
@@ -408,10 +451,6 @@ private:
   }
 
   RateCalculatorType::Pointer m_RateCalculator;
-  
-  PeriodicSamplerType::Pointer m_Periodic;
-  RandomSamplerType::Pointer m_Random;
-  
   XMLReaderType::Pointer m_ReaderStat;
 };
 
diff --git a/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx
index 932454f..5433dcf 100644
--- a/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx
@@ -14,94 +14,68 @@
  PURPOSE.  See the above copyright notices for more information.
 
  =========================================================================*/
-#include "otbLearningApplicationBase.h"
+#include "otbWrapperCompositeApplication.h"
 #include "otbWrapperApplicationFactory.h"
 
-#include "otbListSampleGenerator.h"
-
-// Statistic XML Reader
-#include "otbStatisticsXMLFileReader.h"
-
-// Validation
-#include "otbConfusionMatrixCalculator.h"
-
-#include "itkTimeProbe.h"
-#include "otbStandardFilterWatcher.h"
-
-// Normalize the samples
-#include "otbShiftScaleSampleListFilter.h"
-
-// List sample concatenation
-#include "otbConcatenateSampleListFilter.h"
-
-// Balancing ListSample
-#include "otbListSampleToBalancedListSampleFilter.h"
-
-// VectorData projection filter
-
-// Extract a ROI of the vectordata
-#include "otbVectorDataIntoImageProjectionFilter.h"
-
-// Elevation handler
-#include "otbWrapperElevationParametersHandler.h"
+#include "otbOGRDataToSamplePositionFilter.h"
+#include "otbSamplingRateCalculator.h"
 
 namespace otb
 {
 namespace Wrapper
 {
 
-class TrainImagesClassifier: public LearningApplicationBase<float,int>
+class TrainImagesClassifier: public CompositeApplication
 {
 public:
   /** Standard class typedefs. */
   typedef TrainImagesClassifier Self;
-  typedef LearningApplicationBase<float,int> Superclass;
+  typedef CompositeApplication Superclass;
   typedef itk::SmartPointer<Self> Pointer;
   typedef itk::SmartPointer<const Self> ConstPointer;
 
   /** Standard macro */
   itkNewMacro(Self)
 
-  itkTypeMacro(TrainImagesClassifier, otb::Wrapper::LearningApplicationBase)
-
-  typedef Superclass::SampleType              SampleType;
-  typedef Superclass::ListSampleType          ListSampleType;
-  typedef Superclass::TargetSampleType        TargetSampleType;
-  typedef Superclass::TargetListSampleType    TargetListSampleType;
+  itkTypeMacro(TrainImagesClassifier, otb::Wrapper::CompositeApplication)
 
-  typedef Superclass::SampleImageType         SampleImageType;
-  typedef SampleImageType::PixelType          PixelType;
+  /** filters typedefs*/
+  typedef otb::OGRDataToSamplePositionFilter<
+    FloatVectorImageType,
+    UInt8ImageType,
+    otb::PeriodicSampler>                           PeriodicSamplerType;
 
-  // SampleList manipulation
-  typedef otb::ListSampleGenerator<SampleImageType, VectorDataType> ListSampleGeneratorType;
-
-  typedef otb::Statistics::ConcatenateSampleListFilter<ListSampleType> ConcatenateListSampleFilterType;
-  typedef otb::Statistics::ConcatenateSampleListFilter<TargetListSampleType> ConcatenateLabelListSampleFilterType;
-
-  // Statistic XML file Reader
-  typedef otb::StatisticsXMLFileReader<SampleType> StatisticsReader;
-
-  // Enhance List Sample  typedef otb::Statistics::ListSampleToBalancedListSampleFilter<ListSampleType, LabelListSampleType>      BalancingListSampleFilterType;
-  typedef otb::Statistics::ShiftScaleSampleListFilter<ListSampleType, ListSampleType> ShiftScaleFilterType;
-
-  // Estimate performance on validation sample
-  typedef otb::ConfusionMatrixCalculator<TargetListSampleType, TargetListSampleType> ConfusionMatrixCalculatorType;
-  typedef ConfusionMatrixCalculatorType::ConfusionMatrixType ConfusionMatrixType;
-  typedef ConfusionMatrixCalculatorType::MapOfIndicesType MapOfIndicesType;
-  typedef ConfusionMatrixCalculatorType::ClassLabelType ClassLabelType;
-
-  // VectorData projection filter
-  typedef otb::VectorDataProjectionFilter<VectorDataType, VectorDataType> VectorDataProjectionFilterType;
-
-  // Extract ROI
-  typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, SampleImageType> VectorDataReprojectionType;
+  typedef otb::SamplingRateCalculator::MapRateType  MapRateType;
 
 protected:
-  //using Superclass::AddParameter;
-  //friend void InitSVMParams(TrainImagesClassifier & app);
 
 private:
 
+bool RemoveFile(std::string &filePath)
+{
+  bool res = true;
+  if(itksys::SystemTools::FileExists(filePath.c_str()))
+    {
+    size_t posExt = filePath.rfind('.');
+    if (posExt != std::string::npos &&
+        filePath.compare(posExt,std::string::npos,".shp") == 0)
+      {
+      std::string shxPath = filePath.substr(0,posExt) + std::string(".shx");
+      std::string dbfPath = filePath.substr(0,posExt) + std::string(".dbf");
+      std::string prjPath = filePath.substr(0,posExt) + std::string(".prj");
+      RemoveFile(shxPath);
+      RemoveFile(dbfPath);
+      RemoveFile(prjPath);
+      }
+    res = itksys::SystemTools::RemoveFile(filePath.c_str());
+    if (!res)
+      {
+      otbAppLogINFO(<<"Unable to remove file  "<<filePath);
+      }
+    }
+  return res;
+}
+
 void DoInit() ITK_OVERRIDE
 {
   SetName("TrainImagesClassifier");
@@ -126,62 +100,99 @@ void DoInit() ITK_OVERRIDE
   SetDocAuthors("OTB-Team");
   SetDocSeeAlso("OpenCV documentation for machine learning http://docs.opencv.org/modules/ml/doc/ml.html ");
 
+  AddDocTag(Tags::Learning);
+
+  ClearApplications();
+  AddApplication("PolygonClassStatistics", "polystat","Polygon analysis");
+  AddApplication("MultiImageSamplingRate", "rates", "Sampling rates");
+  AddApplication("SampleSelection", "select", "Sample selection");
+  AddApplication("SampleExtraction","extraction", "Sample extraction");
+  AddApplication("TrainVectorClassifier", "training", "Model training");
+
   //Group IO
   AddParameter(ParameterType_Group, "io", "Input and output data");
   SetParameterDescription("io", "This group of parameters allows setting input and output data.");
+
   AddParameter(ParameterType_InputImageList, "io.il", "Input Image List");
   SetParameterDescription("io.il", "A list of input images.");
   AddParameter(ParameterType_InputVectorDataList, "io.vd", "Input Vector Data List");
   SetParameterDescription("io.vd", "A list of vector data to select the training samples.");
-  AddParameter(ParameterType_InputFilename, "io.imstat", "Input XML image statistics file");
-  MandatoryOff("io.imstat");
-  SetParameterDescription("io.imstat",
-                          "Input XML file containing the mean and the standard deviation of the input images.");
-  AddParameter(ParameterType_OutputFilename, "io.confmatout", "Output confusion matrix");
-  SetParameterDescription("io.confmatout", "Output file containing the confusion matrix (.csv format).");
-  MandatoryOff("io.confmatout");
-  AddParameter(ParameterType_OutputFilename, "io.out", "Output model");
-  SetParameterDescription("io.out", "Output file containing the model estimated (.txt format).");
-
-  // Elevation
-  ElevationParametersHandler::AddElevationParameters(this, "elev");
-
-  //Group Sample list
+
+  AddParameter(ParameterType_InputVectorDataList, "io.valid", "Validation Vector Data List");
+  SetParameterDescription("io.valid", "A list of vector data to select the training samples.");
+  MandatoryOff("io.valid");
+
+  ShareParameter("io.imstat","training.io.stats");
+  ShareParameter("io.confmatout","training.io.confmatout");
+  ShareParameter("io.out","training.io.out");
+
+  ShareParameter("elev","polystat.elev");
+
+  // Sampling settings
   AddParameter(ParameterType_Group, "sample", "Training and validation samples parameters");
   SetParameterDescription("sample",
-                          "This group of parameters allows you to set training and validation sample lists parameters.");
-
+    "This group of parameters allows you to set training and validation sample lists parameters.");
   AddParameter(ParameterType_Int, "sample.mt", "Maximum training sample size per class");
-  //MandatoryOff("mt");
   SetDefaultParameterInt("sample.mt", 1000);
-  SetParameterDescription("sample.mt", "Maximum size per class (in pixels) of the training sample list (default = 1000) (no limit = -1). If equal to -1, then the maximal size of the available training sample list per class will be equal to the surface area of the smallest class multiplied by the training sample ratio.");
+  SetParameterDescription("sample.mt", "Maximum size per class (in pixels) of "
+    "the training sample list (default = 1000) (no limit = -1). If equal to -1,"
+    " then the maximal size of the available training sample list per class "
+    "will be equal to the surface area of the smallest class multiplied by the"
+    " training sample ratio.");
   AddParameter(ParameterType_Int, "sample.mv", "Maximum validation sample size per class");
-  // MandatoryOff("mv");
   SetDefaultParameterInt("sample.mv", 1000);
-  SetParameterDescription("sample.mv", "Maximum size per class (in pixels) of the validation sample list (default = 1000) (no limit = -1). If equal to -1, then the maximal size of the available validation sample list per class will be equal to the surface area of the smallest class multiplied by the validation sample ratio.");
-
+  SetParameterDescription("sample.mv", "Maximum size per class (in pixels) of "
+    "the validation sample list (default = 1000) (no limit = -1). If equal to -1,"
+    " then the maximal size of the available validation sample list per class "
+    "will be equal to the surface area of the smallest class multiplied by the "
+    "validation sample ratio.");
   AddParameter(ParameterType_Int, "sample.bm", "Bound sample number by minimum");
   SetDefaultParameterInt("sample.bm", 1);
-  SetParameterDescription("sample.bm", "Bound the number of samples for each class by the number of available samples by the smaller class. Proportions between training and validation are respected. Default is true (=1).");
+  SetParameterDescription("sample.bm", "Bound the number of samples for each "
+    "class by the number of available samples by the smaller class. Proportions "
+    "between training and validation are respected. Default is true (=1).");
+  AddParameter(ParameterType_Float, "sample.vtr", "Training and validation sample ratio");
+  SetParameterDescription("sample.vtr",
+    "Ratio between training and validation samples (0.0 = all training, 1.0 = "
+    "all validation) (default = 0.5).");
+  SetParameterFloat("sample.vtr",0.5, false);
+  SetMaximumParameterFloatValue("sample.vtr",1.0);
+  SetMinimumParameterFloatValue("sample.vtr",0.0);
 
+  ShareParameter("sample.vfn","polystat.field");
 
-  AddParameter(ParameterType_Empty, "sample.edg", "On edge pixel inclusion");
-  SetParameterDescription("sample.edg",
-                          "Takes pixels on polygon edge into consideration when building training and validation samples.");
-  MandatoryOff("sample.edg");
+  // hide sampling parameters
+  //ShareParameter("sample.strategy","rates.strategy");
+  //ShareParameter("sample.mim","rates.mim");
 
-  AddParameter(ParameterType_Float, "sample.vtr", "Training and validation sample ratio");
-  SetParameterDescription("sample.vtr",
-                          "Ratio between training and validation samples (0.0 = all training, 1.0 = all validation) (default = 0.5).");
-  SetParameterFloat("sample.vtr", 0.5);
+  // Classifier settings
+  ShareParameter("classifier","training.classifier");
 
-  AddParameter(ParameterType_String, "sample.vfn", "Name of the discrimination field");
-  SetParameterDescription("sample.vfn", "Name of the field used to discriminate class labels in the input vector data files.");
-  SetParameterString("sample.vfn", "Class");
+  ShareParameter("rand","training.rand");
 
-  Superclass::DoInit();
+  // Synchronization between applications
+  Connect("select.field", "polystat.field");
+  Connect("select.layer", "polystat.layer");
+  Connect("select.elev",  "polystat.elev");
+
+  Connect("extraction.in",    "select.in");
+  Connect("extraction.vec",   "select.out");
+  Connect("extraction.field", "polystat.field");
+  Connect("extraction.layer", "polystat.layer");
+
+  Connect("training.cfield", "polystat.field");
+
+  ShareParameter("ram","polystat.ram");
+  Connect("select.ram", "polystat.ram");
+  Connect("extraction.ram", "polystat.ram");
+
+  Connect("select.rand", "training.rand");
+
+  AddParameter(ParameterType_Empty,"cleanup","Temporary files cleaning");
+  EnableParameter("cleanup");
+  SetParameterDescription("cleanup","If activated, the application will try to clean all temporary files it created");
+  MandatoryOff("cleanup");
 
-  AddRANDParameter();
   // Doc example parameter settings
   SetDocExampleParameterValue("io.il", "QB_1_ortho.tif");
   SetDocExampleParameterValue("io.vd", "VectorData_QB1.shp");
@@ -189,7 +200,6 @@ void DoInit() ITK_OVERRIDE
   SetDocExampleParameterValue("sample.mv", "100");
   SetDocExampleParameterValue("sample.mt", "100");
   SetDocExampleParameterValue("sample.vtr", "0.5");
-  SetDocExampleParameterValue("sample.edg", "false");
   SetDocExampleParameterValue("sample.vfn", "Class");
   SetDocExampleParameterValue("classifier", "libsvm");
   SetDocExampleParameterValue("classifier.libsvm.k", "linear");
@@ -201,396 +211,305 @@ void DoInit() ITK_OVERRIDE
 
 void DoUpdateParameters() ITK_OVERRIDE
 {
-  // Nothing to do here : all parameters are independent
+  if ( HasValue("io.vd") )
+    {
+    std::vector<std::string> vectorFileList = GetParameterStringList("io.vd");
+    GetInternalApplication("polystat")->SetParameterString("vec",vectorFileList[0], false);
+    UpdateInternalParameters("polystat");
+    }
 }
 
-void LogConfusionMatrix(ConfusionMatrixCalculatorType* confMatCalc)
+void DoExecute() ITK_OVERRIDE
 {
-  ConfusionMatrixCalculatorType::ConfusionMatrixType matrix = confMatCalc->GetConfusionMatrix();
-
-  // Compute minimal width
-  size_t minwidth = 0;
-
-  for (unsigned int i = 0; i < matrix.Rows(); i++)
+  FloatVectorImageListType* imageList = GetParameterImageList("io.il");
+  std::vector<std::string> vectorFileList = GetParameterStringList("io.vd");
+  unsigned int nbInputs = imageList->Size();
+  if (nbInputs > vectorFileList.size())
     {
-    for (unsigned int j = 0; j < matrix.Cols(); j++)
-      {
-      std::ostringstream os;
-      os << matrix(i, j);
-      size_t size = os.str().size();
-
-      if (size > minwidth)
-        {
-        minwidth = size;
-        }
-      }
+    otbAppLogFATAL("Missing input vector data files to match number of images ("<<nbInputs<<").");
     }
 
-  MapOfIndicesType mapOfIndices = confMatCalc->GetMapOfIndices();
-
-  MapOfIndicesType::const_iterator it = mapOfIndices.begin();
-  MapOfIndicesType::const_iterator end = mapOfIndices.end();
-
-  for (; it != end; ++it)
+  // check if validation vectors are given
+  std::vector<std::string> validationVectorFileList;
+  bool dedicatedValidation = false;
+  if (IsParameterEnabled("io.valid") && HasValue("io.valid"))
     {
-    std::ostringstream os;
-    os << "[" << it->second << "]";
-
-    size_t size = os.str().size();
-    if (size > minwidth)
+    dedicatedValidation = true;
+    validationVectorFileList = GetParameterStringList("io.valid");
+    if (nbInputs > validationVectorFileList.size())
       {
-      minwidth = size;
+      otbAppLogFATAL("Missing validation vector data files to match number of images ("<<nbInputs<<").");
       }
     }
 
-  // Generate matrix string, with 'minwidth' as size specifier
-  std::ostringstream os;
-
-  // Header line
-  for (size_t i = 0; i < minwidth; ++i)
-    os << " ";
-  os << " ";
-
-  it = mapOfIndices.begin();
-  end = mapOfIndices.end();
-  for (; it != end; ++it)
+  // Prepare temporary file names
+  std::string outModel(GetParameterString("io.out"));
+  std::vector<std::string> polyStatTrainOutputs;
+  std::vector<std::string> polyStatValidOutputs;
+  std::vector<std::string> ratesTrainOutputs;
+  std::vector<std::string> ratesValidOutputs;
+  std::vector<std::string> sampleOutputs;
+  std::vector<std::string> sampleTrainOutputs;
+  std::vector<std::string> sampleValidOutputs;
+  std::string rateTrainOut;
+  if (dedicatedValidation)
     {
-    os << "[" << it->second << "]" << " ";
+    rateTrainOut = outModel + "_ratesTrain.csv";
     }
-
-  os << std::endl;
-
-  // Each line of confusion matrix
-  for (unsigned int i = 0; i < matrix.Rows(); i++)
+  else
     {
-    ConfusionMatrixCalculatorType::ClassLabelType label = mapOfIndices[i];
-    os << "[" << std::setw(minwidth - 2) << label << "]" << " ";
-    for (unsigned int j = 0; j < matrix.Cols(); j++)
-      {
-      os << std::setw(minwidth) << matrix(i, j) << " ";
-      }
-    os << std::endl;
+    rateTrainOut = outModel + "_rates.csv";
     }
-
-  otbAppLogINFO("Confusion matrix (rows = reference labels, columns = produced labels):\n" << os.str());
-}
-
-void DoExecute() ITK_OVERRIDE
-{
-  //Create training and validation for list samples and label list samples
-  ConcatenateLabelListSampleFilterType::Pointer concatenateTrainingLabels =
-    ConcatenateLabelListSampleFilterType::New();
-  ConcatenateListSampleFilterType::Pointer concatenateTrainingSamples = ConcatenateListSampleFilterType::New();
-  ConcatenateLabelListSampleFilterType::Pointer concatenateValidationLabels =
-    ConcatenateLabelListSampleFilterType::New();
-  ConcatenateListSampleFilterType::Pointer concatenateValidationSamples = ConcatenateListSampleFilterType::New();
-
-  SampleType meanMeasurementVector;
-  SampleType stddevMeasurementVector;
-
-  // Setup the DEM Handler
-  otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this, "elev");
-
-  //--------------------------
-  // Load measurements from images
-  unsigned int nbBands = 0;
-  //Iterate over all input images
-
-  FloatVectorImageListType* imageList = GetParameterImageList("io.il");
-  VectorDataListType* vectorDataList = GetParameterVectorDataList("io.vd");
-
-  vdreproj = VectorDataReprojectionType::New();
-
-  //Iterate over all input images
-  for (unsigned int imgIndex = 0; imgIndex < imageList->Size(); ++imgIndex)
+  std::string rateValidOut(outModel + "_ratesValid.csv");
+  for (unsigned int i=0 ; i<nbInputs ; i++)
     {
-    std::ostringstream oss1, oss2;
-    oss1 << "Reproject polygons for image " << (imgIndex+1) << " ...";
-    oss2 << "Extract samples from image " << (imgIndex+1) << " ...";
-
-    FloatVectorImageType::Pointer image = imageList->GetNthElement(imgIndex);
-    image->UpdateOutputInformation();
-
-    if (imgIndex == 0)
+    std::ostringstream oss;
+    oss <<i+1;
+    std::string strIndex(oss.str());
+    if (dedicatedValidation)
       {
-      nbBands = image->GetNumberOfComponentsPerPixel();
+      polyStatTrainOutputs.push_back(outModel + "_statsTrain_" + strIndex + ".xml");
+      polyStatValidOutputs.push_back(outModel + "_statsValid_" + strIndex + ".xml");
+      ratesTrainOutputs.push_back(outModel + "_ratesTrain_" + strIndex + ".csv");
+      ratesValidOutputs.push_back(outModel + "_ratesValid_" + strIndex + ".csv");
+      sampleOutputs.push_back(outModel + "_samplesTrain_" + strIndex + ".shp");
       }
-
-    // read the Vectordata
-    vdreproj->SetInputImage(image);
-    vdreproj->SetInput(vectorDataList->GetNthElement(imgIndex));
-    vdreproj->SetUseOutputSpacingAndOriginFromImage(false);
-
-    AddProcess(vdreproj, oss1.str());
-    vdreproj->Update();
-
-    //Sample list generator
-    ListSampleGeneratorType::Pointer sampleGenerator = ListSampleGeneratorType::New();
-
-    sampleGenerator->SetInput(image);
-    sampleGenerator->SetInputVectorData(vdreproj->GetOutput());
-
-    sampleGenerator->SetClassKey(GetParameterString("sample.vfn"));
-    sampleGenerator->SetMaxTrainingSize(GetParameterInt("sample.mt"));
-    sampleGenerator->SetMaxValidationSize(GetParameterInt("sample.mv"));
-    sampleGenerator->SetValidationTrainingProportion(GetParameterFloat("sample.vtr"));
-    sampleGenerator->SetBoundByMin(GetParameterInt("sample.bm")!=0);
-
-    // take pixel located on polygon edge into consideration
-    if (IsParameterEnabled("sample.edg"))
+    else
       {
-      sampleGenerator->SetPolygonEdgeInclusion(true);
+      polyStatTrainOutputs.push_back(outModel + "_stats_" + strIndex + ".xml");
+      ratesTrainOutputs.push_back(outModel + "_rates_" + strIndex + ".csv");
+      sampleOutputs.push_back(outModel + "_samples_" + strIndex + ".shp");
       }
-
-    AddProcess(sampleGenerator, oss2.str());
-    sampleGenerator->Update();
-
-    TargetListSampleType::Pointer trainLabels = sampleGenerator->GetTrainingListLabel();
-    ListSampleType::Pointer trainSamples = sampleGenerator->GetTrainingListSample();
-    TargetListSampleType::Pointer validLabels = sampleGenerator->GetValidationListLabel();
-    ListSampleType::Pointer validSamples = sampleGenerator->GetValidationListSample();
-
-    trainLabels->DisconnectPipeline();
-    trainSamples->DisconnectPipeline();
-    validLabels->DisconnectPipeline();
-    validSamples->DisconnectPipeline();
-
-    //Concatenate training and validation samples from the image
-    concatenateTrainingLabels->AddInput(trainLabels);
-    concatenateTrainingSamples->AddInput(trainSamples);
-    concatenateValidationLabels->AddInput(validLabels);
-    concatenateValidationSamples->AddInput(validSamples);
+    sampleTrainOutputs.push_back(outModel + "_samplesTrain_" + strIndex + ".shp");
+    sampleValidOutputs.push_back(outModel + "_samplesValid_" + strIndex + ".shp");
     }
-  // Update
-  AddProcess(concatenateValidationLabels, "Concatenate samples ...");
-  concatenateTrainingSamples->Update();
-  concatenateTrainingLabels->Update();
-  concatenateValidationSamples->Update();
-  concatenateValidationLabels->Update();
-
-  if (concatenateTrainingSamples->GetOutput()->Size() == 0)
+
+  // ---------------------------------------------------------------------------
+  // Polygons stats
+  for (unsigned int i=0 ; i<nbInputs ; i++)
     {
-    otbAppLogFATAL("No training samples, cannot perform SVM training.");
+    GetInternalApplication("polystat")->SetParameterInputImage("in",imageList->GetNthElement(i));
+    GetInternalApplication("polystat")->SetParameterString("vec",vectorFileList[i], false);
+    GetInternalApplication("polystat")->SetParameterString("out",polyStatTrainOutputs[i], false);
+    ExecuteInternal("polystat");
+    // analyse polygons given for validation
+    if (dedicatedValidation)
+      {
+      GetInternalApplication("polystat")->SetParameterString("vec",validationVectorFileList[i], false);
+      GetInternalApplication("polystat")->SetParameterString("out",polyStatValidOutputs[i], false);
+      ExecuteInternal("polystat");
+      }
     }
 
-  if (concatenateValidationSamples->GetOutput()->Size() == 0)
+  // ---------------------------------------------------------------------------
+  // Compute sampling rates
+  GetInternalApplication("rates")->SetParameterString("mim","proportional", false);
+  double vtr = GetParameterFloat("sample.vtr");
+  long mt = GetParameterInt("sample.mt");
+  long mv = GetParameterInt("sample.mv");
+  // compute final maximum training and final maximum validation
+  // By default take all samples (-1 means all samples)
+  long fmt = -1;
+  long fmv = -1;
+  if (GetParameterInt("sample.bm") == 0)
     {
-    otbAppLogWARNING("No validation samples.");
+    if (dedicatedValidation)
+      {
+      // fmt and fmv will be used separately
+      fmt = mt;
+      fmv = mv;
+      if (mt > -1 && mv <= -1 && vtr < 0.99999)
+        {
+        fmv = static_cast<long>((double) mt * vtr / (1.0 - vtr));
+        }
+      if (mt <= -1 && mv > -1 && vtr > 0.00001)
+        {
+        fmt = static_cast<long>((double) mv * (1.0 - vtr) / vtr);
+        }
+      }
+    else
+      {
+      // only fmt will be used for both training and validation samples
+      // So we try to compute the total number of samples given input
+      // parameters mt, mv and vtr.
+      if (mt > -1 && mv > -1)
+        {
+        fmt = mt + mv;
+        }
+      if (mt > -1 && mv <= -1 && vtr < 0.99999)
+        {
+        fmt = static_cast<long>((double) mt / (1.0 - vtr));
+        }
+      if (mt <= -1 && mv > -1 && vtr > 0.00001)
+        {
+        fmt = static_cast<long>((double) mv / vtr);
+        }
+      }
     }
 
-  if (IsParameterEnabled("io.imstat"))
+  // Sampling rates for training
+  GetInternalApplication("rates")->SetParameterStringList("il",polyStatTrainOutputs, false);
+  GetInternalApplication("rates")->SetParameterString("out",rateTrainOut, false);
+  if (GetParameterInt("sample.bm") != 0)
     {
-    StatisticsReader::Pointer statisticsReader = StatisticsReader::New();
-    statisticsReader->SetFileName(GetParameterString("io.imstat"));
-    meanMeasurementVector = statisticsReader->GetStatisticVectorByName("mean");
-    stddevMeasurementVector = statisticsReader->GetStatisticVectorByName("stddev");
+    GetInternalApplication("rates")->SetParameterString("strategy","smallest", false);
     }
   else
     {
-    meanMeasurementVector.SetSize(nbBands);
-    meanMeasurementVector.Fill(0.);
-    stddevMeasurementVector.SetSize(nbBands);
-    stddevMeasurementVector.Fill(1.);
+    if (fmt > -1)
+      {
+      GetInternalApplication("rates")->SetParameterString("strategy","constant", false);
+      GetInternalApplication("rates")->SetParameterInt("strategy.constant.nb",fmt);
+      }
+    else
+      {
+      GetInternalApplication("rates")->SetParameterString("strategy","all", false);
+      }
     }
-
-  // Shift scale the samples
-  ShiftScaleFilterType::Pointer trainingShiftScaleFilter = ShiftScaleFilterType::New();
-  trainingShiftScaleFilter->SetInput(concatenateTrainingSamples->GetOutput());
-  trainingShiftScaleFilter->SetShifts(meanMeasurementVector);
-  trainingShiftScaleFilter->SetScales(stddevMeasurementVector);
-  AddProcess(trainingShiftScaleFilter, "Normalize training samples ...");
-  trainingShiftScaleFilter->Update();
-
-  ListSampleType::Pointer validationListSample=ListSampleType::New();
-
-  //Test if the validation test is empty
-  if ( concatenateValidationSamples->GetOutput()->Size() != 0 )
+  ExecuteInternal("rates");
+  // Sampling rates for validation
+  if (dedicatedValidation)
     {
-    ShiftScaleFilterType::Pointer validationShiftScaleFilter = ShiftScaleFilterType::New();
-    validationShiftScaleFilter->SetInput(concatenateValidationSamples->GetOutput());
-    validationShiftScaleFilter->SetShifts(meanMeasurementVector);
-    validationShiftScaleFilter->SetScales(stddevMeasurementVector);
-    AddProcess(validationShiftScaleFilter, "Normalize validation samples ...");
-    validationShiftScaleFilter->Update();
-    validationListSample = validationShiftScaleFilter->GetOutput();
+    GetInternalApplication("rates")->SetParameterStringList("il",polyStatValidOutputs, false);
+    GetInternalApplication("rates")->SetParameterString("out",rateValidOut, false);
+    if (GetParameterInt("sample.bm") != 0)
+      {
+      GetInternalApplication("rates")->SetParameterString("strategy","smallest", false);
+      }
+    else
+      {
+      if (fmv > -1)
+        {
+        GetInternalApplication("rates")->SetParameterString("strategy","constant", false);
+        GetInternalApplication("rates")->SetParameterInt("strategy.constant.nb",fmv);
+        }
+      else
+        {
+        GetInternalApplication("rates")->SetParameterString("strategy","all", false);
+        }
+      }
+    ExecuteInternal("rates");
     }
 
-  ListSampleType::Pointer listSample;
-  TargetListSampleType::Pointer labelListSample;
-  //--------------------------
-  // Balancing training sample (if needed)
-  // if (IsParameterEnabled("sample.b"))
-  //   {
-  //   // Balance the list sample.
-  //   otbAppLogINFO("Number of training samples before balancing: " << concatenateTrainingSamples->GetOutput()->Size())
-  //   BalancingListSampleFilterType::Pointer balancingFilter = BalancingListSampleFilterType::New();
-  //   balancingFilter->SetInput(trainingShiftScaleFilter->GetOutput());
-  //   balancingFilter->SetInputLabel(concatenateTrainingLabels->GetOutput());
-  //   balancingFilter->SetBalancingFactor(GetParameterInt("sample.b"));
-  //   balancingFilter->Update();
-  //   listSample = balancingFilter->GetOutput();
-  //   labelListSample = balancingFilter->GetOutputLabelSampleList();
-  //   otbAppLogINFO("Number of samples after balancing: " << balancingFilter->GetOutput()->Size());
-
-  //   }
-  // else
-  //   {
-  listSample = trainingShiftScaleFilter->GetOutput();
-  labelListSample = concatenateTrainingLabels->GetOutput();
-  otbAppLogINFO("Number of training samples: " << concatenateTrainingSamples->GetOutput()->Size());
-  //  }
-  //--------------------------
-  // Split the data set into training/validation set
-  ListSampleType::Pointer trainingListSample = listSample;
-  TargetListSampleType::Pointer trainingLabeledListSample = labelListSample;
-
-  TargetListSampleType::Pointer validationLabeledListSample = concatenateValidationLabels->GetOutput();
-  otbAppLogINFO("Size of training set: " << trainingListSample->Size());
-  otbAppLogINFO("Size of validation set: " << validationListSample->Size());
-  otbAppLogINFO("Size of labeled training set: " << trainingLabeledListSample->Size());
-  otbAppLogINFO("Size of labeled validation set: " << validationLabeledListSample->Size());
-
-  //--------------------------
-  // Estimate model
-  //--------------------------
-  this->Train(trainingListSample,trainingLabeledListSample,GetParameterString("io.out"));
-
-  //--------------------------
-  // Performances estimation
-  //--------------------------
-  TargetListSampleType::Pointer predictedList = TargetListSampleType::New();
-  ListSampleType::Pointer performanceListSample=ListSampleType::New();
-  TargetListSampleType::Pointer performanceLabeledListSample=TargetListSampleType::New();
-
-  //Test the input validation set size
-  if(validationLabeledListSample->Size() != 0)
-    {
-    performanceListSample = validationListSample;
-    performanceLabeledListSample = validationLabeledListSample;
-    }
-  else
+  // ---------------------------------------------------------------------------
+  // Select & extract samples
+  GetInternalApplication("select")->SetParameterString("sampler", "periodic", false);
+  GetInternalApplication("select")->SetParameterInt("sampler.periodic.jitter",50);
+  GetInternalApplication("select")->SetParameterString("strategy","byclass", false);
+  GetInternalApplication("extraction")->SetParameterString("outfield", "prefix", false);
+  GetInternalApplication("extraction")->SetParameterString("outfield.prefix.name","value_", false);
+  for (unsigned int i=0 ; i<nbInputs ; i++)
     {
-    otbAppLogWARNING("The validation set is empty. The performance estimation is done using the input training set in this case.");
-    performanceListSample = trainingListSample;
-    performanceLabeledListSample = trainingLabeledListSample;
-    }
-
-    this->Classify(performanceListSample, predictedList, GetParameterString("io.out"));
-
-    ConfusionMatrixCalculatorType::Pointer confMatCalc = ConfusionMatrixCalculatorType::New();
-
-    otbAppLogINFO("Predicted list size : " << predictedList->Size());
-    otbAppLogINFO("ValidationLabeledListSample size : " << performanceLabeledListSample->Size());
-    confMatCalc->SetReferenceLabels(performanceLabeledListSample);
-    confMatCalc->SetProducedLabels(predictedList);
-    confMatCalc->Compute();
-
-    otbAppLogINFO("training performances");
-    LogConfusionMatrix(confMatCalc);
-
-    for (unsigned int itClasses = 0; itClasses < confMatCalc->GetNumberOfClasses(); itClasses++)
+    GetInternalApplication("select")->SetParameterInputImage("in",imageList->GetNthElement(i));
+    GetInternalApplication("select")->SetParameterString("vec",vectorFileList[i], false);
+    GetInternalApplication("select")->SetParameterString("out",sampleOutputs[i], false);
+    GetInternalApplication("select")->SetParameterString("instats",polyStatTrainOutputs[i], false);
+    GetInternalApplication("select")->SetParameterString("strategy.byclass.in",ratesTrainOutputs[i], false);
+    // select sample positions
+    ExecuteInternal("select");
+    // extract sample descriptors
+    ExecuteInternal("extraction");
+
+    if (dedicatedValidation)
       {
-      ConfusionMatrixCalculatorType::ClassLabelType classLabel = confMatCalc->GetMapOfIndices()[itClasses];
-
-      otbAppLogINFO("Precision of class [" << classLabel << "] vs all: " << confMatCalc->GetPrecisions()[itClasses]);
-      otbAppLogINFO("Recall of class    [" << classLabel << "] vs all: " << confMatCalc->GetRecalls()[itClasses]);
-      otbAppLogINFO(
-        "F-score of class   [" << classLabel << "] vs all: " << confMatCalc->GetFScores()[itClasses] << "\n");
+      GetInternalApplication("select")->SetParameterString("vec",validationVectorFileList[i], false);
+      GetInternalApplication("select")->SetParameterString("out",sampleValidOutputs[i], false);
+      GetInternalApplication("select")->SetParameterString("instats",polyStatValidOutputs[i], false);
+      GetInternalApplication("select")->SetParameterString("strategy.byclass.in",ratesValidOutputs[i], false);
+      // select sample positions
+      ExecuteInternal("select");
+      // extract sample descriptors
+      ExecuteInternal("extraction");
       }
-    otbAppLogINFO("Global performance, Kappa index: " << confMatCalc->GetKappaIndex());
-
-
-    if (this->HasValue("io.confmatout"))
+    else
       {
-      // Writing the confusion matrix in the output .CSV file
-
-      MapOfIndicesType::iterator itMapOfIndicesValid, itMapOfIndicesPred;
-      ClassLabelType labelValid = 0;
-
-      ConfusionMatrixType confusionMatrix = confMatCalc->GetConfusionMatrix();
-      MapOfIndicesType mapOfIndicesValid = confMatCalc->GetMapOfIndices();
-
-      unsigned int nbClassesPred = mapOfIndicesValid.size();
-
-      /////////////////////////////////////////////
-      // Filling the 2 headers for the output file
-      const std::string commentValidStr = "#Reference labels (rows):";
-      const std::string commentPredStr = "#Produced labels (columns):";
-      const char separatorChar = ',';
-      std::ostringstream ossHeaderValidLabels, ossHeaderPredLabels;
-
-      // Filling ossHeaderValidLabels and ossHeaderPredLabels for the output file
-      ossHeaderValidLabels << commentValidStr;
-      ossHeaderPredLabels << commentPredStr;
-
-      itMapOfIndicesValid = mapOfIndicesValid.begin();
-
-      while (itMapOfIndicesValid != mapOfIndicesValid.end())
+      // Split between training and validation
+      ogr::DataSource::Pointer source = ogr::DataSource::New(sampleOutputs[i], ogr::DataSource::Modes::Read);
+      ogr::DataSource::Pointer destTrain = ogr::DataSource::New(sampleTrainOutputs[i], ogr::DataSource::Modes::Overwrite);
+      ogr::DataSource::Pointer destValid = ogr::DataSource::New(sampleValidOutputs[i], ogr::DataSource::Modes::Overwrite);
+      // read sampling rates from ratesTrainOutputs[i]
+      SamplingRateCalculator::Pointer rateCalculator = SamplingRateCalculator::New();
+      rateCalculator->Read(ratesTrainOutputs[i]);
+      // Compute sampling rates for train and valid
+      const MapRateType &inputRates = rateCalculator->GetRatesByClass();
+      MapRateType trainRates;
+      MapRateType validRates;
+      otb::SamplingRateCalculator::TripletType tpt;
+      for (MapRateType::const_iterator it = inputRates.begin() ;
+           it != inputRates.end() ;
+           ++it)
         {
-        // labels labelValid of mapOfIndicesValid are already sorted in otbConfusionMatrixCalculator
-        labelValid = itMapOfIndicesValid->second;
-
-        otbAppLogINFO("mapOfIndicesValid[" << itMapOfIndicesValid->first << "] = " << labelValid);
-
-        ossHeaderValidLabels << labelValid;
-        ossHeaderPredLabels << labelValid;
-
-        ++itMapOfIndicesValid;
-
-        if (itMapOfIndicesValid != mapOfIndicesValid.end())
-          {
-          ossHeaderValidLabels << separatorChar;
-          ossHeaderPredLabels << separatorChar;
-          }
-        else
-          {
-          ossHeaderValidLabels << std::endl;
-          ossHeaderPredLabels << std::endl;
-          }
+        unsigned long total = std::min(it->second.Required,it->second.Tot );
+        unsigned long neededValid = static_cast<unsigned long>((double) total * vtr );
+        unsigned long neededTrain = total - neededValid;
+        tpt.Tot = total;
+        tpt.Required = neededTrain;
+        tpt.Rate = (1.0 - vtr);
+        trainRates[it->first] = tpt;
+        tpt.Tot = neededValid;
+        tpt.Required = neededValid;
+        tpt.Rate = 1.0;
+        validRates[it->first] = tpt;
         }
 
-      std::ofstream outFile;
-      outFile.open(this->GetParameterString("io.confmatout").c_str());
-      outFile << std::fixed;
-      outFile.precision(10);
-
-      /////////////////////////////////////
-      // Writing the 2 headers
-      outFile << ossHeaderValidLabels.str();
-      outFile << ossHeaderPredLabels.str();
-      /////////////////////////////////////
-
-      unsigned int indexLabelValid = 0, indexLabelPred = 0;
-
-      for (itMapOfIndicesValid = mapOfIndicesValid.begin(); itMapOfIndicesValid != mapOfIndicesValid.end(); ++itMapOfIndicesValid)
-        {
-        indexLabelPred = 0;
-
-        for (itMapOfIndicesPred = mapOfIndicesValid.begin(); itMapOfIndicesPred != mapOfIndicesValid.end(); ++itMapOfIndicesPred)
-          {
-          // Writing the confusion matrix (sorted in otbConfusionMatrixCalculator) in the output file
-          outFile << confusionMatrix(indexLabelValid, indexLabelPred);
-          if (indexLabelPred < (nbClassesPred - 1))
-            {
-            outFile << separatorChar;
-            }
-          else
-            {
-            outFile << std::endl;
-            }
-          ++indexLabelPred;
-          }
-
-        ++indexLabelValid;
-        }
+      // Use an otb::OGRDataToSamplePositionFilter with 2 outputs
+      PeriodicSamplerType::SamplerParameterType param;
+      param.Offset = 0;
+      param.MaxJitter = 0;
+      PeriodicSamplerType::Pointer splitter = PeriodicSamplerType::New();
+      splitter->SetInput(imageList->GetNthElement(i));
+      splitter->SetOGRData(source);
+      splitter->SetOutputPositionContainerAndRates(destTrain, trainRates, 0);
+      splitter->SetOutputPositionContainerAndRates(destValid, validRates, 1);
+      splitter->SetFieldName(this->GetParameterStringList("sample.vfn")[0]);
+      splitter->SetLayerIndex(0);
+      splitter->SetOriginFieldName(std::string(""));
+      splitter->SetSamplerParameters(param);
+      splitter->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
+      AddProcess(splitter->GetStreamer(),"Split samples between training and validation...");
+      splitter->Update();
+      }
+    }
 
-      outFile.close();
-      } // END if (this->HasValue("io.confmatout"))
+  // ---------------------------------------------------------------------------
+  // Train model
+  GetInternalApplication("training")->SetParameterStringList("io.vd",sampleTrainOutputs, false);
+  GetInternalApplication("training")->SetParameterStringList("valid.vd",sampleValidOutputs, false);
+  UpdateInternalParameters("training");
+  // set field names
+  FloatVectorImageType::Pointer image = imageList->GetNthElement(0);
+  unsigned int nbBands = image->GetNumberOfComponentsPerPixel();
+  std::vector<std::string> selectedNames;
+  for (unsigned int i=0 ; i<nbBands ; i++)
+    {
+    std::ostringstream oss;
+    oss << i;
+    selectedNames.push_back("value_"+oss.str());
+    }
+  GetInternalApplication("training")->SetParameterStringList("feat",selectedNames, false);
+  ExecuteInternal("training");
 
-  // TODO: implement hyperplane distance classifier and performance validation (cf. object detection) ?
+  // cleanup
+  if(IsParameterEnabled("cleanup"))
+    {
+    otbAppLogINFO(<<"Final clean-up ...");
+    for(unsigned int i=0 ; i<polyStatTrainOutputs.size() ; i++)
+      RemoveFile(polyStatTrainOutputs[i]);
+    for(unsigned int i=0 ; i<polyStatValidOutputs.size() ; i++)
+      RemoveFile(polyStatValidOutputs[i]);
+    for(unsigned int i=0 ; i<ratesTrainOutputs.size() ; i++)
+      RemoveFile(ratesTrainOutputs[i]);
+    for(unsigned int i=0 ; i<ratesValidOutputs.size() ; i++)
+      RemoveFile(ratesValidOutputs[i]);
+    for(unsigned int i=0 ; i<sampleOutputs.size() ; i++)
+      RemoveFile(sampleOutputs[i]);
+    for(unsigned int i=0 ; i<sampleTrainOutputs.size() ; i++)
+      RemoveFile(sampleTrainOutputs[i]);
+    for(unsigned int i=0 ; i<sampleValidOutputs.size() ; i++)
+      RemoveFile(sampleValidOutputs[i]);
+    }
 }
 
-  VectorDataReprojectionType::Pointer vdreproj;
 };
 
 } // end namespace Wrapper
diff --git a/Modules/Applications/AppClassification/app/otbTrainOGRLayersClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainOGRLayersClassifier.cxx
index b461ac2..0e4affa 100644
--- a/Modules/Applications/AppClassification/app/otbTrainOGRLayersClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainOGRLayersClassifier.cxx
@@ -80,7 +80,7 @@ private:
 
     AddParameter(ParameterType_String,"cfield","Field containing the class id for supervision");
     SetParameterDescription("cfield","Field containing the class id for supervision. Only geometries with this field available will be taken into account.");
-    SetParameterString("cfield","class");
+    SetParameterString("cfield","class", false);
 
     // Doc example parameter settings
     SetDocExampleParameterValue("inshp", "vectorData.shp");
diff --git a/Modules/Applications/AppClassification/app/otbTrainRegression.cxx b/Modules/Applications/AppClassification/app/otbTrainRegression.cxx
index 3039d44..335961c 100644
--- a/Modules/Applications/AppClassification/app/otbTrainRegression.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainRegression.cxx
@@ -159,7 +159,7 @@ void DoInit() ITK_OVERRIDE
   AddParameter(ParameterType_Float, "sample.vtr", "Training and validation sample ratio");
   SetParameterDescription("sample.vtr",
                           "Ratio between training and validation samples (0.0 = all training, 1.0 = all validation) (default = 0.5).");
-  SetParameterFloat("sample.vtr", 0.5);
+  SetParameterFloat("sample.vtr",0.5, false);
 
   Superclass::DoInit();
 
diff --git a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
index 09edbc6..fa52095 100644
--- a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
@@ -109,11 +109,11 @@ private:
     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.");
 
-    AddParameter(ParameterType_String,"cfield","Field containing the class id for supervision");
+    AddParameter(ParameterType_ListView,"cfield","Field containing the class id for supervision");
     SetParameterDescription("cfield","Field containing the class id for supervision. "
       "Only geometries with this field available will be taken into account.");
-    SetParameterString("cfield","class");
-
+    SetListViewSingleSelectionMode("cfield",true);
+      
     AddParameter(ParameterType_Int, "layer", "Layer Index");
     SetParameterDescription("layer", "Index of the layer to use in the input vector file.");
     MandatoryOff("layer");
@@ -155,14 +155,27 @@ private:
       ogr::Feature feature = layer.ogr().GetNextFeature();
 
       ClearChoices("feat");
+      ClearChoices("cfield");
+      
       for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
         {
         std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
         key = item;
         std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
         std::transform(key.begin(), end, key.begin(), tolower);
-        key="feat."+key.substr(0, end - key.begin());
-        AddChoice(key,item);
+        
+        OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
+        
+        if(fieldType == OFTInteger ||  ogr::version_proxy::IsOFTInteger64(fieldType) || fieldType == OFTReal)
+          {
+          std::string tmpKey="feat."+key.substr(0, end - key.begin());
+          AddChoice(tmpKey,item);
+          }
+        if(fieldType == OFTString || fieldType == OFTInteger || ogr::version_proxy::IsOFTInteger64(fieldType))
+          {
+          std::string tmpKey="cfield."+key.substr(0, end - key.begin());
+          AddChoice(tmpKey,item);
+          }
         }
       }
   }
@@ -248,25 +261,32 @@ void DoExecute()
 
   // Prepare selected field names (their position may change between two inputs)
   std::vector<int> selectedIdx = GetSelectedItems("feat");
+  std::vector<int> selectedCFieldIdx = GetSelectedItems("cfield");
+  
+  if(selectedIdx.empty())
+    {
+    otbAppLogFATAL(<<"No features have been selected to train the classifier on!");
+    }
+  
+  if(selectedCFieldIdx.empty())
+    {
+    otbAppLogFATAL(<<"No field has been selected for data labelling!");
+    }
+
   const unsigned int nbFeatures = selectedIdx.size();
   std::vector<std::string> fieldNames = GetChoiceNames("feat");
+  std::vector<std::string> cFieldNames = GetChoiceNames("cfield");
   std::vector<std::string> selectedNames(nbFeatures);
   for (unsigned int i=0 ; i<nbFeatures ; i++)
     {
     selectedNames[i] = fieldNames[selectedIdx[i]];
     }
+
+  std::string selectedCFieldName = cFieldNames[selectedCFieldIdx.front()];
+
   std::vector<int> featureFieldIndex(nbFeatures, -1);
   int cFieldIndex = -1;
 
-  // List of available fields
-  std::ostringstream oss;
-  for (unsigned int i=0 ; i<fieldNames.size() ; i++)
-    {
-    if (i) oss << ", ";
-    oss << fieldNames[i];
-    }
-  std::string availableFields(oss.str());
-
   // Statistics for shift/scale
   MeasurementType meanMeasurementVector;
   MeasurementType stddevMeasurementVector;
@@ -307,17 +327,17 @@ void DoExecute()
 
     // Check all needed fields are present :
     //   - check class field
-    cFieldIndex = feature.ogr().GetFieldIndex(GetParameterString("cfield").c_str());
+    cFieldIndex = feature.ogr().GetFieldIndex(selectedCFieldName.c_str());
     if (cFieldIndex < 0)
-      otbAppLogFATAL("The field name for class label ("<<GetParameterString("cfield")
-        <<") has not been found in the input vector file! Choices are "<< availableFields);
+      otbAppLogFATAL("The field name for class label ("<<selectedCFieldName
+        <<") has not been found in the input vector file "<<vectorFileList[k]);
     //   - check feature fields
     for (unsigned int i=0 ; i<nbFeatures ; i++)
       {
       featureFieldIndex[i] = feature.ogr().GetFieldIndex(selectedNames[i].c_str());
       if (featureFieldIndex[i] < 0)
         otbAppLogFATAL("The field name for feature "<<selectedNames[i]
-        <<" has not been found in the input vector file! Choices are "<< availableFields);
+        <<" has not been found in the input vector file "<<vectorFileList[k]);
       }
 
     while(goesOn)
@@ -381,17 +401,17 @@ void DoExecute()
 
       // Check all needed fields are present :
       //   - check class field
-      cFieldIndex = feature.ogr().GetFieldIndex(GetParameterString("cfield").c_str());
+      cFieldIndex = feature.ogr().GetFieldIndex(selectedCFieldName.c_str());
       if (cFieldIndex < 0)
-        otbAppLogFATAL("The field name for class label ("<<GetParameterString("cfield")
-          <<") has not been found in the input vector file! Choices are "<< availableFields);
+        otbAppLogFATAL("The field name for class label ("<<selectedCFieldName
+          <<") has not been found in the validation vector file "<<validFileList[k]);
       //   - check feature fields
       for (unsigned int i=0 ; i<nbFeatures ; i++)
         {
         featureFieldIndex[i] = feature.ogr().GetFieldIndex(selectedNames[i].c_str());
         if (featureFieldIndex[i] < 0)
           otbAppLogFATAL("The field name for feature "<<selectedNames[i]
-          <<" has not been found in the input vector file! Choices are "<< availableFields);
+          <<" has not been found in the validation vector file "<<validFileList[k]);
         }
 
       while(goesOn)
diff --git a/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx b/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx
index c260e16..234b90e 100644
--- a/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx
+++ b/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx
@@ -84,12 +84,12 @@ private:
     AddParameter(ParameterType_String, "cri", "Criterion");
     SetParameterDescription("cri", "Dempster Shafer criterion (by default (belief+plausibility)/2)");
     MandatoryOff("cri");
-    SetParameterString("cri", "((Belief + Plausibility)/2.)");
+    SetParameterString("cri", "((Belief + Plausibility)/2.)", false);
 
     AddParameter(ParameterType_Float, "thd", "Criterion threshold");
     SetParameterDescription("thd", "Criterion threshold (default 0.5)");
     MandatoryOff("thd");
-    SetParameterFloat("thd", 0.5);
+    SetParameterFloat("thd",0.5, false);
 
     AddParameter(ParameterType_OutputVectorData, "out", "Output Vector Data");
     SetParameterDescription("out", "Output VectorData containing only the validated samples");
diff --git a/Modules/Applications/AppClassification/include/otbTrainBoost.txx b/Modules/Applications/AppClassification/include/otbTrainBoost.txx
index fbd9953..ea725cc 100644
--- a/Modules/Applications/AppClassification/include/otbTrainBoost.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainBoost.txx
@@ -39,22 +39,22 @@ namespace Wrapper
     AddChoice("classifier.boost.t.logit", "LogitBoost (technique producing good regression fits)");
     AddChoice("classifier.boost.t.gentle", "Gentle AdaBoost (technique setting less weight on outlier data points "
                                                "and, for that reason, being often good with regression data)");
-    SetParameterString("classifier.boost.t", "real");
+    SetParameterString("classifier.boost.t", "real", false);
     SetParameterDescription("classifier.boost.t", "Type of Boosting algorithm.");
     //Do not expose SplitCriteria
     //WeakCount
     AddParameter(ParameterType_Int, "classifier.boost.w", "Weak count");
-    SetParameterInt("classifier.boost.w", 100);
+    SetParameterInt("classifier.boost.w",100, false);
     SetParameterDescription("classifier.boost.w","The number of weak classifiers.");
     //WeightTrimRate
     AddParameter(ParameterType_Float, "classifier.boost.r", "Weight Trim Rate");
-    SetParameterFloat("classifier.boost.r", 0.95);
+    SetParameterFloat("classifier.boost.r",0.95, false);
     SetParameterDescription("classifier.boost.r","A threshold between 0 and 1 used to save computational time. "
                             "Samples with summary weight <= (1 - weight_trim_rate) do not participate in the next iteration of training. "
                             "Set this parameter to 0 to turn off this functionality.");
     //MaxDepth : Not sure that this parameter has to be exposed.
     AddParameter(ParameterType_Int, "classifier.boost.m", "Maximum depth of the tree");
-    SetParameterInt("classifier.boost.m", 1);
+    SetParameterInt("classifier.boost.m",1, false);
     SetParameterDescription("classifier.boost.m","Maximum depth of the tree.");
   }
 
diff --git a/Modules/Applications/AppClassification/include/otbTrainDecisionTree.txx b/Modules/Applications/AppClassification/include/otbTrainDecisionTree.txx
index 61cd1a3..def7b60 100644
--- a/Modules/Applications/AppClassification/include/otbTrainDecisionTree.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainDecisionTree.txx
@@ -34,7 +34,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
                           "See complete documentation here \\url{http://docs.opencv.org/modules/ml/doc/decision_trees.html}.");
   //MaxDepth
   AddParameter(ParameterType_Int, "classifier.dt.max", "Maximum depth of the tree");
-  SetParameterInt("classifier.dt.max", 65535);
+  SetParameterInt("classifier.dt.max",65535, false);
   SetParameterDescription(
       "classifier.dt.max", "The training algorithm attempts to split each node while its depth is smaller than the maximum "
       "possible depth of the tree. The actual depth may be smaller if the other termination criteria are met, and/or "
@@ -42,13 +42,13 @@ LearningApplicationBase<TInputValue,TOutputValue>
 
   //MinSampleCount
   AddParameter(ParameterType_Int, "classifier.dt.min", "Minimum number of samples in each node");
-  SetParameterInt("classifier.dt.min", 10);
+  SetParameterInt("classifier.dt.min",10, false);
   SetParameterDescription("classifier.dt.min", "If the number of samples in a node is smaller than this parameter, "
                           "then this node will not be split.");
 
   //RegressionAccuracy
   AddParameter(ParameterType_Float, "classifier.dt.ra", "Termination criteria for regression tree");
-  SetParameterFloat("classifier.dt.ra", 0.01);
+  SetParameterFloat("classifier.dt.ra",0.01, false);
   SetParameterDescription("classifier.dt.min", "If all absolute differences between an estimated value in a node "
                           "and the values of the train samples in this node are smaller than this regression accuracy parameter, "
                           "then the node will not be split.");
@@ -60,14 +60,14 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //MaxCategories
   AddParameter(ParameterType_Int, "classifier.dt.cat",
                "Cluster possible values of a categorical variable into K <= cat clusters to find a suboptimal split");
-  SetParameterInt("classifier.dt.cat", 10);
+  SetParameterInt("classifier.dt.cat",10, false);
   SetParameterDescription(
       "classifier.dt.cat",
       "Cluster possible values of a categorical variable into K <= cat clusters to find a suboptimal split.");
 
   //CVFolds
   AddParameter(ParameterType_Int, "classifier.dt.f", "K-fold cross-validations");
-  SetParameterInt("classifier.dt.f", 10);
+  SetParameterInt("classifier.dt.f",10, false);
   SetParameterDescription(
       "classifier.dt.f", "If cv_folds > 1, then it prunes a tree with K-fold cross-validation where K is equal to cv_folds.");
 
diff --git a/Modules/Applications/AppClassification/include/otbTrainGradientBoostedTree.txx b/Modules/Applications/AppClassification/include/otbTrainGradientBoostedTree.txx
index bcf5caa..d67f964 100644
--- a/Modules/Applications/AppClassification/include/otbTrainGradientBoostedTree.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainGradientBoostedTree.txx
@@ -45,7 +45,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
 
   //WeakCount
   AddParameter(ParameterType_Int, "classifier.gbt.w", "Number of boosting algorithm iterations");
-  SetParameterInt("classifier.gbt.w", 200);
+  SetParameterInt("classifier.gbt.w",200, false);
   SetParameterDescription(
       "classifier.gbt.w",
       "Number \"w\" of boosting algorithm iterations, with w*K being the total number of trees in "
@@ -53,20 +53,20 @@ LearningApplicationBase<TInputValue,TOutputValue>
 
   //Shrinkage
   AddParameter(ParameterType_Float, "classifier.gbt.s", "Regularization parameter");
-  SetParameterFloat("classifier.gbt.s", 0.01);
+  SetParameterFloat("classifier.gbt.s",0.01, false);
   SetParameterDescription("classifier.gbt.s", "Regularization parameter.");
 
   //SubSamplePortion
   AddParameter(ParameterType_Float, "classifier.gbt.p",
                "Portion of the whole training set used for each algorithm iteration");
-  SetParameterFloat("classifier.gbt.p", 0.8);
+  SetParameterFloat("classifier.gbt.p",0.8, false);
   SetParameterDescription(
       "classifier.gbt.p",
       "Portion of the whole training set used for each algorithm iteration. The subset is generated randomly.");
 
   //MaxDepth
   AddParameter(ParameterType_Int, "classifier.gbt.max", "Maximum depth of the tree");
-  SetParameterInt("classifier.gbt.max", 3);
+  SetParameterInt("classifier.gbt.max",3, false);
   SetParameterDescription(
         "classifier.gbt.max", "The training algorithm attempts to split each node while its depth is smaller than the maximum "
         "possible depth of the tree. The actual depth may be smaller if the other termination criteria are met, and/or "
diff --git a/Modules/Applications/AppClassification/include/otbTrainKNN.txx b/Modules/Applications/AppClassification/include/otbTrainKNN.txx
index fdf10cd..6fba81f 100644
--- a/Modules/Applications/AppClassification/include/otbTrainKNN.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainKNN.txx
@@ -34,7 +34,7 @@ namespace Wrapper
 
     //K parameter
     AddParameter(ParameterType_Int, "classifier.knn.k", "Number of Neighbors");
-    SetParameterInt("classifier.knn.k", 32);
+    SetParameterInt("classifier.knn.k",32, false);
     SetParameterDescription("classifier.knn.k","The number of neighbors to use.");
 
     if (this->m_RegressionFlag)
diff --git a/Modules/Applications/AppClassification/include/otbTrainLibSVM.txx b/Modules/Applications/AppClassification/include/otbTrainLibSVM.txx
index f89b714..120b572 100644
--- a/Modules/Applications/AppClassification/include/otbTrainLibSVM.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainLibSVM.txx
@@ -35,7 +35,7 @@ namespace Wrapper
     AddChoice("classifier.libsvm.k.rbf", "Gaussian radial basis function");
     AddChoice("classifier.libsvm.k.poly", "Polynomial");
     AddChoice("classifier.libsvm.k.sigmoid", "Sigmoid");
-    SetParameterString("classifier.libsvm.k", "linear");
+    SetParameterString("classifier.libsvm.k", "linear", false);
     SetParameterDescription("classifier.libsvm.k", "SVM Kernel Type.");
     AddParameter(ParameterType_Choice, "classifier.libsvm.m", "SVM Model Type");
     SetParameterDescription("classifier.libsvm.m", "Type of SVM formulation.");
@@ -43,17 +43,17 @@ namespace Wrapper
       {
       AddChoice("classifier.libsvm.m.epssvr", "Epsilon Support Vector Regression");
       AddChoice("classifier.libsvm.m.nusvr", "Nu Support Vector Regression");
-      SetParameterString("classifier.libsvm.m", "epssvr");
+      SetParameterString("classifier.libsvm.m", "epssvr", false);
       }
     else
       {
       AddChoice("classifier.libsvm.m.csvc", "C support vector classification");
       AddChoice("classifier.libsvm.m.nusvc", "Nu support vector classification");
       AddChoice("classifier.libsvm.m.oneclass", "Distribution estimation (One Class SVM)");
-      SetParameterString("classifier.libsvm.m", "csvc");
+      SetParameterString("classifier.libsvm.m", "csvc", false);
       }
     AddParameter(ParameterType_Float, "classifier.libsvm.c", "Cost parameter C");
-    SetParameterFloat("classifier.libsvm.c", 1.0);
+    SetParameterFloat("classifier.libsvm.c",1.0, false);
     SetParameterDescription(
         "classifier.libsvm.c",
         "SVM models have a cost parameter C (1 by default) to control the trade-off between training errors and forcing rigid margins.");
@@ -67,9 +67,9 @@ namespace Wrapper
     if (this->m_RegressionFlag)
       {
       AddParameter(ParameterType_Float, "classifier.libsvm.eps", "Epsilon");
-      SetParameterFloat("classifier.libsvm.eps", 1e-3);
+      SetParameterFloat("classifier.libsvm.eps",1e-3, false);
       AddParameter(ParameterType_Float, "classifier.libsvm.nu", "Nu");
-      SetParameterFloat("classifier.libsvm.nu", 0.5);
+      SetParameterFloat("classifier.libsvm.nu",0.5, false);
       }
   }
 
diff --git a/Modules/Applications/AppClassification/include/otbTrainNeuralNetwork.txx b/Modules/Applications/AppClassification/include/otbTrainNeuralNetwork.txx
index ee7bf43..8f9386a 100644
--- a/Modules/Applications/AppClassification/include/otbTrainNeuralNetwork.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainNeuralNetwork.txx
@@ -38,7 +38,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   AddParameter(ParameterType_Choice, "classifier.ann.t", "Train Method Type");
   AddChoice("classifier.ann.t.reg", "RPROP algorithm");
   AddChoice("classifier.ann.t.back", "Back-propagation algorithm");
-  SetParameterString("classifier.ann.t", "reg");
+  SetParameterString("classifier.ann.t", "reg", false);
   SetParameterDescription("classifier.ann.t", "Type of training method for the multilayer perceptron (MLP) neural network.");
 
   //LayerSizes
@@ -56,25 +56,25 @@ LearningApplicationBase<TInputValue,TOutputValue>
   AddChoice("classifier.ann.f.ident", "Identity function");
   AddChoice("classifier.ann.f.sig", "Symmetrical Sigmoid function");
   AddChoice("classifier.ann.f.gau", "Gaussian function (Not completely supported)");
-  SetParameterString("classifier.ann.f", "sig");
+  SetParameterString("classifier.ann.f", "sig", false);
   SetParameterDescription("classifier.ann.f", "Neuron activation function.");
 
   //Alpha
   AddParameter(ParameterType_Float, "classifier.ann.a", "Alpha parameter of the activation function");
-  SetParameterFloat("classifier.ann.a", 1.);
+  SetParameterFloat("classifier.ann.a",1., false);
   SetParameterDescription("classifier.ann.a",
                           "Alpha parameter of the activation function (used only with sigmoid and gaussian functions).");
 
   //Beta
   AddParameter(ParameterType_Float, "classifier.ann.b", "Beta parameter of the activation function");
-  SetParameterFloat("classifier.ann.b", 1.);
+  SetParameterFloat("classifier.ann.b",1., false);
   SetParameterDescription("classifier.ann.b",
                           "Beta parameter of the activation function (used only with sigmoid and gaussian functions).");
 
   //BackPropDWScale
   AddParameter(ParameterType_Float, "classifier.ann.bpdw",
                "Strength of the weight gradient term in the BACKPROP method");
-  SetParameterFloat("classifier.ann.bpdw", 0.1);
+  SetParameterFloat("classifier.ann.bpdw",0.1, false);
   SetParameterDescription(
       "classifier.ann.bpdw",
       "Strength of the weight gradient term in the BACKPROP method. The recommended value is about 0.1.");
@@ -82,7 +82,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //BackPropMomentScale
   AddParameter(ParameterType_Float, "classifier.ann.bpms",
                "Strength of the momentum term (the difference between weights on the 2 previous iterations)");
-  SetParameterFloat("classifier.ann.bpms", 0.1);
+  SetParameterFloat("classifier.ann.bpms",0.1, false);
   SetParameterDescription(
       "classifier.ann.bpms",
       "Strength of the momentum term (the difference between weights on the 2 previous iterations). "
@@ -92,12 +92,12 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //RegPropDW0
   AddParameter(ParameterType_Float, "classifier.ann.rdw",
                "Initial value Delta_0 of update-values Delta_{ij} in RPROP method");
-  SetParameterFloat("classifier.ann.rdw", 0.1);
+  SetParameterFloat("classifier.ann.rdw",0.1, false);
   SetParameterDescription("classifier.ann.rdw", "Initial value Delta_0 of update-values Delta_{ij} in RPROP method (default = 0.1).");
 
   //RegPropDWMin
   AddParameter(ParameterType_Float, "classifier.ann.rdwm", "Update-values lower limit Delta_{min} in RPROP method");
-  SetParameterFloat("classifier.ann.rdwm", 1e-7);
+  SetParameterFloat("classifier.ann.rdwm",1e-7, false);
   SetParameterDescription(
       "classifier.ann.rdwm",
       "Update-values lower limit Delta_{min} in RPROP method. It must be positive (default = 1e-7).");
@@ -107,18 +107,18 @@ LearningApplicationBase<TInputValue,TOutputValue>
   AddChoice("classifier.ann.term.iter", "Maximum number of iterations");
   AddChoice("classifier.ann.term.eps", "Epsilon");
   AddChoice("classifier.ann.term.all", "Max. iterations + Epsilon");
-  SetParameterString("classifier.ann.term", "all");
+  SetParameterString("classifier.ann.term", "all", false);
   SetParameterDescription("classifier.ann.term", "Termination criteria.");
 
   //Epsilon
   AddParameter(ParameterType_Float, "classifier.ann.eps", "Epsilon value used in the Termination criteria");
-  SetParameterFloat("classifier.ann.eps", 0.01);
+  SetParameterFloat("classifier.ann.eps",0.01, false);
   SetParameterDescription("classifier.ann.eps", "Epsilon value used in the Termination criteria.");
 
   //MaxIter
   AddParameter(ParameterType_Int, "classifier.ann.iter",
                "Maximum number of iterations used in the Termination criteria");
-  SetParameterInt("classifier.ann.iter", 1000);
+  SetParameterInt("classifier.ann.iter",1000, false);
   SetParameterDescription("classifier.ann.iter", "Maximum number of iterations used in the Termination criteria.");
 
 }
diff --git a/Modules/Applications/AppClassification/include/otbTrainRandomForests.txx b/Modules/Applications/AppClassification/include/otbTrainRandomForests.txx
index 669b456..7a507bb 100644
--- a/Modules/Applications/AppClassification/include/otbTrainRandomForests.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainRandomForests.txx
@@ -34,7 +34,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
                           "See complete documentation here \\url{http://docs.opencv.org/modules/ml/doc/random_trees.html}.");
   //MaxDepth
   AddParameter(ParameterType_Int, "classifier.rf.max", "Maximum depth of the tree");
-  SetParameterInt("classifier.rf.max", 5);
+  SetParameterInt("classifier.rf.max",5, false);
   SetParameterDescription(
       "classifier.rf.max",
       "The depth of the tree. A low value will likely underfit and conversely a high value will likely overfit. "
@@ -42,14 +42,14 @@ LearningApplicationBase<TInputValue,TOutputValue>
 
   //MinSampleCount
   AddParameter(ParameterType_Int, "classifier.rf.min", "Minimum number of samples in each node");
-  SetParameterInt("classifier.rf.min", 10);
+  SetParameterInt("classifier.rf.min",10, false);
   SetParameterDescription(
       "classifier.rf.min", "If the number of samples in a node is smaller than this parameter, "
       "then the node will not be split. A reasonable value is a small percentage of the total data e.g. 1 percent.");
 
   //RegressionAccuracy
   AddParameter(ParameterType_Float, "classifier.rf.ra", "Termination Criteria for regression tree");
-  SetParameterFloat("classifier.rf.ra", 0.);
+  SetParameterFloat("classifier.rf.ra",0., false);
   SetParameterDescription("classifier.rf.ra", "If all absolute differences between an estimated value in a node "
                           "and the values of the train samples in this node are smaller than this regression accuracy parameter, "
                           "then the node will not be split.");
@@ -61,7 +61,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //MaxNumberOfCategories
   AddParameter(ParameterType_Int, "classifier.rf.cat",
                "Cluster possible values of a categorical variable into K <= cat clusters to find a suboptimal split");
-  SetParameterInt("classifier.rf.cat", 10);
+  SetParameterInt("classifier.rf.cat",10, false);
   SetParameterDescription(
       "classifier.rf.cat",
       "Cluster possible values of a categorical variable into K <= cat clusters to find a suboptimal split.");
@@ -73,7 +73,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //MaxNumberOfVariables
   AddParameter(ParameterType_Int, "classifier.rf.var",
                "Size of the randomly selected subset of features at each tree node");
-  SetParameterInt("classifier.rf.var", 0);
+  SetParameterInt("classifier.rf.var",0, false);
   SetParameterDescription(
       "classifier.rf.var",
       "The size of the subset of features, randomly selected at each tree node, that are used to find the best split(s). "
@@ -82,7 +82,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //MaxNumberOfTrees
   AddParameter(ParameterType_Int, "classifier.rf.nbtrees",
                "Maximum number of trees in the forest");
-  SetParameterInt("classifier.rf.nbtrees", 100);
+  SetParameterInt("classifier.rf.nbtrees",100, false);
   SetParameterDescription(
       "classifier.rf.nbtrees",
       "The maximum number of trees in the forest. Typically, the more trees you have, the better the accuracy. "
@@ -92,7 +92,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //ForestAccuracy
   AddParameter(ParameterType_Float, "classifier.rf.acc",
                "Sufficient accuracy (OOB error)");
-  SetParameterFloat("classifier.rf.acc", 0.01);
+  SetParameterFloat("classifier.rf.acc",0.01, false);
   SetParameterDescription("classifier.rf.acc","Sufficient accuracy (OOB error).");
 
 
diff --git a/Modules/Applications/AppClassification/include/otbTrainSVM.txx b/Modules/Applications/AppClassification/include/otbTrainSVM.txx
index d36c28d..2893b43 100644
--- a/Modules/Applications/AppClassification/include/otbTrainSVM.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainSVM.txx
@@ -37,35 +37,35 @@ namespace Wrapper
       {
       AddChoice("classifier.svm.m.epssvr", "Epsilon Support Vector Regression");
       AddChoice("classifier.svm.m.nusvr", "Nu Support Vector Regression");
-      SetParameterString("classifier.svm.m", "epssvr");
+      SetParameterString("classifier.svm.m", "epssvr", false);
       }
     else
       {
       AddChoice("classifier.svm.m.csvc", "C support vector classification");
       AddChoice("classifier.svm.m.nusvc", "Nu support vector classification");
       AddChoice("classifier.svm.m.oneclass", "Distribution estimation (One Class SVM)");
-      SetParameterString("classifier.svm.m", "csvc");
+      SetParameterString("classifier.svm.m", "csvc", false);
       }
     AddParameter(ParameterType_Choice, "classifier.svm.k", "SVM Kernel Type");
     AddChoice("classifier.svm.k.linear", "Linear");
     AddChoice("classifier.svm.k.rbf", "Gaussian radial basis function");
     AddChoice("classifier.svm.k.poly", "Polynomial");
     AddChoice("classifier.svm.k.sigmoid", "Sigmoid");
-    SetParameterString("classifier.svm.k", "linear");
+    SetParameterString("classifier.svm.k", "linear", false);
     SetParameterDescription("classifier.svm.k", "SVM Kernel Type.");
     AddParameter(ParameterType_Float, "classifier.svm.c", "Cost parameter C");
-    SetParameterFloat("classifier.svm.c", 1.0);
+    SetParameterFloat("classifier.svm.c",1.0, false);
     SetParameterDescription(
         "classifier.svm.c",
         "SVM models have a cost parameter C (1 by default) to control the trade-off between training errors and forcing rigid margins.");
     AddParameter(ParameterType_Float, "classifier.svm.nu",
                  "Parameter nu of a SVM optimization problem (NU_SVC / ONE_CLASS)");
-    SetParameterFloat("classifier.svm.nu", 0.0);
+    SetParameterFloat("classifier.svm.nu",0.0, false);
     SetParameterDescription("classifier.svm.nu", "Parameter nu of a SVM optimization problem.");
     if (this->m_RegressionFlag)
       {
       AddParameter(ParameterType_Float, "classifier.svm.p", "Parameter epsilon of a SVM optimization problem (EPS_SVR)");
-      SetParameterFloat("classifier.svm.p", 1.0);
+      SetParameterFloat("classifier.svm.p",1.0, false);
       SetParameterDescription("classifier.svm.p", "Parameter epsilon of a SVM optimization problem (EPS_SVR).");
 
       AddParameter(ParameterType_Choice, "classifier.svm.term", "Termination criteria");
@@ -75,22 +75,22 @@ namespace Wrapper
       AddChoice("classifier.svm.term.all", "Stops when either iteration or epsilon criteria is true");
 
       AddParameter(ParameterType_Float, "classifier.svm.iter", "Maximum iteration");
-      SetParameterFloat("classifier.svm.iter", 1000);
+      SetParameterFloat("classifier.svm.iter",1000, false);
       SetParameterDescription("classifier.svm.iter", "Maximum number of iterations (corresponds to the termination criteria 'iter').");
 
       AddParameter(ParameterType_Float, "classifier.svm.eps", "Epsilon accuracy threshold");
-      SetParameterFloat("classifier.svm.eps", FLT_EPSILON);
+      SetParameterFloat("classifier.svm.eps",FLT_EPSILON, false);
       SetParameterDescription("classifier.svm.eps", "Epsilon accuracy (corresponds to the termination criteria 'eps').");
       }
     AddParameter(ParameterType_Float, "classifier.svm.coef0", "Parameter coef0 of a kernel function (POLY / SIGMOID)");
-    SetParameterFloat("classifier.svm.coef0", 0.0);
+    SetParameterFloat("classifier.svm.coef0",0.0, false);
     SetParameterDescription("classifier.svm.coef0", "Parameter coef0 of a kernel function (POLY / SIGMOID).");
     AddParameter(ParameterType_Float, "classifier.svm.gamma",
                  "Parameter gamma of a kernel function (POLY / RBF / SIGMOID)");
-    SetParameterFloat("classifier.svm.gamma", 1.0);
+    SetParameterFloat("classifier.svm.gamma",1.0, false);
     SetParameterDescription("classifier.svm.gamma", "Parameter gamma of a kernel function (POLY / RBF / SIGMOID).");
     AddParameter(ParameterType_Float, "classifier.svm.degree", "Parameter degree of a kernel function (POLY)");
-    SetParameterFloat("classifier.svm.degree", 1.0);
+    SetParameterFloat("classifier.svm.degree",1.0, false);
     SetParameterDescription("classifier.svm.degree", "Parameter degree of a kernel function (POLY).");
     AddParameter(ParameterType_Empty, "classifier.svm.opt", "Parameters optimization");
     MandatoryOff("classifier.svm.opt");
@@ -211,15 +211,15 @@ namespace Wrapper
     SVMClassifier->Save(modelPath);
 
     // Update the displayed parameters in the GUI after the training process, for further use of them
-    SetParameterFloat("classifier.svm.c", static_cast<float> (SVMClassifier->GetOutputC()));
-    SetParameterFloat("classifier.svm.nu", static_cast<float> (SVMClassifier->GetOutputNu()));
+    SetParameterFloat("classifier.svm.c",static_cast<float> (SVMClassifier->GetOutputC()), false);
+    SetParameterFloat("classifier.svm.nu",static_cast<float> (SVMClassifier->GetOutputNu()), false);
     if (this->m_RegressionFlag)
       {
-      SetParameterFloat("classifier.svm.p", static_cast<float> (SVMClassifier->GetOutputP()));
+      SetParameterFloat("classifier.svm.p",static_cast<float> (SVMClassifier->GetOutputP()), false);
       }
-    SetParameterFloat("classifier.svm.coef0", static_cast<float> (SVMClassifier->GetOutputCoef0()));
-    SetParameterFloat("classifier.svm.gamma", static_cast<float> (SVMClassifier->GetOutputGamma()));
-    SetParameterFloat("classifier.svm.degree", static_cast<float> (SVMClassifier->GetOutputDegree()));
+    SetParameterFloat("classifier.svm.coef0",static_cast<float> (SVMClassifier->GetOutputCoef0()), false);
+    SetParameterFloat("classifier.svm.gamma",static_cast<float> (SVMClassifier->GetOutputGamma()), false);
+    SetParameterFloat("classifier.svm.degree",static_cast<float> (SVMClassifier->GetOutputDegree()), false);
   }
 
 } //end namespace wrapper
diff --git a/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx b/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx
index c9b2d56..cf9705b 100644
--- a/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx
+++ b/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx
@@ -38,7 +38,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   //MaxNumberOfTrees
   AddParameter(ParameterType_Int, "classifier.sharkrf.nbtrees",
                "Maximum number of trees in the forest");
-  SetParameterInt("classifier.sharkrf.nbtrees", 100);
+  SetParameterInt("classifier.sharkrf.nbtrees",100, false);
   SetParameterDescription(
     "classifier.sharkrf.nbtrees",
     "The maximum number of trees in the forest. Typically, the more trees you have, the better the accuracy. "
@@ -48,7 +48,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
   
   //NodeSize
   AddParameter(ParameterType_Int, "classifier.sharkrf.nodesize", "Min size of the node for a split");
-  SetParameterInt("classifier.sharkrf.nodesize", 25);
+  SetParameterInt("classifier.sharkrf.nodesize",25, false);
   SetParameterDescription(
     "classifier.sharkrf.nodesize",
     "If the number of samples in a node is smaller than this parameter, "
@@ -56,7 +56,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
 
   //MTry
   AddParameter(ParameterType_Int, "classifier.sharkrf.mtry", "Number of features tested at each node");
-  SetParameterInt("classifier.sharkrf.mtry", 0);
+  SetParameterInt("classifier.sharkrf.mtry",0, false);
   SetParameterDescription(
     "classifier.sharkrf.mtry",
     "The number of features (variables) which will be tested at each node in "
@@ -66,7 +66,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
 
   //OOB Ratio
   AddParameter(ParameterType_Float, "classifier.sharkrf.oobr", "Out of bound ratio");
-  SetParameterFloat("classifier.sharkrf.oobr", 0.66);
+  SetParameterFloat("classifier.sharkrf.oobr",0.66, false);
   SetParameterDescription("classifier.sharkrf.oobr", 
                           "Set the fraction of the original training dataset to use as the out of bag sample." 
                           "A good default value is 0.66. ");
diff --git a/Modules/Applications/AppClassification/test/CMakeLists.txt b/Modules/Applications/AppClassification/test/CMakeLists.txt
index 451c17e..aaa2f9c 100644
--- a/Modules/Applications/AppClassification/test/CMakeLists.txt
+++ b/Modules/Applications/AppClassification/test/CMakeLists.txt
@@ -141,6 +141,7 @@ foreach(classifier ${classifierList})
                                 -classifier ${lclassifier}
                                 ${${lclassifier}_parameters}
                                 -io.out ${TEMP}/${OUTMODELFILE}
+                                -sample.vfn Class
                                 -rand 121212
 
                        VALID    ${valid}
@@ -162,6 +163,7 @@ foreach(classifier ${classifierList})
                                 ${${lclassifier}_parameters}
                                 -io.out ${TEMP}/OutXML1_${OUTMODELFILE}
                                 -rand 121212
+                                -sample.vfn Class
                                 -outxml ${TEMP}/cl${classifier}_OutXML1.xml
 
                        VALID ${valid}
@@ -181,7 +183,7 @@ foreach(classifier ${classifierList})
                                 -io.vd ${INPUTDATA}/Classification/VectorData_${${lclassifier}_input}QB1${vector_input_format}
                                 -io.imstat ${INPUTDATA}/Classification/clImageStatisticsQB1${stat_input_format}
                                 -io.out ${TEMP}/OutXML2_${OUTMODELFILE}
-
+                                -sample.vfn Class
                        VALID    ${valid}
                        )
 
@@ -647,6 +649,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt_InXML
                               -sample.mv 100
                               -sample.mt 100
                               -sample.vtr 0.5
+                              -sample.vfn Class
                               -classifier.libsvm.opt true
                               -rand 121212
                               -io.out ${TEMP}/clsvmModelQB1_allOpt_InXML.svm
@@ -659,6 +662,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_OutXML
                       OPTIONS -io.il ${INPUTDATA}/Classification/QB_1_ortho.tif
                               -io.vd ${INPUTDATA}/Classification/VectorData_QB1.shp
                               -io.imstat ${INPUTDATA}/Classification/clImageStatisticsQB1.xml
+                              -sample.vfn Class
                               -classifier libsvm
                               -classifier.libsvm.opt true
                               -io.out ${TEMP}/clsvmModelQB1_OutXML.svm
@@ -677,6 +681,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_OutXML
                                       ${INPUTDATA}/Classification/VectorData_QB2.shp
                                       ${INPUTDATA}/Classification/VectorData_QB3.shp
                                -io.imstat ${INPUTDATA}/Classification/clImageStatisticsQB123.xml
+                               -sample.vfn Class
                                -classifier libsvm
                                -classifier.libsvm.opt true
                                -io.out ${TEMP}/clsvmModelQB123.svm
@@ -693,6 +698,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1
                               -io.imstat ${INPUTDATA}/Classification/clImageStatisticsQB1.xml
                               -classifier libsvm
                               -classifier.libsvm.opt true
+                              -sample.vfn Class
                               -io.out ${TEMP}/clsvmModelQB1.svm
                               -rand 121212
                       VALID   ${ascii_comparison}
@@ -708,6 +714,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1
                                       ${INPUTDATA}/Classification/VectorData_QB5.shp
                                       ${INPUTDATA}/Classification/VectorData_QB6.shp
                                -io.imstat ${INPUTDATA}/Classification/clImageStatisticsQB456.xml
+                               -sample.vfn Class
                                -classifier libsvm
                                -classifier.libsvm.opt true
                                -io.out ${TEMP}/clsvmModelQB456.svm
@@ -727,6 +734,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt
                               -sample.mv 100
                               -sample.mt 100
                               -sample.vtr 0.5
+                              -sample.vfn Class
                               -classifier.libsvm.opt true
                               -rand 121212
                               -io.out ${TEMP}/clsvmModelQB1_allOpt.svm
@@ -901,7 +909,7 @@ otb_test_application(NAME apTvClSampleExtraction
                      APP SampleExtraction
                      OPTIONS -in ${INPUTDATA}/Classification/QB_1_ortho.tif
                              -vec ${INPUTDATA}/Classification/apTvClSampleSelectionOut.sqlite
-                             -field Class
+                             -field class
                              -out ${TEMP}/apTvClSampleExtractionOut.sqlite
                      VALID   --compare-ogr ${NOTOL}
                              ${OTBAPP_BASELINE_FILES}/apTvClSampleExtractionOut.sqlite
diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
index 2359b00..18d951e 100644
--- a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
+++ b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
@@ -97,8 +97,8 @@ private:
     SetDocSeeAlso(
                   "\"Kernel maximum autocorrelation factor and minimum noise fraction transformations,\" IEEE Transactions on Image Processing, vol. 20, no. 3, pp. 612-624, (2011)");
 
-    AddDocTag(Tags::DimensionReduction);
     AddDocTag(Tags::Filter);
+	AddDocTag(Tags::DimensionReduction);
 
     AddParameter(ParameterType_InputImage, "in", "Input Image");
     SetParameterDescription("in", "The input image to apply dimensionality reduction.");
@@ -168,6 +168,8 @@ private:
     AddParameter(ParameterType_OutputFilename, "outmatrix", "Transformation matrix output (text format)");
     SetParameterDescription("outmatrix", "Filename to store the transformation matrix (csv format)");
     MandatoryOff("outmatrix");
+    DisableParameter("outmatrix");
+    
 
     AddRAMParameter();
 
@@ -189,7 +191,7 @@ private:
                      unsigned int nbComp = static_cast<unsigned int> (GetParameterInt("nbcomp"));
                      if (nbComp > nbComponents)
                      {
-                            SetParameterInt("nbcomp", nbComponents);
+                            SetParameterInt("nbcomp",nbComponents, false);
                             otbAppLogINFO( << "number of selected components can't exceed image dimension : "<<nbComponents );
                      }
 
@@ -199,14 +201,14 @@ private:
                      if (this->GetParameterString("outinv").size()!= 0)
                      {
                             otbAppLogWARNING(<<"This application only provides the forward transform for the MAF method.");
-                            this->SetParameterString("outinv", "");
+                            this->SetParameterString("outinv", "", false);
                      }
                      this->DisableParameter("outinv");
 
                      if (this->GetParameterString("outmatrix").size()!= 0)
                      {
                             otbAppLogWARNING(<<"No transformation matrix available for MAF method.");
-                            this->SetParameterString("outmatrix", "");
+                            this->SetParameterString("outmatrix", "", false);
                      }
                      this->DisableParameter("outmatrix");
 
@@ -218,7 +220,7 @@ private:
                      unsigned int nbComp = static_cast<unsigned int> (GetParameterInt("nbcomp"));
                      if ((nbComp != 0) && (nbComp != nbComponents))
                      {
-                            SetParameterInt("nbcomp", nbComponents);
+                            SetParameterInt("nbcomp",nbComponents, false);
                             otbAppLogINFO( << "all components are kept when using MAF filter method.");
                      }
 
diff --git a/Modules/Applications/AppDomainTransform/CMakeLists.txt b/Modules/Applications/AppDomainTransform/CMakeLists.txt
new file mode 100644
index 0000000..67bc711
--- /dev/null
+++ b/Modules/Applications/AppDomainTransform/CMakeLists.txt
@@ -0,0 +1,2 @@
+project(OTBAppDomainTransform)
+otb_module_impl()
diff --git a/Modules/Applications/AppDomainTransform/app/CMakeLists.txt b/Modules/Applications/AppDomainTransform/app/CMakeLists.txt
new file mode 100644
index 0000000..6837a63
--- /dev/null
+++ b/Modules/Applications/AppDomainTransform/app/CMakeLists.txt
@@ -0,0 +1,4 @@
+otb_create_application(
+  NAME           DomainTransform
+  SOURCES        otbDomainTransform.cxx
+  LINK_LIBRARIES ${${otb-module}_LIBRARIES})
diff --git a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
new file mode 100644
index 0000000..417861f
--- /dev/null
+++ b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
@@ -0,0 +1,425 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the above copyright notices for more information.
+
+  =========================================================================*/
+
+#include "otbWrapperApplication.h"
+#include "otbWrapperApplicationFactory.h"
+#include "otbWaveletImageFilter.h"
+#include "otbWaveletInverseImageFilter.h"
+#include "otbWaveletGenerator.h"
+
+#include <itkConfigure.h>
+#include <itkForwardFFTImageFilter.h>
+#include <itkInverseFFTImageFilter.h>
+#include <itkUnaryFunctorImageFilter.h>
+#include <itkFFTShiftImageFilter.h>
+
+#include "otbComplexToVectorImageCastFilter.h"
+
+namespace otb
+{
+namespace Wrapper
+{
+template< class TInput, class TOutput>
+class ToComplexPixel
+{
+public:
+  ToComplexPixel ( ) { };
+
+  ~ToComplexPixel( ) { };
+
+  bool operator!=( const ToComplexPixel & ) const
+    {
+    return false;
+    }
+  bool operator==( const ToComplexPixel & other ) const
+    {
+    return !(*this != other);
+    }
+  inline TOutput operator( )( const TInput & A ) const
+    {
+      return TOutput( static_cast<typename TOutput::value_type> ( A[0] ),
+		      static_cast<typename TOutput::value_type> ( A[1] ) );
+    }
+};
+
+class DomainTransform : public Application
+{
+public:
+  /** Standard class typedefs. */
+  typedef DomainTransform     Self;
+  typedef Application                   Superclass;
+  typedef itk::SmartPointer<Self>       Pointer;
+
+  typedef itk::SmartPointer<const Self> ConstPointer;
+  typedef float InputPixelType;
+  typedef float OutputPixelType;
+
+  /** Standard macro */
+  itkNewMacro(Self);
+
+  itkTypeMacro(Self, otb::Application);
+
+private:
+  DomainTransform() {}
+
+  ~DomainTransform() ITK_OVERRIDE
+    {
+    // This is a trick to make sure fftw will cleanup its threads when application
+    // shared lib is released.
+    #if defined(ITK_USE_FFTWF)
+      fftwf_cleanup_threads();
+      fftwf_cleanup();
+    #endif
+    #if defined(ITK_USE_FFTWD)
+      fftw_cleanup_threads();
+      fftw_cleanup();
+    #endif
+    }
+
+  void DoInit() ITK_OVERRIDE
+  {
+    SetName("DomainTransform");
+    SetDescription("Domain Transform application for wavelet and fourier");
+
+    // Documentation
+    SetDocName("DomainTransform");
+    SetDocLongDescription("Domain Transform application for wavelet and fourier");
+    SetDocLimitations("This application is not streamed, check your system resources when processing large images");
+    SetDocAuthors("OTB-Team");
+    SetDocSeeAlso("otbWaveletImageFilter, otbWaveletInverseImageFilter, otbWaveletTransform");
+    AddDocTag(Tags::Filter);
+
+    // Parameters
+    AddParameter(ParameterType_InputImage, "in",  "Input Image");
+    SetParameterDescription("in", "This will take an input image to be transformed"
+      " image. For FFT inverse transform, it expects a complex image as two-band"
+      " image in which first band represent real part and second band represent"
+      " imaginary part.");
+
+    AddParameter(ParameterType_OutputImage, "out", "Output Image");
+    SetParameterDescription("out", "This parameter holds the output file name to"
+      " which transformed image will be written. This has a slightly different"
+      " behaviour depending on transform type. \n For Wavelet, output is a"
+      " single band image for both forward and inverse transform. \n For FFT"
+      " forward transform, output is two band image where first band represents"
+      " real part and second band represents imaginary part of a complex image.");
+
+    AddParameter(ParameterType_Choice, "mode", "Mode");
+    SetParameterDescription("mode", "This parameter allows one to select between"
+      " fft(fourier) and wavelet");
+
+    AddChoice("mode.fft", "FFT transform");
+    SetParameterDescription("mode.fft", "FFT transform");
+
+    AddParameter(ParameterType_Empty, "mode.fft.shift", "Shift fft transform");
+    SetParameterDescription("mode.fft.shift", "Shift transform of fft filter");
+
+    AddChoice("mode.wavelet", "Wavelet");
+    SetParameterDescription("mode.wavelet", "Wavelet transform");
+
+    AddParameter(ParameterType_Choice, "mode.wavelet.form", "Select wavelet form");
+    AddChoice("mode.wavelet.form.haar", "HAAR");
+    AddChoice("mode.wavelet.form.db4", "DAUBECHIES4");
+    AddChoice("mode.wavelet.form.db6", "DAUBECHIES6");
+    AddChoice("mode.wavelet.form.db8", "DAUBECHIES8");
+    AddChoice("mode.wavelet.form.db12", "DAUBECHIES12");
+    AddChoice("mode.wavelet.form.db20", "DAUBECHIES20");
+    AddChoice("mode.wavelet.form.sb24", "SPLINE_BIORTHOGONAL_2_4");
+    AddChoice("mode.wavelet.form.sb44", "SPLINE_BIORTHOGONAL_4_4");
+    AddChoice("mode.wavelet.form.sym8", "SYMLET8");
+
+    // Default values for mode
+    SetParameterString("mode", "wavelet", false);
+    SetParameterString("mode.wavelet.form", "haar", false);
+
+    AddParameter(ParameterType_Choice,"direction", "Direction");
+    AddChoice("direction.forward", "Forward");
+    AddChoice("direction.inverse", "Inverse");
+
+    AddParameter(ParameterType_Int,"mode.wavelet.nlevels","Number of decomposition levels");
+    SetParameterDescription("mode.wavelet.nlevels","Number of decomposition levels");
+    SetDefaultParameterInt("mode.wavelet.nlevels",2);
+    SetMinimumParameterIntValue("mode.wavelet.nlevels",2);
+
+    AddRAMParameter();
+
+    SetDocExampleParameterValue("in", "input.tif");
+    SetDocExampleParameterValue("mode.wavelet.form", "haar");
+    SetDocExampleParameterValue("out", "output_wavelet_haar.tif");
+  }
+
+  void DoUpdateParameters() ITK_OVERRIDE
+    {
+
+    }
+
+  void DoExecute() ITK_OVERRIDE
+    {
+    int dir = GetParameterInt("direction");
+    int mode = GetParameterInt("mode");
+
+    if( dir != 0 && dir != 1)
+      {
+      itkExceptionMacro(<< "-dir is '"
+         << dir << "'."
+         << "It must be either 'forward' or 'inverse'");
+      }
+
+    if( mode != 0 && mode != 1)
+      {
+      itkExceptionMacro( << "mode is '"
+         << mode << "'."
+         << "It must must be either 'fft' or 'wavelet'");
+      }
+
+    if ( mode == 1)
+      {
+      int wavelet_type = GetParameterInt("mode.wavelet.form");
+      unsigned int nlevels = GetParameterInt("mode.wavelet.nlevels");
+      switch (wavelet_type)
+        {
+        case 0:
+          {
+          DoWaveletTransform<otb::Wavelet::HAAR>(dir, nlevels);
+          break;
+          }
+        case 1:
+          {
+          DoWaveletTransform<otb::Wavelet::DB4>(dir, nlevels);
+          break;
+          }
+        case 2:
+          {
+          DoWaveletTransform<otb::Wavelet::DB4>(dir, nlevels);
+          break;
+          }
+        case 3:
+          {
+          DoWaveletTransform<otb::Wavelet::DB6>(dir, nlevels);
+          break;
+          }
+        case 4:
+          {
+          DoWaveletTransform<otb::Wavelet::DB8>(dir, nlevels);
+          break;
+          }
+        case 5:
+          {
+          DoWaveletTransform<otb::Wavelet::DB12>(dir, nlevels);
+          break;
+          }
+        case 6:
+          {
+          DoWaveletTransform<otb::Wavelet::DB20>(dir, nlevels);
+          break;
+          }
+        case 7:
+          {
+          DoWaveletTransform<otb::Wavelet::SPLINE_BIORTHOGONAL_2_4 >(dir, nlevels);
+          break;
+          }
+        case 8:
+          {
+          DoWaveletTransform<otb::Wavelet::SPLINE_BIORTHOGONAL_4_4>(dir, nlevels);
+          break;
+          }
+        case 9:
+          {
+          DoWaveletTransform<otb::Wavelet::SYMLET8>(dir, nlevels);
+          break;
+          }
+        default:
+          {
+          itkExceptionMacro( << "Invalid wavelet type: '" <<  wavelet_type << "'");
+          break;
+          }
+        }
+      }
+    else
+      {
+      // fft ttransform
+      bool shift = IsParameterEnabled( "mode.fft.shift");
+      typedef otb::Image< std::complex<OutputPixelType> >          ComplexOutputImageType;
+
+      if (dir == 0 )
+        {
+        //forward fft
+        typedef otb::Image<InputPixelType>          TInputImage;
+        typedef TInputImage::Pointer TInputImagePointer;
+
+        //get input parameter as otb::Image<InputPixelType>
+        TInputImagePointer inImage = GetParameterImage<TInputImage>("in");
+
+        //typedef itk::::ForwardFFTImageFilter over otbImage< InputPixelType >
+
+        typedef itk::ForwardFFTImageFilter < TInputImage, ComplexOutputImageType > FFTFilter;
+        FFTFilter::Pointer fwdFilter = FFTFilter::New();
+        fwdFilter->SetInput( inImage );
+
+
+        //typedef VectorImage for output of UnaryFunctorImageFilter
+        typedef otb::VectorImage<OutputPixelType>          TOutputImage;
+
+	typedef otb::ComplexToVectorImageCastFilter<
+	  ComplexOutputImageType,
+	  TOutputImage > ComplexToVectorImageCastFilter;
+	ComplexToVectorImageCastFilter::Pointer unaryFunctorImageFilter = ComplexToVectorImageCastFilter::New();
+
+        if( shift)
+          {
+          otbAppLogINFO( << "Applying Shift image filter" );
+          typedef itk::FFTShiftImageFilter<
+            FFTFilter::OutputImageType,
+            FFTFilter::OutputImageType > FFTShiftFilterType;
+
+          FFTShiftFilterType::Pointer
+            fftShiftFilter = FFTShiftFilterType::New();
+
+          fftShiftFilter->SetInput( fwdFilter->GetOutput() );
+          fftShiftFilter->Update();
+          unaryFunctorImageFilter->SetInput(fftShiftFilter->GetOutput() );
+          }
+        else
+          {
+          unaryFunctorImageFilter->SetInput(fwdFilter->GetOutput());
+          }
+
+        unaryFunctorImageFilter->Update();
+
+        //set output image
+        SetParameterOutputImage<TOutputImage>("out",
+          unaryFunctorImageFilter->GetOutput());
+        }
+      else
+        {
+        //inverse fft
+        typedef otb::VectorImage<InputPixelType>          TInputImage;
+        typedef TInputImage::Pointer TInputImagePointer;
+
+        TInputImagePointer inImage = GetParameterImage("in");
+
+        // typedef TComplexImage for InverseFFTImageFilter input
+        // This a image type of std::complex<InputPixelType>
+        typedef otb::Image<
+          std::complex<InputPixelType>, 2 > TComplexImage;
+        //typedef TOutputImage for InverseFFTImageFilter output
+        typedef otb::Image< OutputPixelType >  TOutputImage;
+
+        // a unary functor to convert vectorimage to complex image
+        typedef itk::UnaryFunctorImageFilter
+          <TInputImage,
+           TComplexImage,
+           ToComplexPixel
+           <TInputImage::PixelType,
+            TComplexImage::PixelType> > UnaryFunctorImageFilter;
+
+        UnaryFunctorImageFilter::Pointer
+          unaryFunctorImageFilter = UnaryFunctorImageFilter::New();
+
+        if( shift)
+          {
+          typedef itk::FFTShiftImageFilter<
+            TInputImage,
+            TInputImage > FFTShiftFilterType;
+
+          FFTShiftFilterType::Pointer
+            fftShiftFilter = FFTShiftFilterType::New();
+          fftShiftFilter->SetInput( inImage );
+
+          fftShiftFilter->Update();
+
+          unaryFunctorImageFilter->SetInput(fftShiftFilter->GetOutput() );
+          }
+        else
+          {
+          unaryFunctorImageFilter->SetInput(inImage);
+          }
+
+        unaryFunctorImageFilter->Update();
+
+        //typedef itk::::InverseFFTImageFilter over TComplexImage
+        typedef itk::InverseFFTImageFilter
+          < TComplexImage,
+            TOutputImage > FFTFilter;
+        FFTFilter::Pointer invFilter = FFTFilter::New();
+        invFilter->SetInput( unaryFunctorImageFilter->GetOutput() );
+        invFilter->Update();
+
+        //set output image
+        SetParameterOutputImage<TOutputImage>("out", invFilter->GetOutput());
+        }
+      }
+    }
+
+  template<otb::Wavelet::Wavelet TWaveletOperator>
+  void DoWaveletTransform(const int dir,
+                          const unsigned int nlevels,
+                          const std::string inkey = "in",
+                          const std::string outkey = "out")
+    {
+    typedef otb::Image< InputPixelType >  TInputImage;
+    typedef otb::Image< OutputPixelType >  TOutputImage;
+    typedef typename TInputImage::Pointer TInputImagePointer;
+
+    TInputImagePointer inImage = GetParameterImage<TInputImage>(inkey);
+
+    if( dir == 0)
+      {
+      typedef otb::WaveletImageFilter<
+        TInputImage,
+        TOutputImage,
+        TWaveletOperator> TWaveletImageFilter;
+
+      typedef typename
+        TWaveletImageFilter::Pointer
+        TWaveletImageFilterPointer;
+      TWaveletImageFilterPointer waveletImageFilter =
+        TWaveletImageFilter::New();
+
+      waveletImageFilter->SetInput(inImage);
+      waveletImageFilter->SetNumberOfDecompositions(nlevels);
+      waveletImageFilter->Update();
+      SetParameterOutputImage<TOutputImage>(outkey, waveletImageFilter->GetOutput() );
+      }
+    else
+      {
+      typedef otb::WaveletInverseImageFilter<
+        TInputImage,
+        TOutputImage,
+        TWaveletOperator > TWaveletImageFilter;
+
+      typedef typename
+        TWaveletImageFilter::Pointer
+        TWaveletImageFilterPointer;
+
+      TWaveletImageFilterPointer waveletImageFilter =
+        TWaveletImageFilter::New();
+
+      waveletImageFilter->SetInput(inImage);
+      waveletImageFilter->SetNumberOfDecompositions(nlevels);
+      waveletImageFilter->Update();
+
+      SetParameterOutputImage<TOutputImage>( outkey, waveletImageFilter->GetOutput() );
+      }
+    }
+};
+
+} // end of namespace Wrapper
+} // end of namespace otb
+
+OTB_APPLICATION_EXPORT(otb::Wrapper::DomainTransform)
diff --git a/Modules/Applications/AppDomainTransform/otb-module.cmake b/Modules/Applications/AppDomainTransform/otb-module.cmake
new file mode 100644
index 0000000..7346a43
--- /dev/null
+++ b/Modules/Applications/AppDomainTransform/otb-module.cmake
@@ -0,0 +1,15 @@
+set(DOCUMENTATION "Application to perform Wavelet and Fourier transform. This application is not streamed")
+
+otb_module(OTBAppDomainTransform
+DEPENDS
+  OTBWavelet
+  OTBApplicationEngine
+
+  TEST_DEPENDS
+    OTBTestKernel
+    OTBCommandLine
+
+  DESCRIPTION
+    "${DOCUMENTATION}"
+)
+
diff --git a/Modules/Applications/AppDomainTransform/test/CMakeLists.txt b/Modules/Applications/AppDomainTransform/test/CMakeLists.txt
new file mode 100644
index 0000000..593cf6f
--- /dev/null
+++ b/Modules/Applications/AppDomainTransform/test/CMakeLists.txt
@@ -0,0 +1,38 @@
+otb_module_test()
+otb_test_application(NAME apTvDomainTransform_wav_db20_fwd
+  APP  DomainTransform
+  OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+  -mode wavelet
+  -mode.wavelet.form db20
+  -mode.wavelet.nlevels 2
+  -direction forward
+  -out ${TEMP}/apTvDomainTransform_wav_db20_fwd.tif
+  )
+
+otb_test_application(NAME apTvDomainTransform_wav_haar_inv
+  APP  DomainTransform
+  OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+  -mode wavelet
+  -mode.wavelet.form haar
+  -direction inverse
+  -out ${TEMP}/apTvDomainTransform_wav_haar_inv.tif
+  )
+
+otb_test_application(NAME apTvDomainTransform_fft_shift_fwd
+  APP  DomainTransform
+  OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+  -mode fft
+  -mode.fft.shift true
+  -direction forward
+  -out ${TEMP}/apTvDomainTransform_fft_shift_fwd.tif
+  )
+
+
+otb_test_application(NAME apTvDomainTransform_fft_inv
+  APP  DomainTransform
+  OPTIONS -in ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+  -mode fft
+  -direction inverse
+  -out ${TEMP}/apTvDomainTransform_fft_shift_inv.tif
+  )
+
diff --git a/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx b/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx
index 4447491..b2a5d31 100644
--- a/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx
+++ b/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx
@@ -70,8 +70,8 @@ SetDocLimitations("None");
 SetDocAuthors("OTB-Team");
 SetDocSeeAlso("otb class");
 
-AddDocTag("Edge");
 AddDocTag(Tags::FeatureExtraction);
+AddDocTag("Edge");
 
 AddParameter(ParameterType_InputImage, "in",  "Input Image");
 SetParameterDescription("in", "The input image to compute the features on.");
diff --git a/Modules/Applications/AppFiltering/app/otbDespeckle.cxx b/Modules/Applications/AppFiltering/app/otbDespeckle.cxx
index 0fde206..79a6258 100644
--- a/Modules/Applications/AppFiltering/app/otbDespeckle.cxx
+++ b/Modules/Applications/AppFiltering/app/otbDespeckle.cxx
@@ -63,8 +63,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag(Tags::SAR);
     AddDocTag(Tags::Filter);
+	AddDocTag(Tags::SAR);
 
     AddParameter(ParameterType_InputImage,  "in",   "Input Image");
     SetParameterDescription("in", "Input image.");
diff --git a/Modules/Applications/AppFiltering/app/otbSmoothing.cxx b/Modules/Applications/AppFiltering/app/otbSmoothing.cxx
index 18cd825..14e6be7 100644
--- a/Modules/Applications/AppFiltering/app/otbSmoothing.cxx
+++ b/Modules/Applications/AppFiltering/app/otbSmoothing.cxx
@@ -103,7 +103,7 @@ private:
     SetDefaultParameterInt("type.anidif.nbiter",     10);
     SetDefaultParameterInt("type.anidif.conductance",     1.);
 
-    SetParameterString("type", "anidif");
+    SetParameterString("type", "anidif", false);
 
     // Doc example parameter settings
     SetExampleComment("Image smoothing using a mean filter.", 0);
diff --git a/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx b/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx
index 2f31cd6..48d0c9c 100644
--- a/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx
+++ b/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx
@@ -16,25 +16,14 @@
 
  =========================================================================*/
 #include "otbWrapperApplicationFactory.h"
+#include "otbWrapperCompositeApplication.h"
 
-#include "otbMultiToMonoChannelExtractROI.h"
-#include "otbGenericRSResampleImageFilter.h"
-#include "otbGridResampleImageFilter.h"
-#include "otbImportGeoInformationImageFilter.h"
-#include "otbBCOInterpolateImageFunction.h"
-#include "otbSimpleRcsPanSharpeningFusionImageFilter.h"
-#include "itkFixedArray.h"
-
-// Elevation handler
-#include "otbWrapperElevationParametersHandler.h"
-
-#include "otbPleiadesPToXSAffineTransformCalculator.h"
 
 namespace otb
 {
 namespace Wrapper
 {
-class BundleToPerfectSensor : public Application
+class BundleToPerfectSensor : public CompositeApplication
 {
 public:
   /** Standard class typedefs. */
@@ -46,7 +35,7 @@ public:
   /** Standard macro */
   itkNewMacro(Self);
 
-  itkTypeMacro(BundleToPerfectSensor, otb::Application);
+  itkTypeMacro(BundleToPerfectSensor, otb::Wrapper::CompositeApplication);
 
 private:
 
@@ -65,38 +54,27 @@ private:
     AddDocTag(Tags::Geometry);
     AddDocTag(Tags::Pansharpening);
 
-    AddParameter(ParameterType_InputImage,   "inp",   "Input PAN Image");
-    SetParameterDescription("inp"," Input panchromatic image.");
-    AddParameter(ParameterType_InputImage,   "inxs",  "Input XS Image");
-    SetParameterDescription("inxs"," Input XS image.");
-
-    AddParameter(ParameterType_OutputImage,  "out",   "Output image");
-    SetParameterDescription("out"," Output image.");
-
-    // Elevation
-    ElevationParametersHandler::AddElevationParameters(this, "elev");
-
-    // Superposition mode
-    AddParameter(ParameterType_Choice,"mode", "Mode");
-    SetParameterDescription("mode", "Superimposition mode");
-    
-    AddChoice("mode.default", "Default mode");
-    SetParameterDescription("mode.default", "Default superimposition mode : "
-      "uses any projection reference or sensor model found in the images");
-    
-    AddChoice("mode.phr", "Pleiades mode");
-    SetParameterDescription("mode.phr", "Pleiades superimposition mode, "
-      "designed for the case of a P+XS bundle in SENSOR geometry. It uses"
-      " a simple transform on the XS image : a scaling and a residual "
-      "translation.");
+    ClearApplications();
+    AddApplication("Superimpose", "superimpose", "Reproject XS onto Pan");
+    AddApplication("Pansharpening", "pansharp", "Fusion of XS and Pan");
+
+    ShareParameter("inp","superimpose.inr","Input PAN Image","Input panchromatic image.");
+    ShareParameter("inxs","superimpose.inm","Input XS Image","Input XS image.");
+    ShareParameter("out","pansharp.out");
+    ShareParameter("elev","superimpose.elev");
+    ShareParameter("mode","superimpose.mode");
+    ShareParameter("lms","superimpose.lms",
+      "Spacing of the deformation field",
+      "Spacing of the deformation field. Default is 10 times the PAN image spacing.");
+    ShareParameter("fv","superimpose.fv");
+    ShareParameter("ram","superimpose.ram");
+
+    Connect("pansharp.inp","superimpose.inr");
+    Connect("pansharp.ram","superimpose.ram");
+
+    GetInternalApplication("superimpose")->SetParameterString("interpolator","bco", false);
+    GetInternalApplication("pansharp")->SetParameterString("method","rcs", false);
     
-    AddParameter(ParameterType_Float,        "lms",   "Spacing of the deformation field");
-    SetParameterDescription("lms"," Spacing of the deformation field. Default is 10 times the PAN image spacing.");
-
-    AddRAMParameter();
-
-    MandatoryOff("lms");
-
     // Doc example parameter settings
     SetDocExampleParameterValue("inp", "QB_Toulouse_Ortho_PAN.tif");
     SetDocExampleParameterValue("inxs", "QB_Toulouse_Ortho_XS.tif");
@@ -106,150 +84,19 @@ private:
 
   void DoUpdateParameters() ITK_OVERRIDE
   {
-    if(!HasUserValue("mode") && HasValue("inp") && HasValue("inxs") && otb::PleiadesPToXSAffineTransformCalculator::CanCompute(GetParameterImage("inp"),GetParameterImage("inxs")))
-      {
-      otbAppLogWARNING("Forcing PHR mode with PHR data. You need to add \"-mode default\" to force the default mode with PHR images.");
-      SetParameterString("mode","phr");
-      }
+    UpdateInternalParameters("superimpose");
   }
 
   void DoExecute() ITK_OVERRIDE
   {
-    FloatVectorImageType* panchroV = GetParameterImage("inp");
-    FloatVectorImageType* xs = GetParameterImage("inxs");
-
-    if ( panchroV->GetNumberOfComponentsPerPixel() != 1 )
-      {
-      itkExceptionMacro(<< "The panchromatic image must be a single channel image")
-      }
-
-    // Transform the PAN image to otb::Image
-    typedef otb::Image<FloatVectorImageType::InternalPixelType> InternalImageType;
-    typedef otb::MultiToMonoChannelExtractROI<float,float> ExtractFilterType;
-
-    ExtractFilterType::Pointer channelSelect = ExtractFilterType::New();
-    m_Ref.push_back(channelSelect.GetPointer());
-    channelSelect->SetChannel(1);
-    channelSelect->SetInput(panchroV);
-    channelSelect->UpdateOutputInformation();
-    InternalImageType::Pointer panchro = channelSelect->GetOutput();
-
-    typedef otb::BCOInterpolateImageFunction<FloatVectorImageType> InterpolatorType;
-    typedef otb::GenericRSResampleImageFilter<FloatVectorImageType, FloatVectorImageType>  ResamplerType;
-    typedef otb::GridResampleImageFilter<FloatVectorImageType, FloatVectorImageType>  BasicResamplerType;
-    typedef otb::ImportGeoInformationImageFilter<FloatVectorImageType,InternalImageType> ImportGeoInformationFilterType;
-    typedef otb::SimpleRcsPanSharpeningFusionImageFilter<InternalImageType, FloatVectorImageType, FloatVectorImageType> FusionFilterType;
+    ExecuteInternal("superimpose");
 
-    // Resample filter
-    ResamplerType::Pointer    resampler = ResamplerType::New();
-    m_Ref.push_back(resampler.GetPointer());
-    
-    BasicResamplerType::Pointer basicResampler = BasicResamplerType::New();
-    m_Ref.push_back(basicResampler.GetPointer());
-
-    ImportGeoInformationFilterType::Pointer geoImport = ImportGeoInformationFilterType::New();
-    m_Ref.push_back(geoImport.GetPointer());
-
-    InterpolatorType::Pointer interpolator = InterpolatorType::New();
-    resampler->SetInterpolator(interpolator);
-    basicResampler->SetInterpolator(interpolator);
-
-    // Fusion filter
-    FusionFilterType::Pointer  fusionFilter = FusionFilterType::New();
-    m_Ref.push_back(fusionFilter.GetPointer());
-    fusionFilter->SetPanInput(panchro);
-    
-    // Setup the DEM Handler
-    otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
-
-    // Set up output image information
-    FloatVectorImageType::SpacingType spacing = panchro->GetSpacing();
-    FloatVectorImageType::IndexType   start = panchro->GetLargestPossibleRegion().GetIndex();
-    FloatVectorImageType::SizeType    size = panchro->GetLargestPossibleRegion().GetSize();
-    FloatVectorImageType::PointType   origin = panchro->GetOrigin();
-
-    FloatVectorImageType::PixelType defaultValue;
-    itk::NumericTraits<FloatVectorImageType::PixelType>::SetLength(defaultValue, xs->GetNumberOfComponentsPerPixel());
+    GetInternalApplication("pansharp")->SetParameterInputImage("inxs",
+      GetInternalApplication("superimpose")->GetParameterOutputImage("out"));
 
-    if(GetParameterString("mode") == "default")
-      {
-      otbAppLogINFO("Using the default mode");
-      if(IsParameterEnabled("lms") && HasValue("lms"))
-        {
-        double defScalarSpacing = GetParameterFloat("lms");
-        otbAppLogINFO(<< "Generating coarse deformation field (spacing="<<defScalarSpacing<<")" << std::endl);
-        FloatVectorImageType::SpacingType defSpacing;
-        
-        defSpacing[0] = defScalarSpacing;
-        defSpacing[1] = defScalarSpacing;
-        
-        resampler->SetDisplacementFieldSpacing(defSpacing);
-        }
-      else
-        {
-        FloatVectorImageType::SpacingType defSpacing;
-        defSpacing[0]=10*spacing[0];
-        defSpacing[1]=10*spacing[1];
-        resampler->SetDisplacementFieldSpacing(defSpacing);
-        }
-      
-      resampler->SetInput(xs);
-      resampler->SetOutputOrigin(origin);
-      resampler->SetOutputSpacing(spacing);
-      resampler->SetOutputSize(size);
-      resampler->SetOutputStartIndex(start);
-      resampler->SetOutputKeywordList(panchro->GetImageKeywordlist());
-      resampler->SetOutputProjectionRef(panchro->GetProjectionRef());
-      resampler->SetEdgePaddingValue(defaultValue);
-      fusionFilter->SetXsInput(resampler->GetOutput());
-      }
-    else if(GetParameterString("mode")=="phr")
-      {
-      otbAppLogINFO("Using the PHR mode");
-      
-      otb::PleiadesPToXSAffineTransformCalculator::TransformType::OffsetType offset
-        = otb::PleiadesPToXSAffineTransformCalculator::ComputeOffset(GetParameterImage("inp"),
-                                                                     GetParameterImage("inxs"));
-
-      origin+=offset;
-      origin[0]=origin[0]/4;
-      origin[1]=origin[1]/4;
-      
-      basicResampler->SetOutputOrigin(origin);
-      basicResampler->SetInput(xs);
-      basicResampler->SetOutputOrigin(origin);
-
-      FloatVectorImageType::SpacingType xsSpacing = GetParameterImage("inxs")->GetSpacing();
-      xsSpacing*=0.25;
-      
-      basicResampler->SetOutputSpacing(xsSpacing);
-      basicResampler->SetOutputSize(size);
-      basicResampler->SetOutputStartIndex(start);
-      basicResampler->SetEdgePaddingValue(defaultValue);
-
-      geoImport->SetInput(basicResampler->GetOutput());
-      geoImport->SetSource(panchro);
-
-      fusionFilter->SetXsInput(geoImport->GetOutput());
-
-      // Set the profRef & Keywordlist from Pan into the resampled XS image
-      basicResampler->UpdateOutputInformation();
-      itk::MetaDataDictionary& dict = basicResampler->GetOutput()->GetMetaDataDictionary();
-      itk::EncapsulateMetaData<std::string>(dict, MetaDataKey::ProjectionRefKey,
-                                            panchro->GetProjectionRef());
-      itk::EncapsulateMetaData<ImageKeywordlist>(dict, MetaDataKey::OSSIMKeywordlistKey,
-                                                 panchro->GetImageKeywordlist());
-      }
-    else
-      {
-      otbAppLogWARNING("Unknown mode");
-      }
-    
-    SetParameterOutputImage("out", fusionFilter->GetOutput());
+    ExecuteInternal("pansharp");
   }
 
-  std::vector<itk::ProcessObject::Pointer> m_Ref;
-
 };
 
 
diff --git a/Modules/Applications/AppFusion/otb-module.cmake b/Modules/Applications/AppFusion/otb-module.cmake
index 54fe75c..e09047b 100644
--- a/Modules/Applications/AppFusion/otb-module.cmake
+++ b/Modules/Applications/AppFusion/otb-module.cmake
@@ -10,6 +10,7 @@ otb_module(OTBAppFusion
     OTBInterpolation
 
   TEST_DEPENDS
+    OTBAppProjection
     OTBTestKernel
     OTBCommandLine
 
diff --git a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
index 50c8c11..403368e 100644
--- a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
+++ b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
@@ -97,6 +97,7 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("VertexComponentAnalysis");
 
+	AddDocTag("Miscellaneous");
     AddDocTag(Tags::Hyperspectral);
 
     AddParameter(ParameterType_InputImage,  "in",   "Input Image Filename");
@@ -125,7 +126,7 @@ private:
 
     AddChoice("ua.mdmdnmf", "MDMDNMF");
     SetParameterDescription("ua.mdmdnmf", "Minimum Dispersion Constrained Non Negative Matrix Factorization");
-    SetParameterString("ua", "ucls");
+    SetParameterString("ua", "ucls", false);
     // Doc example parameter settings
     SetDocExampleParameterValue("in", "cupriteSubHsi.tif");
     SetDocExampleParameterValue("ie", "cupriteEndmembers.tif");
diff --git a/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx b/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx
index cc72958..214c77f 100644
--- a/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx
+++ b/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx
@@ -56,6 +56,7 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
+	AddDocTag("Miscellaneous");
     AddDocTag(Tags::Hyperspectral);
     AddDocTag(Tags::DimensionReduction);
 
@@ -64,7 +65,7 @@ private:
 
     AddParameter(ParameterType_Int, "ne", "Number of endmembers");
     SetParameterDescription("ne","The number of endmembers to extract from the data cube");
-    SetParameterInt("ne", 1);
+    SetParameterInt("ne",1, false);
     MandatoryOn("ne");
 
     AddParameter(ParameterType_OutputImage, "outendm", "Output Endmembers");
diff --git a/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx b/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx
index d4968e3..cd1d0c4 100644
--- a/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx
@@ -265,10 +265,10 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("ImageSVMClassifier");
 
-    AddDocTag("Utilities");
     AddDocTag(Tags::Manip);
     AddDocTag(Tags::Meta);
     AddDocTag(Tags::Learning);
+	AddDocTag("Utilities");
 
     // Build lut map
 
@@ -342,11 +342,11 @@ private:
 
     AddParameter(ParameterType_Float,"method.continuous.min","Mapping range lower value");
     SetParameterDescription("method.continuous.min","Set the lower input value of the mapping range.");
-    SetParameterFloat("method.continuous.min", 0.);
+    SetParameterFloat("method.continuous.min",0., false);
 
     AddParameter(ParameterType_Float,"method.continuous.max","Mapping range higher value");
     SetParameterDescription("method.continuous.max","Set the higher input value of the mapping range.");
-    SetParameterFloat("method.continuous.max", 255.);
+    SetParameterFloat("method.continuous.max",255., false);
 
     // Optimal LUT
     AddChoice("method.optimal","Compute an optimized look-up table");
@@ -355,7 +355,7 @@ private:
                             "[color to label] Searching all the colors present in the image to compute a continuous label list");
     AddParameter(ParameterType_Int,"method.optimal.background", "Background label");
     SetParameterDescription("method.optimal.background","Value of the background label");
-    SetParameterInt("method.optimal.background", 0);
+    SetParameterInt("method.optimal.background",0, false);
     SetMinimumParameterIntValue("method.optimal.background", 0);
     SetMaximumParameterIntValue("method.optimal.background", 255);
 
@@ -367,18 +367,18 @@ private:
     AddParameter(ParameterType_Float, "method.image.nodatavalue", "NoData value");
     SetParameterDescription("method.image.nodatavalue","NoData value for each channel of the support image, which will not be handled in the LUT estimation. If NOT checked, ALL the pixel values of the support image will be handled in the LUT estimation.");
     MandatoryOff("method.image.nodatavalue");
-    SetParameterFloat("method.image.nodatavalue", 0);
+    SetParameterFloat("method.image.nodatavalue",0, false);
     DisableParameter("method.image.nodatavalue");
     AddParameter(ParameterType_Int, "method.image.low", "lower quantile");
     SetParameterDescription("method.image.low","lower quantile for image normalization");
     MandatoryOff("method.image.low");
-    SetParameterInt("method.image.low", 2);
+    SetParameterInt("method.image.low",2, false);
     SetMinimumParameterIntValue("method.image.low", 0);
     SetMaximumParameterIntValue("method.image.low", 100);
     AddParameter(ParameterType_Int, "method.image.up", "upper quantile");
     SetParameterDescription("method.image.up","upper quantile for image normalization");
     MandatoryOff("method.image.up");
-    SetParameterInt("method.image.up", 2);
+    SetParameterInt("method.image.up",2, false);
     SetMinimumParameterIntValue("method.image.up", 0);
     SetMaximumParameterIntValue("method.image.up", 100);
 
@@ -400,7 +400,7 @@ private:
       if (GetParameterInt("method")==1 || GetParameterInt("method")==3)
         {
         otbAppLogWARNING("Override method : use optimal");
-        SetParameterInt("method", 2);
+        SetParameterInt("method",2, false);
         }
       }
   }
diff --git a/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx b/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx
index f08ac34..b7d34b9 100644
--- a/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx
@@ -58,7 +58,9 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("BandMath application, ImageStatistics");
 
+	AddDocTag("Miscellaneous");
     AddDocTag("Statistics");
+	AddDocTag(Tags::Manip);
 
     AddParameter(ParameterType_Group, "ref", "Reference image properties");
     AddParameter(ParameterType_InputImage,  "ref.in",   "Reference image");
@@ -218,10 +220,10 @@ private:
     otbAppLogINFO( << "PSNR: " << m_CompareFilter->GetPSNR() );
     otbAppLogINFO( << "Number of Pixel different: " << m_CompareFilter->GetDiffCount() );
 
-    SetParameterFloat( "mse", m_CompareFilter->GetMSE() );
-    SetParameterFloat( "mae", m_CompareFilter->GetMAE() );
-    SetParameterFloat( "psnr", m_CompareFilter->GetPSNR() );
-    SetParameterFloat( "count", m_CompareFilter->GetDiffCount() );
+    SetParameterFloat( "mse",m_CompareFilter->GetMSE() , false);
+    SetParameterFloat( "mae",m_CompareFilter->GetMAE() , false);
+    SetParameterFloat( "psnr",m_CompareFilter->GetPSNR() , false);
+    SetParameterFloat( "count",m_CompareFilter->GetDiffCount() , false);
   }
 
 
diff --git a/Modules/Applications/AppImageUtils/app/otbConvert.cxx b/Modules/Applications/AppImageUtils/app/otbConvert.cxx
index 7f7d565..085fe5d 100644
--- a/Modules/Applications/AppImageUtils/app/otbConvert.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbConvert.cxx
@@ -86,9 +86,10 @@ private:
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("Rescale");
+
+	AddDocTag(Tags::Manip);
     AddDocTag("Conversion");
     AddDocTag("Image Dynamic");
-    AddDocTag(Tags::Manip);
 
     AddParameter(ParameterType_InputImage,  "in",   "Input image");
     SetParameterDescription("in", "Input image");
@@ -98,7 +99,7 @@ private:
     AddChoice("type.none", "None");
     AddChoice("type.linear", "Linear");
     AddChoice("type.log2", "Log2");
-    SetParameterString("type", "none");
+    SetParameterString("type", "none", false);
 
     AddParameter(ParameterType_Float,"type.linear.gamma","Gamma correction factor");
     SetParameterDescription("type.linear.gamma","Gamma correction factor");
diff --git a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx
index b036c0f..3ea74d4 100644
--- a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx
@@ -103,8 +103,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag("Utilities");
     AddDocTag(Tags::Manip);
+	AddDocTag("Utilities");
 
     AddParameter(ParameterType_InputImageList,  "il",   "Input images list");
     SetParameterDescription("il", "The list of images on which you want to determine corresponding SRTM tiles.");
diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
index 8a3bc91..4983ff4 100644
--- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
@@ -126,8 +126,8 @@ private:
 
       if (!HasUserValue("sizex")  && !HasUserValue("sizey") )
         {
-        SetParameterInt("sizex", largestRegion.GetSize()[0]);
-        SetParameterInt("sizey", largestRegion.GetSize()[1]);
+        SetParameterInt("sizex",largestRegion.GetSize()[0], false);
+        SetParameterInt("sizey",largestRegion.GetSize()[1], false);
         }
 
       unsigned int nbComponents = inImage->GetNumberOfComponentsPerPixel();
@@ -164,8 +164,8 @@ private:
       if(!this->CropRegionOfInterest())
         {
         // Put the index of the ROI to origin and try to crop again
-        SetParameterInt("startx", 0);
-        SetParameterInt("starty", 0);
+        SetParameterInt("startx",0, false);
+        SetParameterInt("starty",0, false);
         this->CropRegionOfInterest();
         }
       }
@@ -209,10 +209,10 @@ private:
       {
         if (region.Crop(GetParameterImage("in")->GetLargestPossibleRegion()))
           {
-            SetParameterInt("sizex", region.GetSize(0));
-            SetParameterInt("sizey", region.GetSize(1));
-            SetParameterInt("startx", region.GetIndex(0));
-            SetParameterInt("starty", region.GetIndex(1));
+            SetParameterInt("sizex",region.GetSize(0), HasUserValue("sizex"));
+            SetParameterInt("sizey",region.GetSize(1), HasUserValue("sizey"));
+            SetParameterInt("startx",region.GetIndex(0), HasUserValue("startx"));
+            SetParameterInt("starty",region.GetIndex(1), HasUserValue("starty"));
             return true;
           }
       }
diff --git a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx
index ba5231c..5611b96 100644
--- a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx
@@ -64,10 +64,11 @@ private:
     SetDocLongDescription("This application has two modes. The first allows building a mask of no-data pixels from the no-data flags read from the image file. The second allows updating the change the no-data value of an image (pixels value and metadata). This last mode also allows replacing NaN in images with a proper no-data value. To do so, one should activate the NaN is no-data option.");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
-    SetDocSeeAlso("BanMath");
+    SetDocSeeAlso("BandMath");
+
+	AddDocTag(Tags::Manip);
     AddDocTag("Conversion");
     AddDocTag("Image Dynamic");
-    AddDocTag(Tags::Manip);
 
     AddParameter(ParameterType_InputImage,  "in",   "Input image");
     SetParameterDescription("in", "Input image");
@@ -108,7 +109,7 @@ private:
     SetParameterDescription("mode.apply.ndval","No Data value used according to the mask image");
     SetDefaultParameterFloat("mode.apply.ndval", 0.0);
 
-    SetParameterString("mode","buildmask");
+    SetParameterString("mode","buildmask", false);
 
     AddRAMParameter();
 
diff --git a/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx b/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx
index 4e7ce61..9fd3659 100644
--- a/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx
@@ -67,8 +67,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
+	AddDocTag(Tags::Manip);
     AddDocTag("Conversion");
-    AddDocTag(Tags::Manip);
     AddDocTag(Tags::Multi);
     AddDocTag("Util");
 
diff --git a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx
index 35a860d..ed170b2 100644
--- a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx
@@ -55,6 +55,7 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
+	AddDocTag("Miscellaneous");
     AddDocTag("Utilities");
     AddDocTag("Coordinates");
     AddDocTag("Raster");
@@ -146,7 +147,7 @@ private:
     std::ostringstream oss;
     oss << extractor->GetOutput()->GetPixel(id)<<std::endl;
 
-    SetParameterString("value", oss.str());
+    SetParameterString("value", oss.str(), false);
 
     //Display image information in the dedicated logger
     otbAppLogINFO( << oss.str() );
diff --git a/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx b/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx
index 7c36770..03d9ef4 100644
--- a/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx
@@ -141,8 +141,8 @@ private:
 
       if (!HasUserValue("rsx")  && !HasUserValue("rsy") )
         {
-        SetParameterInt("rsx", largestRegion.GetSize()[0]);
-        SetParameterInt("rsy", largestRegion.GetSize()[1]);
+        SetParameterInt("rsx",largestRegion.GetSize()[0], false);
+        SetParameterInt("rsy",largestRegion.GetSize()[1], false);
         }
 
       // Put the limit of the index and the size relative the image
@@ -163,8 +163,8 @@ private:
       if(!this->CropRegionOfInterest())
         {
         // Put the index of the ROI to origin and try to crop again
-        SetParameterInt("rox", 0);
-        SetParameterInt("roy", 0);
+        SetParameterInt("rox",0, false);
+        SetParameterInt("roy",0, false);
         this->CropRegionOfInterest();
         }
       }
@@ -183,10 +183,10 @@ bool CropRegionOfInterest()
       {
         if (region.Crop(GetParameterImage("in")->GetLargestPossibleRegion()))
           {
-            SetParameterInt("rsx", region.GetSize(0));
-            SetParameterInt("rsy", region.GetSize(1));
-            SetParameterInt("rox", region.GetIndex(0));
-            SetParameterInt("roy", region.GetIndex(1));
+            SetParameterInt( "rsx", region.GetSize(0), HasUserValue("rsx") );
+            SetParameterInt( "rsy", region.GetSize(1), HasUserValue("rsy") );
+            SetParameterInt( "rox", region.GetIndex(0), HasUserValue("rox") );
+            SetParameterInt( "roy", region.GetIndex(1), HasUserValue("roy") );
             return true;
           }
       }
diff --git a/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx b/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx
index 0bb1633..8c78a28 100644
--- a/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx
@@ -57,8 +57,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag("Utilities");
     AddDocTag(Tags::Manip);
+    AddDocTag("Utilities");
     AddDocTag(Tags::Meta);
 
     AddParameter(ParameterType_InputImage,  "in",   "Input Image");
@@ -262,7 +262,7 @@ private:
     ImageMetadataInterfaceType::Pointer metadataInterface = ImageMetadataInterfaceFactory::CreateIMI(inImage->GetMetaDataDictionary());
 
     //Get number of bands
-    SetParameterInt("numberbands", inImage->GetNumberOfComponentsPerPixel());
+    SetParameterInt("numberbands",inImage->GetNumberOfComponentsPerPixel(), false);
     ossOutput << "\tNumber of bands : " << GetParameterInt("numberbands") << std::endl;
     std::vector<bool> noDataValueAvailable;
     bool ret = itk::ExposeMetaData<std::vector<bool> >(inImage->GetMetaDataDictionary(),MetaDataKey::NoDataValueAvailable,noDataValueAvailable);
@@ -293,26 +293,26 @@ private:
       ossOutput<<std::endl;
 
     //Get image size
-    SetParameterInt("indexx", inImage->GetLargestPossibleRegion().GetIndex()[0]);
-    SetParameterInt("indexy", inImage->GetLargestPossibleRegion().GetIndex()[1]);
+    SetParameterInt("indexx",inImage->GetLargestPossibleRegion().GetIndex()[0], false);
+    SetParameterInt("indexy",inImage->GetLargestPossibleRegion().GetIndex()[1], false);
 
         ossOutput << "\tStart index :  [" << GetParameterInt("indexx") << "," << GetParameterInt("indexy") << "]" << std::endl;
 
     //Get image size
-    SetParameterInt("sizex", inImage->GetLargestPossibleRegion().GetSize()[0]);
-    SetParameterInt("sizey", inImage->GetLargestPossibleRegion().GetSize()[1]);
+    SetParameterInt("sizex",inImage->GetLargestPossibleRegion().GetSize()[0], false);
+    SetParameterInt("sizey",inImage->GetLargestPossibleRegion().GetSize()[1], false);
 
     ossOutput << "\tSize :  [" << GetParameterInt("sizex") << "," << GetParameterInt("sizey") << "]" << std::endl;
 
     //Get image origin
-    SetParameterFloat("originx", inImage->GetOrigin()[0]);
-    SetParameterFloat("originy", inImage->GetOrigin()[1]);
+    SetParameterFloat("originx",inImage->GetOrigin()[0], false);
+    SetParameterFloat("originy",inImage->GetOrigin()[1], false);
 
     ossOutput << "\tOrigin :  [" << GetParameterFloat("originx") << "," << GetParameterFloat("originy") << "]" << std::endl;
 
     //Get image spacing
-    SetParameterFloat("spacingx", inImage->GetSpacing()[0]);
-    SetParameterFloat("spacingy", inImage->GetSpacing()[1]);
+    SetParameterFloat("spacingx",inImage->GetSpacing()[0], false);
+    SetParameterFloat("spacingy",inImage->GetSpacing()[1], false);
     ossOutput << "\tSpacing :  [" << GetParameterFloat("spacingx") << "," << GetParameterFloat("spacingy") << "]" << std::endl;
 
     //Estimate ground spacing
@@ -331,14 +331,14 @@ private:
     approxGroundSpacing = groundSpacing->EvaluateAtIndex(index);
 
     //Get image estimated ground spacing (in m)
-    SetParameterFloat("estimatedgroundspacingx", approxGroundSpacing[0]);
-    SetParameterFloat("estimatedgroundspacingy", approxGroundSpacing[1]);
+    SetParameterFloat("estimatedgroundspacingx",approxGroundSpacing[0], false);
+    SetParameterFloat("estimatedgroundspacingy",approxGroundSpacing[1], false);
 
     ossOutput << "\tEstimated ground spacing (in meters): [" << GetParameterFloat("estimatedgroundspacingx") << "," << GetParameterFloat("estimatedgroundspacingy") << "]" << std::endl;
 
     ossOutput << std::endl << "Image acquisition information:" << std::endl;
 
-    SetParameterString("sensor", metadataInterface->GetSensorID());
+    SetParameterString("sensor", metadataInterface->GetSensorID(), false);
     ossOutput << "\tSensor : ";
     if (!GetParameterString("sensor").empty())
       ossOutput <<  GetParameterString("sensor");
@@ -348,11 +348,11 @@ private:
     ossOutput << "\tImage identification number: ";
     if (metadataInterface->GetImageKeywordlist().HasKey("image_id"))
       {
-      SetParameterString("id", metadataInterface->GetImageKeywordlist().GetMetadataByKey("image_id"));
+      SetParameterString("id", metadataInterface->GetImageKeywordlist().GetMetadataByKey("image_id"), false);
       ossOutput << GetParameterString("id");
       }
     ossOutput << std::endl;
-    SetParameterString("projectionref", metadataInterface->GetProjectionRef());
+    SetParameterString("projectionref", metadataInterface->GetProjectionRef(), false);
     if (!GetParameterString("projectionref").empty())
       ossOutput << "\tImage projection : " << GetParameterString("projectionref") << std::endl;
 
@@ -376,7 +376,7 @@ private:
         osstime<<"0";
       osstime<<metadataInterface->GetMinute();
       osstime<<":00";
-      SetParameterString("time", osstime.str());
+      SetParameterString("time", osstime.str(), false);
 
       ossOutput << "\tAcquisition time : " << GetParameterString("time") << std::endl;
       }
@@ -405,29 +405,29 @@ private:
 
       if( !coord2name->GetCountryName().empty() )
         {
-        SetParameterString("country", coord2name->GetCountryName());
+        SetParameterString("country", coord2name->GetCountryName(), false);
         ossOutput << "\tCountry : " << GetParameterString("country") << std::endl;
         }
       else
-        SetParameterString("country", "Not available");
+        SetParameterString("country", "Not available", false);
 
       if( !coord2name->GetPlaceName().empty() )
         {
-        SetParameterString("town", coord2name->GetPlaceName());
+        SetParameterString("town", coord2name->GetPlaceName(), false);
         ossOutput << "\tTown : " << GetParameterString("town") << std::endl;
         }
       else
-        SetParameterString("town", "Not available");
+        SetParameterString("town", "Not available", false);
 
       // Retrieve footprint
-      SetParameterFloat("ullat", ullat);
-      SetParameterFloat("ullon", ullon);
-      SetParameterFloat("urlat", urlat);
-      SetParameterFloat("urlon", urlon);
-      SetParameterFloat("lrlat", lrlat);
-      SetParameterFloat("lrlon", lrlon);
-      SetParameterFloat("lllat", lllat);
-      SetParameterFloat("lllon", lllon);
+      SetParameterFloat("ullat",ullat, false);
+      SetParameterFloat("ullon",ullon, false);
+      SetParameterFloat("urlat",urlat, false);
+      SetParameterFloat("urlon",urlon, false);
+      SetParameterFloat("lrlat",lrlat, false);
+      SetParameterFloat("lrlon",lrlon, false);
+      SetParameterFloat("lllat",lllat, false);
+      SetParameterFloat("lllon",lllon, false);
 
       ossOutput << std::endl << "Image footprint coordinates:" << std::endl;
       ossOutput << "\tUpper left corner (latitude, longitude) = [" << GetParameterFloat("ullat") << "," << GetParameterFloat("ullon") << "]" << std::endl;
@@ -439,15 +439,15 @@ private:
       {
       }
 
-    SetParameterInt("rgb.r", metadataInterface->GetDefaultDisplay()[0]);
-    SetParameterInt("rgb.g", metadataInterface->GetDefaultDisplay()[1]);
-    SetParameterInt("rgb.b", metadataInterface->GetDefaultDisplay()[2]);
+    SetParameterInt("rgb.r",metadataInterface->GetDefaultDisplay()[0], false);
+    SetParameterInt("rgb.g",metadataInterface->GetDefaultDisplay()[1], false);
+    SetParameterInt("rgb.b",metadataInterface->GetDefaultDisplay()[2], false);
 
     ossOutput << std::endl << "Image default RGB composition:" << std::endl;
     ossOutput << "\t[R, G, B] = [" << GetParameterInt("rgb.r") << "," << GetParameterInt("rgb.g") << "," << GetParameterInt("rgb.b") << "]" << std::endl;
 
-    SetParameterInt("gcp.count", metadataInterface->GetGCPCount());
-    SetParameterString("gcp.proj", metadataInterface->GetGCPProjection());
+    SetParameterInt("gcp.count",metadataInterface->GetGCPCount(), false);
+    SetParameterString("gcp.proj", metadataInterface->GetGCPProjection(), false);
 
     ossOutput << std::endl << "Ground control points information:" << std::endl;
     ossOutput << "\tNumber of GCPs = " << GetParameterInt("gcp.count") << std::endl;
@@ -476,16 +476,16 @@ private:
       ossOutput << "\t\tGround  coordinates =" << gcp_geocoord.back() << std::endl;
       }
 
-    SetParameterStringList("gcp.ids", gcp_ids);
-    SetParameterStringList("gcp.imcoord", gcp_imcoord);
-    SetParameterStringList("gcp.geocoord", gcp_geocoord);
-    SetParameterStringList("gcp.info", gcp_infos);
+    SetParameterStringList("gcp.ids", gcp_ids, false);
+    SetParameterStringList("gcp.imcoord", gcp_imcoord, false);
+    SetParameterStringList("gcp.geocoord", gcp_geocoord, false);
+    SetParameterStringList("gcp.info", gcp_infos, false);
 
     if ( IsParameterEnabled("keywordlist") )
       {
       std::ostringstream osskeywordlist;
       osskeywordlist<<metadataInterface->GetImageKeywordlist() << std::endl;
-      SetParameterString("keyword", osskeywordlist.str());
+      SetParameterString("keyword", osskeywordlist.str(), false);
 
       ossOutput << std::endl << "Image OSSIM keywordlist (optional):" << std::endl;
       ossOutput << "\t" << GetParameterString("keyword") << std::endl;
diff --git a/Modules/Applications/AppImageUtils/app/otbRescale.cxx b/Modules/Applications/AppImageUtils/app/otbRescale.cxx
index ea10954..21ada14 100644
--- a/Modules/Applications/AppImageUtils/app/otbRescale.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbRescale.cxx
@@ -52,8 +52,9 @@ private:
     SetDescription("Rescale the image between two given values.");
 
     SetDocName("Rescale Image");
-    SetDocLongDescription("This application scales the given image pixel intensity between two given values. "
-      "By default min (resp. max) value is set to 0 (resp. 255).");
+    SetDocLongDescription("This application scales the given image pixel intensity between two given values.\n"
+                                  "By default min (resp. max) value is set to 0 (resp. 255).\n"
+                                  "Input minimum and maximum values is automatically computed for all image bands.");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
@@ -109,6 +110,7 @@ private:
 
     m_RescaleFilter = RescaleImageFilterType::New();
     m_RescaleFilter->SetInput( inImage );
+    m_RescaleFilter->SetAutomaticInputMinMaxComputation(false);
     m_RescaleFilter->SetInputMinimum( m_MinMaxFilter->GetMinimum() );
     m_RescaleFilter->SetInputMaximum( m_MinMaxFilter->GetMaximum() );
 
diff --git a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx
index 3c910f2..3466d51 100644
--- a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx
+++ b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx
@@ -138,8 +138,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("otbVegetationIndicesFunctor, otbWaterIndicesFunctor and otbSoilIndicesFunctor classes");
 
-    AddDocTag("Radiometric Indices");
     AddDocTag(Tags::FeatureExtraction);
+	AddDocTag("Radiometric Indices");
 
     AddParameter(ParameterType_InputImage, "in", "Input Image");
     SetParameterDescription("in", "Input image");
diff --git a/Modules/Applications/AppKMZ/app/otbKmzExport.cxx b/Modules/Applications/AppKMZ/app/otbKmzExport.cxx
index e415645..c0cc931 100644
--- a/Modules/Applications/AppKMZ/app/otbKmzExport.cxx
+++ b/Modules/Applications/AppKMZ/app/otbKmzExport.cxx
@@ -53,6 +53,7 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("Conversion");
 
+	AddDocTag("Miscellaneous");
     AddDocTag("KMZ");
     AddDocTag("Export");
 
diff --git a/Modules/Applications/AppMathParser/app/otbBandMath.cxx b/Modules/Applications/AppMathParser/app/otbBandMath.cxx
index 29e5f89..48868b6 100644
--- a/Modules/Applications/AppMathParser/app/otbBandMath.cxx
+++ b/Modules/Applications/AppMathParser/app/otbBandMath.cxx
@@ -66,7 +66,7 @@ private:
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
-    AddDocTag("Util");
+    AddDocTag("Miscellaneous");
 
     AddParameter(ParameterType_InputImageList,  "il",   "Input image list");
     SetParameterDescription("il", "Image list to perform computation on.");
@@ -83,7 +83,7 @@ private:
     // Doc example parameter settings
     SetDocExampleParameterValue("il", "verySmallFSATSW_r.tif verySmallFSATSW_nir.tif verySmallFSATSW.tif");
     SetDocExampleParameterValue("out", "apTvUtBandMathOutput.tif");
-    SetDocExampleParameterValue("exp", "\"cos(im1b1) > cos(im2b1) ? im3b1 : im3b2 \"");
+    SetDocExampleParameterValue("exp", "\"cos(im1b1) > cos(im2b1) ? im3b1 : im3b2\"");
   }
 
   void DoUpdateParameters() ITK_OVERRIDE
diff --git a/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx b/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx
index 91d8c87..53884d3 100644
--- a/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx
+++ b/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx
@@ -141,7 +141,7 @@ private:
                       "Separating expressions by semi-colons (; ) will concatenate their results into a unique multiband output image. ");
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
-    AddDocTag("Util");
+    AddDocTag("Miscellaneous");
 
     AddParameter(ParameterType_InputImageList,  "il",   "Input image list");
     SetParameterDescription("il", "Image list to perform computation on.");
@@ -209,7 +209,7 @@ private:
         if (useContext)
           {
           // only set the first expression, 'ManyExpression' is disabled.
-          this->SetParameterString("exp",dummyFilter->GetExpression(0));
+          this->SetParameterString("exp",dummyFilter->GetExpression(0), false);
           }
         }
       }
diff --git a/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx b/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx
index e60b4bb..ad4c0c4 100644
--- a/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx
+++ b/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx
@@ -64,8 +64,8 @@ SetDocLimitations("None");
 SetDocAuthors("OTB-Team");
 SetDocSeeAlso("otbRadiometricMomentsImageFunction class");
 
-AddDocTag("Statistics");
 AddDocTag(Tags::FeatureExtraction);
+AddDocTag("Statistics");
 
 AddParameter(ParameterType_InputImage, "in",  "Input Image");
 SetParameterDescription("in", "The input image to compute the features on.");
diff --git a/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx b/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx
index 9e5e121..eeddd79 100644
--- a/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx
+++ b/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx
@@ -85,8 +85,8 @@ SetDocLimitations("None");
 SetDocAuthors("OTB-Team");
 SetDocSeeAlso("itkBinaryDilateImageFilter, itkBinaryErodeImageFilter, itkBinaryMorphologicalOpeningImageFilter and itkBinaryMorphologicalClosingImageFilter classes");
 
-AddDocTag("MorphologicalOperations");
 AddDocTag(Tags::FeatureExtraction);
+AddDocTag("MorphologicalOperations");
 
 AddParameter(ParameterType_InputImage, "in",  "Input Image");
 SetParameterDescription("in", "The input image to be filtered.");
diff --git a/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx b/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx
index ae025a2..bb816fc 100644
--- a/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx
+++ b/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx
@@ -85,8 +85,8 @@ SetDocLimitations("None");
 SetDocAuthors("OTB-Team");
 SetDocSeeAlso("itkGrayscaleDilateImageFilter, itkGrayscaleErodeImageFilter, itkGrayscaleMorphologicalOpeningImageFilter and itkGrayscaleMorphologicalClosingImageFilter classes");
 
-AddDocTag("MorphologicalOperations");
 AddDocTag(Tags::FeatureExtraction);
+AddDocTag("MorphologicalOperations");
 
 AddParameter(ParameterType_InputImage, "in",  "Input Image");
 SetParameterDescription("in", "The input image to be filtered.");
diff --git a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
index 10004ff..52dd349 100644
--- a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
+++ b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
@@ -194,7 +194,7 @@ private:
     AddChoice("level.toa",     "Image to Top Of Atmosphere reflectance");
     AddChoice("level.toatoim",     "TOA reflectance to Image");
     AddChoice("level.toc",     "Image to Top Of Canopy reflectance (atmospheric corrections)");
-    SetParameterString("level", "toa");
+    SetParameterString("level", "toa", false);
 
     AddParameter(ParameterType_Empty, "milli", "Convert to milli reflectance");
     SetParameterDescription("milli", "Flag to use milli-reflectance instead of reflectance.\n"
@@ -424,21 +424,21 @@ private:
              ossOutput << "Acquisition Minute already set by user: no overload" <<std::endl;
            else
            {
-             SetParameterInt("acqui.minute", lImageMetadataInterface->GetMinute());
+             SetParameterInt("acqui.minute",lImageMetadataInterface->GetMinute(), false);
            }
 
            if (HasUserValue("acqui.hour"))
              ossOutput << "Acquisition Hour already set by user: no overload" <<std::endl;
            else
            {
-             SetParameterInt("acqui.hour", lImageMetadataInterface->GetHour());
+             SetParameterInt("acqui.hour",lImageMetadataInterface->GetHour(), false);
            }
 
            if (HasUserValue("acqui.day"))
              ossOutput << "Acquisition Day already set by user: no overload" <<std::endl;
            else
            {
-             SetParameterInt("acqui.day", lImageMetadataInterface->GetDay());
+             SetParameterInt("acqui.day",lImageMetadataInterface->GetDay(), false);
              if (IsParameterEnabled("acqui.fluxnormcoeff"))
                DisableParameter("acqui.day");
            }
@@ -447,7 +447,7 @@ private:
              ossOutput << "Acquisition Month already set by user: no overload" <<std::endl;
            else
            {
-             SetParameterInt("acqui.month", lImageMetadataInterface->GetMonth());
+             SetParameterInt("acqui.month",lImageMetadataInterface->GetMonth(), false);
              if (IsParameterEnabled("acqui.fluxnormcoeff"))
                DisableParameter("acqui.month");
            }
@@ -456,28 +456,28 @@ private:
              ossOutput << "Acquisition Year already set by user: no overload" <<std::endl;
            else
            {
-             SetParameterInt("acqui.year", lImageMetadataInterface->GetYear());
+             SetParameterInt("acqui.year",lImageMetadataInterface->GetYear(), false);
            }
 
            if (HasUserValue("acqui.sun.elev"))
              ossOutput << "Acquisition Sun Elevation Angle already set by user: no overload" <<std::endl;
            else
-             SetParameterFloat("acqui.sun.elev", lImageMetadataInterface->GetSunElevation());
+             SetParameterFloat("acqui.sun.elev",lImageMetadataInterface->GetSunElevation(), false);
 
            if (HasUserValue("acqui.sun.azim"))
              ossOutput << "Acquisition Sun Azimuth Angle already set by user: no overload" <<std::endl;
            else
-             SetParameterFloat("acqui.sun.azim", lImageMetadataInterface->GetSunAzimuth());
+             SetParameterFloat("acqui.sun.azim",lImageMetadataInterface->GetSunAzimuth(), false);
 
            if (HasUserValue("acqui.view.elev"))
              ossOutput << "Acquisition Viewing Elevation Angle already set by user: no overload" <<std::endl;
            else
-             SetParameterFloat("acqui.view.elev", lImageMetadataInterface->GetSatElevation());
+             SetParameterFloat("acqui.view.elev",lImageMetadataInterface->GetSatElevation(), false);
 
            if (HasUserValue("acqui.view.azim"))
              ossOutput << "Acquisition Viewing Azimuth Angle already set by user: no overload" <<std::endl;
            else
-             SetParameterFloat("acqui.view.azim", lImageMetadataInterface->GetSatAzimuth());
+             SetParameterFloat("acqui.view.azim",lImageMetadataInterface->GetSatAzimuth(), false);
 
            // Set default value so that they are stored somewhere even if
            // they are overloaded by user values
@@ -823,12 +823,14 @@ private:
           {
           otbAppLogWARNING("No relative spectral response found, using "
                            "default response (constant between 0.3 and 1.0µm)");
-          AcquiCorrectionParametersType::WavelengthSpectralBandVectorType spectralDummy;
+          AcquiCorrectionParametersType::WavelengthSpectralBandVectorType spectralDummy =
+                  AcquiCorrectionParametersType::InternalWavelengthSpectralBandVectorType::New();
           spectralDummy->Clear();
           for (unsigned int i = 0; i < inImage->GetNumberOfComponentsPerPixel(); ++i)
             {
               spectralDummy->PushBack(FilterFunctionValues::New());
             }
+          m_paramAcqui->SetWavelengthSpectralBand(spectralDummy);
           }
 
         // Aeronet file
diff --git a/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx
index 5dd1cdd..819b035 100644
--- a/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx
+++ b/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx
@@ -59,8 +59,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag(Tags::Coordinates);
     AddDocTag(Tags::Geometry);
+	AddDocTag(Tags::Coordinates);
 
     AddParameter(ParameterType_Group, "carto", "Input cartographic coordinates");
     AddParameter(ParameterType_Float, "carto.x", "X cartographic coordinates");
@@ -117,8 +117,8 @@ private:
     otbAppLogINFO( << std::setprecision(10) << "Geographic   Point (Long, Lat) : (" << geoPoint[0] << ", " <<  geoPoint[1] << ")" );
 
 
-    SetParameterFloat( "long", geoPoint[0] );
-    SetParameterFloat( "lat", geoPoint[1] );
+    SetParameterFloat( "long",geoPoint[0] , false);
+    SetParameterFloat( "lat",geoPoint[1] , false);
   }
 };
 
diff --git a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx
index 3b3140b..be3f19a 100644
--- a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx
+++ b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx
@@ -125,8 +125,8 @@ private:
     outputPoint = model->TransformPoint(point);
 
     // Set the value computed
-    SetParameterFloat("output.idx", outputPoint[0]);
-    SetParameterFloat("output.idy", outputPoint[1]);
+    SetParameterFloat("output.idx",outputPoint[0], false);
+    SetParameterFloat("output.idy",outputPoint[1], false);
 
     // Set the town and the neaerest city
     CoordinateToName::Pointer coord2name = CoordinateToName::New();
@@ -134,8 +134,8 @@ private:
     coord2name->SetLat(outputPoint[1]);
     coord2name->Evaluate();
 
-    SetParameterString("output.town", coord2name->GetPlaceName());
-    SetParameterString("output.country", coord2name->GetCountryName());
+    SetParameterString("output.town", coord2name->GetPlaceName(), false);
+    SetParameterString("output.country", coord2name->GetCountryName(), false);
   }
 
 };
diff --git a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
index be181eb..f640e07 100644
--- a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
+++ b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
@@ -60,7 +60,13 @@ private:
     SetDescription("Generate a RPC sensor model from a list of Ground Control Points.");
 
     SetDocName("Generate a RPC sensor model");
-    SetDocLongDescription("This application generates a RPC sensor model from a list of Ground Control Points. At least 20 points are required for estimation wihtout elevation support, and 40 points for estimation with elevation support. Elevation support will be automatically deactivated if an insufficient amount of points is provided. The application can optionnaly output a file containing accuracy statistics for each point, and a vector file containing segments represening points resi [...]
+    SetDocLongDescription( "This application generates a RPC sensor model from a list of Ground Control Points. "
+                                   "At least 20 points are required for estimation without elevation support, "
+                                   "and 40 points for estimation with elevation support. "
+                                   "Elevation support will be automatically deactivated if an insufficient amount of points is provided. "
+                                   "The application can optionally output a file containing accuracy statistics for each point,"
+                                   " and a vector file containing segments representing points residues. "
+                                   "The map projection parameter allows defining a map projection in which the accuracy is evaluated." );
 
     AddDocTag(Tags::Geometry);
 
@@ -72,7 +78,7 @@ private:
     SetParameterDescription("outgeom","Geom file containing the generated RPC sensor model");
 
     AddParameter(ParameterType_InputFilename,"inpoints","Input file containing tie points");
-    SetParameterDescription("inpoints","Input file containing tie points. Points are stored in following format: col row lon lat. Line beginning with # are ignored.");
+    SetParameterDescription("inpoints","Input file containing tie points. Points are stored in following format: col row lon lat. Spaced by a space or tab character. Line beginning with # are ignored.");
 
     AddParameter(ParameterType_OutputFilename,"outstat","Output file containing output precision statistics");
     SetParameterDescription("outstat","Output file containing the following info: ref_lon ref_lat elevation predicted_lon predicted_lat x_error_ref(meters) y_error_ref(meters) global_error_ref(meters) x_error(meters) y_error(meters) overall_error(meters)");
@@ -125,20 +131,8 @@ private:
     // Avoid commented lines or too short ones
     if (!line.empty() && line[0] != '#')
       {
-      // retrieve the x component
-      std::string::size_type pos = 0;
-      std::string::size_type nextpos = line.find_first_of("\t", pos);
-      x = atof(line.substr(pos, nextpos).c_str());
-      pos = nextpos + 1;
-      nextpos = line.find_first_of("\t", pos);
-      y = atof(line.substr(pos, nextpos).c_str());
-      pos = nextpos + 1;
-      nextpos = line.find_first_of("\t", pos);
-      lon = atof(line.substr(pos, nextpos).c_str());
-      pos = nextpos + 1;
-      nextpos = line.find_first_of("\t", pos);
-      lat = atof(line.substr(pos, nextpos).c_str());
-
+      std::istringstream iss(line);
+      iss >> x >> y >> lon >> lat;
       z = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(lon,lat);
 
       otbAppLogINFO("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat);
diff --git a/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx b/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx
index 5d782b3..5a3286c 100644
--- a/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx
+++ b/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx
@@ -170,7 +170,7 @@ private:
     AddParameter(ParameterType_Radius, "interpolator.bco.radius", "Radius for bicubic interpolation");
     SetParameterDescription("interpolator.bco.radius","This parameter allows controlling the size of the bicubic interpolation filter. If the target pixel size is higher than the input pixel size, increasing this parameter will reduce aliasing artifacts.");
     SetDefaultParameterInt("interpolator.bco.radius", 2);
-    SetParameterString("interpolator","bco");
+    SetParameterString("interpolator","bco", false);
 
     AddRAMParameter();
 
diff --git a/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx
index e411fa3..acfb902 100644
--- a/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx
+++ b/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx
@@ -61,6 +61,7 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
+	AddDocTag("Miscellaneous");
     AddDocTag(Tags::Coordinates);
 
     AddParameter(ParameterType_Float,  "lat", "Latitude");
@@ -88,7 +89,7 @@ private:
   {
     int utmZone = otb::Utils::GetZoneFromGeoPoint(GetParameterFloat("lon"),
                                                   GetParameterFloat("lat"));
-    SetParameterInt("utm", utmZone);
+    SetParameterInt("utm",utmZone, false);
   }
 
 };
diff --git a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx
index e941684..4e0b6b5 100644
--- a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx
+++ b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx
@@ -235,6 +235,11 @@ private:
   {
     if (HasValue("io.in"))
       {
+
+      // Clear and reset the DEM Handler
+      otb::DEMHandler::Instance()->ClearDEMs();
+      otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
+
       // input image
       FloatVectorImageType::Pointer inImage = GetParameterImage("io.in");
 
@@ -263,28 +268,28 @@ private:
 
       // Fill the Gui with the computed parameters
       if (!HasUserValue("outputs.sizex"))
-        SetParameterInt("outputs.sizex", genericRSEstimator->GetOutputSize()[0]);
+        SetParameterInt("outputs.sizex",genericRSEstimator->GetOutputSize()[0], false);
 
       if (!HasUserValue("outputs.sizey"))
-        SetParameterInt("outputs.sizey", genericRSEstimator->GetOutputSize()[1]);
+        SetParameterInt("outputs.sizey",genericRSEstimator->GetOutputSize()[1], false);
 
       if (!HasUserValue("outputs.spacingx"))
-        SetParameterFloat("outputs.spacingx", genericRSEstimator->GetOutputSpacing()[0]);
+        SetParameterFloat("outputs.spacingx",genericRSEstimator->GetOutputSpacing()[0], false);
 
       if (!HasUserValue("outputs.spacingy"))
-        SetParameterFloat("outputs.spacingy", genericRSEstimator->GetOutputSpacing()[1]);
+        SetParameterFloat("outputs.spacingy",genericRSEstimator->GetOutputSpacing()[1], false);
 
       if (!HasUserValue("outputs.ulx"))
-        SetParameterFloat("outputs.ulx", genericRSEstimator->GetOutputOrigin()[0] - 0.5 * genericRSEstimator->GetOutputSpacing()[0]);
+        SetParameterFloat("outputs.ulx",genericRSEstimator->GetOutputOrigin()[0] - 0.5 * genericRSEstimator->GetOutputSpacing()[0], false);
 
       if (!HasUserValue("outputs.uly"))
-        SetParameterFloat("outputs.uly", genericRSEstimator->GetOutputOrigin()[1] - 0.5 * genericRSEstimator->GetOutputSpacing()[1]);
+        SetParameterFloat("outputs.uly",genericRSEstimator->GetOutputOrigin()[1] - 0.5 * genericRSEstimator->GetOutputSpacing()[1], false);
 
       if (!HasUserValue("outputs.lrx"))
-       SetParameterFloat("outputs.lrx", GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")));
+       SetParameterFloat("outputs.lrx",GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")), false);
 
       if (!HasUserValue("outputs.lry"))
-       SetParameterFloat("outputs.lry", GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")));
+       SetParameterFloat("outputs.lry",GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")), false);
 
       // Handle the spacing and size field following the mode
       // chose by the user
@@ -325,8 +330,8 @@ private:
         MandatoryOff("outputs.ortho");
 
         // Update lower right
-        SetParameterFloat("outputs.lrx", GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")));
-        SetParameterFloat("outputs.lry", GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")));
+        SetParameterFloat("outputs.lrx",GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")), false);
+        SetParameterFloat("outputs.lry",GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")), false);
         }
         break;
         case Mode_AutomaticSize:
@@ -371,16 +376,16 @@ private:
         genericRSEstimator->Compute();
 
         // Set the  processed size relative to this forced spacing
-        SetParameterInt("outputs.sizex", genericRSEstimator->GetOutputSize()[0]);
-        SetParameterInt("outputs.sizey", genericRSEstimator->GetOutputSize()[1]);
+        SetParameterInt("outputs.sizex",genericRSEstimator->GetOutputSize()[0], false);
+        SetParameterInt("outputs.sizey",genericRSEstimator->GetOutputSize()[1], false);
 
         // Reset Origin to default
-        SetParameterFloat("outputs.ulx", genericRSEstimator->GetOutputOrigin()[0] - 0.5 * genericRSEstimator->GetOutputSpacing()[0]);
-        SetParameterFloat("outputs.uly", genericRSEstimator->GetOutputOrigin()[1] - 0.5 * genericRSEstimator->GetOutputSpacing()[1]);
+        SetParameterFloat("outputs.ulx",genericRSEstimator->GetOutputOrigin()[0] - 0.5 * genericRSEstimator->GetOutputSpacing()[0], false);
+        SetParameterFloat("outputs.uly",genericRSEstimator->GetOutputOrigin()[1] - 0.5 * genericRSEstimator->GetOutputSpacing()[1], false);
 
         // Update lower right
-        SetParameterFloat("outputs.lrx", GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")));
-        SetParameterFloat("outputs.lry", GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")));
+        SetParameterFloat("outputs.lrx",GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")), false);
+        SetParameterFloat("outputs.lry",GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")), false);
         }
         break;
         case Mode_AutomaticSpacing:
@@ -425,16 +430,16 @@ private:
         genericRSEstimator->Compute();
 
         // Set the  processed spacing relative to this forced size
-        SetParameterFloat("outputs.spacingx", genericRSEstimator->GetOutputSpacing()[0]);
-        SetParameterFloat("outputs.spacingy", genericRSEstimator->GetOutputSpacing()[1]);
+        SetParameterFloat("outputs.spacingx",genericRSEstimator->GetOutputSpacing()[0], false);
+        SetParameterFloat("outputs.spacingy",genericRSEstimator->GetOutputSpacing()[1], false);
 
         // Reset Origin to default
-        SetParameterFloat("outputs.ulx", genericRSEstimator->GetOutputOrigin()[0] - 0.5 * genericRSEstimator->GetOutputSpacing()[0]);
-        SetParameterFloat("outputs.uly", genericRSEstimator->GetOutputOrigin()[1] - 0.5 * genericRSEstimator->GetOutputSpacing()[1]);
+        SetParameterFloat("outputs.ulx",genericRSEstimator->GetOutputOrigin()[0] - 0.5 * genericRSEstimator->GetOutputSpacing()[0], false);
+        SetParameterFloat("outputs.uly",genericRSEstimator->GetOutputOrigin()[1] - 0.5 * genericRSEstimator->GetOutputSpacing()[1], false);
 
         // Update lower right
-        SetParameterFloat("outputs.lrx", GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")));
-        SetParameterFloat("outputs.lry", GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")));
+        SetParameterFloat("outputs.lrx",GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")), false);
+        SetParameterFloat("outputs.lry",GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")), false);
 
         }
         break;
@@ -478,9 +483,9 @@ private:
 
           // Set the  processed size relative to this forced spacing
           if (vcl_abs(spacing[0]) > 0.0)
-            SetParameterInt("outputs.sizex", static_cast<int>(vcl_ceil((GetParameterFloat("outputs.lrx")-GetParameterFloat("outputs.ulx"))/spacing[0])));
+            SetParameterInt("outputs.sizex",static_cast<int>(vcl_ceil((GetParameterFloat("outputs.lrx")-GetParameterFloat("outputs.ulx"))/spacing[0])), false);
           if (vcl_abs(spacing[1]) > 0.0)
-            SetParameterInt("outputs.sizey", static_cast<int>(vcl_ceil((GetParameterFloat("outputs.lry")-GetParameterFloat("outputs.uly"))/spacing[1])));
+            SetParameterInt("outputs.sizey",static_cast<int>(vcl_ceil((GetParameterFloat("outputs.lry")-GetParameterFloat("outputs.uly"))/spacing[1])), false);
         }
         break;
         case Mode_OrthoFit:
@@ -530,11 +535,11 @@ private:
             SetParameterInt("outputs.sizey",size[1]);
             SetParameterFloat("outputs.spacingx",spacing[0]);
             SetParameterFloat("outputs.spacingy",spacing[1]);
-            SetParameterFloat("outputs.ulx", orig[0] - 0.5 * spacing[0]);
-            SetParameterFloat("outputs.uly", orig[1] - 0.5 * spacing[1]);
+            SetParameterFloat("outputs.ulx",orig[0] - 0.5 * spacing[0], false);
+            SetParameterFloat("outputs.uly",orig[1] - 0.5 * spacing[1], false);
             // Update lower right
-            SetParameterFloat("outputs.lrx", GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")));
-            SetParameterFloat("outputs.lry", GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")));
+            SetParameterFloat("outputs.lrx",GetParameterFloat("outputs.ulx") + GetParameterFloat("outputs.spacingx") * static_cast<double>(GetParameterInt("outputs.sizex")), false);
+            SetParameterFloat("outputs.lry",GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")), false);
           }
         }
         break;
@@ -580,11 +585,11 @@ private:
           // Use the smallest spacing (more precise grid)
           double optimalSpacing = std::min( vcl_abs(xgridspacing), vcl_abs(ygridspacing) );
           otbAppLogINFO( "Setting grid spacing to " << optimalSpacing );
-          SetParameterFloat("opt.gridspacing", optimalSpacing);
+          SetParameterFloat("opt.gridspacing",optimalSpacing, false);
           }
         else // if (m_OutputProjectionRef == otb::GeoInformationConversion::ToWKT(4326))
           {
-          SetParameterFloat("opt.gridspacing", DefaultGridSpacingMeter);
+          SetParameterFloat("opt.gridspacing",DefaultGridSpacingMeter, false);
           } // if (m_OutputProjectionRef == otb::GeoInformationConversion::ToWKT(4326))
         } // if (!HasUserValue("opt.gridspacing"))
       } // if (HasValue("io.in"))
@@ -645,9 +650,6 @@ private:
       break;
       }
 
-    // Setup the DEM Handler
-    otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
-
     // If activated, generate RPC model
     if(IsParameterEnabled("opt.rpc"))
       {
@@ -692,11 +694,16 @@ private:
 
       otbAppLogINFO("Using a deformation grid with a physical spacing of " << GetParameterFloat("opt.gridspacing"));
 
+      if ( GetParameterFloat( "opt.gridspacing" ) == 0 )
+        {
+        otbAppLogFATAL( "opt.gridspacing must be different from 0 " );
+        }
+
       // Predict size of deformation grid
-      ResampleFilterType::SizeType deformationGridSize;
-      deformationGridSize[0] = static_cast<ResampleFilterType::SizeType::SizeValueType>(vcl_abs(
+      ResampleFilterType::SpacingType deformationGridSize;
+      deformationGridSize[0] = static_cast<ResampleFilterType::SpacingType::ValueType >(vcl_abs(
           GetParameterInt("outputs.sizex") * GetParameterFloat("outputs.spacingx") / GetParameterFloat("opt.gridspacing") ));
-      deformationGridSize[1] = static_cast<ResampleFilterType::SizeType::SizeValueType>(vcl_abs(
+      deformationGridSize[1] = static_cast<ResampleFilterType::SpacingType::ValueType>(vcl_abs(
           GetParameterInt("outputs.sizey") * GetParameterFloat("outputs.spacingy") / GetParameterFloat("opt.gridspacing") ));
       otbAppLogINFO("Using a deformation grid of size " << deformationGridSize);
 
diff --git a/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx b/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx
index 2bdaa25..c3bd9e3 100644
--- a/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx
+++ b/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx
@@ -89,8 +89,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("Translation");
 
+	AddDocTag(Tags::Geometry);
     AddDocTag("Conversion");
-    AddDocTag(Tags::Geometry);
 
     AddParameter(ParameterType_InputImage,   "in",   "Input image");
     SetParameterDescription("in","The input image to translate.");
@@ -156,7 +156,7 @@ private:
     AddParameter(ParameterType_Radius, "interpolator.bco.radius", "Radius for bicubic interpolation");
     SetParameterDescription("interpolator.bco.radius","This parameter allows controlling the size of the bicubic interpolation filter. If the target pixel size is higher than the input pixel size, increasing this parameter will reduce aliasing artifacts.");
     SetDefaultParameterInt("interpolator.bco.radius", 2);
-    SetParameterString("interpolator","bco");
+    SetParameterString("interpolator","bco", false);
 
     // RAM available
     AddRAMParameter("ram");
@@ -194,6 +194,7 @@ private:
                                                   double>          LinearInterpolationType;
       LinearInterpolationType::Pointer interpolator = LinearInterpolationType::New();
       m_Resampler->SetInterpolator(interpolator);
+      m_GridResampler->SetInterpolator(interpolator);
       }
       break;
       case Interpolator_NNeighbor:
@@ -202,6 +203,7 @@ private:
                                                            double> NearestNeighborInterpolationType;
       NearestNeighborInterpolationType::Pointer interpolator = NearestNeighborInterpolationType::New();
       m_Resampler->SetInterpolator(interpolator);
+      m_GridResampler->SetInterpolator(interpolator);
       }
       break;
       case Interpolator_BCO:
@@ -210,6 +212,7 @@ private:
       BCOInterpolationType::Pointer interpolator = BCOInterpolationType::New();
       interpolator->SetRadius(GetParameterInt("interpolator.bco.radius"));
       m_Resampler->SetInterpolator(interpolator);
+      m_GridResampler->SetInterpolator(interpolator);
       }
       break;
       }
diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
index 3293c3a..71cb750 100644
--- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
+++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
@@ -104,8 +104,14 @@ private:
     AddParameter(ParameterType_Float,        "lms",   "Spacing of the deformation field");
     SetParameterDescription("lms","Generate a coarser deformation field with the given spacing");
     SetDefaultParameterFloat("lms", 4.);
+    DisableParameter("lms");
     MandatoryOff("lms");
 
+    AddParameter(ParameterType_Float, "fv", "Fill Value");
+    SetParameterDescription("fv","Fill value for area outside the reprojected image");
+    SetDefaultParameterFloat("fv", 0.);
+    MandatoryOff("fv");
+
     AddParameter(ParameterType_OutputImage,  "out",   "Output image");
     SetParameterDescription("out","Output reprojected image.");
 
@@ -153,7 +159,7 @@ private:
     if(!HasUserValue("mode") && HasValue("inr") && HasValue("inm") && otb::PleiadesPToXSAffineTransformCalculator::CanCompute(GetParameterImage("inr"),GetParameterImage("inm")))
       {
       otbAppLogWARNING("Forcing PHR mode with PHR data. You need to add \"-mode default\" to force the default mode with PHR images.");
-      SetParameterString("mode","phr");
+      SetParameterString("mode","phr", false);
       }
   }
 
@@ -210,24 +216,28 @@ private:
     
     FloatVectorImageType::PixelType defaultValue;
     itk::NumericTraits<FloatVectorImageType::PixelType>::SetLength(defaultValue, movingImage->GetNumberOfComponentsPerPixel());
+    defaultValue.Fill(GetParameterFloat("fv"));
 
-    
     if(GetParameterString("mode")=="default")
       {
+      FloatVectorImageType::SpacingType defSpacing;
       if(IsParameterEnabled("lms"))
         {
         float defScalarSpacing = vcl_abs(GetParameterFloat("lms"));
         otbAppLogDEBUG("Generating coarse deformation field (spacing="<<defScalarSpacing<<")");
-        FloatVectorImageType::SpacingType defSpacing;
 
         defSpacing[0] = defScalarSpacing;
         defSpacing[1] = defScalarSpacing;
 
         if (spacing[0]<0.0) defSpacing[0] *= -1.0;
         if (spacing[1]<0.0) defSpacing[1] *= -1.0;
-
-        m_Resampler->SetDisplacementFieldSpacing(defSpacing);
         }
+      else
+        {
+        defSpacing[0]=10*spacing[0];
+        defSpacing[1]=10*spacing[1];
+        }
+      m_Resampler->SetDisplacementFieldSpacing(defSpacing);
       
       // Setup transform through projRef and Keywordlist
       m_Resampler->SetInputKeywordList(movingImage->GetImageKeywordlist());
diff --git a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx
index 3b4cdde..5b0992e 100644
--- a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx
+++ b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx
@@ -75,8 +75,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag(Tags::Geometry);
     AddDocTag(Tags::Vector);
+    AddDocTag(Tags::Geometry);	
     AddDocTag(Tags::Coordinates);
 
     // Set the parameters
diff --git a/Modules/Applications/AppProjection/test/CMakeLists.txt b/Modules/Applications/AppProjection/test/CMakeLists.txt
index bff0484..81eea8e 100644
--- a/Modules/Applications/AppProjection/test/CMakeLists.txt
+++ b/Modules/Applications/AppProjection/test/CMakeLists.txt
@@ -320,6 +320,7 @@ otb_test_application(NAME apTvPrSuperimpose
                              -inm ${INPUTDATA}/QB_Toulouse_Ortho_XS_ROI_170x230.tif
                              -elev.dem ${INPUTDATA}/DEM/srtm_directory
                              -out ${TEMP}/apTvPrSuperimpose.tif int16
+                             -lms 4.0
                      VALID  --compare-image ${EPSILON_7}
                         ${BASELINE}/apTvPrSuperimpose.tif
                         ${TEMP}/apTvPrSuperimpose.tif)
diff --git a/Modules/Applications/AppSARCalibration/test/CMakeLists.txt b/Modules/Applications/AppSARCalibration/test/CMakeLists.txt
index 585c4d1..dfceda5 100644
--- a/Modules/Applications/AppSARCalibration/test/CMakeLists.txt
+++ b/Modules/Applications/AppSARCalibration/test/CMakeLists.txt
@@ -2,12 +2,22 @@ otb_module_test()
 #----------- SarRadiometricCalibration TESTS ----------------
 otb_test_application(NAME apTvRaSarRadiometricCalibration_SENTINEL1
   APP  SARCalibration
-  OPTIONS -in ${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_300_300.tif?&geom=${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_300_300.geom
+  OPTIONS -in ${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_1200_1100_300_300.tiff?&geom=${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_1200_1100_300_300.geom
   -out ${TEMP}/apTvRaSarRadiometricCalibration_SENTINEL1.tif
   VALID   --compare-image ${NOTOL}
   ${BASELINE}/raTvSarRadiometricCalibration_SENTINEL1.tif
   ${TEMP}/apTvRaSarRadiometricCalibration_SENTINEL1.tif )
 
+if(OTB_DATA_USE_LARGEINPUT)
+  otb_test_application(NAME apTvRaSarRadiometricCalibration_SENTINEL1_PRODUCT_INPUT
+    APP  SARCalibration
+    OPTIONS -in  LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff}
+    -out "${TEMP}/apTvRaSarRadiometricCalibration_SENTINEL1_PRODUCT_INPUT.tif?box=1200:1100:256:256"
+    VALID   --compare-image ${NOTOL}
+    ${BASELINE}/raTvSarRadiometricCalibration_SENTINEL1_PRODUCT_INPUT.tif
+    ${TEMP}/apTvRaSarRadiometricCalibration_SENTINEL1_PRODUCT_INPUT.tif )
+endif()
+
 otb_test_application(NAME apTvRaSarRadiometricCalibration_RADARSAT2
   APP  SARCalibration
   OPTIONS -in ${INPUTDATA}/RADARSAT2_ALTONA_300_300_VV.tif?&geom=${INPUTDATA}/RADARSAT2_ALTONA_300_300_VV.geom
diff --git a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx
index 1c4e307..d6bf04c 100644
--- a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx
@@ -76,8 +76,8 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
-    AddDocTag(Tags::Analysis);
     AddDocTag(Tags::Segmentation);
+	AddDocTag(Tags::Analysis);	
 
     AddParameter(ParameterType_InputImage, "in", "Input Image");
     SetParameterDescription("in", "The image to segment.");
diff --git a/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx
index d8224db..14fce99 100644
--- a/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx
@@ -292,10 +292,10 @@ private:
 
     m_InstanceFilter->Update();
 
-    SetParameterFloat("rc", m_InstanceFilter->GetMeanRC());
-    SetParameterFloat("rf", m_InstanceFilter->GetMeanRF());
-    SetParameterFloat("ra", m_InstanceFilter->GetMeanRA());
-    SetParameterFloat("rm", m_InstanceFilter->GetMeanRM());
+    SetParameterFloat("rc",m_InstanceFilter->GetMeanRC(), false);
+    SetParameterFloat("rf",m_InstanceFilter->GetMeanRF(), false);
+    SetParameterFloat("ra",m_InstanceFilter->GetMeanRA(), false);
+    SetParameterFloat("rm",m_InstanceFilter->GetMeanRM(), false);
   }
 
   ImageToLabelMapFilterType::Pointer m_GTFilter;
diff --git a/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx b/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx
index c69ec3f..fc92d2c 100644
--- a/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx
@@ -101,7 +101,7 @@ private:
 
     AddParameter(ParameterType_Empty, "modesearch", "Mode search.");
     SetParameterDescription("modesearch", "If activated pixel iterative convergence is stopped if the path crosses an already converged pixel. Be careful, with this option, the result will slightly depend on thread number");
-    EnableParameter("modesearch");
+    DisableParameter("modesearch");
 
 
     // Doc example parameter settings
diff --git a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx
index 4234666..6454b13 100644
--- a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx
@@ -305,11 +305,11 @@ private:
 
     AddParameter(ParameterType_String, "mode.vector.layername", "Layer name");
     SetParameterDescription("mode.vector.layername", "Name of the layer in the vector file or database (default is Layer).");
-    SetParameterString("mode.vector.layername", "layer");
+    SetParameterString("mode.vector.layername", "layer", false);
 
     AddParameter(ParameterType_String, "mode.vector.fieldname", "Geometry index field name");
     SetParameterDescription("mode.vector.fieldname", "Name of the field holding the geometry index in the output vector file or database.");
-    SetParameterString("mode.vector.fieldname", "DN");
+    SetParameterString("mode.vector.fieldname", "DN", false);
 
     AddParameter(ParameterType_Int, "mode.vector.tilesize", "Tiles size");
     SetParameterDescription("mode.vector.tilesize",
diff --git a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx
index 1b18dc5..e4c4e03 100644
--- a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx
+++ b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx
@@ -346,7 +346,7 @@ private:
     SetParameterDescription("input.co","List of index of couples im image list. Couples must be separated by a comma. (index start at 0). for example : 0 1,1 2 will process a first couple composed of the first and the second image in image list, then the first and the third image\n. note that images are handled by pairs."
         " if left empty couples are created from input index i.e. a first couple will be composed of the first and second image, a second couple with third and fourth image etc. (in this case image list must be even).");
     MandatoryOff("input.co");
-    SetParameterString("input.co","");
+    SetParameterString("input.co","", false);
     DisableParameter("input.co");
 
     AddParameter(ParameterType_Int,  "input.channel",   "Image channel used for the block matching");
@@ -363,7 +363,7 @@ private:
     // // Build the Output Map Projection
     // for custom map projection
     MapProjectionParametersHandler::AddMapProjectionParameters(this, "map");
-    SetParameterString("map","wgs");
+    SetParameterString("map","wgs", false);
 
     AddParameter(ParameterType_Float, "output.res","Output resolution");
     SetParameterDescription("output.res","Spatial sampling distance of the output elevation : the cell size (in m)");
diff --git a/Modules/Applications/AppTest/app/otbTestApplication.cxx b/Modules/Applications/AppTest/app/otbTestApplication.cxx
index e1bfd32..314f244 100644
--- a/Modules/Applications/AppTest/app/otbTestApplication.cxx
+++ b/Modules/Applications/AppTest/app/otbTestApplication.cxx
@@ -87,8 +87,8 @@ private:
     MandatoryOff("il");
 
     AddParameter(ParameterType_ListView,  "cl", "Output Image channels");
-    AddChoice("cl.choice1", "cl.choice1");
-    AddChoice("cl.choice2", "cl.choice2");
+    AddChoice("cl.choice1", "Choice1");
+    AddChoice("cl.choice2", "Choice2");
     MandatoryOff("cl");
 
     AddParameter(ParameterType_ComplexInputImage,  "cin", "Input Complex Image");
@@ -106,6 +106,9 @@ private:
 
   void DoExecute() ITK_OVERRIDE
   {
+    FloatVectorImageListType* imgList = GetParameterImageList("il");
+    SetParameterOutputImage("outgroup.outputimage", imgList->GetNthElement(0));
+    SetParameterComplexOutputImage("cout", GetParameterComplexImage("cin"));
     //std::cout << "TestApplication::DoExecute" << std::endl;
   }
 };
diff --git a/Modules/Applications/AppTest/test/CMakeLists.txt b/Modules/Applications/AppTest/test/CMakeLists.txt
index e9dadfc..ac83baa 100644
--- a/Modules/Applications/AppTest/test/CMakeLists.txt
+++ b/Modules/Applications/AppTest/test/CMakeLists.txt
@@ -12,3 +12,26 @@ otb_module_target_label(otbAppTestTestDriver)
 
 otb_add_test(NAME apCheckDocumentation COMMAND otbAppTestTestDriver
   otbWrapperApplicationDocTest ${OTB_BINARY_DIR}/lib/otb/applications)
+
+otb_test_application(NAME apTvTestApplicationOutputXML_All
+  APP TestApplication
+  OPTIONS -boolean 1
+          -int 2
+          -float -0.7
+          -string foo
+          -filename ${INPUTDATA}/letter.scale
+          -outfilename ${TEMP}/foo.txt
+          -directory ${INPUTDATA}/world_boundaries
+          -choice.choice1.floatchoice1 6.4e5
+          -ingroup.integer 4
+          -outgroup.outputimage ${TEMP}/foo.tif double
+          -il ${INPUTDATA}/anaglyphInput1.tif ${INPUTDATA}/anaglyphInput2.tif
+          -cl Choice2
+          -cin ${INPUTDATA}/RADARSAT2_ALTONA_300_300_VV.tif
+          -cout ${TEMP}/fooCplx.tif
+          -outxml ${TEMP}/apTvTestApplicationOutputXML_All.xml
+  VALID --compare-ascii ${NOTOL}
+    ${OTBAPP_BASELINE_FILES}/apTvTestApplicationOutputXML_All.xml
+    ${TEMP}/apTvTestApplicationOutputXML_All.xml
+    --ignore-lines-with 8 letter.scale foo.txt world_boundaries foo.tif anaglyphInput1.tif anaglyphInput2.tif RADARSAT2_ALTONA_300_300_VV.tif <version>
+  )
diff --git a/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx b/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx
index 1fbaf04..4393937 100644
--- a/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx
+++ b/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx
@@ -145,6 +145,7 @@ int otbWrapperApplicationDocTest(int argc, char* argv[])
         }
       }
     }
+  ApplicationRegistry::CleanRegistry();
 
   if( !isOK )
     return EXIT_FAILURE;
diff --git a/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx b/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx
index fa14c6d..e007a45 100644
--- a/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx
+++ b/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx
@@ -76,8 +76,8 @@ SetDocLimitations("None");
 SetDocAuthors("OTB-Team");
 SetDocSeeAlso("otbScalarImageToTexturesFilter, otbScalarImageToAdvancedTexturesFilter and otbScalarImageToHigherOrderTexturesFilter classes");
 
-AddDocTag("Textures");
 AddDocTag(Tags::FeatureExtraction);
+AddDocTag("Textures");
 
 AddParameter(ParameterType_InputImage, "in",  "Input Image");
 SetParameterDescription("in", "The input image to compute the features on.");
@@ -87,6 +87,13 @@ SetParameterDescription("channel", "The selected channel index");
 SetDefaultParameterInt("channel", 1);
 SetMinimumParameterIntValue("channel", 1);
 
+AddParameter(ParameterType_Int, "step", "Computation step");
+SetParameterDescription("step", "Step (in pixels) to compute output texture values."
+  " The first computed pixel position is shifted by (step-1)/2 in both directions.");
+SetDefaultParameterInt("step", 1);
+SetMinimumParameterIntValue("step", 1);
+MandatoryOff("step");
+
 AddRAMParameter();
 
 AddParameter(ParameterType_Group, "parameters", "Texture feature parameters");
@@ -180,6 +187,12 @@ void DoExecute() ITK_OVERRIDE
   offset[0] = GetParameterInt("parameters.xoff");
   offset[1] = GetParameterInt("parameters.yoff");
 
+  RadiusType stepping;
+  stepping.Fill(GetParameterInt("step"));
+
+  OffsetType stepOffset;
+  stepOffset.Fill((GetParameterInt("step") - 1) / 2);
+
   m_ExtractorFilter = ExtractorFilterType::New();
   m_ExtractorFilter->SetInput(inImage);
   m_ExtractorFilter->SetStartX(inImage->GetLargestPossibleRegion().GetIndex(0));
@@ -214,6 +227,8 @@ void DoExecute() ITK_OVERRIDE
     m_HarTexFilter->SetInputImageMinimum(GetParameterFloat("parameters.min"));
     m_HarTexFilter->SetInputImageMaximum(GetParameterFloat("parameters.max"));
     m_HarTexFilter->SetNumberOfBinsPerAxis(GetParameterInt("parameters.nbbin"));
+    m_HarTexFilter->SetSubsampleFactor(stepping);
+    m_HarTexFilter->SetSubsampleOffset(stepOffset);
     m_HarTexFilter->UpdateOutputInformation();
     m_HarImageList->PushBack(m_HarTexFilter->GetEnergyOutput());
     m_HarImageList->PushBack(m_HarTexFilter->GetEntropyOutput());
@@ -235,6 +250,8 @@ void DoExecute() ITK_OVERRIDE
     m_AdvTexFilter->SetInputImageMinimum(GetParameterFloat("parameters.min"));
     m_AdvTexFilter->SetInputImageMaximum(GetParameterFloat("parameters.max"));
     m_AdvTexFilter->SetNumberOfBinsPerAxis(GetParameterInt("parameters.nbbin"));
+    m_AdvTexFilter->SetSubsampleFactor(stepping);
+    m_AdvTexFilter->SetSubsampleOffset(stepOffset);
     m_AdvImageList->PushBack(m_AdvTexFilter->GetMeanOutput());
     m_AdvImageList->PushBack(m_AdvTexFilter->GetVarianceOutput());
     m_AdvImageList->PushBack(m_AdvTexFilter->GetDissimilarityOutput());
@@ -257,6 +274,8 @@ void DoExecute() ITK_OVERRIDE
     m_HigTexFilter->SetInputImageMinimum(GetParameterFloat("parameters.min"));
     m_HigTexFilter->SetInputImageMaximum(GetParameterFloat("parameters.max"));
     m_HigTexFilter->SetNumberOfBinsPerAxis(GetParameterInt("parameters.nbbin"));
+    m_HigTexFilter->SetSubsampleFactor(stepping);
+    m_HigTexFilter->SetSubsampleOffset(stepOffset);
     m_HigImageList->PushBack(m_HigTexFilter->GetShortRunEmphasisOutput());
     m_HigImageList->PushBack(m_HigTexFilter->GetLongRunEmphasisOutput());
     m_HigImageList->PushBack(m_HigTexFilter->GetGreyLevelNonuniformityOutput());
diff --git a/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx b/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx
index 3fe88a9..a415efc 100644
--- a/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx
+++ b/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx
@@ -67,8 +67,8 @@ SetDocLimitations("None");
 SetDocAuthors("OTB-Team");
 SetDocSeeAlso("otbSFSTexturesImageFilter class");
 
-AddDocTag("Textures");
 AddDocTag(Tags::FeatureExtraction);
+AddDocTag("Textures");
 
 AddParameter(ParameterType_InputImage, "in",  "Input Image");
 SetParameterDescription("in", "The input image to compute the features on.");
diff --git a/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx b/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx
index 683a46b..1d3ebf7 100644
--- a/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx
+++ b/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx
@@ -129,7 +129,7 @@ private:
 
     AddParameter(ParameterType_String,"mode.attribute.field","The attribute field to burn");
     SetParameterDescription("mode.attribute.field","Name of the attribute field to burn");
-    SetParameterString("mode.attribute.field","DN");
+    SetParameterString("mode.attribute.field","DN", false);
 
     AddRAMParameter();
 
diff --git a/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx b/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx
index 3ff6ee1..c50b4bf 100644
--- a/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx
+++ b/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx
@@ -58,7 +58,9 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("Conversion");
 
+	AddDocTag("Miscellaneous");
     AddDocTag(Tags::Meta);
+	AddDocTag(Tags::Vector);
 
     AddParameter(ParameterType_OutputVectorData,  "out",   "Output vector data");
     SetParameterDescription("out", "Generated output vector data path");
diff --git a/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx b/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx
index 95e1ef3..44676f6 100644
--- a/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx
+++ b/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx
@@ -77,6 +77,7 @@ private:
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
 
+	AddDocTag(Tags::Vector);
     AddDocTag(Tags::Vector);
 
     AddParameter(ParameterType_Group,"io","Input and output data");
diff --git a/Modules/Core/ImageBase/test/CMakeLists.txt b/Modules/Core/ImageBase/test/CMakeLists.txt
index 3d74d3d..1c9c2b3 100644
--- a/Modules/Core/ImageBase/test/CMakeLists.txt
+++ b/Modules/Core/ImageBase/test/CMakeLists.txt
@@ -650,23 +650,6 @@ otb_add_test(NAME   ioTvMultiChannelROI_p1_06_JPEG2000_2_TIF_res0 COMMAND otbIma
   ${TEMP}/ioExtractROI_JPEG2K_2_TIF_p1_06_OUT.tif
   )
 
-# Only do the following test if we are using the OTB Openjpeg driver,
-# because gdal does not report jpeg2000 overview with size < 128
-# pixel, and will therefore interpolate.
-if(OTB_USE_OPENJPEG)
-
-# Read an area inside one tile at resolution 4 (jpeg2000 conformance file with
-# specific tile size at different resolution).
-otb_add_test(NAME   ioTvMultiChannelROI_p1_06_JPEG2000_2_TIF_res4 COMMAND otbImageBaseTestDriver
-  --compare-image ${EPSILON_9}   ${BASELINE}/ioExtractROI_JPEG2K_2_TIF_p1_06_res4.tif
-  ${TEMP}/ioExtractROI_JPEG2K_2_TIF_p1_06_res4_OUT.tif
-  otbMultiChannelExtractROI
-  ${INPUTDATA}/jpeg2000_conf_p1_06.j2k?&resol=4
-  ${TEMP}/ioExtractROI_JPEG2K_2_TIF_p1_06_res4_OUT.tif
-  )
-
-endif()
-
 # Read an area inside one tile at resolution 0 (quite similar coding parameter with pleiade
 # except it a lossless image with no quatization style).
 otb_add_test(NAME   ioTvMultiChannelROI_lena_JPEG2000_2_TIF_res0 COMMAND otbImageBaseTestDriver
diff --git a/Modules/Core/Interpolation/include/otbBCOInterpolateImageFunction.txx b/Modules/Core/Interpolation/include/otbBCOInterpolateImageFunction.txx
index 89572aa..6f0fd2a 100644
--- a/Modules/Core/Interpolation/include/otbBCOInterpolateImageFunction.txx
+++ b/Modules/Core/Interpolation/include/otbBCOInterpolateImageFunction.txx
@@ -142,8 +142,6 @@ BCOInterpolateImageFunction<TInputImage, TCoordRep>
   IndexType baseIndex;
   IndexType neighIndex;
 
-  std::vector<RealType> lineRes(this->m_WinSize, 0.);
-
   RealType value = itk::NumericTraits<RealType>::Zero;
 
   CoefContainerType BCOCoefX = this->EvaluateCoef(index[0]);
@@ -157,6 +155,7 @@ BCOInterpolateImageFunction<TInputImage, TCoordRep>
 
   for(unsigned int i = 0; i < this->m_WinSize; ++i )
     {
+    RealType lineRes = 0.;
     for(unsigned int j = 0; j < this->m_WinSize; ++j )
       {
       // get neighbor index
@@ -179,9 +178,9 @@ BCOInterpolateImageFunction<TInputImage, TCoordRep>
         {
         neighIndex[1] = this->m_StartIndex[1];
         }
-      lineRes[i] += static_cast<RealType>( this->GetInputImage()->GetPixel( neighIndex ) ) * BCOCoefY[j];
+      lineRes += static_cast<RealType>( this->GetInputImage()->GetPixel( neighIndex ) ) * BCOCoefY[j];
       }
-    value += lineRes[i]*BCOCoefX[i];
+    value += lineRes*BCOCoefX[i];
     }
 
 
@@ -211,14 +210,9 @@ BCOInterpolateImageFunction< otb::VectorImage<TPixel, VImageDimension> , TCoordR
   IndexType neighIndex;
 
 
-    
-  std::vector< std::vector<ScalarRealType> >  lineRes ( this->m_WinSize, std::vector<ScalarRealType>( componentNumber, itk::NumericTraits<ScalarRealType>::Zero) );
-  std::vector< ScalarRealType > value(componentNumber,itk::NumericTraits<ScalarRealType>::Zero);
-
-
-  OutputType output;
-
-  output.SetSize(componentNumber);
+  std::vector<ScalarRealType> lineRes(componentNumber);
+  OutputType output(componentNumber);
+  output.Fill(itk::NumericTraits<ScalarRealType>::Zero);
 
   CoefContainerType BCOCoefX = this->EvaluateCoef(index[0]);
   CoefContainerType BCOCoefY = this->EvaluateCoef(index[1]);
@@ -231,6 +225,7 @@ BCOInterpolateImageFunction< otb::VectorImage<TPixel, VImageDimension> , TCoordR
 
   for(unsigned int i = 0; i < this->m_WinSize; ++i )
     {
+    std::fill(lineRes.begin(), lineRes.end(), itk::NumericTraits<ScalarRealType>::Zero);
     for(unsigned int j = 0; j < this->m_WinSize; ++j )
       {
       // get neighbor index
@@ -256,20 +251,15 @@ BCOInterpolateImageFunction< otb::VectorImage<TPixel, VImageDimension> , TCoordR
       const InputPixelType & pixel = this->GetInputImage()->GetPixel( neighIndex );
       for( unsigned int k = 0; k<componentNumber; ++k)
         {
-        lineRes[i][k] += pixel.GetElement(k) * BCOCoefY[j];
+        lineRes[k] += pixel.GetElement(k) * BCOCoefY[j];
         }
       }
     for( unsigned int k = 0; k<componentNumber; ++k)
       {
-      value[k] += lineRes[i][k]*BCOCoefX[i];
+      output[k] += lineRes[k]*BCOCoefX[i];
       }
     }
 
-  for( unsigned int k = 0; k<componentNumber; ++k)
-    {
-    output.SetElement(k, value[k]);
-    }
-
   return ( output );
 }
 
diff --git a/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx
index 2a42ba1..e00c1aa 100644
--- a/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx
@@ -94,9 +94,9 @@ Sentinel1ImageMetadataInterface
   otbMsgDevMacro(<<"calibration.startTime: "<<std::setprecision(16) << firstLineTime);
   otbMsgDevMacro(<<"calibration.stopTime : "<<std::setprecision(16) << lastLineTime);
 
-  const std::string supportDataPrefix = "support_data."; //make && use GetBandPrefix(subSwath, polarisation)
+  //const std::string supportDataPrefix = "support_data."; //make && use GetBandPrefix(subSwath, polarisation)
 
-  const int numOfLines = Utils::LexicalCast<int>(imageKeywordlist.GetMetadataByKey(supportDataPrefix + "number_lines"), supportDataPrefix + "number_lines(int)");
+  const int numOfLines = Utils::LexicalCast<int>(imageKeywordlist.GetMetadataByKey("number_lines"), "number_lines(int)");
   otbMsgDevMacro(<<"numOfLines   : " << numOfLines);
 
   const int count = Utils::LexicalCast<int>(imageKeywordlist.GetMetadataByKey("calibration.count"), "calibration.count");
diff --git a/Modules/Core/Metadata/test/CMakeLists.txt b/Modules/Core/Metadata/test/CMakeLists.txt
index 0217f73..dd74719 100644
--- a/Modules/Core/Metadata/test/CMakeLists.txt
+++ b/Modules/Core/Metadata/test/CMakeLists.txt
@@ -385,7 +385,7 @@ otb_add_test(NAME ioTvSarCalibrationLookupDataTest_SENTINEL1 COMMAND otbMetadata
   --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvSarCalibrationLookupDataTest_SENTINEL1.txt
   ${TEMP}/ioTvSarCalibrationLookupDataTest_SENTINEL1.txt
   otbSarCalibrationLookupDataTest
-  ${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_300_300.tif?&geom=${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_300_300.geom
+  ${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_1200_1100_300_300.tiff?&geom=${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_1200_1100_300_300.geom
   ${TEMP}/ioTvSarCalibrationLookupDataTest_SENTINEL1.txt
   )
 
diff --git a/Modules/Core/Transform/include/otbStreamingWarpImageFilter.h b/Modules/Core/Transform/include/otbStreamingWarpImageFilter.h
index 813a444..19435f4 100644
--- a/Modules/Core/Transform/include/otbStreamingWarpImageFilter.h
+++ b/Modules/Core/Transform/include/otbStreamingWarpImageFilter.h
@@ -105,7 +105,7 @@ private:
   StreamingWarpImageFilter(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
-  // Assesment of the maximum displacement for streaming
+  // Assessment of the maximum displacement for streaming
   DisplacementValueType m_MaximumDisplacement;
 };
 
diff --git a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.txx b/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.txx
index 0f9b7b6..bccb8ec 100644
--- a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.txx
+++ b/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.txx
@@ -203,26 +203,22 @@ PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType
   labelListSample->SetMeasurementVectorSize(m_ThreadLabelListSample[0]->GetMeasurementVectorSize());
 
   // Copy the first thread elements into lists
-  if( this->GetNumberOfThreads() > 1 )
+  ListSampleType* threadListSample = m_ThreadListSample[0];
+  LabelListSampleType* threadLabelListSample = m_ThreadLabelListSample[0];
+  SamplesPositionType& threadSamplesPosition = m_ThreadSamplesPosition[0];
+  for (unsigned int i = 0; i < threadListSample->Size(); ++i)
     {
-      ListSampleType* threadListSample = m_ThreadListSample[0];
-      LabelListSampleType* threadLabelListSample = m_ThreadLabelListSample[0];
-      SamplesPositionType& threadSamplesPosition = m_ThreadSamplesPosition[0];
-
-      for (unsigned int i = 0; i < threadListSample->Size(); ++i)
-      {
-        listSample->PushBack( threadListSample->GetMeasurementVector(i) );
-        labelListSample->PushBack( threadLabelListSample->GetMeasurementVector(i) );
-        samplesPosition.push_back( threadSamplesPosition[i] );
-      }
+    listSample->PushBack( threadListSample->GetMeasurementVector(i) );
+    labelListSample->PushBack( threadLabelListSample->GetMeasurementVector(i) );
+    samplesPosition.push_back( threadSamplesPosition[i] );
     }
 
   // Add the other thread element checking if the point dosn't already exist
   for (itk::ThreadIdType threadId = 1; threadId < this->GetNumberOfThreads(); ++threadId )
     {
-    ListSampleType* threadListSample = m_ThreadListSample[threadId];
-    LabelListSampleType* threadLabelListSample = m_ThreadLabelListSample[threadId];
-    SamplesPositionType& threadSamplesPosition = m_ThreadSamplesPosition[threadId];
+    threadListSample = m_ThreadListSample[threadId];
+    threadLabelListSample = m_ThreadLabelListSample[threadId];
+    threadSamplesPosition = m_ThreadSamplesPosition[threadId];
 
     for (unsigned int i = 0; i < threadListSample->Size(); ++i)
       {
diff --git a/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h b/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h
index 456cf4a..42c1a5f 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h
+++ b/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h
@@ -164,6 +164,18 @@ public:
   /** Get the input image maximum */
   itkGetMacro(InputImageMaximum, InputPixelType);
 
+  /** Set the sub-sampling factor */
+  itkSetMacro(SubsampleFactor, SizeType);
+
+  /** Get the sub-sampling factor */
+  itkGetMacro(SubsampleFactor, SizeType);
+
+  /** Set the sub-sampling offset */
+  itkSetMacro(SubsampleOffset, OffsetType);
+
+  /** Get the sub-sampling offset */
+  itkGetMacro(SubsampleOffset, OffsetType);
+
   /** Get the mean output image */
   OutputImageType * GetMeanOutput();
 
@@ -199,6 +211,8 @@ protected:
   ScalarImageToAdvancedTexturesFilter();
   /** Destructor */
   ~ScalarImageToAdvancedTexturesFilter() ITK_OVERRIDE;
+  /** Generate the output informations */
+  void GenerateOutputInformation() ITK_OVERRIDE;
   /** Generate the input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
   /** Before Parallel textures extraction */
@@ -231,6 +245,11 @@ private:
   /** Input image maximum */
   InputPixelType m_InputImageMaximum;
 
+  /** Sub-sampling factor */
+  SizeType m_SubsampleFactor;
+
+  /** Sub-sampling offset */
+  OffsetType m_SubsampleOffset;
 };
 } // End namespace otb
 
diff --git a/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.txx b/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.txx
index e0463ab..80cf17d 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.txx
+++ b/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.txx
@@ -37,6 +37,8 @@ ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
 , m_NumberOfBinsPerAxis(8)
 , m_InputImageMinimum(0)
 , m_InputImageMaximum(255)
+, m_SubsampleFactor()
+, m_SubsampleOffset()
 {
   // There are 10 outputs corresponding to the 9 textures indices
   this->SetNumberOfRequiredOutputs(10);
@@ -52,6 +54,9 @@ ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
   this->SetNthOutput(7, OutputImageType::New());
   this->SetNthOutput(8, OutputImageType::New());
   this->SetNthOutput(9, OutputImageType::New());
+
+  this->m_SubsampleFactor.Fill(1);
+  this->m_SubsampleOffset.Fill(0);
 }
 
 template <class TInputImage, class TOutputImage>
@@ -191,6 +196,38 @@ ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
 template <class TInputImage, class TOutputImage>
 void
 ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
+::GenerateOutputInformation()
+{
+  // First, call superclass implementation
+  Superclass::GenerateOutputInformation();
+
+  // Compute output size, origin & spacing
+  InputRegionType inputRegion = this->GetInput()->GetLargestPossibleRegion();
+  OutputRegionType outputRegion;
+  outputRegion.SetIndex(0,0);
+  outputRegion.SetIndex(1,0);
+  outputRegion.SetSize(0, 1 + (inputRegion.GetSize(0) - 1 - m_SubsampleOffset[0]) / m_SubsampleFactor[0]);
+  outputRegion.SetSize(1, 1 + (inputRegion.GetSize(1) - 1 - m_SubsampleOffset[1]) / m_SubsampleFactor[1]);
+
+  typename OutputImageType::SpacingType outSpacing = this->GetInput()->GetSpacing();
+  outSpacing[0] *= m_SubsampleFactor[0];
+  outSpacing[1] *= m_SubsampleFactor[1];
+
+  typename OutputImageType::PointType outOrigin;
+  this->GetInput()->TransformIndexToPhysicalPoint(inputRegion.GetIndex()+m_SubsampleOffset,outOrigin);
+
+  for (unsigned int i=0 ; i<this->GetNumberOfOutputs() ; i++)
+    {
+    OutputImagePointerType outputPtr = this->GetOutput(i);
+    outputPtr->SetLargestPossibleRegion(outputRegion);
+    outputPtr->SetOrigin(outOrigin);
+    outputPtr->SetSpacing(outSpacing);
+    }
+}
+
+template <class TInputImage, class TOutputImage>
+void
+ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
 ::GenerateInputRequestedRegion()
 {
   // First, call superclass implementation
@@ -209,12 +246,19 @@ ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
   // We use only the first output since requested regions for all outputs are enforced to be equal
   // by the default GenerateOutputRequestedRegiont() implementation
   OutputRegionType outputRequestedRegion = outputPtr->GetRequestedRegion();
+  InputRegionType inputLargest = inputPtr->GetLargestPossibleRegion();
 
   typename OutputRegionType::IndexType outputIndex = outputRequestedRegion.GetIndex();
   typename OutputRegionType::SizeType  outputSize   = outputRequestedRegion.GetSize();
   typename InputRegionType::IndexType  inputIndex;
   typename InputRegionType::SizeType   inputSize;
 
+  // Convert index and size to full grid
+  outputIndex[0] = outputIndex[0] * m_SubsampleFactor[0] + m_SubsampleOffset[0] + inputLargest.GetIndex(0);
+  outputIndex[1] = outputIndex[1] * m_SubsampleFactor[1] + m_SubsampleOffset[1] + inputLargest.GetIndex(1);
+  outputSize[0] = 1 + (outputSize[0] - 1) * m_SubsampleFactor[0];
+  outputSize[1] = 1 + (outputSize[1] - 1) * m_SubsampleFactor[1];
+
   // First, apply offset
   for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
     {
@@ -311,6 +355,8 @@ ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
   const unsigned int histSize = m_NumberOfBinsPerAxis;
   const long unsigned int twiceHistSize = 2 * m_NumberOfBinsPerAxis;
 
+  InputRegionType inputLargest = inputPtr->GetLargestPossibleRegion();
+
   // Set-up progress reporting
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
 
@@ -330,11 +376,16 @@ ScalarImageToAdvancedTexturesFilter<TInputImage, TOutputImage>
     typename InputRegionType::IndexType inputIndex;
     typename InputRegionType::SizeType inputSize;
 
+    // Convert index to full grid
+    typename OutputImageType::IndexType outIndex;
+
     // First, create an window for neighborhood iterator based on m_Radius
     // For example, if xradius and yradius is 2. window size is 5x5 (2 * radius + 1).
     for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
       {
-      inputIndex[dim] = varianceIt.GetIndex()[dim] - m_Radius[dim];
+      outIndex[dim] = varianceIt.GetIndex()[dim] * m_SubsampleFactor[dim]
+        + m_SubsampleOffset[dim] + inputLargest.GetIndex(dim);
+      inputIndex[dim] = outIndex[dim] - m_Radius[dim];
       inputSize[dim] = 2 * m_Radius[dim] + 1;
       }
 
diff --git a/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.h b/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.h
index 4879c75..781d69f 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.h
+++ b/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.h
@@ -148,6 +148,18 @@ public:
   itkSetMacro(FastCalculations, bool);
   itkBooleanMacro(FastCalculations);
 
+  /** Set the sub-sampling factor */
+  itkSetMacro(SubsampleFactor, SizeType);
+
+  /** Get the sub-sampling factor */
+  itkGetMacro(SubsampleFactor, SizeType);
+
+  /** Set the sub-sampling offset */
+  itkSetMacro(SubsampleOffset, OffsetType);
+
+  /** Get the sub-sampling offset */
+  itkGetMacro(SubsampleOffset, OffsetType);
+
   /** Get the Short Run Emphasis output image */
   OutputImageType * GetShortRunEmphasisOutput();
 
@@ -186,6 +198,8 @@ protected:
   ScalarImageToHigherOrderTexturesFilter();
   /** Destructor */
   ~ScalarImageToHigherOrderTexturesFilter() ITK_OVERRIDE;
+  /** Generate the output informations */
+  void GenerateOutputInformation() ITK_OVERRIDE;
   /** Generate the input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
   /** Parallel textures extraction */
@@ -215,6 +229,12 @@ private:
 
   /** Fast calculation */
   bool m_FastCalculations;
+
+  /** Sub-sampling factor */
+  SizeType m_SubsampleFactor;
+
+  /** Sub-sampling offset */
+  OffsetType m_SubsampleOffset;
 };
 } // End namespace otb
 
diff --git a/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.txx b/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.txx
index 66d4a4b..fecb7ae 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.txx
+++ b/Modules/Feature/Textures/include/otbScalarImageToHigherOrderTexturesFilter.txx
@@ -32,7 +32,9 @@ ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
   m_NumberOfBinsPerAxis(8),
   m_InputImageMinimum(0),
   m_InputImageMaximum(255),
-  m_FastCalculations(false)
+  m_FastCalculations(false),
+  m_SubsampleFactor(),
+  m_SubsampleOffset()
 {
   // There are 11 outputs corresponding to the 8 textures indices
   this->SetNumberOfRequiredOutputs(10);
@@ -71,6 +73,8 @@ ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
     }
   this->SetOffsets( offsets );
 
+  this->m_SubsampleFactor.Fill(1);
+  this->m_SubsampleOffset.Fill(0);
 }
 
 template <class TInputImage, class TOutputImage>
@@ -234,6 +238,38 @@ ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
 template <class TInputImage, class TOutputImage>
 void
 ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
+::GenerateOutputInformation()
+{
+  // First, call superclass implementation
+  Superclass::GenerateOutputInformation();
+
+  // Compute output size, origin & spacing
+  InputRegionType inputRegion = this->GetInput()->GetLargestPossibleRegion();
+  OutputRegionType outputRegion;
+  outputRegion.SetIndex(0,0);
+  outputRegion.SetIndex(1,0);
+  outputRegion.SetSize(0, 1 + (inputRegion.GetSize(0) - 1 - m_SubsampleOffset[0]) / m_SubsampleFactor[0]);
+  outputRegion.SetSize(1, 1 + (inputRegion.GetSize(1) - 1 - m_SubsampleOffset[1]) / m_SubsampleFactor[1]);
+
+  typename OutputImageType::SpacingType outSpacing = this->GetInput()->GetSpacing();
+  outSpacing[0] *= m_SubsampleFactor[0];
+  outSpacing[1] *= m_SubsampleFactor[1];
+
+  typename OutputImageType::PointType outOrigin;
+  this->GetInput()->TransformIndexToPhysicalPoint(inputRegion.GetIndex()+m_SubsampleOffset,outOrigin);
+
+  for (unsigned int i=0 ; i<this->GetNumberOfOutputs() ; i++)
+    {
+    OutputImagePointerType outputPtr = this->GetOutput(i);
+    outputPtr->SetLargestPossibleRegion(outputRegion);
+    outputPtr->SetOrigin(outOrigin);
+    outputPtr->SetSpacing(outSpacing);
+    }
+}
+
+template <class TInputImage, class TOutputImage>
+void
+ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
 ::GenerateInputRequestedRegion()
 {
   // First, call superclass implementation
@@ -252,7 +288,17 @@ ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
   // We use only the first output since requested regions for all outputs are enforced to be equal
   // by the default GenerateOutputRequestedRegiont() implementation
   OutputRegionType outputRequestedRegion = outputPtr->GetRequestedRegion();
-  InputRegionType inputRequestedRegion = outputRequestedRegion;
+  typename OutputRegionType::IndexType outputIndex = outputRequestedRegion.GetIndex();
+  typename OutputRegionType::SizeType  outputSize   = outputRequestedRegion.GetSize();
+  InputRegionType inputLargest = inputPtr->GetLargestPossibleRegion();
+
+  // Convert index and size to full grid
+  outputIndex[0] = outputIndex[0] * m_SubsampleFactor[0] + m_SubsampleOffset[0] + inputLargest.GetIndex(0);
+  outputIndex[1] = outputIndex[1] * m_SubsampleFactor[1] + m_SubsampleOffset[1] + inputLargest.GetIndex(1);
+  outputSize[0] = 1 + (outputSize[0] - 1) * m_SubsampleFactor[0];
+  outputSize[1] = 1 + (outputSize[1] - 1) * m_SubsampleFactor[1];
+  
+  InputRegionType inputRequestedRegion(outputIndex,outputSize);
 
   // Apply the radius
   inputRequestedRegion.PadByRadius(m_Radius);
@@ -297,6 +343,8 @@ ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
   inputPtr->TransformIndexToPhysicalPoint( outputImagesIterators[0].GetIndex() + m_Radius, bottomRightPoint );
   double maxDistance = topLeftPoint.EuclideanDistanceTo(bottomRightPoint);
 
+  InputRegionType inputLargest = inputPtr->GetLargestPossibleRegion();
+
   // Set-up progress reporting
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
 
@@ -304,12 +352,17 @@ ScalarImageToHigherOrderTexturesFilter<TInputImage, TOutputImage>
   while ( !outputImagesIterators[0].IsAtEnd() )
     {
     // Compute the region on which run-length matrix will be estimated
-    typename InputRegionType::IndexType inputIndex = outputImagesIterators[0].GetIndex() - m_Radius;
+    typename InputRegionType::IndexType inputIndex;
     typename InputRegionType::SizeType  inputSize;
 
-    // First, apply offset
+    // Convert index to full grid
+    typename OutputImageType::IndexType outIndex;
+
     for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
       {
+      outIndex[dim] = outputImagesIterators[0].GetIndex()[dim] * m_SubsampleFactor[dim]
+        + m_SubsampleOffset[dim] + inputLargest.GetIndex(dim);
+      inputIndex[dim] = outIndex[dim] - m_Radius[dim];
       inputSize[dim] = 2 * m_Radius[dim] + 1;
       }
 
diff --git a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h
index bb40e17..a8387cd 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h
+++ b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h
@@ -166,6 +166,18 @@ public:
   /** Get the input image maximum */
   itkGetMacro(InputImageMaximum, InputPixelType);
 
+  /** Set the sub-sampling factor */
+  itkSetMacro(SubsampleFactor, SizeType);
+
+  /** Get the sub-sampling factor */
+  itkGetMacro(SubsampleFactor, SizeType);
+
+  /** Set the sub-sampling offset */
+  itkSetMacro(SubsampleOffset, OffsetType);
+
+  /** Get the sub-sampling offset */
+  itkGetMacro(SubsampleOffset, OffsetType);
+
   /** Get the energy output image */
   OutputImageType * GetEnergyOutput();
 
@@ -195,6 +207,8 @@ protected:
   ScalarImageToTexturesFilter();
   /** Destructor */
   ~ScalarImageToTexturesFilter() ITK_OVERRIDE;
+  /** Generate the output informations */
+  void GenerateOutputInformation() ITK_OVERRIDE;
   /** Generate the input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
   /** Before Parallel textures extraction */
@@ -230,6 +244,11 @@ private:
   //TODO: should we use constexpr? only c++11 and problem for msvc
   inline double GetPixelValueTolerance() const {return 0.0001; }
 
+  /** Sub-sampling factor */
+  SizeType m_SubsampleFactor;
+
+  /** Sub-sampling offset */
+  OffsetType m_SubsampleOffset;
 };
 } // End namespace otb
 
diff --git a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx
index c67e3a9..be48934 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx
+++ b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx
@@ -39,6 +39,8 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
 , m_NumberOfBinsPerAxis(8)
 , m_InputImageMinimum(0)
 , m_InputImageMaximum(255)
+, m_SubsampleFactor()
+, m_SubsampleOffset()
 {
   // There are 8 outputs corresponding to the 8 textures indices
   this->SetNumberOfRequiredOutputs(8);
@@ -52,6 +54,9 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
   this->SetNthOutput(5, OutputImageType::New());
   this->SetNthOutput(6, OutputImageType::New());
   this->SetNthOutput(7, OutputImageType::New());
+
+  this->m_SubsampleFactor.Fill(1);
+  this->m_SubsampleOffset.Fill(0);
 }
 
 template <class TInputImage, class TOutputImage>
@@ -166,6 +171,38 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
 template <class TInputImage, class TOutputImage>
 void
 ScalarImageToTexturesFilter<TInputImage, TOutputImage>
+::GenerateOutputInformation()
+{
+  // First, call superclass implementation
+  Superclass::GenerateOutputInformation();
+
+  // Compute output size, origin & spacing
+  InputRegionType inputRegion = this->GetInput()->GetLargestPossibleRegion();
+  OutputRegionType outputRegion;
+  outputRegion.SetIndex(0,0);
+  outputRegion.SetIndex(1,0);
+  outputRegion.SetSize(0, 1 + (inputRegion.GetSize(0) - 1 - m_SubsampleOffset[0]) / m_SubsampleFactor[0]);
+  outputRegion.SetSize(1, 1 + (inputRegion.GetSize(1) - 1 - m_SubsampleOffset[1]) / m_SubsampleFactor[1]);
+
+  typename OutputImageType::SpacingType outSpacing = this->GetInput()->GetSpacing();
+  outSpacing[0] *= m_SubsampleFactor[0];
+  outSpacing[1] *= m_SubsampleFactor[1];
+
+  typename OutputImageType::PointType outOrigin;
+  this->GetInput()->TransformIndexToPhysicalPoint(inputRegion.GetIndex()+m_SubsampleOffset,outOrigin);
+
+  for (unsigned int i=0 ; i<this->GetNumberOfOutputs() ; i++)
+    {
+    OutputImagePointerType outputPtr = this->GetOutput(i);
+    outputPtr->SetLargestPossibleRegion(outputRegion);
+    outputPtr->SetOrigin(outOrigin);
+    outputPtr->SetSpacing(outSpacing);
+    }
+}
+
+template <class TInputImage, class TOutputImage>
+void
+ScalarImageToTexturesFilter<TInputImage, TOutputImage>
 ::GenerateInputRequestedRegion()
 {
   // First, call superclass implementation
@@ -189,6 +226,13 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
   typename OutputRegionType::SizeType  outputSize   = outputRequestedRegion.GetSize();
   typename InputRegionType::IndexType  inputIndex;
   typename InputRegionType::SizeType   inputSize;
+  InputRegionType inputLargest = inputPtr->GetLargestPossibleRegion();
+
+  // Convert index and size to full grid
+  outputIndex[0] = outputIndex[0] * m_SubsampleFactor[0] + m_SubsampleOffset[0] + inputLargest.GetIndex(0);
+  outputIndex[1] = outputIndex[1] * m_SubsampleFactor[1] + m_SubsampleOffset[1] + inputLargest.GetIndex(1);
+  outputSize[0] = 1 + (outputSize[0] - 1) * m_SubsampleFactor[0];
+  outputSize[1] = 1 + (outputSize[1] - 1) * m_SubsampleFactor[1];
 
   // First, apply offset
   for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
@@ -278,6 +322,8 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
 
   const double log2 = vcl_log(2.0);
 
+  InputRegionType inputLargest = inputPtr->GetLargestPossibleRegion();
+
   // Set-up progress reporting
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
 
@@ -295,11 +341,15 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
     typename InputRegionType::IndexType inputIndex;
     typename InputRegionType::SizeType inputSize;
 
+    // Convert index to full grid
+    typename OutputImageType::IndexType outIndex;
+
     // First, create an window for neighborhood iterator based on m_Radius
     // For example, if xradius and yradius is 2. window size is 5x5 (2 * radius + 1).
     for (unsigned int dim = 0; dim < InputImageType::ImageDimension; ++dim)
       {
-      inputIndex[dim] = energyIt.GetIndex()[dim] - m_Radius[dim];
+      outIndex[dim] = energyIt.GetIndex()[dim] * m_SubsampleFactor[dim] + m_SubsampleOffset[dim] + inputLargest.GetIndex(dim);
+      inputIndex[dim] = outIndex[dim] - m_Radius[dim];
       inputSize[dim] = 2 * m_Radius[dim] + 1;
       }
 
diff --git a/Modules/Filtering/Convolution/include/otbOverlapSaveConvolutionImageFilter.txx b/Modules/Filtering/Convolution/include/otbOverlapSaveConvolutionImageFilter.txx
index 8b3126a..3735530 100644
--- a/Modules/Filtering/Convolution/include/otbOverlapSaveConvolutionImageFilter.txx
+++ b/Modules/Filtering/Convolution/include/otbOverlapSaveConvolutionImageFilter.txx
@@ -186,6 +186,9 @@ OverlapSaveConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
   unsigned int leftskip = static_cast<unsigned int>(std::max(0L, inputIndex[0] - pieceIndex[0]));
   unsigned int topskip =  pieceSize[0] * static_cast<unsigned int>(std::max(0L, inputIndex[1] - pieceIndex[1]));
 
+  // zero filling
+  memset(inputPiece,0,pieceNbOfPixel * sizeof(InputPixelType));
+
   // Filling the buffer with image values
   for (l = 0; l < inputSize[1]; ++l)
     {
@@ -205,6 +208,9 @@ OverlapSaveConvolutionImageFilter<TInputImage, TOutputImage, TBoundaryCondition>
                                                                       filterPieceFFT,
                                                                       FFTW_MEASURE);
 
+  // zero filling
+  memset(resampledFilterPiece,0,pieceNbOfPixel * sizeof(InputPixelType));
+
   k = 0;
   // Filling the buffer with filter values
   for (j = 0; j < sizeOfFilter[1]; ++j)
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
index 38d511a..51cef1b 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
@@ -78,7 +78,6 @@ public:
                               const RegionType& region) ITK_OVERRIDE;
 
   itkGetMacro(TileSizeAlignment, unsigned int);
-  itkSetMacro(TileSizeAlignment, unsigned int);
 
   itkGetMacro(TileDimension, unsigned int);
 
@@ -246,6 +245,9 @@ private:
 
   /** The shrink factor */
   unsigned int m_ShrinkFactor;
+
+  /** The offset to get the cell center */
+  IndexType m_Offset;
 }; // end of class PersistentStatisticsVectorImageFilter
 
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
index d20cd23..df3082c 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
@@ -43,7 +43,7 @@ StreamingShrinkStreamingManager<TImage>::PrepareStreaming( itk::DataObject * inp
 {
   typedef otb::StreamingShrinkImageRegionSplitter TileSplitterType;
   TileSplitterType::Pointer splitter = TileSplitterType::New();
-  splitter->SetTileSizeAlignment(m_ShrinkFactor);
+  splitter->SetShrinkFactor(m_ShrinkFactor);
   this->m_Splitter = splitter;
 
   unsigned long nbDivisions = this->EstimateOptimalNumberOfDivisions(input, region, 0);
@@ -125,6 +125,9 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
                                            inputSpacing = inputPtr->GetSpacing();
   const typename InputImageType::SizeType& inputSize
     = inputPtr->GetLargestPossibleRegion().GetSize();
+  const typename InputImageType::IndexType& inputIndex
+    = inputPtr->GetLargestPossibleRegion().GetIndex();
+  typename InputImageType::IndexType startIndex;
 
   typename OutputImageType::SpacingType shrunkOutputSpacing;
   typename OutputImageType::RegionType  shrunkOutputLargestPossibleRegion;
@@ -134,12 +137,14 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
 
   for (unsigned int i = 0; i < OutputImageType::ImageDimension; ++i)
     {
+    startIndex[i] = inputIndex[i] + (m_ShrinkFactor - 1) / 2;
+    if (m_ShrinkFactor > inputSize[i])
+      startIndex[i] = inputIndex[i] + (inputSize[i] - 1) / 2;
+    m_Offset[i] = startIndex[i] % m_ShrinkFactor;
     shrunkOutputSpacing[i] = inputSpacing[i] * static_cast<double>(m_ShrinkFactor);
     shrunkOutputSize[i] = inputSize[i] > m_ShrinkFactor ? inputSize[i] / m_ShrinkFactor : 1;
     
-    shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] *
-      (static_cast<double>(inputPtr->GetLargestPossibleRegion().GetIndex(i)) - 0.5)
-      + shrunkOutputSpacing[i] * 0.5;
+    shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] * startIndex[i];
 
     // we choose to output a region with a start index [0,0]
     // the origin is set accordingly
@@ -184,12 +189,12 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
     {
     const IndexType& inIndex = inIt.GetIndex();
     // TODO the pixel value should be taken near the centre of the cell, not at the corners
-    if (inIndex[0] % m_ShrinkFactor == 0
-        && inIndex[1] % m_ShrinkFactor == 0 )
+    if ((inIndex[0] - m_Offset[0]) % m_ShrinkFactor == 0
+        && (inIndex[1] - m_Offset[1]) % m_ShrinkFactor == 0 )
       {
       IndexType shrunkIndex;
-      shrunkIndex[0] = inIndex[0] / m_ShrinkFactor;
-      shrunkIndex[1] = inIndex[1] / m_ShrinkFactor;
+      shrunkIndex[0] = (inIndex[0] - m_Offset[0]) / m_ShrinkFactor;
+      shrunkIndex[1] = (inIndex[1] - m_Offset[1]) / m_ShrinkFactor;
       if (m_ShrunkOutput->GetLargestPossibleRegion().IsInside(shrunkIndex))
         m_ShrunkOutput->SetPixel(shrunkIndex, inIt.Get());
       }
diff --git a/Modules/Filtering/ImageManipulation/include/otbVectorRescaleIntensityImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbVectorRescaleIntensityImageFilter.h
index 150b416..f7e5aa5 100644
--- a/Modules/Filtering/ImageManipulation/include/otbVectorRescaleIntensityImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbVectorRescaleIntensityImageFilter.h
@@ -198,10 +198,15 @@ private:
  *
  * This filter rescales each band to match the [OutputMinimum, OutputMaximum] range.
  * In order to avoid odd values to alter the intensity extent, one can set a clamp percentage.
+ * The clamp percentage is set to 0.01 by default.
  *
  * Values lower than the first quantile of this percentage are set to the OutputMinimum.
  * Values upper than the last quantile of this percentage are set to the OutputMaximum.
  *
+ * This filter differ from itk::VectorRescaleIntensityImageFilter.
+ * Instead of setting only the OutputMaximumMagnitude, you can set the minimum and maximum values for the input and output images.
+ * There is also the possibilty to set a Gamma value and change the clamp percentage.
+ *
  *  \ingroup IntensityImageFilters
  *  \ingroup MultiThreaded
  *
diff --git a/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx b/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx
index e1e2064..dbbb0c7 100644
--- a/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx
@@ -27,23 +27,24 @@ StreamingShrinkImageRegionSplitter
   unsigned int theoricalNbPixelPerTile = region.GetNumberOfPixels() / requestedNumber;
   unsigned int theoricalTileDimension = static_cast<unsigned int> (vcl_sqrt(static_cast<double>(theoricalNbPixelPerTile)) );
 
-  // Take the previous multiple of m_TileSizeAlignment (eventually generate more splits than requested)
-  m_TileDimension = theoricalTileDimension / m_TileSizeAlignment * m_TileSizeAlignment;
+  // Take the previous multiple of m_ShrinkFactor (eventually generate more splits than requested)
+  m_TileDimension = theoricalTileDimension / m_ShrinkFactor * m_ShrinkFactor;
 
-  // Minimal tile size is m_TileSizeAlignment * m_TileSizeAlignment
-  if (m_TileDimension < m_TileSizeAlignment)
+  // Minimal tile size is m_ShrinkFactor * m_ShrinkFactor
+  if (m_TileDimension < m_ShrinkFactor)
     {
-    otbMsgDevMacro(<< "Using the minimal tile size : " << m_TileSizeAlignment << " * " << m_TileSizeAlignment);
-    m_TileDimension = m_TileSizeAlignment;
+    otbMsgDevMacro(<< "Using the minimal tile size : " << m_ShrinkFactor << " * " << m_ShrinkFactor);
+    m_TileDimension = m_ShrinkFactor;
     }
 
-  // Use the computed tile size, and generate (m_TileDimension * 1) tiles
   const SizeType&  regionSize = region.GetSize();
-  m_SplitsPerDimension[0] = (regionSize[0] + m_TileDimension - 1) / m_TileDimension;
-  m_SplitsPerDimension[1] = regionSize[1] / m_TileSizeAlignment;
+  // Compute the alignment of the sampling grid
+  m_TileSizeAlignment = (m_ShrinkFactor - 1) / 2;
+  if (m_ShrinkFactor > regionSize[1]) m_TileSizeAlignment = (regionSize[1] - 1)/2;
 
-  if (m_SplitsPerDimension[1] == 0)
-    m_SplitsPerDimension[1] = 1;
+  // Use the computed tile size, and generate (m_TileDimension * 1) tiles
+  m_SplitsPerDimension[0] = (regionSize[0] + m_TileDimension - 1) / m_TileDimension;
+  m_SplitsPerDimension[1] = (regionSize[1] - m_TileSizeAlignment - 1) / m_ShrinkFactor + 1;
 
   unsigned int numPieces = 1;
   for (unsigned int j = 0; j < ImageDimension; ++j)
@@ -82,7 +83,7 @@ StreamingShrinkImageRegionSplitter
 
   // Transform the split index to the actual coordinates
   splitRegion.SetIndex(0, region.GetIndex(0) + m_TileDimension * splitIndex[0]);
-  splitRegion.SetIndex(1, region.GetIndex(1) + m_TileSizeAlignment * splitIndex[1]);
+  splitRegion.SetIndex(1, region.GetIndex(1) + m_ShrinkFactor * splitIndex[1] + m_TileSizeAlignment);
 
   splitRegion.SetSize(0, m_TileDimension);
   splitRegion.SetSize(1, 1);
@@ -98,6 +99,7 @@ StreamingShrinkImageRegionSplitter
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   Superclass::PrintSelf(os, indent);
+  os << indent << "ShrinkFactor       : " << m_ShrinkFactor << std::endl;
   os << indent << "SplitsPerDimension : " << m_SplitsPerDimension << std::endl;
   os << indent << "TileDimension      : " << m_TileDimension << std::endl;
   os << indent << "TileSizeAlignment  : " << m_TileSizeAlignment << std::endl;
diff --git a/Modules/Filtering/MathParserX/include/otbParserX.h b/Modules/Filtering/MathParserX/include/otbParserX.h
index eb58857..55eecfa 100644
--- a/Modules/Filtering/MathParserX/include/otbParserX.h
+++ b/Modules/Filtering/MathParserX/include/otbParserX.h
@@ -24,8 +24,15 @@
 #if defined(__clang__)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wc++11-extensions"
+
+/* Apple's 3.6.0 based clang doesn't support -Winconsistent-missing-override */
+#if !defined(__apple_build_version__) ||  __apple_build_version__ >= 7000053
+#pragma clang diagnostic ignored "-Winconsistent-missing-override"
+#endif
+
 #include "mpParser.h"
-#pragma GCC diagnostic pop
+#pragma clang diagnostic pop
+
 #else
 #include "mpParser.h"
 #endif
diff --git a/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx b/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx
index 50d39f7..aa3dbe4 100644
--- a/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx
+++ b/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx
@@ -38,7 +38,7 @@ MeanShiftSmoothingImageFilter<TInputImage, TOutputImage, TKernel, TOutputIterati
       , m_NumberOfComponentsPerPixel(0)
       // , m_JointImage(0)
       // , m_ModeTable(0)
-      , m_ModeSearch(true)
+      , m_ModeSearch(false)
       , m_ThreadIdNumberOfBits(0)
 #if 0
       , m_BucketOptimization(false)
diff --git a/Modules/Filtering/Statistics/include/otbPeriodicSampler.h b/Modules/Filtering/Statistics/include/otbPeriodicSampler.h
index 3940bcd..3cc9174 100644
--- a/Modules/Filtering/Statistics/include/otbPeriodicSampler.h
+++ b/Modules/Filtering/Statistics/include/otbPeriodicSampler.h
@@ -51,6 +51,9 @@ public:
 
     /** Maximum jitter to introduce (0 means no jitter) */
     unsigned long MaxJitter;
+
+    /** Maximum buffer size for internal jitter values */
+    unsigned long MaxBufferSize;
     
     bool operator!=(const struct Parameter  & param) const;
     } ParameterType; 
@@ -109,6 +112,9 @@ private:
   /** Internal current offset value
    *  (either fixed, or reset each time a sample is taken)*/
   double m_OffsetValue;
+
+  /** jitter offsets computed up to MaxBufferSize */
+  std::vector<double> m_JitterValues;
 };
 
 } // namespace otb
diff --git a/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.h b/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.h
index d3da80d..fcb3d0d 100644
--- a/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.h
+++ b/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.h
@@ -88,6 +88,7 @@ public:
   /** Type to use for computations. */
   typedef itk::VariableSizeMatrix<PrecisionType>        MatrixType;
   typedef itk::VariableLengthVector<PrecisionType>      RealPixelType;
+  typedef itk::VariableLengthVector<unsigned long>      CountType;
 
   /** Type of DataObjects used for outputs */
   typedef itk::SimpleDataObjectDecorator<RealType>      RealObjectType;
@@ -95,6 +96,15 @@ public:
   typedef itk::SimpleDataObjectDecorator<PixelType>     PixelObjectType;
   typedef itk::SimpleDataObjectDecorator<RealPixelType> RealPixelObjectType;
   typedef itk::SimpleDataObjectDecorator<MatrixType>    MatrixObjectType;
+  typedef itk::SimpleDataObjectDecorator<CountType>     CountObjectType;
+
+  /** Return the number of relevant pixels **/
+  CountType GetNbRelevantPixels() const
+  {
+    return this->GetNbRelevantPixelsOutput()->Get();
+  }
+  CountObjectType* GetNbRelevantPixelsOutput();
+  const CountObjectType* GetNbRelevantPixelsOutput() const;
 
   /** Return the computed Min */
   PixelType GetMinimum() const
@@ -300,6 +310,8 @@ public:
   typedef typename StatFilterType::RealPixelObjectType RealPixelObjectType;
   typedef typename StatFilterType::MatrixType          MatrixType;
   typedef typename StatFilterType::MatrixObjectType    MatrixObjectType;
+  typedef typename StatFilterType::CountType           CountType;
+  typedef typename StatFilterType::CountObjectType     CountObjectType;
 
   typedef typename StatFilterType::InternalPixelType   InternalPixelType;
 
@@ -313,6 +325,21 @@ public:
     return this->GetFilter()->GetInput();
   }
 
+  /** Return the number of relevant pixels **/
+  CountType GetNbRelevantPixels() const
+  {
+    return this->GetFilter()->GetNbRelevantPixelsOutput()->Get();
+  }
+  CountObjectType* GetNbRelevantPixelsOutput()
+  {
+    return this->GetFilter()->GetNbRelevantPixelsOutput();
+  }
+  const CountObjectType* GetNbRelevantPixelsOutput() const
+  {
+    return this->GetFilter()->GetNbRelevantPixelsOutput();
+  }
+
+
   /** Return the computed Minimum. */
   RealPixelType GetMinimum() const
   {
@@ -383,7 +410,7 @@ public:
     return this->GetFilter()->GetCovarianceOutput();
   }
 
-  /** Return the computed Covariance. */
+  /** Return the computed Correlation. */
   MatrixType GetCorrelation() const
   {
     return this->GetFilter()->GetCorrelationOutput()->Get();
@@ -425,7 +452,7 @@ public:
     return this->GetFilter()->GetComponentCovarianceOutput();
   }
 
-  /** Return the computed Covariance. */
+  /** Return the computed Correlation. */
   RealType GetComponentCorrelation() const
   {
     return this->GetFilter()->GetComponentCorrelationOutput()->Get();
diff --git a/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx b/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx
index e76b876..fbd4e80 100644
--- a/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx
+++ b/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx
@@ -43,7 +43,7 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
 
   // allocate the data objects for the outputs which are
   // just decorators around vector/matrix types
-  for (unsigned int i = 1; i < 10; ++i)
+  for (unsigned int i = 1; i < 11; ++i)
     {
     this->itk::ProcessObject::SetNthOutput(i, this->MakeOutput(i).GetPointer());
     }
@@ -83,6 +83,9 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
       // component mean, component covariance, component correlation
       return static_cast<itk::DataObject*>(RealObjectType::New().GetPointer());
       break;
+    case 10:
+      // relevant pixel
+      return static_cast<itk::DataObject*>(CountObjectType::New().GetPointer());
     default:
       // might as well make an image
       return static_cast<itk::DataObject*>(TInputImage::New().GetPointer());
@@ -91,6 +94,23 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
 }
 
 template<class TInputImage, class TPrecision>
+typename PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>::CountObjectType*
+PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
+::GetNbRelevantPixelsOutput()
+{
+  return static_cast<CountObjectType*>(this->itk::ProcessObject::GetOutput(10));
+}
+
+template<class TInputImage, class TPrecision>
+const typename PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>::CountObjectType*
+PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
+::GetNbRelevantPixelsOutput() const
+{
+  return static_cast<const CountObjectType*>(this->itk::ProcessObject::GetOutput(10));
+}
+
+
+template<class TInputImage, class TPrecision>
 typename PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>::PixelObjectType*
 PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
 ::GetMinimumOutput()
@@ -419,10 +439,15 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
     );
     }
 
-  unsigned int nbRelevantPixels =
+  unsigned int nbRelevantPixel =
     nbPixels - (ignoredInfinitePixelCount + ignoredUserPixelCount);
 
-  if( nbRelevantPixels==0 )
+  CountType nbRelevantPixels(numberOfComponent);
+  nbRelevantPixels.Fill(nbRelevantPixel);
+
+  this->GetNbRelevantPixelsOutput()->Set(nbRelevantPixels);
+
+  if( nbRelevantPixel==0 )
     {
     itkExceptionMacro(
       "Statistics cannot be calculated with zero relevant pixels."
@@ -438,15 +463,15 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
 
   if (m_EnableFirstOrderStats)
     {
-    this->GetComponentMeanOutput()->Set(streamFirstOrderComponentAccumulator / (nbRelevantPixels * numberOfComponent));
+    this->GetComponentMeanOutput()->Set(streamFirstOrderComponentAccumulator / (nbRelevantPixel * numberOfComponent));
 
-    this->GetMeanOutput()->Set(streamFirstOrderAccumulator / nbRelevantPixels);
+    this->GetMeanOutput()->Set(streamFirstOrderAccumulator / nbRelevantPixel);
     this->GetSumOutput()->Set(streamFirstOrderAccumulator);
     }
 
   if (m_EnableSecondOrderStats)
     {
-    MatrixType cor = streamSecondOrderAccumulator / nbRelevantPixels;
+    MatrixType cor = streamSecondOrderAccumulator / nbRelevantPixel;
     this->GetCorrelationOutput()->Set(cor);
 
     const RealPixelType& mean = this->GetMeanOutput()->Get();
@@ -454,18 +479,18 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
     double regul = 1.0;
     double regulComponent = 1.0;
 
-    if( m_UseUnbiasedEstimator && nbRelevantPixels>1 )
+    if( m_UseUnbiasedEstimator && nbRelevantPixel>1 )
       {
       regul =
-       static_cast< double >( nbRelevantPixels ) /
-       ( static_cast< double >( nbRelevantPixels ) - 1.0 );
+       static_cast< double >( nbRelevantPixel ) /
+       ( static_cast< double >( nbRelevantPixel ) - 1.0 );
       }
-    
-    if( m_UseUnbiasedEstimator && (nbRelevantPixels * numberOfComponent) > 1 )
+
+    if( m_UseUnbiasedEstimator && (nbRelevantPixel * numberOfComponent) > 1 )
       {
       regulComponent =
-        static_cast< double >(nbRelevantPixels * numberOfComponent) /
-       ( static_cast< double >(nbRelevantPixels * numberOfComponent) - 1.0 );
+        static_cast< double >(nbRelevantPixel * numberOfComponent) /
+       ( static_cast< double >(nbRelevantPixel * numberOfComponent) - 1.0 );
       }
 
     MatrixType cov  = cor;
@@ -478,8 +503,8 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
       }
     this->GetCovarianceOutput()->Set(cov);
 
-    this->GetComponentMeanOutput()->Set(streamFirstOrderComponentAccumulator / (nbRelevantPixels * numberOfComponent));
-    this->GetComponentCorrelationOutput()->Set(streamSecondOrderComponentAccumulator / (nbRelevantPixels * numberOfComponent));
+    this->GetComponentMeanOutput()->Set(streamFirstOrderComponentAccumulator / (nbRelevantPixel * numberOfComponent));
+    this->GetComponentCorrelationOutput()->Set(streamSecondOrderComponentAccumulator / (nbRelevantPixel * numberOfComponent));
     this->GetComponentCovarianceOutput()->Set(
         regulComponent * (this->GetComponentCorrelation()
            - (this->GetComponentMean() * this->GetComponentMean())));
@@ -586,6 +611,7 @@ PersistentStreamingStatisticsVectorImageFilter<TImage, TPrecision>
   os << indent << "Mean: "        << this->GetMeanOutput()->Get()        << std::endl;
   os << indent << "Covariance: "  << this->GetCovarianceOutput()->Get()  << std::endl;
   os << indent << "Correlation: " << this->GetCorrelationOutput()->Get() << std::endl;
+  os << indent << "Relevant pixel: "        << this->GetNbRelevantPixelsOutput()->Get()     << std::endl;
   os << indent << "Component Mean: "        << this->GetComponentMeanOutput()->Get()        << std::endl;
   os << indent << "Component Covariance: "  << this->GetComponentCovarianceOutput()->Get()  << std::endl;
   os << indent << "Component Correlation: " << this->GetComponentCorrelationOutput()->Get() << std::endl;
diff --git a/Modules/Filtering/Statistics/src/otbPeriodicSampler.cxx b/Modules/Filtering/Statistics/src/otbPeriodicSampler.cxx
index ad4a6d8..1aba936 100644
--- a/Modules/Filtering/Statistics/src/otbPeriodicSampler.cxx
+++ b/Modules/Filtering/Statistics/src/otbPeriodicSampler.cxx
@@ -27,7 +27,8 @@ bool
 PeriodicSampler::ParameterType::operator!=(const PeriodicSampler::ParameterType & param) const
 {
   return bool((Offset != param.Offset)||
-              (MaxJitter != param.MaxJitter));
+              (MaxJitter != param.MaxJitter) ||
+              (MaxBufferSize != param.MaxBufferSize));
 }
 
 void
@@ -39,9 +40,20 @@ PeriodicSampler::Reset(void)
   if (m_JitterSize > 0.0)
     {
     // Using jitter : compute random offset value
-    m_OffsetValue =
-      itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()
+    m_JitterValues.resize(std::min(this->GetNeededElements(), this->m_Parameters.MaxBufferSize));
+    for (unsigned long i=0UL ; i<m_JitterValues.size() ; i++)
+      {
+      m_JitterValues[i] = itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()
         ->GetUniformVariate(0.0,m_JitterSize);
+      }
+    if (m_JitterValues.empty())
+      {
+      m_OffsetValue = 0.0;
+      }
+    else
+      {
+      m_OffsetValue = m_JitterValues[0];
+      }
     }
   else
     {
@@ -71,9 +83,7 @@ PeriodicSampler::TakeSample(void)
     if (m_JitterSize > 0.0)
       {
       // Using jitter : compute random offset value
-      m_OffsetValue =
-        itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()
-          ->GetUniformVariate(0.0,m_JitterSize);
+      m_OffsetValue = m_JitterValues[this->m_ChosenElements%m_JitterValues.size()];
       }
     ret = true;
     }
@@ -84,6 +94,7 @@ PeriodicSampler::PeriodicSampler()
 {
   this->m_Parameters.Offset = 0UL;
   this->m_Parameters.MaxJitter = 0UL;
+  this->m_Parameters.MaxBufferSize = 100000000UL;
   m_JitterSize = 0.0;
   m_OffsetValue = 0.0;
 }
diff --git a/Modules/Filtering/Statistics/test/otbSamplerTest.cxx b/Modules/Filtering/Statistics/test/otbSamplerTest.cxx
index d50684d..9d29cb5 100644
--- a/Modules/Filtering/Statistics/test/otbSamplerTest.cxx
+++ b/Modules/Filtering/Statistics/test/otbSamplerTest.cxx
@@ -72,6 +72,7 @@ int otbPeriodicSamplerTest(int, char *[])
   
   param.Offset = 0;
   param.MaxJitter = 10;
+  param.MaxBufferSize = 1000000UL;
   sampler->SetRate(0.2,50);
   sampler->SetParameters(param);
   std::string test2 = RunSampler<otb::PeriodicSampler>(sampler,50);
diff --git a/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h b/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h
index 9304207..7b64146 100644
--- a/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h
+++ b/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h
@@ -102,7 +102,6 @@ protected:
   SubsampleImageFilter ()
     {
     m_SubsampleFactor.Fill(1);
-    //this->SetNumberOfThreads(1);
     }
   ~SubsampleImageFilter() ITK_OVERRIDE {}
 
diff --git a/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.txx b/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.txx
index 1848cc6..7e95452 100644
--- a/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.txx
+++ b/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.txx
@@ -83,7 +83,7 @@ SubsampleImageFilter<TInputImage, TOutputImage, TDirectionOfTransformation>
 {
   Superclass::CallCopyOutputRegionToInputRegion(destRegion, srcRegion);
 
-  if (static_cast<int>(DirectionOfTransformation) == Wavelet::INVERSE)
+  if (DirectionOfTransformation == Wavelet::INVERSE)
     {
     typename OutputImageRegionType::IndexType srcIndex = srcRegion.GetIndex();
     typename OutputImageRegionType::SizeType  srcSize = srcRegion.GetSize();
@@ -112,7 +112,7 @@ SubsampleImageFilter<TInputImage, TOutputImage, TDirectionOfTransformation>
 {
   Superclass::CallCopyInputRegionToOutputRegion(destRegion, srcRegion);
 
-  if (static_cast<int>(DirectionOfTransformation) == Wavelet::INVERSE)
+  if (DirectionOfTransformation == Wavelet::INVERSE)
     {
     typename InputImageRegionType::IndexType srcIndex = srcRegion.GetIndex();
     typename InputImageRegionType::SizeType  srcSize = srcRegion.GetSize();
@@ -161,8 +161,7 @@ SubsampleImageFilter<TInputImage, TOutputImage, TDirectionOfTransformation>
   SubsampledImageRegionConstIterator<InputImageType> inputIter
     (this->GetInput(), inputRegionForThread);
 
-  if (static_cast<int>(itkGetStaticConstMacro(DirectionOfTransformation))
-        == static_cast<int>(Wavelet::FORWARD))
+  if (DirectionOfTransformation  == Wavelet::FORWARD)
     {
     inputIter.SetSubsampleFactor(GetSubsampleFactor());
     inputIter.GoToBegin();
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h
index 0089018..cc454f0 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h
+++ b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h
@@ -399,6 +399,11 @@ protected:
   WaveletFilterBank();
   ~WaveletFilterBank() ITK_OVERRIDE {}
 
+  void VerifyInputInformation() ITK_OVERRIDE
+  {
+
+  }
+
   /** GenerateOutputInformation
     * Set the size of the output image depending on the decimation factor
     * Copy information from the input image if existing.
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx
index 7753842..7e7d238 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx
+++ b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx
@@ -27,9 +27,6 @@
 
 #include "itkPeriodicBoundaryCondition.h"
 
-// FIXME
-#define __myDebug__ 0
-
 namespace otb {
 
 /**
@@ -54,7 +51,6 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
   m_UpSampleFilterFactor = 0;
   m_SubsampleImageFactor = 1;
 
-  //this->SetNumberOfThreads(1);
 }
 
 template <class TInputImage, class TOutputImage, class TWaveletOperator>
@@ -66,11 +62,9 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
 
   if (GetSubsampleImageFactor() == 1) return;
 
-#if __myDebug__
   otbGenericMsgDebugMacro(<< " down sampling output regions by a factor of " << GetSubsampleImageFactor());
   otbGenericMsgDebugMacro(<< "initial region    " << this->GetInput()->GetLargestPossibleRegion().GetSize()[0]
                           << "," << this->GetInput()->GetLargestPossibleRegion().GetSize()[1]);
-#endif
 
   OutputImageRegionType newRegion;
   this->CallCopyInputRegionToOutputRegion(newRegion, this->GetInput()->GetLargestPossibleRegion());
@@ -80,9 +74,8 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
     this->GetOutput(i)->SetRegions(newRegion);
     }
 
-#if __myDebug__
   otbGenericMsgDebugMacro(<< "new region output " << newRegion.GetSize()[0] << "," << newRegion.GetSize()[1]);
-#endif
+
 }
 
 template <class TInputImage, class TOutputImage, class TWaveletOperator>
@@ -185,12 +178,13 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
     this->CallCopyInputRegionToOutputRegion(InputImageDimension - 1 - direction,
                                             smallerRegion, largerRegion);
 
-    for (unsigned int i = 0; i < m_InternalImages[direction].size(); ++i)
+    const unsigned int d = InputImageDimension - 2 - direction;
+    for (unsigned int i = 0; i < m_InternalImages[d].size(); ++i)
       {
-      m_InternalImages[InputImageDimension - 2 - direction][i] = OutputImageType::New();
-      m_InternalImages[InputImageDimension - 2 - direction][i]->SetRegions(smallerRegion);
-      m_InternalImages[InputImageDimension - 2 - direction][i]->Allocate();
-      m_InternalImages[InputImageDimension - 2 - direction][i]->FillBuffer(0);
+      m_InternalImages[d][i] = OutputImageType::New();
+      m_InternalImages[d][i]->SetRegions(smallerRegion);
+      m_InternalImages[d][i]->Allocate();
+      m_InternalImages[d][i]->FillBuffer(0);
       }
 
     largerRegion = smallerRegion;
@@ -642,21 +636,18 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::INVERSE>
       }
     }
 
-#if __myDebug__
   otbGenericMsgDebugMacro(<< " up sampling output regions by a factor of " << GetSubsampleImageFactor());
 
   otbGenericMsgDebugMacro(<< "initial region    "
                           << this->GetInput(0)->GetLargestPossibleRegion().GetSize()[0]
                           << "," << this->GetInput(0)->GetLargestPossibleRegion().GetSize()[1]);
-#endif
 
   OutputImageRegionType newRegion;
   this->CallCopyInputRegionToOutputRegion(newRegion, this->GetInput(0)->GetLargestPossibleRegion());
   this->GetOutput()->SetRegions(newRegion);
 
-#if __myDebug__
   otbGenericMsgDebugMacro(<< "new region output " << newRegion.GetSize()[0] << "," << newRegion.GetSize()[1]);
-#endif
+
 }
 
 template <class TInputImage, class TOutputImage, class TWaveletOperator>
@@ -1178,6 +1169,7 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::INVERSE>
       typename FilterType::Pointer overSampledLowPass = FilterType::New();
       overSampledLowPass->SetInput(cropedLowPass);
       overSampledLowPass->SetSubsampleFactor(delta);
+      overSampledLowPass->SetNumberOfThreads(1);
       overSampledLowPass->Update();
 
       InputImagePointerType cropedHighPass = InputImageType::New();
@@ -1196,6 +1188,7 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::INVERSE>
       typename FilterType::Pointer overSampledHighPass = FilterType::New();
       overSampledHighPass->SetInput(cropedHighPass);
       overSampledHighPass->SetSubsampleFactor(delta);
+      overSampledHighPass->SetNumberOfThreads(1);
       overSampledHighPass->Update();
 
       InnerProductType innerProduct;
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletImageFilter.h b/Modules/Filtering/Wavelet/include/otbWaveletImageFilter.h
new file mode 100644
index 0000000..76ac1af
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletImageFilter.h
@@ -0,0 +1,112 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#ifndef otbWaveletImageFilter_h
+#define otbWaveletImageFilter_h
+
+#include "otbWaveletOperator.h"
+#include "otbWaveletFilterBank.h"
+#include "otbWaveletTransform.h"
+#include "otbWaveletsBandsListToWaveletsSynopsisImageFilter.h"
+
+namespace otb {
+
+/** \class WaveletImageFilter
+ * \brief
+ * This filter performs wavelet forward transform. 
+ * It takes three template arguments: Input, Output and WaveletOperator
+ * This filter is not streamed.
+ *
+ * \ingroup OTBWavelet
+ * \sa WaveletInverseImageFilter
+ * \sa WaveletsBandsListToWaveletsSynopsisImageFilter
+ * \sa WaveletGenerator
+ */
+template < class TInputImage,
+           class TOutputImage,
+           Wavelet::Wavelet TMotherWaveletOperator >
+class WaveletImageFilter :
+  public itk::ImageToImageFilter< TInputImage, TOutputImage >
+{
+public:
+  /** Standard class typedefs. */
+  typedef TInputImage                                                                InputImageType;
+  typedef TOutputImage                                                               OutputImageType;
+
+  itkStaticConstMacro( ImageDimension,            unsigned int,                      InputImageType::ImageDimension );
+  itkStaticConstMacro( MotherWaveletOperator,     short,     TMotherWaveletOperator );
+  itkStaticConstMacro( DirectionOfTransformation, short,     otb::Wavelet::FORWARD );
+
+  typedef WaveletImageFilter<InputImageType,OutputImageType, TMotherWaveletOperator>  Self;
+  typedef itk::ImageToImageFilter<InputImageType, OutputImageType>                    Superclass;
+  typedef itk::SmartPointer<Self>                                                     Pointer;
+  typedef itk::SmartPointer<const Self>                                               ConstPointer;
+
+  typedef typename InputImageType::PixelType                                          InputPixelType;
+
+  typedef otb::WaveletOperator< TMotherWaveletOperator, otb::Wavelet::FORWARD, InputPixelType, ImageDimension >
+    WaveletOperatorType;
+  typedef otb::WaveletFilterBank< InputImageType, InputImageType, WaveletOperatorType, otb::Wavelet::FORWARD >
+    FilterBankType;
+  typedef otb::WaveletTransform< InputImageType, InputImageType, FilterBankType, otb::Wavelet::FORWARD >
+    WaveletTransformFilterType;
+  typedef typename WaveletTransformFilterType::Pointer
+    WaveletTransformFilterPointerType;
+
+  typedef typename WaveletTransformFilterType::OutputImageListType
+    WaveletTransformFilterOutputImageListType;
+  typedef otb::WaveletsBandsListToWaveletsSynopsisImageFilter<WaveletTransformFilterOutputImageListType, OutputImageType>
+    WaveletBandsListToWaveletsSynopsisImageFilterType;
+  typedef typename WaveletBandsListToWaveletsSynopsisImageFilterType::Pointer
+    WaveletBandsListToWaveletsSynopsisImageFilterPointerType;
+
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(WaveletImageFilter, ImageToImageFilter);
+
+  itkGetMacro(NumberOfDecompositions,unsigned int);
+  itkSetMacro(NumberOfDecompositions,unsigned int);
+
+protected:
+  WaveletImageFilter();
+  virtual ~WaveletImageFilter();
+
+  virtual void GenerateInputRequestedRegion();
+
+  virtual void GenerateData();
+
+  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  WaveletImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  WaveletTransformFilterPointerType m_WaveletTransform;
+  WaveletBandsListToWaveletsSynopsisImageFilterPointerType m_WaveletBandsListToWaveletsSynopsis;
+  unsigned int m_NumberOfDecompositions;
+};
+
+}
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbWaveletImageFilter.txx"
+#endif
+
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletImageFilter.txx b/Modules/Filtering/Wavelet/include/otbWaveletImageFilter.txx
new file mode 100644
index 0000000..2900123
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletImageFilter.txx
@@ -0,0 +1,95 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#ifndef otbWaveletImageFilter_txx
+#define otbWaveletImageFilter_txx
+
+#include "otbWaveletImageFilter.h"
+
+namespace otb
+{
+/** Constructor */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+WaveletImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::WaveletImageFilter() : m_NumberOfDecompositions(2)
+{
+  m_WaveletTransform                   = WaveletTransformFilterType::New();
+  m_WaveletTransform->SetSubsampleImageFactor(2);
+
+  m_WaveletBandsListToWaveletsSynopsis = WaveletBandsListToWaveletsSynopsisImageFilterType::New();
+  m_WaveletBandsListToWaveletsSynopsis->SetInput( m_WaveletTransform->GetOutput() );
+}
+
+/** Destructor */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+WaveletImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::~WaveletImageFilter()
+{
+}
+
+/**
+ * GenerateInputRequestedRegion
+ */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::GenerateInputRequestedRegion(void)
+{
+  // call the superclass' implementation of this method
+  Superclass::GenerateInputRequestedRegion();
+
+  // get pointers to the inputs
+  typename InputImageType::Pointer input  =
+    const_cast<InputImageType *> (this->GetInput());
+
+  if ( !input )
+    {
+    return;
+    }
+
+  input->SetRequestedRegionToLargestPossibleRegion();
+}
+
+/**
+ * Main computation method
+ */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::GenerateData()
+{
+  m_WaveletTransform->SetInput( this->GetInput() );
+  m_WaveletTransform->SetNumberOfDecompositions( m_NumberOfDecompositions );
+  m_WaveletBandsListToWaveletsSynopsis->GraftOutput( this->GetOutput() );
+  m_WaveletBandsListToWaveletsSynopsis->Update();
+  this->GraftOutput( m_WaveletBandsListToWaveletsSynopsis->GetOutput() );
+}
+
+/**
+ * PrintSelf Method
+ */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+}
+
+}
+
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletInverseImageFilter.h b/Modules/Filtering/Wavelet/include/otbWaveletInverseImageFilter.h
new file mode 100644
index 0000000..16eb9d4
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletInverseImageFilter.h
@@ -0,0 +1,113 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#ifndef otbWaveletInverseImageFilter_h
+#define otbWaveletInverseImageFilter_h
+
+#include "otbWaveletOperator.h"
+#include "otbWaveletFilterBank.h"
+#include "otbWaveletTransform.h"
+#include "otbWaveletsSynopsisImageToWaveletsBandsListFilter.h"
+
+namespace otb {
+
+/** \class WaveletInverseImageFilter
+ * \brief
+ * This filter performs wavelet inverse transform. 
+ * It takes three template arguments: Input, Output and WaveletOperator
+ * This filter is not streamed.
+ * \ingroup OTBWavelet
+ * \sa WaveletImageFilter
+ * \sa WaveletsSynopsisImageToWaveletsBandsListFilter
+ * \sa WaveletGenerator
+ */
+template < class TInputImage,
+           class TOutputImage,
+           Wavelet::Wavelet TMotherWaveletOperator >
+class WaveletInverseImageFilter :
+  public itk::ImageToImageFilter< TInputImage, TOutputImage >
+{
+public:
+  /** Standard class typedefs. */
+  typedef TInputImage                                                                InputImageType;
+  typedef TOutputImage                                                               OutputImageType;
+
+  itkStaticConstMacro( ImageDimension,            unsigned int, InputImageType::ImageDimension );
+  itkStaticConstMacro( MotherWaveletOperator,     short,        TMotherWaveletOperator );
+  itkStaticConstMacro( DirectionOfTransformation, short ,       otb::Wavelet::FORWARD );
+
+  typedef WaveletInverseImageFilter<InputImageType,OutputImageType, TMotherWaveletOperator>  Self;
+  typedef itk::ImageToImageFilter<InputImageType, OutputImageType>                    Superclass;
+  typedef itk::SmartPointer<Self>                                                     Pointer;
+  typedef itk::SmartPointer<const Self>                                               ConstPointer;
+
+  typedef typename InputImageType::PixelType                                          InputPixelType;
+  typedef typename OutputImageType::PixelType                                         OutputPixelType;
+
+  typedef otb::WaveletOperator< TMotherWaveletOperator, otb::Wavelet::INVERSE, OutputPixelType, ImageDimension >
+    WaveletOperatorType;
+  typedef otb::WaveletFilterBank< OutputImageType, OutputImageType, WaveletOperatorType, otb::Wavelet::INVERSE >
+    FilterBankType;
+  typedef otb::WaveletTransform< OutputImageType, OutputImageType, FilterBankType, otb::Wavelet::INVERSE >
+    WaveletInverseTransformFilterType;
+  typedef typename WaveletInverseTransformFilterType::Pointer
+    WaveletInverseTransformFilterPointerType;
+
+  typedef otb::WaveletsSynopsisImageToWaveletsBandsListFilter<InputImageType, typename WaveletInverseTransformFilterType::InputImageListType>
+    WaveletsSynopsisImageToWaveletsBandsListFilterType;
+  typedef typename WaveletsSynopsisImageToWaveletsBandsListFilterType::Pointer
+    WaveletsSynopsisImageToWaveletsBandsListFilterPointerType;
+
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(WaveletInverseImageFilter, ImageToImageFilter);
+
+  itkGetMacro(NumberOfDecompositions,unsigned int);
+  itkSetMacro(NumberOfDecompositions,unsigned int);
+
+  /** If the filter is modified, the internal filters need to be modified too */
+  virtual void Modified() const;
+
+protected:
+  WaveletInverseImageFilter();
+  virtual ~WaveletInverseImageFilter();
+
+  virtual void GenerateInputRequestedRegion();
+
+  virtual void GenerateData();
+
+  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  WaveletInverseImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  WaveletsSynopsisImageToWaveletsBandsListFilterPointerType m_SynopsisImageToWaveletsBandsList;
+  WaveletInverseTransformFilterPointerType m_WaveletTransform;
+  unsigned int m_NumberOfDecompositions;
+};
+
+}
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbWaveletInverseImageFilter.txx"
+#endif
+
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletInverseImageFilter.txx b/Modules/Filtering/Wavelet/include/otbWaveletInverseImageFilter.txx
new file mode 100644
index 0000000..58ac44d
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletInverseImageFilter.txx
@@ -0,0 +1,109 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#ifndef __otbWaveletInverseImageFilter_txx
+#define __otbWaveletInverseImageFilter_txx
+
+#include "otbWaveletInverseImageFilter.h"
+
+namespace otb
+{
+/** Constructor */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+WaveletInverseImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::WaveletInverseImageFilter() : m_NumberOfDecompositions(2)
+{
+  m_SynopsisImageToWaveletsBandsList = WaveletsSynopsisImageToWaveletsBandsListFilterType::New();
+  m_SynopsisImageToWaveletsBandsList->SetDecimationRatio(2);
+
+  m_WaveletTransform = WaveletInverseTransformFilterType::New();
+  m_WaveletTransform->SetSubsampleImageFactor(2);
+  m_WaveletTransform->SetInput( m_SynopsisImageToWaveletsBandsList->GetOutput() );
+
+}
+
+/** Destructor */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+WaveletInverseImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::~WaveletInverseImageFilter()
+{
+}
+
+/** Destructor */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletInverseImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::Modified() const
+{
+  Superclass::Modified();
+  m_SynopsisImageToWaveletsBandsList->Modified();
+  m_WaveletTransform->Modified();
+}
+
+/**
+ * GenerateInputRequestedRegion
+ */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletInverseImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::GenerateInputRequestedRegion(void)
+{
+  // call the superclass' implementation of this method
+  Superclass::GenerateInputRequestedRegion();
+
+  // get pointers to the inputs
+  typename InputImageType::Pointer input  =
+    const_cast<InputImageType *> (this->GetInput());
+
+  if ( !input )
+    {
+    return;
+    }
+
+  input->SetRequestedRegionToLargestPossibleRegion();
+}
+
+/**
+ * Main computation method
+ */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletInverseImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::GenerateData()
+{
+  m_SynopsisImageToWaveletsBandsList->SetInput( this->GetInput() );
+  m_SynopsisImageToWaveletsBandsList->SetNumberOfLevels( m_NumberOfDecompositions );
+
+  m_WaveletTransform->GraftOutput( this->GetOutput() );
+  m_WaveletTransform->Update();
+  this->GraftOutput( m_WaveletTransform->GetOutput() );
+}
+
+/**
+ * PrintSelf Method
+ */
+template <class TInputImage, class TOutputImage, Wavelet::Wavelet TMotherWaveletOperator>
+void
+WaveletInverseImageFilter<TInputImage, TOutputImage, TMotherWaveletOperator>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+}
+
+}
+
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletsBandsListToWaveletsSynopsisImageFilter.h b/Modules/Filtering/Wavelet/include/otbWaveletsBandsListToWaveletsSynopsisImageFilter.h
new file mode 100644
index 0000000..9e22f84
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletsBandsListToWaveletsSynopsisImageFilter.h
@@ -0,0 +1,103 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef otbWaveletsBandsListToWaveletsSynopsisImageFilter_h
+#define otbWaveletsBandsListToWaveletsSynopsisImageFilter_h
+
+
+#include "otbImageListToImageFilter.h"
+
+namespace otb
+{
+  
+/** \class WaveletsBandsListToWaveletsSynopsisImageFilter
+ *  \brief Converts a list of wavelets bands to the traditional multi-resolution wavelets view
+ *
+ *  The decimation ratio is taken into account.
+ *
+ * \ingroup OTBWavelet
+ * \sa WaveletsSynopsisImageToWaveletsBandsListFilter
+ */
+
+template <class TImageList, class TImage>
+class ITK_EXPORT WaveletsBandsListToWaveletsSynopsisImageFilter
+      : public ImageListToImageFilter<typename TImageList::ImageType, TImage>
+{
+public:
+  /** Standard typedefs */
+  typedef WaveletsBandsListToWaveletsSynopsisImageFilter Self;
+  typedef ImageListToImageFilter<
+          typename TImageList::ImageType,TImage>         Superclass;
+  typedef itk::SmartPointer<Self>                        Pointer;
+  typedef itk::SmartPointer<const Self>                  ConstPointer;
+
+  /** Type macro */
+  itkNewMacro(Self);
+
+  /** Useful typedefs */
+  typedef TImageList                                     InputImageListType;
+  typedef typename InputImageListType::ImageType         InputImageType;
+  typedef TImage                                         OutputImageType;
+  typedef typename OutputImageType::RegionType           RegionType;
+
+  /** Creation through object factory macro */
+  itkTypeMacro(WaveletsBandsListToWaveletsSynopsisImageFilter,ImageToImageListFilter);
+
+  /** Set the decimation ratio */
+  itkSetMacro(DecimationRatio,unsigned int);
+
+  /** Get the decimation ratio */
+  itkGetMacro(DecimationRatio,unsigned int);
+
+protected:
+  /** Main computation method */
+  virtual void ThreadedGenerateData(const RegionType & outputRegionForThread, itk::ThreadIdType threadId);
+
+  /** GenerateOutputInformation
+   * Set the number of bands of the output.
+   * Copy informations from the first image of the list if existing.
+   **/
+  virtual void GenerateOutputInformation(void);
+
+  /**
+   * GenerateInputRequestedRegion
+   * Set the requested region of each image in the list.
+   */
+  virtual void GenerateInputRequestedRegion(void);
+
+  /** Constructor */
+  WaveletsBandsListToWaveletsSynopsisImageFilter();
+
+  /** Destructor */
+  virtual ~WaveletsBandsListToWaveletsSynopsisImageFilter();
+
+  /**PrintSelf method */
+  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  WaveletsBandsListToWaveletsSynopsisImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  /** The decimation ratio used in the decomposition */
+  unsigned int m_DecimationRatio;
+};
+}// End namespace otb
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbWaveletsBandsListToWaveletsSynopsisImageFilter.txx"
+#endif
+
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletsBandsListToWaveletsSynopsisImageFilter.txx b/Modules/Filtering/Wavelet/include/otbWaveletsBandsListToWaveletsSynopsisImageFilter.txx
new file mode 100644
index 0000000..ea21c6c
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletsBandsListToWaveletsSynopsisImageFilter.txx
@@ -0,0 +1,222 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef otbWaveletsBandsListToWaveletsSynopsisImageFilter_txx
+#define otbWaveletsBandsListToWaveletsSynopsisImageFilter_txx
+
+#include "otbWaveletsBandsListToWaveletsSynopsisImageFilter.h"
+#include "itkImageRegionIterator.h"
+#include "itkImageRegionConstIterator.h"
+#include "otbMacro.h"
+#include "itkProgressReporter.h"
+
+namespace otb
+{
+/** Constructor */
+template <class TImageList, class TImage>
+WaveletsBandsListToWaveletsSynopsisImageFilter<TImageList,TImage>
+::WaveletsBandsListToWaveletsSynopsisImageFilter() : m_DecimationRatio(2)
+{}
+
+/** Destructor */
+template <class TImageList, class TImage>
+WaveletsBandsListToWaveletsSynopsisImageFilter<TImageList,TImage>
+::~WaveletsBandsListToWaveletsSynopsisImageFilter()
+{}
+
+/**
+ * GenerateOutputInformation
+ */
+template <class TImageList, class TImage>
+void
+WaveletsBandsListToWaveletsSynopsisImageFilter<TImageList,TImage>
+::GenerateOutputInformation(void)
+{
+  // We must set the size of the output image to be twice the size of the last image
+  // of the image list, which is the first band.
+  if(this->GetOutput())
+  {
+    if (this->GetInput()->Size()>0)
+    {
+    // Retrieve the largest band
+    typename InputImageType::Pointer lastBand = this->GetInput()->Back();
+
+    // Retrieve the region of the largest band
+    RegionType largestBandRegion = lastBand->GetLargestPossibleRegion();
+
+    // Retrieve the size of the largest region
+    typename RegionType::SizeType outputSize = largestBandRegion.GetSize();
+
+    // Multiply this size by two
+    outputSize[0]*=m_DecimationRatio;
+    outputSize[1]*=m_DecimationRatio;
+
+    // Build the output region
+    RegionType outputLargestRegion;
+    outputLargestRegion.SetSize(outputSize);
+
+    // Copy information to the output image
+    this->GetOutput()->CopyInformation(lastBand);
+    this->GetOutput()->SetLargestPossibleRegion(outputLargestRegion);
+
+    }
+  }
+}
+/**
+ * GenerateInputRequestedRegion
+ */
+template <class TImageList, class TImage>
+void
+WaveletsBandsListToWaveletsSynopsisImageFilter<TImageList,TImage>
+::GenerateInputRequestedRegion(void)
+{
+  typename InputImageListType::Pointer inputPtr = this->GetInput();
+  typename InputImageListType::ConstIterator inputListIt = inputPtr->Begin();
+  while (inputListIt!=inputPtr->End())
+    {
+      inputListIt.Get()->SetRequestedRegionToLargestPossibleRegion();
+      ++inputListIt;
+    }
+}
+
+/**
+ * Main computation method
+ */
+template <class TImageList, class TImage>
+void
+WaveletsBandsListToWaveletsSynopsisImageFilter<TImageList,TImage>
+::ThreadedGenerateData(const RegionType & outputRegionForThread,
+                       itk::ThreadIdType threadId)
+{
+  // Retrieve input and output pointers
+  typename InputImageListType::Pointer inputPtr = this->GetInput();
+  typename OutputImageType::Pointer outputPtr = this->GetOutput();
+
+  // Set up progress reporting
+  itk::ProgressReporter progress(this,
+                                 threadId,
+                                 outputRegionForThread.GetNumberOfPixels());
+
+  // defines input and output iterators
+  typedef itk::ImageRegionConstIterator<InputImageType> InputIteratorType;
+  typedef itk::ImageRegionIterator<OutputImageType>     OutputIteratorType;
+
+  // Set up an iterator on the input wavelets band
+  typename InputImageListType::ConstIterator inputListIt = inputPtr->Begin();
+  unsigned int bandIndex = 0;
+
+  // Compute number of decomposition levels
+  unsigned int numberOfDecompositionLevels = (inputPtr->Size()-1)/3;
+
+  // Retrieve the largest possible region size
+  typename RegionType::SizeType largestSize = outputPtr->GetLargestPossibleRegion().GetSize();
+
+  // Iterate on each band
+  for (;inputListIt!=inputPtr->End();++inputListIt,++bandIndex)
+  {
+  // Build a band offset
+  typename RegionType::OffsetType currentOffset;
+  currentOffset.Fill(0);
+
+  // Initialise Current level
+  unsigned int currentLevel = 0;
+  unsigned int currentSubBand = 0;
+
+  if(bandIndex > 0)
+    {
+    // Compute current level and sub band
+    currentLevel = 1 + (bandIndex-1)/3;
+    currentSubBand = (bandIndex-1)%3;
+
+    // Compute potentiel offset in x and y
+    unsigned int offsetX = largestSize[0]/(unsigned int)vcl_pow((double)m_DecimationRatio,(double)1+numberOfDecompositionLevels-currentLevel);
+    unsigned int offsetY = largestSize[1]/(unsigned int)vcl_pow((double)m_DecimationRatio,(double)1+numberOfDecompositionLevels-currentLevel);
+
+    // Compute final offset according to the subband index
+    if(currentSubBand == 0)
+      {
+      currentOffset[0]+=offsetX;
+      }
+    else if(currentSubBand == 1)
+      {
+      currentOffset[1]+=offsetY;
+      }
+    else
+      {
+      currentOffset[0]+=offsetX;
+      currentOffset[1]+=offsetY;
+      }
+    }
+    // Retrieve current band region
+    RegionType currentBandRegion = inputListIt.Get()->GetLargestPossibleRegion();
+
+    // Apply offset to get the current output region
+    RegionType currentOutputRegion = currentBandRegion;
+    typename RegionType::IndexType currentOutputIndex = currentBandRegion.GetIndex();
+    currentOutputIndex+=currentOffset;
+    currentOutputRegion.SetIndex(currentOutputIndex);
+
+    // Crop with the outputRegionForThread. If the crop fails,
+    // it means that currentOutputRegion is outside of outputRegionForThread,
+    // and in this case we skip to the next image in the list.
+    if(currentOutputRegion.Crop(outputRegionForThread))
+      {
+      // Compute the corresponding input region
+      RegionType currentInputRegion = currentBandRegion;
+      currentOutputIndex = currentOutputRegion.GetIndex();
+      typename RegionType::IndexType currentInputIndex = currentBandRegion.GetIndex();
+
+      for(unsigned int i = 0; i < InputImageType::ImageDimension;++i)
+        {
+        currentInputIndex[i]+=currentOutputIndex[i];
+        currentInputIndex[i]-=currentOffset[i];
+        }
+        currentInputRegion.SetSize(currentOutputRegion.GetSize());
+        currentInputRegion.SetIndex(currentInputIndex);
+
+      InputIteratorType inIt(inputListIt.Get(),currentInputRegion);
+      OutputIteratorType outIt(outputPtr,currentOutputRegion);
+
+      // Go to begin
+      inIt.GoToBegin();
+      outIt.GoToBegin();
+
+      // Copy pixels
+      while(!inIt.IsAtEnd() && !outIt.IsAtEnd())
+      {
+        // Copy pixel value
+        outIt.Set(static_cast<typename OutputImageType::InternalPixelType>(inIt.Get()));
+        // Step forward
+        ++inIt;
+        ++outIt;
+        progress.CompletedPixel();
+      }
+    }
+  }
+}
+/**
+ * PrintSelf Method
+ */
+template <class TImageType, class TImageList>
+void
+WaveletsBandsListToWaveletsSynopsisImageFilter<TImageType,TImageList>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+}
+} // End namespace otb
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletsSynopsisImageToWaveletsBandsListFilter.h b/Modules/Filtering/Wavelet/include/otbWaveletsSynopsisImageToWaveletsBandsListFilter.h
new file mode 100644
index 0000000..8ad9a30
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletsSynopsisImageToWaveletsBandsListFilter.h
@@ -0,0 +1,122 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef otbWaveletsSynopsisImageToWaveletsBandsListFilter_h
+#define otbWaveletsSynopsisImageToWaveletsBandsListFilter_h
+
+#include "otbImageToImageListFilter.h"
+#include "itkRegionOfInterestImageFilter.h"
+
+
+namespace otb
+{
+
+/** \class WaveletsSynopsisImageToWaveletsBandsListFilter
+ *  \brief This class convert the standard wavelets view to a list of bands.
+ *
+ * \ingroup OTBWavelet
+ * \sa WaveletsBandsListToWaveletsSynopsisImageFilter
+ */
+
+template <class TImage, class TImageList>
+class ITK_EXPORT WaveletsSynopsisImageToWaveletsBandsListFilter
+      : public ImageToImageListFilter<TImage,typename TImageList::ImageType>
+{
+public:
+  /** Standard typedefs */
+  typedef WaveletsSynopsisImageToWaveletsBandsListFilter Self;
+  typedef ImageToImageListFilter<TImage,
+  typename TImageList::ImageType>                        Superclass;
+  typedef itk::SmartPointer<Self>                        Pointer;
+  typedef itk::SmartPointer<const Self>                  ConstPointer;
+
+  /** Type macro */
+  itkNewMacro(Self);
+
+  /** Creation through object factory macro */
+  itkTypeMacro(WaveletsSynopsisImageToWaveletsBandsListFilter,ImageToImageListFilter);
+
+  /** Template parameters typedefs */
+  typedef TImage                                          InputImageType;
+  typedef typename InputImageType::RegionType             RegionType;
+  typedef TImageList                                      OutputImageListType;
+  typedef typename OutputImageListType::ImageType         OutputImageType;
+
+  typedef itk::RegionOfInterestImageFilter<
+	  InputImageType,
+	  InputImageType > ExtractFilterType;
+  
+  typedef typename ExtractFilterType::Pointer ExtractFilterPointerType;
+  
+  typedef std::vector<ExtractFilterPointerType>           ExtractFilterVectorType;
+
+  /** Set the number of levels */
+  itkSetMacro(NumberOfLevels,unsigned int);
+
+  /** Get the number of levels */
+  itkGetMacro(NumberOfLevels,unsigned int);
+
+  /** Set the decimation ratio */
+  itkSetMacro(DecimationRatio,unsigned int);
+
+  /** Get the decimation ratio */
+  itkGetMacro(DecimationRatio,unsigned int);
+
+  /** If the filter is modified, the extract list need to be regenerated */
+  virtual void Modified() const;
+
+protected:
+  /** Constructor */
+  WaveletsSynopsisImageToWaveletsBandsListFilter();
+
+  /** Destructor */
+  virtual ~WaveletsSynopsisImageToWaveletsBandsListFilter();
+
+  /**PrintSelf method */
+  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+  /** Generate the input requested region from the first element in the list. */
+  virtual void GenerateInputRequestedRegion(void);
+
+  /** Generate the output information by building the output list. */
+  virtual void GenerateOutputInformation(void);
+
+  /** Main computation method */
+  virtual void GenerateData(void);
+
+private:
+  WaveletsSynopsisImageToWaveletsBandsListFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  /** The number of levels in the decomposition */
+  unsigned int m_NumberOfLevels;
+
+  /** The decimation ratio used in the decomposition */
+  unsigned int m_DecimationRatio;
+
+  /** The vector of extraction filters for each band */
+  ExtractFilterVectorType m_ExtractFilters;
+
+  /** True if extract list is up-to-date */
+  mutable bool m_ExtractFiltersUpToDate;
+};
+}// End namespace otb
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbWaveletsSynopsisImageToWaveletsBandsListFilter.txx"
+#endif
+
+#endif
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletsSynopsisImageToWaveletsBandsListFilter.txx b/Modules/Filtering/Wavelet/include/otbWaveletsSynopsisImageToWaveletsBandsListFilter.txx
new file mode 100644
index 0000000..45de1a2
--- /dev/null
+++ b/Modules/Filtering/Wavelet/include/otbWaveletsSynopsisImageToWaveletsBandsListFilter.txx
@@ -0,0 +1,179 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef otbWaveletsSynopsisImageToWaveletsBandsListFilter_txx
+#define otbWaveletsSynopsisImageToWaveletsBandsListFilter_txx
+
+#include "otbWaveletsSynopsisImageToWaveletsBandsListFilter.h"
+
+namespace otb
+{
+/** Constructor */
+template <class TImage, class TImageList>
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::WaveletsSynopsisImageToWaveletsBandsListFilter() : m_NumberOfLevels(1),
+                                                     m_DecimationRatio(2),
+                                                     m_ExtractFilters(),
+                                                     m_ExtractFiltersUpToDate(false)
+{}
+
+/** Destructor */
+template <class TImage, class TImageList>
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::~WaveletsSynopsisImageToWaveletsBandsListFilter()
+{
+  m_ExtractFilters.clear();
+}
+
+/** Modify overload */
+template <class TImage, class TImageList>
+void
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::Modified() const
+{
+  // Call superclass implementation
+  Superclass::Modified();
+  m_ExtractFiltersUpToDate = false;
+}
+
+/** Generate the input requested region from the first element in the list. */
+template <class TImage, class TImageList>
+void
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::GenerateOutputInformation(void)
+{
+  typename OutputImageListType::Pointer outputPtr = this->GetOutput();
+  typename InputImageType::ConstPointer inputPtr = this->GetInput();
+
+  // Check if we need to regenerate the extract filters
+  if (inputPtr && !m_ExtractFiltersUpToDate)
+  {
+    // Retrieve image size
+    typename RegionType::SizeType largestSize = inputPtr->GetLargestPossibleRegion().GetSize();
+
+    // Compute the number of output images
+    unsigned int numberOfOutputImages = m_NumberOfLevels*3 + 1;
+
+    // Clear the output image list
+    outputPtr->Clear();
+
+    // Clear the extract filter vector
+    m_ExtractFilters.clear();
+
+    // For each output image
+    for (unsigned int i=0;i<numberOfOutputImages;++i)
+      {
+      // Build the current extract filter
+      typename ExtractFilterType::Pointer currentExtract = ExtractFilterType::New();
+      currentExtract->SetInput(inputPtr);
+
+      // Add it to the filter list
+      m_ExtractFilters.push_back(currentExtract);
+
+      // Add its output to the filter's output
+      outputPtr->PushBack(currentExtract->GetOutput());
+
+      // Build the corresponding region
+      RegionType currentRegion;
+      typename RegionType::IndexType currentIndex;
+      typename RegionType::SizeType  currentSize;
+      currentIndex.Fill(0);
+
+      // If this is not the first sub-band
+      if(i > 0)
+        {
+        // Compute current sub-band and level
+        unsigned int currentLevel =   (i-1)/3;
+        unsigned int currentSubBand = (i-1)%3;
+
+        unsigned int offsetX = largestSize[0]/(unsigned int)vcl_pow((double)m_DecimationRatio,(double)m_NumberOfLevels-currentLevel);
+        unsigned int offsetY = largestSize[1]/(unsigned int)vcl_pow((double)m_DecimationRatio,(double)m_NumberOfLevels-currentLevel);
+
+        // Compute current size
+        currentSize[0] = offsetX;
+        currentSize[1] = offsetY;
+
+        // Compute current index
+        if(currentSubBand == 0)
+          {
+           currentIndex[0]+= offsetX;
+          }
+        else if(currentSubBand == 1)
+          {
+           currentIndex[1]= offsetY;
+          }
+        else
+          {
+          currentIndex[0]= offsetX;
+          currentIndex[1]= offsetY;
+          }
+        }
+      else
+        {
+        // The coarsest scale size
+        currentSize[0] = largestSize[0]/(unsigned int)vcl_pow((double)m_DecimationRatio,(double)m_NumberOfLevels);
+        currentSize[1] = largestSize[1]/(unsigned int)vcl_pow((double)m_DecimationRatio,(double)m_NumberOfLevels);
+        }
+      // Build current region
+      currentRegion.SetIndex(currentIndex);
+      currentRegion.SetSize(currentSize);
+      //std::cout<<"Band: "<<i<<", region "<<currentRegion<<std::endl;
+      currentExtract->SetRegionOfInterest(currentRegion);
+    }
+    m_ExtractFiltersUpToDate = true;
+  }
+}
+/** Generate the output information by building the output list. */
+template <class TImage, class TImageList>
+void
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::GenerateInputRequestedRegion(void)
+{
+  typename InputImageType::Pointer inputPtr = this->GetInput();
+
+  if (inputPtr)
+  {
+  inputPtr->SetRequestedRegionToLargestPossibleRegion();
+  }
+}
+/**
+ * Main computation method
+ */
+template <class TImage, class TImageList>
+void
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::GenerateData(void)
+{
+  // Update each extract fillter
+  for(typename ExtractFilterVectorType::iterator it = m_ExtractFilters.begin();
+      it!=m_ExtractFilters.end();++it)
+    {
+    (*it)->Update();
+    }
+}
+/**
+ * PrintSelf Method
+ */
+template <class TImage, class TImageList>
+void
+WaveletsSynopsisImageToWaveletsBandsListFilter<TImage,TImageList>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+}
+} // End namespace otb
+#endif
diff --git a/Modules/Filtering/Wavelet/test/CMakeLists.txt b/Modules/Filtering/Wavelet/test/CMakeLists.txt
index e09d0c8..f8c8023 100644
--- a/Modules/Filtering/Wavelet/test/CMakeLists.txt
+++ b/Modules/Filtering/Wavelet/test/CMakeLists.txt
@@ -15,6 +15,7 @@ otbWaveletFilterBank.cxx
 otbWaveletPacketTransformNew.cxx
 otbWaveletFilterBankNew.cxx
 otbWaveletOperatorNew.cxx
+otbWaveletImageToImageFilter.cxx
 )
 
 add_executable(otbWaveletTestDriver ${OTBWaveletTests})
@@ -572,3 +573,11 @@ otb_add_test(NAME msTuWaveletFilterBankNew COMMAND otbWaveletTestDriver
 otb_add_test(NAME msTuWaveletOperatorNew COMMAND otbWaveletTestDriver
   otbWaveletOperatorNew )
 
+otb_add_test(NAME msTvWaveletImageToImageFilter COMMAND otbWaveletTestDriver
+  --compare-image ${EPSILON_6}
+  ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+  ${TEMP}/msTvWaveletImageToImageFilterOut.tif
+  otbWaveletImageToImageFilter
+  ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+  ${TEMP}/msTvWaveletImageToImageFilterOut.tif
+  )
diff --git a/Modules/Filtering/Wavelet/test/otbWaveletImageToImageFilter.cxx b/Modules/Filtering/Wavelet/test/otbWaveletImageToImageFilter.cxx
new file mode 100644
index 0000000..7a81db8
--- /dev/null
+++ b/Modules/Filtering/Wavelet/test/otbWaveletImageToImageFilter.cxx
@@ -0,0 +1,87 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+/* 
+This test code will run a WaveletImageFilter on given input image. Output 
+from this filter is then fed to WaveletInverseImageFilter which does 
+the inverse transform. Hence output of inverse transform passed to
+ImageFileWriter will result in the input image. 
+
+Wavelet operator used is HAAR (otb::Wavelet::HAAR).
+This filter works only in single-threaded setup 
+*/
+
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbWaveletImageFilter.h"
+#include "otbWaveletInverseImageFilter.h"
+
+int otbWaveletImageToImageFilter(int argc, char * argv[])
+{
+
+  const char *       inputFileName = argv[1];
+  const char *       outputFileName = argv[argc-1];
+
+  /* Wavelet operator */
+  const otb::Wavelet::Wavelet OperatorType = otb::Wavelet::HAAR;
+  
+  const int Dimension = 2;
+  typedef double                           PixelType;
+  typedef otb::Image<PixelType, Dimension> ImageType;
+  typedef otb::ImageFileReader<ImageType>  ReaderType;
+
+
+
+  typedef otb::WaveletImageFilter<
+	  ImageType,
+	  ImageType,
+	  OperatorType> FwdFilterType;
+
+  typedef otb::WaveletInverseImageFilter<
+	  ImageType,
+	  ImageType,
+	  OperatorType> InvFilterType;
+
+  typedef otb::ImageFileWriter<ImageType> WriterType;
+  
+  //  itk::MultiThreader::SetGlobalMaximumNumberOfThreads( 1 );
+
+  /* Reading */
+  ReaderType::Pointer reader = ReaderType::New();
+  reader->SetFileName(inputFileName);
+
+  /* Forward Transformation */  
+  FwdFilterType::Pointer fwdFilter = FwdFilterType::New();
+ 
+  fwdFilter->SetInput(reader->GetOutput());
+  fwdFilter->Update();
+
+  /* Inverse Transformation */  
+  
+  InvFilterType::Pointer invFilter = InvFilterType::New();
+  
+  invFilter->SetInput(fwdFilter->GetOutput());
+  invFilter->Update();
+
+  /* Writing output */
+  WriterType::Pointer writer = WriterType::New();
+  writer->SetFileName(outputFileName);
+  writer->SetInput(invFilter->GetOutput());
+  writer->Update();
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Filtering/Wavelet/test/otbWaveletTestDriver.cxx b/Modules/Filtering/Wavelet/test/otbWaveletTestDriver.cxx
index 532d5e7..60c07f7 100644
--- a/Modules/Filtering/Wavelet/test/otbWaveletTestDriver.cxx
+++ b/Modules/Filtering/Wavelet/test/otbWaveletTestDriver.cxx
@@ -14,4 +14,5 @@ void RegisterTests()
   REGISTER_TEST(otbWaveletPacketTransformNew);
   REGISTER_TEST(otbWaveletFilterBankNew);
   REGISTER_TEST(otbWaveletOperatorNew);
+  REGISTER_TEST(otbWaveletImageToImageFilter);
 }
diff --git a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx
index 9c4de26..85785e1 100644
--- a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx
+++ b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx
@@ -115,15 +115,25 @@ NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage,
       histoNeigh[label] += 1;
       }
     }
-  HistoAsVectorType histoNeighVec(histoNeigh.begin(), histoNeigh.end());
-  //Sort the 2 max elements to the beginning
-  std::nth_element(histoNeighVec.begin(), histoNeighVec.begin()+1,
-                   histoNeighVec.end(), CompareHistoFequencies());
   typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage,
                                                  TKernel>::HistoSummary result;
-  result.freqCenterLabel = histoNeigh[nit.GetCenterPixel()];
-  result.majorityLabel = histoNeighVec[0].first;
-  result.majorityUnique = (histoNeighVec[0].second != histoNeighVec[1].second);
+  assert(!histoNeigh.empty());
+  if (histoNeigh.size() == 1)
+    {
+    result.freqCenterLabel = histoNeigh.begin()->second;
+    result.majorityLabel = histoNeigh.begin()->first;
+    result.majorityUnique = true;
+    }
+  else
+    {
+    HistoAsVectorType histoNeighVec(histoNeigh.begin(), histoNeigh.end());
+    //Sort the 2 max elements to the beginning
+    std::nth_element(histoNeighVec.begin(), histoNeighVec.begin()+1,
+                     histoNeighVec.end(), CompareHistoFequencies());
+    result.freqCenterLabel = histoNeigh[nit.GetCenterPixel()];
+    result.majorityLabel = histoNeighVec[0].first;
+    result.majorityUnique = (histoNeighVec[0].second != histoNeighVec[1].second);
+    }
   return result;
 }
 
diff --git a/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h b/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h
index 25e1470..822db14 100644
--- a/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h
+++ b/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h
@@ -110,8 +110,8 @@ private:
    * This functor applies the
    *  \f[ \frac{XS}{\mathrm{Filtered}(PAN)}PAN  \f]
    * operation. It is intended for internal use only.
- *
- * \ingroup OTBPanSharpening
+   *
+   * \ingroup OTBPanSharpening
    */
   class FusionFunctor
   {
@@ -142,6 +142,83 @@ private:
     }
   };
 
+
+  /** \class NoDataFusionFunctor
+   * This functor applies the following operation if there is no data :
+   *  \f[ \frac{XS}{\mathrm{Filtered}(PAN)}PAN  \f]
+   * It is intended for internal use only.
+   *
+   * \ingroup OTBPanSharpening
+   */
+  class NoDataFusionFunctor
+  {
+  public:
+    // Implement the fusion as a three arguments operator
+    typename TOutputImageType::PixelType operator()(const typename TXsImageType::PixelType& xsPixel,
+                                                    const TInternalPrecision& smoothPanchroPixel,
+                                                    const typename TPanImageType::PixelType& sharpPanchroPixel) const
+    {
+      // Build output pixel
+      typename TOutputImageType::PixelType output(xsPixel.Size());
+
+      // Check for no data Pan value
+      if( m_NoDataValuePanAvailable && sharpPanchroPixel == m_NoDataValuePan )
+        {
+        for ( unsigned int i = 0; i < xsPixel.Size(); ++i )
+          {
+          output[i] = static_cast<typename TOutputImageType::InternalPixelType>( m_NoDataValuesXs[i] );
+          }
+        return output;
+        }
+
+      TInternalPrecision scale = 1.;
+
+      if(vcl_abs(smoothPanchroPixel) > 1e-10)
+        {
+        scale = sharpPanchroPixel/smoothPanchroPixel;
+        }
+
+      // Perform fusion for each band with appropriate casting
+      for(unsigned int i = 0; i < xsPixel.Size(); ++i)
+        {
+        output[i] = ( m_NoDataValuesXsAvailable[i] && (xsPixel[i] == m_NoDataValuesXs[i]) ) ?
+                    static_cast<typename TOutputImageType::InternalPixelType>( xsPixel[i] ) :
+                    static_cast<typename TOutputImageType::InternalPixelType>( xsPixel[i] * scale );
+        }
+      // Returns the output pixel
+      return output;
+    }
+
+    void SetNoDataValuePanAvailable(bool noDataAvailable) {
+      m_NoDataValuePanAvailable = noDataAvailable;
+    }
+
+    void SetNoDataValuePan(typename TPanImageType::PixelType  noDataValue) {
+      m_NoDataValuePan = noDataValue;
+    }
+
+    void SetNoDataValuesXsAvailable(std::vector<bool> noDataValuesAvailable) {
+      m_NoDataValuesXsAvailable = noDataValuesAvailable;
+    }
+
+    void SetNoDataValuesXs(std::vector<typename TXsImageType::InternalPixelType> noDataValues) {
+      m_NoDataValuesXs = noDataValues;
+    }
+
+
+  private:
+    /** No data flags and values for APN image */
+    bool m_NoDataValuePanAvailable;
+    typename TPanImageType::InternalPixelType m_NoDataValuePan;
+
+    /** No data flags and values for XS image */
+    std::vector<bool> m_NoDataValuesXsAvailable;
+    std::vector<typename TXsImageType::InternalPixelType> m_NoDataValuesXs;
+
+
+  };
+
+
   /**
    *  Typedef of the TernaryFunctorImageFilter applying the fusion functor to
    *  p, p_smooth and xs.
@@ -152,6 +229,16 @@ private:
                                          TOutputImageType,
                                          FusionFunctor>     FusionFilterType;
 
+  /**
+   *  Typedef of the TernaryFunctorImageFilter applying the no data fusion functor to
+   *  p, p_smooth and xs.
+   */
+  typedef itk::TernaryFunctorImageFilter<TXsImageType,
+                                         InternalImageType,
+                                         TPanImageType,
+                                         TOutputImageType,
+                                         NoDataFusionFunctor>     NoDataFusionFilterType;
+
   /** Typedef of the convolution filter performing smoothing */
   typedef otb::ConvolutionImageFilter
       <TPanImageType,
@@ -160,10 +247,16 @@ private:
        TInternalPrecision>                                  ConvolutionFilterType;
 
   /** Pointer to the internal convolution filter */
-  typename ConvolutionFilterType::Pointer m_ConvolutionFilter;
+  typename ConvolutionFilterType::Pointer  m_ConvolutionFilter;
 
   /** Pointer to the fusion filter */
-  typename FusionFilterType::Pointer      m_FusionFilter;
+  typename FusionFilterType::Pointer       m_FusionFilter;
+
+  /** Pointer to the fusion filter */
+  typename NoDataFusionFilterType::Pointer m_NoDataFusionFilter;
+
+  /** Boolean used for no data */
+  bool m_UseNoData;
 
   /** Radius used for the smoothing filter */
   RadiusType m_Radius;
diff --git a/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.txx b/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.txx
index 4ddbe48..f849204 100644
--- a/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.txx
+++ b/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.txx
@@ -32,6 +32,7 @@ SimpleRcsPanSharpeningFusionImageFilter
 {
   // Fix number of required inputs
   this->SetNumberOfRequiredInputs(2);
+  this->m_UseNoData = false;
 
   // Instantiate convolution filter
   m_ConvolutionFilter = ConvolutionFilterType::New();
@@ -42,15 +43,6 @@ SimpleRcsPanSharpeningFusionImageFilter
   m_Filter.SetSize(7 * 7);
   m_Filter.Fill(1);
 
-  // Instantiate fusion filter
-  m_FusionFilter = FusionFilterType::New();
-  m_FusionFilter->SetInput2(m_ConvolutionFilter->GetOutput());
-
-  // Set-up progress reporting
-  m_ProgressAccumulator = itk::ProgressAccumulator::New();
-  m_ProgressAccumulator->SetMiniPipelineFilter(this);
-  m_ProgressAccumulator->RegisterInternalFilter(m_ConvolutionFilter, 0.9);
-  m_ProgressAccumulator->RegisterInternalFilter(m_FusionFilter, 0.1);
 }
 
 template <class TPanImageType, class TXsImageType, class TOutputImageType, class TInternalPrecision>
@@ -127,18 +119,89 @@ SimpleRcsPanSharpeningFusionImageFilter
     itkExceptionMacro(<< "SimpleRcsPanSharpeningFusionImageFilter: Wrong Pan/Xs size");
     }
 
-  //Process the fusion
+  // Set-up progress reporting
+  m_ProgressAccumulator = itk::ProgressAccumulator::New();
+  m_ProgressAccumulator->SetMiniPipelineFilter(this);
+  m_ProgressAccumulator->RegisterInternalFilter(m_ConvolutionFilter, 0.9);
+
   m_ConvolutionFilter->SetInput(this->GetPanInput());
   m_ConvolutionFilter->SetRadius(this->m_Radius);
   m_ConvolutionFilter->SetFilter(this->m_Filter);
 
-  m_FusionFilter->SetInput1(this->GetXsInput());
-  m_FusionFilter->SetInput3(this->GetPanInput());
+  typedef typename TPanImageType::InternalPixelType  PanPixelType;
+  typedef typename TXsImageType::InternalPixelType   XsPixelType;
+
+  // Write no-data flags for Pan image
+  std::vector<bool> tmpNoDataValuePanAvailable;
+  std::vector<double> tmpNoDataValuePan;
+  bool noDataValuePanAvailable = false;
+  PanPixelType noDataValuePan = 0;
+
+  bool retPan = itk::ExposeMetaData<std::vector<bool> >( this->GetPanInput()->GetMetaDataDictionary(), MetaDataKey::NoDataValueAvailable, tmpNoDataValuePanAvailable );
+  retPan &= itk::ExposeMetaData<std::vector<double> >( this->GetPanInput()->GetMetaDataDictionary(), MetaDataKey::NoDataValue, tmpNoDataValuePan );
+
+  if(retPan && tmpNoDataValuePanAvailable.size() > 0 && tmpNoDataValuePan.size() > 0)
+    {
+    noDataValuePanAvailable = tmpNoDataValuePanAvailable[0] && retPan;
+    noDataValuePan = static_cast<PanPixelType>( tmpNoDataValuePan[0] );
+    }
+
+
+  // Write no-data flags for Xs image
+  std::vector<bool> noDataValuesXsAvailable;
+  std::vector<double> tmpNoDataValuesXs;
+  std::vector<XsPixelType> noDataValuesXs;
+
+  bool retXs = itk::ExposeMetaData<std::vector<bool> >( this->GetXsInput()->GetMetaDataDictionary(), MetaDataKey::NoDataValueAvailable, noDataValuesXsAvailable );
+  retXs &= itk::ExposeMetaData<std::vector<double> >( this->GetXsInput()->GetMetaDataDictionary(), MetaDataKey::NoDataValue, tmpNoDataValuesXs );
+
+  // Check if noData is needed and update noDataValuesAvailable with return function value
+  if ( retPan || retXs )
+    {
+    m_UseNoData = noDataValuePanAvailable;
+    for ( unsigned int i = 0; i < tmpNoDataValuesXs.size() && i < noDataValuesXsAvailable.size(); ++i )
+      {
+      noDataValuesXs.push_back( static_cast<XsPixelType>(tmpNoDataValuesXs[i]) );
+      m_UseNoData |= (noDataValuesXsAvailable[i] = (noDataValuesXsAvailable[i] && retXs));
+      }
+    }
+
+  // Instantiate fusion filter
+  if ( m_UseNoData )
+    {
+    m_NoDataFusionFilter = NoDataFusionFilterType::New();
+    m_ProgressAccumulator->RegisterInternalFilter( m_NoDataFusionFilter, 0.1 );
+
+    m_NoDataFusionFilter->SetInput2( m_ConvolutionFilter->GetOutput() );
+    m_NoDataFusionFilter->GetFunctor().SetNoDataValuesXsAvailable( noDataValuesXsAvailable );
+    m_NoDataFusionFilter->GetFunctor().SetNoDataValuePanAvailable( noDataValuePanAvailable );
+    m_NoDataFusionFilter->GetFunctor().SetNoDataValuePan( noDataValuePan );
+    m_NoDataFusionFilter->GetFunctor().SetNoDataValuesXs( noDataValuesXs );
+
+    m_NoDataFusionFilter->SetInput1( this->GetXsInput() );
+    m_NoDataFusionFilter->SetInput2( m_ConvolutionFilter->GetOutput() );
+    m_NoDataFusionFilter->SetInput3( this->GetPanInput() );
+
+    // Wire composite filter
+    m_NoDataFusionFilter->GraftOutput( this->GetOutput() );
+    m_NoDataFusionFilter->Update();
+    this->GraftOutput( m_NoDataFusionFilter->GetOutput() );
+    }
+  else
+    {
+    m_FusionFilter = FusionFilterType::New();
+    m_ProgressAccumulator->RegisterInternalFilter( m_FusionFilter, 0.1 );
+
+    m_FusionFilter->SetInput1( this->GetXsInput() );
+    m_FusionFilter->SetInput2( m_ConvolutionFilter->GetOutput() );
+    m_FusionFilter->SetInput3( this->GetPanInput() );
+
+    // Wire composite filter
+    m_FusionFilter->GraftOutput( this->GetOutput() );
+    m_FusionFilter->Update();
+    this->GraftOutput( m_FusionFilter->GetOutput() );
+    }
 
-  // Wire composite filter
-  m_FusionFilter->GraftOutput(this->GetOutput());
-  m_FusionFilter->Update();
-  this->GraftOutput(m_FusionFilter->GetOutput());
 }
 
 template <class TPanImageType, class TXsImageType, class TOutputImageType, class TInternalPrecision>
diff --git a/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx b/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx
index ecfdfcb..5e15ca4 100644
--- a/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx
+++ b/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx
@@ -200,7 +200,7 @@ GDALOverviewsBuilder
   unsigned int n =
     std::min(
       count,
-      CountResolutions(	factor )
+      CountResolutions( factor , 1)
     );
 
   for( unsigned int i=0; i<n; ++i )
diff --git a/Modules/IO/IOJPEG2000/CMakeLists.txt b/Modules/IO/IOJPEG2000/CMakeLists.txt
deleted file mode 100644
index 48427b6..0000000
--- a/Modules/IO/IOJPEG2000/CMakeLists.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-project(OTBIOJPEG2000)
-
-set(OTBIOJPEG2000_LIBRARIES OTBIOJPEG2000)
-otb_module_impl()
diff --git a/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h b/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h
deleted file mode 100644
index 7ea055f..0000000
--- a/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#ifndef otbJPEG2000ImageIO_h
-#define otbJPEG2000ImageIO_h
-
-#include "otbImageIOBase.h"
-#include "itkMultiThreader.h"
-
-#include <boost/shared_ptr.hpp>
-
-namespace otb
-{
-
-class JPEG2000InternalReader;
-class JPEG2000TileCache;
-
-/** \class JPEG2000ImageIO
- *
- * \brief ImageIO object for reading and writing JPEG2000 format images
- *
- * The streaming (read and write) is implemented.
- *
- * \ingroup IOFilters
- *
- *
- * \ingroup OTBIOJPEG2000
- */
-class ITK_EXPORT JPEG2000ImageIO : public otb::ImageIOBase
-{
-public:
-
-  /** Standard class typedefs. */
-  typedef JPEG2000ImageIO         Self;
-  typedef otb::ImageIOBase        Superclass;
-  typedef itk::SmartPointer<Self> Pointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(JPEG2000ImageIO, otb::ImageIOBase);
-
-  /*-------- This part of the interface deals with reading data. ------ */
-
-  /** Determine the file type. Returns true if this ImageIO can read the
-   * file specified. */
-  bool CanReadFile(const char*) ITK_OVERRIDE;
-
-  /** Determine the file type. Returns true if the ImageIO can stream read the specified file */
-  bool CanStreamRead() ITK_OVERRIDE
-  {
-    return true;
-  }
-
-  /** Set the spacing and dimension information for the set filename. */
-  void ReadImageInformation() ITK_OVERRIDE;
-
-  /** Get description about overviews available into the file specified */
-  std::vector<std::string> GetOverviewsInfo() ITK_OVERRIDE;
-  
-  /** Provide hist about the output container to deal with complex pixel
-   *  type (Not used here) */ 
-  void SetOutputImagePixelType( bool itkNotUsed(isComplexInternalPixelType), 
-                                        bool itkNotUsed(isVectorImage)) ITK_OVERRIDE{}
-  
-  /** Get number of available overviews in the jpeg2000 file
-   *  ( if return = 0 => no overviews available because only one resolution
-   *  is encoded in the file) */
-  unsigned int GetOverviewsCount() ITK_OVERRIDE;
-
-  /** Reads the data from disk into the memory buffer provided. */
-  void Read(void* buffer) ITK_OVERRIDE;
-
-  /** Reads 3D data from multiple files assuming one slice per file. */
-  virtual void ReadVolume(void* buffer);
-
-  /*-------- This part of the interfaces deals with writing data. ----- */
-
-  /** Determine the file type. Returns true if this ImageIO can read the
-   * file specified. */
-  bool CanWriteFile(const char*) ITK_OVERRIDE;
-
-  /** Determine the file type. Returns true if the ImageIO can stream write the specified file */
-  bool CanStreamWrite() ITK_OVERRIDE
-  {
-    return true;
-  }
-
-  /** Writes the spacing and dimensions of the image.
-   * Assumes SetFileName has been called with a valid file name. */
-  void WriteImageInformation() ITK_OVERRIDE;
-
-  /** Writes the data to disk from the memory buffer provided. Make sure
-   * that the IORegion has been set properly. */
-  void Write(const void* buffer) ITK_OVERRIDE;
-
-
-  /** Return the multithreader used by this class. */
-  itk::MultiThreader * GetMultiThreader()
-  {return m_Threader; }
-
-  itkSetMacro(ResolutionFactor, unsigned int);
-  itkGetMacro(ResolutionFactor, unsigned int);
-
-  itkSetMacro(CacheSizeInByte, unsigned int);
-  itkGetMacro(CacheSizeInByte, unsigned int);
-  
-
-  
-  
-protected:
-  /** Constructor.*/
-  JPEG2000ImageIO();
-  /** Destructor.*/
-  ~JPEG2000ImageIO() ITK_OVERRIDE;
-
-  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
-
-  typedef std::vector<boost::shared_ptr<JPEG2000InternalReader> > ReaderVectorType;
-
-  ReaderVectorType                     m_InternalReaders;
-  boost::shared_ptr<JPEG2000TileCache> m_TileCache;
-
-private:
-  JPEG2000ImageIO(const Self &); //purposely not implemented
-  void operator =(const Self&); //purposely not implemented
-
-  /** Compute the tile index list from the GetRegion*/
-  std::vector<unsigned int> ComputeTileList();
-
-  /** pixel nb of octets */
-  unsigned int m_BytePerPixel;
-
-  /** Resolution factor*/
-  unsigned int m_ResolutionFactor;
-
-  /** Size of the cache used to reduce number of decoding operations*/
-  unsigned int m_CacheSizeInByte;
-
-  /** Load data from a tile into the buffer. 2nd argument is a
-* pointer to opj_image_t, hidden in void * to avoid forward declaration. */
-  void LoadTileData(void * buffer, void * tile);
-
-  /** Support processing data in multiple threads. Used by subclasses
-   * (e.g., ImageSource). */
-  itk::MultiThreader::Pointer m_Threader;
-  int                    m_NumberOfThreads;
-
-  /** Static function used as a "callback" by the MultiThreader.  The threading
-   * library will call this routine for each thread, which will delegate the
-   * control to ThreadedGenerateData(). */
-  static ITK_THREAD_RETURN_TYPE ThreaderCallback( void *arg );
-
-  /** Configure cache manager */
-  void ConfigureCache();
-};
-
-} // end namespace otb
-
-#endif // otbJPEG2000ImageIO_h
diff --git a/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIOFactory.h b/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIOFactory.h
deleted file mode 100644
index 5a28458..0000000
--- a/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIOFactory.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#ifndef otbJPEG2000ImageIOFactory_h
-#define otbJPEG2000ImageIOFactory_h
-
-#include "itkObjectFactoryBase.h"
-
-namespace otb
-{
-/** \class JPEG2000ImageIOFactory
- * \brief Create instances of JPEG2000ImageIO objects using an object factory.
- *
- * \ingroup OTBIOJPEG2000
- */
-class ITK_EXPORT JPEG2000ImageIOFactory : public itk::ObjectFactoryBase
-{
-public:
-  /** Standard class typedefs. */
-  typedef JPEG2000ImageIOFactory        Self;
-  typedef itk::ObjectFactoryBase        Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-
-  /** Class methods used to interface with the registered factories. */
-  const char* GetITKSourceVersion(void) const ITK_OVERRIDE;
-  const char* GetDescription(void) const ITK_OVERRIDE;
-
-  /** Method for class instantiation. */
-  itkFactorylessNewMacro(Self);
-  static JPEG2000ImageIOFactory * FactoryNew() { return new JPEG2000ImageIOFactory; }
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(JPEG2000ImageIOFactory, itk::ObjectFactoryBase);
-
-  /** Register one factory of this type  */
-  static void RegisterOneFactory(void)
-  {
-    JPEG2000ImageIOFactory::Pointer JPEG2000Factory = JPEG2000ImageIOFactory::New();
-    itk::ObjectFactoryBase::RegisterFactory(JPEG2000Factory);
-  }
-
-protected:
-  JPEG2000ImageIOFactory();
-  ~JPEG2000ImageIOFactory() ITK_OVERRIDE;
-
-private:
-  JPEG2000ImageIOFactory(const Self &); //purposely not implemented
-  void operator =(const Self&); //purposely not implemented
-
-};
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/IO/IOJPEG2000/otb-module.cmake b/Modules/IO/IOJPEG2000/otb-module.cmake
deleted file mode 100644
index 50e4d01..0000000
--- a/Modules/IO/IOJPEG2000/otb-module.cmake
+++ /dev/null
@@ -1,22 +0,0 @@
-set(DOCUMENTATION "This module contains features to read and write JPEG2000
-format images.")
-
-otb_module(OTBIOJPEG2000
-  DEPENDS
-    OTBITK
-    OTBImageBase
-    OTBOSSIMAdapters
-    OTBCommon
-    OTBTinyXML
-    OTBOpenJPEG
-    OTBBoost
-    OTBGDAL
-
-  TEST_DEPENDS
-    OTBTestKernel
-    OTBImageIO
-    OTBImageManipulation
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/IO/IOJPEG2000/src/CMakeLists.txt b/Modules/IO/IOJPEG2000/src/CMakeLists.txt
deleted file mode 100644
index 8bf3ff3..0000000
--- a/Modules/IO/IOJPEG2000/src/CMakeLists.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-set(OTBIOJPEG2000_SRC
-  otbJPEG2000ImageIO.cxx
-  otbJPEG2000ImageIOFactory.cxx
-  )
-
-add_library(OTBIOJPEG2000 ${OTBIOJPEG2000_SRC})
-target_link_libraries(OTBIOJPEG2000 
-  ${OTBTinyXML_LIBRARIES}
-  ${OTBImageBase_LIBRARIES}
-  ${OTBOSSIMAdapters_LIBRARIES}
-  ${OTBCommon_LIBRARIES}
-  ${OTBOpenJPEG_LIBRARIES}
-  ${OTBBoost_LIBRARIES}
-  ${OTBGDAL_LIBRARIES}
-
-  )
-
-otb_module_target(OTBIOJPEG2000)
diff --git a/Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIO.cxx b/Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIO.cxx
deleted file mode 100644
index e1d79be..0000000
--- a/Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIO.cxx
+++ /dev/null
@@ -1,1796 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#include "otbJPEG2000ImageIO.h"
-
-#include <iomanip>
-#include <iostream>
-
-
-#include "otbMacro.h"
-#include "itksys/SystemTools.hxx"
-#include "itkTimeProbe.h"
-#include "itkMetaDataObject.h"
-#include "otbMetaDataKey.h"
-
-#include <deque>
-
-#include "otb_openjpeg.h"
-
-#include "gdal.h"
-#include "gdaljp2metadata.h"
-#include "cpl_string.h"
-#include "ogr_spatialref.h"
-#include "ogr_srs_api.h"
-
-#include "itksys/SystemTools.hxx"
-
-#include "otb_tinyxml.h"
-
-#include "itkMutexLock.h"
-#include "itkMutexLockHolder.h"
-
-void OpjImageDestroy(opj_image_t * img)
-{
-  if(img)
-    {
-    opj_image_destroy(img);
-    }
-}
-
-void OpjCodestreamDestroy(opj_codestream_info_v2_t * cstr)
-{
-  opj_destroy_cstr_info(&cstr);
-}
-#if defined(OTBOpenJPEG_VERSION_NUMBER) && OTBOpenJPEG_VERSION_NUMBER < 20100
-void FileDestroy(FILE * file)
-{
-  if(file)
-    {
-    fclose(file);
-    }
-}
-#endif
-/**
-Divide an integer by a power of 2 and round upwards
- at return Returns a divided by 2^b
-*/
-inline int int_ceildivpow2(int a, int b) {
-  return (a + (1 << b) - 1) >> b;
-}
-
-inline unsigned int uint_ceildivpow2(unsigned int a, unsigned int b) {
-  return (a + (1 << b) - 1) >> b;
-}
-
-/**
-   sample error debug callback expecting no client object
-*/
-void error_callback(const char *msg, void *client_data)
-{
-  (void) msg;
-  (void) client_data;
-  otbMsgDevMacro(<< "OpenJPEG error: " << msg);
-}
-/**
-   sample warning debug callback expecting no client object
-*/
-void warning_callback(const char *msg, void *client_data)
-{
-  (void) msg;
-  (void) client_data;
-  otbMsgDevMacro(<< "OpenJPEG warning: " << msg);
-}
-/**
-   sample debug callback expecting no client object
-*/
-void info_callback(const char *msg, void *client_data)
-{
-  (void) msg;
-  (void) client_data;
-  otbMsgDevMacro(<< "OpenJPEG info: " << msg);
-}
-
-namespace otb
-{
-
-/** Compute offsets needed to read the data from the tile decoded and
- * offsets needed to write into the output buffer.
- *
- * Please note that this function uses a bare pointer instead of a
- * shared one because it is called within LoadTileData, which hides
- * the opj_image_t pointer between a void * for proper hiding of
- * openjpeg API.
- */
-void ComputeOffsets(opj_image_t * tile,
-                    const itk::ImageIORegion & ioRegion,
-                    unsigned int &l_width_src,
-                    unsigned int &l_height_dest,
-                    unsigned int &l_width_dest,
-                    unsigned int &l_start_offset_dest,
-                    unsigned int &l_start_offset_src);
-
-/************************************************************************/
-/*     JPEG2000 metadata reader based on GDAL functionalities           */
-/************************************************************************/
-class JPEG2000MetadataReader
-{
-public:
-  JPEG2000MetadataReader(const char *filename )
-  {
-  m_MetadataIsRead = false;
-
-  if( m_JP2Metadata.ReadAndParse(filename) )
-    {
-    m_MetadataIsRead = true;
-    }
-
-  };
-
-  ~JPEG2000MetadataReader(){};
-
-  /** Get the geoTransform from file*/
-  std::vector<double> GetGeoTransform(){
-    std::vector<double> geoTransform;
-    for (unsigned int i = 0; i< 6; i++ )
-      geoTransform.push_back(m_JP2Metadata.adfGeoTransform[i]);
-    return geoTransform;
-  };
-
-  /** Check if image in the file have a geoTransform*/
-  bool HaveGeoTransform(){
-    return static_cast<bool>(m_JP2Metadata.bHaveGeoTransform);
-  };
-
-  /** Get the nb of GCP from file*/
-  int GetGCPCount(){
-    return m_JP2Metadata.nGCPCount;
-  };
-
-  /** Get the GCPs from file*/
-  std::vector<GDAL_GCP> GetGCPs(){
-    std::vector<GDAL_GCP> gcps;
-    int nbGCP = m_JP2Metadata.nGCPCount;
-    for (int i = 0; i< nbGCP; i++ )
-      gcps.push_back(m_JP2Metadata.pasGCPList[i]);
-    return gcps;
-  };
-
-  /** Get the projectionRef from file*/
-  const char* GetProjectionRef() {
-    if (m_JP2Metadata.pszProjection)
-      return m_JP2Metadata.pszProjection;
-    else
-      return ITK_NULLPTR;
-  };
-
-  /** Get the GML box from file*/
-  char** GetGMLMetadata() {
-    if (m_JP2Metadata.papszGMLMetadata)
-      return m_JP2Metadata.papszGMLMetadata;
-    else
-      return ITK_NULLPTR;
-  };
-
-  // Get the origin from GML box (use tinyxml to parse the GML box)
-  bool GetOriginFromGMLBox (std::vector<double> &origin);
-
-  /** Check if the file has been correctly read*/
-  bool m_MetadataIsRead;
-
-private:
-  /** GDAL structure where store metadata read from JP2 file*/
-  GDALJP2Metadata m_JP2Metadata;
-
-};
-
-bool JPEG2000MetadataReader::GetOriginFromGMLBox (std::vector<double> &origin)
-{
-  if (!m_MetadataIsRead)
-    return false;
-
-  std::string gmlString = static_cast<std::string> (m_JP2Metadata.papszGMLMetadata[0]);
-  gmlString.erase(0,18); // We need to remove first part to create a true xml stream
-  otbMsgDevMacro( << "XML extract from GML box: " << gmlString );
-
-  TiXmlDocument doc;
-  doc.Parse(gmlString.c_str()); // Create xml doc from a string
-
-  TiXmlHandle docHandle( &doc );
-  TiXmlElement* originTag = docHandle.FirstChild( "gml:FeatureCollection" )
-                                     .FirstChild( "gml:featureMember" )
-                                     .FirstChild( "gml:FeatureCollection" )
-                                     .FirstChild( "gml:featureMember" )
-                                     .FirstChild( "gml:GridCoverage" )
-                                     .FirstChild( "gml:gridDomain")
-                                     .FirstChild( "gml:Grid" )
-                                     .FirstChild( "gml:limits" )
-                                     .FirstChild( "gml:GridEnvelope" )
-                                     .FirstChild( "gml:low").ToElement();
-  if(originTag)
-    {
-    otbMsgDevMacro( << "\t Origin (" <<  originTag->Value() <<" tag)= "<<  originTag->GetText());
-    }
-  else
-    {
-    otbMsgDevMacro( << "Didn't find the GML element which indicate the origin!" );
-    return false;
-    }
-
-  std::vector<itksys::String> originValues;
-  originValues = itksys::SystemTools::SplitString(originTag->GetText(),' ', false);
-
-  // Compute origin in GDAL convention (half pixel shift is applied later)
-  std::istringstream ss0 (originValues[0]);
-  std::istringstream ss1 (originValues[1]);
-  ss0 >> origin[1];
-  ss1 >> origin[0];
-  origin[0] += -1.0;
-  origin[1] += -1.0;
-
-  otbMsgDevMacro( << "\t Origin from GML box: " <<  origin[0] << ", " << origin[1] );
-
-  return true;
-}
-
-
-/************************************************************************/
-/*            JPEG2000 internal reader based on openjpeg                */
-/************************************************************************/
-class JPEG2000InternalReader
-{
-public:
-  JPEG2000InternalReader();
-
-  ~JPEG2000InternalReader()
-  {
-    this->Clean();
-  }
-
-  boost::shared_ptr<opj_image_t> DecodeTile(unsigned int tileIndex);
-
-  const std::vector<unsigned int> & GetAvailableResolutions(){return this->m_AvailableResolutions; };
-
-  void Clean();
-
-  bool CanRead();
-
-  int Open(const char *filename, unsigned int resolution);
-
-  bool m_IsOpen;
-  OPJ_CODEC_FORMAT m_CodecFormat;
-
-  unsigned int         m_Width;
-  unsigned int         m_Height;
-
-  unsigned int         m_NbOfComponent;
-
-  std::vector<unsigned int>        m_XResolution;
-  std::vector<unsigned int>        m_YResolution;
-  std::vector<unsigned int>        m_Precision;
-  std::vector<int>                 m_Signed;
-
-  unsigned int         m_TileWidth;
-  unsigned int         m_TileHeight;
-  unsigned int         m_XNbOfTile;
-  unsigned int         m_YNbOfTile;
-
-  std::vector<unsigned int> m_AvailableResolutions;
-
-  unsigned int m_ResolutionFactor;
-
-private:
-  std::string m_FileName;
-#if defined(OTBOpenJPEG_VERSION_NUMBER) && OTBOpenJPEG_VERSION_NUMBER < 20100
-  boost::shared_ptr<FILE> m_File;
-#endif
-  int Initialize();
-};
-
-
-int JPEG2000InternalReader::Open(const char *filename, unsigned int resolution)
-{
-  this->Clean();
-  
-  std::string str(filename);
-  this->m_FileName = str;
-
-  // Open the file
-  if (this->m_FileName.empty())
-    {
-    this->Clean();
-    return 0;
-    }
-
-#if defined(OTBOpenJPEG_VERSION_NUMBER) && OTBOpenJPEG_VERSION_NUMBER < 20100
-  this->m_File  = boost::shared_ptr<FILE>(fopen(this->m_FileName.c_str(), "rb"),FileDestroy);
-  if (!this->m_File)
-    {
-    this->Clean();
-    return 0;
-    }
-#endif
-
-  // Find the codec file format
-
-  if (itksys::SystemTools::LowerCase(itksys::SystemTools::GetFilenameLastExtension(m_FileName)) == ".j2k")
-    {
-    this->m_CodecFormat = OPJ_CODEC_J2K;
-    }
-  else if (itksys::SystemTools::LowerCase(itksys::SystemTools::GetFilenameLastExtension(m_FileName)) == ".jp2"
-           || itksys::SystemTools::LowerCase(itksys::SystemTools::GetFilenameLastExtension(m_FileName)) == ".jpx")
-    {
-    this->m_CodecFormat = OPJ_CODEC_JP2;
-    }
-  else
-    {
-    this->Clean();
-    return 0;
-    }
-
-  this->m_ResolutionFactor = resolution;
-
-  // Initialize the codec and the stream
-  if (!this->Initialize())
-    {
-    this->Clean();
-    return 0;
-    }
-
-  this->m_IsOpen = true;
-  return 1;
-}
-
-void JPEG2000InternalReader::Clean()
-{
-  this->m_FileName.clear();
-#if defined(OTBOpenJPEG_VERSION_NUMBER) && OTBOpenJPEG_VERSION_NUMBER < 20100
-  this->m_File = boost::shared_ptr<FILE>();
-#endif
-  this->m_XResolution.clear();
-  this->m_YResolution.clear();
-  this->m_Precision.clear();
-  this->m_Signed.clear();
-  m_AvailableResolutions.clear();
-
-  this->m_Width = 0;
-  this->m_Height = 0;
-  this->m_NbOfComponent = 0;
-  this->m_TileWidth = 0;
-  this->m_TileHeight = 0;
-  this->m_XNbOfTile = 0;
-  this->m_YNbOfTile = 0;
-
-  this->m_IsOpen = false;
-  this->m_CodecFormat = OPJ_CODEC_UNKNOWN;
-  this->m_ResolutionFactor=0;
-}
-
-boost::shared_ptr<opj_image_t> JPEG2000InternalReader::DecodeTile(unsigned int tileIndex)
-{
-#if defined(OTBOpenJPEG_VERSION_NUMBER) && OTBOpenJPEG_VERSION_NUMBER < 20100
-  if (!this->m_File)
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-
-  // Creating the file stream
-  boost::shared_ptr<opj_stream_t> stream = boost::shared_ptr<opj_stream_t>(opj_stream_create_default_file_stream(this->m_File.get(), true),opj_stream_destroy);
-  if (!stream)
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-#else
-  if (this->m_FileName.empty())
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-
-  // Creating the file stream
-  boost::shared_ptr<opj_stream_t> stream = boost::shared_ptr<opj_stream_t>(opj_stream_create_default_file_stream(this->m_FileName.c_str(), true),opj_stream_destroy);
-  if (!stream)
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-#endif
-
-  // Creating the codec
-  boost::shared_ptr<opj_codec_t> codec = boost::shared_ptr<opj_codec_t>(opj_create_decompress(this->m_CodecFormat),opj_destroy_codec);
-
-  if (!codec)
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-
-  // Setting default parameters
-  opj_dparameters_t parameters;
-  opj_set_default_decoder_parameters(&parameters);
-  parameters.cp_reduce = static_cast<int>(this->m_ResolutionFactor);
-
-  // Set default event mgr
-  // catch events using our callbacks and give a local context      
-  opj_set_info_handler(codec.get(), info_callback,ITK_NULLPTR);
-  opj_set_warning_handler(codec.get(), warning_callback,ITK_NULLPTR);
-  opj_set_error_handler(codec.get(), error_callback,ITK_NULLPTR);
-  
-  // Setup the decoder decoding parameters using user parameters
-  if (!opj_setup_decoder(codec.get(), &parameters))
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-
-  // Read the main header of the codestream and if necessary the JP2
-  // boxes
-  opj_image_t * unsafeOpjImgPtr = ITK_NULLPTR;
-
-  if (!opj_read_header(stream.get(), codec.get(),&unsafeOpjImgPtr))
-    {
-    boost::shared_ptr<opj_image_t> image = boost::shared_ptr<opj_image_t>(unsafeOpjImgPtr,OpjImageDestroy);
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-
-  boost::shared_ptr<opj_image_t> image = boost::shared_ptr<opj_image_t>(unsafeOpjImgPtr,OpjImageDestroy);
-
-  if( opj_get_decoded_tile(codec.get(), stream.get(), image.get(), tileIndex))
-    {
-    otbMsgDevMacro(<<"Tile "<<tileIndex<<" read from file");
-
-    return image;
-    }
-  else
-    {
-    this->Clean();
-    return boost::shared_ptr<opj_image_t>();
-    }
-}
-
-JPEG2000InternalReader::JPEG2000InternalReader()
-{
-  this->Clean();
-}
-
-int JPEG2000InternalReader::Initialize()
-{
-#if defined(OTBOpenJPEG_VERSION_NUMBER) && OTBOpenJPEG_VERSION_NUMBER < 20100
-  if (this->m_File)
-    {
-    // Creating the file stream
-    boost::shared_ptr<opj_stream_t> stream = boost::shared_ptr<opj_stream_t>(opj_stream_create_default_file_stream(this->m_File.get(), true),opj_stream_destroy);
-    if (!stream)
-      {
-      std::cerr << "ERROR file stream creation" << std::endl;
-      this->Clean();
-      return 0;
-      }
-#else
-  if (!m_FileName.empty())
-    {
-    // Creating the file stream
-    boost::shared_ptr<opj_stream_t> stream = boost::shared_ptr<opj_stream_t>(opj_stream_create_default_file_stream(this->m_FileName.c_str(), true),opj_stream_destroy);
-    if (!stream)
-      {
-      std::cerr << "ERROR file stream creation" << std::endl;
-      this->Clean();
-      return 0;
-      }
-#endif
-    // Creating the codec
-    boost::shared_ptr<opj_codec_t> codec = boost::shared_ptr<opj_codec_t>(opj_create_decompress(this->m_CodecFormat),opj_destroy_codec);
-
-    if (!codec)
-      {
-      std::cerr << "ERROR codec creation" << std::endl  ;  
-      this->Clean();
-      return 0;
-      }
-    
-    // Setting default parameters
-    opj_dparameters_t parameters;
-    opj_set_default_decoder_parameters(&parameters);
-    parameters.cp_reduce = static_cast<int>(this->m_ResolutionFactor);
-
-    // Set default event mgr
-    // catch events using our callbacks and give a local context      
-    opj_set_info_handler(codec.get(), info_callback,ITK_NULLPTR);
-    opj_set_warning_handler(codec.get(), warning_callback,ITK_NULLPTR);
-    opj_set_error_handler(codec.get(), error_callback,ITK_NULLPTR);
-
-    // Setup the decoder decoding parameters using user parameters
-    if (!opj_setup_decoder(codec.get(), &parameters))
-      {
-      std::cerr << "ERROR setup decoder" << std::endl    ;
-      this->Clean();
-      return 0;
-      }
-
-    // Read the main header of the codestream and if necessary the JP2
-    // boxes
-    opj_image_t * unsafeOpjImgPtr = ITK_NULLPTR;
-
-    if (!opj_read_header(stream.get(), codec.get(),&unsafeOpjImgPtr))
-      {
-      std::cerr << "ERROR read header" << std::endl;    
-      boost::shared_ptr<opj_image_t> image = boost::shared_ptr<opj_image_t>(unsafeOpjImgPtr,OpjImageDestroy);
-      this->Clean();
-      return 0;
-      }
-    
-    boost::shared_ptr<opj_image_t> image = boost::shared_ptr<opj_image_t>(unsafeOpjImgPtr,OpjImageDestroy);
-
-    // Get the codestream information
-    boost::shared_ptr<opj_codestream_info_v2> cstrInfo = boost::shared_ptr<opj_codestream_info_v2>(opj_get_cstr_info(codec.get()),OpjCodestreamDestroy);
-
-    if (!cstrInfo)
-      {
-      std::cerr << "ERROR while get codestream info" << std::endl;
-      this->Clean();
-      return 0;
-      }
-
-    // We can now retrieve the main information of the image and the codestream
-    // (based on the first component and with no subsampling)
-    this->m_Width = image->comps->w;
-    this->m_Height = image->comps->h;
-
-    otbMsgDevMacro(<< "JPEG2000InternalReader dimension (after reading header) = " << image->comps->w << " x "
-                   << image->comps->w << " x " << image->comps->h );
-
-    this->m_TileHeight = cstrInfo->tdy;
-    this->m_TileWidth = cstrInfo->tdx;
-    this->m_XNbOfTile = cstrInfo->tw;
-    this->m_YNbOfTile = cstrInfo->th;
-
-    this->m_NbOfComponent = image->numcomps;
-
-    for (unsigned int itComp = 0; itComp < this->m_NbOfComponent; itComp++)
-      {
-      this->m_Precision.push_back( image->comps[itComp].prec);
-      this->m_Signed.push_back( image->comps[itComp].sgnd);
-      this->m_XResolution.push_back( image->comps[itComp].dx);
-      this->m_YResolution.push_back( image->comps[itComp].dy);
-      }
-
-    // Warning: This value is based on the first component of the default tile parameters.
-    unsigned int numResAvailable = cstrInfo->m_default_tile_info.tccp_info[0].numresolutions;
-    m_AvailableResolutions.clear();
-    for (unsigned int itRes = 0; itRes < numResAvailable; itRes++)
-      {
-      m_AvailableResolutions.push_back(itRes);
-      }
-    }
-
-  return 1;
-}
-
-
-bool JPEG2000InternalReader::CanRead()
- {
-   if  (Initialize() &&
-       ( this->m_Width > 0 ) && ( this->m_Height > 0 ) &&
-       ( this->m_TileWidth > 0 ) && ( this->m_TileHeight > 0 ) &&
-       ( this->m_XNbOfTile > 0 ) && ( this->m_YNbOfTile > 0 ) &&
-       ( this->m_NbOfComponent > 0 ) )
-     {
-
-     // We manage only JPEG2000 file with characteristics which are equal between components
-     for(unsigned int itComp = 0; itComp < this->m_NbOfComponent - 1; itComp++)
-       {
-       if ( (this->m_Precision[itComp] != this->m_Precision[itComp+1]) &&
-            (this->m_Signed[itComp] != this->m_Signed[itComp+1]) &&
-            (this->m_XResolution[itComp] != this->m_XResolution[itComp+1]) &&
-            (!this->m_XResolution[itComp]) &&
-            (this->m_YResolution[itComp] != this->m_YResolution[itComp+1]) &&
-            (!this->m_YResolution[itComp]) )
-         {
-         return false;
-         }
-       }
-     return true;
-     }
-   else 
-     {
-     std::cerr  << this->m_Width << ", " 
-                << this->m_Height << ", " 
-                << this->m_TileWidth << ", " 
-                << this->m_TileHeight << ", " 
-                << this->m_XNbOfTile << ", " 
-                << this->m_YNbOfTile<< ", " 
-                << this->m_NbOfComponent 
-                << std::endl ;    
-     std::cout << "HERE1" << std::endl;
-     return false;
-     }
- }
-
-/************************************************************************/
-/*            Class to manage JPEG2000 tile cache system                */
-/************************************************************************/
-class JPEG2000TileCache
-{
-public:
-  JPEG2000TileCache();
-  ~JPEG2000TileCache();
-
-  typedef std::pair<unsigned int, boost::shared_ptr<opj_image_t> > CachedTileType;
-  typedef std::deque<CachedTileType> TileCacheType;
-
-  /** Get a tile in cache, return null if cache does not contain the
-  tile */
-  boost::shared_ptr<opj_image_t> GetTile(unsigned int tileIndex);
-
-  /** Register a new tile in cache */
-  void AddTile(unsigned int tileIndex, boost::shared_ptr<opj_image_t> tileData);
-
-  /** Remove the front tile */
-  void RemoveOneTile();
-
-  /** Clear the cache */
-  void Clear();
-
-  /** Initialize some parameters linked to the cache size in memory*/
-  void Initialize(unsigned int originalWidthTile, unsigned int originalHeightTile,
-                  unsigned int nbComponent,
-                  unsigned int precision,
-                  unsigned int resolution)
-  {
-    this->EstimateTileCacheSize(originalWidthTile, originalHeightTile,
-                                nbComponent,
-                                precision,
-                                resolution);
-    m_CacheSizeInByte = m_CacheSizeInTiles * m_TileCacheSizeInByte;
-    m_IsReady = true;
-  };
-
-  /** Set the size of the cache with in terms of number of tiles */
-  void SetCacheSizeInTiles(unsigned int nbOfTiles)
-  {
-    if (nbOfTiles > 0 && m_IsReady)
-      {
-      m_CacheSizeInTiles = nbOfTiles;
-      m_CacheSizeInByte = m_CacheSizeInTiles * m_TileCacheSizeInByte;
-      }
-  };
-
-  /** Get the size of the cache in terms of number of tiles */
-  unsigned int GetCacheSizeInTiles() {return m_CacheSizeInTiles; };
-
-  /** Set the size of the cache with in terms of Bytes */
-  void SetCacheSizeInByte(unsigned int sizeInByte)
-  {
-    if (sizeInByte > 0 && m_IsReady)
-      {
-      m_CacheSizeInByte = sizeInByte;
-      if (m_TileCacheSizeInByte)
-        m_CacheSizeInTiles = m_CacheSizeInByte / m_TileCacheSizeInByte;
-      else
-        m_CacheSizeInTiles = 0;
-      }
-  };
-
-  unsigned int GetCurrentNumberOfTileInCache()
-  {
-    return static_cast<unsigned int>(m_Cache.size());
-  };
-
-private:
-  TileCacheType m_Cache;
-  unsigned int m_CacheSizeInTiles;
-  unsigned int m_CacheSizeInByte;
-  unsigned int m_TileCacheSizeInByte;
-  bool m_IsReady;
-
-  itk::SimpleMutexLock m_Mutex;
-
-  /** Estimate the size of a tile in memory*/
-  void EstimateTileCacheSize(unsigned int originalWidthTile, unsigned int originalHeightTile,
-                             unsigned int nbComponent,
-                             unsigned int precision,
-                             unsigned int resolution);
-
-};
-
-JPEG2000TileCache::JPEG2000TileCache() : m_Cache(), m_CacheSizeInTiles(4), m_CacheSizeInByte(0), m_TileCacheSizeInByte(0), m_IsReady(false)
-{}
-
-JPEG2000TileCache::~JPEG2000TileCache()
-{
-  this->Clear();
-}
-
-
-void JPEG2000TileCache::EstimateTileCacheSize(unsigned int originalWidthTile, unsigned int originalHeightTile,
-                                              unsigned int nbComponent,
-                                              unsigned int itkNotUsed(precision),
-                                              unsigned int resolution)
-{
-  this->m_TileCacheSizeInByte = originalWidthTile * originalHeightTile
-                              * nbComponent
-                              * sizeof(OPJ_INT32)
-                              / vcl_pow(2, 2*static_cast<double>(resolution) );
-
-  if (!this->m_TileCacheSizeInByte)
-    {
-    otbMsgDevMacro( << "TileCacheSizeInByte is estimated at " << m_TileCacheSizeInByte
-                    << " bytes so we don't used the cache");
-    }
-
-  otbMsgDevMacro( << "m_TileCacheSizeInByte = " << m_TileCacheSizeInByte );
-}
-
-void JPEG2000TileCache::Clear()
-{
-  m_Cache.clear();
-}
-
-
-boost::shared_ptr<opj_image_t> JPEG2000TileCache::GetTile(unsigned int tileIndex)
-{
-  for(TileCacheType::iterator it = m_Cache.begin();
-      it != m_Cache.end(); ++it)
-    {
-    if(it->first == tileIndex)
-      {
-      otbMsgDevMacro(<<"Tile "<<it->first<<" loaded from cache");
-      return it->second;
-      }
-    }
-  return boost::shared_ptr<opj_image_t>();
-}
-
-void JPEG2000TileCache::RemoveOneTile()
-{
-  if(!m_Cache.empty())
-    {
-    m_Cache.pop_front();
-    }
-}
-
-void JPEG2000TileCache::AddTile(unsigned int tileIndex, boost::shared_ptr<opj_image_t> tileData)
-{
-  // This helper class makes sure the Mutex is unlocked
-  // in the event an exception is thrown.
-  itk::MutexLockHolder<itk::SimpleMutexLock> mutexHolder(m_Mutex);
-
-  if(!m_IsReady)
-    {
-    std::cerr<<(this)<<" Cache is not configured !"<<std::endl;
-    }
-
-  for(TileCacheType::const_iterator it = m_Cache.begin();
-      it != m_Cache.end(); ++it)
-    {
-    if(it->first == tileIndex)
-      {
-      return;
-      }
-    }
-  if(m_Cache.size() >= m_CacheSizeInTiles)
-    {
-    this->RemoveOneTile();
-    }
-  m_Cache.push_back(CachedTileType(tileIndex, tileData));
-}
-
-/************************************************************************/
-/*                     JPEG2000ImageIO                                  */
-/************************************************************************/
-JPEG2000ImageIO::JPEG2000ImageIO()
-{
-    // Initialize multi-threader
-  m_Threader = itk::MultiThreader::New();
-  m_NumberOfThreads = m_Threader->GetNumberOfThreads();
-
-  for(int i = 0; i<m_NumberOfThreads; ++i)
-    {
-    m_InternalReaders.push_back(boost::shared_ptr<JPEG2000InternalReader>(new JPEG2000InternalReader));
-    }
-  m_TileCache = boost::shared_ptr<JPEG2000TileCache>(new JPEG2000TileCache);
-
-  // By default set number of dimensions to two.
-  this->SetNumberOfDimensions(2);
-  m_PixelType = SCALAR;
-  m_ComponentType = UCHAR;
-
-  // Set default spacing to one
-  m_Spacing[0] = 1.0;
-  m_Spacing[1] = 1.0;
-  // Set default origin to zero
-  m_Origin[0] = 0.5;
-  m_Origin[1] = 0.5;
-
-  m_BytePerPixel = 1;
-  m_ResolutionFactor = 0; // Full resolution by default
-  m_CacheSizeInByte = 0; // By default no cache
-}
-
-JPEG2000ImageIO::~JPEG2000ImageIO()
-{}
-
-bool JPEG2000ImageIO::CanReadFile(const char* filename)
-{
-  if (filename == ITK_NULLPTR)
-    {
-    itkDebugMacro(<< "No filename specified.");
-    return false;
-    }
-
-  bool success = true;
-
-  for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-      it != m_InternalReaders.end();
-      ++it)
-    {
-
-    if ( !(*it)->Open(filename, m_ResolutionFactor) )
-      {
-      success = false;
-      }
-    }
-
-  // If one of the readers fails, clean everything
-  if(!success)
-    {
-    for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-        it != m_InternalReaders.end();
-        ++it)
-      {
-      (*it)->Clean();
-      }
-    }
-  return success;
-}
-
-// Used to print information about this object
-void JPEG2000ImageIO::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Resolution Factor: " << m_ResolutionFactor << "\n";
-}
-
-// Read a 3D image not implemented yet
-void JPEG2000ImageIO::ReadVolume(void*)
-{
-}
-
-/** Internal structure used for passing image data into the threading library */
-struct ThreadStruct
-{
-  std::vector<boost::shared_ptr<JPEG2000InternalReader> > Readers;
-  std::vector<JPEG2000TileCache::CachedTileType> * Tiles;
-  JPEG2000ImageIO::Pointer IO;
-  boost::shared_ptr<JPEG2000TileCache> Cache;
-  void * Buffer;
-};
-
-
-std::vector<std::string> JPEG2000ImageIO::GetOverviewsInfo()
-{
-  std::vector<std::string> desc;
-  int originalWidth = m_InternalReaders[0]->m_Width;
-  int originalHeight = m_InternalReaders[0]->m_Height;
-
-  unsigned int lOverviewCount = this->GetOverviewsCount();
-
-  for (unsigned int i = 0; i < lOverviewCount; i++)
-    {
-    // For each resolution we will compute the tile dim and image dim
-    std::ostringstream oss;
-
-    int w = int_ceildivpow2( originalWidth, i);
-    int h = int_ceildivpow2( originalHeight, i);
-
-    int tw = int_ceildivpow2(m_InternalReaders[0]->m_TileWidth, i);
-    int th = int_ceildivpow2(m_InternalReaders[0]->m_TileHeight, i);
-
-    oss << "Resolution: " << i << " (Image [w x h]: " << w << "x" << h << ", Tile [w x h]: " << tw << "x" << th << ")";
-
-    desc.push_back(oss.str());
-    }
-
-  return desc;
-}
-
-unsigned int JPEG2000ImageIO::GetOverviewsCount()
-{
-  std::vector<unsigned int> tempResList = this->m_InternalReaders[0]->GetAvailableResolutions();
-
-  if (tempResList.empty())
-    {
-    itkExceptionMacro(<< "Available resolutions in JPEG2000 is empty");
-    }
-
-  // count includes full resolution
-  return tempResList.size();
-}
-
-// Read image
-void JPEG2000ImageIO::Read(void* buffer)
-{
-  itk::TimeProbe chrono;
-  chrono.Start();
-
-  // Check if conversion succeed
-  if (buffer == ITK_NULLPTR)
-    {
-    itkExceptionMacro(<< "JPEG2000ImageIO : Bad alloc");
-    return;
-    }
-
-  // Re-open the file if it was closed
-  bool open = true;
-  for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-        it != m_InternalReaders.end();
-        ++it)
-      {
-      open = (*it)->m_IsOpen && open;
-      }
-
-  if ( !open )
-    {
-    if ( !this->CanReadFile( m_FileName.c_str() ) )
-      {
-      itkExceptionMacro(<< "Cannot open file " << this->m_FileName << "!");
-      return;
-      }
-    }
-
-  if (m_ResolutionFactor >= this->m_InternalReaders[0]->m_AvailableResolutions.size())
-    {
-    itkExceptionMacro(<< "Resolution not available in the file!");
-    return;
-    }
-
-  std::vector<unsigned int> tileList = this->ComputeTileList();
-  if (tileList.empty())
-    {
-    for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-        it != m_InternalReaders.end();
-        ++it)
-      {
-      (*it)->Clean();
-      }
-    itkExceptionMacro(<< " IORegion does not correspond to any tile!");
-    }
-
-  // Here we sort between tiles from cache and tiles to read
-  std::vector<JPEG2000TileCache::CachedTileType> cachedTiles;
-  std::vector<JPEG2000TileCache::CachedTileType> toReadTiles;
-
-  for (std::vector<unsigned int>::iterator itTile = tileList.begin(); itTile < tileList.end(); ++itTile)
-    {
-    boost::shared_ptr<opj_image_t> currentImage(m_TileCache->GetTile(*itTile));
-
-    JPEG2000TileCache::CachedTileType currentTile = std::make_pair((*itTile), currentImage);
-
-    if(!currentImage)
-      {
-      toReadTiles.push_back(currentTile);
-      }
-    else
-      {
-      cachedTiles.push_back(currentTile);
-      }
-    }
-
-  // First, load tiles from cache
-  for (std::vector<JPEG2000TileCache::CachedTileType>::iterator itTile = cachedTiles.begin(); itTile < cachedTiles.end(); ++itTile)
-    {
-    this->LoadTileData(buffer, itTile->second.get());
-    }
-
-  // If we will read more tiles than the cache size, clear it
-  if(toReadTiles.size() > m_TileCache->GetCacheSizeInTiles())
-    {
-    m_TileCache->Clear();
-    }
-  // Else if there is not enough rooms from new tiles
-  else if(toReadTiles.size() > (m_TileCache->GetCacheSizeInTiles() - m_TileCache->GetCurrentNumberOfTileInCache()))
-    {
-    int nbTileToRemove = toReadTiles.size() - (m_TileCache->GetCacheSizeInTiles() - m_TileCache->GetCurrentNumberOfTileInCache());
-    // Remove from cache as many tiles that will be read in this step
-    for (int itTileR = 0; itTileR < nbTileToRemove; ++itTileR)
-      {
-      m_TileCache->RemoveOneTile();
-      }
-    }
-
-  // Decode all tiles not in cache in parallel
-  if(!toReadTiles.empty())
-    {
-    unsigned int nbThreads = itk::MultiThreader::GetGlobalDefaultNumberOfThreads();
-    if (nbThreads > toReadTiles.size())
-      {
-      nbThreads = toReadTiles.size();
-      }
-    this->GetMultiThreader()->SetNumberOfThreads(nbThreads);
-
-    // Set up the multithreaded processing
-    ThreadStruct str;
-    str.Readers = m_InternalReaders;
-    str.Tiles = &toReadTiles;
-    str.IO = this;
-    str.Cache = m_TileCache;
-    str.Buffer = buffer;
-
-    // Set-up multi-threader
-    this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str);
-
-    // multithread the execution
-    this->GetMultiThreader()->SingleMethodExecute();
-    }
-
-  chrono.Stop();
-  otbMsgDevMacro( << "JPEG2000ImageIO::Read took " << chrono.GetTotal() << " sec");
-
-  for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-       it != m_InternalReaders.end();
-      ++it)
-    {
-    (*it)->Clean();
-    }
-}
-
-// The void * interface prevent us to propagate shared_ptr here
-void JPEG2000ImageIO::LoadTileData(void * buffer, void * currentTile)
-{
-  opj_image_t * tile = static_cast<opj_image_t *>(currentTile);
-
-  if(!tile)
-    {
-    itkExceptionMacro(<<"Tile needed but not loaded.");
-    }
-
- // Get nb. of lines and columns of the region to read
-  /* -Wunused-variable
-  int lNbLines     = this->GetIORegion().GetSize()[1];
-  */
-  int lNbColumns   = this->GetIORegion().GetSize()[0];
-  /* -Wunused-variable
-  int lFirstLine   = this->GetIORegion().GetIndex()[1]; // [1... ]
-  int lFirstColumn = this->GetIORegion().GetIndex()[0]; // [1... ]
-  */
-  unsigned int lWidthSrc; // Width of the input pixel in nb of pixel
-  unsigned int lHeightDest; // Height of the area where write in nb of pixel
-  unsigned int lWidthDest; // Width of the area where write in nb of pixel
-  unsigned int lStartOffsetPxlDest; // Offset where begin to write the area in the otb buffer in nb of pixel
-  unsigned int lStartOffsetPxlSrc; // Offset where begin to write the area in the otb buffer in nb of pixel
-
-  ComputeOffsets(tile, this->GetIORegion(), lWidthSrc, lHeightDest, lWidthDest, lStartOffsetPxlDest, lStartOffsetPxlSrc);
-
-  switch (this->GetComponentType())
-    {
-    case CHAR:
-    {
-    char *p = static_cast<char *> (buffer);
-    for (unsigned int j = 0; j < lHeightDest; ++j)
-      {
-      char* current_dst_line = p + (lStartOffsetPxlDest + j * lNbColumns) * this->m_NumberOfComponents;
-
-      for (unsigned int k = 0; k < lWidthDest; ++k)
-        {
-        for (unsigned int itComp = 0; itComp < this->m_NumberOfComponents; itComp++)
-          {
-          OPJ_INT32* data = tile->comps[itComp].data;
-          *(current_dst_line++) = static_cast<char> (data[lStartOffsetPxlSrc + k + j * lWidthSrc]);
-          }
-        }
-      }
-    }
-    break;
-    case UCHAR:
-    {
-    unsigned char *p = static_cast<unsigned char *> (buffer);
-    for (unsigned int j = 0; j < lHeightDest; ++j)
-      {
-      unsigned char* current_dst_line = p + (lStartOffsetPxlDest + j * lNbColumns) * this->m_NumberOfComponents;
-
-      for (unsigned int k = 0; k < lWidthDest; ++k)
-        {
-        for (unsigned int itComp = 0; itComp < this->m_NumberOfComponents; itComp++)
-          {
-          OPJ_INT32* data = tile->comps[itComp].data;
-          unsigned char component_val = data[lStartOffsetPxlSrc + k + j * lWidthSrc] & 0xff;
-          *(current_dst_line++) = static_cast<unsigned char> (component_val);
-          }
-        }
-      }
-    }
-    break;
-    case SHORT:
-    {
-    short *p = static_cast<short *> (buffer);
-    for (unsigned int j = 0; j < lHeightDest; ++j)
-      {
-      short* current_dst_line = p + (lStartOffsetPxlDest + j * lNbColumns) * this->m_NumberOfComponents;
-
-      for (unsigned int k = 0; k < lWidthDest; ++k)
-        {
-        for (unsigned int itComp = 0; itComp < this->m_NumberOfComponents; itComp++)
-          {
-          OPJ_INT32* data = tile->comps[itComp].data;
-          *(current_dst_line++) = static_cast<short> (data[lStartOffsetPxlSrc + k + j * lWidthSrc]);
-          }
-        }
-      }
-    }
-    break;
-    case USHORT:
-    {
-    unsigned short *p = static_cast<unsigned short *> (buffer);
-    for (unsigned int j = 0; j < lHeightDest; ++j)
-      {
-      unsigned short* current_dst_line = p + (lStartOffsetPxlDest + j * lNbColumns) * this->m_NumberOfComponents;
-
-      for (unsigned int k = 0; k < lWidthDest; ++k)
-        {
-        for (unsigned int itComp = 0; itComp < this->m_NumberOfComponents; itComp++)
-          {
-          OPJ_INT32* data = tile->comps[itComp].data;
-          *(current_dst_line++) = static_cast<unsigned short> (data[lStartOffsetPxlSrc + k + j * lWidthSrc] & 0xffff);
-          }
-        }
-      }
-    }
-    break;
-    case INT:
-    case UINT:
-    default:
-      itkGenericExceptionMacro(<< "This data type is not handled");
-      break;
-    }
-}
-
-ITK_THREAD_RETURN_TYPE JPEG2000ImageIO::ThreaderCallback( void *arg )
-{
-  ThreadStruct *str;
-  unsigned int total, threadCount;
-  itk::ThreadIdType threadId;
-
-  threadId = ((itk::MultiThreader::ThreadInfoStruct *)(arg))->ThreadID;
-  threadCount = ((itk::MultiThreader::ThreadInfoStruct *)(arg))->NumberOfThreads;
-
-  str = (ThreadStruct *)(((itk::MultiThreader::ThreadInfoStruct *)(arg))->UserData);
-
-  // Retrieve data
-  std::vector<boost::shared_ptr<JPEG2000InternalReader> > readers = str->Readers;
-  std::vector<JPEG2000TileCache::CachedTileType> *  tiles = str->Tiles;
-  JPEG2000ImageIO::Pointer io = str->IO;
-  boost::shared_ptr<JPEG2000TileCache> cache = str->Cache;
-  void * buffer = str->Buffer;
-
-  total = std::min((unsigned int)tiles->size(), threadCount);
-
-  if(total == 0)
-    {
-    return ITK_THREAD_RETURN_VALUE;
-    }
-
-
-  unsigned int tilesPerThread = tiles->size()/total;
-  if(tilesPerThread == 0)
-    {
-    tilesPerThread = 1;
-    }
-
-  for(unsigned int i = threadId * tilesPerThread;
-        i < tilesPerThread * (threadId+1);
-        ++i)
-    {
-    boost::shared_ptr<opj_image_t> currentTile = readers.at(threadId)->DecodeTile(tiles->at(i).first);
-
-    // Check if tile is valid
-    if(!currentTile)
-      {
-      readers.at(threadId)->Clean();
-      itkGenericExceptionMacro(" otbopenjpeg failed to decode the desired tile "<<tiles->at(i).first << "!");
-      }
-
-    otbMsgDevMacro(<< " Tile " << tiles->at(i).first << " decoded by thread "<<threadId);
-
-    io->LoadTileData(buffer, currentTile.get());
-
-    if (cache->GetCacheSizeInTiles() != 0)
-     {
-     cache->AddTile(tiles->at(i).first, currentTile);
-     }
-    }
-
-  unsigned int lastTile = threadCount*tilesPerThread + threadId;
-
-  // TODO: check this last part
-
-  if(lastTile < tiles->size())
-    {
-    boost::shared_ptr<opj_image_t> currentTile = readers.at(threadId)->DecodeTile(tiles->at(lastTile).first);
-
-    // Check if tile is valid
-    if(!currentTile)
-      {
-      readers.at(threadId)->Clean();
-      itkGenericExceptionMacro(" otbopenjpeg failed to decode the desired tile "<<tiles->at(lastTile).first << "!");
-      }
-
-    otbMsgDevMacro(<< " Tile " <<tiles->at(lastTile).first  << " decoded by thread "<<threadId);
-
-    io->LoadTileData(buffer, currentTile.get());
-
-    if (cache->GetCacheSizeInTiles() != 0)
-     {
-     cache->AddTile(tiles->at(lastTile).first, currentTile);
-     }
-    }
-
-  return ITK_THREAD_RETURN_VALUE;
-}
-
-void JPEG2000ImageIO::ConfigureCache()
-{
-  itk::ExposeMetaData<unsigned int>(this->GetMetaDataDictionary(),
-                                    MetaDataKey::CacheSizeInBytes,
-                                    m_CacheSizeInByte);
-
-  // Initialize some parameters of the tile cache
-  this->m_TileCache->Initialize(m_InternalReaders.front()->m_TileWidth,
-                                m_InternalReaders.front()->m_TileHeight,
-                                m_InternalReaders.front()->m_NbOfComponent,
-                                m_BytePerPixel,
-                                m_ResolutionFactor);
-
-  // If available set the size of the cache
-  if (this->m_CacheSizeInByte)
-    this->m_TileCache->SetCacheSizeInByte(this->m_CacheSizeInByte);
-}
-
-void JPEG2000ImageIO::ReadImageInformation()
-{
-  // Extract metadata
-  // In case the metadata are not set, the function silently returns, doing nothing
-  itk::ExposeMetaData<unsigned int>(this->GetMetaDataDictionary(),
-                                    MetaDataKey::ResolutionFactor,
-                                    m_ResolutionFactor);
-
-  // Now initialize the itk dictionary
-  itk::MetaDataDictionary& dict = this->GetMetaDataDictionary();
-
-  JPEG2000MetadataReader lJP2MetadataReader(m_FileName.c_str());
-
-  if (lJP2MetadataReader.m_MetadataIsRead)
-    {
-    otbMsgDevMacro(<<"JPEG2000 file has metadata available!");
-
-    // reset the origin to [0,0] as in GDAL convention
-    m_Origin[0] = 0.0;
-    m_Origin[1] = 0.0;
-
-    /* GEOTRANSFORM */
-    if (lJP2MetadataReader.HaveGeoTransform())
-      {
-      otbMsgDevMacro(<< "JPEG2000 file has a geotransform!");
-      std::vector<double> geoTransform = lJP2MetadataReader.GetGeoTransform();
-
-      itk::EncapsulateMetaData<MetaDataKey::VectorType>(dict, MetaDataKey::GeoTransformKey, geoTransform);
-
-      /*std::cout << "from gml box, geotransform: ";
-      for (int i = 0; i < 6; i++)
-        {
-        std::cout << geoTransform[i] << ", ";
-        }
-      std::cout << std::endl; */
-
-      // Retrieve origin and spacing from the geo transform
-      m_Spacing[0] = geoTransform[1];
-      m_Spacing[1] = geoTransform[5];
-
-      if ( m_Spacing[0]== 0 || m_Spacing[1] == 0)
-        {
-        // Manage case where axis are not standard
-        if (geoTransform[2] != 0  && geoTransform[4] != 0 )
-          {
-          m_Spacing[0] = geoTransform[2];
-          m_Spacing[1] = geoTransform[4];
-          }
-        else
-          {
-          otbWarningMacro(<< "JPEG2000 file has an incorrect geotransform  (spacing = 0)!");
-          m_Spacing[0] = 1;
-          m_Spacing[1] = 1;
-          }
-        }
-      // Geotransforms with a non-null rotation are not supported
-      // Beware : GDAL origin is at the corner of the top-left pixel
-      // whereas OTB/ITK origin is at the centre of the top-left pixel
-      // The origin is first stored in GDAL convention. The halft pixel
-      // shift is applied later (when the final spacing is known)
-      m_Origin[0] = geoTransform[0];
-      m_Origin[1] = geoTransform[3];
-      }
-
-    /* GCPs */
-    if (lJP2MetadataReader.GetGCPCount() > 0)
-      {
-      // No GCPprojRef return by GDALJP2metadata
-      std::string gcpProjectionKey = "UNKNOWN";
-      itk::EncapsulateMetaData<std::string>(dict, MetaDataKey::GCPProjectionKey, gcpProjectionKey);
-
-      int nbGCPs = lJP2MetadataReader.GetGCPCount();
-      otbMsgDevMacro(<< "JPEG2000 file has "<< nbGCPs << " GCPs!");
-      itk::EncapsulateMetaData<int>(dict, MetaDataKey::GCPCountKey, nbGCPs);
-
-      std::vector<GDAL_GCP> gcps = lJP2MetadataReader.GetGCPs();
-
-      std::string key;
-      for (int cpt = 0; cpt < nbGCPs; ++cpt)
-        {
-        GDAL_GCP currentGCP = gcps[cpt];
-        OTB_GCP pOtbGCP;
-        pOtbGCP.m_Id = std::string(currentGCP.pszId);
-        pOtbGCP.m_Info = std::string(currentGCP.pszInfo);
-        pOtbGCP.m_GCPRow = currentGCP.dfGCPLine;
-        pOtbGCP.m_GCPCol = currentGCP.dfGCPPixel;
-        pOtbGCP.m_GCPX = currentGCP.dfGCPX;
-        pOtbGCP.m_GCPY = currentGCP.dfGCPY;
-        pOtbGCP.m_GCPZ = currentGCP.dfGCPZ;
-
-        // Complete the key with the GCP number : GCP_i
-        std::ostringstream lStream;
-        lStream << MetaDataKey::GCPParametersKey << cpt;
-        key = lStream.str();
-
-        itk::EncapsulateMetaData<OTB_GCP>(dict, key, pOtbGCP);
-        }
-      }
-
-    /* GMLMetadata*/
-    char** papszGMLMetadata;
-    papszGMLMetadata =  lJP2MetadataReader.GetGMLMetadata();
-    if (CSLCount(papszGMLMetadata) > 0)
-      {
-      otbMsgDevMacro(<< "JPEG2000 file has GMLMetadata!");
-      std::string key;
-
-      for (int cpt = 0; papszGMLMetadata[cpt] != ITK_NULLPTR; ++cpt)
-        {
-        std::ostringstream lStream;
-        lStream << MetaDataKey::MetadataKey << cpt;
-        key = lStream.str();
-
-        itk::EncapsulateMetaData<std::string>(dict, key, static_cast<std::string> (papszGMLMetadata[cpt]));
-        otbMsgDevMacro( << static_cast<std::string>(papszGMLMetadata[cpt]));
-        }
-      }
-
-
-    /* ProjectionRef*/
-    if (lJP2MetadataReader.GetProjectionRef() && !std::string(lJP2MetadataReader.GetProjectionRef()).empty() )
-      {
-      OGRSpatialReferenceH pSR = OSRNewSpatialReference(ITK_NULLPTR);
-
-      const char * pszProjection = ITK_NULLPTR;
-      pszProjection =  lJP2MetadataReader.GetProjectionRef();
-
-      if (OSRImportFromWkt(pSR, (char **) (&pszProjection)) == OGRERR_NONE)
-        {
-        char * pszPrettyWkt = ITK_NULLPTR;
-        OSRExportToPrettyWkt(pSR, &pszPrettyWkt, FALSE);
-
-        itk::EncapsulateMetaData<std::string> (dict, MetaDataKey::ProjectionRefKey,
-                                               static_cast<std::string>(pszPrettyWkt));
-
-        CPLFree(pszPrettyWkt);
-        }
-      else
-        {
-        itk::EncapsulateMetaData<std::string>(dict, MetaDataKey::ProjectionRefKey,
-                                              static_cast<std::string>(lJP2MetadataReader.GetProjectionRef()));
-        }
-
-      if (pSR != ITK_NULLPTR)
-        {
-        OSRRelease(pSR);
-        pSR = ITK_NULLPTR;
-        }
-      }
-    else
-      {
-      otbMsgDevMacro( << "NO PROJECTION IN GML BOX => SENSOR MODEL " );
-      m_Origin[0] = 0.0; m_Origin[1] = 0.0;
-      m_Spacing[0] = 1; m_Spacing[1] = 1;
-
-      lJP2MetadataReader.GetOriginFromGMLBox(m_Origin);
-      }
-
-    otbMsgDevMacro(<< "FROM GML box: " << "Origin: " << m_Origin[0] << ", " << m_Origin[1]
-                   << " | Spacing: " << m_Spacing[0] << ", " << m_Spacing[1] );
-
-    }
-  else
-    {
-    otbMsgDevMacro( << "JPEG2000 file has NO metadata available!");
-    m_Origin[0] = 0.0;
-    m_Origin[1] = 0.0;
-    m_Spacing[0] = 1.0;
-    m_Spacing[1] = 1.0;
-    }
-
-  // Compute final spacing using the resolution factor
-  m_Spacing[0] *= vcl_pow(2.0, static_cast<double>(m_ResolutionFactor));
-  m_Spacing[1] *= vcl_pow(2.0, static_cast<double>(m_ResolutionFactor));
-  // Now that the spacing is known, apply the half-pixel shift
-  m_Origin[0] += 0.5*m_Spacing[0];
-  m_Origin[1] += 0.5*m_Spacing[1];
-
-  // If the internal image was not open we open it.
-  // This is usually done when the user sets the ImageIO manually
-  if ( !m_InternalReaders.front()->m_IsOpen )
-    {
-    if ( !this->CanReadFile( m_FileName.c_str() ) )
-      {
-      itkExceptionMacro(<< "Cannot open file " << this->m_FileName << "!");
-      return;
-      }
-    }
-
-  // Check some internal parameters of the JPEG2000 file
-  if ( !this->m_InternalReaders.front()->CanRead())
-    {
-    this->m_InternalReaders.front()->Clean();
-    itkExceptionMacro(<< "Cannot read this file because some JPEG2000 parameters are not supported!");
-    }
-
-  // If one of the readers fails, clean everything
-  if(this->m_ResolutionFactor != 0)
-    {
-    for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-        it != m_InternalReaders.end();
-        ++it)
-      {
-      (*it)->Clean();
-      }
-
-    bool success = true;
-
-    for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-        it != m_InternalReaders.end();
-        ++it)
-        {
-
-        if ( !(*it)->Open( m_FileName.c_str(), this->m_ResolutionFactor ) )
-          {
-          success = false;
-          }
-        (*it)->m_IsOpen = true;
-        }
-
-    // If one of the readers fails, clean everything
-    if(!success)
-      {
-      for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-          it != m_InternalReaders.end();
-          ++it)
-        {
-        (*it)->Clean();
-        }
-
-      itkExceptionMacro(<< "Cannot open this file with this resolution!");
-      return;
-      }
-    }
-
-  // Encapsulate tile hints for streaming
-  unsigned int tileHintX = m_InternalReaders.front()->m_TileWidth / static_cast<unsigned int>(vcl_pow(2.0, static_cast<int>(m_ResolutionFactor) ));
-  unsigned int tileHintY = m_InternalReaders.front()->m_TileHeight / static_cast<unsigned int>(vcl_pow(2.0, static_cast<int>(m_ResolutionFactor) ));
-
-  itk::EncapsulateMetaData<unsigned int>(dict, MetaDataKey::TileHintX, tileHintX);
-  itk::EncapsulateMetaData<unsigned int>(dict, MetaDataKey::TileHintY, tileHintY);
-
-  // If we have some spacing information we use it
-  // could be needed for other j2k image but not for pleiades
-  // if ( (m_InternalReaders.front()->m_XResolution.front() > 0) && (m_InternalReaders.front()->m_YResolution.front() > 0) )
-  //   {
-  //     // We check previously that the X and Y resolution is equal between the components
-  //     m_Spacing[0] *= m_InternalReaders.front()->m_XResolution[0];
-  //     m_Spacing[1] *= m_InternalReaders.front()->m_YResolution[0];
-  //   }
-
-  m_Dimensions[0] = m_InternalReaders.front()->m_Width;
-  m_Dimensions[1] = m_InternalReaders.front()->m_Height;
-
-  this->SetNumberOfDimensions(2);
-
-  if (m_Dimensions[0] == 0 || m_Dimensions[1] == 0)
-    {
-    itkExceptionMacro(<< "Image size is null.");
-    }
-
-  this->SetNumberOfComponents(m_InternalReaders.front()->m_NbOfComponent);
-
-  // Automatically set the Type to Binary for JPEG2000 data
-  this->SetFileTypeToBinary();
-
-  // We check previously that these values are equal between all components
-  unsigned int precision = m_InternalReaders.front()->m_Precision[0];
-  int          isSigned = m_InternalReaders.front()->m_Signed[0];
-
-  if (precision <= 8)
-    {
-    m_BytePerPixel = 1;
-    if (isSigned)
-      {
-      SetComponentType(CHAR);
-      }
-    else
-      {
-      SetComponentType(UCHAR);
-      }
-    }
-  else if (precision <= 16)
-    {
-    m_BytePerPixel = 2;
-    if (isSigned)
-      {
-      SetComponentType(SHORT);
-      }
-    else
-      {
-      SetComponentType(USHORT);
-      }
-    }
-  else
-    {
-    m_BytePerPixel = 4;
-    if (isSigned)
-      {
-      SetComponentType(INT);
-      }
-    else
-      {
-      SetComponentType(UINT);
-      }
-    }
-
-  if (this->GetNumberOfComponents() == 1)
-    {
-    this->SetPixelType(SCALAR);
-    }
-  else
-    {
-    this->SetPixelType(VECTOR);
-    }
-
-  this->ConfigureCache();
-
-  otbMsgDebugMacro(<< "==========================");
-  otbMsgDebugMacro(<< "ReadImageInformation: ");
-  otbMsgDebugMacro(<< "Tile size (WxH): " << m_InternalReaders.front()->m_TileWidth << " x "
-                   << m_InternalReaders.front()->m_TileHeight);
-  otbMsgDebugMacro(<< "Number of tiles (Xdim x Ydim) : " << m_InternalReaders.front()->m_XNbOfTile
-                   << " x " << m_InternalReaders.front()->m_YNbOfTile);
-  otbMsgDebugMacro(<< "Precision: " << precision);
-  otbMsgDebugMacro(<< "Signed: " << isSigned);
-  otbMsgDebugMacro(<< "Number of octet per value: " << m_BytePerPixel);
-  otbMsgDebugMacro(<< "==========================");
-
-  otbMsgDebugMacro(<< "Driver to read: JPEG2000");
-  otbMsgDebugMacro(<< "         Read  file         : " << m_FileName);
-  otbMsgDebugMacro(<< "         Size               : " << m_Dimensions[0] << "," << m_Dimensions[1]);
-  otbMsgDebugMacro(<< "         ComponentType      : " << this->GetComponentType());
-  otbMsgDebugMacro(<< "         NumberOfComponents : " << this->GetNumberOfComponents());
-  otbMsgDebugMacro(<< "         ComponentSize      : " << this->GetComponentSize());
-  otbMsgDebugMacro(<< "         GetPixelSize       : " << this->GetPixelSize());
-}
-
-// Compute the tile index list from the GetRegion
-std::vector<unsigned int> JPEG2000ImageIO::ComputeTileList()
-{
-  std::vector<unsigned int> tileVector;
-
-  // Get nb. of lines and columns of the region to decode
-  unsigned int startX = this->GetIORegion().GetIndex()[0];
-  unsigned int endX   = this->GetIORegion().GetIndex()[0] + this->GetIORegion().GetSize()[0];
-  unsigned int startY = this->GetIORegion().GetIndex()[1];
-  unsigned int endY   = this->GetIORegion().GetIndex()[1] + this->GetIORegion().GetSize()[1];
-
-  // Compute index of tile recover by the decoded area
-  unsigned int tile_size_x = m_InternalReaders.front()->m_TileWidth;
-  unsigned int tile_size_y = m_InternalReaders.front()->m_TileHeight;
-  unsigned int width = m_Dimensions[0];
-  unsigned int height = m_Dimensions[1];
-  unsigned int nbOfTileX = m_InternalReaders.front()->m_XNbOfTile;
-  unsigned int nbOfTileY = m_InternalReaders.front()->m_YNbOfTile;
-
-  unsigned int tilePosX0, tilePosX1;
-  unsigned int tilePosY0, tilePosY1;
-
-  for (unsigned int itTileY = 0; itTileY < nbOfTileY; itTileY++)
-    {
-    tilePosY0 = uint_ceildivpow2( itTileY*tile_size_y, m_ResolutionFactor );
-    tilePosY1 = std::min( uint_ceildivpow2( (itTileY+1)*tile_size_y, m_ResolutionFactor ), height );
-
-    for (unsigned int itTileX = 0; itTileX < nbOfTileX; itTileX++)
-      {
-      tilePosX0 = uint_ceildivpow2( itTileX*tile_size_x, m_ResolutionFactor );
-      tilePosX1 = std::min( uint_ceildivpow2( (itTileX+1)*tile_size_x, m_ResolutionFactor ), width);
-
-      if ( (tilePosX1 - tilePosX0) && (tilePosY1 - tilePosY0) &&
-           (tilePosX1 > startX) && (tilePosX0 < endX ) &&
-           (tilePosY1 > startY) && (tilePosY0 < endY ) )
-        tileVector.push_back(itTileX + itTileY * nbOfTileX);
-
-      }
-    }
-
-  return tileVector;
-}
-
-/** Compute the offsets in Pixel to move the input buffer from openjpeg
- * to the corresponding area of the otb output buffer
- * */
-void ComputeOffsets( opj_image_t * currentTile,
-                     const itk::ImageIORegion & ioRegion,
-                     unsigned int &l_width_src, // Width of the input pixel in nb of pixel
-                     unsigned int &l_height_dest, // Height of the area where write in nb of pixel
-                     unsigned int &l_width_dest, // Width of the area where write in nb of pixel
-                     unsigned int &l_start_offset_dest, // Offset where begin to write the area in the otb buffer in nb of pixel
-                     unsigned int &l_start_offset_src // Offset where begin to read the data in the openjpeg decoded data in nb of pixel
-  )
-{
-  // Characteristics of the input buffer from openpjeg
-  unsigned int l_x0_src = int_ceildivpow2(currentTile->x0, currentTile->comps->factor);
-  unsigned int l_y0_src = int_ceildivpow2(currentTile->y0, currentTile->comps->factor);
-  unsigned int l_x1_src = int_ceildivpow2(currentTile->x1, currentTile->comps->factor);
-  unsigned int l_y1_src = int_ceildivpow2(currentTile->y1, currentTile->comps->factor);
-
-  // Size of input buffer from openjpeg
-  l_width_src = l_x1_src - l_x0_src;
-  unsigned int l_height_src = l_y1_src - l_y0_src;
-
-  // Characteristics of the otb region
-  unsigned int l_x0_dest = ioRegion.GetIndex()[0];
-  unsigned int l_x1_dest = ioRegion.GetIndex()[0] + ioRegion.GetSize()[0];
-  unsigned int l_y0_dest = ioRegion.GetIndex()[1];
-  unsigned int l_y1_dest = ioRegion.GetIndex()[1] + ioRegion.GetSize()[1];
-
-  unsigned int l_start_x_dest, l_start_y_dest;
-  unsigned int l_offset_x0_src, l_offset_y0_src;
-
-  /*-----*/
-  /* Compute the origin (l_offset_x0_src, l_offset_y0_src )
-   * of the input buffer (decoded tile) which will be move
-   * in the output buffer.
-   * Compute the area of the output buffer (l_start_x_dest,
-   * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
-   * by this input area.
-   */
-
-  if (l_x0_dest < l_x0_src)
-    {
-    l_start_x_dest = l_x0_src - l_x0_dest;
-    l_offset_x0_src = 0;
-
-    if (l_x1_dest >= l_x1_src)
-      {
-      l_width_dest = l_width_src;
-      }
-    else
-      {
-      l_width_dest = l_x1_dest - l_x0_src;
-      }
-    }
-  else
-    {
-    l_start_x_dest = 0;
-    l_offset_x0_src = l_x0_dest - l_x0_src;
-
-    if (l_x1_dest >= l_x1_src)
-      {
-      l_width_dest = l_width_src - l_offset_x0_src;
-      }
-    else
-      {
-      l_width_dest = l_x1_dest - l_x0_dest;
-      }
-    }
-
-  if (l_y0_dest < l_y0_src)
-    {
-    l_start_y_dest = l_y0_src - l_y0_dest;
-    l_offset_y0_src = 0;
-
-    if (l_y1_dest >= l_y1_src)
-      {
-      l_height_dest = l_height_src;
-      }
-    else
-      {
-      l_height_dest = l_y1_dest - l_y0_src;
-      }
-    }
-  else
-    {
-    l_start_y_dest = 0;
-    l_offset_y0_src = l_y0_dest - l_y0_src;
-
-    if (l_y1_dest >= l_y1_src)
-      {
-      l_height_dest = l_height_src - l_offset_y0_src;
-      }
-    else
-      {
-      l_height_dest = l_y1_dest - l_y0_dest;
-      }
-    }
-  /*-----*/
-
-  /* Compute the input buffer offset */
-  l_start_offset_src = l_offset_x0_src + l_offset_y0_src * l_width_src;
-
-  /* Compute the output buffer offset */
-  l_start_offset_dest = l_start_x_dest + l_start_y_dest * (l_x1_dest - l_x0_dest);
-
-  /*
-  std::cout << "SRC coordinates: l_start_x_src= " << l_x0_src << ", l_start_y_src= " << l_y0_src << ", l_width_src= "
-      << l_width_src << ", l_height_src= " << l_height_src << std::endl;
-  std::cout << "SRC tile offset: " << l_offset_x0_src << ", " << l_offset_y0_src << std::endl;
-  std::cout << "SRC buffer offset: " << l_start_offset_src << std::endl;
-
-  std::cout << "DEST coordinates: l_start_x_dest= " << l_start_x_dest << ", l_start_y_dest= " << l_start_y_dest
-      << ", l_width_dest= " << l_width_dest << ", l_height_dest= " << l_height_dest << std::endl;
-  std::cout << "DEST start offset: " << l_start_offset_dest << std::endl;
-  */
-}
-
-// Not yet implemented
-bool JPEG2000ImageIO::CanWriteFile(const char* /*filename*/)
-{
-  return false;
-}
-
-// Not yet implemented
-void JPEG2000ImageIO::Write(const void* /*buffer*/)
-{
-
-}
-
-void JPEG2000ImageIO::WriteImageInformation()
-{
-  if (m_FileName == "")
-    {
-    itkExceptionMacro(<< "A FileName must be specified.");
-    }
-  if (CanWriteFile(m_FileName.c_str()) == false)
-    {
-    itkExceptionMacro(<< "The file " << m_FileName.c_str() << " is not defined as a JPEG2000 file");
-    }
-
-  otbMsgDebugMacro(<< "Driver to write: JPEG2000");
-  otbMsgDebugMacro(<< "         Write file         : " << m_FileName);
-  otbMsgDebugMacro(<< "         Size               : " << m_Dimensions[0] << "," << m_Dimensions[1]);
-  otbMsgDebugMacro(<< "         ComponentType      : " << this->GetComponentType());
-  otbMsgDebugMacro(<< "         NumberOfComponents : " << this->GetNumberOfComponents());
-  otbMsgDebugMacro(<< "         ComponentSize      : " << this->GetComponentSize());
-  otbMsgDebugMacro(<< "         GetPixelSize       : " << this->GetPixelSize());
-
-}
-
-} // end namespace otb
diff --git a/Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIOFactory.cxx b/Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIOFactory.cxx
deleted file mode 100644
index 67f8a03..0000000
--- a/Modules/IO/IOJPEG2000/src/otbJPEG2000ImageIOFactory.cxx
+++ /dev/null
@@ -1,65 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#include "otbJPEG2000ImageIOFactory.h"
-
-#include "itkCreateObjectFunction.h"
-#include "otbJPEG2000ImageIO.h"
-#include "itkVersion.h"
-
-namespace otb
-{
-
-JPEG2000ImageIOFactory::JPEG2000ImageIOFactory()
-{
-  this->RegisterOverride("otbImageIOBase",
-                         "otbJPEG2000ImageIO",
-                         "JPEG2000 Image IO",
-                         1,
-                         itk::CreateObjectFunction<JPEG2000ImageIO>::New());
-}
-
-JPEG2000ImageIOFactory::~JPEG2000ImageIOFactory()
-{
-}
-
-const char*
-JPEG2000ImageIOFactory::GetITKSourceVersion(void) const
-{
-  return ITK_SOURCE_VERSION;
-}
-
-const char*
-JPEG2000ImageIOFactory::GetDescription() const
-{
-  return "JPEG2000 ImageIO Factory, allows the loading of JPEG2000 images into insight";
-}
-
-// Undocumented API used to register during static initialization.
-// DO NOT CALL DIRECTLY.
-
-static bool JPEG2000ImageIOFactoryHasBeenRegistered;
-
-void JPEG2000ImageIOFactoryRegister__Private(void)
-{
-  if( ! JPEG2000ImageIOFactoryHasBeenRegistered )
-    {
-    JPEG2000ImageIOFactoryHasBeenRegistered = true;
-    JPEG2000ImageIOFactory::RegisterOneFactory();
-    }
-}
-} // end namespace otb
diff --git a/Modules/IO/IOJPEG2000/test/CMakeLists.txt b/Modules/IO/IOJPEG2000/test/CMakeLists.txt
deleted file mode 100644
index 63d8b80..0000000
--- a/Modules/IO/IOJPEG2000/test/CMakeLists.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-otb_module_test()
-
-set(OTBIOJPEG2000Tests
-otbIOJPEG2000TestDriver.cxx
-otbJPEG2000ImageIOTestCanWrite.cxx
-otbJPEG2000ImageIOTestCanRead.cxx
-otbGenerateClassicalQLWithJPEG2000.cxx
-)
-
-add_executable(otbIOJPEG2000TestDriver ${OTBIOJPEG2000Tests})
-target_link_libraries(otbIOJPEG2000TestDriver ${OTBIOJPEG2000-Test_LIBRARIES})
-otb_module_target_label(otbIOJPEG2000TestDriver)
-
-# Tests Declaration
-
-otb_add_test(NAME ioTuJP2ImageIOCanRead COMMAND otbIOJPEG2000TestDriver
-  otbJPEG2000ImageIOTestCanRead
-  LARGEINPUT{JPEG2000/QB_multicomp.jpx}
-  )
-
-otb_add_test(NAME ioTuJ2KImageIOCanRead COMMAND otbIOJPEG2000TestDriver
-  otbJPEG2000ImageIOTestCanRead
-  ${INPUTDATA}/bretagne.j2k
-  )
-
-otb_add_test(NAME ioTvJPEG2000ImageIO_CacheSize_500 COMMAND otbIOJPEG2000TestDriver
-  --compare-image ${EPSILON_9}
-  ${BASELINE}/ioClassicalQLJPEG2K_bretagne.tif
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_500.tif
-  otbGenerateClassicalQLWithJPEG2000
-  ${INPUTDATA}/bretagne.j2k
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_500.tif
-  500)
-
-otb_add_test(NAME ioTvJPEG2000ImageIO_CacheSize_5000 COMMAND otbIOJPEG2000TestDriver
-  --compare-image ${EPSILON_9}
-  ${BASELINE}/ioClassicalQLJPEG2K_bretagne.tif
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_5000.tif
-  otbGenerateClassicalQLWithJPEG2000
-  ${INPUTDATA}/bretagne.j2k
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_5000.tif
-  5000)
-
-otb_add_test(NAME ioTvJPEG2000ImageIO_CacheSize_1000 COMMAND otbIOJPEG2000TestDriver
-  --compare-image ${EPSILON_9}
-  ${BASELINE}/ioClassicalQLJPEG2K_bretagne.tif
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_1000.tif
-  otbGenerateClassicalQLWithJPEG2000
-  ${INPUTDATA}/bretagne.j2k
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_1000.tif
-  1000)
-
-otb_add_test(NAME ioTvJPEG2000ImageIO_CacheSize_25000 COMMAND otbIOJPEG2000TestDriver
-  --compare-image ${EPSILON_9}
-  ${BASELINE}/ioClassicalQLJPEG2K_bretagne.tif
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_OUT.tif
-  otbGenerateClassicalQLWithJPEG2000
-  ${INPUTDATA}/bretagne.j2k
-  ${TEMP}/ioClassicalQLJPEG2K_bretagne_OUT.tif)
-
-if(OTB_DATA_USE_LARGEINPUT)
-  set( GenericTestPHR_TESTNB 0)
-
-foreach( current_file ${GenericTestPHR_DATA_INPUTS} )
-  list(GET GenericTestPHR_DATA_TYPES   ${GenericTestPHR_TESTNB} current_type   )
-  math(EXPR GenericTestPHR_TESTNB "${GenericTestPHR_TESTNB} + 1")
-  string(REGEX MATCH "TIFF" PHR_TIFF_FILE ${current_type})
-
-  if(NOT PHR_TIFF_FILE)
-    # CanRead
-    otb_add_test(NAME ioTuJ2KImageIOCanRead_${current_type} COMMAND otbIOJPEG2000TestDriver
-             otbJPEG2000ImageIOTestCanRead
-                ${current_file}
-            )
-  endif()
-
-endforeach()
-
-endif()
-
diff --git a/Modules/IO/IOJPEG2000/test/otbGenerateClassicalQLWithJPEG2000.cxx b/Modules/IO/IOJPEG2000/test/otbGenerateClassicalQLWithJPEG2000.cxx
deleted file mode 100644
index 9b7e184..0000000
--- a/Modules/IO/IOJPEG2000/test/otbGenerateClassicalQLWithJPEG2000.cxx
+++ /dev/null
@@ -1,65 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbVectorImage.h"
-#include "otbStreamingShrinkImageFilter.h"
-#include "otbJPEG2000ImageIO.h"
-
-int otbGenerateClassicalQLWithJPEG2000(int argc, char * argv[])
-{
-  char *             inputFilename = argv[1];
-  char *             outputFilename = argv[2];
-  unsigned int       cacheSize = 0;
-
-  if (argc == 4)
-    cacheSize = atoi(argv[3]) * 1000;
-
-  const unsigned int Dimension = 2;
-
-  typedef unsigned int                                          PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                ImageType;
-  typedef otb::ImageFileReader<ImageType>                       ReaderType;
-  typedef otb::ImageFileWriter<ImageType>                       WriterType;
-  typedef otb::StreamingShrinkImageFilter<ImageType, ImageType> ShrinkType;
-
-  ReaderType::Pointer reader = ReaderType::New();
-  ShrinkType::Pointer shrink = ShrinkType::New();
-  WriterType::Pointer writer = WriterType::New();
-
-  reader->SetFileName(inputFilename);
-
-  otb::JPEG2000ImageIO::Pointer imageIO = otb::JPEG2000ImageIO::New();
-  reader->SetImageIO(imageIO);
-
-  imageIO->SetCacheSizeInByte(cacheSize);
-
-  reader->GenerateOutputInformation();
-
-  writer->SetFileName(outputFilename);
-  shrink->SetShrinkFactor(10);
-
-  shrink->SetInput(reader->GetOutput());
-  shrink->Update();
-
-  writer->SetInput(shrink->GetOutput());
-
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/IO/IOJPEG2000/test/otbIOJPEG2000TestDriver.cxx b/Modules/IO/IOJPEG2000/test/otbIOJPEG2000TestDriver.cxx
deleted file mode 100644
index 8152091..0000000
--- a/Modules/IO/IOJPEG2000/test/otbIOJPEG2000TestDriver.cxx
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "otbTestMain.h"
-void RegisterTests()
-{
-  REGISTER_TEST(otbJPEG2000ImageIOTestCanWrite);
-  REGISTER_TEST(otbJPEG2000ImageIOTestCanRead);
-  REGISTER_TEST(otbGenerateClassicalQLWithJPEG2000);
-}
diff --git a/Modules/IO/IOJPEG2000/test/otbJPEG2000ImageIOTestCanRead.cxx b/Modules/IO/IOJPEG2000/test/otbJPEG2000ImageIOTestCanRead.cxx
deleted file mode 100644
index 099407b..0000000
--- a/Modules/IO/IOJPEG2000/test/otbJPEG2000ImageIOTestCanRead.cxx
+++ /dev/null
@@ -1,36 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-  This software is distributed WITHOUT ANY WARRANTY; without even
-  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-
-
-
-#include "otbJPEG2000ImageIO.h"
-#include "itkMacro.h"
-#include <iostream>
-
-int otbJPEG2000ImageIOTestCanRead(int itkNotUsed(argc), char* argv[])
-{
-  otb::JPEG2000ImageIO::Pointer lJPEG2000ImageIO = otb::JPEG2000ImageIO::New();
-  bool                          lCanRead = lJPEG2000ImageIO->CanReadFile(argv[1]);
-  if (lCanRead == false)
-    {
-    std::cerr << "Erreur otb::JPEG2000ImageIO : impossible to open the image file JPEG2000 " << argv[1] << "." <<
-    std::endl;
-    return EXIT_FAILURE;
-    }
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/IO/IOJPEG2000/test/otbJPEG2000ImageIOTestCanWrite.cxx b/Modules/IO/IOJPEG2000/test/otbJPEG2000ImageIOTestCanWrite.cxx
deleted file mode 100644
index 35f51e8..0000000
--- a/Modules/IO/IOJPEG2000/test/otbJPEG2000ImageIOTestCanWrite.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-  This software is distributed WITHOUT ANY WARRANTY; without even
-  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-  PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-
-
-
-#include "otbJPEG2000ImageIO.h"
-#include "itkMacro.h"
-#include <iostream>
-
-int otbJPEG2000ImageIOTestCanWrite(int itkNotUsed(argc), char* argv[])
-{
-  otb::JPEG2000ImageIO::Pointer lJPEG2000ImageIO = otb::JPEG2000ImageIO::New();
-  bool                          lCanWrite = lJPEG2000ImageIO->CanWriteFile(argv[1]);
-  if (lCanWrite == false)
-    {
-    std::cerr << "Erreur otb::JPEG2000ImageIO : impossible to create the image file JPEG2000 " << argv[1] << "." <<
-    std::endl;
-    return EXIT_FAILURE;
-    }
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.txx b/Modules/IO/ImageIO/include/otbImageFileReader.txx
index 141f5f7..e3db0c8 100644
--- a/Modules/IO/ImageIO/include/otbImageFileReader.txx
+++ b/Modules/IO/ImageIO/include/otbImageFileReader.txx
@@ -342,9 +342,6 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
     itk::EncapsulateMetaData<unsigned int>(dict, MetaDataKey::ResolutionFactor, m_AdditionalNumber);
     }
 
-  // This value is used by JPEG2000ImageIO and not by the others ImageIO
-  itk::EncapsulateMetaData<unsigned int>(dict, MetaDataKey::CacheSizeInBytes, 135000000);
-
   // Got to allocate space for the image. Determine the characteristics of
   // the image.
   //
diff --git a/Modules/IO/ImageIO/otb-module.cmake b/Modules/IO/ImageIO/otb-module.cmake
index 8c0a036..70df430 100644
--- a/Modules/IO/ImageIO/otb-module.cmake
+++ b/Modules/IO/ImageIO/otb-module.cmake
@@ -20,9 +20,6 @@ otb_module(OTBImageIO
     OTBObjectList
     OTBStreaming
 
-  OPTIONAL_DEPENDS
-    OTBIOJPEG2000
-
   TEST_DEPENDS
     OTBStatistics
     OTBTestKernel
diff --git a/Modules/IO/ImageIO/src/CMakeLists.txt b/Modules/IO/ImageIO/src/CMakeLists.txt
index 96b6e61..6c3889d 100644
--- a/Modules/IO/ImageIO/src/CMakeLists.txt
+++ b/Modules/IO/ImageIO/src/CMakeLists.txt
@@ -6,7 +6,6 @@ add_library(OTBImageIO ${OTBImageIO_SRC})
 target_link_libraries(OTBImageIO 
   ${OTBIORAD_LIBRARIES}
   ${OTBIOONERA_LIBRARIES}
-  ${OTBIOJPEG2000_LIBRARIES}
   ${OTBIOLUM_LIBRARIES}
   ${OTBImageBase_LIBRARIES}
   ${OTBIOMW_LIBRARIES}
diff --git a/Modules/IO/ImageIO/src/otbImageIOFactory.cxx b/Modules/IO/ImageIO/src/otbImageIOFactory.cxx
index ab57012..721e472 100644
--- a/Modules/IO/ImageIO/src/otbImageIOFactory.cxx
+++ b/Modules/IO/ImageIO/src/otbImageIOFactory.cxx
@@ -31,10 +31,6 @@
 #include "otbRADImageIOFactory.h"
 #include "otbMWImageIOFactory.h"
 
-#ifdef OTB_USE_OPENJPEG
-#include "otbJPEG2000ImageIOFactory.h"
-#endif
-
 #include "otbTileMapImageIOFactory.h"
 
 namespace otb
@@ -100,9 +96,6 @@ ImageIOFactory::RegisterBuiltInFactories()
       itk::ObjectFactoryBase::RegisterFactory(RADImageIOFactory::New());
       itk::ObjectFactoryBase::RegisterFactory(BSQImageIOFactory::New());
       itk::ObjectFactoryBase::RegisterFactory(LUMImageIOFactory::New());
-#ifdef OTB_USE_OPENJPEG
-      itk::ObjectFactoryBase::RegisterFactory(JPEG2000ImageIOFactory::New());
-#endif
       itk::ObjectFactoryBase::RegisterFactory(TileMapImageIOFactory::New());
       itk::ObjectFactoryBase::RegisterFactory(GDALImageIOFactory::New());
       itk::ObjectFactoryBase::RegisterFactory(MWImageIOFactory::New());
diff --git a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h
index a654b79..c602f12 100644
--- a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h
+++ b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h
@@ -148,8 +148,12 @@ private:
   /** Internal samplers*/
   std::vector<SamplerMapType> m_Samplers;
 
-  /** Field name to store the FID of the geometry each sample comes from */
+  /** Field name to store the FID of the geometry each sample comes from.
+   *  When this name is empty, no FID is stored. */
   std::string m_OriginFieldName;
+
+  /** Flag to enable/disable origin FID in outputs */
+  bool m_UseOriginField;
 };
 
 /**
diff --git a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx
index d2e6847..d881897 100644
--- a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx
+++ b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx
@@ -31,6 +31,7 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
 {
   this->SetNumberOfRequiredOutputs(2);
   m_OriginFieldName = std::string("originfid");
+  m_UseOriginField = true;
 }
 
 template<class TInputImage, class TMaskImage, class TSampler>
@@ -51,7 +52,11 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
 
   // Add an extra field for the original FID
   this->ClearAdditionalFields();
-  this->CreateAdditionalField(this->GetOriginFieldName(),OFTInteger,12);
+  m_UseOriginField = (this->GetOriginFieldName().size() > 0);
+  if (m_UseOriginField)
+    {
+    this->CreateAdditionalField(this->GetOriginFieldName(),OFTInteger,12);
+    }
 
   // compute label mapping
   this->ComputeClassPartition();
@@ -179,7 +184,10 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
       ogr::Layer outputLayer = this->GetInMemoryOutput(threadid,i);
       ogr::Feature feat(outputLayer.GetLayerDefn());
       feat.SetFrom(feature);
-      feat[this->GetOriginFieldName()].SetValue(static_cast<int>(feature.GetFID()));
+      if (m_UseOriginField)
+        {
+        feat[this->GetOriginFieldName()].SetValue(static_cast<int>(feature.GetFID()));
+        }
       feat.SetGeometry(&ogrTmpPoint);
       outputLayer.CreateFeature(feat);
       break;
diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
index f61ba32..934e2d4 100644
--- a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
+++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
@@ -50,15 +50,23 @@ SamplingRateCalculator
   MapRateType::iterator it = m_RatesByClass.begin();
   for (; it != m_RatesByClass.end() ; ++it)
     {
-    if (smallestNbofSamples > it->second.Tot)
+    if (it->second.Tot)
       {
-      smallestNbofSamples = it->second.Tot;
+      if (smallestNbofSamples > it->second.Tot)
+        {
+        smallestNbofSamples = it->second.Tot;
+        }
+      }
+    else
+      {
+      otbWarningMacro("Ignoring empty class " << it->first);
       }
     }
-  // Check if there is an empty class
-  if (smallestNbofSamples == 0UL)
+  // Check if there is at least one non-empty class
+  if (smallestNbofSamples == itk::NumericTraits<unsigned long>::max())
     {
-    otbWarningMacro("There is an empty class, sample size is set to zero!");
+    otbWarningMacro("There are only empty classes, sample size is set to zero!");
+    smallestNbofSamples = 0UL;
     }
   this->SetNbOfSamplesAllClasses( smallestNbofSamples );
 }
@@ -70,7 +78,15 @@ SamplingRateCalculator
   MapRateType::iterator it = m_RatesByClass.begin();
   for (; it != m_RatesByClass.end() ; ++it)
     {
-    it->second.Required = dRequiredNbSamples;
+    if (it->second.Tot)
+      {
+      it->second.Required = dRequiredNbSamples;
+      }
+    else
+      {
+      // ignore empty classes
+      it->second.Required = 0UL;
+      }
     this->UpdateRate(it->first);
     }
 }
@@ -137,7 +153,7 @@ void SamplingRateCalculator
   // Then compute number of samples for each class
   for (it = m_RatesByClass.begin(); it != m_RatesByClass.end() ; ++it)
     {
-    double ratio = it->second.Tot / static_cast<double>(totalNumberOfSamplesAvailable);
+    double ratio = totalNumberOfSamplesAvailable != 0 ? it->second.Tot / static_cast<double>(totalNumberOfSamplesAvailable): 0;
 
     it->second.Required = static_cast<unsigned long>(0.5+ratio*value);
     this->UpdateRate(it->first);
diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx
index 1ffe03a..56eca2c 100644
--- a/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx
+++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx
@@ -372,19 +372,33 @@ SamplingRateCalculatorList
 
         total_nb_samples+=nb_samples[i];
         }
-        
-        for (unsigned int i=0 ; i<this->Size() ; i++)
-          {        
+
+      const Superclass::InternalContainerSizeType sampleListSize = this->Size();
+        for (unsigned int i=0 ; i<sampleListSize ; i++)
+          {
+          if (total_nb_samples != 0)
+            {
             this->GetNthElement(i)->SetTotalNumberOfSamples(vcl_floor(0.5+tot[0]*nb_samples[i]/static_cast<double>(total_nb_samples)));
+            }
+          else
+            {
+            this->GetNthElement(i)->SetTotalNumberOfSamples(0);
+            }
         }
       break;
       }
     case EQUAL:
       {
+      const Superclass::InternalContainerSizeType sampleListSize = this->Size();
 
-      unsigned long total_by_image = static_cast<unsigned long>(vcl_floor(tot[0]/static_cast<double>(this->Size())));
-      
-      for (unsigned int i=0 ; i<this->Size() ; i++)
+      unsigned long total_by_image = 0;
+        
+      if (sampleListSize != 0)
+        {
+        total_by_image = static_cast<unsigned long>(vcl_floor(tot[0]/static_cast<double>(sampleListSize)));
+        }
+
+      for (unsigned int i=0 ; i<sampleListSize ; i++)
         {
         this->GetNthElement(i)->SetTotalNumberOfSamples(total_by_image);
         }        
diff --git a/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx b/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx
index 899a5a2..54656b1 100644
--- a/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx
+++ b/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx
@@ -260,8 +260,7 @@ ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
 
   typename TargetListSampleType::ConstIterator labIt = labels->Begin();
   maskIt.GoToBegin();
-  for (outIt.GoToBegin(); labIt!=labels->End() && !outIt.IsAtEnd(); 
-       ++outIt)
+  for (outIt.GoToBegin(); !outIt.IsAtEnd(); ++outIt)
     {
     double confidenceIndex = 0.0;
     TargetValueType labelValue(m_DefaultLabel);
@@ -270,7 +269,7 @@ ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
       validPoint = maskIt.Get() > 0;
       ++maskIt;
       }
-    if (validPoint)
+    if (validPoint && labIt!=labels->End())
       {
       labelValue = labIt.GetMeasurementVector()[0];
 
@@ -281,6 +280,10 @@ ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
        
       ++labIt;    
       }
+    else
+      {
+      labelValue = m_DefaultLabel;
+      }
     
     outIt.Set(labelValue);
 
diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h
index 458342b..b362373 100644
--- a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h
@@ -29,6 +29,9 @@
 #pragma GCC diagnostic ignored "-Wunused-parameter"
 #pragma GCC diagnostic ignored "-Woverloaded-virtual"
 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wcast-align"
+#pragma GCC diagnostic ignored "-Wunknown-pragmas"
 #endif
 #include "shark/Algorithms/Trainers/RFTrainer.h"
 #if defined(__GNUC__) || defined(__clang__)
diff --git a/Modules/Learning/Supervised/include/otbSharkUtils.h b/Modules/Learning/Supervised/include/otbSharkUtils.h
index 6990bf7..08165a1 100644
--- a/Modules/Learning/Supervised/include/otbSharkUtils.h
+++ b/Modules/Learning/Supervised/include/otbSharkUtils.h
@@ -19,6 +19,7 @@
 #define otbSharkUtils_h
 
 #include "otb_shark.h"
+#include "itkMacro.h"
 
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic push
diff --git a/Modules/MPI/MPIConfig/src/otbMPIConfig.cxx b/Modules/MPI/MPIConfig/src/otbMPIConfig.cxx
index 49ffb07..c582dc3 100644
--- a/Modules/MPI/MPIConfig/src/otbMPIConfig.cxx
+++ b/Modules/MPI/MPIConfig/src/otbMPIConfig.cxx
@@ -27,6 +27,7 @@
 #if defined(__GNUC__) || defined(__clang__)
 # pragma GCC diagnostic push
 # pragma GCC diagnostic ignored "-Wunused-parameter"
+# pragma GCC diagnostic ignored "-Wcast-align"
 #include <mpi.h>
 # pragma GCC diagnostic pop
 #else
diff --git a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h
index 2f6c6f4..7a32268 100644
--- a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h
+++ b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h
@@ -60,6 +60,7 @@
 #if defined(__GNUC__) || defined(__clang__)
 # pragma GCC diagnostic push
 # pragma GCC diagnostic ignored "-Wunused-parameter"
+# pragma GCC diagnostic ignored "-Wcast-align"
 #include "sptw.h"
 # pragma GCC diagnostic pop
 #else
diff --git a/Modules/Remote/Mosaic.remote.cmake b/Modules/Remote/Mosaic.remote.cmake
index 1989f99..adfa72d 100644
--- a/Modules/Remote/Mosaic.remote.cmake
+++ b/Modules/Remote/Mosaic.remote.cmake
@@ -5,5 +5,5 @@ A more detailed description can be found on the project website:
 https://github.com/remicres/otb-mosaic
 "
   GIT_REPOSITORY https://github.com/remicres/otb-mosaic.git
-  GIT_TAG 9a8cdd63ed3bba500bb4ea3867abc38bce8be562
+  GIT_TAG 516dfa7e7b91aa0263e495ee6b3878a03ced9173
 )
diff --git a/Modules/Remote/otb-bv.remote.cmake b/Modules/Remote/otb-bv.remote.cmake
index f699009..e760e4b 100644
--- a/Modules/Remote/otb-bv.remote.cmake
+++ b/Modules/Remote/otb-bv.remote.cmake
@@ -5,5 +5,5 @@ A more detailed description can be found on the project website:
 http://tully.ups-tlse.fr/jordi/otb-bv
 "
   GIT_REPOSITORY http://tully.ups-tlse.fr/jordi/otb-bv.git
-  GIT_TAG master
+  GIT_TAG d13a3b3febe61c3c67777eac8261e07a6257a519
 )
diff --git a/Modules/Remote/otbFFSforGMM.remote.cmake b/Modules/Remote/otbFFSforGMM.remote.cmake
index 74c3752..f1806e1 100644
--- a/Modules/Remote/otbFFSforGMM.remote.cmake
+++ b/Modules/Remote/otbFFSforGMM.remote.cmake
@@ -1,9 +1,9 @@
 #Contact: Adrien Lagrange <adrien.lagrange at irit.fr>
-otb_fetch_module(OTBFastFeaturesSelection
+otb_fetch_module(OTBFFSforGMM
   "This module implements a method to perform a fast forward feature selection using a Gaussian Mixture Model. 
 A more detailed description can be found on the project website:
 https://github.com/Laadr/otbFFSforGMM
 "
   GIT_REPOSITORY https://github.com/Laadr/otbFFSforGMM.git
-  GIT_TAG master
+  GIT_TAG 78743f7d57de4acf913bf300cfbb93323a5c8ad3
   )
diff --git a/Modules/Remote/phenotb.remote.cmake b/Modules/Remote/phenotb.remote.cmake
index 3640ef3..209b968 100644
--- a/Modules/Remote/phenotb.remote.cmake
+++ b/Modules/Remote/phenotb.remote.cmake
@@ -7,5 +7,5 @@ A more detailed description can be found on the project website:
 http://tully.ups-tlse.fr/jordi/phenotb
 "
   GIT_REPOSITORY http://tully.ups-tlse.fr/jordi/phenotb.git
-  GIT_TAG master
+  GIT_TAG 17d69b1bc1f23041dafe265e320b46ffb20229b6
 )
diff --git a/Modules/Remote/temporal-gapfilling.remote.cmake b/Modules/Remote/temporal-gapfilling.remote.cmake
index b135cb2..681ae6e 100644
--- a/Modules/Remote/temporal-gapfilling.remote.cmake
+++ b/Modules/Remote/temporal-gapfilling.remote.cmake
@@ -6,5 +6,5 @@ A more detailed description can be found on the project website:
 http://tully.ups-tlse.fr/jordi/temporalgapfilling
 "
   GIT_REPOSITORY http://tully.ups-tlse.fr/jordi/temporalgapfilling.git
-  GIT_TAG master
+  GIT_TAG 14c56cb73250861d8694effeba934cebde09424c
 )
diff --git a/Modules/ThirdParty/GDAL/otb-module-init.cmake b/Modules/ThirdParty/GDAL/otb-module-init.cmake
index 1ed1ca6..be7cfb7 100644
--- a/Modules/ThirdParty/GDAL/otb-module-init.cmake
+++ b/Modules/ThirdParty/GDAL/otb-module-init.cmake
@@ -8,7 +8,7 @@ if(NOT GDAL_FOUND)
 endif()
 
 #Check if GDAL is compatible with OTB using a bunch of cmake try_run and try_compile. (Default value is ON.)
-set(GDAL_CONFIG_CHECKING ON CACHE BOOL "Tests to check gdal config." FORCE)
+set(GDAL_CONFIG_CHECKING ON CACHE BOOL "Tests to check gdal config.")
 mark_as_advanced(GDAL_CONFIG_CHECKING)
 
 if(NOT GDAL_CONFIG_CHECKING)
@@ -23,6 +23,13 @@ if(NOT EXISTS ${TEMP})
   FILE(MAKE_DIRECTORY ${TEMP})
 endif()
 
+set(GDAL_CONFIG_CHECKING OFF CACHE BOOL "Tests to check gdal config." FORCE)
+
+macro(error_message m)
+  message("Setting GDAL_CONFIG_CHECKING to ON. (all GDAL tests will run again)")
+  set(GDAL_CONFIG_CHECKING ON CACHE BOOL "Tests to check gdal config." FORCE)
+  message(FATAL_ERROR "${m}")
+endmacro(error_message)
 
 #------------------- Helper Macro ---------------------
 macro(gdal_try_run msg_type var source_file)
@@ -37,7 +44,7 @@ ARGS ${ARGN}
 )
 
 if(NOT COMPILE_${var})
-  message(FATAL_ERROR "Compiling Test ${var} - Failed \n
+  error_message("Compiling Test ${var} - Failed \n
 COMPILE_OUTPUT_${var}: '${COMPILE_OUTPUT_${var}}'")
 endif()
 if(RUN_${var})
@@ -47,7 +54,7 @@ if(RUN_${var})
   if("${msg_type}" STREQUAL "STATUS")
     message(${msg_type} "Performing Test ${var} - Failed")
   else()
-    message(${msg_type} "Performing Test ${var} - Failed \n
+    error_message("Performing Test ${var} - Failed \n
             Exit status: '${RUN_${var}}' \n
             RUN_OUTPUT_${var}: '${RUN_OUTPUT_${var}}'")
   endif()
@@ -75,7 +82,7 @@ if(EXISTS "${TEMP}/gdalVersion.txt")
   endif()
   set(GDAL_VERSION_STRING "${_GDAL_VERSION_STRING}" CACHE INTERNAL "" FORCE)
 else()
-  message(FATAL_ERROR "${TEMP}/gdalVersion.txt does not exist. Cannot continue.")
+  error_message( "${TEMP}/gdalVersion.txt does not exist. Cannot continue.")
 endif()
 
 #check OGR
@@ -86,7 +93,7 @@ CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${GDAL_INCLUDE_DIR}" "-w" "-DLINK_LIBRAR
 OUTPUT_VARIABLE COMPILE_OUTPUT_GDAL_HAS_OGR
 )
 if(NOT COMPILE_GDAL_HAS_OGR)
- message(FATAL_ERROR "Performing Test COMPILE_GDAL_HAS_OGR - Failed\n COMPILE_OUTPUT:${COMPILE_OUTPUT_GDAL_HAS_OGR}\n")
+ error_message("Performing Test COMPILE_GDAL_HAS_OGR - Failed\n COMPILE_OUTPUT:${COMPILE_OUTPUT_GDAL_HAS_OGR}\n")
   else()
  message(STATUS "Performing Test COMPILE_GDAL_HAS_OGR - Success")
 endif()
@@ -143,8 +150,13 @@ gdal_try_run(STATUS GDAL_HAS_HDF4 gdalFormatsTest.c HDF4)
 
 #------------------- TESTS (END)---------------------
 
+set(RUN_GDAL_SYMBOLS_TEST TRUE)
+if("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD")
+  set(RUN_GDAL_SYMBOLS_TEST FALSE)
+endif()
+
 #FOR UNIX SYSTEMS ONLY
-if(UNIX)
+if(RUN_GDAL_SYMBOLS_TEST)
   # Prepare bash script
   configure_file(${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/gdalTest.sh.in ${CMAKE_CURRENT_BINARY_DIR}/gdalTest.sh @ONLY)
   execute_process(COMMAND chmod u+x ${CMAKE_CURRENT_BINARY_DIR}/gdalTest.sh)
@@ -159,4 +171,4 @@ elseif("${JPEG2000_DRIVER_USED}" STREQUAL "JPEG2000")
   unset(JPEG2000_DRIVER_USED)
 else()
   message(STATUS "GDAL driver used for JPEG2000 dataset is '${JPEG2000_DRIVER_USED}'")
-endif()
\ No newline at end of file
+endif()
diff --git a/Modules/ThirdParty/MuParserX/CMakeLists.txt b/Modules/ThirdParty/MuParserX/CMakeLists.txt
index 7aa22a8..1d7891d 100644
--- a/Modules/ThirdParty/MuParserX/CMakeLists.txt
+++ b/Modules/ThirdParty/MuParserX/CMakeLists.txt
@@ -2,13 +2,5 @@ project(OTBMuParserX)
 
 set(OTBMuParserX_SYSTEM_INCLUDE_DIRS ${MUPARSERX_INCLUDE_DIRS})
 set(OTBMuParserX_LIBRARIES "${MUPARSERX_LIBRARIES}")
-set(OTBMuParserX_INCLUDE_DIRS ${OTBMuParserX_BINARY_DIR}/src)
-
-configure_file( src/mpCompat.h.in src/mpCompat.h )
 
 otb_module_impl()
-
-install(FILES ${OTBMuParserX_BINARY_DIR}/src/mpCompat.h
-  DESTINATION ${OTBMuParserX_INSTALL_INCLUDE_DIR}
-  COMPONENT Development
-  )
diff --git a/Modules/ThirdParty/MuParserX/otb-module.cmake b/Modules/ThirdParty/MuParserX/otb-module.cmake
index b44f57f..46b52ad 100644
--- a/Modules/ThirdParty/MuParserX/otb-module.cmake
+++ b/Modules/ThirdParty/MuParserX/otb-module.cmake
@@ -10,3 +10,5 @@ otb_module(OTBMuParserX
   )
 
 otb_module_activation_option("Enable MuParserX dependent modules" OFF)
+
+otb_module_requires_cxx11()
diff --git a/Modules/ThirdParty/MuParserX/src/mpCompat.h.in b/Modules/ThirdParty/MuParserX/src/mpCompat.h.in
deleted file mode 100644
index 7ac031c..0000000
--- a/Modules/ThirdParty/MuParserX/src/mpCompat.h.in
+++ /dev/null
@@ -1,46 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even 
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#ifndef MUP_COMPAT_H
-#define MUP_COMPAT_H
-
-/* defined if OTB_CXX_HAS_UNIQUE_PTR cmake check is OK. */
-/* See CMake/OTBCheckCpp11Keywords.cmake for more details */
-#cmakedefine OTB_CXX_HAS_UNIQUE_PTR
-
-#ifndef OTB_CXX_HAS_UNIQUE_PTR
-#define unique_ptr auto_ptr
-#endif
-
-/* defined if OTB_CXX_HAS_OVERRIDE_SPECIFIER cmake check is OK. */
-/* See CMake/OTBCheckCpp11Keywords.cmake for more details */
-#cmakedefine OTB_CXX_HAS_OVERRIDE_SPECIFIER
-
-#ifndef OTB_CXX_HAS_OVERRIDE_SPECIFIER
-#define override
-#endif
-
-/* defined if OTB_CXX_HAS_NULLPTR cmake check is OK. */
-/* See CMake/OTBCheckCpp11Keywords.cmake for more details */
-#cmakedefine OTB_CXX_HAS_NULLPTR
-
-#ifndef OTB_CXX_HAS_NULLPTR
-#define nullptr NULL
-#endif
-
-
-#endif //MUP_COMPAT_H
diff --git a/Modules/ThirdParty/OpenGL/CMakeLists.txt b/Modules/ThirdParty/OpenGL/CMakeLists.txt
index 229a923..2f1a2c7 100644
--- a/Modules/ThirdParty/OpenGL/CMakeLists.txt
+++ b/Modules/ThirdParty/OpenGL/CMakeLists.txt
@@ -2,6 +2,6 @@ project(OTBOpenGL)
 set(OTBOpenGL_THIRD_PARTY 1)
 
 set(OTBOpenGL_SYSTEM_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR})
-set(OTBOpenGL_LIBRARIES ${OPENGL_LIBRARY})
+set(OTBOpenGL_LIBRARIES ${OPENGL_LIBRARIES})
 
 otb_module_impl()
diff --git a/Modules/ThirdParty/OpenGL/otb-module-init.cmake b/Modules/ThirdParty/OpenGL/otb-module-init.cmake
index b3819da..32cb2d0 100644
--- a/Modules/ThirdParty/OpenGL/otb-module-init.cmake
+++ b/Modules/ThirdParty/OpenGL/otb-module-init.cmake
@@ -1,7 +1,18 @@
 #detection of OpenGL is apply is bit tricy as we deactivate
 #framework on OSX globally. see mantis #1193
 if(APPLE)
-  set(OPENGL_FOUND FALSE)
+  set( OPENGL_FOUND FALSE )
+  set( OPENGL_GLU_FOUND FALSE)
+
+  set( OPENGL_INCLUDE_DIR)
+  set( OPENGL_LIBRARIES)
+
+  find_path(
+    OPENGL_INCLUDE_DIR OpenGL/gl.h
+    PATHS "/System/Library/Frameworks/"
+    DOC "Include for OpenGL on OSX"
+    )
+
   find_library(
     OPENGL_gl_LIBRARY OpenGL
     PATHS "/System/Library/Frameworks/"
@@ -14,44 +25,39 @@ if(APPLE)
     DOC "AGL lib for OSX"
     )
 
-  find_path(
-    OPENGL_INCLUDE_DIR OpenGL/gl.h
-    PATHS "/System/Library/Frameworks/"
-    DOC "Include for OpenGL on OSX"
-    )
-
-  if(OPENGL_gl_LIBRARY)
-    set( OPENGL_LIBRARIES  ${OPENGL_gl_LIBRARY} ${OPENGL_LIBRARIES})
-    if(OPENGL_glu_LIBRARY)
-      set( OPENGL_GLU_FOUND "YES" )
-      set( OPENGL_LIBRARIES ${OPENGL_glu_LIBRARY} ${OPENGL_LIBRARIES} )
-    else()
-      set( OPENGL_GLU_FOUND "NO" )
-    endif()
-    # This deprecated setting is for backward compatibility with CMake1.4
-    set (OPENGL_LIBRARY ${OPENGL_LIBRARIES})
+  if( OPENGL_gl_LIBRARY )
+    set( OPENGL_LIBRARIES  ${OPENGL_gl_LIBRARY})
+    set( OPENGL_FOUND TRUE )
+  endif()
+  if( OPENGL_glu_LIBRARY )
+    set( OPENGL_GLU_FOUND TRUE)
+    set( OPENGL_LIBRARIES  ${OPENGL_LIBRARIES} ${OPENGL_glu_LIBRARY} )
   endif()
 
-  # This deprecated setting is for backward compatibility with CMake1.4
-  set(OPENGL_INCLUDE_PATH ${OPENGL_INCLUDE_DIR})
   mark_as_advanced(
     OPENGL_INCLUDE_DIR
-    OPENGL_LIBRARY
+    OPENGL_LIBRARIES
     OPENGL_glu_LIBRARY
     OPENGL_gl_LIBRARY
     )
-  if(NOT OPENGL_LIBRARY OR NOT OPENGL_INCLUDE_DIR)
-    message(FATAL_ERROR "Cannot find OpenGL. Set OPENGL_INCLUDE_DIR and OPENGL_LIBRARY")
-  else()
-    message(STATUS "Found OpenGL framework: ${OPENGL_INCLUDE_DIR}")
-  endif()
-
-  set(OPENGL_FOUND TRUE)
 else(APPLE)
   find_package(OpenGL REQUIRED)
   mark_as_advanced(OPENGL_INCLUDE_DIR)
-  mark_as_advanced(OPENGL_LIBRARY)
-  if(NOT OPENGL_FOUND)
-    message(FATAL_ERROR "Cannot find OpenGL. Set OPENGL_INCLUDE_DIR and OPENGL_LIBRARY")
-  endif()
+  mark_as_advanced(OPENGL_LIBRARIES)
 endif(APPLE)
+
+
+if(NOT OPENGL_INCLUDE_DIR)
+  if(NOT WIN32)
+    message(FATAL_ERROR "Could not find OpenGL (missing: OPENGL_INCLUDE_DIR")
+  endif()
+endif()
+
+if(NOT OPENGL_gl_LIBRARY)
+  message(FATAL_ERROR "Could not find OpenGL (missing: OPENGL_gl_LIBRARY")
+endif()
+
+if(NOT OPENGL_glu_LIBRARY)
+  message(FATAL_ERROR "Could not find OpenGL (missing: OPENGL_glu_LIBRARY")
+endif()
+
diff --git a/Modules/ThirdParty/OpenJPEG/CMakeLists.txt b/Modules/ThirdParty/OpenJPEG/CMakeLists.txt
deleted file mode 100644
index 7dd8fd8..0000000
--- a/Modules/ThirdParty/OpenJPEG/CMakeLists.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-project(OTBOpenJPEG)
-  
-  set(OTBOpenJPEG_SYSTEM_INCLUDE_DIRS ${OPENJPEG_INCLUDE_DIRS})
-  set(OTBOpenJPEG_LIBRARIES "${OPENJPEG_LIBRARIES}")
-  set(OTBOpenJPEG_INCLUDE_DIRS ${OTBOpenJPEG_BINARY_DIR}/src)
-  set(OTBOpenJPEG_EXPORT_CODE_BUILD "
-if(NOT OpenJPEG_FOUND)
-find_package(OpenJPEG REQUIRED HINTS ${OpenJPEG_DIR})
-endif()")
-  set(OTBOpenJPEG_EXPORT_CODE_INSTALL ${OTBOpenJPEG_EXPORT_CODE_BUILD})
-  
-  if(OpenJPEG_FOUND)
-    math(EXPR OTBOpenJPEG_VERSION_NUMBER
-      "((${OPENJPEG_MAJOR_VERSION})*100+${OPENJPEG_MINOR_VERSION})*100+${OPENJPEG_BUILD_VERSION}")
-    configure_file( src/otb_openjpeg.h.in src/otb_openjpeg.h )
-  endif()
-
-  message(STATUS "Found OpenJPEG : ${OPENJPEG_LIBRARIES} (version ${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION})")
-  message(STATUS  "Caution : there could be a version conflict if ITK also contains an OpenJPEG version. "
-                  "Depending on ITK version and enabled modules, the OpenJPEG headers can be "
-                  "present in ITK include folder. Since the include order between modules is "
-                  "deterministic, the OpenJPEG header from ITK may be included first. To avoid "
-                  "version conflicts, try to use an ITK installed without GDCM nor ITKReview. "
-                  "An alternative fix is to simply hide the header openjpeg.h in the ITK "
-                  "include directory.")
-
-  otb_module_impl()
-
-install(FILES ${OTBOpenJPEG_BINARY_DIR}/src/otb_openjpeg.h
-  DESTINATION ${OTBOpenJPEG_INSTALL_INCLUDE_DIR}
-  COMPONENT Development
-  )
diff --git a/Modules/ThirdParty/OpenJPEG/otb-module-init.cmake b/Modules/ThirdParty/OpenJPEG/otb-module-init.cmake
deleted file mode 100644
index 07abcc5..0000000
--- a/Modules/ThirdParty/OpenJPEG/otb-module-init.cmake
+++ /dev/null
@@ -1,2 +0,0 @@
-find_package( OpenJPEG REQUIRED )
-mark_as_advanced( OpenJPEG_DIR )
diff --git a/Modules/ThirdParty/OpenJPEG/otb-module.cmake b/Modules/ThirdParty/OpenJPEG/otb-module.cmake
deleted file mode 100644
index 7310e35..0000000
--- a/Modules/ThirdParty/OpenJPEG/otb-module.cmake
+++ /dev/null
@@ -1,12 +0,0 @@
-set(DOCUMENTATION "This module imports OpenJPEG to the build system")
-
-otb_module(OTBOpenJPEG
-  DEPENDS
-  
-  TEST_DEPENDS
-  
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
-
-otb_module_activation_option("Enable OpenJpeg dependent modules. Note that this may not be needed if your GDal has a JPEG2000 compatible driver (other than jasper)" OFF)
diff --git a/Modules/ThirdParty/OpenJPEG/src/otb_openjpeg.h.in b/Modules/ThirdParty/OpenJPEG/src/otb_openjpeg.h.in
deleted file mode 100644
index c99cf9a..0000000
--- a/Modules/ThirdParty/OpenJPEG/src/otb_openjpeg.h.in
+++ /dev/null
@@ -1,29 +0,0 @@
-/*=========================================================================
-
-  Program:   ORFEO Toolbox
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
-  See OTBCopyright.txt for details.
-
-
-     This software is distributed WITHOUT ANY WARRANTY; without even 
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
-     PURPOSE.  See the above copyright notices for more information.
-
-=========================================================================*/
-#ifndef otb_openjpeg_h
-#define otb_openjpeg_h
-
-/* different API between 2.0 and 2.1 */
-#define OTBOpenJPEG_VERSION_NUMBER @OTBOpenJPEG_VERSION_NUMBER@
-
-extern "C"
-{
-#include "openjpeg.h"
-}
-
-#endif
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
index acfecf8..7925680 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
@@ -235,20 +235,6 @@ namespace ossimplugins
             return false;
          }
       }
-      else
-      {
-         /* Keep this notify as WARN. code should not reach here.
-         If manifest.safe is not found then we are not loading a valid S1 dataset.
-         If the input is tiff or annotation xml, then also there must exists a
-         manifest.safe. However, we are forced to read only annotaion xml and
-         make ossimSentinel1Model out of it for the sake of
-         "ossimSentinel1ModelTest". This is not a very good idea to allow
-         reading a fake dataset.  So user must be warned!
-         */
-         ossimNotify(ossimNotifyLevel_WARN)
-            << MODULE
-            << " manifest.safe not found. but checking if xml file is valid" << "\n";
-      }
 
       // -----[ Read product file
       ossimFilename xmlFileName = file;
@@ -259,6 +245,12 @@ namespace ossimplugins
          const ossimFilename fileNameWihtoutExtension = file.fileNoExtension();
          const ossimFilename path = file.path().path();
          xmlFileName = ossimFilename(path+"/annotation/"+fileNameWihtoutExtension+".xml");
+
+         if (!xmlFileName.exists() && safeFile.empty())
+         {
+            // this is just a plain tiff file without safe nor xml
+            return false;
+         }
       }
 
       if ( !xmlFileName.exists() || !this->readProduct(xmlFileName) )
@@ -279,6 +271,23 @@ namespace ossimplugins
             << " !xmlFileName.exists() || !this->readProduct(xmlFileName) fails \n";
          return false;
       }
+      else
+      {
+         if ( safeFile.empty() )
+         {
+           /* Keep this notify as WARN. code should not reach here.
+           If manifest.safe is not found then we are not loading a valid S1 dataset.
+           If the input is tiff or annotation xml, then also there must exists a
+           manifest.safe. However, we are forced to read only annotaion xml and
+           make ossimSentinel1Model out of it for the sake of
+           "ossimSentinel1ModelTest". This is not a very good idea to allow
+           reading a fake dataset.  So user must be warned!
+           */
+           ossimNotify(ossimNotifyLevel_WARN)
+              << MODULE
+              << " manifest.safe not found, but xml file is valid" << "\n";
+         }
+      }
 
       if ( !this->initImageSize( theImageSize ) )
       {
diff --git a/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt b/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt
index f567480..a1e1cf7 100644
--- a/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt
+++ b/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt
@@ -7,21 +7,21 @@ otb_module_test()
 if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
   #this test is failing on osx due to a bug in AppleClang stdc++ (Luc Hermitte)
  if(NOT APPLE)
-   add_executable(ossimStringUtilitiesTest ossimStringUtilitiesTest.cpp)
-   target_link_libraries(ossimStringUtilitiesTest
+   add_executable(OTBossimStringUtilitiesTest ossimStringUtilitiesTest.cpp)
+   target_link_libraries(OTBossimStringUtilitiesTest
      otbossimplugins
      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
-   otb_module_target_label(ossimStringUtilitiesTest)
-   otb_add_test(NAME ossimStringUtilitiesTest COMMAND ossimStringUtilitiesTest )
+   otb_module_target_label(OTBossimStringUtilitiesTest)
+   otb_add_test(NAME TuossimStringUtilitiesTest COMMAND OTBossimStringUtilitiesTest )
  endif()
 
-  add_executable(ossimTimeUtilitiesTest ossimTimeUtilitiesTest.cpp)
-  target_link_libraries(ossimTimeUtilitiesTest
+  add_executable(OTBossimTimeUtilitiesTest ossimTimeUtilitiesTest.cpp)
+  target_link_libraries(OTBossimTimeUtilitiesTest
     # ${OTBOssim_LIBRARIES}
     otbossimplugins
     ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
-  otb_module_target_label(ossimTimeUtilitiesTest)
-  otb_add_test(NAME ossimTimeUtilitiesTest COMMAND ossimTimeUtilitiesTest )
+  otb_module_target_label(OTBossimTimeUtilitiesTest)
+  otb_add_test(NAME TuossimTimeUtilitiesTest COMMAND OTBossimTimeUtilitiesTest )
 else()
    message(STATUS "Boost unit test framework not found, ossimStringUtilitiesTest and ossimTimeUtilitiesTest will be skipped.")
 endif()
@@ -30,42 +30,42 @@ endif()
 # (requires google.benchmark)
 find_package(GBenchmark)
 if (GBENCHMARK_FOUND)
-   add_executable(ossimTimeUtilitiesBench ossimTimeUtilitiesBench.cpp)
-   include_directories(${GBENCHMARK_INCLUDE_DIRS})
-   target_link_libraries(ossimTimeUtilitiesBench
-      otbossimplugins
-      ${GBENCHMARK_LIBRARIES})
-   otb_module_target_label(ossimTimeUtilitiesBench)
-else()
-   message(STATUS "Google.benchmark not found, ossimTimeUtilitiesBench will be skipped.")
+  add_executable(OTBossimTimeUtilitiesBench ossimTimeUtilitiesBench.cpp)
+  include_directories(${GBENCHMARK_INCLUDE_DIRS})
+  target_link_libraries(OTBossimTimeUtilitiesBench
+    otbossimplugins
+    ${GBENCHMARK_LIBRARIES})
+  otb_module_target_label(OTBossimTimeUtilitiesBench)
+# else()
+# Even if GBenchmark is found, test is not launched because it is not added to ctest
 endif()
 
 
 #===== Domain tests
 #Test executables
-add_executable(ossimSarSensorModelTest ossimSarSensorModelTest.cpp)
-target_link_libraries(ossimSarSensorModelTest otbossimplugins)
-otb_module_target_label(ossimSarSensorModelTest)
+add_executable(OTBossimSarSensorModelTest ossimSarSensorModelTest.cpp)
+target_link_libraries(OTBossimSarSensorModelTest otbossimplugins)
+otb_module_target_label(OTBossimSarSensorModelTest)
 
 # S1
-add_executable(ossimSentinel1ModelTest ossimSentinel1ModelTest.cpp)
-target_link_libraries(ossimSentinel1ModelTest otbossimplugins)
-otb_module_target_label(ossimSentinel1ModelTest)
+add_executable(OTBossimSentinel1ModelTest ossimSentinel1ModelTest.cpp)
+target_link_libraries(OTBossimSentinel1ModelTest otbossimplugins)
+otb_module_target_label(OTBossimSentinel1ModelTest)
 
 # TSX (old)
-add_executable(ossimTerraSarXSarSensorModelTest ossimTerraSarXSarSensorModelTest.cpp)
-target_link_libraries(ossimTerraSarXSarSensorModelTest otbossimplugins)
-otb_module_target_label(ossimTerraSarXSarSensorModelTest)
+add_executable(OTBossimTerraSarXSarSensorModelTest ossimTerraSarXSarSensorModelTest.cpp)
+target_link_libraries(OTBossimTerraSarXSarSensorModelTest otbossimplugins)
+otb_module_target_label(OTBossimTerraSarXSarSensorModelTest)
 
-otb_add_test(NAME ossimSarSensorModelTest COMMAND ossimSarSensorModelTest )
+otb_add_test(NAME TuossimSarSensorModelTest COMMAND OTBossimSarSensorModelTest )
 
 #S1 tests
 file(GLOB s1_files ${INPUTDATA}/ossimPlugins/s1/*.xml)
 #Loop over all S1 annotation files
 foreach(entry ${s1_files})
   get_filename_component(name ${entry} NAME_WE)
-  otb_add_test( NAME s1_inverse_${name} COMMAND ossimSentinel1ModelTest 1 ${entry})
-  otb_add_test( NAME s1_forward_${name} COMMAND ossimSentinel1ModelTest 0 ${entry})
+  otb_add_test( NAME s1_inverse_${name} COMMAND OTBossimSentinel1ModelTest 1 ${entry})
+  otb_add_test( NAME s1_forward_${name} COMMAND OTBossimSentinel1ModelTest 0 ${entry})
 endforeach()
 
 # #TSX tests
diff --git a/Modules/ThirdParty/Shark/src/otb_shark.h.in b/Modules/ThirdParty/Shark/src/otb_shark.h.in
index 3b5ea09..c6c432e 100755
--- a/Modules/ThirdParty/Shark/src/otb_shark.h.in
+++ b/Modules/ThirdParty/Shark/src/otb_shark.h.in
@@ -33,7 +33,7 @@
 #define BOOST_PARAMETER_MAX_ARITY 15
 #define BOOST_FILESYSTEM_VERSION 3
  
-/* without having a compile defintion will give an linker error
+/* without having a compile definition will give an linker error
  * when build otbapp_TrainImagesClassifier or this header test.
  * So define them depending on wheather you have static or shared
  * build of boost.
diff --git a/Modules/ThirdParty/SiftFast/src/CMakeLists.txt b/Modules/ThirdParty/SiftFast/src/CMakeLists.txt
index 56c63b1..ac86849 100644
--- a/Modules/ThirdParty/SiftFast/src/CMakeLists.txt
+++ b/Modules/ThirdParty/SiftFast/src/CMakeLists.txt
@@ -18,7 +18,7 @@ if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
     if(IS_SIFTFAST_COMPILE)
         message(STATUS "Try to compile libsiftfast.cpp -- yes.")
     else()
-        message(STATUS "Try to compile libsiftfast.cpp -- no.")
+        message(STATUS "Try to compile libsiftfast.cpp -- no. OUTPUT_VARIABLE has ${OUTPUT}")
         try_compile(IS_SIFTFAST_COMPILE2
               ${CMAKE_CURRENT_BINARY_DIR}
               ${CMAKE_CURRENT_SOURCE_DIR}/test_try_compile_libsiftfast.cpp
@@ -208,4 +208,4 @@ install(FILES otb_siftfast.h
   COMPONENT Development
   )
 
-otb_module_target( otbsiftfast NO_INSTALL )
\ No newline at end of file
+otb_module_target( otbsiftfast NO_INSTALL )
diff --git a/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp b/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp
index 631ab4e..3a31c09 100644
--- a/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp
+++ b/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp
@@ -28,7 +28,9 @@
 #include <map>
 #include <list>
 
+#ifndef __OpenBSD__
 #include <sys/timeb.h>    // ftime(), struct timeb
+#endif
 
 #ifndef _MSC_VER
 #include <sys/time.h>
diff --git a/Modules/Visualization/Ice/include/otbGlView.h b/Modules/Visualization/Ice/include/otbGlView.h
index a1aa852..48c02d0 100644
--- a/Modules/Visualization/Ice/include/otbGlView.h
+++ b/Modules/Visualization/Ice/include/otbGlView.h
@@ -319,7 +319,6 @@ GlView
   if( actor.IsNull() )
     return false;
 
-
   //
   // Reference actor does not implement geo-interface.
   const otb::GeoInterface * geo =
@@ -328,7 +327,8 @@ GlView
   if( geo==ITK_NULLPTR )
     return false;
 
-
+  const otb::GeoInterface::Spacing2 nativeReferenceSpacing = geo->GetSpacing();
+  
   //
   // Compute transform origin.
   if( !geo->TransformFromViewport( center, vcenter, true ) )
@@ -390,13 +390,12 @@ GlView
   spacing[ 0 ] = vcl_sqrt( x[ 0 ] * x[ 0 ] + x[ 1 ] * x[ 1 ] ) / norm;
   spacing[ 1 ] = vcl_sqrt( y[ 0 ] * y[ 0 ] + y[ 1 ] * y[ 1 ] ) / norm;
 
-  // Sign of x-spacing is done by sign( x . (1, 0) ) which is sign( x[ 0 ] )
-  // Sign of y-spacing is done by sign( y . (0, 1) ) which is sign[ y[ 1 ] )
-
-  if( x[ 0 ]<0.0 )
+  // New spacing signs should match signs of the reference image spacing
+  
+  if( nativeReferenceSpacing[0]<0.0 )
     spacing[ 0 ] = -spacing[ 0 ];
 
-  if( y[ 1 ]<0.0 )
+  if( nativeReferenceSpacing[1]<0.0 )
     spacing[ 1 ] = -spacing[ 1 ];
 
   //
diff --git a/Modules/Visualization/Ice/include/otbStandardShader.h b/Modules/Visualization/Ice/include/otbStandardShader.h
index 6077c36..e5755b5 100644
--- a/Modules/Visualization/Ice/include/otbStandardShader.h
+++ b/Modules/Visualization/Ice/include/otbStandardShader.h
@@ -33,7 +33,17 @@ typedef enum
   SHADER_ALPHA_GRID,
   SHADER_ALPHA_SLIDER,
   SHADER_SPECTRAL_ANGLE,
-  SHADER_GRADIENT
+  SHADER_GRADIENT,
+  SHADER_LUT_JET,
+  SHADER_LUT_LOCAL_JET,
+  SHADER_LUT_HOT,
+  SHADER_LUT_LOCAL_HOT,
+  SHADER_LUT_WINTER,
+  SHADER_LUT_LOCAL_WINTER,
+  SHADER_LUT_SUMMER,
+  SHADER_LUT_LOCAL_SUMMER,
+  SHADER_LUT_COOL,
+  SHADER_LUT_LOCAL_COOL
 } ShaderType;
 
 
diff --git a/Modules/Visualization/Ice/src/otbGlImageActor.cxx b/Modules/Visualization/Ice/src/otbGlImageActor.cxx
index f95da42..530055e 100644
--- a/Modules/Visualization/Ice/src/otbGlImageActor.cxx
+++ b/Modules/Visualization/Ice/src/otbGlImageActor.cxx
@@ -873,13 +873,13 @@ GlImageActor
 #else
   index[ 0 ] =
     static_cast< IndexType::IndexValueType >(
-      ( physical[ 0 ] - m_Origin[ 0 ] ) / 
+      ( physical[ 0 ] + 0.5 * m_Spacing[0] - m_Origin[ 0 ] ) / 
       m_Spacing[ 0 ]
     );
 
   index[ 1 ] =
     static_cast< IndexType::IndexValueType >(
-      ( physical[ 1 ]-  m_Origin[ 1 ] ) /
+      ( physical[ 1 ] + 0.5 * m_Spacing[1] -  m_Origin[ 1 ] ) /
       m_Spacing[ 1 ]
     );
 
diff --git a/Modules/Visualization/Ice/src/otbStandardShader.cxx b/Modules/Visualization/Ice/src/otbStandardShader.cxx
index 66e4817..6fd2676 100644
--- a/Modules/Visualization/Ice/src/otbStandardShader.cxx
+++ b/Modules/Visualization/Ice/src/otbStandardShader.cxx
@@ -85,7 +85,8 @@ std::string StandardShader::GetSource() const
     "uniform int shader_vertical_slider_flag;\n"                        \
     "void main (void) {\n"                                              \
     "vec4 p = texture2D(src, gl_TexCoord[0].xy);\n"                     \
-    "gl_FragColor = pow( clamp( ( p+shader_b ) * shader_a, 0.0, 1.0 ), shader_gamma );\n" \
+    "vec4 colors = pow( clamp( ( p+shader_b ) * shader_a, 0.0, 1.0 ), shader_gamma );\n" \
+    "gl_FragColor = colors;\n"                                          \
     "gl_FragColor[3] = clamp(shader_alpha,0.0,1.0);\n"                  \
     "if(shader_use_no_data > 0 && vec3(p) == vec3(shader_no_data)){\n"  \
     "gl_FragColor[3] = 0.;\n"                                           \
@@ -128,6 +129,141 @@ std::string StandardShader::GetSource() const
     "gl_FragColor[2] = tmp[2];\n"                                       \
     "gl_FragColor[3] = alpha;\n"                                        \
     "}\n"                                                               \
+    "}\n"                                                               \
+    "else if(shader_type == 7)\n"                                       \
+    "{\n"                                                               \
+    "float color = colors[0];\n"                                              \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = -abs( 3.95 * (color - 0.7460)) + 1.5;\n"              \
+    "mapped[1] = -abs( 3.95 * (color - 0.492)) + 1.5;\n"               \
+    "mapped[2] = -abs( 3.95 * (color - 0.2385)) + 1.5;\n"              \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+  "else if(shader_type == 8)\n"                                         \
+    "{\n"                                                               \
+    "if(dist < shader_radius)\n"                                        \
+    "{\n"                                                               \
+    "float color=clamp((p[0]-shader_current[0]+shader_localc_range)/(2.*shader_localc_range),0.0,1.0);\n" \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = -abs( 3.95 * (color - 0.7460)) + 1.5;\n"              \
+    "mapped[1] = -abs( 3.95 * (color - 0.492)) + 1.5;\n"               \
+    "mapped[2] = -abs( 3.95 * (color - 0.2385)) + 1.5;\n"              \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "}\n"                                                               \
+  "else if(shader_type == 9)\n"                                         \
+    "{\n"                                                               \
+    "float color = colors[0];\n"                                        \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = 63.0 / 26.0 * color - 1.0 / 13.0;\n"                   \
+    "mapped[1] = 63.0 / 26.0 * color - 11.0 / 13.0;\n"                  \
+    "mapped[2] = 4.5 * color - 3.5;\n"                                  \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+  "else if(shader_type == 10)\n"                                         \
+    "{\n"                                                               \
+    "if(dist < shader_radius)\n"                                        \
+    "{\n"                                                               \
+    "float color=clamp((p[0]-shader_current[0]+shader_localc_range)/(2.*shader_localc_range),0.0,1.0);\n" \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = 63.0 / 26.0 * color - 1.0 / 13.0;\n"                   \
+    "mapped[1] = 63.0 / 26.0 * color - 11.0 / 13.0;\n"                  \
+    "mapped[2] = 4.5 * color - 3.5;\n"                                  \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "}\n"                                                               \
+  "else if(shader_type == 11)\n"                                         \
+    "{\n"                                                               \
+    "float color = colors[0];\n"                                        \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = 0.0;\n"                                                \
+    "mapped[1] = color;\n"                                              \
+    "mapped[2] = 1.0 - 0.5 * color;\n"                                  \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "else if(shader_type == 12)\n"                                      \
+    "{\n"                                                               \
+    "if(dist < shader_radius)\n"                                        \
+    "{\n"                                                               \
+    "float color=clamp((p[0]-shader_current[0]+shader_localc_range)/(2.*shader_localc_range),0.0,1.0);\n" \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = 0.0;\n"                                                \
+    "mapped[1] = color;\n"                                              \
+    "mapped[2] = 1.0 - 0.5 * color;\n"                                  \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "}\n"                                                               \
+  "else if(shader_type == 13)\n"                                        \
+    "{\n"                                                               \
+    "float color = colors[0];\n"                                        \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = color;\n"                                              \
+    "mapped[1] = 0.5*color+0.5;\n"                                      \
+    "mapped[2] = 0.4;\n"                                                \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "else if(shader_type == 14)\n"                                      \
+    "{\n"                                                               \
+    "if(dist < shader_radius)\n"                                        \
+    "{\n"                                                               \
+    "float color=clamp((p[0]-shader_current[0]+shader_localc_range)/(2.*shader_localc_range),0.0,1.0);\n" \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = color;\n"                                              \
+    "mapped[1] = 0.5*color+0.5;\n"                                      \
+    "mapped[2] = 0.4;\n"                                                \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "}\n"                                                               \
+  "else if(shader_type == 15)\n"                                        \
+    "{\n"                                                               \
+    "float color = colors[0];\n"                                        \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = color;\n"                                              \
+    "mapped[1] = 1.0-color;\n"                                          \
+    "mapped[2] = 1.0;\n"                                                \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
+    "else if(shader_type == 16)\n"                                      \
+    "{\n"                                                               \
+    "if(dist < shader_radius)\n"                                        \
+    "{\n"                                                               \
+    "float color=clamp((p[0]-shader_current[0]+shader_localc_range)/(2.*shader_localc_range),0.0,1.0);\n" \
+    "vec3 mapped;\n"                                                    \
+    "mapped[0] = color;\n"                                              \
+    "mapped[1] = 1.0-color;\n"                                          \
+    "mapped[2] = 1.0;\n"                                                \
+    "mapped = clamp(mapped,0.0,1.0);\n"                                 \
+    "gl_FragColor[0] = mapped[0];\n"                                    \
+    "gl_FragColor[1] = mapped[1];\n"                                    \
+    "gl_FragColor[2] = mapped[2];\n"                                    \
+    "}\n"                                                               \
     "}\n";
   
   if(isGLSLS140Available)
diff --git a/Modules/Visualization/IceViewer/src/otbIceViewer.cxx b/Modules/Visualization/IceViewer/src/otbIceViewer.cxx
index 873317b..bfc39e6 100644
--- a/Modules/Visualization/IceViewer/src/otbIceViewer.cxx
+++ b/Modules/Visualization/IceViewer/src/otbIceViewer.cxx
@@ -468,6 +468,36 @@ void IceViewer::DrawHud()
 	  case SHADER_GRADIENT:
 	    oss<<" gradient";
 	    break;
+    case SHADER_LUT_JET:
+      oss<<"Jet LUT"<<std::endl;
+      break;
+    case SHADER_LUT_LOCAL_JET:
+      oss<<"Local Jet LUT"<<std::endl;
+      break;
+    case SHADER_LUT_HOT:
+      oss<<"Hot LUT"<<std::endl;
+      break;
+    case SHADER_LUT_LOCAL_HOT:
+      oss<<"Local Hot LUT"<<std::endl;
+      break;
+    case SHADER_LUT_WINTER:
+      oss<<"Winter LUT"<<std::endl;
+      break;
+    case SHADER_LUT_LOCAL_WINTER:
+      oss<<"Local Winter LUT"<<std::endl;
+      break;
+    case SHADER_LUT_SUMMER:
+      oss<<"Summer LUT"<<std::endl;
+      break;
+    case SHADER_LUT_LOCAL_SUMMER:
+      oss<<"Local Summer LUT"<<std::endl;
+      break;
+    case SHADER_LUT_COOL:
+      oss<<"Cool LUT"<<std::endl;
+      break;
+    case SHADER_LUT_LOCAL_COOL:
+      oss<<"Local Cool LUT"<<std::endl;
+      break;
 	  }
 	}
 
diff --git a/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx b/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx
index 4a1a871..0096d80 100644
--- a/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx
+++ b/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx
@@ -31,6 +31,7 @@
 
 //
 // OTB includes (sorted by alphabetic order)
+#include "otbWrapperApplicationRegistry.h"
 
 //
 // Monteverdi includes (sorted by alphabetic order)
@@ -74,6 +75,7 @@ MaplaApplication
 MaplaApplication
 ::~MaplaApplication()
 {
+  otb::Wrapper::ApplicationRegistry::CleanRegistry();
 }
 
 /*******************************************************************************/
diff --git a/Modules/Visualization/Monteverdi/include/mvdMainWindow.h b/Modules/Visualization/Monteverdi/include/mvdMainWindow.h
index 80fa424..5e5080f 100644
--- a/Modules/Visualization/Monteverdi/include/mvdMainWindow.h
+++ b/Modules/Visualization/Monteverdi/include/mvdMainWindow.h
@@ -126,7 +126,7 @@ public:
 
   /**
    */
-  bool CheckGLCapabilities();
+  bool CheckGLCapabilities( bool forceNoGLSL = false );
 
   /**
    */
@@ -326,6 +326,10 @@ private:
 
 #endif // USE_PIXEL_DESCRIPTION
 
+  /**
+   */
+  void SetGLSLEnabled( bool );
+
   //
   // I18nMainWindow methods.
 
@@ -424,6 +428,11 @@ private:
    */
   int m_GLSL140;
 
+  /**
+   */
+  bool m_isGLSLAvailable : 1;
+  bool m_ForceNoGLSL : 1;
+
   /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
 
 //
@@ -431,6 +440,10 @@ private:
 private slots:
 
   /**
+   */
+  void on_action_GLSL_triggered( bool );
+
+  /**
    * \brief Qt auto-connected slot which is called when Help/About
    * menu action is activated.
    */
diff --git a/Modules/Visualization/Monteverdi/src/CMakeLists.txt b/Modules/Visualization/Monteverdi/src/CMakeLists.txt
index 85e016f..ab66fc6 100644
--- a/Modules/Visualization/Monteverdi/src/CMakeLists.txt
+++ b/Modules/Visualization/Monteverdi/src/CMakeLists.txt
@@ -72,6 +72,14 @@ add_executable( monteverdi
   ${Monteverdi_App_WIN32_RC_FILE}
   ${OTBMonteverdi_RESOURCES_RCC}
   )
+
+# set monterverdi stack size to 10Mbytes on windows platform because
+# the default size with visual compiler it is 1Mbyte
+# which is to lower for us (thanks to 6S code).
+if (WIN32)
+  set_linker_stack_size_flag( monteverdi 10000000 )
+endif()
+
 target_link_libraries( monteverdi
   OTBMonteverdi
   )
diff --git a/Modules/Visualization/Monteverdi/src/main.cxx b/Modules/Visualization/Monteverdi/src/main.cxx
index 170090b..4a6d300 100644
--- a/Modules/Visualization/Monteverdi/src/main.cxx
+++ b/Modules/Visualization/Monteverdi/src/main.cxx
@@ -58,17 +58,33 @@ enum ERROR_CODE
   ERROR_CODE_USAGE = -5,
 };
 
+
+struct Flags
+{
+  Flags() :
+    loadOTBApplications( false ),
+    forceNoGLSL( false )
+  {
+  }
+
+  bool loadOTBApplications: 1;
+  bool forceNoGLSL: 1;
+};
+
+
 /*****************************************************************************/
 /* FUNCTIONS DECLARATION                                                     */
+/*****************************************************************************/
 
 
 /*****************************************************************************/
 /* MAIN                                                                      */
-
+/*****************************************************************************/
 int
 main( int argc, char* argv[] )
 {
   QApplication qtApp( argc, argv );
+  Flags flags;
 
   //
   // 0. Splash-screen.
@@ -93,8 +109,9 @@ main( int argc, char* argv[] )
 	  QCoreApplication::translate(
 	    PROJECT_NAME,
 	    "Usage: %1 [-h|--help] [-a|--applications] [<filename>...]\n"
-	    "  -h, --help         display this help message.\n"
+	    "  -1, --no-glsl      force OpenGL 1.x compatible rendering."
 	    "  -a, --applications load OTB-applications from OTB_APPLICATIONS_PATH."
+	    "  -h, --help         display this help message.\n"
 	  )
 	  .arg( QFileInfo( argv[ 0 ] ).baseName() )
 	)
@@ -102,10 +119,24 @@ main( int argc, char* argv[] )
 
       return ERROR_CODE_USAGE;
       }
-    else
+
+    else if( it->compare( "-a" )==0 ||
+	     it->compare( "--applications" )==0 )
       {
-      ++ it;
+      flags.loadOTBApplications = true;
+
+      it = args.erase( it );
       }
+
+    else if(it->compare( "-1" )==0 ||
+	    it->compare( "--no-glsl" )==0 )
+      {
+      flags.forceNoGLSL = true;
+
+      it = args.erase( it );
+      }
+    else
+      ++ it;
   }
 
   //
@@ -163,48 +194,28 @@ main( int argc, char* argv[] )
 
   //
   // 4. Check OpenGL capabilities
-  if( !mainWindow.CheckGLCapabilities() )
+  if( !mainWindow.CheckGLCapabilities( flags.forceNoGLSL ) )
     return ERROR_CODE_GL_VERSION;
 
   //
-  // 5. Parse command-line filenames.
-  args.pop_front();
-  {
-  bool otbApplications = false;
-
-  for( QStringList::iterator it( args.begin() );
-       it!=args.end(); )
-    if( it->compare( "-a" )==0 ||
-	it->compare( "--applications" )==0 )
-      {
-      if( !otbApplications )
-	{
+  // 5. Load OTB-applications.
+  if( flags.loadOTBApplications )
 #if USE_OTB_APPS
-	mainWindow.SetupOTBApplications();
+    mainWindow.SetupOTBApplications();
 #else // USE_OTB_APPS
-	qWarning() << "OTB-applications support is not included in this build.";
+    qWarning() << "OTB-applications support is not included in this build.";
 #endif // USE_OTB_APPS
 
-	it = args.erase( it );
-	}
-      }
-    else
-      {
-      ++ it;
-      }
-  }
+  //
+  // 6. Load command-line filenames.
+  args.pop_front();
 
   mainWindow.ImportImages( args );
 
-
   //
   // 6. Let's go: run the application and return exit code.
   int result = QCoreApplication::instance()->exec();
 
-  /*
-  application->CloseDatabase();
-  */
-
   // Coverity-14835
   // {
   delete application;
diff --git a/Modules/Visualization/Monteverdi/src/mvdApplication.cxx b/Modules/Visualization/Monteverdi/src/mvdApplication.cxx
index e42c38f..265818a 100644
--- a/Modules/Visualization/Monteverdi/src/mvdApplication.cxx
+++ b/Modules/Visualization/Monteverdi/src/mvdApplication.cxx
@@ -34,6 +34,7 @@
 
 //
 // Monteverdi includes (sorted by alphabetic order)
+#include "mvdMainWindow.h"
 #include "mvdStackedLayerModel.h"
 
 //
@@ -41,6 +42,10 @@
 #  include "mvdOTBApplicationsModel.h"
 #endif
 
+#if USE_OTB_APPS
+#include "otbWrapperApplicationRegistry.h"
+#endif
+
 //
 // Class implementation.
 namespace mvd
@@ -76,6 +81,9 @@ Application
 Application
 ::~Application()
 {
+#if USE_OTB_APPS
+  otb::Wrapper::ApplicationRegistry::CleanRegistry();
+#endif
 }
 
 /*******************************************************************************/
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
index 5a93be0..263b69d 100644
--- a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
@@ -139,7 +139,9 @@ MainWindow
   m_ShaderWidget( NULL ),
   m_FilenameDragAndDropEventFilter( NULL ),
   m_KeymapDialog( NULL ),
-  m_GLSL140( -2 )
+  m_GLSL140( -2 ),
+  m_isGLSLAvailable( false ),
+  m_ForceNoGLSL( false )
 {
   m_UI->setupUi( this );
 
@@ -171,7 +173,7 @@ MainWindow
 /*****************************************************************************/
 bool
 MainWindow
-::CheckGLCapabilities()
+::CheckGLCapabilities( bool forceNoGLSL )
 {
   assert( m_ImageView!=NULL );
   assert( m_ImageView->GetRenderer()!=NULL );
@@ -182,35 +184,105 @@ MainWindow
   //     m_ImageView->GetRenderer()==NULL )
   //   return false;
 
-  bool isGLSL = m_ImageView->GetRenderer()->CheckGLCapabilities( &m_GLSL140 );
+  m_isGLSLAvailable =
+    m_ImageView->GetRenderer()->CheckGLCapabilities( &m_GLSL140 );
 
 #if FORCE_NO_GLSL
-  m_ImageView->GetRenderer()->SetGLSLEnabled( false );
+  qWarning() << "No-GLSL is always forced in this build!";
+
+  m_ForceNoGLSL = true;
+
+#else
+  m_ForceNoGLSL = forceNoGLSL;
 
-  isGLSL = false;
 #endif // FORCE_NO_GLSL
 
-  // MANTIS-1204
-  // {
+  bool isGLSL = m_isGLSLAvailable && !m_ForceNoGLSL;
+
+  {
+    assert( m_UI!=NULL );
+    assert( m_UI->action_GLSL!=NULL );
+
+    bool isBlocked = m_UI->action_GLSL->blockSignals( true );
+
+    m_UI->action_GLSL->setEnabled( m_isGLSLAvailable );
+    m_UI->action_GLSL->setChecked( isGLSL );
+
+    m_UI->action_GLSL->blockSignals( isBlocked );
+  }
+
+  SetGLSLEnabled( isGLSL );
+
+  return ( !m_isGLSLAvailable || m_ForceNoGLSL ) || m_isGLSLAvailable;
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::SetGLSLEnabled( bool enabled )
+{
   //
-  // Forward GLSL state to quicklook view.
-  assert( GetQuicklookView()!=NULL );
-  assert( GetQuicklookView()->GetRenderer()!=NULL );
+  // Image view
+  {
+    assert( m_ImageView!=NULL );
 
-  GetQuicklookView()->GetRenderer()->SetGLSLEnabled( isGLSL );
-  // }
+    AbstractImageViewRenderer * renderer = m_ImageView->GetRenderer();
+
+    assert( renderer!=NULL );
+
+    if( renderer->SetGLSLEnabled( enabled )!=enabled )
+      {
+      renderer->ClearScene( true );
+      renderer->UpdateScene();
+
+      m_ImageView->updateGL();
+      }
+  }
+
+  {
+    ImageViewWidget * quicklookView = GetQuicklookView();
+    assert( quicklookView!=NULL );
+
+    // MANTIS-1204
+    // {
+    //
+    // Forward GLSL state to quicklook view.
+    assert( GetQuicklookView()->GetRenderer()!=NULL );
+
+    AbstractImageViewRenderer * renderer = quicklookView->GetRenderer();
+
+    assert( renderer!=NULL );
+
+    if( renderer->SetGLSLEnabled( enabled )!=enabled )
+      {
+      renderer->ClearScene( true );
+      renderer->UpdateScene();
 
+      quicklookView->updateGL();
+      }
+    // }
+  }
+
+  //
+  // Shader widget
   assert( m_ShaderWidget!=NULL );
 
-  m_ShaderWidget->SetGLSLEnabled( isGLSL );
+  m_ShaderWidget->SetGLSLEnabled( enabled );
   m_ShaderWidget->SetGLSL140Enabled( m_GLSL140>=0 );
 
+  //
+  // Status bar widget.
   assert( m_StatusBarWidget!=NULL );
 
-  m_StatusBarWidget->SetGLSLEnabled( isGLSL );
-
+  m_StatusBarWidget->SetGLSLEnabled( enabled );
 
-  return true;
+  //
+  // Paint
+  // if( mustRefresh )
+  //   {
+  //   m_ImageView->updateGL();
+  //   quicklookView->updateGL();
+  //   }
 }
 
 /*****************************************************************************/
@@ -470,7 +542,16 @@ MainWindow
     quicklookView,
     SLOT( OnApplyAllRequested() )
   );
+
+  QObject::connect(
+    controller,
+    SIGNAL( ResetEffectsRequested() ),
+    // to:
+    m_ImageView,
+    SLOT( OnResetEffectsRequested() )
+  );
   }
+
 }
 
 /*****************************************************************************/
@@ -1021,8 +1102,8 @@ MainWindow
   quicklookView->SetPickingEnabled( false );
   quicklookView->SetPickingDefaultStatus( false );
 
-  quicklookView->setMinimumSize(  64,  64 );
-  quicklookView->setMaximumSize( 512, 512 );
+  quicklookView->setMinimumSize(  32,  32 );
+  quicklookView->setMaximumSize( 1024, 1024 );
   quicklookView->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
 
   return quicklookView;
@@ -1639,6 +1720,16 @@ MainWindow
 /*****************************************************************************/
 void
 MainWindow
+::on_action_GLSL_triggered( bool checked )
+{
+  // qDebug() << this << "::on_action_GLSL_triggered(" << checked << ")";
+
+  SetGLSLEnabled( m_isGLSLAvailable && !m_ForceNoGLSL && checked );
+}
+
+/*****************************************************************************/
+void
+MainWindow
 ::on_action_Keymap_triggered()
 {
   assert( m_KeymapDialog!=NULL );
@@ -1666,8 +1757,9 @@ MainWindow
 {
   //
   // Select filename.
+  QString caption(tr("Open file..."));
   ImportImages(
-    otb::GetOpenFileNames( this, tr( "Open file..." ) )
+    otb::GetOpenFileNames( this, caption )
   );
 }
 
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc b/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc
index c4178f4..dfd8f7d 100644
--- a/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc
@@ -7,7 +7,7 @@
     <file alias="action_LayerProjection_Icon">../../../../Utilities/Data/Icons/projection_24x24.png</file>
     <file alias="action_LayerUp_Icon">../../../../Utilities/Data/Icons/layer-up_24x24.png</file>
     <file alias="action_LayerBottom_Icon">../../../../Utilities/Data/Icons/layer-bottom_24x24.png</file>
-    <file alias="action_LayerDelete_Icon">../../../../Utilities/Data/Icons/layer-delete_24x24.png</file>
+    <file alias="action_LayerDelete_Icon">../../../../Utilities/Data/Icons/layer-delete.png</file>
     <file alias="action_LayerDown_Icon">../../../../Utilities/Data/Icons/layer-down_24x24.png</file>
     <file alias="action_LayerTop_Icon">../../../../Utilities/Data/Icons/layer-top_24x24.png</file>
     <file alias="action_ZoomFull_Icon">../../../../Utilities/Data/Icons/zoom-1to1.png</file>
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui b/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui
index 4e52db5..98628a1 100644
--- a/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui
@@ -51,7 +51,10 @@
     <addaction name="action_ZoomExtent"/>
     <addaction name="action_ZoomLayer"/>
     <addaction name="separator"/>
+    <addaction name="action_GLSL"/>
+    <addaction name="separator"/>
     <addaction name="action_SaveScreenshot"/>
+    <addaction name="separator"/>
    </widget>
    <widget class="QMenu" name="menu_Edit">
     <property name="title">
@@ -163,6 +166,9 @@
    </property>
   </action>
   <action name="action_ZoomIn">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
    <property name="enabled">
     <bool>false</bool>
    </property>
@@ -271,6 +277,25 @@
     <string>Ctrl+P</string>
    </property>
   </action>
+  <action name="actionOpenGL">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>OpenGL texture</string>
+   </property>
+  </action>
+  <action name="action_GLSL">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Use OpenGL Shading Language (GLSL)</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="mvdMainWindow.qrc"/>
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdCore.h b/Modules/Visualization/MonteverdiCore/include/mvdCore.h
index d0e2582..29561da 100644
--- a/Modules/Visualization/MonteverdiCore/include/mvdCore.h
+++ b/Modules/Visualization/MonteverdiCore/include/mvdCore.h
@@ -130,9 +130,19 @@ enum Effect
   EFFECT_LOCAL_CONTRAST,
   EFFECT_LOCAL_TRANSLUCENCY,
   EFFECT_NORMAL,
-  EFFECT_SPECTRAL_ANGLE,
   EFFECT_SWIPE_H,
   EFFECT_SWIPE_V,
+  EFFECT_SPECTRAL_ANGLE,
+  EFFECT_LUT_JET,
+  EFFECT_LUT_LOCAL_JET,
+  EFFECT_LUT_HOT,
+  EFFECT_LUT_LOCAL_HOT,
+  EFFECT_LUT_WINTER,
+  EFFECT_LUT_LOCAL_WINTER,
+  EFFECT_LUT_SUMMER,
+  EFFECT_LUT_LOCAL_SUMMER,
+  EFFECT_LUT_COOL,
+  EFFECT_LUT_LOCAL_COOL,
   //
   EFFECT_COUNT
 };
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h b/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h
index 1281624..4323187 100644
--- a/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h
+++ b/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h
@@ -347,7 +347,12 @@ ImageSettings
     m_Effect==EFFECT_GRADIENT ||
     m_Effect==EFFECT_LOCAL_CONTRAST ||
     m_Effect==EFFECT_LOCAL_TRANSLUCENCY ||
-    m_Effect==EFFECT_SPECTRAL_ANGLE;
+    m_Effect==EFFECT_SPECTRAL_ANGLE ||
+    m_Effect==EFFECT_LUT_LOCAL_JET ||
+    m_Effect==EFFECT_LUT_LOCAL_HOT ||
+    m_Effect==EFFECT_LUT_LOCAL_WINTER ||
+    m_Effect==EFFECT_LUT_LOCAL_SUMMER ||
+    m_Effect==EFFECT_LUT_LOCAL_COOL;
 }
 
 /*****************************************************************************/
@@ -358,7 +363,12 @@ ImageSettings
 {
   return
     m_Effect==EFFECT_LOCAL_CONTRAST ||
-    m_Effect==EFFECT_SPECTRAL_ANGLE;
+    m_Effect==EFFECT_SPECTRAL_ANGLE ||
+    m_Effect==EFFECT_LUT_LOCAL_JET ||
+    m_Effect==EFFECT_LUT_LOCAL_HOT ||
+    m_Effect==EFFECT_LUT_LOCAL_WINTER ||
+    m_Effect==EFFECT_LUT_LOCAL_SUMMER ||
+    m_Effect==EFFECT_LUT_LOCAL_COOL;
 }
 
 /*****************************************************************************/
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdTypes.h b/Modules/Visualization/MonteverdiCore/include/mvdTypes.h
index e895260..27fbc5a 100644
--- a/Modules/Visualization/MonteverdiCore/include/mvdTypes.h
+++ b/Modules/Visualization/MonteverdiCore/include/mvdTypes.h
@@ -217,6 +217,7 @@ struct PixelInfo
     m_Point(),
     m_Index(),
     m_Pixel(),
+    m_Resolution (1),
     m_HasPoint( false ),
     m_HasIndex( false ),
     m_HasPixel( false ),
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h b/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h
index 8532f8a..478636b 100644
--- a/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h
+++ b/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h
@@ -550,6 +550,18 @@ VectorImageSettings
 {
   m_IsGrayscaleActivated = activated;
 
+  Effect effect = GetEffect();
+
+  if(activated
+     && effect == EFFECT_SPECTRAL_ANGLE)
+    {
+    SetEffect(EFFECT_NORMAL);
+    }
+  else if(!activated && effect >= EFFECT_LUT_LOCAL_JET)
+    {
+    SetEffect(EFFECT_NORMAL);
+    }
+  
   SetModified();
 }
 
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx b/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx
index 0414291..4995497 100644
--- a/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx
+++ b/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx
@@ -87,9 +87,19 @@ EFFECT_NAMES[ EFFECT_COUNT ] =
   QT_TRANSLATE_NOOP( "mvd", "Local contrast" ),
   QT_TRANSLATE_NOOP( "mvd", "Local translucency" ),
   QT_TRANSLATE_NOOP( "mvd", "Normal" ),
-  QT_TRANSLATE_NOOP( "mvd", "Spectral angle" ),
   QT_TRANSLATE_NOOP( "mvd", "Swipe (horizontal)" ),
   QT_TRANSLATE_NOOP( "mvd", "Swipe (vertical)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Spectral angle" ),
+  QT_TRANSLATE_NOOP( "mvd", "Lookup table (jet)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Local lookup table (jet)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Lookup table (hot)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Local lookup table (hot)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Lookup table (winter)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Local lookup table (winter)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Lookup table (summer)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Local lookup table (summer)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Lookup table (cool)" ),
+  QT_TRANSLATE_NOOP( "mvd", "Local lookup table (cool)" )
 };
 
 bool
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx b/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx
index da3a3c6..f3b45ca 100644
--- a/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx
+++ b/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx
@@ -562,34 +562,33 @@ I18nCoreApplication
 
   // QTextCodec::setCodecForCStrings( QTextCodec::codecForName("System") );
 
-  qWarning()
+  qDebug()
     << "Codec for C-strings:"
     << ( QTextCodec::codecForCStrings()!=NULL
 	 ? QTextCodec::codecForCStrings()->name()
 	 : "none" );
 
-  qWarning()
+  qDebug()
     << "Codec for Locale:"
     << ( QTextCodec::codecForLocale()!=NULL
 	 ? QTextCodec::codecForLocale()->name()
 	 : "none" );
 
-  qWarning()
+  qDebug()
     << "Codec for Tr:"
     << ( QTextCodec::codecForTr()!=NULL
 	 ? QTextCodec::codecForTr()->name()
 	 : "none" );
 
-
   //
   // 1. default UI language is english (no translation).
   QLocale sys_lc( QLocale::system() );
 
   // Trace system locale.
-  qWarning()
+  qDebug()
     << "Language:" << QLocale::languageToString( sys_lc.language() );
 
-  qWarning()
+  qDebug()
     << "Country:" << QLocale::countryToString( sys_lc.country() );
 
   // Check system locale.
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx b/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx
index cc82534..3fef0af 100644
--- a/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx
+++ b/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx
@@ -130,6 +130,31 @@ ImageSettings
       return m_Angle;
       break;
 
+    case EFFECT_LUT_LOCAL_JET:
+      // qDebug() << "Range:" << m_Range;
+      return m_Range;
+      break;
+
+    case EFFECT_LUT_LOCAL_HOT:
+      // qDebug() << "Range:" << m_Range;
+      return m_Range;
+      break;
+      
+    case EFFECT_LUT_LOCAL_WINTER:
+      // qDebug() << "Range:" << m_Range;
+      return m_Range;
+      break;
+      
+    case EFFECT_LUT_LOCAL_SUMMER:
+      // qDebug() << "Range:" << m_Range;
+      return m_Range;
+      break;
+      
+    case EFFECT_LUT_LOCAL_COOL:
+      // qDebug() << "Range:" << m_Range;
+      return m_Range;
+      break;
+
     default:
       break;
     }
@@ -154,6 +179,31 @@ ImageSettings
       m_Angle = value;
       break;
 
+    case EFFECT_LUT_LOCAL_JET:
+      // qDebug() << "Range = " << value;
+      m_Range = value;
+      break;
+
+    case EFFECT_LUT_LOCAL_HOT:
+      // qDebug() << "Range = " << value;
+      m_Range = value;
+      break;
+
+    case EFFECT_LUT_LOCAL_WINTER:
+      // qDebug() << "Range = " << value;
+      m_Range = value;
+      break;
+      
+    case EFFECT_LUT_LOCAL_SUMMER:
+      // qDebug() << "Range = " << value;
+      m_Range = value;
+      break;
+      
+    case EFFECT_LUT_LOCAL_COOL:
+      // qDebug() << "Range = " << value;
+      m_Range = value;
+      break;
+
     default:
       break;
     }
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx
index 95dd12f..148aafb 100644
--- a/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx
+++ b/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx
@@ -41,6 +41,8 @@
 // Monteverdi includes (sorted by alphabetic order)
 #include "mvdAbstractLayerModel.h"
 #include "mvdAlgorithm.h"
+#include "mvdVectorImageModel.h"
+#include "mvdCore.h"
 
 namespace mvd
 {
@@ -251,7 +253,7 @@ StackedLayerModel
     ? m_Current
     : ( m_Current>0
         ? m_Current - 1
-        : StackedLayerModel::NIL_INDEX );
+        : GetCount()>1 ? 0 : StackedLayerModel::NIL_INDEX );
 
   //
   // Emit signals.
@@ -285,7 +287,7 @@ StackedLayerModel
       ? m_Reference
       : ( m_Reference > 0
 	  ? m_Reference - 1
-	  : StackedLayerModel::NIL_INDEX ),
+          : GetCount() > 0 ? 0 : StackedLayerModel::NIL_INDEX ),
       true
     );
 
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
index d891e8f..98511d8 100644
--- a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
+++ b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
@@ -212,7 +212,7 @@ VectorImageModel
   // TODO: this choice should be done by the user during the import of the file
   bool forceToCacheOvw = true;
 
-  qWarning() << tr( "The ImageIO used to read this file supports overviews." );
+  qDebug() << tr( "The ImageIO used to read this file supports overviews." );
 
   if( nbOfAvailableOvw>0 )
     {
@@ -223,7 +223,7 @@ VectorImageModel
   // TODO MSD: how to manage case of JPEG2000 with no overviews ? : wait GDAL support OpenJPEG ...
 
   // The current file don't have overviews available
-  qWarning() << tr( "The file doesn't have overviews." );
+  qDebug() << tr( "The file doesn't have overviews." );
 
   if( !forceToCacheOvw )
     {
diff --git a/Modules/Visualization/MonteverdiGui/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/CMakeLists.txt
index 73d8b00..d503daf 100644
--- a/Modules/Visualization/MonteverdiGui/CMakeLists.txt
+++ b/Modules/Visualization/MonteverdiGui/CMakeLists.txt
@@ -7,4 +7,45 @@ set( OTBMonteverdiGUI_INCLUDE_DIRS
   ${OTBMonteverdiGUI_BINARY_DIR}/src
   )
 
+
+set(OTBMonteverdiGUI_DATA_DIR "${CMAKE_SOURCE_DIR}/Utilities/Data")
+
+if (UNIX AND NOT APPLE)
+  # -------------------------
+  # Install icons
+  # following freedesktop recommandations
+  # http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
+
+  # The different icon sizes installed
+  # According to the specs, the 48x48 icon is mandatory, others are optional
+  set( icon_sizes 16 32 48 128 )
+  foreach( icon_size ${icon_sizes} )
+    install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-${icon_size}x${icon_size}.png
+      DESTINATION share/icons/hicolor/${icon_size}x${icon_size}/apps
+      RENAME monteverdi.png)
+  endforeach()
+
+  # Fallback on "/usr/share/pixmaps"
+  # See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-32x32.png
+    DESTINATION share/pixmaps
+    RENAME monteverdi.png)
+
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-splash.png
+    DESTINATION share/pixmaps
+    RENAME monteverdi-splash.png)
+
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-32x32.xpm
+    DESTINATION share/pixmaps
+    RENAME monteverdi.xpm)
+
+  # -------------------------
+  # Install freedesktop entry
+
+  configure_file(${OTBMonteverdiGUI_DATA_DIR}/monteverdi.desktop.in ${CMAKE_BINARY_DIR}/monteverdi.desktop)
+  install(FILES ${CMAKE_BINARY_DIR}/monteverdi.desktop
+    DESTINATION share/applications)
+
+endif()
+
 otb_module_impl()
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h b/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h
index c2930c3..eb134a5 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h
@@ -250,6 +250,7 @@ public:
 
 // public slots
 public slots:
+  inline void ClearScene( bool keepViewport = false );
   inline void UpdateScene();
   inline void RefreshScene();
 
@@ -280,7 +281,6 @@ protected:
   {
   }
 
-
 //
 // Protected attributes.
 protected:
@@ -292,7 +292,7 @@ protected:
 private:
   /**
    */
-  // virtual void virtual_ClearScene() {};
+  virtual void virtual_ClearScene( bool ) {};
   /**
    */
   virtual void virtual_PrepareScene() {};
@@ -460,6 +460,15 @@ AbstractImageViewRenderer
 inline
 void
 AbstractImageViewRenderer
+::ClearScene( bool keepViewport )
+{
+  virtual_ClearScene( keepViewport );
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageViewRenderer
 ::UpdateScene()
 {
   virtual_PrepareScene();
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h
index 3182a3e..fe9d894 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h
@@ -323,6 +323,8 @@ private slots:
   /**
    */
   void on_gammaSlider_valueChanged( int gamma );
+
+  void on_gammaResetButton_clicked();
 };
 
 } // end namespace 'mvd'.
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h b/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h
index 4167861..adfe944 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h
@@ -269,6 +269,7 @@ private:
   //
   // AbstractImageViewRenderer overloads.
 
+  void virtual_ClearScene( bool ) ITK_OVERRIDE;
   void virtual_UpdateScene() ITK_OVERRIDE;
   void virtual_RefreshScene() ITK_OVERRIDE;
 
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h
index add78b1..61c4022 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h
@@ -410,6 +410,7 @@ private slots:
   /**
    */
   void OnApplyAllRequested();
+  void OnResetEffectsRequested();
   /**
    */
   void OnSetReferenceRequested();
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h b/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h
index e887e4d..336adf0 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h
@@ -167,10 +167,6 @@ private:
 
   /**
    */
-  QPushButton * m_IgnoreButton;
-
-  /**
-   */
   GDALOverviewsBuilderVector m_GDALOverviewsBuilders;
 
   /**
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h
index 24b0cf5..e9dcfb7 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h
@@ -107,6 +107,7 @@ signals:
   /**
    */
   void ApplyAllRequested();
+  void ResetEffectsRequested();
 
   /*-[ PROTECTED SECTION ]---------------------------------------------------*/
 
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h
index ae0a08d..b38e962 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h
@@ -131,6 +131,8 @@ public:
    */
   void SetReloadEnabled( bool );
 
+  void SetResetEffectsEnabled( bool );
+
   /**
    */
   void InstallEventFilter( QObject * filter );
@@ -190,6 +192,9 @@ signals:
   void ApplyButtonClicked();
   /**
    */
+  void ResetEffectsButtonClicked();
+  /**
+   */
   void CopyLayerRequested( const AbstractLayerModel * );
 
   /*-[ PROTECTED SECTION ]---------------------------------------------------*/
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h
index 640131d..aae6425 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h
@@ -23,7 +23,7 @@
 // Configuration include.
 //// Included at first position before any other ones.
 #include "ConfigureMonteverdi.h"
-
+#include "mvdImageSettings.h"
 
 /*****************************************************************************/
 /* INCLUDE SECTION                                                           */
@@ -114,6 +114,8 @@ public:
 // Public SLOTS.
 public slots:
 
+  void GrayscaleActivated(bool status);
+
   /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
 
 //
@@ -137,6 +139,8 @@ protected:
 // Private methods.
 private:
 
+  void SetEffectVisible(const Effect & effect, bool visible);
+  
   /** */
   void virtual_SetSettings( ImageSettings * ) ITK_OVERRIDE;
 
diff --git a/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt
index b61d295..99b784c 100644
--- a/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt
+++ b/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt
@@ -120,7 +120,7 @@ set( OTBMonteverdiGUI_FORMS
 
 #############################################################################
 set( OTBMonteverdiGUI_RESOURCES
-  # mvdIcons.qrc
+  mvdIcons.qrc
 )
 
 #############################################################################
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui
index dd697cc..b7d6734 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui
@@ -343,7 +343,7 @@
      </property>
      <property name="icon">
       <iconset>
-       <normaloff>:/icons/Data/Icons/execute.png</normaloff>:/icons/Data/Icons/execute.png</iconset>
+          <normaloff>:/icons/Utilities/Data/Icons/execute.png</normaloff>:/icons/Utilities/Data/Icons/execute.png</iconset>
      </property>
      <property name="iconSize">
       <size>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx
index 4b3c384..0e0daa8 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx
@@ -454,4 +454,11 @@ ColorDynamicsWidget
   QToolTip::showText(mapToGlobal(m_UI->gammaSlider->pos()),tr("Gamma: ") % QString::number(GetGamma()) );
 }
 
+void
+ColorDynamicsWidget
+::on_gammaResetButton_clicked()
+{
+  this->SetGamma(1.0);
+}
+
 } // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui
index be9da91..09afa39 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui
@@ -158,6 +158,17 @@
         </property>
        </widget>
       </item>
+      <item>
+       <widget class="QToolButton" name="gammaResetButton">
+        <property name="toolTip">
+         <string>Reset value to 1.</string>
+        </property>
+        <property name="icon">
+         <iconset resource="mvdIcons.qrc">
+          <normaloff>:/Utilities/Data/Icons/view-refresh.png</normaloff>:/Utilities/Data/Icons/view-refresh.png</iconset>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
@@ -307,7 +318,9 @@
   <tabstop>noDataLineEdit</tabstop>
   <tabstop>noDataButton</tabstop>
  </tabstops>
- <resources/>
+ <resources>
+  <include location="mvdIcons.qrc"/>
+ </resources>
  <connections>
   <connection>
    <sender>noDataCheckBox</sender>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui
index 2bed58e..662283b 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="sizePolicy">
-   <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+   <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
     <horstretch>0</horstretch>
     <verstretch>0</verstretch>
    </sizepolicy>
@@ -47,10 +47,13 @@
    </item>
    <item row="0" column="0">
     <layout class="QGridLayout" name="gridLayout">
+     <property name="margin">
+      <number>9</number>
+     </property>
      <property name="spacing">
       <number>3</number>
      </property>
-     <item row="4" column="0">
+     <item row="3" column="0">
       <layout class="QHBoxLayout" name="wHorizontalLayout">
        <property name="spacing">
         <number>1</number>
@@ -95,7 +98,7 @@
        </item>
       </layout>
      </item>
-     <item row="4" column="1">
+     <item row="3" column="1">
       <widget class="QComboBox" name="wComboBox">
        <property name="enabled">
         <bool>false</bool>
@@ -123,23 +126,7 @@
        </item>
       </widget>
      </item>
-     <item row="0" column="1">
-      <widget class="QLabel" name="fileComponentLabel">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string><html><head/><body><p align="center">Image bands<br/>↓</p></body></html></string>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="0">
+     <item row="0" column="0">
       <layout class="QHBoxLayout" name="rHorizontalLayout">
        <property name="spacing">
         <number>1</number>
@@ -178,7 +165,7 @@
        </item>
       </layout>
      </item>
-     <item row="1" column="1">
+     <item row="0" column="1">
       <widget class="QComboBox" name="rComboBox">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
@@ -203,7 +190,7 @@
        </item>
       </widget>
      </item>
-     <item row="2" column="0">
+     <item row="1" column="0">
       <layout class="QHBoxLayout" name="gHorizontalLayout">
        <property name="spacing">
         <number>1</number>
@@ -242,7 +229,7 @@
        </item>
       </layout>
      </item>
-     <item row="2" column="1">
+     <item row="1" column="1">
       <widget class="QComboBox" name="gComboBox">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
@@ -267,7 +254,7 @@
        </item>
       </widget>
      </item>
-     <item row="3" column="0">
+     <item row="2" column="0">
       <layout class="QHBoxLayout" name="bHorizontalLayout">
        <property name="spacing">
         <number>1</number>
@@ -306,7 +293,7 @@
        </item>
       </layout>
      </item>
-     <item row="3" column="1">
+     <item row="2" column="1">
       <widget class="QComboBox" name="bComboBox">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
@@ -331,7 +318,7 @@
        </item>
       </widget>
      </item>
-     <item row="4" column="2">
+     <item row="3" column="2">
       <widget class="QCheckBox" name="wCheckBox">
        <property name="toolTip">
         <string>Enable/disable gray-scale mode.</string>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui
index b66d978..0ca487f 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui
+++ b/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui
@@ -100,7 +100,7 @@
      <property name="minimumSize">
       <size>
        <width>200</width>
-       <height>100</height>
+       <height>60</height>
       </size>
      </property>
      <property name="toolTip">
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx b/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx
index 3aad408..499e6a8 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx
@@ -181,14 +181,23 @@ I18nMainWindow
 ::BuildGDALOverviews( const QStringList & filenames )
 {
   ImportImagesDialog * importDialog = new ImportImagesDialog( filenames, this );
+  // The import dialog should be deleted before leaving this function
 
   if( importDialog->GetEffectiveCount()<1 )
+    {
+    delete importDialog;
+    importDialog = NULL;
     return true;
+    }
 
   int result = importDialog->exec();
 
   if( result== QDialog::Rejected )
+    {
+    delete importDialog;
+    importDialog = NULL;
     return false;
+    }
 
   if( result==QDialog::Accepted )
     {
@@ -205,6 +214,11 @@ I18nMainWindow
     Import( builder );
     }
 
+  if (importDialog)
+    {
+    delete importDialog;
+    importDialog = NULL;
+    }
   return true;
 }
 
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc b/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc
index 835ed71..71dcbd6 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc
+++ b/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc
@@ -3,5 +3,7 @@
     <file>../../../../Utilities/Data/Icons/execute.png</file>
     <file>../../../../Utilities/Data/Icons/locked.png</file>
     <file>../../../../Utilities/Data/Icons/unlocked.png</file>
+    <file>../../../../Utilities/Data/Icons/view-refresh.png</file>
+    <file>../../../../Utilities/Data/Icons/edit-clear.png</file>
   </qresource>
 </RCC>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx
index fa1d936..cc3cbf7 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx
@@ -789,6 +789,65 @@ ImageViewRenderer
 		shader->SetVerticalSlider( true );
 		break;
 
+        case EFFECT_LUT_JET:
+          shader->SetShaderType(otb::SHADER_LUT_JET);
+          break;
+          
+        case EFFECT_LUT_LOCAL_JET:
+          shader->SetShaderType(otb::SHADER_LUT_LOCAL_JET);
+          shader->SetRadius( settings.GetSize() );
+          shader->SetLocalContrastRange(settings.GetValue());
+          
+          break;
+          
+        case EFFECT_LUT_HOT:
+          shader->SetShaderType(otb::SHADER_LUT_HOT);
+          break;
+          
+        case EFFECT_LUT_LOCAL_HOT:
+          shader->SetShaderType(otb::SHADER_LUT_LOCAL_HOT);
+          shader->SetRadius( settings.GetSize() );
+          shader->SetLocalContrastRange(settings.GetValue());
+
+          break;
+
+        case EFFECT_LUT_SUMMER:
+          shader->SetShaderType(otb::SHADER_LUT_SUMMER);
+          break;
+          
+        case EFFECT_LUT_LOCAL_SUMMER:
+          shader->SetShaderType(otb::SHADER_LUT_LOCAL_SUMMER);
+          shader->SetRadius( settings.GetSize() );
+          shader->SetLocalContrastRange(settings.GetValue());
+
+          break;
+          
+        case EFFECT_LUT_WINTER:
+          shader->SetShaderType(otb::SHADER_LUT_WINTER);
+          break;
+          
+        case EFFECT_LUT_LOCAL_WINTER:
+          shader->SetShaderType(otb::SHADER_LUT_LOCAL_WINTER);
+          shader->SetRadius( settings.GetSize() );
+          shader->SetLocalContrastRange(settings.GetValue());
+
+          break;
+
+                  case EFFECT_LUT_COOL:
+          shader->SetShaderType(otb::SHADER_LUT_COOL);
+          break;
+          
+        case EFFECT_LUT_LOCAL_COOL:
+          shader->SetShaderType(otb::SHADER_LUT_LOCAL_COOL);
+          shader->SetRadius( settings.GetSize() );
+          shader->SetLocalContrastRange(settings.GetValue());
+
+          break;
+
+
+
+
+          
 	      default:
 		assert( false && "Unhandled mvd::Effect value!" );
 		break;
@@ -808,6 +867,34 @@ ImageViewRenderer
   m_GlView->SetRenderingOrder( stackedLayerModel->GetKeys(), false );
 }
 
+
+/*******************************************************************************/
+void
+ImageViewRenderer
+::virtual_ClearScene( bool keepViewport )
+{
+  // qDebug() << this << "::virtual_ClearScene()";
+
+  // Remove all actors.
+  m_GlView->ClearActors();
+
+  // Clear reference actor.
+  m_ReferencePair.second = otb::GlActor::Pointer();
+
+  // Nothing more if keep viewport is enabled.
+  if( keepViewport )
+    return;
+
+  // Clear reference layer.
+  m_ReferencePair.first = NULL;
+
+  //
+  // MANTIS-1244: image-view not reset when layer-stack is cleared.
+  // {
+  emit ResetViewport();
+  // }
+}
+
 /*******************************************************************************/
 void
 ImageViewRenderer
@@ -826,30 +913,23 @@ ImageViewRenderer
 
 
   if( stackedLayerModel==NULL || stackedLayerModel->IsEmpty() )
-    {
-    m_GlView->ClearActors();
+    ClearScene();
 
-    //
-    // MANTIS-1244: image-view not reset when layer-stack is cleared.
-    // {
-    emit ResetViewport();
-    // }
-    }
   else
     {
       {
       otb::GlView::StringVectorType keys( m_GlView->GetActorsKeys() );
 
       for( otb::GlView::StringVectorType::const_iterator it( keys.begin() );
-           it!=keys.end();
-           ++it )
-        if( !stackedLayerModel->Contains( *it ) )
-          {
-          // qDebug()
+	   it!=keys.end();
+	   ++it )
+	if( !stackedLayerModel->Contains( *it ) )
+	  {
+	  // qDebug()
 	  //   << QString( "Removing image-actor '%1'..." ).arg( it->c_str() );
 
-          m_GlView->RemoveActor( *it );
-          }
+	  m_GlView->RemoveActor( *it );
+	  }
       }
 
 
@@ -904,8 +984,6 @@ ImageViewRenderer
 
           m_GlView->AddActor( glImageActor, it->first );
 
-          // glImageActor->SetVisible( vectorImageModel->IsVisible() );
-
           // qDebug() <<
 	  //   QString( "Added image-actor '%1' from file '%2'" )
 	  //   .arg( FromStdString( it->first ) )
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx
index 6acda52..1afaf36 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx
@@ -335,8 +335,10 @@ ImageViewWidget
 ::Initialize( AbstractImageViewManipulator* manipulator,
 	      AbstractImageViewRenderer* renderer )
 {
+#if OTB_DEBUG
   // Test OpenGL.
   ListGlVersions();
+#endif
 
   // Accept drops
   setAcceptDrops( true );
@@ -1371,6 +1373,28 @@ ImageViewWidget
     }
 }
 
+void ImageViewWidget
+::OnResetEffectsRequested()
+{
+    StackedLayerModel * layerStack = m_Renderer->GetLayerStack();
+
+    for( StackedLayerModel::ConstIterator it( layerStack->Begin() );
+         it!=layerStack->End();
+         ++it )
+    {
+        if( it->second->inherits( VectorImageModel::staticMetaObject.className() ) )
+        {
+            VectorImageModel * imageModel =
+                qobject_cast< VectorImageModel * >( it->second );
+
+            VectorImageSettings & settings = imageModel->GetSettings();
+            settings.SetEffect( EFFECT_NORMAL );
+        }
+    }
+
+  emit ModelUpdated();
+}
+
 /******************************************************************************/
 void
 ImageViewWidget
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx
index 73b848b..76614c9 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx
@@ -222,28 +222,39 @@ ImportImagesDialog
 	      I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_SIZE
 	    )
 	  );
-
-	  count =
-	    builder->CountResolutions(
-	      2,
-	      value.isValid()
-	      ? value.toInt()
-	      : OVERVIEWS_SIZE_DEFAULT
-	    );
+    unsigned int threshold =
+      value.isValid() ? value.toInt() : OVERVIEWS_SIZE_DEFAULT;
+
+    otb::GDALOverviewsBuilder::SizeVector ovrSizes;
+    builder->SetResolutionFactor(2);
+    // Count all resolution with minimum size 1 (the high requested count is
+    // clamped by the builder)
+    builder->ListResolutions(ovrSizes, 2, 9999);
+    // Count the number of levels with a least 1 size larger than the default size
+    for (unsigned int k=0 ; k<ovrSizes.size() ; k++)
+      {
+      if (std::max(ovrSizes[k][0],ovrSizes[k][1]) >= threshold)
+        count++;
+      else
+        break;
+      }
 	}
 
 	if( builder->GetOverviewsCount()>0 )
 	  builder->SetBypassEnabled( true );
-	else
+	else if (count>1)
 	  {
 	  flags |= Qt::ItemIsEnabled;
 
-	  builder->SetBypassEnabled( count<=1 );
+	  builder->SetBypassEnabled( false );
 
 	  ++ m_EffectiveCount;
 	  }
+  else
+    {
+    builder->SetBypassEnabled(true);
+    }
 
-	builder->SetResolutionFactor( 2 );
 	builder->SetNbResolutions( count );
 	builder->SetResamplingMethod( otb::GDAL_RESAMPLING_AVERAGE );
 	builder->SetCompressionMethod( otb::GDAL_COMPRESSION_NONE );
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx
index f5fe472..be683a5 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx
@@ -220,6 +220,14 @@ LayerStackController
     this,
     SIGNAL( ApplyAllRequested() )
   );
+
+  QObject::connect(
+    widget,
+    SIGNAL( ResetEffectsButtonClicked() ),
+    // to:
+    this,
+    SIGNAL( ResetEffectsRequested() )
+  );
 }
 
 /*******************************************************************************/
@@ -351,6 +359,14 @@ LayerStackController
     this,
     SIGNAL( ApplyAllRequested() )
   );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( ResetEffectsButtonClicked() ),
+    // to:
+    this,
+    SIGNAL( ResetEffectsRequested() )
+  );
 }
 
 /*******************************************************************************/
@@ -389,6 +405,8 @@ LayerStackController
   widget->SetMoveEnabled( model->GetCount()>1 );
 
   widget->SetApplyEnabled( model->GetCount()>1 );
+
+  widget->SetResetEffectsEnabled( !model->IsEmpty() );
 }
 
 /*******************************************************************************/
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx
index 83a0805..fd62671 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx
@@ -67,8 +67,8 @@ HEADERS[ LayerStackItemModel::COLUMN_COUNT ] =
   QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Res" ),
   QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Name" ),
   QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Effect" ),
-  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "I" ),
-  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "J" ),
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Column" ),
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Line" ),
   QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Red" ),
   QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Green" ),
   QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Blue" ),
@@ -683,7 +683,8 @@ LayerStackItemModel
   // qDebug()
   //   << this << "::index(" << row << "," << column << "," << parent << ")";
 
-  assert( m_StackedLayerModel!=NULL );
+  if (m_StackedLayerModel == NULL)
+    return QModelIndex();
 
   // qDebug()
   //   << "index:" << row << "," << column << "," << m_StackedLayerModel->At( row );
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx
index c52a9fe..4e1e163 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx
@@ -166,6 +166,14 @@ LayerStackWidget
     this,
     SIGNAL( ApplyButtonClicked() )
   );
+
+  QObject::connect(
+    m_UI->resetEffectsButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( ResetEffectsButtonClicked() )
+  );
 }
 
 /*******************************************************************************/
@@ -404,6 +412,18 @@ LayerStackWidget
 }
 
 /*******************************************************************************/
+void
+LayerStackWidget
+::SetResetEffectsEnabled( bool enabled )
+{
+  assert( m_UI!=NULL );
+
+  assert( m_UI->reloadButton!=NULL );
+
+  m_UI->resetEffectsButton->setEnabled( enabled );
+}
+
+/*******************************************************************************/
 /* SLOTS                                                                       */
 /*******************************************************************************/
 void
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui
index 3e76944..96f5c15 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui
@@ -56,7 +56,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_LayerTop_Icon</normaloff>:/icons/action_LayerTop_Icon</iconset>
        </property>
       </widget>
@@ -73,7 +73,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_LayerUp_Icon</normaloff>:/icons/action_LayerUp_Icon</iconset>
        </property>
       </widget>
@@ -90,7 +90,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_LayerDown_Icon</normaloff>:/icons/action_LayerDown_Icon</iconset>
        </property>
       </widget>
@@ -107,7 +107,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_LayerBottom_Icon</normaloff>:/icons/action_LayerBottom_Icon</iconset>
        </property>
       </widget>
@@ -124,7 +124,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_LayerProjection_Icon</normaloff>:/icons/action_LayerProjection_Icon</iconset>
        </property>
       </widget>
@@ -141,7 +141,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_ApplyAll_Icon</normaloff>:/icons/action_ApplyAll_Icon</iconset>
        </property>
       </widget>
@@ -158,7 +158,7 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_Reload_Icon</normaloff>:/icons/action_Reload_Icon</iconset>
        </property>
       </widget>
@@ -180,19 +180,16 @@
       </spacer>
      </item>
      <item>
-      <widget class="QToolButton" name="deleteAllButton">
+      <widget class="QToolButton" name="resetEffectsButton">
        <property name="toolTip">
-        <string>Delete all layers</string>
-       </property>
-       <property name="locale">
-        <locale language="C" country="AnyCountry"/>
+        <string>Reset all layer effects to Normal</string>
        </property>
        <property name="text">
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
-         <normaloff>:/icons/action_LayerDeleteAll_Icon</normaloff>:/icons/action_LayerDeleteAll_Icon</iconset>
+        <iconset resource="mvdIcons.qrc">
+         <normaloff>:/Utilities/Data/Icons/edit-clear.png</normaloff>:/Utilities/Data/Icons/edit-clear.png</iconset>
        </property>
       </widget>
      </item>
@@ -208,17 +205,35 @@
         <string/>
        </property>
        <property name="icon">
-        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+        <iconset>
          <normaloff>:/icons/action_LayerDelete_Icon</normaloff>:/icons/action_LayerDelete_Icon</iconset>
        </property>
       </widget>
      </item>
+     <item>
+      <widget class="QToolButton" name="deleteAllButton">
+       <property name="toolTip">
+        <string>Delete all layers</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset>
+         <normaloff>:/icons/action_LayerDeleteAll_Icon</normaloff>:/icons/action_LayerDeleteAll_Icon</iconset>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
   </layout>
  </widget>
  <resources>
   <include location="../../Application/Monteverdi/mvdMainWindow.qrc"/>
+  <include location="mvdIcons.qrc"/>
  </resources>
  <connections/>
 </ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx
index f7bfd13..706c667 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx
@@ -40,8 +40,8 @@
 //
 // Monteverdi includes (sorted by alphabetic order)
 #include "mvdAlgorithm.h"
-#include "mvdImageSettings.h"
 #include "mvdGui.h"
+#include "mvdVectorImageSettings.h"
 
 namespace mvd
 {
@@ -118,17 +118,23 @@ void
 ShaderWidget
 ::SetGLSL140Enabled( bool isGLSLEnabled )
 {
+  SetEffectVisible(EFFECT_GRADIENT,isGLSLEnabled);
+}
+
+void ShaderWidget
+::SetEffectVisible(const Effect & effect, bool visible)
+{
   assert( qApp!=NULL );
 
   int index =
     m_UI->effectComboBox->findText(
-      qApp->translate( "mvd", EFFECT_NAMES[ EFFECT_GRADIENT ] )
+      qApp->translate( "mvd", EFFECT_NAMES[ effect ] )
     );
 
-  if( isGLSLEnabled )
+  if( visible )
     {
     if( index<0 )
-      m_UI->effectComboBox->addItem( tr( "mvd", EFFECT_NAMES[ EFFECT_GRADIENT ] ) );
+      m_UI->effectComboBox->addItem( qApp->translate( "mvd", EFFECT_NAMES[ effect ] ) );
     }
   else if( index>=0 )
     m_UI->effectComboBox->removeItem( index );
@@ -185,6 +191,14 @@ ShaderWidget
     );
     m_UI->valueLineEdit->setCursorPosition( 0 );
     }
+
+  VectorImageSettings * vis = dynamic_cast<VectorImageSettings*>(settings);
+
+  if(vis!=NULL)
+    {
+    GrayscaleActivated(vis->IsGrayscaleActivated());
+    }
+  
 }
 
 /*******************************************************************************/
@@ -275,4 +289,21 @@ ShaderWidget
   emit SettingsChanged();
 }
 
+
+void ShaderWidget
+::GrayscaleActivated(bool status)
+{  
+  SetEffectVisible(EFFECT_LUT_JET,status);
+  SetEffectVisible(EFFECT_LUT_LOCAL_JET,status);
+  SetEffectVisible(EFFECT_LUT_HOT,status);
+  SetEffectVisible(EFFECT_LUT_LOCAL_HOT,status);
+  SetEffectVisible(EFFECT_LUT_WINTER,status);
+  SetEffectVisible(EFFECT_LUT_LOCAL_WINTER,status);
+  SetEffectVisible(EFFECT_LUT_SUMMER,status);
+  SetEffectVisible(EFFECT_LUT_LOCAL_SUMMER,status);
+  SetEffectVisible(EFFECT_LUT_COOL,status);
+  SetEffectVisible(EFFECT_LUT_LOCAL_COOL,status);
+  SetEffectVisible(EFFECT_SPECTRAL_ANGLE,!status);
+}
+
 } // end namespace 'mvd'
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
index 3b97b24..90d0a22 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
@@ -24,6 +24,7 @@
 #include "otbWrapperParameterGroup.h"
 
 #include "itkLogger.h"
+#include "itkTimeProbe.h"
 #include "otbWrapperMacros.h"
 #include "otbWrapperInputImageParameter.h"
 #include "otbWrapperInputImageListParameter.h"
@@ -124,9 +125,9 @@ public:
   ParameterGroup* GetParameterList();
 
   /* Get the internal application parameter specified
-   *
+   * if the follow flag is on, the function returns the target of proxy parameters
    * WARNING: this method may disappear from the API */
-  Parameter* GetParameterByKey(std::string parameter);
+  Parameter* GetParameterByKey(std::string parameter, bool follow=true);
 
   /* Get the internal application parameter specified
    *
@@ -171,10 +172,6 @@ public:
    * or a value set externally by user */
   bool HasValue(std::string paramKey) const;
 
-  /* Activate or deactivate the bool parameter
-   */
-  void SetParameterEmpty(std::string paramKey, bool active);
-
   /* Get active flag of parameter with key paramKey
    */
   bool GetParameterEmpty(std::string paramKey);
@@ -203,13 +200,6 @@ public:
    */
   /* Set the Parameter value and Update the UserFlag. used by xml parameter
    */
-  void SetParameterInt(std::string parameter, int value, bool hasUserValueFlag);
-  void SetParameterFloat(std::string parameter, float value, bool hasUserValueFlag);
-  void SetParameterString(std::string parameter, std::string value, bool hasUserValueFlag);
-  void SetParameterStringList(std::string parameter, std::vector<std::string> values, bool hasUserValueFlag);
-  void SetParameterEmpty(std::string parameter, bool value, bool hasUserValueFlag);
-
-  bool IsApplicationReady();
 
   /* Set an integer value
    *
@@ -219,14 +209,48 @@ public:
    * \li ParameterType_Radius
    * \li ParameterType_Choice
    */
-  void SetParameterInt(std::string parameter, int value);
+  void SetParameterInt(std::string parameter, int value, bool hasUserValueFlag = true);
 
   /* Set a floating value
    *
    * Can be called for types :
    * \li ParameterType_Float
    */
-  void SetParameterFloat(std::string parameter, float value);
+  void SetParameterFloat(std::string parameter, float value, bool hasUserValueFlag = true);
+
+  /* Set a string value
+   *
+   * Can be called for types :
+   * \li ParameterType_InputImageListParameter
+   * \li ParameterType_InputVectorDataListParameter
+   * \li ParameterType_InputFilenameListParameter
+   * \li ParameterType_StringList
+   */
+  void SetParameterString(std::string parameter, std::string value, bool hasUserValueFlag = true);
+
+  /* Set a string value
+   *
+   * Can be called for types :
+   * \li ParameterType_String
+   * \li ParameterType_InputFilename
+   * \li ParameterType_OutputFilename
+   * \li ParameterType_Directory
+   * \li ParameterType_Choice
+   * \li ParameterType_Float
+   * \li ParameterType_Int
+   * \li ParameterType_Radius
+   * \li ParameterType_InputImageParameter
+   * \li ParameterType_InputComplexImageParameter
+   * \li ParameterType_InputVectorDataParameter
+   * \li ParameterType_OutputImageParameter
+   * \li ParameterType_OutputVectorDataParameter
+   */
+  void SetParameterStringList(std::string parameter, std::vector<std::string> values, bool hasUserValueFlag = true);
+
+  void SetParameterEmpty(std::string parameter, bool value, bool hasUserValueFlag = true);
+
+  bool IsApplicationReady();
+
 
   /* Set an default integer value, must used in the
    * DoInit when setting a value by default
@@ -299,34 +323,15 @@ public:
    */
   void SetMaximumParameterFloatValue(std::string parameter, float value);
 
-  /* Set a string value
-   *
-   * Can be called for types :
-   * \li ParameterType_String
-   * \li ParameterType_InputFilename
-   * \li ParameterType_OutputFilename
-   * \li ParameterType_Directory
-   * \li ParameterType_Choice
-   * \li ParameterType_Float
-   * \li ParameterType_Int
-   * \li ParameterType_Radius
-   * \li ParameterType_InputImageParameter
-   * \li ParameterType_InputComplexImageParameter
-   * \li ParameterType_InputVectorDataParameter
-   * \li ParameterType_OutputImageParameter
-   * \li ParameterType_OutputVectorDataParameter
-   */
-  void SetParameterString(std::string parameter, std::string value);
 
-  /* Set a string value
-   *
-   * Can be called for types :
-   * \li ParameterType_InputImageListParameter
-   * \li ParameterType_InputVectorDataListParameter
-   * \li ParameterType_InputFilenameListParameter
-   * \li ParameterType_StringList
+  /**
+   * Enable single selection mode for list view if status in true
+   * (default is false).
+   * 
+   * Can be called for types:
+   * \li ParameterType_ListView
    */
-  void SetParameterStringList(std::string parameter, std::vector<std::string> value);
+  void SetListViewSingleSelectionMode(std::string parameter, bool status);
 
   /* Set an output image value
    *
@@ -472,6 +477,34 @@ public:
    */ 
   void SetNthParameterInputImageList(std::string parameter, const unsigned int &id, InputImageListParameter::ImageBaseType * img);
 
+/**
+   * Add a value to a parameter list as a string
+   *
+   * Can be called for parameter types:
+   * \li ParameterType_InputImageList
+   * 
+   * \in parameter The parameter key
+   * \in str The string
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageList parameter
+   */ 
+  void AddParameterStringList(std::string parameter, const std::string & str);
+
+  /**
+   * Set the nth value of a parameter list as a string.
+   *
+   * Can be called for parameter types:
+   * \li ParameterType_InputImageList
+   *  
+   * \in parameter The parameter key
+   * \in id Position at which to set the ImageBase pointer
+   * \in str The string
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageList parameter or if id is out of bounds
+   */ 
+  void SetNthParameterStringList(std::string parameter, const unsigned int &id, const std::string& str);
+  
+
   /**
    * Clear all images from an InputImageList parameter.
    *
@@ -737,6 +770,8 @@ public:
      m_IsInXMLParsed = false;
    }
 
+  double GetLastExecutionTiming() const;
+
 protected:
   /** Constructor */
   Application();
@@ -898,6 +933,9 @@ private:
   /** Tags that define the application (ex : segmentation, OBIA).*/
   std::vector<std::string> m_DocTags;
 
+  /** Chrono to measure execution time */
+  itk::TimeProbe m_Chrono;
+
   //rashad:: controls adding of -xml parameter. set to true by default
   bool                              m_HaveInXML;
   bool                              m_HaveOutXML;
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperCompositeApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperCompositeApplication.h
new file mode 100644
index 0000000..7c7bfa3
--- /dev/null
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperCompositeApplication.h
@@ -0,0 +1,158 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the above copyright notices for more information.
+
+  =========================================================================*/
+#ifndef otbWrapperCompositeApplication_h
+#define otbWrapperCompositeApplication_h
+
+#include "otbWrapperApplication.h"
+#include "itkStdStreamLogOutput.h"
+
+namespace otb
+{
+namespace Wrapper
+{
+
+/** \class CompositeApplication
+ *  \brief This class is a base class for composite applications
+ *
+ * This class allows to create & store internal applications with the same logic
+ * as parameters. You choose the application type to create, you choose an
+ * identifier (alphanumeric string), and you can give a short description.
+ * Later, you will refer to this application using the identifier. In the
+ * functions of this class, you can refer to parameters from internal
+ * applications by using their identifier as prefix. For instance, "app1.in"
+ * will refer to parameter "in" from internal application named "app1"
+ * (if such application exists, if not it will refer to a parameter of this
+ * composite application).
+ *
+ * \ingroup OTBApplicationEngine
+ */
+class OTBApplicationEngine_EXPORT CompositeApplication: public Application
+{
+public:
+  /** Standard class typedefs. */
+  typedef CompositeApplication          Self;
+  typedef Application                   Superclass;
+  typedef itk::SmartPointer<Self>       Pointer;
+  typedef itk::SmartPointer<const Self> ConstPointer;
+
+  /** RTTI support */
+  itkTypeMacro(CompositeApplication, Application);
+
+  /** Filters typedef */
+  typedef itk::MemberCommand< Self >        AddProcessCommandType;
+
+  typedef struct
+    {
+    Application::Pointer App;
+    std::string Desc;
+    } InternalApplication;
+
+  typedef std::map<std::string, InternalApplication> InternalAppContainer;
+
+protected:
+  /** Constructor */
+  CompositeApplication();
+
+  /** Destructor */
+  ~CompositeApplication() ITK_OVERRIDE;
+
+  /**
+   * Callback function to retrieve the process watchers on internal filters
+   */
+  void LinkWatchers(itk::Object * itkNotUsed(caller), const itk::EventObject & event);
+
+  /**
+   * Method to instanciate and register a new internal application
+   * \param appType Type of the application to instanciate
+   * \param key Identifier associated to the created application
+   * \param desc Description of the internal application
+   */
+  bool AddApplication(std::string appType, std::string key, std::string desc);
+
+  /**
+   * Method to remove all internal applications. Application deriving from
+   * CompositeApplication should call this method at the beginning of their
+   * DoInit().
+   */
+  void ClearApplications();
+
+  /**
+   * Connect two existing parameters together. The first parameter will point to
+   * the second parameter.
+   */
+  bool Connect(std::string fromKey, std::string toKey);
+
+  /**
+   * Share a parameter between the composite application and an internal application
+   * The local parameter is created as a proxy to the internal parameter.
+   * \param localKey New parameter key in the composite application
+   * \param internalKey Key to the internal parameter to expose
+   * \param name Name for the local parameter, if empty the target's name is used
+   * \param desc Description for the local parameter, if empty the target's description is used
+   */
+  bool ShareParameter(std::string localKey,
+                      std::string internalKey,
+                      std::string name = std::string(),
+                      std::string desc = std::string());
+
+  /**
+   * Decode a key to extract potential prefix for internal applications
+   * If a valid prefix (corresponding to an internal app) is found:
+   *   - prefix is removed from the input key which is altered.
+   *   - the function returns a pointer to the internal application
+   * If no valid prefix is found, the input key is not modified, and the
+   * function returns 'this'.
+   */
+  Application* DecodeKey(std::string &key);
+
+  /**
+   * Get the internal application with the given identifier
+   */
+  Application* GetInternalApplication(std::string id);
+
+  /**
+   * Get the description of an internal application
+   */
+  std::string GetInternalAppDescription(std::string id);
+
+  /**
+   * Utility function to call Execute() on an internal app and get its output logs
+   */
+  void ExecuteInternal(std::string key);
+
+  /**
+   * Utility function to call UpdateParameters() on an internal app
+   */
+  void UpdateInternalParameters(std::string key);
+
+private:
+  CompositeApplication(const CompositeApplication &); //purposely not implemented
+  void operator =(const CompositeApplication&); //purposely not implemented
+
+  InternalAppContainer m_AppContainer;
+
+  itk::StdStreamLogOutput::Pointer  m_LogOutput;
+
+  std::ostringstream m_Oss;
+
+  AddProcessCommandType::Pointer    m_AddProcessCommand;
+};
+
+}
+}
+#endif
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h
index 5423377..15f4672 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h
@@ -50,6 +50,10 @@ public:
   /** RTTI support */
   itkTypeMacro(ListViewParameter, Parameter);
 
+  itkSetMacro(SingleSelection,bool);
+  itkGetMacro(SingleSelection,bool);
+  itkBooleanMacro(SingleSelection);
+  
   /** Add a value to the choice */
   void AddChoice( std::string choicekey, std::string choiceName );
 
@@ -92,24 +96,10 @@ public:
 
   std::vector<int> GetSelectedItems()
   {
-    if( m_SelectedNames.size() != 0 )
-      {
-        this->SetSelectedItemsByNames();
-      }
-    else if( m_SelectedKeys.size() != 0 )
-      {
-        this->SetSelectedItemsByKeys();
-      }
-
     return m_SelectedItems;
   }
 
-  void SetSelectedNames(std::vector<std::string> selectedNames)
-  {
-    m_SelectedNames = selectedNames;
-    m_SelectedItems.clear();
-    m_SelectedKeys.clear();
-  }
+  void SetSelectedNames(std::vector<std::string> selectedNames);
 
   std::vector<std::string> GetSelectedNames()
     {
@@ -117,22 +107,21 @@ public:
     }
 
 
-  void SetSelectedKeys(std::vector<std::string> selectedKeys)
-  {
-    m_SelectedKeys = selectedKeys;
-    m_SelectedItems.clear();
-    m_SelectedNames.clear();
-  }
+  void SetSelectedKeys(std::vector<std::string> selectedKeys);
 
   std::vector<std::string> GetSelectedKeys()
     {
       return m_SelectedKeys;
     }
 
-  /** Set selected items using a lit of selected keys. */
-  void SetSelectedItemsByKeys();
-  /** Set selected items using a lit of selected names. */
-  void SetSelectedItemsByNames();
+  /** Set selected items using a lit of selected keys.
+   *  OBSOLETE : this method is not needed anymore and does nothing. */
+  void SetSelectedItemsByKeys(){}
+
+  /** Set selected items using a lit of selected names.
+   *  OBSOLETE : this method is not needed anymore and does nothing. */
+  void SetSelectedItemsByNames(){}
+
   void SetSelectedItems(std::vector<std::string> selectedItems)
   {
     std::vector<int> items;
@@ -140,14 +129,22 @@ public:
       {
         items.push_back( atoi( selectedItems[i].c_str() ) );
       }
-    m_SelectedItems = items;
-    m_SelectedNames.clear();
-    m_SelectedKeys.clear();
+    this->SetSelectedItems(items);
   }
 
   void SetSelectedItems(std::vector<int> selectedItems)
   {
     m_SelectedItems = selectedItems;
+    m_SelectedNames.clear();
+    m_SelectedKeys.clear();
+    // update selected names and keys
+    std::vector<std::string> names = this->GetChoiceNames();
+    std::vector<std::string> keys = this->GetChoiceKeys();
+    for (unsigned int i=0 ; i<m_SelectedItems.size() ; i++)
+      {
+      m_SelectedNames.push_back(names[m_SelectedItems[i]]);
+      m_SelectedKeys.push_back(keys[m_SelectedItems[i]]);
+      }
   }
 
 protected:
@@ -171,6 +168,7 @@ protected:
   std::vector<int>                    m_SelectedItems;
   std::vector<std::string>            m_SelectedKeys;
   std::vector<std::string>            m_SelectedNames;
+  bool                                m_SingleSelection;
 
 private:
   ListViewParameter(const ListViewParameter &); //purposely not implemented
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
index 25eedeb..b4a8102 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
@@ -104,6 +104,8 @@ public:
 
   void InitializeWriters();
 
+  std::string CheckFileName(bool fixMissingExtension = false);
+
 protected:
   /** Constructor */
   OutputImageParameter();
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
index 73fec05..526e227 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
@@ -67,6 +67,8 @@ public:
 
   void Write(Application::Pointer application);
 
+  TiXmlElement* ParseApplication(Application::Pointer app);
+
 protected:
 
   OutputProcessXMLParameter();
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h
index fb395b4..5aea541 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h
@@ -47,6 +47,10 @@ public:
 
   void AddParameter(Parameter::Pointer p);
 
+  /** Method to substitute a parameter in a group. 
+   *  The function returns true on success, false on failure */
+  bool ReplaceParameter(std::string &key, Parameter::Pointer p);
+
   /** Add a new choice value to an existing choice parameter */
   void AddChoice(std::string paramKey, std::string paramName);
 
@@ -61,9 +65,9 @@ public:
    * or the path to a choice value */
   void AddParameter(ParameterType type, std::string paramKey, std::string paramName);
 
-  Parameter::Pointer GetParameterByIndex(unsigned int i);
+  Parameter::Pointer GetParameterByIndex(unsigned int i, bool follow=true);
 
-  Parameter::Pointer GetParameterByKey(std::string name);
+  Parameter::Pointer GetParameterByKey(std::string name, bool follow=true);
 
   /** rashad: Add xml parameters eg: -inxml -outxml */
   void AddInXMLParameter();
@@ -93,6 +97,10 @@ public:
     return true;
   }
 
+  /** Resolve potential proxy parameters by following their targets until
+   *  a non-proxy parameter. It will detect cycles and report an error */
+  static Parameter* ResolveParameter(Parameter *param);
+
 protected:
   ParameterGroup();
   ~ParameterGroup() ITK_OVERRIDE;
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h
index 9237eac..3dac6f3 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h
@@ -103,7 +103,9 @@ last() : return "tata"
         }
       else
         {
-          itkGenericExceptionMacro( "Invalid key "<<val<<". Must be in lowercase, containing alphanumerical characters or \".\"");
+            itkGenericExceptionMacro( "Invalid key '"
+                                      << val <<
+                                      "'. Must be in lowercase, containing alphanumerical characters or \".\"");
         }
     }
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperProxyParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperProxyParameter.h
new file mode 100644
index 0000000..ea16db0
--- /dev/null
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperProxyParameter.h
@@ -0,0 +1,71 @@
+#ifndef otbWrapperProxyParameter_h
+#define otbWrapperProxyParameter_h
+
+#include "itkObject.h"
+#include "otbWrapperParameter.h"
+#include <utility>
+
+namespace otb
+{
+namespace Wrapper
+{
+/**
+ * \class ProxyParameter
+ *
+ * \brief Parameter class acting as a proxy to a different parameter
+ *
+ * The target parameter of this proxy is defined as a pair of a group parameter
+ * containing the target and the targets key. It allows to define proxies on
+ * parameters that may be themselves replaced by a proxy
+ *
+ * \ingroup OTBApplicationEngine
+ */
+class ProxyParameter : public Parameter
+{
+public:
+  typedef ProxyParameter                       Self;
+  typedef Parameter                            Superclass;
+  typedef itk::SmartPointer<Self>              Pointer;
+  typedef itk::SmartPointer<const Self>        ConstPointer;
+
+  itkNewMacro(Self);
+
+  itkTypeMacro(ProxyParameter, Parameter);
+
+  typedef std::pair<Parameter::Pointer, std::string> ProxyTargetType;
+
+  /** Set the target parameter of the proxy
+   *  \param target pair of a group parameter containing the target and its key
+   */
+  void SetTarget(const ProxyTargetType& target)
+    {
+    m_Target = target;
+    }
+
+  /** Get the target parameter of the proxy
+   *  First part is the group parameter containing the target
+   *  Second part is the key of the target */
+  const ProxyTargetType & GetTarget(void)
+    {
+    return m_Target;
+    }
+
+protected:
+  ProxyParameter() {}
+  ~ProxyParameter() ITK_OVERRIDE {}
+
+private:
+  ProxyParameter(const Self &); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+
+  ProxyTargetType m_Target;
+};
+
+}
+}
+
+//#ifndef OTB_MANUAL_INSTANTIATION
+//#include "otbWrapperProxyParameter.txx"
+//#endif
+
+#endif
diff --git a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
index 6d11c56..c33fdbc 100644
--- a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
+++ b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
@@ -27,6 +27,7 @@ set(OTBApplicationEngine_SRC
   otbWrapperChoiceParameter.cxx
   otbWrapperApplicationRegistry.cxx
   otbWrapperApplicationFactoryBase.cxx
+  otbWrapperCompositeApplication.cxx
   )
 
 add_library(OTBApplicationEngine ${OTBApplicationEngine_SRC})
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
index 0ab8e27..6a8a879 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
@@ -32,6 +32,7 @@
 #include "otbWrapperInputImageListParameter.h"
 #include "otbWrapperInputProcessXMLParameter.h"
 #include "otbWrapperRAMParameter.h"
+#include "otbWrapperProxyParameter.h"
 
 
 #include "otbWrapperAddProcessToWatchEvent.h"
@@ -97,37 +98,192 @@ ParameterGroup* Application::GetParameterList()
   return m_ParameterList;
 }
 
-Parameter* Application::GetParameterByKey(std::string name)
+Parameter* Application::GetParameterByKey(std::string name, bool follow)
 {
-  return GetParameterList()->GetParameterByKey(name);
+  return GetParameterList()->GetParameterByKey(name, follow);
 }
 
 void Application::SetParameterInt(std::string parameter, int value, bool hasUserValueFlag)
 {
-  this->SetParameterInt(parameter, value);
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<IntParameter*>(param))
+    {
+    IntParameter* paramInt = dynamic_cast<IntParameter*>(param);
+    paramInt->SetValue(value);
+    }
+  else if (dynamic_cast<FloatParameter*>(param))
+    {
+    FloatParameter* paramFloat = dynamic_cast<FloatParameter*>(param);
+    paramFloat->SetValue(static_cast<float>(value));
+    }
+  else if (dynamic_cast<RadiusParameter*>(param))
+    {
+    RadiusParameter* paramRadius = dynamic_cast<RadiusParameter*>(param);
+    paramRadius->SetValue(static_cast<unsigned int>(value));
+    }
+  else if (dynamic_cast<ChoiceParameter*>(param))
+    {
+    ChoiceParameter* paramChoice = dynamic_cast<ChoiceParameter*>(param);
+    paramChoice->SetValue(value);
+    }
+
   this->SetParameterUserValue(parameter, hasUserValueFlag);
 }
 void Application::SetParameterFloat(std::string parameter, float value, bool hasUserValueFlag)
 {
-  this->SetParameterFloat(parameter, value);
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<FloatParameter*>(param))
+    {
+    FloatParameter* paramFloat = dynamic_cast<FloatParameter*>(param);
+    paramFloat->SetValue(value);
+    }
+
   this->SetParameterUserValue(parameter, hasUserValueFlag);
 }
 
 void Application::SetParameterString(std::string parameter, std::string value, bool hasUserValueFlag)
 {
-  this->SetParameterString(parameter, value);
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<ChoiceParameter*>(param))
+    {
+    ChoiceParameter* paramDown = dynamic_cast<ChoiceParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<ListViewParameter*>(param))
+    {
+    ListViewParameter* paramDown = dynamic_cast<ListViewParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<StringParameter*>(param))
+    {
+    StringParameter* paramDown = dynamic_cast<StringParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<InputFilenameParameter*>(param))
+    {
+    InputFilenameParameter* paramDown = dynamic_cast<InputFilenameParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<OutputFilenameParameter*>(param))
+    {
+    OutputFilenameParameter* paramDown = dynamic_cast<OutputFilenameParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<DirectoryParameter*>(param))
+    {
+    DirectoryParameter* paramDown = dynamic_cast<DirectoryParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<FloatParameter*>(param))
+    {
+    FloatParameter* paramDown = dynamic_cast<FloatParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<RadiusParameter*>(param))
+    {
+    RadiusParameter* paramDown = dynamic_cast<RadiusParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<IntParameter*>(param))
+    {
+    IntParameter* paramDown = dynamic_cast<IntParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<InputImageParameter*>(param))
+    {
+    InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
+    if ( !paramDown->SetFromFileName(value) )
+    otbAppLogCRITICAL( <<"Invalid image filename " << value <<".");
+
+    }
+  else if (dynamic_cast<ComplexInputImageParameter*>(param))
+    {
+    ComplexInputImageParameter* paramDown = dynamic_cast<ComplexInputImageParameter*>(param);
+    paramDown->SetFromFileName(value);
+    }
+  else if (dynamic_cast<InputVectorDataParameter*>(param))
+    {
+    InputVectorDataParameter* paramDown = dynamic_cast<InputVectorDataParameter*>(param);
+    if ( !paramDown->SetFromFileName(value) )
+    otbAppLogCRITICAL( <<"Invalid vector data filename " << value <<".");
+    }
+  else if (dynamic_cast<OutputImageParameter*>(param))
+    {
+    OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*>(param);
+    paramDown->SetFileName(value);
+    }
+  else if (dynamic_cast<ComplexOutputImageParameter*>(param))
+    {
+    ComplexOutputImageParameter* paramDown = dynamic_cast<ComplexOutputImageParameter*>(param);
+    paramDown->SetFileName(value);
+    }
+  else if (dynamic_cast<OutputVectorDataParameter*>(param))
+    {
+    OutputVectorDataParameter* paramDown = dynamic_cast<OutputVectorDataParameter*>(param);
+    paramDown->SetFileName(value);
+    }
+  else if (dynamic_cast<RAMParameter*>(param))
+    {
+    RAMParameter* paramDown = dynamic_cast<RAMParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<OutputProcessXMLParameter*>(param))
+    {
+    OutputProcessXMLParameter* paramDown = dynamic_cast<OutputProcessXMLParameter*>(param);
+    paramDown->SetValue(value);
+    }
+  else if (dynamic_cast<InputProcessXMLParameter*>(param))
+    {
+    InputProcessXMLParameter* paramDown = dynamic_cast<InputProcessXMLParameter*>(param);
+    if ( !paramDown->SetFileName(value) )
+    otbAppLogCRITICAL( <<"Invalid XML parameter filename " << value <<".");
+    }
+
   this->SetParameterUserValue(parameter, hasUserValueFlag);
 }
 
 void Application::SetParameterStringList(std::string parameter, std::vector<std::string> values, bool hasUserValueFlag)
 {
-  this->SetParameterStringList(parameter, values);
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<InputImageListParameter*>(param))
+    {
+    InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
+    if( !paramDown->SetListFromFileName(values) )
+    otbAppLogCRITICAL( <<"At least one image filename is invalid.");
+    }
+  else if (dynamic_cast<InputVectorDataListParameter*>(param))
+    {
+    InputVectorDataListParameter* paramDown = dynamic_cast<InputVectorDataListParameter*>(param);
+    if( !paramDown->SetListFromFileName(values)  )
+    otbAppLogCRITICAL( <<"At least one vector data filename is invalid..");
+    }
+  else if (dynamic_cast<InputFilenameListParameter*>(param))
+    {
+    InputFilenameListParameter* paramDown = dynamic_cast<InputFilenameListParameter*>(param);
+    if( !paramDown->SetListFromFileName(values)  )
+    otbAppLogCRITICAL( <<"At least one filename is invalid..");
+    }
+  else if (dynamic_cast<StringListParameter*>(param))
+    {
+    StringListParameter* paramDown = dynamic_cast<StringListParameter*>(param);
+    paramDown->SetValue(values);
+    }
+  else if(dynamic_cast<ListViewParameter *>(param))
+    {
+    ListViewParameter * paramDown = dynamic_cast<ListViewParameter *>(param);
+    paramDown->SetSelectedNames(values);
+    }
+
   this->SetParameterUserValue(parameter, hasUserValueFlag);
 }
 
 void Application::SetParameterEmpty(std::string parameter, bool value, bool hasUserValueFlag)
 {
-  this->SetParameterEmpty(parameter, value);
+  GetParameterByKey(parameter)->SetActive(value);
   this->SetParameterUserValue(parameter, hasUserValueFlag);
 }
 
@@ -227,6 +383,9 @@ int Application::Execute()
 
 int Application::ExecuteAndWriteOutput()
 {
+  m_Chrono.Reset();
+  m_Chrono.Start();
+
   int status = this->Execute();
 
   if (status == 0)
@@ -269,6 +428,11 @@ int Application::ExecuteAndWriteOutput()
           if(outputParam!=ITK_NULLPTR)
             {
             outputParam->InitializeWriters();
+            std::string checkReturn = outputParam->CheckFileName(true);
+            if (!checkReturn.empty())
+              {
+              otbAppLogWARNING("Check filename : "<<checkReturn);
+              }
             if (useRAM)
               {
               outputParam->SetRAMValue(ram);
@@ -329,6 +493,7 @@ int Application::ExecuteAndWriteOutput()
 
   this->AfterExecuteAndWriteOutputs();
 
+  m_Chrono.Stop();
   return status;
 }
 
@@ -419,11 +584,6 @@ Role Application::GetParameterRole(std::string paramKey) const
   return GetParameterByKey(paramKey)->GetRole();
 }
 
-void Application::SetParameterEmpty(std::string paramKey, bool active)
-{
-  GetParameterByKey(paramKey)->SetActive(active);
-}
-
 bool Application::GetParameterEmpty(std::string paramKey)
 {
   return GetParameterByKey(paramKey)->GetActive();
@@ -578,42 +738,6 @@ std::vector<std::string> Application::GetChoiceNames(std::string name)
   itkExceptionMacro(<< name << " is not a choice parameter");
 }
 
-void Application::SetParameterInt(std::string parameter, int value)
-{
-  Parameter* param = GetParameterByKey(parameter);
-
-  if (dynamic_cast<IntParameter*>(param))
-    {
-    IntParameter* paramInt = dynamic_cast<IntParameter*>(param);
-    paramInt->SetValue(value);
-    }
-  else if (dynamic_cast<FloatParameter*>(param))
-    {
-    FloatParameter* paramFloat = dynamic_cast<FloatParameter*>(param);
-    paramFloat->SetValue(static_cast<float>(value));
-    }
-  else if (dynamic_cast<RadiusParameter*>(param))
-    {
-    RadiusParameter* paramRadius = dynamic_cast<RadiusParameter*>(param);
-    paramRadius->SetValue(static_cast<unsigned int>(value));
-    }
-  else if (dynamic_cast<ChoiceParameter*>(param))
-    {
-    ChoiceParameter* paramChoice = dynamic_cast<ChoiceParameter*>(param);
-    paramChoice->SetValue(value);
-    }
-}
-
-void Application::SetParameterFloat(std::string parameter, float value)
-{
-  Parameter* param = GetParameterByKey(parameter);
-
-  if (dynamic_cast<FloatParameter*>(param))
-    {
-    FloatParameter* paramFloat = dynamic_cast<FloatParameter*>(param);
-    paramFloat->SetValue(value);
-    }
-}
 
 void Application::SetDefaultParameterInt(std::string parameter, int value)
 {
@@ -734,140 +858,20 @@ void Application::SetMaximumParameterFloatValue(std::string parameter, float val
 
 }
 
-
-void Application::SetParameterString(std::string parameter, std::string value)
+void Application::SetListViewSingleSelectionMode(std::string parameter, bool status)
 {
   Parameter* param = GetParameterByKey(parameter);
 
-  if (dynamic_cast<ChoiceParameter*>(param))
-    {
-    ChoiceParameter* paramDown = dynamic_cast<ChoiceParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<ListViewParameter*>(param))
-    {
-    ListViewParameter* paramDown = dynamic_cast<ListViewParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<StringParameter*>(param))
-    {
-    StringParameter* paramDown = dynamic_cast<StringParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<InputFilenameParameter*>(param))
-    {
-    InputFilenameParameter* paramDown = dynamic_cast<InputFilenameParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<OutputFilenameParameter*>(param))
-    {
-    OutputFilenameParameter* paramDown = dynamic_cast<OutputFilenameParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<DirectoryParameter*>(param))
-    {
-    DirectoryParameter* paramDown = dynamic_cast<DirectoryParameter*>(param);
-    paramDown->SetValue(value);
-    }
- else if (dynamic_cast<FloatParameter*>(param))
-    {
-    FloatParameter* paramDown = dynamic_cast<FloatParameter*>(param);
-    paramDown->SetValue(value);
-    }
- else if (dynamic_cast<RadiusParameter*>(param))
-    {
-    RadiusParameter* paramDown = dynamic_cast<RadiusParameter*>(param);
-    paramDown->SetValue(value);
-    }
- else if (dynamic_cast<IntParameter*>(param))
-    {
-    IntParameter* paramDown = dynamic_cast<IntParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<InputImageParameter*>(param))
-    {
-    InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
-    if ( !paramDown->SetFromFileName(value) )
-      otbAppLogCRITICAL( <<"Invalid image filename " << value <<".");
-
-    }
-  else if (dynamic_cast<ComplexInputImageParameter*>(param))
-    {
-    ComplexInputImageParameter* paramDown = dynamic_cast<ComplexInputImageParameter*>(param);
-    paramDown->SetFromFileName(value);
-    }
-  else if (dynamic_cast<InputVectorDataParameter*>(param))
-    {
-    InputVectorDataParameter* paramDown = dynamic_cast<InputVectorDataParameter*>(param);
-    if ( !paramDown->SetFromFileName(value) )
-      otbAppLogCRITICAL( <<"Invalid vector data filename " << value <<".");
-    }
-  else if (dynamic_cast<OutputImageParameter*>(param))
-    {
-    OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*>(param);
-    paramDown->SetFileName(value);
-    }
-  else if (dynamic_cast<ComplexOutputImageParameter*>(param))
-    {
-    ComplexOutputImageParameter* paramDown = dynamic_cast<ComplexOutputImageParameter*>(param);
-    paramDown->SetFileName(value);
-    }
-  else if (dynamic_cast<OutputVectorDataParameter*>(param))
-    {
-    OutputVectorDataParameter* paramDown = dynamic_cast<OutputVectorDataParameter*>(param);
-    paramDown->SetFileName(value);
-    }
-  else if (dynamic_cast<RAMParameter*>(param))
-    {
-    RAMParameter* paramDown = dynamic_cast<RAMParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<OutputProcessXMLParameter*>(param))
-    {
-    OutputProcessXMLParameter* paramDown = dynamic_cast<OutputProcessXMLParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if (dynamic_cast<InputProcessXMLParameter*>(param))
+  if (dynamic_cast<ListViewParameter*>(param))
     {
-    InputProcessXMLParameter* paramDown = dynamic_cast<InputProcessXMLParameter*>(param);
-    if ( !paramDown->SetFileName(value) )
-      otbAppLogCRITICAL( <<"Invalid XML parameter filename " << value <<".");
+    ListViewParameter* paramListView = dynamic_cast<ListViewParameter*>(param);
+    paramListView->SetSingleSelection(status);
     }
+  else
+    itkExceptionMacro(<<parameter << "parameter can't be casted to ListView");
+  
 }
 
-void Application::SetParameterStringList(std::string parameter, std::vector<std::string> value)
-{
-  Parameter* param = GetParameterByKey(parameter);
-
-  if (dynamic_cast<InputImageListParameter*>(param))
-    {
-    InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
-    if( !paramDown->SetListFromFileName(value) )
-    otbAppLogCRITICAL( <<"At least one image filename is invalid.");
-    }
-  else if (dynamic_cast<InputVectorDataListParameter*>(param))
-     {
-     InputVectorDataListParameter* paramDown = dynamic_cast<InputVectorDataListParameter*>(param);
-     if( !paramDown->SetListFromFileName(value)  )
-       otbAppLogCRITICAL( <<"At least one vector data filename is invalid..");
-     }
-  else if (dynamic_cast<InputFilenameListParameter*>(param))
-     {
-     InputFilenameListParameter* paramDown = dynamic_cast<InputFilenameListParameter*>(param);
-     if( !paramDown->SetListFromFileName(value)  )
-       otbAppLogCRITICAL( <<"At least one filename is invalid..");
-     }
-  else if (dynamic_cast<StringListParameter*>(param))
-    {
-    StringListParameter* paramDown = dynamic_cast<StringListParameter*>(param);
-    paramDown->SetValue(value);
-    }
-  else if(dynamic_cast<ListViewParameter *>(param))
-    {
-    ListViewParameter * paramDown = dynamic_cast<ListViewParameter *>(param);
-    paramDown->SetSelectedNames(value);
-    }
-}
 
 void Application::SetParameterOutputImage(std::string parameter, FloatVectorImageType* value)
 {
@@ -927,19 +931,22 @@ void Application::SetParameterOutputVectorData(std::string parameter, VectorData
 
 std::string Application::GetParameterName(std::string parameter)
 {
-  Parameter* param = GetParameterByKey(parameter);
+  // get the actual parameter, even if it is a proxy
+  Parameter* param = GetParameterByKey(parameter,false);
   return param->GetName();
 }
 
 std::string Application::GetParameterDescription(std::string parameter)
 {
-  Parameter* param = GetParameterByKey(parameter);
+  // get the actual parameter, even if it is a proxy
+  Parameter* param = GetParameterByKey(parameter,false);
   return param->GetDescription();
 }
 
 void Application::SetParameterDescription(std::string parameter, std::string desc)
 {
-  Parameter* param = GetParameterByKey(parameter);
+  // get the actual parameter, even if it is a proxy
+  Parameter* param = GetParameterByKey(parameter,false);
   param->SetDescription(desc);
 }
 
@@ -1236,6 +1243,42 @@ void Application::SetNthParameterInputImageList(std::string parameter, const uns
 
 }
 
+void Application::AddParameterStringList(std::string parameter, const std::string & str)
+{
+  Parameter* param = GetParameterByKey(parameter);
+  
+  InputImageListParameter * paramDown = dynamic_cast<InputImageListParameter *>(param);
+  
+  if(paramDown)
+    {
+    paramDown->AddFromFileName(str);
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageListParameter");
+    }
+  
+}
+
+void Application::SetNthParameterStringList(std::string parameter, const unsigned int &id, const std::string & str)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  InputImageListParameter * paramDown = dynamic_cast<InputImageListParameter *>(param);
+
+  if(paramDown)
+    {
+    paramDown->SetNthFileName(id,str);
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageListParameter");
+    }
+
+}
+
+
+
 void Application::ClearParameterInputImageList(std::string parameter)
 {
   Parameter* param = GetParameterByKey(parameter);
@@ -1623,6 +1666,10 @@ std::string Application::GetProgressDescription() const
   return m_ProgressSourceDescription;
 }
 
+double Application::GetLastExecutionTiming() const
+{
+  return m_Chrono.GetTotal();
+}
 
 }
 }
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplicationHtmlDocGenerator.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplicationHtmlDocGenerator.cxx
index 951e12c..bb68648 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplicationHtmlDocGenerator.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplicationHtmlDocGenerator.cxx
@@ -25,7 +25,7 @@ namespace otb
 namespace Wrapper
 {
 
-#define otbDocHtmlTitleMacro( value )                                       \
+#define otbDocHtmlTitleMacro( value )                                   \
   oss << "</style></head><body style=\" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;\"><p align=\"center\" style=\" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:x-large; font-weight:600;\"><span style=\" font-size:x-large;\">"; \
   oss << value;                                                         \
   oss << "</span></p>";
@@ -40,29 +40,36 @@ namespace Wrapper
   oss << value;                                                         \
   oss << "</span></p>";
 
-#define otbDocHtmlBodyMacro( value )                                         \
+#define otbDocHtmlBodyMacro( value )                                    \
   oss << "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"; \
   oss << value;                                                         \
   oss << "</p>";
 
-#define otbDocHtmlBodyCodeMacro( value )                                         \
+#define otbDocHtmlBodyCodeMacro( value )                                \
   oss << "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New, courier';\">"; \
   oss << value;                                                         \
   oss << "</p>";
 
-#define otbDocHtmlParamMacro( type, param, showKey )                             \
+#define otbDocHtmlParamMacro( type, param, fullKey, showKey )           \
   oss << "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:'Courier New, courier'; font-weight:600;\"; >"; \
-  oss << "["<<type<<"] "<< param->GetName();                            \
-  if( showKey == true &&  !std::string(param->GetKey()).empty() )       \
+  oss << param->GetName();                                              \
+  if( showKey == true &&  param->GetKey()[0] != '\0' )       \
     {                                                                   \
-    oss << " (-"<< param->GetKey()<<")";                                \
-    }                                                                   \
+if (!fullKey.empty())                                           \
+  {                                                                   \
+  oss << " ("<< fullKey<< "." << param->GetKey() << ")";                                        \
+  }                                                                   \
+else                                                                  \
+  {                                                                   \
+  oss << " ("<< param->GetKey()<<")";                                \
+  } \
+}                                                                      \
   oss << ": </span>";                                                   \
-  if( std::string(param->GetDescription()).size()!=0 )                  \
-    {                                                                   \
-    oss << param->GetDescription();                                     \
-    }                                                                   \
-  oss << "</p>";
+if( param->GetDescription()[0] != '\0' )                  \
+  {                                                                   \
+  oss << param->GetDescription();                                     \
+  }                                                                   \
+oss << "</p>";
 
 
 ApplicationHtmlDocGenerator::ApplicationHtmlDocGenerator()
@@ -141,7 +148,7 @@ ApplicationHtmlDocGenerator::GenerateDoc( const Application::Pointer app, std::s
 
   val = oss.str();
 
-  // Replace "\n" string with <br/>
+// Replace "\n" string with <br/>
   itksys::SystemTools::ReplaceString( val, "\n", "<br/>");
 }
 
@@ -165,6 +172,7 @@ ApplicationHtmlDocGenerator::GenerateDoc(const Application::Pointer app, const s
 void ApplicationHtmlDocGenerator::GetDocParameters( const Application::Pointer app, std::string & val, const bool showKey)
 {
   std::ostringstream oss;
+  const std::string emptyString;
   const std::vector<std::string> appKeyList = app->GetParametersKeys( false );
   const unsigned int nbOfParam = appKeyList.size();
 
@@ -175,38 +183,38 @@ void ApplicationHtmlDocGenerator::GetDocParameters( const Application::Pointer a
     }
   else
     {
-   for( unsigned int i=0; i<nbOfParam; i++ )
-     {
-     const std::string key(appKeyList[i]);
-     Parameter::Pointer param =  app->GetParameterByKey( key );
-     if( app->GetParameterType(key) ==  ParameterType_Group)
-       {
-       oss << "<li>";
-       otbDocHtmlParamMacro( "group", param, showKey );
-       std::string grDoc;
-       ApplicationHtmlDocGenerator::GetDocParameterGroup( app, grDoc, key, showKey );
-       oss<<grDoc;
-       oss<<"</li><br />";
-       }
-     else if( app->GetParameterType(key) ==  ParameterType_Choice )
-       {
-       oss << "<li>";
-       otbDocHtmlParamMacro( "choice", param, showKey );
-       std::string grDoc;
-       ApplicationHtmlDocGenerator::GetDocParameterChoice(app, grDoc, key, showKey);
-       oss<<grDoc;
-       oss<<"</li><br />";
-       }
-     else
-       {
-       oss << "<li>";
-       otbDocHtmlParamMacro("param", param, showKey );
-       oss << "</li>";
-       }
-     }
+    for( unsigned int i=0; i<nbOfParam; i++ )
+      {
+      const std::string key(appKeyList[i]);
+      Parameter::Pointer param =  app->GetParameterByKey(key, false);
+      if( app->GetParameterType(key) ==  ParameterType_Group)
+        {
+        oss << "<li>";
+        otbDocHtmlParamMacro( "group", param, emptyString, showKey );
+        std::string grDoc;
+        ApplicationHtmlDocGenerator::GetDocParameterGroup( app, grDoc, key, showKey );
+        oss<<grDoc;
+        oss<<"</li><br />";
+        }
+      else if( app->GetParameterType(key) ==  ParameterType_Choice )
+        {
+        oss << "<li>";
+        otbDocHtmlParamMacro( "choice", param, emptyString, showKey );
+        std::string grDoc;
+        ApplicationHtmlDocGenerator::GetDocParameterChoice(app, grDoc, key, showKey);
+        oss<<grDoc;
+        oss<<"</li><br />";
+        }
+      else
+        {
+        oss << "<li>";
+        otbDocHtmlParamMacro("param", param, emptyString, showKey );
+        oss << "</li>";
+        }
+      }
     }
 
-   val = oss.str();
+  val = oss.str();
 }
 
 void ApplicationHtmlDocGenerator::GetDocParameterGroup( const Application::Pointer app, std::string & val, const std::string & key, const bool showKey )
@@ -220,17 +228,18 @@ void ApplicationHtmlDocGenerator::GetDocParameterGroup( const Application::Point
   ParameterGroup * group = dynamic_cast<ParameterGroup *>(paramGr);
   const std::vector<std::string> appKeyList = group->GetParametersKeys( false );
   unsigned int nbOfParam = appKeyList.size();
+  const std::string emptyString;
   std::ostringstream oss;
   oss<<"<ul>";
 
   for( unsigned int i=0; i<nbOfParam; i++ )
     {
     const std::string fullKey(std::string(key).append(".").append(appKeyList[i]));
-    Parameter::Pointer param =  app->GetParameterByKey( fullKey );
+    Parameter::Pointer param =  app->GetParameterByKey( fullKey, false);
     if( app->GetParameterType(fullKey) ==  ParameterType_Group)
       {
       oss<<"<li>";
-       otbDocHtmlParamMacro( "group", param, showKey );
+      otbDocHtmlParamMacro( "group", param, emptyString, showKey );
       std::string grDoc;
       ApplicationHtmlDocGenerator::GetDocParameterGroup( app, grDoc, fullKey, showKey );
       oss<<grDoc;
@@ -239,7 +248,7 @@ void ApplicationHtmlDocGenerator::GetDocParameterGroup( const Application::Point
     else if( app->GetParameterType(fullKey) ==  ParameterType_Choice )
       {
       oss<<"<li>";
-      otbDocHtmlParamMacro( "choice", param, showKey );
+      otbDocHtmlParamMacro( "choice", param, key, showKey );
       std::string grDoc;
       ApplicationHtmlDocGenerator::GetDocParameterChoice(app, grDoc, fullKey, showKey );
       oss<<grDoc;
@@ -248,7 +257,7 @@ void ApplicationHtmlDocGenerator::GetDocParameterGroup( const Application::Point
     else
       {
       oss << "<li>";
-      otbDocHtmlParamMacro( "param", param, showKey );
+      otbDocHtmlParamMacro( "param", param, key, showKey );
       oss <<"</li>";
       }
     }
@@ -267,6 +276,7 @@ void ApplicationHtmlDocGenerator::GetDocParameterChoice( const Application::Poin
   ChoiceParameter * choice = dynamic_cast<ChoiceParameter *>(paramCh);
   const std::vector<std::string> appKeyList = choice->GetChoiceKeys();
   unsigned int nbOfParam = choice->GetNbChoices();
+  const std::string emptyString;
   std::ostringstream oss;
   oss<<"<ul>";
 
@@ -277,7 +287,7 @@ void ApplicationHtmlDocGenerator::GetDocParameterChoice( const Application::Poin
     std::string grDoc;
 
     oss << "<li>";
-    otbDocHtmlParamMacro( "group", group, showKey );
+    otbDocHtmlParamMacro( "group", group, emptyString, showKey );
     ApplicationHtmlDocGenerator::GetDocParameterGroup( app, grDoc, fullKey, showKey );
     oss<<grDoc;
     oss<<"</li>";
@@ -287,5 +297,5 @@ void ApplicationHtmlDocGenerator::GetDocParameterChoice( const Application::Poin
 }
 
 }
-}
+  }
 
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperChoiceParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperChoiceParameter.cxx
index b07f668..e823e00 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperChoiceParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperChoiceParameter.cxx
@@ -31,7 +31,6 @@ ChoiceParameter::~ChoiceParameter()
 {
 }
 
-
 void
 ChoiceParameter::AddChoice( std::string choicekey, std::string choiceName )
 {
@@ -41,7 +40,8 @@ ChoiceParameter::AddChoice( std::string choicekey, std::string choiceName )
   choice.m_AssociatedParameter = ParameterGroup::New();
   choice.m_AssociatedParameter->SetName(choiceName);
   choice.m_AssociatedParameter->SetRoot(this);
-
+  choice.m_AssociatedParameter->SetKey(choicekey);
+  
   m_ChoiceList.push_back(choice);
 
   // check if the new choice matches the m_CurrentChoice : if so the group should be active.
@@ -117,7 +117,7 @@ ChoiceParameter::GetChoiceParameterGroupByKey( std::string choiceKey )
       }
     }
 
-  itkExceptionMacro(<< "Cannot find " << choiceKey);
+  itkExceptionMacro(<< "Cannot find choice key: '" << choiceKey  << "'");
 }
 
 unsigned int
@@ -173,7 +173,10 @@ ChoiceParameter::SetValue(std::string choiceKey)
     ++i;
     }
 
-  itkExceptionMacro(<< "Cannot find " << choiceKey);
+  itkExceptionMacro(<< "Invalid parameter value '"
+					<< choiceKey << "'"
+					<< " given for parameter '-"
+					<<  this->GetKey() << "'");
 }
 
 unsigned int
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx
index 382d87a..597f1b8 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx
@@ -210,8 +210,8 @@ ComplexOutputImageParameter::GetWriter()
   // 0 : image
   // 1 : VectorImage
 
-  if ( dynamic_cast<FloatVectorImageType*>( m_Image.GetPointer()) ||
-       dynamic_cast<DoubleVectorImageType*>(m_Image.GetPointer()))
+  if ( dynamic_cast<ComplexFloatVectorImageType*>( m_Image.GetPointer()) ||
+       dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
     {
     type = 1;
     }
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperCompositeApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperCompositeApplication.cxx
new file mode 100644
index 0000000..09f9e0f
--- /dev/null
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperCompositeApplication.cxx
@@ -0,0 +1,216 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the above copyright notices for more information.
+
+  =========================================================================*/
+
+#include "otbWrapperCompositeApplication.h"
+#include "otbWrapperProxyParameter.h"
+#include "otbWrapperApplicationRegistry.h"
+#include "otbWrapperAddProcessToWatchEvent.h"
+#include "otbWrapperParameterKey.h"
+
+namespace otb
+{
+namespace Wrapper
+{
+
+CompositeApplication::CompositeApplication()
+{
+  m_LogOutput = itk::StdStreamLogOutput::New();
+  m_LogOutput->SetStream(m_Oss);
+  m_AddProcessCommand = AddProcessCommandType::New();
+  m_AddProcessCommand->SetCallbackFunction(this, &CompositeApplication::LinkWatchers);
+}
+
+CompositeApplication::~CompositeApplication()
+{
+}
+
+void
+CompositeApplication
+::LinkWatchers(itk::Object * itkNotUsed(caller), const itk::EventObject & event)
+{
+  if (typeid(AddProcessToWatchEvent) == typeid( event ))
+    {
+    this->InvokeEvent(event);
+    }
+}
+
+bool
+CompositeApplication
+::AddApplication(std::string appType, std::string key, std::string desc)
+{
+  if (m_AppContainer.count(key))
+    {
+    otbAppLogWARNING("The requested identifier for internal application is already used ("<<key<<")");
+    return false;
+    }
+  InternalApplication container;
+  container.App = ApplicationRegistry::CreateApplication(appType);
+  container.Desc = desc;
+  // Setup logger
+  container.App->GetLogger()->AddLogOutput(m_LogOutput);
+  container.App->GetLogger()->SetTimeStampFormat(itk::LoggerBase::HUMANREADABLE);
+  container.App->AddObserver(AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer());
+  m_AppContainer[key] = container;
+  return true;
+}
+
+void
+CompositeApplication
+::ClearApplications()
+{
+  m_AppContainer.clear();
+}
+
+bool
+CompositeApplication
+::Connect(std::string fromKey, std::string toKey)
+{
+  std::string key1(fromKey);
+  std::string key2(toKey);
+  Application *app1 = DecodeKey(key1);
+  Application *app2 = DecodeKey(key2);
+
+  Parameter* rawParam1 = app1->GetParameterByKey(key1, false);
+  if (dynamic_cast<ProxyParameter*>(rawParam1))
+    {
+    otbAppLogWARNING("Parameter is already connected ! Override current connection");
+    }
+  ProxyParameter::Pointer proxyParam = ProxyParameter::New();
+  ProxyParameter::ProxyTargetType target;
+  target.first = app2->GetParameterList();
+  target.second = key2;
+  proxyParam->SetTarget(target);
+  proxyParam->SetName(rawParam1->GetName());
+  proxyParam->SetDescription(rawParam1->GetDescription());
+  return app1->GetParameterList()->ReplaceParameter(key1, proxyParam.GetPointer());
+}
+
+bool
+CompositeApplication
+::ShareParameter(std::string localKey,
+                 std::string internalKey,
+                 std::string name,
+                 std::string desc)
+{
+  std::string internalKeyCheck(internalKey);
+  Application *app = DecodeKey(internalKeyCheck);
+  Parameter* rawTarget = app->GetParameterByKey(internalKeyCheck, false);
+
+  // Check source
+  ParameterKey pKey(localKey);
+  std::string proxyKey(pKey.GetLastElement());
+
+  // Create and setup proxy parameter
+  ProxyParameter::Pointer proxyParam = ProxyParameter::New();
+  ProxyParameter::ProxyTargetType target;
+  target.first = app->GetParameterList();
+  target.second = internalKeyCheck;
+  proxyParam->SetTarget(target);
+  proxyParam->SetName( name.empty() ? rawTarget->GetName() : name);
+  proxyParam->SetDescription(desc.empty() ? rawTarget->GetDescription() : desc);
+  proxyParam->SetKey(proxyKey);
+
+  // Get group parameter where the proxy should be added
+  Parameter::Pointer baseParam(proxyParam.GetPointer());
+  ParameterGroup *parentGroup = this->GetParameterList();
+  if (localKey.find('.') != std::string::npos)
+    {
+    Parameter::Pointer parentParam = this->GetParameterList()->GetParameterByKey(pKey.GetRoot());
+    parentGroup = dynamic_cast<ParameterGroup*>(parentParam.GetPointer());
+    baseParam->SetRoot(parentGroup);
+    parentGroup->AddChild(baseParam);
+    }
+  parentGroup->AddParameter(baseParam);
+  return true;
+}
+
+Application*
+CompositeApplication
+::DecodeKey(std::string &key)
+{
+  Application *ret = this;
+  size_t pos = key.find('.');
+  if (pos != std::string::npos && m_AppContainer.count(key.substr(0,pos)))
+    {
+    ret = m_AppContainer[key.substr(0,pos)].App;
+    key = key.substr(pos+1);
+    }
+  return ret;
+}
+
+Application*
+CompositeApplication
+::GetInternalApplication(std::string id)
+{
+  if (!m_AppContainer.count(id))
+    otbAppLogFATAL("Unknown internal application : "<<id);
+  return m_AppContainer[id].App;
+}
+
+std::string
+CompositeApplication
+::GetInternalAppDescription(std::string id)
+{
+  if (!m_AppContainer.count(id))
+    otbAppLogFATAL("Unknown internal application : "<<id);
+  return m_AppContainer[id].Desc;
+}
+
+void
+CompositeApplication
+::ExecuteInternal(std::string key)
+{
+  otbAppLogINFO(<< GetInternalAppDescription(key) <<"...");
+  try
+    {
+    GetInternalApplication(key)->Execute();
+    }
+  catch(...)
+    {
+    this->GetLogger()->Write( itk::LoggerBase::FATAL, std::string("\n") + m_Oss.str() );
+    throw;
+    }
+  if(!m_Oss.str().empty())
+    {
+    otbAppLogINFO(<< "\n" << m_Oss.str());
+    m_Oss.str(std::string(""));
+    }
+}
+
+void
+CompositeApplication
+::UpdateInternalParameters(std::string key)
+{
+  try
+    {
+    GetInternalApplication(key)->UpdateParameters();
+    }
+  catch(...)
+    {
+    this->GetLogger()->Write( itk::LoggerBase::FATAL, std::string("\n") + m_Oss.str() );
+    throw;
+    }
+  if(!m_Oss.str().empty())
+    {
+    otbAppLogINFO(<< "\n" << m_Oss.str());
+    m_Oss.str(std::string(""));
+    }
+}
+
+} // end namespace Wrapper
+} // end namespace otb
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperElevationParametersHandler.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperElevationParametersHandler.cxx
index e72145c..409f8ad 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperElevationParametersHandler.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperElevationParametersHandler.cxx
@@ -107,10 +107,20 @@ void ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(const Ap
   // Set DEM directory if available
   if(IsDEMUsed(app,key))
     {
-    oss.str("");
-    oss<<"Elevation management: using DEM directory ("<<GetDEMDirectory(app,key)<<")"<<std::endl;
-    otb::DEMHandler::Instance()->OpenDEMDirectory(GetDEMDirectory(app,key));
-    app->GetLogger()->Info(oss.str());
+    std::string demDirectory = GetDEMDirectory(app,key);
+    if(otb::DEMHandler::Instance()->IsValidDEMDirectory(demDirectory.c_str()))
+      {
+      oss.str( "" );
+      oss << "Elevation management: using DEM directory (" << demDirectory << ")" << std::endl;
+      otb::DEMHandler::Instance()->OpenDEMDirectory( demDirectory );
+      app->GetLogger()->Info( oss.str() );
+      }
+    else
+      {
+      oss.str( "" );
+      oss << "DEM directory : " << demDirectory << " is not a valid DEM directory";
+      app->GetLogger()->Warning( oss.str() );
+      }
     }
 }
 
@@ -161,10 +171,10 @@ ElevationParametersHandler::IsGeoidUsed(const Application::Pointer app, const st
 bool
 ElevationParametersHandler::IsDEMUsed(const Application::Pointer app, const std::string& key)
 {
-  std::ostringstream geoidKey;
-  geoidKey<< key<<".dem";
+  std::ostringstream demKey;
+  demKey<< key<<".dem";
 
-  return app->IsParameterEnabled(geoidKey.str()) && app->HasValue(geoidKey.str());
+  return app->IsParameterEnabled(demKey.str()) && app->HasValue(demKey.str());
 }
 
 
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperListViewParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperListViewParameter.cxx
index 2d3fa76..ecaf772 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperListViewParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperListViewParameter.cxx
@@ -23,7 +23,12 @@ namespace Wrapper
 {
 
 ListViewParameter::ListViewParameter()
-  : m_CurrentChoice(0)
+  : m_ChoiceList(),
+    m_CurrentChoice(0),
+    m_SelectedItems(),
+    m_SelectedKeys(),
+    m_SelectedNames(),
+    m_SingleSelection(false)
 {
 }
 
@@ -106,7 +111,9 @@ ListViewParameter::GetNbChoices( void )
 void
 ListViewParameter::SetValue(unsigned int v)
 {
+  std::vector<int> selectedItems(1,v);
   m_CurrentChoice = v;
+  this->SetSelectedItems(selectedItems);
   SetActive(true);
   // Call Modified();
   this->Modified();
@@ -145,14 +152,21 @@ ListViewParameter::ClearChoices()
   m_ChoiceList.clear();
 }
 
+
 void
-ListViewParameter::SetSelectedItemsByNames()
+ListViewParameter::SetSelectedNames(std::vector<std::string> selectedNames)
 {
   std::vector<int> selectedItems;
   std::vector<std::string> names = this->GetChoiceNames();
-  for(unsigned int i=0; i<m_SelectedNames.size(); i++)
+
+  if(m_SingleSelection && selectedNames.size() > 1)
+    {
+    itkExceptionMacro(<<"Single selection mode is on, but there are "<<selectedNames.size()<<" selected items");
+    }
+  
+  for(unsigned int i=0; i<selectedNames.size(); i++)
     {
-    const std::string selectedName = m_SelectedNames[i];
+    const std::string selectedName = selectedNames[i];
     unsigned int j(0);
       for(; j<names.size(); j++)
       {
@@ -182,13 +196,19 @@ ListViewParameter::SetSelectedItemsByNames()
 
 
 void
-ListViewParameter::SetSelectedItemsByKeys()
+ListViewParameter::SetSelectedKeys(std::vector<std::string> selectedKeys)
 {
   std::vector<int> selectedItems;
   std::vector<std::string> keys = this->GetChoiceKeys();
+
+if(m_SingleSelection && m_SelectedKeys.size() > 1)
+    {
+    itkExceptionMacro(<<"Single selection mode is on, but there are "<<m_SelectedKeys.size()<<" selected items");
+    }
+  
   for(unsigned int i=0; i<m_SelectedKeys.size(); i++)
     {
-    const std::string selectedKey = m_SelectedKeys[i];
+    const std::string selectedKey = selectedKeys[i];
     unsigned int j(0);
     std::ostringstream oss;
       for(; j<keys.size(); j++)
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
index 475e445..b6bd4f9 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
@@ -18,6 +18,8 @@
 #include "otbWrapperOutputImageParameter.h"
 #include "otbClampImageFilter.h"
 #include "otbClampVectorImageFilter.h"
+#include "otbImageIOFactory.h"
+#include "itksys/SystemTools.hxx"
 
 #ifdef OTB_USE_MPI
 
@@ -557,5 +559,46 @@ OutputImageParameter::HasValue() const
   return !filename.empty();
 }
 
+std::string
+OutputImageParameter::CheckFileName(bool fixMissingExtension)
+{
+  std::string ret("");
+  // Check that there is an ImageIO capable of writing the file
+  otb::ExtendedFilenameToWriterOptions::Pointer filenameHelper =
+    otb::ExtendedFilenameToWriterOptions::New();
+  filenameHelper->SetExtendedFileName(this->GetFileName());
+  std::string simpleFilename = filenameHelper->GetSimpleFileName();
+  // TODO : check if simpleFilename is empty
+
+  otb::ImageIOBase::Pointer imageIO =
+    otb::ImageIOFactory::CreateImageIO(simpleFilename.c_str(),
+                                       otb::ImageIOFactory::WriteMode);
+  if(imageIO.IsNull())
+    {
+    // check for missing extension
+    std::string outExt = itksys::SystemTools::GetFilenameLastExtension(simpleFilename);
+    if (outExt.empty())
+      {
+      if (fixMissingExtension)
+        {
+        // try with .tif
+        std::string fullFileName(this->GetFileName());
+        std::string extendedPart = fullFileName.substr(simpleFilename.size());
+        this->SetFileName(simpleFilename+std::string(".tif")+extendedPart);
+        ret += std::string("no extension detected, using TIF as default.");
+        }
+      else
+        {
+        // TODO : call exception here?
+        }
+      }
+    else
+      {
+      // TODO : call exception here?
+      }
+    }
+  return ret;
+}
+
 }
 }
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
index 385baaa..42e7079 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
@@ -130,8 +130,19 @@ OutputProcessXMLParameter::Write(Application::Pointer app)
 
   AddChildNodeTo(n_OTB, "version", version);
 
-  TiXmlElement *n_App;
-  n_App = AddChildNodeTo(n_OTB, "application");
+  // Parse application
+  TiXmlElement *n_App = ParseApplication(app);
+  n_OTB->LinkEndChild(n_App);
+
+  // Finally, write xml contents to file
+  doc.SaveFile( m_FileName.c_str() );
+}
+
+TiXmlElement*
+OutputProcessXMLParameter::ParseApplication(Application::Pointer app)
+{
+  TiXmlElement * n_App = new TiXmlElement("application");
+
   AddChildNodeTo(n_App, "name", app->GetName());
   AddChildNodeTo(n_App, "descr", app->GetDescription());
 
@@ -315,10 +326,7 @@ OutputProcessXMLParameter::Write(Application::Pointer app)
        }
       }
     }
-
-  // Finally, write xml contents to file
-  doc.SaveFile( m_FileName.c_str() );
-
+  return n_App;
 }
 
 } //end namespace wrapper
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx
index 48f68da..93c76d9 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx
@@ -36,6 +36,7 @@
 #include "otbWrapperInputProcessXMLParameter.h"
 #include "otbWrapperParameterKey.h"
 #include "otbWrapperRAMParameter.h"
+#include "otbWrapperProxyParameter.h"
 
 #include "otb_boost_string_header.h"
 
@@ -61,7 +62,11 @@ ParameterGroup::GetParametersKeys(bool recursive)
   for (pit = m_ParameterList.begin(); pit != m_ParameterList.end(); ++pit)
     {
     Parameter* param = *pit;
-    parameters.push_back( param->GetKey() );
+    std::string currentKey(param->GetKey());
+    parameters.push_back( currentKey );
+
+    // follow proxy parameters
+    param = this->ResolveParameter(param);
 
     if (recursive && dynamic_cast<ParameterGroup*>(param))
       {
@@ -70,7 +75,7 @@ ParameterGroup::GetParametersKeys(bool recursive)
       for (std::vector<std::string>::const_iterator it = subparams.begin();
            it != subparams.end(); ++it)
         {
-        parameters.push_back( std::string(paramAsGroup->GetKey()) + "."  + *it );
+        parameters.push_back( currentKey + "."  + *it );
         }
       }
     else if (recursive && dynamic_cast<ChoiceParameter*>(param))
@@ -81,7 +86,7 @@ ParameterGroup::GetParametersKeys(bool recursive)
       for (std::vector<std::string>::const_iterator it = subparams.begin();
            it != subparams.end(); ++it)
         {
-        parameters.push_back( std::string(paramAsChoice->GetKey()) + "."  + *it );
+        parameters.push_back( currentKey + "."  + *it );
         }
       }
     }
@@ -120,11 +125,15 @@ ParameterGroup::AddChoice(std::string paramKey, std::string paramName)
       else
         {
           itkExceptionMacro(<<parentkey << " is not a choice");
+		  
         }
     }
   else
     {
-      itkExceptionMacro(<<"No choice parameter key given");
+		itkExceptionMacro(
+					 << "No choice parameter key given: paramKey = '"
+					 << paramKey
+					 << "'");
     }
 }
 
@@ -132,37 +141,27 @@ ParameterGroup::AddChoice(std::string paramKey, std::string paramName)
 void
 ParameterGroup::ClearChoices(std::string paramKey)
 {
-  ParameterKey pKey( paramKey );
-  // Split the parameter name
-  std::vector<std::string> splitKey = pKey.Split();
 
-  std::string parentkey;
-  Parameter::Pointer parentParam;
+  Parameter * param  = GetParameterByKey(paramKey);
 
-  if (splitKey.size() > 1)
-    {
-    parentkey = pKey.GetRoot();
-    parentParam = GetParameterByKey(parentkey);
-    }
-  else
+  if(!param)
     {
-    parentParam = GetParameterByKey(splitKey[0]);
+    itkExceptionMacro("Parameter "<<paramKey<<" not found");
     }
+  
+   // param must be a choice, a listBox or this is an error
+  ListViewParameter* paramAsChoice = dynamic_cast<ListViewParameter*>(param);
 
-   // parentParam must be a choice, a listBox or this is an error
-  ListViewParameter* listBoxParentAsChoice = dynamic_cast<ListViewParameter*>(parentParam.GetPointer());
-
-  if (listBoxParentAsChoice)
+  if (paramAsChoice)
     {
-    listBoxParentAsChoice->ClearChoices();
+    paramAsChoice->ClearChoices();
     }
   else
     {
-    itkExceptionMacro(<<parentkey << " is not a ListView");
+    itkExceptionMacro(<<paramKey << " is not a ListView");
     }
 }
 
-
 void ParameterGroup::AddOutXMLParameter()
 {
   Parameter::Pointer tmpParam;
@@ -207,34 +206,25 @@ void ParameterGroup::AddInXMLParameter()
 std::vector<int>
 ParameterGroup::GetSelectedItems(std::string paramKey)
 {
-  std::vector<int> selectedItems;
-  ParameterKey pKey( paramKey );
-  // Split the parameter name
-  std::vector<std::string> splitKey = pKey.Split();
+  Parameter * param  = GetParameterByKey(paramKey);
 
-  std::string parentkey;
-  Parameter::Pointer parentParam;
-
-  if (splitKey.size() > 1)
-    {
-    parentkey = pKey.GetRoot();
-    parentParam = GetParameterByKey(parentkey);
-    }
-  else
+  if(!param)
     {
-    parentParam = GetParameterByKey(splitKey[0]);
+    itkExceptionMacro("Parameter "<<paramKey<<" not found");
     }
+  
+   // param must be a choice, a listBox or this is an error
+  ListViewParameter* paramAsChoice = dynamic_cast<ListViewParameter*>(param);
+  
+  std::vector<int> selectedItems;
 
-   // parentParam must be a choice, a listBox or this is an error
-  ListViewParameter* listBoxParentAsChoice = dynamic_cast<ListViewParameter*>(parentParam.GetPointer());
-
-  if (listBoxParentAsChoice)
+  if (paramAsChoice)
     {
-    selectedItems = listBoxParentAsChoice->GetSelectedItems();
+    selectedItems = paramAsChoice->GetSelectedItems();
     }
   else
     {
-    itkExceptionMacro(<<parentkey << " is not a ListView");
+    itkExceptionMacro(<<paramKey << " is not a ListView");
     }
 
   return selectedItems;
@@ -666,14 +656,79 @@ ParameterGroup::AddParameter(Parameter::Pointer p)
   m_ParameterList.push_back(p);
 }
 
+bool
+ParameterGroup::ReplaceParameter(std::string &key, Parameter::Pointer p)
+{
+  bool ret = true;
+  ParameterKey pName(key);
+  std::vector<std::string> splitName = pName.Split();
+  std::string lastkey = pName.GetLastElement();
+  std::string parentkey = pName.GetRoot();
+  ParameterGroup* parentGroup = this;
+  if( splitName.size() > 1 )
+    {
+    Parameter* parentParam = GetParameterByKey(parentkey);
+    parentGroup = dynamic_cast<ParameterGroup*>(parentParam);
+    if (parentGroup)
+      {
+      ret = parentGroup->ReplaceParameter(lastkey, p);
+      }
+    else
+      {
+      ret = false;
+      }
+    }
+  else
+    {
+    // find current parameter in the current group
+    Parameter::Pointer oldParam;
+    ParameterListType::iterator vit;
+    for (vit = m_ParameterList.begin(); vit != m_ParameterList.end(); ++vit)
+      {
+      if (lastkey.compare((*vit)->GetKey()) == 0)
+        {
+        oldParam = *vit;
+        break;
+        }
+      }
+    if (oldParam.IsNull())
+      {
+      // parameter to replace not found : return false
+      ret = false;
+      }
+    else
+      {
+      // parameter already exists : replace it
+      *vit = p;
+      p->SetKey(lastkey);
+      }
+    }
+  if (ret)
+    {
+    if( splitName.size() > 1 )
+      {
+      p->SetRoot(parentGroup);
+      parentGroup->AddChild(p);
+      }
+    }
+  // don't check type compatibility here, we may want to handle special cases
+  // at higher level
+  return ret;
+}
+
 Parameter::Pointer
-ParameterGroup::GetParameterByIndex(unsigned int i)
+ParameterGroup::GetParameterByIndex(unsigned int i, bool follow)
 {
-  return m_ParameterList[i];
+  Parameter *param = m_ParameterList[i];
+  if (follow)
+    {
+    param = this->ResolveParameter(param);
+    }
+  return Parameter::Pointer(param);
 }
 
 Parameter::Pointer
-ParameterGroup::GetParameterByKey(std::string name)
+ParameterGroup::GetParameterByKey(std::string name, bool follow)
 {
   ParameterKey pName(name);
 
@@ -701,6 +756,14 @@ ParameterGroup::GetParameterByKey(std::string name)
     itkExceptionMacro(<< "Could not find parameter " << name)
     }
 
+  // follow proxy parameters (resolve intermediate group parameter because
+  // we need to get to the requested parameter)
+  if (follow || splitName.size() > 1)
+    {
+    Parameter *rawParam = this->ResolveParameter(parentParam.GetPointer());
+    parentParam = rawParam;
+    }
+
   // If the name contains a child, make a recursive call
   if (splitName.size() > 1)
     {
@@ -774,5 +837,33 @@ ParameterGroup::GetNumberOfParameters()
   return m_ParameterList.size();
 }
 
+Parameter* ParameterGroup::ResolveParameter(Parameter *param)
+{
+  Parameter* ret = param;
+  if (ret == ITK_NULLPTR)
+    {
+    itkGenericExceptionMacro("Can't resolve NULL parameter!");
+    }
+  while (dynamic_cast<ProxyParameter*>(ret))
+    {
+    ProxyParameter* castParam = dynamic_cast<ProxyParameter*>(ret);
+    ProxyParameter::ProxyTargetType target = castParam->GetTarget();
+    ParameterGroup* targetGroup = dynamic_cast<ParameterGroup*>(target.first.GetPointer());
+    if (targetGroup)
+      {
+      ret = targetGroup->GetParameterByKey(target.second);
+      }
+    else
+      {
+      itkGenericExceptionMacro("Target group of a proxy parameter is not of type ParameterGroup");
+      }
+    if (ret == param)
+      {
+      itkGenericExceptionMacro("Cycle detected with proxy parameters!");
+      }
+    }
+  return ret;
+}
+
 }
 }
diff --git a/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
index 753d001..7b6dee3 100644
--- a/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
+++ b/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
@@ -177,3 +177,7 @@ otb_add_test(NAME owTvApplicationMemoryConnectTest COMMAND otbApplicationEngineT
   $<TARGET_FILE_DIR:otbapp_Smoothing>
   ${INPUTDATA}/poupees.tif
   ${TEMP}/owTvApplicationMemoryConnectTestOutput.tif)
+
+otb_add_test(NAME owTvParameterGroup COMMAND otbApplicationEngineTestDriver
+  otbWrapperParameterList
+  )
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx b/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
index 3cb4aad..2d6145c 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
@@ -20,6 +20,7 @@ void RegisterTests()
   REGISTER_TEST(otbWrapperDocExampleStructureTest);
   REGISTER_TEST(otbWrapperParameterKey);
   REGISTER_TEST(otbWrapperParameterListNew);
+  REGISTER_TEST(otbWrapperParameterList);
   REGISTER_TEST(otbWrapperEmptyParameterNew);
   REGISTER_TEST(otbWrapperInputImageListParameterNew);
   REGISTER_TEST(otbWrapperInputImageListParameterTest1);
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx b/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx
index e0f646d..b9d92f8 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx
@@ -64,6 +64,7 @@ int otbApplicationMemoryConnectTest(int argc, char * argv[])
   
   app4->AddImageToParameterInputImageList("il",app2->GetParameterOutputImage("out"));
   app4->AddImageToParameterInputImageList("il",app3->GetParameterOutputImage("out"));
+  app4->AddParameterStringList("il",infname);
    
   app4->ExecuteAndWriteOutput();
 
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterListTest.cxx b/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterListTest.cxx
index 5d14917..966db2c 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterListTest.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterListTest.cxx
@@ -20,6 +20,9 @@
 #endif
 
 #include "otbWrapperParameterGroup.h"
+#include "otbWrapperStringParameter.h"
+#include "otbWrapperNumericalParameter.h"
+#include "otbWrapperProxyParameter.h"
 
 int otbWrapperParameterListNew(int itkNotUsed(argc), char * itkNotUsed(argv)[])
 {
@@ -30,3 +33,66 @@ int otbWrapperParameterListNew(int itkNotUsed(argc), char * itkNotUsed(argv)[])
 
   return EXIT_SUCCESS;
 }
+
+int otbWrapperParameterList(int itkNotUsed(argc), char * itkNotUsed(argv)[])
+{
+  typedef otb::Wrapper::ParameterGroup  GroupPrm;
+  typedef otb::Wrapper::StringParameter StringPrm;
+  typedef otb::Wrapper::IntParameter    IntPrm;
+  typedef otb::Wrapper::ProxyParameter  ProxyPrm;
+
+  // setup first group of parameters
+  GroupPrm::Pointer parameters = GroupPrm::New();
+
+  StringPrm::Pointer strParam = StringPrm::New();
+  strParam->SetKey("str");
+
+  IntPrm::Pointer numParam = IntPrm::New();
+  numParam->SetKey("num");
+  numParam->SetValue(1);
+
+  parameters->AddParameter(strParam.GetPointer());
+  parameters->AddParameter(numParam.GetPointer());
+
+  // setup second group of parameters
+  GroupPrm::Pointer otherParameters = GroupPrm::New();
+
+  IntPrm::Pointer hiddenParam = IntPrm::New();
+  hiddenParam->SetKey("hidden");
+  hiddenParam->SetValue(2);
+
+  otherParameters->AddParameter(hiddenParam.GetPointer());
+
+  ProxyPrm::Pointer proxyParam = ProxyPrm::New();
+  ProxyPrm::ProxyTargetType target;
+  target.first = otherParameters;
+  target.second = "hidden";
+  proxyParam->SetTarget(target);
+
+  // try to set a proxy to "hidden" in the first group
+  std::string proxyKey("num");
+  if (! parameters->ReplaceParameter(proxyKey, proxyParam.GetPointer()))
+    {
+    std::cout << "Failed to replace with proxy parameter" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // check that we get the right value in "num"
+  otb::Wrapper::Parameter* resultParam = GroupPrm::ResolveParameter(parameters->GetParameterByKey("num"));
+  IntPrm* castInt = dynamic_cast<IntPrm*>(resultParam);
+  if (castInt)
+    {
+    if (castInt->GetValue() != 2)
+      {
+      std::cout << "Failed to setup proxy on int parameter, got "<< castInt->GetValue()<< ", expected 2."<< std::endl;
+      return EXIT_FAILURE;
+      }
+    }
+  else
+    {
+    std::cout << "Can't cast parameter to Int, probably wrong type."<< std::endl;
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
index b69ef72..c75e921 100644
--- a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
+++ b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
@@ -494,7 +494,17 @@ CommandLineLauncher::ParamResultType CommandLineLauncher::LoadParameters()
                   else
                     if (type == ParameterType_ListView)
                       {
-                      dynamic_cast<ListViewParameter *> (param.GetPointer())->SetSelectedNames(values);
+                      
+                      ListViewParameter * tmpLV = dynamic_cast<ListViewParameter *>(param.GetPointer());
+
+                      if(tmpLV->GetSingleSelection() && values.size() > 1)
+                        {
+                        std::cerr << "ERROR: Invalid number of value for: \"" << paramKey
+                                  << "\", invalid number of values " << values.size() << std::endl;
+                        return INVALIDNUMBEROFVALUE;
+                        }
+                      
+                      tmpLV->SetSelectedNames(values);
                       }
                     else
                       if(values.size() != 1)
@@ -750,6 +760,14 @@ std::string CommandLineLauncher::DisplayParameterHelp(const Parameter::Pointer &
     return "";
     }
 
+  bool singleSelectionForListView = false;
+
+  if(type == ParameterType_ListView)
+    {
+    ListViewParameter * tmp = static_cast<ListViewParameter *>(param.GetPointer());
+    singleSelectionForListView = tmp->GetSingleSelection();
+    }
+
   std::ostringstream oss;
 
   // When a parameter is mandatory :
@@ -822,7 +840,7 @@ std::string CommandLineLauncher::DisplayParameterHelp(const Parameter::Pointer &
     }
   else if (type == ParameterType_InputFilename || type == ParameterType_OutputFilename ||type == ParameterType_Directory || type == ParameterType_InputImage || type == ParameterType_OutputProcessXML || type == ParameterType_InputProcessXML ||
            type == ParameterType_ComplexInputImage || type == ParameterType_InputVectorData || type == ParameterType_OutputVectorData ||
-           type == ParameterType_String || type == ParameterType_Choice )
+           type == ParameterType_String || type == ParameterType_Choice || (type == ParameterType_ListView && singleSelectionForListView))
     {
     oss << "<string>        ";
     }
@@ -830,7 +848,7 @@ std::string CommandLineLauncher::DisplayParameterHelp(const Parameter::Pointer &
     {
     oss << "<string> [pixel]";
     }
-  else if (type == ParameterType_Choice || type == ParameterType_ListView || type == ParameterType_InputImageList ||
+  else if (type == ParameterType_Choice || (type == ParameterType_ListView && !singleSelectionForListView) || type == ParameterType_InputImageList ||
            type == ParameterType_InputVectorDataList || type == ParameterType_InputFilenameList ||
            type == ParameterType_StringList )
     {
@@ -840,7 +858,7 @@ std::string CommandLineLauncher::DisplayParameterHelp(const Parameter::Pointer &
     itkExceptionMacro("Not handled parameter type.");
 
 
-  oss<< " " << param->GetName() << " ";
+  oss<< " " << m_Application->GetParameterName(paramKey) << " ";
 
   if (type == ParameterType_OutputImage)
     {
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
index e08678a..856c252 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
@@ -19,6 +19,7 @@
 #define otbWrapperQtWidgetModel_h
 
 #include <QtGui>
+#include <QTimer>
 #ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
 #include "otbWrapperApplication.h"
 #include "otbQtLogOutput.h"
@@ -162,6 +163,8 @@ private slots:
    */
   void OnApplicationExecutionDone( int status );
 
+  void TimerDone();
+
 private:
   QtWidgetModel(const QtWidgetModel&); //purposely not implemented
   void operator=(const QtWidgetModel&); //purposely not implemented
@@ -171,6 +174,8 @@ private:
   QtLogOutput::Pointer  m_LogOutput;
 
   bool m_IsRunning;
+
+  QTimer *m_Timer;
 };
 
 
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
index e39f5d1..b4d69cc 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
@@ -54,6 +54,7 @@ public slots:
 
 private slots:
   void UpdateMessageAfterExecuteClicked();
+  void UpdateMessageAfterExecution(int status);
   void UpdateMessageAfterApplicationReady(bool val);
 
 signals:
diff --git a/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx b/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx
index 99e0779..3fa73b3 100644
--- a/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx
@@ -103,5 +103,12 @@ int main(int argc, char* argv[])
   mainWindow->show();
 
   // Start event processing loop
-  return qtApp.exec();
+  int ret = qtApp.exec();
+
+  // Clean resources
+  if (mainWindow) delete mainWindow;
+  app = ITK_NULLPTR;
+  ApplicationRegistry::CleanRegistry();
+
+  return ret;
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
index 9427927..21c2894 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
@@ -70,7 +70,15 @@ void QtWidgetListViewParameter::DoCreateWidget()
 {
   m_ListView = new QListWidget();
   m_ListView->setToolTip(m_ListViewParam->GetDescription());
-  m_ListView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+  if(m_ListViewParam->GetSingleSelection())
+    {
+    m_ListView->setSelectionMode(QAbstractItemView::SingleSelection);
+    }
+  else
+    {
+    m_ListView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    }
 
   connect( m_ListView, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItems()) );
 
@@ -97,6 +105,10 @@ void QtWidgetListViewParameter::SelectedItems()
       }
     }
   m_ListViewParam->SetSelectedItems(m_SelectedItems);
+
+  // make sure parameter is enabled
+  m_ListViewParam->SetActive(true);
+  m_ListViewParam->SetUserValue(true);
 }
 
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx
index 7315792..e958762 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx
@@ -17,6 +17,9 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetModel.h"
 
+//Use to create command line from the application parameters
+#include "otbWrapperOutputProcessXMLParameter.h"
+
 namespace otb
 {
 
@@ -37,13 +40,25 @@ QtWidgetModel
 
   m_LogOutput = QtLogOutput::New();
 
- // Attach log output to the Application logger
+  // Attach log output to the Application logger
   m_Application->GetLogger()->SetTimeStampFormat(itk::LoggerBase::HUMANREADABLE);
   m_Application->GetLogger()->AddLogOutput(m_LogOutput);
+
+  m_Timer = new QTimer(this);
+  m_Timer->setSingleShot(true);
+  m_Timer->setInterval(1000);
+  QObject::connect(
+    m_Timer,
+    SIGNAL( timeout() ),
+    this,
+    SLOT( TimerDone() )
+    );
 }
 
 QtWidgetModel::~QtWidgetModel()
 {
+  if (m_Timer)
+    delete m_Timer;
 }
 
 void
@@ -70,6 +85,81 @@ QtWidgetModel
   emit SetApplicationReady(false);
   m_IsRunning = true;
 
+  //Buld corresponding command line and display to the Log tab
+
+  //Build XML DOM from m_application
+  OutputProcessXMLParameter::Pointer outXMLParam = OutputProcessXMLParameter::New();
+
+  TiXmlElement* XMLAppElement = outXMLParam->ParseApplication(m_Application);
+ 
+  //Create command line from the XML document
+  TiXmlElement * pName, *pParam;
+  std::ostringstream cmdLine;
+
+  cmdLine << "";
+    
+  if(XMLAppElement)
+    {
+    pName = XMLAppElement->FirstChildElement("name");
+
+    cmdLine << "otbcli_" << pName->GetText();
+#ifdef _WIN32
+    cmdLine << ".bat";
+#endif
+    cmdLine << " ";
+
+    //Parse application parameters
+    pParam = XMLAppElement->FirstChildElement("parameter");
+    
+    while(pParam)
+      {
+      //Get pareter key
+      cmdLine << "-";
+      cmdLine << pParam->FirstChildElement("key")->GetText();
+      cmdLine << " ";
+
+      //Some parameters can have multiple values. Test it and handle this
+      //specific case
+      TiXmlElement * values = pParam->FirstChildElement("values");
+
+      if (values)
+        {
+        //Loop over value
+        TiXmlElement * pValue = values->FirstChildElement("value");
+        while(pValue)
+          {
+          cmdLine << pValue->GetText();
+          cmdLine << " ";
+            
+          pValue = pValue->NextSiblingElement(); // iteration over multiple values 
+          }
+        }
+      else
+        {
+        //Get parameter value
+        cmdLine << pParam->FirstChildElement("value")->GetText();
+        cmdLine << " ";
+
+        //In case of OutputImageparameter we need to report output pixel type
+        TiXmlElement * pPixType = pParam->FirstChildElement("pixtype");
+
+        if (pPixType)
+          {
+          cmdLine << pPixType->GetText();
+          cmdLine << " ";
+          }
+        }
+        
+      pParam = pParam->NextSiblingElement(); // iteration over parameters
+      }
+
+    //Insert a new line character at the end of the command line
+    cmdLine << std::endl;
+    
+    //Report the command line string to the application logger
+    m_Application->GetLogger()->Write(itk::LoggerBase::INFO, cmdLine.str());
+    }
+
   // launch the output image writing
   AppliThread * taskAppli = new AppliThread( m_Application );
 
@@ -89,26 +179,45 @@ QtWidgetModel
     SLOT( OnApplicationExecutionDone( int ) )
   );
 
-  taskAppli->Execute();
+  QObject::connect(
+    taskAppli,
+    SIGNAL( finished() ),
+    taskAppli,
+    SLOT( deleteLater() )
+  );
 
   // Tell the Progress Reporter to begin
   emit SetProgressReportBegin();
+
+  taskAppli->Execute();
 }
 
 void
 QtWidgetModel
 ::OnApplicationExecutionDone( int status )
 {
-  m_IsRunning = false;
+  // For the progressReport to close the Progress widget
+  // and the GUI to update message
+  emit SetProgressReportDone( status );
 
-  // Require GUI update.
-  NotifyUpdate();
+  if (status >= 0)
+    {
+    std::ostringstream oss;
+    oss << "Execution took "<< m_Application->GetLastExecutionTiming() << " sec";
+    SendLogINFO(oss.str());
+    }
 
-  // For the view to activate the button "Execute"
-  emit SetApplicationReady( true );
+  // start timer
+  m_Timer->start();
+}
 
-  // For the progressReport to close the Progress widget
-  emit SetProgressReportDone( status );
+void
+QtWidgetModel
+::TimerDone()
+{
+  m_IsRunning = false;
+  // Require GUI update.
+  NotifyUpdate();
 }
 
 void
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
index fbb113c..872b4b4 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
@@ -55,6 +55,7 @@ void QtWidgetParameterGroup::DoCreateWidget()
   for (unsigned int i = 0; i < nbParams; ++i)
     {
     Parameter* param = m_ParamList->GetParameterByIndex(i);
+    Parameter* rawParam = m_ParamList->GetParameterByIndex(i,false);
 
     if (param != ITK_NULLPTR)
       {
@@ -70,7 +71,7 @@ void QtWidgetParameterGroup::DoCreateWidget()
       if (paramAsGroup == ITK_NULLPTR && paramAsChoice == ITK_NULLPTR && !paramIsXML)
         {
         // Label (col 1)
-        QWidget* label = new QtWidgetParameterLabel( param );
+        QWidget* label = new QtWidgetParameterLabel( rawParam );
         gridLayout->addWidget(label, i, 1);
 
         // Parameter Widget (col 2)
@@ -149,7 +150,7 @@ void QtWidgetParameterGroup::DoCreateWidget()
           }
         connect(group, SIGNAL(clicked(bool)), specificWidget, SLOT(SetActivationState(bool)));
 
-        group->setTitle(param->GetName());
+        group->setTitle(rawParam->GetName());
         gridLayout->addWidget(group, i, 0, 1, -1);
 
         m_WidgetList.push_back(specificWidget);
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterLabel.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterLabel.cxx
index 5ca4d25..13eb52a 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterLabel.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterLabel.cxx
@@ -28,7 +28,7 @@ QtWidgetParameterLabel::QtWidgetParameterLabel(Parameter* param)
   QLabel *label = new QLabel;
 
   label->setText(param->GetName());
-  label->setToolTip(param->GetName());
+  label->setToolTip(param->GetKey());
 
   QVBoxLayout *labelLayout = new QVBoxLayout;
   labelLayout->setSpacing(0);
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx
index 75fa895..5aa25cc 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx
@@ -32,7 +32,6 @@ QtWidgetSimpleProgressReport::QtWidgetSimpleProgressReport(QtWidgetModel * model
 {
   m_Model = model;
   connect(model, SIGNAL(SetProgressReportBegin()), this, SLOT(show()) );
-  connect(model, SIGNAL(SetProgressReportDone()), this, SLOT(close()) );
   connect(model, SIGNAL(SetProgressReportDone()), this, SLOT(Init()) );
   connect(this, SIGNAL(AddNewProcessToReport()), this, SLOT(ReportProcess()) );
 
@@ -90,7 +89,7 @@ void QtWidgetSimpleProgressReport::ReportProcess()
 void QtWidgetSimpleProgressReport::Init()
 {
   m_Bar->setValue(0);
-  m_Label->setText("No process yet...");
+  m_Label->setText("No process");
 }
 
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
index 70ccd2a..43f7472 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
@@ -40,7 +40,7 @@ QtWidgetView::QtWidgetView(Application* app)
 
 QtWidgetView::~QtWidgetView()
 {
-
+  delete m_Model;
 }
 
 void QtWidgetView::CreateGui()
@@ -61,6 +61,7 @@ void QtWidgetView::CreateGui()
 
   m_Message = new QLabel("<center><font color=\"#FF0000\">Select parameters</font></center>");
   connect( m_Model, SIGNAL(SetApplicationReady(bool)), this, SLOT(UpdateMessageAfterApplicationReady(bool)) );
+  connect( m_Model, SIGNAL(SetProgressReportDone(int)), this, SLOT(UpdateMessageAfterExecution(int)) );
   mainLayout->addWidget(m_Message);
 
   QtWidgetSimpleProgressReport * progressReport =  new QtWidgetSimpleProgressReport(m_Model);
@@ -86,10 +87,22 @@ void QtWidgetView::UpdateMessageAfterExecuteClicked()
   m_Message->setText("<center><font color=\"#FF0000\">Running</font></center>");
 }
 
+void QtWidgetView::UpdateMessageAfterExecution(int status)
+{
+  if (status >= 0)
+    {
+    m_Message->setText("<center><font color=\"#00A000\">DONE</font></center>");
+    }
+  else
+    {
+    m_Message->setText("<center><font color=\"#FF0000\">FAILED !</font></center>");
+    }
+}
+
 void QtWidgetView::UpdateMessageAfterApplicationReady( bool val )
 {
   if(val == true)
-    m_Message->setText("<center><font color=\"#00FF00\">Ready to run</font></center>");
+    m_Message->setText("<center><font color=\"#00A000\">Ready to run</font></center>");
   else
     m_Message->setText("<center><font color=\"#FF0000\">Select parameters</font></center>");
 }
@@ -147,7 +160,7 @@ QWidget* QtWidgetView::CreateDoc()
   QTextDocument * doc = new QTextDocument();
 
   std::string docContain;
-  ApplicationHtmlDocGenerator::GenerateDoc( m_Application, docContain);
+  ApplicationHtmlDocGenerator::GenerateDoc( m_Application, docContain, true);
 
   doc->setHtml(docContain.c_str());
 
diff --git a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
index 21067b3..c19a430 100644
--- a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
+++ b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
@@ -104,6 +104,8 @@ int otbWrapperQtWidgetShowWidget(int argc, char* argv[])
     // clean main window
     if (mainWindow) delete mainWindow;
     }
+
+  ApplicationRegistry::CleanRegistry();
   
   if (result)
     {
diff --git a/Modules/Wrappers/SWIG/src/CMakeLists.txt b/Modules/Wrappers/SWIG/src/CMakeLists.txt
index af42462..9126f98 100644
--- a/Modules/Wrappers/SWIG/src/CMakeLists.txt
+++ b/Modules/Wrappers/SWIG/src/CMakeLists.txt
@@ -28,7 +28,7 @@ if ( OTB_WRAP_PYTHON )
     include_directories(${NUMPY_INCLUDE_DIRS})
     list(APPEND CMAKE_SWIG_FLAGS  "-DOTB_SWIGNUMPY=1")
   endif()
-  set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
+  set(CMAKE_SWIG_OUTDIR ${CMAKE_BINARY_DIR}/${OTB_INSTALL_PYTHON_DIR})
   set(SWIG_MODULE_otbApplication_EXTRA_DEPS
        ${CMAKE_CURRENT_SOURCE_DIR}/Python.i
        ${CMAKE_CURRENT_SOURCE_DIR}/PyCommand.i
@@ -36,6 +36,7 @@ if ( OTB_WRAP_PYTHON )
        OTBApplicationEngine)
   SWIG_add_module( otbApplication python otbApplication.i otbApplicationPYTHON_wrap.cxx itkPyCommand.cxx )
   SWIG_link_libraries( otbApplication ${PYTHON_LIBRARIES} OTBApplicationEngine )
+  set_target_properties(_otbApplication PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SWIG_OUTDIR})
   if(MSVC)
     set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "/wd4005" )
   else()
@@ -47,7 +48,9 @@ if ( OTB_WRAP_PYTHON )
       TARGET _otbApplication
       POST_BUILD
       COMMAND ${CMAKE_COMMAND} -E echo "Byte-compiling otbApplication.py"
-      COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/CMake/PythonCompile.py otbApplication.py
+      COMMAND ${PYTHON_EXECUTABLE}
+      ${CMAKE_SOURCE_DIR}/CMake/PythonCompile.py
+      ${CMAKE_SWIG_OUTDIR}/otbApplication.py
       DEPENDS _otbApplication
     )
 
@@ -57,8 +60,8 @@ if ( OTB_WRAP_PYTHON )
            DESTINATION ${OTB_INSTALL_PYTHON_DIR}
            COMPONENT RuntimeLibraries )
 
-  install( FILES ${CMAKE_CURRENT_BINARY_DIR}/otbApplication.py
-                 ${CMAKE_CURRENT_BINARY_DIR}/otbApplication.pyc
+  install( FILES ${CMAKE_SWIG_OUTDIR}/otbApplication.py
+                 ${CMAKE_SWIG_OUTDIR}/otbApplication.pyc
            DESTINATION ${OTB_INSTALL_PYTHON_DIR}
            COMPONENT RuntimeLibraries )
 
diff --git a/Modules/Wrappers/SWIG/src/otbApplication.i b/Modules/Wrappers/SWIG/src/otbApplication.i
index c617e05..d02d01a 100644
--- a/Modules/Wrappers/SWIG/src/otbApplication.i
+++ b/Modules/Wrappers/SWIG/src/otbApplication.i
@@ -181,16 +181,11 @@ public:
 
   bool IsApplicationReady();
 
-  void SetParameterInt(std::string parameter, int value);
-  void SetParameterFloat(std::string parameter, float value);
-  void SetParameterString(std::string parameter, std::string value);
-  void SetParameterStringList(std::string parameter, std::vector<std::string> value);
-
-  void SetParameterInt(std::string parameter, int value, bool hasUserValueFlag);
-  void SetParameterFloat(std::string parameter, float value, bool hasUserValueFlag);
-  void SetParameterString(std::string parameter, std::string value, bool hasUserValueFlag);
-  void SetParameterStringList(std::string parameter, std::vector<std::string> values, bool hasUserValueFlag);
-  void SetParameterEmpty(std::string parameter, bool value, bool hasUserValueFlag);
+  void SetParameterInt(std::string parameter, int value, bool hasUserValueFlag = true);
+  void SetParameterFloat(std::string parameter, float value, bool hasUserValueFlag = true);
+  void SetParameterString(std::string parameter, std::string value, bool hasUserValueFlag = true);
+  void SetParameterStringList(std::string parameter, std::vector<std::string> values, bool hasUserValueFlag = true);
+  void SetParameterEmpty(std::string parameter, bool value, bool hasUserValueFlag = true);
 
   void SetParameterOutputImagePixelType(std::string parameter, otb::Wrapper::ImagePixelType pixelType);
   void SetParameterComplexOutputImagePixelType(std::string parameter, otb::Wrapper::ComplexImagePixelType cpixelType);
@@ -209,7 +204,9 @@ public:
   ComplexInputImageParameter::ImageBaseType * GetParameterComplexOutputImage(std::string parameter);
   void SetParameterComplexInputImage(std::string parameter, ComplexInputImageParameter::ImageBaseType * inputImage);
   void AddImageToParameterInputImageList(std::string parameter,InputImageParameter::ImageBaseType * img);
-   void SetNthParameterInputImageList(std::string parameter, const unsigned int &id, InputImageParameter::ImageBaseType * img);
+  void AddParameterStringList(std::string parameter,const std::string & str);
+  void SetNthParameterInputImageList(std::string parameter, const unsigned int &id, InputImageParameter::ImageBaseType * img);
+  void SetNthParameterStringList(std::string parameter, const unsigned int &id, const std::string& str);
   void ClearParameterInputImageList(std::string parameter);
   unsigned int GetNumberOfElementsInParameterInputImageList(std::string parameter);
 
@@ -414,6 +411,7 @@ private:
   void operator =(const Application&);
 };
 
+
 DECLARE_REF_COUNT_CLASS( Application )
 
 
diff --git a/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py b/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py
index 0b25eb0..30a0be3 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py
@@ -21,6 +21,7 @@ def test(otb, argv):
 
 	app4.AddImageToParameterInputImageList("il",app2.GetParameterOutputImage("out"));
 	app4.AddImageToParameterInputImageList("il",app3.GetParameterOutputImage("out"));
+        app4.AddParameterStringList("il",argv[1])
 
 	app4.OUT = argv[2]
 	app4.ExecuteAndWriteOutput()
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 9f49461..bd8070c 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,3 +1,61 @@
+OTB-v.5.10.0 - Changes since version 5.8.0 (February 14th, 2017)
+---------------------------------------------------------------
+
+* Request for Changes (http://wiki.orfeo-toolbox.org/index.php/Requests_for_Changes):
+  * Request for Changes-69: Force Monteverdi no-GLSL option (adopted, merged)
+  * Request for Changes-70: Composite application framework (adopted, merged)
+  * Request for Changes-71: Enhance class field selection in training applications (adopted, merged)
+  * Request for Changes-72: Remove JPEG2000ImageIO (adopted, merged)
+  * Request for Changes-73: Compatibility with muparserx 4.0.7 (last stable release) (adopted, merged)
+  * Request for Changes-74: Translate the application GUI to the corresponding command line (adopted, merged)
+  * Request for Changes-75: Monteverdi/App November code sprint (adopted, merged)
+  * Request for Changes-76: Single band color-mapping in Monteverdi (adopted, merged)
+  * Request for Changes-77: New application for wavelet and fft domain transform (adopted, merged)
+  * Request for Changes-78: Refactor TrainImagesClassifier (adopted, merged)
+  * Request for Changes-79: BundleToPerfectSensor implemented as composite application (adopted, merged)
+  * Request for Changes-80: Compute sub-sampled Haralick textures (adopted, merged)
+
+* Bugfixes :
+
+  * Monteverdi
+    * 0001351: Broken 5.10 standalone package on Linux (missing libstdc++)
+    * 0001334: On Windows standalone package, selection and drag&drop is broken on Monteverdi layer stack
+    * 0001338: Monteverdi does not correctly free memory
+    * 0001345: Wrong behavior of minimum image size for overviews in preference dialog
+    * 0001320: Pixel picking in Monteverdi is half-pixel shifted
+    * 0001309: Monteverdi 5.8: cannot drag and drop filename to OTB app
+
+  * OTB-Packaging
+    * 0001361: _dl_close error message in Linux standalone package when closing the application
+    * 0001357: segfault when loading OTB applications in linux standalone package
+    * 0001356: Linux package requires OTB_USE_SYSTEM_GTK=1 on CentOS 7
+    * 0001355: Patch to set OTB_APPLICATION_PATH environment variable in monteverdi desktop file
+    * 0001335: On Windows standalone package, TOC calibration crashes monteverdi
+    * 0001326: OTB python bindings does not work
+    * 0001336: setup.sh is missing in Windows standalone packages
+    * 0001337: On windows standalone package otbcli.bat misses the GDAL_DATA environment variable
+    * 0001325: libsvm URL in superbuild does not exists anymore
+
+  * OTB-applications
+    * 0001341: Rescale application does not exactly rescale image
+    * 0001339: ExtractROI application yields wrong size through python bindings
+    * 0001321: Unable to apply radiometric calibration to  S1A SLC product
+    * 0001316: Application parameter of type ListView are not export in XML
+
+  * Orfeo Toolbox (OTB)
+    * 0001317: cmake c and cxx flags are not written in OTBConfig.cmake or UseOTB.cmake
+    * 0001323: Install monteverdi icons along with the application.
+    * 0001342: Download of libsvm is failing when (super)building
+    * 0001331: TrainVectorClassifier: misleading error message
+    * 0001330: Superbuild crashes with invalid libSVM source link
+    * 0001327: Quicklook application introduces a shift
+    * 0001328: OTB 5.8 : superImpose introduce "NODATA"
+    * 0001319: OTB 5.8 vector Sampler
+    * 0001324: Add Keywords to desktop entry file.
+
+  * Documentation
+    * 0001313: Some latex fragments are not rendered in RST cookbook
+
 OTB-v.5.8.0 - Changes since version 5.6.1 (November 8th, 2016)
 --------------------------------------------------------------
 
@@ -1299,7 +1357,7 @@ OTB-v.3.14.0 - Changes since version 3.12.0 (2012/07/09)
     * 0000555: monteverdi -in does not work with JP2 images
     * 0000560: Monteverdi compilation error
     * 0000527: While saving dataset with rescaling option,
-               the channels n° > 3 are incorrect
+               the channels nb > 3 are incorrect
 
   * OTB-applications
     * 0000518: Missing GDAL dependencies
diff --git a/Utilities/Data/CMakeLists.txt b/Utilities/Data/CMakeLists.txt
deleted file mode 100644
index d406057..0000000
--- a/Utilities/Data/CMakeLists.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-if (UNIX AND NOT APPLE)
-
-# -------------------------
-# Install icons
-# following freedesktop recommandations
-# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
-
-# The different icon sizes installed
-# According to the specs, the 48x48 icon is mandatory, others are optional
-set( icon_sizes 16 32 48 128 )
-foreach( icon_size ${icon_sizes} )
-  install(FILES Icons/monteverdi-${icon_size}x${icon_size}.png
-          DESTINATION share/icons/hicolor/${icon_size}x${icon_size}/apps
-          RENAME monteverdi.png
-          COMPONENT Resources)
-endforeach()
-
-# Fallback on "/usr/share/pixmaps"
-# See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout
-install(FILES Icons/monteverdi-32x32.png
-        DESTINATION share/pixmaps
-        RENAME monteverdi.png
-        COMPONENT Resources)
-
-install(FILES Icons/monteverdi-splash.png
-        DESTINATION share/pixmaps
-        RENAME monteverdi-splash.png
-        COMPONENT Resources)
-
-
-install(FILES Icons/monteverdi-32x32.xpm
-        DESTINATION share/pixmaps
-        RENAME monteverdi.xpm
-        COMPONENT Resources)
-
-# -------------------------
-# Install freedesktop entry
-
-install(FILES monteverdi.desktop
-        DESTINATION share/applications
-        COMPONENT Resources)
-
-endif()
diff --git a/Utilities/Data/Icons/edit-clear.png b/Utilities/Data/Icons/edit-clear.png
new file mode 100644
index 0000000..e6c8e8b
Binary files /dev/null and b/Utilities/Data/Icons/edit-clear.png differ
diff --git a/Utilities/Data/Icons/layer-delete.png b/Utilities/Data/Icons/layer-delete.png
new file mode 100644
index 0000000..7d6aaf6
Binary files /dev/null and b/Utilities/Data/Icons/layer-delete.png differ
diff --git a/Utilities/Data/Icons/layer-delete_24x24.png b/Utilities/Data/Icons/layer-delete_24x24.png
deleted file mode 100644
index bf57b11..0000000
Binary files a/Utilities/Data/Icons/layer-delete_24x24.png and /dev/null differ
diff --git a/Utilities/Data/Icons/layers-remove_24x24.png b/Utilities/Data/Icons/layers-remove_24x24.png
index 8e27130..2e2a29e 100644
Binary files a/Utilities/Data/Icons/layers-remove_24x24.png and b/Utilities/Data/Icons/layers-remove_24x24.png differ
diff --git a/Utilities/Data/Icons/view-refresh.png b/Utilities/Data/Icons/view-refresh.png
new file mode 100644
index 0000000..3fd71d6
Binary files /dev/null and b/Utilities/Data/Icons/view-refresh.png differ
diff --git a/Utilities/Data/monteverdi.desktop b/Utilities/Data/monteverdi.desktop.in
similarity index 64%
rename from Utilities/Data/monteverdi.desktop
rename to Utilities/Data/monteverdi.desktop.in
index 7664bb1..ee8b5f1 100644
--- a/Utilities/Data/monteverdi.desktop
+++ b/Utilities/Data/monteverdi.desktop.in
@@ -4,10 +4,11 @@ Name=Monteverdi
 Name[fr_FR]=Monteverdi
 GenericName=Image processing
 Comment=Remote sensing image processing application based on OrfeoToolbox
-TryExec=/usr/bin/monteverdi
-Exec=/usr/bin/monteverdi %F
+TryExec=@CMAKE_INSTALL_PREFIX@/bin/monteverdi
+Exec=env OTB_APPLICATION_PATH=@CMAKE_INSTALL_PREFIX@/@OTB_INSTALL_APP_DIR@ @CMAKE_INSTALL_PREFIX@/bin/monteverdi %F
 Terminal=false
 StartupNotify=false
 Icon=monteverdi
 Categories=Education;Science;ImageProcessing;Geography;Qt;
 MimeType=image/tiff;image/jpeg;image/jp2;application/x-esri-shape;
+Keywords=otb;orfeo;toolbox;osgeo;
diff --git a/Utilities/Maintenance/TravisBuild.cmake b/Utilities/Maintenance/TravisBuild.cmake
index c0790ff..b5eab4f 100644
--- a/Utilities/Maintenance/TravisBuild.cmake
+++ b/Utilities/Maintenance/TravisBuild.cmake
@@ -57,17 +57,17 @@ OTB_USE_QT4:BOOL=ON
 OTB_USE_OPENGL:BOOL=ON
 OTB_USE_GLEW:BOOL=ON
 CMAKE_C_FLAGS:STRING=-Wextra
-CMAKE_CXX_FLAGS:STRING=-Wextra -Wno-gnu-static-float-init -Wno-\\#warnings
+CMAKE_CXX_FLAGS:STRING=-Wextra -Wno-gnu-static-float-init -Wno-\\#warnings -std=c++11
 CMAKE_BUILD_TYPE=${CTEST_BUILD_CONFIGURATION}
 QT_INSTALL_TRANSLATIONS:PATH=${XDK_INSTALL_DIR}/translations
 QT_MOC_EXECUTABLE:FILEPATH=${XDK_INSTALL_DIR}/bin/moc
 QT_UIC_EXECUTABLE:FILEPATH=${XDK_INSTALL_DIR}/bin/uic
 QT_RCC_EXECUTABLE:FILEPATH=${XDK_INSTALL_DIR}/bin/rcc
+QT_LRELEASE_EXECUTABLE:FILEPATH=${XDK_INSTALL_DIR}/bin/lrelease
 QT_INSTALL_PLUGINS:PATH=${XDK_INSTALL_DIR}/plugins
 QT_INSTALL_HEADERS:PATH=${XDK_INSTALL_DIR}/include
 QMAKE_MKSPECS:PATH=${XDK_INSTALL_DIR}/mkspecs
 "
-
 )
 file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" ${INITIAL_CACHE})
 
diff --git a/i18n/fr_FR.ts b/i18n/fr_FR.ts
index 3127cae..1779a7f 100644
--- a/i18n/fr_FR.ts
+++ b/i18n/fr_FR.ts
@@ -213,6 +213,46 @@ Veuillez, s'il vous plait, supprimer votre répertoire de cache Monteverdi.
         <source>512</source>
         <translation>512</translation>
     </message>
+    <message>
+        <source>Lookup table (jet)</source>
+        <translation>Table de couleur (jet)</translation>
+    </message>
+    <message>
+        <source>Local lookup table (jet)</source>
+        <translation>Table de couleur locale (jet)</translation>
+    </message>
+    <message>
+        <source>Lookup table (hot)</source>
+        <translation>Table de couleur (hot)</translation>
+    </message>
+    <message>
+        <source>Local lookup table (hot)</source>
+        <translation>Table de couleur locale (hot)</translation>
+    </message>
+    <message>
+        <source>Lookup table (winter)</source>
+        <translation>Table de couleur (winter)</translation>
+    </message>
+    <message>
+        <source>Local lookup table (winter)</source>
+        <translation>Table de couleur locale (winter)</translation>
+    </message>
+    <message>
+        <source>Lookup table (summer)</source>
+        <translation>Table de couleur (summer)</translation>
+    </message>
+    <message>
+        <source>Local lookup table (summer)</source>
+        <translation>Table de couleur locale (summer)</translation>
+    </message>
+    <message>
+        <source>Lookup table (cool)</source>
+        <translation>Table de couleur (cool)</translation>
+    </message>
+    <message>
+        <source>Local lookup table (cool)</source>
+        <translation>Table de couleur locale (cool)</translation>
+    </message>
 </context>
 <context>
     <name>mvd::AboutDialog</name>
@@ -621,6 +661,10 @@ Veuillez, s'il vous plait, supprimer votre répertoire de cache Monteverdi.
         <source>Gamma: </source>
         <translation>Gamma : </translation>
     </message>
+    <message>
+        <source>Reset value to 1.</source>
+        <translation>Réinitialiser à 1.</translation>
+    </message>
 </context>
 <context>
     <name>mvd::ColorSetupController</name>
@@ -1027,7 +1071,7 @@ Veuillez, s'il vous plait, supprimer votre répertoire de cache Monteverdi.
     </message>
     <message>
         <source>Zero relevant pixels found when computing histogram (probably because of no-data settings)</source>
-        <translation>Aucun pixel utilisable lors du calcul d'histogramme (probablement à cause des réglages no-data)</translation>
+        <translation>Aucun pixel utilisable lors du calcul d'histogramme (probablement à cause des réglages no-data)</translation>
     </message>
 </context>
 <context>
@@ -1262,7 +1306,7 @@ Veuillez, s'il vous plait, supprimer votre répertoire de cache Monteverdi.
     </message>
     <message>
         <source>Cannot access settings file.</source>
-        <translation>Impossible d'accéder au fichiers des paramètres</translation>
+        <translation>Impossible d'accéder au fichiers des paramètres</translation>
     </message>
     <message>
         <source>Bad settings file format.</source>
@@ -3614,11 +3658,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>I</source>
-        <translation>I</translation>
+        <translation type="obsolete">I</translation>
     </message>
     <message>
         <source>J</source>
-        <translation>J</translation>
+        <translation type="obsolete">J</translation>
     </message>
     <message>
         <source>Red</source>
@@ -3640,6 +3684,14 @@ p, li { white-space: pre-wrap; }
         <source>Y</source>
         <translation>Y</translation>
     </message>
+    <message>
+        <source>Column</source>
+        <translation>Colonne</translation>
+    </message>
+    <message>
+        <source>Line</source>
+        <translation>Ligne</translation>
+    </message>
 </context>
 <context>
     <name>mvd::LayerStackWidget</name>
@@ -3688,6 +3740,10 @@ p, li { white-space: pre-wrap; }
         <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
         <translation></translation>
     </message>
+    <message>
+        <source>Reset all layer effects to Normal</source>
+        <translation>Réinitialiser tous les effets à Normal</translation>
+    </message>
 </context>
 <context>
     <name>mvd::MainWindow</name>
@@ -4080,6 +4136,14 @@ Charger '%1' provoquera l'affichage des couches dans une vue non
         <source>Ctrl+P</source>
         <translation>Ctrl+P</translation>
     </message>
+    <message>
+        <source>OpenGL texture</source>
+        <translation>Texture OpenGL</translation>
+    </message>
+    <message>
+        <source>Use OpenGL Shading Language (GLSL)</source>
+        <translation>Utiliser OpenGL Shading Language (GLSL)</translation>
+    </message>
 </context>
 <context>
     <name>mvd::MainWindowTitleLoader</name>
@@ -4637,7 +4701,7 @@ Merci d'en sélectionner un autre.</translation>
     </message>
     <message>
         <source>mvd</source>
-        <translation>mvd</translation>
+        <translation type="obsolete">mvd</translation>
     </message>
     <message>
         <source>Rendering effects have been disabled because OpenGL Shading Language minimal requirements have not been met while running on this system.</source>
@@ -4753,11 +4817,11 @@ Merci d'en sélectionner un autre.</translation>
     </message>
     <message>
         <source>Read tag '%1' does not match expected tag '%2'.</source>
-        <translation>L'étiquette lue '%1' ne correspond pas à l'étiquette attendue '%2'.</translation>
+        <translation>L'étiquette lue '%1' ne correspond pas à l'étiquette attendue '%2'.</translation>
     </message>
     <message>
         <source>Invalid tag name '%1'.</source>
-        <translation>Nom d'étiquette invalide '%1'.</translation>
+        <translation>Nom d'étiquette invalide '%1'.</translation>
     </message>
     <message>
         <source>Array dimension (%1) does not match expected dimension (%2).</source>
@@ -4765,31 +4829,31 @@ Merci d'en sélectionner un autre.</translation>
     </message>
     <message>
         <source>Histogram sample count (%1) does not match written sample count (%2).</source>
-        <translation>Le nombre d'échantillons dans l'histrogramme (%1) ne correspond pas au nombre d'échantillons écrits (%2).</translation>
+        <translation>Le nombre d'échantillons dans l'histrogramme (%1) ne correspond pas au nombre d'échantillons écrits (%2).</translation>
     </message>
     <message>
         <source>Histogram mins dimension (%1) does not match expected dimension (%2).</source>
-        <translation>La taille des minima d'histogramme (%1) ne correspond pas à la taille attendue (%2).</translation>
+        <translation>La taille des minima d'histogramme (%1) ne correspond pas à la taille attendue (%2).</translation>
     </message>
     <message>
         <source>Histogram maxs dimension (%1) does not match expected dimension (%2).</source>
-        <translation>La taille des maxima d'histogramme (%1) ne correspond pas à la taille attendue (%2).</translation>
+        <translation>La taille des maxima d'histogramme (%1) ne correspond pas à la taille attendue (%2).</translation>
     </message>
     <message>
         <source>Histogram dimension (%1) does not match expected dimension (%2).</source>
-        <translation>La taille de l'histogramme (%1) ne correspond pas à la taille attendue (%2).</translation>
+        <translation>La taille de l'histogramme (%1) ne correspond pas à la taille attendue (%2).</translation>
     </message>
     <message>
         <source>Histogram bin count (%1) does not match expected bin count (%2).</source>
-        <translation>Le nombre de barres dans l'histogramme (%1) ne correspond pas à la valeur attendue (%2).</translation>
+        <translation>Le nombre de barres dans l'histogramme (%1) ne correspond pas à la valeur attendue (%2).</translation>
     </message>
     <message>
         <source>Histogram sample count (%1) does not match expected sample count (%2).</source>
-        <translation>Le nombre d'échantillons dans l'histogramme (%1) ne correspond pas à la valeur attendue (%2).</translation>
+        <translation>Le nombre d'échantillons dans l'histogramme (%1) ne correspond pas à la valeur attendue (%2).</translation>
     </message>
     <message>
         <source>Read sample count (histogram) (%1) does not match written sample count (%2).</source>
-        <translation>Le nombre d'échantillons lus (histrogramme) (%1) ne correspond pas au nombre d'échantillons écrits (%2).</translation>
+        <translation>Le nombre d'échantillons lus (histrogramme) (%1) ne correspond pas au nombre d'échantillons écrits (%2).</translation>
     </message>
 </context>
 <context>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/otb.git



More information about the Pkg-grass-devel mailing list