[otb] 02/15: Imported Upstream version 5.8.0+dfsg

Bas Couwenberg sebastic at debian.org
Tue Nov 8 21:29:58 UTC 2016


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

sebastic pushed a commit to branch master
in repository otb.

commit 224d52713c5fe7e8773ea040b0cb4cb6576861ef
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Nov 8 18:40:43 2016 +0100

    Imported Upstream version 5.8.0+dfsg
---
 CMake/CPackFunctions.cmake                         |  389 +
 CMake/CTestCustom.cmake.in                         |    1 +
 CMake/DeployQtConf.cmake                           |   18 +
 CMake/DeployQtConfScript.cmake                     |    3 +
 CMake/Description.txt                              |   13 +
 CMake/FindGBenchmark.cmake                         |    2 +-
 CMake/FindLibSVM.cmake                             |    2 +-
 CMake/FindOpenCV.cmake                             |  108 +
 CMake/FindQwt.cmake                                |  118 +
 CMake/FindShark.cmake                              |   74 +
 CMake/MonteverdiApplicationMacros.cmake            |   25 +
 CMake/OTBCheckCpp11Keywords.cmake                  |   84 +-
 CMake/OTBCheckTargetSystemArch.cmake               |   51 +
 CMake/OTBModuleEnablement.cmake                    |    3 +
 CMake/OTBModuleExternal.cmake                      |   10 +-
 CMake/OTBModuleHeaderTest.cmake                    |    4 +-
 CMake/OTBModuleMacros.cmake                        |   27 +-
 CMake/OTBSetStandardCompilerFlags.cmake            |   69 +-
 CMake/SourceStatus.cmake                           |   10 +-
 CMake/UseJava.cmake                                |    4 +-
 CMake/UseOTB.cmake                                 |   11 +-
 CMake/cmake_uninstall.cmake.in                     |   28 +
 CMake/i18n_qt4.cmake                               |  101 +
 CMake/otbTestNullPtr.cpp                           |    6 -
 CMake/otbTestNumpy.py                              |    2 +-
 CMake/otbTestOverride.cpp                          |   22 -
 CMake/otbTestUniquePtr.cpp                         |   14 -
 CMake/otbcli.sh.in                                 |   13 +-
 CMake/otbcli_app.sh.in                             |    6 +-
 CMake/otbgui.sh.in                                 |   13 +-
 CMake/otbgui_app.sh.in                             |    6 +-
 CMake/qt.conf.in                                   |    3 +
 CMakeLists.txt                                     |   80 +-
 CTestConfig.cmake                                  |    4 +-
 .../BasicFilters/BandMathXImageFilterExample.cxx   |    4 +-
 .../BasicFilters/PrintableImageFilterExample.cxx   |    2 +-
 .../KullbackLeiblerProfileChDet.cxx                |    2 +-
 .../KMeansImageClassificationExample.cxx           |    2 +-
 .../SOMImageClassificationExample.cxx              |    2 +-
 Examples/DimensionReduction/ICAExample.cxx         |    2 +-
 .../FineRegistrationImageFilterExample.cxx         |    2 +-
 .../DisparityMap/NCCRegistrationFilterExample.cxx  |    2 +-
 .../SimpleDisparityMapEstimationExample.cxx        |   10 +-
 .../AssymmetricFusionOfLineDetectorExample.cxx     |  225 -
 .../AsymmetricFusionOfLineDetectorExample.cxx      |  225 +
 Examples/FeatureExtraction/CMakeLists.txt          |    4 +-
 .../ComplexMomentsImageFunctionExample.cxx         |    2 +-
 Examples/FeatureExtraction/EdgeDensityExample.cxx  |    4 +-
 Examples/FeatureExtraction/ExtractRoadExample.cxx  |    2 +-
 .../ExtractSegmentsByStepsExample.cxx              |   10 +-
 .../FeatureExtraction/ExtractSegmentsExample.cxx   |   10 +-
 .../LineSegmentDetectorExample.cxx                 |    2 +-
 .../RightAngleDetectionExample.cxx                 |    2 +-
 Examples/FeatureExtraction/SFSExample.cxx          |    2 +-
 Examples/FeatureExtraction/SeamCarvingExample.cxx  |    4 +-
 .../FeatureExtraction/SeamCarvingOtherExample.cxx  |    2 +-
 .../ThresholdToPointSetExample.cxx                 |    4 +-
 .../FeatureExtraction/TouziEdgeDetectorExample.cxx |    2 +-
 Examples/FeatureExtraction/test/CMakeLists.txt     |    6 +-
 .../Filtering/CannyEdgeDetectionImageFilter.cxx    |    2 +-
 Examples/IO/DEMHandlerExample.cxx                  |    4 +-
 Examples/IO/HDFReaderExample.cxx                   |    4 +-
 Examples/IO/ImageToKmzAndMapFileProductExample.cxx |    4 +-
 Examples/IO/StreamingImageReadWrite.cxx            |    2 +-
 Examples/IO/TileMapImageIOExample.cxx              |    2 +-
 Examples/Learning/SEMModelEstimatorExample.cxx     |    6 +-
 Examples/Learning/SOMClassifierExample.cxx         |    2 +-
 Examples/Learning/SOMExample.cxx                   |    4 +-
 .../SVMGenericKernelImageClassificationExample.cxx |    2 +-
 .../SVMGenericKernelImageModelEstimatorExample.cxx |    6 +-
 .../Learning/SVMImageClassificationExample.cxx     |    2 +-
 ...SVMImageEstimatorClassificationMultiExample.cxx |    4 +-
 .../Learning/SVMImageModelEstimatorExample.cxx     |    2 +-
 Examples/Markov/CMakeLists.txt                     |    4 +-
 Examples/Markov/MarkovClassification1Example.cxx   |   12 +-
 Examples/Markov/MarkovClassification2Example.cxx   |    2 +-
 Examples/Markov/MarkovClassification3Example.cxx   |    6 +-
 Examples/Markov/MarkovRegularizationExample.cxx    |    2 +-
 Examples/Markov/MarkovRestaurationExample.cxx      |  249 -
 Examples/Markov/MarkovRestorationExample.cxx       |  249 +
 Examples/Markov/test/CMakeLists.txt                |   10 +-
 .../MorphologicalPyramidSegmentationExample.cxx    |    2 +-
 .../MorphologicalPyramidSegmenterExample.cxx       |    4 +-
 Examples/OBIA/HooverMetricsEstimation.cxx          |    4 +-
 Examples/OBIA/LabelMapToVectorData.cxx             |    2 +-
 .../EstimateAffineTransformationExample.cxx        |    2 +-
 .../Projections/EstimateRPCSensorModelExample.cxx  |    2 +-
 Examples/Projections/MapProjectionExample.cxx      |    2 +-
 Examples/Projections/OrthoRectificationExample.cxx |    2 +-
 Examples/Projections/SensorModelExample.cxx        |    2 +-
 Examples/Projections/test/CMakeLists.txt           |    2 +-
 .../AtmosphericCorrectionSequencement.cxx          |    6 +-
 Examples/Radiometry/test/CMakeLists.txt            |    2 +-
 Examples/Segmentation/FastMarchingImageFilter.cxx  |    4 +-
 .../OtsuMultipleThresholdImageFilter.cxx           |    2 +-
 .../StreamingMeanShiftSegmentation.cxx             |    8 +-
 .../Simulation/LAIAndPROSAILToSensorResponse.cxx   |    6 +-
 Examples/Simulation/LAIFromNDVIImageTransform.cxx  |    4 +-
 Examples/Simulation/ProsailModel.cxx               |    8 +-
 Examples/Simulation/test/CMakeLists.txt            |    8 +-
 Examples/Tutorials/FilteringPipeline.cxx           |    2 +-
 Examples/Tutorials/Multispectral.cxx               |    2 +-
 Examples/Tutorials/OrthoFusion.cxx                 |    2 +-
 Examples/Tutorials/ScalingPipeline.cxx             |    2 +-
 .../BoostAdapters/include/otbStringUtils.h         |   17 +-
 .../include/otb_boost_math_normal_header.h         |    1 +
 .../Adapters/CurlAdapters/include/otbCurlHelper.h  |   10 +-
 .../CurlAdapters/include/otbCurlHelperInterface.h  |    3 +-
 Modules/Adapters/CurlAdapters/otb-module.cmake     |    1 +
 .../Adapters/CurlAdapters/src/otbCurlHelper.cxx    |   11 +-
 .../GdalAdapters/include/otbGeometriesSet.h        |    2 +-
 .../GdalAdapters/include/otbGeometriesSource.h     |    4 +-
 .../include/otbGeometriesToGeometriesFilter.h      |   25 +-
 .../GdalAdapters/include/otbOGRDataSourceWrapper.h |   10 +-
 .../GdalAdapters/include/otbOGRDriversInit.h       |    4 +-
 .../GdalAdapters/include/otbOGRFeatureWrapper.h    |    4 +-
 .../GdalAdapters/include/otbOGRFieldWrapper.h      |   22 +-
 .../GdalAdapters/include/otbOGRFieldWrapper.txx    |    1 +
 .../GdalAdapters/include/otbOGRGeometryWrapper.h   |   38 +-
 .../Adapters/GdalAdapters/include/otbOGRHelpers.h  |    6 +-
 .../GdalAdapters/include/otbOGRLayerWrapper.h      |   21 +-
 .../GdalAdapters/include/otbOGRVersionProxy.h      |   21 +-
 Modules/Adapters/GdalAdapters/otb-module.cmake     |    1 +
 .../src/otbGeometriesToGeometriesFilter.cxx        |    6 +-
 .../GdalAdapters/src/otbOGRDataSourceWrapper.cxx   |   13 +-
 .../GdalAdapters/src/otbOGRFieldWrapper.cxx        |    5 +
 .../GdalAdapters/src/otbOGRLayerWrapper.cxx        |    6 +
 .../GdalAdapters/src/otbOGRVersionProxy2x.cxx      |    2 +-
 Modules/Adapters/GdalAdapters/test/CMakeLists.txt  |    5 +-
 .../OSSIMAdapters/include/otbDEMConvertAdapter.h   |    4 +-
 .../Adapters/OSSIMAdapters/include/otbDEMHandler.h |    6 +-
 .../OSSIMAdapters/include/otbDateTimeAdapter.h     |   23 +-
 .../OSSIMAdapters/include/otbEllipsoidAdapter.h    |    8 +-
 .../include/otbFilterFunctionValues.h              |    4 +-
 .../include/otbGeometricSarSensorModelAdapter.h    |    4 +-
 .../OSSIMAdapters/include/otbImageKeywordlist.h    |   12 +-
 .../include/otbMapProjectionAdapter.h              |   22 +-
 .../OSSIMAdapters/include/otbMetaDataKey.h         |   59 +-
 .../include/otbPlatformPositionAdapter.h           |    4 +-
 .../OSSIMAdapters/include/otbRPCSolverAdapter.h    |    3 +-
 .../OSSIMAdapters/include/otbSensorModelAdapter.h  |    6 +-
 Modules/Adapters/OSSIMAdapters/otb-module.cmake    |    1 +
 .../OSSIMAdapters/src/otbFilterFunctionValues.cxx  |    2 +-
 .../OSSIMAdapters/src/otbMapProjectionAdapter.cxx  |   12 +-
 .../OSSIMAdapters/src/otbSensorModelAdapter.cxx    |    4 +-
 Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt |   37 +-
 .../test/otbMapProjectionAdapterTest.cxx           |   24 +-
 .../test/otbOSSIMAdaptersTestDriver.cxx            |    2 +-
 .../test/otbOssimJpegFileResourceLeakTest.cxx      |   63 +
 .../test/otbOssimJpegFileRessourceLeakTest.cxx     |   63 -
 .../OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx |    6 +-
 .../OpenThreadsAdapters/include/otbThreads.h       |    2 +-
 Modules/Adapters/QtAdapters/CMakeLists.txt         |    6 +
 .../Adapters/QtAdapters/include/otbQtAdapters.h    |  216 +
 Modules/Adapters/QtAdapters/otb-module.cmake       |    7 +
 Modules/Adapters/QtAdapters/src/CMakeLists.txt     |   20 +
 Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx  |  207 +
 Modules/Adapters/QtAdapters/test/CMakeLists.txt    |    3 +
 .../AppClassification/app/CMakeLists.txt           |    5 +
 .../app/otbClassificationMapRegularization.cxx     |   19 +
 .../app/otbComputeConfusionMatrix.cxx              |   33 +-
 .../app/otbComputeImagesStatistics.cxx             |    3 +
 .../app/otbFusionOfClassifications.cxx             |   10 +-
 .../app/otbMultiImageSamplingRate.cxx              |  370 +
 .../app/otbPolygonClassStatistics.cxx              |    3 +-
 .../AppClassification/app/otbSampleExtraction.cxx  |    2 +
 .../AppClassification/app/otbSampleSelection.cxx   |  139 +-
 .../app/otbTrainImagesClassifier.cxx               |    4 +-
 .../app/otbTrainVectorClassifier.cxx               |  173 +-
 .../include/otbLearningApplicationBase.h           |   47 +-
 .../include/otbLearningApplicationBase.txx         |   15 +
 .../include/otbTrainSharkRandomForests.txx         |   98 +
 .../AppClassification/test/CMakeLists.txt          |   96 +-
 .../app/otbHomologousPointsExtraction.cxx          |   10 +-
 .../app/otbDimensionalityReduction.cxx             |    5 +-
 .../AppEdge/app/otbLineSegmentDetection.cxx        |    4 +
 .../app/otbHyperspectralUnmixing.cxx               |    4 -
 .../AppImageUtils/app/otbColorMapping.cxx          |    7 +-
 .../AppImageUtils/app/otbCompareImages.cxx         |    8 +-
 .../Applications/AppImageUtils/app/otbConvert.cxx  |    5 +-
 .../AppImageUtils/app/otbDownloadSRTMTiles.cxx     |    2 +-
 .../AppImageUtils/app/otbExtractROI.cxx            |    2 +-
 .../AppImageUtils/app/otbReadImageInfo.cxx         |   20 +-
 .../Applications/AppImageUtils/app/otbRescale.cxx  |    2 +-
 .../AppImageUtils/app/otbSplitImage.cxx            |    2 +-
 .../AppMathParserX/app/otbBandMathX.cxx            |   10 +-
 .../app/otbOpticalCalibration.cxx                  |   25 +-
 .../app/otbConvertCartoToGeoPoint.cxx              |    6 +-
 .../app/otbConvertSensorToGeoPoint.cxx             |    2 +-
 .../app/otbGenerateRPCSensorModel.cxx              |    2 +-
 .../app/otbGridBasedImageResampling.cxx            |    4 +-
 .../AppProjection/app/otbOrthoRectification.cxx    |    8 +-
 .../AppProjection/app/otbRefineSensorModel.cxx     |    2 +-
 .../app/otbRigidTransformResample.cxx              |    2 +-
 .../AppProjection/app/otbSuperimpose.cxx           |    4 +-
 .../app/otbVectorDataReprojection.cxx              |    2 +-
 .../Applications/AppProjection/test/CMakeLists.txt |    4 +-
 .../app/otbSARPolarMatrixConvert.cxx               |    2 +-
 .../AppSARPolarSynth/app/otbSARPolarSynth.cxx      |   24 +-
 .../app/otbConnectedComponentSegmentation.cxx      |    5 +-
 .../app/otbLSMSSmallRegionsMerging.cxx             |    4 +
 .../AppSegmentation/app/otbLSMSVectorization.cxx   |    4 +
 .../AppSegmentation/app/otbSegmentation.cxx        |    2 +-
 .../AppSegmentation/test/CMakeLists.txt            |    4 +-
 .../AppStereo/app/otbFineRegistration.cxx          |   22 +-
 .../AppStereo/app/otbGeneratePlyFile.cxx           |    4 +-
 .../AppStereo/app/otbStereoFramework.cxx           |   14 +-
 .../app/otbStereoRectificationGridGenerator.cxx    |    5 +-
 Modules/Applications/AppStereo/test/CMakeLists.txt |    1 +
 .../app/otbRasterization.cxx                       |    4 +-
 .../AppVectorUtils/test/CMakeLists.txt             |   21 +-
 Modules/Core/Common/CMakeLists.txt                 |    1 +
 Modules/Core/Common/include/otbCast.h              |   96 +
 .../Core/Common/include/otbConfigurationManager.h  |    8 +-
 Modules/Core/Common/include/otbFilterWatcherBase.h |    6 +-
 .../Core/Common/include/otbFunctionToImageFilter.h |    4 +
 .../otbImageAndVectorImageOperationFilter.h        |   34 +-
 .../include/otbImageRegionAdaptativeSplitter.h     |    2 +-
 ...ImageRegionNonUniformMultidimensionalSplitter.h |    2 +-
 .../Common/include/otbImageRegionTileMapSplitter.h |    2 +-
 Modules/Core/Common/include/otbMacro.h             |   15 +-
 .../Core/Common/include/otbModelComponentBase.h    |    2 +-
 .../Core/Common/include/otbRGBAPixelConverter.h    |    2 +-
 Modules/Core/Common/include/otbRectangle.h         |    2 +-
 Modules/Core/Common/include/otbRectangle.txx       |    4 +-
 .../Core/Common/include/otbStandardFilterWatcher.h |    2 +-
 .../include/otbStandardOneLineFilterWatcher.h      |    2 +-
 .../Core/Common/include/otbStandardWriterWatcher.h |    2 +-
 Modules/Core/Common/include/otbSystem.h            |   13 +-
 Modules/Core/Common/include/otbUtils.h             |    5 +-
 .../include/otbVariableLengthVectorConverter.h     |    2 +-
 Modules/Core/Common/include/otbWriterWatcherBase.h |    4 +-
 Modules/Core/Common/otb-module.cmake               |    1 +
 Modules/Core/Common/src/otbConfigure.h.in          |   13 +-
 Modules/Core/Common/src/otbSystem.cxx              |    2 +-
 Modules/Core/Common/test/otbSystemTest.cxx         |    2 +-
 Modules/Core/ImageBase/include/otbImageIOBase.h    |   14 +-
 Modules/Core/ImageBase/otb-module.cmake            |    1 +
 .../otbImageAndVectorImageOperationFilterTest.cxx  |    2 +-
 .../include/otbBSplineDecompositionImageFilter.txx |    8 +-
 .../include/otbBSplineInterpolateImageFunction.h   |    6 +-
 .../include/otbBSplineInterpolateImageFunction.txx |    2 +-
 .../include/otbGenericInterpolateImageFunction.h   |    2 +-
 .../include/otbGenericInterpolateImageFunction.txx |    4 +-
 .../otbWindowedSincInterpolateImageFunctionBase.h  |    2 +-
 .../Core/Interpolation/test/otbStreamingTraits.cxx |   36 +-
 .../otbLabelMapFeaturesFunctorImageFilter.h        |    2 +-
 .../include/otbLabelMapToLabelImageFilter.h        |    2 +-
 .../include/otbLabelMapToSampleListFilter.txx      |    2 +-
 .../LabelMap/include/otbLabelMapWithAdjacency.h    |    4 +-
 .../LabelMap/include/otbLabelObjectFieldsFunctor.h |    2 +-
 .../otbLabelObjectWithClassLabelFieldsFunctor.h    |    2 +-
 .../include/otbShapeAttributesLabelMapFilter.h     |    2 +-
 .../include/otbShapeAttributesLabelMapFilter.txx   |    4 +-
 .../otbStatisticsAttributesLabelMapFilter.h        |    2 +-
 .../otbBandsStatisticsAttributesLabelMapFilter.cxx |    2 +-
 .../otbImageToLabelMapWithAttributesFilter.cxx     |    2 +-
 .../test/otbKMeansAttributesLabelMapFilter.cxx     |    2 +-
 .../test/otbMinMaxAttributesLabelMapFilter.cxx     |    2 +-
 .../test/otbNormalizeAttributesLabelMapFilter.cxx  |    2 +-
 .../include/otbDefaultImageMetadataInterface.h     |    6 +-
 .../otbDefaultImageMetadataInterfaceFactory.h      |    4 +-
 .../include/otbFormosatImageMetadataInterface.h    |    2 +-
 .../otbFormosatImageMetadataInterfaceFactory.h     |    4 +-
 .../include/otbIkonosImageMetadataInterface.h      |    2 +-
 .../otbIkonosImageMetadataInterfaceFactory.h       |    4 +-
 .../include/otbImageMetadataInterfaceBase.h        |   12 +-
 .../include/otbImageMetadataInterfaceFactory.h     |    2 +-
 Modules/Core/Metadata/include/otbNoDataHelper.h    |   27 +-
 .../otbOpticalDefaultImageMetadataInterface.h      |    4 +-
 ...tbOpticalDefaultImageMetadataInterfaceFactory.h |    4 +-
 .../include/otbOpticalImageMetadataInterface.h     |    2 +-
 .../otbOpticalImageMetadataInterfaceFactory.h      |    2 +-
 .../include/otbPleiadesImageMetadataInterface.h    |    2 +-
 .../otbPleiadesImageMetadataInterfaceFactory.h     |    4 +-
 .../include/otbQuickBirdImageMetadataInterface.h   |    2 +-
 .../otbQuickBirdImageMetadataInterfaceFactory.h    |    4 +-
 .../include/otbRadarsat2ImageMetadataInterface.h   |    4 +-
 .../otbRadarsat2ImageMetadataInterfaceFactory.h    |    3 +-
 .../Metadata/include/otbSarCalibrationLookupData.h |    4 +-
 .../include/otbSarDefaultImageMetadataInterface.h  |    4 +-
 .../otbSarDefaultImageMetadataInterfaceFactory.h   |    4 +-
 .../include/otbSarImageMetadataInterface.h         |    3 +-
 .../include/otbSarImageMetadataInterfaceFactory.h  |    2 +-
 .../include/otbSentinel1ImageMetadataInterface.h   |    4 +-
 .../otbSentinel1ImageMetadataInterfaceFactory.h    |    4 +-
 .../include/otbSpot6ImageMetadataInterface.h       |    2 +-
 .../otbSpot6ImageMetadataInterfaceFactory.h        |    4 +-
 .../include/otbSpotImageMetadataInterface.h        |    2 +-
 .../include/otbSpotImageMetadataInterfaceFactory.h |    4 +-
 .../include/otbTerraSarImageMetadataInterface.h    |    2 +-
 .../otbTerraSarImageMetadataInterfaceFactory.h     |    4 +-
 .../include/otbWorldView2ImageMetadataInterface.h  |    2 +-
 .../otbWorldView2ImageMetadataInterfaceFactory.h   |    4 +-
 Modules/Core/Metadata/otb-module.cmake             |    1 +
 .../src/otbFormosatImageMetadataInterface.cxx      |  470 +-
 .../src/otbIkonosImageMetadataInterface.cxx        |  460 +-
 .../Metadata/src/otbImageMetadataInterfaceBase.cxx |   27 +-
 .../src/otbQuickBirdImageMetadataInterface.cxx     |  540 +-
 .../src/otbSpot6ImageMetadataInterface.cxx         | 7407 ++++++++++++--------
 .../Metadata/src/otbSpotImageMetadataInterface.cxx |  729 +-
 .../src/otbTerraSarImageMetadataInterface.cxx      |   18 +-
 .../test/otbDefaultImageMetadataInterface.cxx      |   96 +-
 .../test/otbImageMetadataInterfaceBaseTest.cxx     |    4 +-
 .../Core/ObjectList/include/otbImageListSource.h   |    2 +-
 .../ObjectList/include/otbImageListToImageFilter.h |    2 +-
 .../include/otbImageListToImageListFilter.h        |    2 +-
 .../ObjectList/include/otbImageToImageListFilter.h |    2 +-
 .../include/otbObjectListToObjectListFilter.txx    |    2 +-
 .../PointSet/include/otbImageToPointSetFilter.txx  |    2 +-
 .../include/otbPointSetAndValuesFunction.h         |    2 +-
 .../SpatialObjects/include/otbLineSpatialObject.h  |    2 +-
 .../test/otbLineSpatialObjectNew.cxx               |    3 +-
 .../include/otbPipelineMemoryPrintCalculator.h     |    4 +-
 .../otbRAMDrivenAdaptativeStreamingManager.h       |    2 +-
 Modules/Core/Streaming/otb-module.cmake            |    1 +
 .../Transform/include/otbGenericMapProjection.h    |   12 +-
 .../Transform/include/otbGenericMapProjection.txx  |    4 +-
 .../Core/Transform/include/otbGenericRSTransform.h |    9 +-
 .../Transform/include/otbGenericRSTransform.txx    |   10 +-
 .../include/otbGeoInformationConversion.h          |    7 +-
 .../otbImageToGenericRSOutputParameters.txx        |    4 +-
 .../include/otbStreamingWarpImageFilter.txx        |    2 +-
 Modules/Core/Transform/include/otbTransform.h      |    2 +-
 Modules/Core/Transform/otb-module.cmake            |    1 +
 .../test/otbCreateInverseForwardSensorModel.cxx    |    2 +-
 .../Transform/test/otbGenericMapProjection.cxx     |    2 +-
 .../Core/Transform/test/otbGenericRSTransform.cxx  |   20 +-
 .../test/otbGenericRSTransformWithSRID.cxx         |   20 +-
 ...amingResampleImageFilterWithAffineTransform.cxx |    2 +-
 Modules/Core/VectorDataBase/include/otbPolygon.h   |    8 +-
 Modules/Core/VectorDataBase/include/otbPolygon.txx |    8 +-
 .../VectorDataBase/include/otbVectorDataIOBase.h   |    6 +-
 .../include/otbVectorDataKeywordlist.h             |    5 +-
 .../include/otbVectorDataProperties.txx            |    2 +-
 .../VectorDataBase/include/otbVectorDataSource.h   |    4 +-
 Modules/Core/VectorDataBase/otb-module.cmake       |    1 +
 .../test/otbDescriptorsListSampleGenerator.cxx     |    6 +-
 .../include/otbGenericRoadExtractionFilter.h       |    2 +-
 .../RoadExtraction/include/otbLinkPathListFilter.h |    6 +-
 .../include/otbLinkPathListFilter.txx              |    6 +-
 .../include/otbNeighborhoodScalarProductFilter.txx |    2 +-
 .../include/otbParallelLinePathListFilter.h        |    6 +-
 .../include/otbParallelLinePathListFilter.txx      |    6 +-
 .../include/otbRemoveTortuousPathListFilter.h      |    2 +-
 .../include/otbSimplifyPathListFilter.h            |    4 +-
 .../Detection/RoadExtraction/test/CMakeLists.txt   |   12 +-
 ...neSpatialObjectListToRightAnglePointSetFilter.h |    2 +-
 ...SpatialObjectListToRightAnglePointSetFilter.txx |    2 +-
 .../otbVectorDataToRightAngleVectorDataFilter.h    |    2 +-
 ...oRightAnglePointSetFilterByStepsOutputAscii.cxx |    2 +-
 .../otbImageToHessianDeterminantImageFilter.txx    |    2 +-
 .../include/otbImageToSURFKeyPointSetFilter.txx    |    2 +-
 .../include/otbKeyPointSetsMatchingFilter.h        |    2 +-
 .../Descriptors/include/otbSiftFastImageFilter.h   |    6 +-
 Modules/Feature/Descriptors/test/CMakeLists.txt    |    9 +-
 ...otbAssymmetricFusionOfLineDetectorImageFilter.h |    2 +
 .../otbAsymmetricFusionOfLineDetectorImageFilter.h |  108 +
 ...tbAsymmetricFusionOfLineDetectorImageFilter.txx |   79 +
 .../include/otbHorizontalSobelVectorImageFilter.h  |    2 +-
 .../Edge/include/otbLineSegmentDetector.txx        |    4 +-
 .../Edge/include/otbSobelVectorImageFilter.h       |    2 +-
 .../include/otbStreamingLineSegmentDetector.txx    |    2 +-
 .../Edge/include/otbTouziEdgeDetectorImageFilter.h |    4 +-
 .../include/otbVerticalSobelVectorImageFilter.h    |    2 +-
 Modules/Feature/Edge/test/CMakeLists.txt           |   18 +-
 .../test/otbAssymmetricFusionOfLineDetector.cxx    |   72 -
 .../test/otbAssymmetricFusionOfLineDetectorNew.cxx |   51 -
 .../test/otbAsymmetricFusionOfLineDetector.cxx     |   72 +
 .../test/otbAsymmetricFusionOfLineDetectorNew.cxx  |   51 +
 Modules/Feature/Edge/test/otbEdgeTestDriver.cxx    |    4 +-
 .../include/otbComplexMomentsImageFunction.txx     |   18 +-
 .../include/otbFlusserMomentsImageFunction.txx     |    2 +-
 .../Moments/include/otbHuMomentsImageFunction.txx  |    2 +-
 .../include/otbRadiometricMomentsImageFilter.h     |    2 +-
 .../include/otbGreyLevelCooccurrenceIndexedList.h  |    6 +-
 .../include/otbHaralickTexturesImageFunction.txx   |    2 +-
 .../otbScalarImageToAdvancedTexturesFilter.h       |    2 +-
 .../otbScalarImageToPanTexTextureFilter.txx        |    2 +-
 .../include/otbScalarImageToTexturesFilter.h       |    2 +-
 .../include/otbScalarImageToTexturesFilter.txx     |    4 +-
 .../test/otbGreyLevelCooccurrenceIndexedList.cxx   |    2 +-
 .../otbKullbackLeiblerDistanceImageFilter.h        |    2 +-
 ...tbMultivariateAlterationDetectorImageFilter.txx |    2 +-
 .../test/otbKullbackLeiblerDistanceImageFilter.cxx |    2 +-
 .../test/otbKullbackLeiblerProfileImageFilter.cxx  |    2 +-
 .../ColorMap/include/otbReliefColormapFunctor.txx  |    8 +-
 .../Convolution/include/otbGaborFilterGenerator.h  |    6 +-
 .../Filtering/DEM/include/otbDEMToImageGenerator.h |   12 +-
 .../DEM/include/otbDEMToImageGenerator.txx         |    8 +-
 .../test/otbDEMToImageGeneratorFromImageTest.cxx   |    2 +-
 .../otbEstimateInnerProductPCAImageFilter.h        |    2 +-
 .../include/otbLocalActivityVectorImageFilter.h    |    2 +-
 .../include/otbSparseWvltToAngleMapperListFilter.h |    2 +-
 ...otbBinaryFunctorNeighborhoodVectorImageFilter.h |    2 +-
 .../include/otbFlexibleDistanceWithMissingValue.h  |    4 +-
 .../include/otbGridResampleImageFilter.h           |    2 +-
 .../include/otbImageToNoDataMaskFilter.h           |    8 +
 .../include/otbImageToVectorImageCastFilter.h      |    2 +-
 .../include/otbLocalGradientVectorImageFilter.h    |    2 +-
 .../include/otbMaskedIteratorDecorator.txx         |    2 +-
 .../include/otbMatrixImageFilter.h                 |    2 +-
 .../include/otbPrintableImageFilter.h              |    2 +-
 .../include/otbShiftScaleImageAdaptor.h            |    4 +-
 .../include/otbSpectralAngleDistanceImageFilter.h  |    2 +-
 ...tbStreamingMatrixTransposeMatrixImageFilter.txx |    6 -
 .../include/otbStreamingResampleImageFilter.txx    |    4 +-
 .../include/otbStreamingShrinkImageFilter.h        |   17 +-
 .../include/otbStreamingShrinkImageFilter.txx      |   46 +-
 .../otbUnaryFunctorNeighborhoodImageFilter.h       |    2 +-
 .../test/otbChangeNoDataValueFilter.cxx            |    2 +-
 .../test/otbExtractROIResample.cxx                 |    2 +-
 .../test/otbImageToNoDataMaskFilter.cxx            |    2 +-
 .../test/otbLog10ThresholdedImageFilterTest.cxx    |    2 +-
 .../test/otbMaskedIteratorDecorator.cxx            |    4 +-
 .../ImageNoise/include/otbFrostImageFilter.h       |    2 +-
 .../MathParserX/include/otbBandMathXImageFilter.h  |    4 +-
 .../include/otbBandMathXImageFilter.txx            |  212 +-
 Modules/Filtering/MathParserX/include/otbParserX.h |    4 +
 .../MathParserX/include/otbParserXPlugins.h        |    2 +-
 Modules/Filtering/MathParserX/src/otbParserX.cxx   |   22 +
 .../MathParserX/test/otbBandMathXImageFilter.cxx   |   21 +-
 .../otbMorphologicalPyramidAnalysisFilter.txx      |    2 +-
 .../otbMorphologicalPyramidSegmentationFilter.h    |    4 +-
 .../include/otbMorphologicalPyramidSegmenter.h     |    2 +-
 .../otbMorphologicalPyramidSynthesisFilter.h       |    2 +-
 .../Filtering/Path/include/otbClosePathFunctor.h   |    2 +-
 .../include/otbImageFittingPolygonListFilter.txx   |    2 +-
 .../Path/include/otbImageToEdgePathFilter.h        |    5 +-
 .../Path/include/otbImageToEdgePathFilter.txx      |    6 +-
 .../Path/include/otbPathListToHistogramGenerator.h |    2 +-
 .../include/otbReciprocalHAlphaImageFilter.h       |    2 +-
 .../include/otbGCPsToRPCSensorModelImageFilter.h   |    2 +-
 .../include/otbGCPsToRPCSensorModelImageFilter.txx |    4 +-
 .../include/otbGenericRSResampleImageFilter.h      |    4 +-
 .../include/otbGenericRSResampleImageFilter.txx    |   10 +-
 .../Projection/include/otbGeographicalDistance.h   |    4 +-
 .../Projection/include/otbGeographicalDistance.txx |    6 +-
 .../include/otbGeometriesProjectionFilter.h        |   17 +-
 .../include/otbGroundSpacingImageFunction.h        |   12 +-
 .../include/otbGroundSpacingImageFunction.txx      |    2 +-
 .../include/otbImageToEnvelopeVectorDataFilter.txx |    2 +-
 .../otbLeastSquareAffineTransformEstimator.h       |   12 +-
 .../otbPhysicalToRPCSensorModelImageFilter.txx     |    2 +-
 .../otbPleiadesPToXSAffineTransformCalculator.h    |    9 +-
 .../Projection/include/otbRationalTransform.h      |    8 +-
 .../Projection/include/otbUtmMapProjection.txx     |    2 +-
 .../include/otbVectorDataProjectionFilter.h        |   12 +-
 .../include/otbVectorDataProjectionFilter.txx      |   12 +-
 .../include/otbVectorDataTransformFilter.txx       |    2 +-
 Modules/Filtering/Projection/otb-module.cmake      |    1 +
 .../src/otbGeometriesProjectionFilter.cxx          |   12 +-
 Modules/Filtering/Projection/test/CMakeLists.txt   |   54 +-
 ...CPsToRPCSensorModelImageFilterCheckRpcModel.cxx |    2 +-
 .../test/otbGenericRSResampleImageFilter.cxx       |    8 +-
 .../test/otbGenericRSTransformFromImage.cxx        |   26 +-
 .../test/otbGenericRSTransformGenericTest.cxx      |    4 +-
 .../Projection/test/otbGeographicalDistance.cxx    |    8 +-
 .../otbPhysicalToRPCSensorModelImageFilter.cxx     |    2 +-
 .../Projection/test/otbROIdataConversion.cxx       |   16 +-
 .../Projection/test/otbROIdataConversionNew.cxx    |    6 +-
 .../Filtering/Projection/test/otbSensorModel.cxx   |    8 +-
 .../test/otbTileImageFilterRSTransformTest.cxx     |    4 +-
 .../test/otbVectorDataTransformFilter.cxx          |   10 +-
 .../include/otbMeanShiftSmoothingImageFilter.h     |    2 +-
 .../include/otbMeanShiftSmoothingImageFilter.txx   |    4 +-
 .../otbListSampleToBalancedListSampleFilter.txx    |    2 +-
 .../include/otbListSampleToListSampleFilter.h      |    2 +-
 .../include/otbNormalizeVectorImageFilter.h        |    2 +-
 .../Statistics/include/otbPatternSampler.h         |    4 +-
 .../Statistics/include/otbPeriodicSampler.h        |    4 +-
 .../Statistics/include/otbRandomSampler.h          |    4 +-
 .../Filtering/Statistics/include/otbSamplerBase.h  |    2 +-
 .../otbStreamingHistogramVectorImageFilter.txx     |   14 +-
 .../otbStreamingStatisticsVectorImageFilter.txx    |    2 +-
 .../include/otbVectorImageToIntensityImageFilter.h |    2 +-
 .../Filtering/Statistics/src/otbPatternSampler.cxx |    7 +-
 .../Filtering/Statistics/src/otbSamplerBase.cxx    |   29 +-
 .../include/otbCorrectPolygonFunctor.h             |    2 +-
 ...nousWithNeighborhoodDataNodeFeatureFunction.txx |    2 +-
 .../include/otbSimplifyPathFunctor.h               |    2 +-
 .../otbSpectralAngleDataNodeFeatureFunction.txx    |    2 +-
 .../include/otbVectorDataExtractROI.h              |    4 +-
 .../include/otbVectorDataExtractROI.txx            |    6 +-
 .../test/otbConcatenateVectorDataFilter.cxx        |    2 +-
 .../include/otbVectorDataToMapFilter.h             |    2 +-
 .../test/otbVectorDataToMapFilterWorld.cxx         |    6 +
 .../Wavelet/include/otbSubsampleImageFilter.h      |    2 +-
 .../Wavelet/include/otbWaveletFilterBank.h         |    6 +-
 .../Wavelet/include/otbWaveletFilterBank.txx       |    9 +-
 .../Wavelet/include/otbWaveletGenerator.h          |    2 +-
 .../Filtering/Wavelet/include/otbWaveletOperator.h |    2 +-
 .../include/otbWaveletPacketDecompositionCosts.h   |    2 +-
 .../Wavelet/include/otbWaveletPacketTransform.h    |    8 +-
 .../Wavelet/include/otbWaveletPacketTransform.txx  |    2 +-
 .../Filtering/Wavelet/src/otbWaveletGenerator.cxx  |    2 +-
 .../Filtering/Wavelet/test/otbWaveletTransform.cxx |    1 +
 .../include/otbFuzzyDescriptorsModelManager.h      |    2 +-
 .../Fuzzy/src/otbFuzzyDescriptorsModelManager.cxx  |    2 +-
 .../otbNeighborhoodMajorityVotingImageFilter.h     |   35 +
 .../otbNeighborhoodMajorityVotingImageFilter.txx   |  134 +-
 Modules/Fusion/MajorityVoting/test/CMakeLists.txt  |    9 +-
 .../test/otbMajorityVotingTestDriver.cxx           |    1 +
 ...tbNeighborhoodMajorityVotingImageFilterTest.cxx |   98 +
 .../Unmixing/include/otbISRAUnmixingImageFilter.h  |    2 +-
 .../Unmixing/include/otbMDMDNMFImageFilter.txx     |    2 +-
 .../Unmixing/include/otbNCLSUnmixingImageFilter.h  |    2 +-
 .../include/otbSparseUnmixingImageFilter.h         |    2 +-
 Modules/IO/Carto/include/otbCoordinateToName.h     |    3 +-
 .../include/otbImageToOSMVectorDataGenerator.h     |    2 +-
 .../include/otbImageToOSMVectorDataGenerator.txx   |    2 +-
 Modules/IO/Carto/include/otbMapFileProductWriter.h |    6 +-
 .../IO/Carto/include/otbMapFileProductWriter.txx   |    6 +-
 .../include/otbOSMDataToVectorDataGenerator.h      |    5 +-
 Modules/IO/Carto/include/otbPlaceNameToLonLat.h    |    3 +-
 Modules/IO/Carto/otb-module.cmake                  |    1 +
 .../Carto/src/otbOSMDataToVectorDataGenerator.cxx  |    8 +-
 .../test/otbImageToOSMVectorDataGenerator.cxx      |    6 +-
 .../include/otbExtendedFilenameHelper.h            |    6 +-
 .../include/otbExtendedFilenameToReaderOptions.h   |   12 +-
 .../include/otbExtendedFilenameToWriterOptions.h   |   12 +-
 .../src/otbExtendedFilenameHelper.cxx              |    2 +-
 .../src/otbExtendedFilenameToReaderOptions.cxx     |   16 +-
 .../src/otbExtendedFilenameToWriterOptions.cxx     |   16 +-
 Modules/IO/IOBSQ/include/otbBSQImageIO.h           |    4 +-
 Modules/IO/IOBSQ/src/otbBSQImageIO.cxx             |    8 +-
 Modules/IO/IOGDAL/include/otbGDALImageIO.h         |   12 +-
 Modules/IO/IOGDAL/include/otbGDALImageIOFactory.h  |    4 +-
 .../IO/IOGDAL/include/otbGDALOverviewsBuilder.h    |    9 +-
 Modules/IO/IOGDAL/include/otbOGRIOHelper.h         |    6 +-
 Modules/IO/IOGDAL/include/otbOGRVectorDataIO.h     |    4 +-
 .../IO/IOGDAL/include/otbOGRVectorDataIOFactory.h  |    3 +-
 Modules/IO/IOGDAL/otb-module.cmake                 |    1 +
 Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx  |   10 +-
 Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx           |    8 +-
 Modules/IO/IOGDAL/src/otbOGRVectorDataIO.cxx       |    5 +-
 Modules/IO/IOGDAL/test/CMakeLists.txt              |    6 +-
 .../test/otbGDALImageIOTestWriteMetadata.cxx       |    2 +-
 Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h |    4 +-
 Modules/IO/IOLUM/include/otbLUMImageIO.h           |    4 +-
 Modules/IO/IOMW/include/otbMWImageIO.h             |    4 +-
 Modules/IO/IOONERA/include/otbONERAImageIO.h       |    4 +-
 Modules/IO/IORAD/include/otbRADImageIO.h           |    4 +-
 Modules/IO/IORAD/src/otbRADImageIO.cxx             |    8 +-
 Modules/IO/IOTileMap/include/otbTileMapImageIO.h   |   10 +-
 .../IOTileMap/include/otbTileMapImageIOFactory.h   |    3 +-
 .../IO/IOTileMap/include/otbTileMapImageIOHelper.h |    6 +-
 Modules/IO/IOTileMap/otb-module.cmake              |    1 +
 Modules/IO/IOTileMap/src/otbTileMapImageIO.cxx     |   30 +-
 .../IO/IOXML/include/otbStatisticsXMLFileReader.h  |    2 +-
 Modules/IO/ImageIO/include/otbImageFileReader.h    |    9 +-
 Modules/IO/ImageIO/include/otbImageFileReader.txx  |  160 +-
 Modules/IO/ImageIO/include/otbImageFileWriter.h    |    4 +-
 Modules/IO/ImageIO/include/otbImageFileWriter.txx  |   27 +-
 .../IO/ImageIO/include/otbImageSeriesFileReader.h  |   16 +-
 .../ImageIO/include/otbImageSeriesFileReader.txx   |    6 +-
 .../ImageIO/include/otbImageSeriesFileReaderBase.h |    6 +-
 .../include/otbImageSeriesFileReaderBase.txx       |    6 +-
 Modules/IO/ImageIO/test/CMakeLists.txt             |   12 +-
 .../otbVectorImageFileWriterTestWithoutInput.cxx   |    4 +-
 ...torImageStreamingFileWriterTestWithoutInput.cxx |    4 +-
 Modules/IO/KMZWriter/include/otbKmzProductWriter.h |    2 +-
 .../IO/KMZWriter/include/otbKmzProductWriter.txx   |    4 +-
 Modules/IO/KMZWriter/test/otbKmzProductWriter.cxx  |    4 +-
 Modules/IO/TestKernel/include/otbTestHelper.h      |   25 +-
 Modules/IO/TestKernel/include/otbTestMain.h        |    3 +-
 Modules/IO/TestKernel/src/otbTestHelper.cxx        |  697 +-
 Modules/IO/TestKernel/test/CMakeLists.txt          |    9 +
 .../IO/TestKernel/test/otbCompareAsciiTests6.cxx   |   48 +
 .../IO/TestKernel/test/otbTestKernelTestDriver.cxx |    1 +
 .../VectorDataIO/include/otbVectorDataFileReader.h |    2 +-
 .../include/otbVectorDataFileReader.txx            |    8 +-
 .../otbVectorDataToDSValidatedVectorDataFilter.h   |    4 +-
 .../test/otbJointMassOfBeliefFilter.cxx            |    2 +-
 .../LearningBase/include/otbSEMClassifier.h        |    2 +-
 .../LearningBase/include/otbSEMClassifier.txx      |    4 +-
 .../Markov/include/otbMarkovRandomFieldFilter.h    |    4 +-
 Modules/Learning/Markov/test/otbMRFSamplerMAP.cxx  |    2 +-
 .../Learning/Markov/test/otbMRFSamplerRandom.cxx   |    2 +-
 .../Markov/test/otbMRFSamplerRandomMAP.cxx         |    2 +-
 .../include/otbCzihoSOMLearningBehaviorFunctor.h   |    2 +-
 Modules/Learning/SOM/include/otbPeriodicSOM.h      |    2 +-
 Modules/Learning/SOM/include/otbSOM.h              |    6 +-
 .../SOM/include/otbSOMLearningBehaviorFunctor.h    |    2 +-
 .../Learning/SVMLearning/include/otbSVMModel.txx   |    6 +-
 Modules/Learning/SVMLearning/test/CMakeLists.txt   |   16 +-
 .../SVMLearning/test/otbLabelMapSVMClassifier.cxx  |    2 +-
 .../test/otbObjectDetectionClassifier.cxx          |    6 +-
 .../include/otbImageSampleExtractorFilter.h        |   16 +-
 .../include/otbImageSampleExtractorFilter.txx      |   26 +-
 .../include/otbOGRDataToSamplePositionFilter.h     |   17 +-
 .../include/otbOGRDataToSamplePositionFilter.txx   |   52 +-
 .../include/otbPersistentSamplingFilterBase.h      |   55 +-
 .../include/otbPersistentSamplingFilterBase.txx    |  289 +-
 .../Sampling/include/otbSamplingRateCalculator.h   |   14 +-
 .../include/otbSamplingRateCalculatorList.h        |  111 +
 Modules/Learning/Sampling/src/CMakeLists.txt       |    1 +
 .../Sampling/src/otbSamplingRateCalculator.cxx     |  164 +-
 .../Sampling/src/otbSamplingRateCalculatorList.cxx |  431 ++
 Modules/Learning/Sampling/test/CMakeLists.txt      |   14 +
 .../test/otbOGRDataToSamplePositionFilterTest.cxx  |    3 +
 .../test/otbSamplingRateCalculatorListTest.cxx     |  226 +
 .../Sampling/test/otbSamplingTestDriver.cxx        |    2 +
 .../include/otbBoostMachineLearningModel.h         |    6 +-
 .../include/otbBoostMachineLearningModel.txx       |    2 +-
 .../Supervised/include/otbCvRTreesWrapper.h        |   16 +-
 .../include/otbDecisionTreeMachineLearningModel.h  |    5 +-
 .../otbDecisionTreeMachineLearningModel.txx        |    2 +-
 .../otbGradientBoostedTreeMachineLearningModel.h   |    6 +-
 .../otbGradientBoostedTreeMachineLearningModel.txx |    2 +-
 .../include/otbImageClassificationFilter.h         |    9 +-
 .../include/otbImageClassificationFilter.txx       |  144 +-
 .../otbKNearestNeighborsMachineLearningModel.h     |    8 +-
 .../otbKNearestNeighborsMachineLearningModel.txx   |    2 +-
 .../include/otbLibSVMMachineLearningModel.h        |    5 +-
 .../include/otbLibSVMMachineLearningModel.txx      |    2 +-
 .../Supervised/include/otbMachineLearningModel.h   |   67 +-
 .../Supervised/include/otbMachineLearningModel.txx |  121 +-
 .../include/otbMachineLearningModelFactory.h       |    2 +-
 .../include/otbMachineLearningModelFactory.txx     |   24 +-
 .../include/otbMachineLearningModelFactoryBase.h   |    3 +-
 .../include/otbNeuralNetworkMachineLearningModel.h |    5 +-
 .../otbNeuralNetworkMachineLearningModel.txx       |    2 +-
 .../include/otbNormalBayesMachineLearningModel.h   |    6 +-
 .../include/otbNormalBayesMachineLearningModel.txx |    2 +-
 .../Learning/Supervised/include/otbOpenCVUtils.h   |    2 +-
 .../include/otbRandomForestsMachineLearningModel.h |    8 +-
 .../otbRandomForestsMachineLearningModel.txx       |    6 +-
 .../otbRandomForestsMachineLearningModelFactory.h  |    2 +-
 .../include/otbSVMMachineLearningModel.h           |    6 +-
 .../include/otbSVMMachineLearningModel.txx         |    2 +-
 .../otbSharkRandomForestsMachineLearningModel.h    |  172 +
 .../otbSharkRandomForestsMachineLearningModel.txx  |  248 +
 ...SharkRandomForestsMachineLearningModelFactory.h |   74 +
 ...arkRandomForestsMachineLearningModelFactory.txx |   70 +
 .../Learning/Supervised/include/otbSharkUtils.h    |  124 +
 Modules/Learning/Supervised/otb-module.cmake       |    4 +-
 Modules/Learning/Supervised/src/CMakeLists.txt     |    1 +
 .../Learning/Supervised/src/otbCvRTreesWrapper.cxx |    2 +-
 Modules/Learning/Supervised/test/CMakeLists.txt    |    9 +-
 .../test/otbConfusionMatrixCalculatorTest.cxx      |    6 +-
 .../test/otbImageClassificationFilter.cxx          |   26 +
 .../test/otbMachineLearningModelCanRead.cxx        |   83 +-
 .../test/otbMachineLearningRegressionTests.cxx     |    2 +
 .../test/otbSharkImageClassificationFilter.cxx     |  162 +
 .../Supervised/test/otbSupervisedTestDriver.cxx    |    9 +-
 .../test/otbTrainMachineLearningModel.cxx          |  252 +
 .../Learning/Supervised/test/tests-libsvm.cmake    |    5 +-
 .../Learning/Supervised/test/tests-opencv.cmake    |   32 +-
 Modules/Learning/Supervised/test/tests-shark.cmake |   61 +
 Modules/MPI/MPIConfig/include/otbMPIConfig.h       |    2 +-
 .../include/otbSimpleParallelTiffWriter.h          |    2 +-
 .../include/otbSimpleParallelTiffWriter.txx        |    2 +-
 .../RCC8/include/otbImageListToRCC8GraphFilter.h   |    2 +-
 .../otbImageMultiSegmentationToRCC8GraphFilter.h   |    2 +-
 .../RCC8/include/otbImageToImageRCC8Calculator.txx |    8 +-
 .../RCC8/include/otbPolygonListToRCC8GraphFilter.h |    4 +-
 .../include/otbPolygonListToRCC8GraphFilter.txx    |    2 +-
 Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h    |    2 +-
 Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.txx  |    2 +-
 Modules/OBIA/RCC8/include/otbRCC8Graph.h           |    4 +-
 Modules/OBIA/RCC8/include/otbRCC8Graph.txx         |    2 +-
 Modules/OBIA/RCC8/include/otbRCC8GraphSource.h     |    2 +-
 Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h  |    2 +-
 .../OBIA/RCC8/include/otbRCC8InEdgeIterator.txx    |    2 +-
 .../Indices/include/otbLandsatTMIndices.h          |    4 +-
 .../OpticalCalibration/include/otbAeronetData.h    |    3 +-
 .../include/otbAeronetFileReader.h                 |    8 +-
 .../include/otbAtmosphericCorrectionParameters.h   |    3 +-
 .../include/otbAtmosphericRadiativeTerms.h         |    5 +-
 .../include/otbImageMetadataCorrectionParameters.h |    3 +-
 .../include/otbImageToReflectanceImageFilter.h     |    8 +-
 .../include/otbLuminanceToImageImageFilter.h       |    2 +-
 .../include/otbLuminanceToReflectanceImageFilter.h |    8 +-
 ...rrectionParametersToAtmosphericRadiativeTerms.h |    2 +-
 .../include/otbReflectanceToImageImageFilter.h     |    8 +-
 .../include/otbReflectanceToLuminanceImageFilter.h |    8 +-
 .../OpticalCalibration/include/otbSIXSTraits.h     |    3 +-
 .../include/otbSpectralSensitivityReader.h         |    3 +-
 ...bSurfaceAdjacencyEffectCorrectionSchemeFilter.h |    2 +-
 .../include/otbWavelengthSpectralBands.h           |    3 +-
 .../Radiometry/OpticalCalibration/otb-module.cmake |    1 +
 .../OpticalCalibration/src/otbSIXSTraits.cxx       |    8 +-
 .../OpticalCalibration/test/CMakeLists.txt         |  108 +-
 .../include/otbSarBrightnessFunction.txx           |   24 +-
 .../include/otbSarBrightnessToImageFilter.h        |    2 +
 .../include/otbSarBrightnessToImageFilter.txx      |   31 +-
 .../include/otbSarParametricMapFunction.h          |    2 +-
 .../include/otbSarRadiometricCalibrationFunction.h |    2 +-
 .../otbSarRadiometricCalibrationFunction.txx       |   11 +-
 .../otbSarRadiometricCalibrationToImageFilter.h    |    4 +-
 .../otbSarRadiometricCalibrationToImageFilter.txx  |    4 +-
 .../Simulation/include/otbAtmosphericEffects.txx   |    2 +-
 .../include/otbImageSimulationMethod.txx           |    2 +-
 .../Simulation/include/otbLeafParameters.h         |    4 +-
 .../Simulation/include/otbProspectModel.h          |    4 +-
 .../include/otbReduceSpectralResponse.txx          |    4 +-
 .../Radiometry/Simulation/include/otbSailModel.h   |    4 +-
 Modules/Radiometry/Simulation/otb-module.cmake     |    1 +
 .../Simulation/test/otbReduceSpectralResponse.cxx  |    6 +-
 .../otbReduceSpectralResponseClassifierRAndNIR.cxx |    4 +-
 .../otbReduceSpectralResponseSVMClassifier.cxx     |    8 +-
 .../include/otbDisparityMapEstimationMethod.h      |    2 +-
 .../include/otbDisparityMapMedianFilter.txx        |    2 +-
 .../include/otbDisparityMapTo3DFilter.h            |    4 +-
 .../include/otbDisparityMapTo3DFilter.txx          |    8 +-
 .../include/otbDisparityMapToDEMFilter.h           |    4 +-
 .../include/otbDisparityMapToDEMFilter.txx         |   10 +-
 .../include/otbDisparityTranslateFilter.h          |    4 +-
 .../include/otbFineRegistrationImageFilter.h       |   23 +-
 .../include/otbFineRegistrationImageFilter.txx     |  191 +-
 .../include/otbMultiDisparityMapTo3DFilter.h       |    4 +-
 .../include/otbMultiDisparityMapTo3DFilter.txx     |    6 +-
 .../include/otbPixelWiseBlockMatchingImageFilter.h |    4 +-
 .../otbPixelWiseBlockMatchingImageFilter.txx       |    4 +-
 .../include/otbSubPixelDisparityImageFilter.h      |    4 +-
 .../Registration/DisparityMap/test/CMakeLists.txt  |   12 +-
 .../test/otbFineRegistrationImageFilterTest.cxx    |    2 +-
 .../test/otbPixelWiseBlockMatchingImageFilter.cxx  |    2 +-
 ...nterpolateTransformDisplacementFieldGenerator.h |    2 +-
 ...tSetWithTransformToDisplacementFieldGenerator.h |    2 +-
 .../Stereo/include/otbAdhesionCorrectionFilter.txx |    2 +-
 .../Stereo/include/otbBijectionCoherencyFilter.h   |    4 +-
 .../Stereo/include/otbLineOfSightOptimizer.h       |    2 +-
 .../Stereo/include/otbMulti3DMapToDEMFilter.h      |    4 +-
 .../Stereo/include/otbMulti3DMapToDEMFilter.txx    |   47 +-
 .../otbStereoSensorModelToElevationMapFilter.h     |    8 +-
 .../otbStereoSensorModelToElevationMapFilter.txx   |   12 +-
 ...otbStereorectificationDisplacementFieldSource.h |    2 +-
 ...bStereorectificationDisplacementFieldSource.txx |   12 +-
 Modules/Remote/Mosaic.remote.cmake                 |    2 +-
 Modules/Remote/SertitObject.remote.cmake           |    4 +-
 Modules/Remote/otb-bv.remote.cmake                 |    9 +
 Modules/Remote/otbFFSforGMM.remote.cmake           |    9 +
 Modules/Remote/phenotb.remote.cmake                |   11 +
 Modules/Remote/temporal-gapfilling.remote.cmake    |   10 +
 ...ComponentSegmentationOBIAToVectorDataFilter.txx |    2 +-
 .../include/otbLabelImageToOGRDataSourceFilter.txx |    8 +-
 .../include/otbLabelImageToVectorDataFilter.txx    |    8 +-
 .../include/otbLabelMapToVectorDataFilter.h        |    4 +-
 .../include/otbLabelMapToVectorDataFilter.txx      |    2 +-
 .../otbVectorDataToLabelMapWithAttributesFilter.h  |    2 +-
 .../test/otbPolygonizationRasterizationTest.cxx    |    2 +-
 .../otbLabelizeConfidenceConnectedImageFilter.h    |    6 +-
 .../otbLabelizeConnectedThresholdImageFilter.h     |    2 +-
 .../otbLabelizeNeighborhoodConnectedImageFilter.h  |    4 +-
 ...anShiftConnectedComponentSegmentationFilter.txx |    2 +-
 ...MorphologyIterativeDecompositionImageFilter.txx |    2 +-
 .../include/otbImageToProfileFilter.h              |    2 +-
 .../include/otbMorphologicalClosingProfileFilter.h |    2 +-
 .../include/otbMorphologicalOpeningProfileFilter.h |    2 +-
 ...MultiScaleConvexOrConcaveClassificationFilter.h |    2 +-
 ...leDerivativeToMultiScaleCharacteristicsFilter.h |    2 +-
 ...bStreamingImageToOGRLayerSegmentationFilter.txx |    4 +-
 .../include/otbWatershedSegmentationFilter.txx     |    2 +-
 Modules/ThirdParty/Boost/CMakeLists.txt            |   11 +-
 Modules/ThirdParty/Boost/otb-module-init.cmake     |    9 +-
 Modules/ThirdParty/GDAL/otb-module-init.cmake      |    8 +
 Modules/ThirdParty/GLFW/otb-module-init.cmake      |    4 -
 Modules/ThirdParty/Glew/CMakeLists.txt             |    2 +-
 .../itkImageRegionMultidimensionalSplitter.h       |    2 +-
 .../itkImageRegionMultidimensionalSplitter.hxx     |   20 +-
 .../ITK/include/itkImageRegionSplitter.h           |    2 +-
 .../ThirdParty/ITK/include/otbWarpImageFilter.h    |    2 +-
 Modules/ThirdParty/MuParserX/CMakeLists.txt        |   19 -
 Modules/ThirdParty/MuParserX/src/mpCompat.h.in     |   25 +-
 Modules/ThirdParty/OpenCV/CMakeLists.txt           |    6 +-
 Modules/ThirdParty/OssimPlugins/src/CMakeLists.txt |   37 +-
 .../src/ossim/AlosPalsar/AlosPalsarData.cpp        |    2 +-
 .../AlosPalsar/AlosPalsarDataFileDescriptor.h      |    2 +-
 .../ossim/AlosPalsar/AlosPalsarDataSetSummary.h    |    2 +-
 .../src/ossim/AlosPalsar/AlosPalsarFacilityData.h  |    2 +-
 .../ossim/AlosPalsar/AlosPalsarFileDescriptor.h    |   10 +-
 .../src/ossim/AlosPalsar/AlosPalsarLeader.cpp      |    2 +-
 .../ossim/AlosPalsar/AlosPalsarMapProjectionData.h |    2 +-
 .../AlosPalsar/AlosPalsarPlatformPositionData.h    |    2 +-
 .../ossim/AlosPalsar/AlosPalsarRadiometricData.h   |    2 +-
 .../src/ossim/AlosPalsar/AlosPalsarRecord.h        |    2 +-
 .../ossim/AlosPalsar/AlosPalsarRecordFactory.cpp   |    4 +-
 .../src/ossim/AlosPalsar/AlosPalsarRecordFactory.h |    6 +-
 .../src/ossim/AlosPalsar/AlosPalsarSignalData.h    |    2 +-
 .../ossim/EnvisatAsar/AntennaElevationPatterns.h   |    2 +-
 .../src/ossim/EnvisatAsar/ChirpParameters.h        |    2 +-
 .../ossim/EnvisatAsar/DopplerCentroidParameters.h  |    2 +-
 .../src/ossim/EnvisatAsar/EnvisatAsarData.cpp      |    8 +-
 .../src/ossim/EnvisatAsar/EnvisatAsarRecord.h      |    2 +-
 .../ossim/EnvisatAsar/EnvisatAsarRecordFactory.cpp |    4 +-
 .../ossim/EnvisatAsar/EnvisatAsarRecordFactory.h   |    4 +-
 .../src/ossim/EnvisatAsar/GeolocationGrid.h        |    2 +-
 .../ossim/EnvisatAsar/MainProcessingParameters.h   |    2 +-
 .../OssimPlugins/src/ossim/EnvisatAsar/SQ_ADSR.h   |    2 +-
 .../ossim/EnvisatAsar/SRGRConversionParameters.h   |    2 +-
 .../OssimPlugins/src/ossim/EnvisatAsar/dsd.h       |    2 +-
 .../OssimPlugins/src/ossim/EnvisatAsar/mph.cpp     |    3 +-
 .../OssimPlugins/src/ossim/EnvisatAsar/mph.h       |  165 +-
 .../OssimPlugins/src/ossim/EnvisatAsar/sph.h       |    2 +-
 .../src/ossim/RadarSat/CommonRecord/AttitudeData.h |    2 +-
 .../CommonRecord/DataHistogramSignalData.h         |    2 +-
 .../src/ossim/RadarSat/CommonRecord/DataQuality.h  |    2 +-
 .../ossim/RadarSat/CommonRecord/DataSetSummary.h   |    2 +-
 .../ossim/RadarSat/CommonRecord/FileDescriptor.h   |   10 +-
 .../RadarSat/CommonRecord/ProcessingParameters.h   |    2 +-
 .../CommonRecord/RadiometricCompensationData.h     |    2 +-
 .../ossim/RadarSat/CommonRecord/RadiometricData.h  |    2 +-
 .../OssimPlugins/src/ossim/RadarSat/Data/Data.cpp  |    6 +-
 .../RadarSat/Data/ImageOptionsFileDescriptor.h     |    2 +-
 .../src/ossim/RadarSat/Data/ProcessedDataRecord.h  |    2 +-
 .../RadarSat/Leader/DataHistogramProcessedData.h   |    2 +-
 .../src/ossim/RadarSat/Leader/Leader.cpp           |    4 +-
 .../ossim/RadarSat/Leader/PlatformPositionData.h   |    2 +-
 .../src/ossim/RadarSat/RadarSatRecord.h            |    2 +-
 .../src/ossim/RadarSat/RadarSatRecordFactory.cpp   |    4 +-
 .../src/ossim/RadarSat/RadarSatRecordFactory.h     |    6 +-
 .../src/ossim/RadarSat/Trailer/Trailer.cpp         |    2 +-
 .../ossim/RadarSat/VolumeDir/FilePointerRecord.h   |    2 +-
 .../src/ossim/RadarSat/VolumeDir/TextRecord.h      |    2 +-
 .../RadarSat/VolumeDir/VolumeDescriptorRecord.h    |    2 +-
 .../src/ossim/RadarSat/VolumeDir/VolumeDir.cpp     |    2 +-
 .../src/ossim/erssar/ErsSarDataSetSummary.h        |    2 +-
 .../src/ossim/erssar/ErsSarFacilityData.h          |    2 +-
 .../src/ossim/erssar/ErsSarFileDescriptor.h        |   10 +-
 .../OssimPlugins/src/ossim/erssar/ErsSarLeader.cpp |    2 +-
 .../src/ossim/erssar/ErsSarMapProjectionData.h     |    2 +-
 .../src/ossim/erssar/ErsSarPlatformPositionData.h  |    2 +-
 .../OssimPlugins/src/ossim/erssar/ErsSarRecord.h   |    2 +-
 .../src/ossim/erssar/ErsSarRecordFactory.cpp       |    4 +-
 .../src/ossim/erssar/ErsSarRecordFactory.h         |    6 +-
 .../src/ossim/ossimEnvisatAsarModel.cpp            |    3 +-
 .../src/ossim/ossimPluginProjectionFactory.cpp     |   60 +-
 .../OssimPlugins/src/ossim/ossimRadarSatModel.cpp  |    4 +-
 .../OssimPlugins/src/ossim/ossimSarSensorModel.cpp |   21 +-
 .../OssimPlugins/src/ossim/ossimSarSensorModel.h   |    2 +-
 .../OssimPlugins/src/ossim/ossimSentinel1Model.cpp |  238 +-
 .../src/ossim/ossimSpot6DimapSupportData.cpp       |   11 +-
 .../OssimPlugins/src/ossim/ossimStringUtilities.h  |   18 +-
 .../OssimPlugins/src/ossim/ossimTimeUtilities.h    |    8 +-
 .../src/ossim/ossimWin32FindFileHandle.cpp         |   48 +
 .../src/ossim/ossimWin32FindFileHandle.h           |   26 +
 .../OssimPlugins/src/ossim/otb/CivilDateTime.h     |    4 +-
 .../OssimPlugins/src/ossim/otb/Equation.cpp        |    4 +-
 .../OssimPlugins/src/ossim/otb/GMSTDateTime.h      |    4 +-
 .../OssimPlugins/src/ossim/otb/JSDDateTime.cpp     |    2 +-
 .../OssimPlugins/src/ossim/otb/JSDDateTime.h       |    8 +-
 .../OssimPlugins/src/ossim/otb/JulianDate.h        |    6 +-
 .../OssimPlugins/src/ossim/otb/MJDDateTime.h       |    2 +-
 .../src/ossim/otb/PlatformPosition.cpp             |  544 +-
 .../OssimPlugins/src/ossim/otb/PlatformPosition.h  |    6 +-
 .../OssimPlugins/src/ossim/otb/RefPoint.h          |    2 +-
 .../ThirdParty/OssimPlugins/test/CMakeLists.txt    |   15 +-
 .../OssimPlugins/test/ossimTimeUtilitiesBench.cpp  |    2 +-
 .../OssimPlugins/test/ossimTimeUtilitiesTest.cpp   |   10 +-
 Modules/ThirdParty/Qt4/CMakeLists.txt              |    9 +-
 Modules/ThirdParty/Qt4/otb-module-init.cmake       |    8 +-
 Modules/ThirdParty/Qwt/CMakeLists.txt              |    6 +
 Modules/ThirdParty/Qwt/otb-module-init.cmake       |    9 +
 Modules/ThirdParty/Qwt/otb-module.cmake            |   13 +
 Modules/ThirdParty/Shark/CMakeLists.txt            |   16 +
 Modules/ThirdParty/Shark/otb-module-init.cmake     |    3 +
 Modules/ThirdParty/Shark/otb-module.cmake          |   15 +
 Modules/ThirdParty/Shark/src/otb_shark.h.in        |   71 +
 Modules/ThirdParty/SiftFast/src/libsiftfast.cpp    |   35 +-
 .../Visualization/Ice/include/otbFragmentShader.h  |    8 +-
 .../Visualization/Ice/include/otbGeoInterface.h    |    8 +-
 Modules/Visualization/Ice/include/otbGlActor.h     |    7 +-
 .../Visualization/Ice/include/otbGlImageActor.h    |    4 +-
 Modules/Visualization/Ice/include/otbGlROIActor.h  |    2 +-
 .../Visualization/Ice/include/otbGlVectorActor.h   |    2 +-
 .../Ice/include/otbGlVersionChecker.h              |   10 +-
 Modules/Visualization/Ice/include/otbGlView.h      |   10 +-
 .../Ice/include/otbNonOptGlImageActor.h            |   25 +-
 .../Visualization/Ice/include/otbStandardShader.h  |   10 +-
 .../Visualization/Ice/include/otbViewSettings.h    |   16 +-
 Modules/Visualization/Ice/otb-module.cmake         |    1 +
 Modules/Visualization/Ice/src/otbGeoInterface.cxx  |    2 +-
 Modules/Visualization/Ice/src/otbGlImageActor.cxx  |   51 +-
 Modules/Visualization/Ice/src/otbGlROIActor.cxx    |    8 +-
 Modules/Visualization/Ice/src/otbGlVectorActor.cxx |    6 +-
 .../Visualization/Ice/src/otbGlVersionChecker.cxx  |    2 +-
 Modules/Visualization/Ice/src/otbImageSettings.cxx |    2 +-
 .../Ice/src/otbNonOptGlImageActor.cxx              |   11 +-
 Modules/Visualization/Ice/src/otbViewSettings.cxx  |   26 +-
 .../Visualization/IceViewer/include/otbIceViewer.h |    4 +-
 Modules/Visualization/IceViewer/otb-module.cmake   |    1 +
 .../Visualization/IceViewer/src/otbIceViewer.cxx   |    6 +-
 Modules/Visualization/Mapla/CMakeLists.txt         |   10 +
 .../Mapla/include/mvdMaplaApplication.h            |  191 +
 .../Mapla/include/mvdMaplaMainWindow.h             |  236 +
 Modules/Visualization/Mapla/otb-module.cmake       |   16 +
 Modules/Visualization/Mapla/src/CMakeLists.txt     |   76 +
 Modules/Visualization/Mapla/src/main.cxx           |  173 +
 .../Mapla/src/mvdMaplaApplication.cxx              |  107 +
 .../Visualization/Mapla/src/mvdMaplaMainWindow.cxx |  253 +
 .../Visualization/Mapla/src/mvdMaplaMainWindow.qrc |   20 +
 .../Visualization/Mapla/src/mvdMaplaMainWindow.ui  |  108 +
 .../Visualization/Mapla/src/mvdMaplaWin32.rc.in    |   32 +
 Modules/Visualization/Monteverdi/CMakeLists.txt    |   10 +
 Modules/Visualization/Monteverdi/README.txt        |   44 +
 .../Visualization/Monteverdi/RELEASE_NOTES_MVD.txt |  236 +
 .../Monteverdi/include/mvdApplication.h            |  234 +
 .../Monteverdi/include/mvdMainWindow.h             |  555 ++
 .../Monteverdi/include/mvdPreferencesDialog.h      |  163 +
 Modules/Visualization/Monteverdi/otb-module.cmake  |   20 +
 .../Visualization/Monteverdi/src/CMakeLists.txt    |   78 +
 Modules/Visualization/Monteverdi/src/main.cxx      |  221 +
 .../Monteverdi/src/mvdApplication.cxx              |  143 +
 .../Visualization/Monteverdi/src/mvdMainWindow.cxx | 2444 +++++++
 .../Visualization/Monteverdi/src/mvdMainWindow.qrc |   30 +
 .../Visualization/Monteverdi/src/mvdMainWindow.ui  |  279 +
 .../Monteverdi/src/mvdPreferencesDialog.cxx        |  489 ++
 .../Monteverdi/src/mvdPreferencesDialog.ui         |  383 +
 .../Visualization/Monteverdi/src/mvdWin32.rc.in    |   32 +
 .../Visualization/Monteverdi/test/CMakeLists.txt   |   13 +
 .../test/mvdMonteverdiApplicationTest.cxx          |   46 +
 .../Monteverdi/test/mvdMonteverdiTestDriver.cxx    |   30 +
 .../Visualization/MonteverdiCore/CMakeLists.txt    |   37 +
 .../MonteverdiCore/include/mvdAbstractImageModel.h |  605 ++
 .../MonteverdiCore/include/mvdAbstractLayerModel.h |  231 +
 .../MonteverdiCore/include/mvdAbstractModel.h      |  254 +
 .../MonteverdiCore/include/mvdAbstractWorker.h     |  234 +
 .../MonteverdiCore/include/mvdAlgorithm.h          |  761 ++
 .../include/mvdApplicationsBrowser.h               |  201 +
 .../MonteverdiCore/include/mvdBackgroundTask.h     |  186 +
 .../Visualization/MonteverdiCore/include/mvdCore.h |  396 ++
 .../MonteverdiCore/include/mvdDataStream.h         |  214 +
 .../MonteverdiCore/include/mvdFilenameInterface.h  |  154 +
 .../MonteverdiCore/include/mvdHistogramModel.h     |  734 ++
 .../include/mvdI18nCoreApplication.h               |  710 ++
 .../MonteverdiCore/include/mvdImageImporter.h      |  235 +
 .../include/mvdImagePlacenameLoader.h              |   99 +
 .../MonteverdiCore/include/mvdImageProperties.h    |  307 +
 .../MonteverdiCore/include/mvdImageSettings.h      |  412 ++
 .../include/mvdImageSettingsInterface.h            |  212 +
 .../Visualization/MonteverdiCore/include/mvdMath.h |  187 +
 .../include/mvdModifiableInterface.h               |  129 +
 .../MonteverdiCore/include/mvdMyClass.h            |  162 +
 .../MonteverdiCore/include/mvdOverviewBuilder.h    |  218 +
 .../include/mvdProcessObjectObserver.h             |  186 +
 .../MonteverdiCore/include/mvdProgressInterface.h  |  140 +
 .../MonteverdiCore/include/mvdQuicklookModel.h     |  233 +
 .../include/mvdSerializableInterface.h             |  151 +
 .../MonteverdiCore/include/mvdStackedLayerModel.h  |  955 +++
 .../MonteverdiCore/include/mvdSystemError.h        |  129 +
 .../MonteverdiCore/include/mvdTextStream.h         | 1023 +++
 .../MonteverdiCore/include/mvdTypes.h              |  310 +
 .../MonteverdiCore/include/mvdVectorImageModel.h   |  403 ++
 .../include/mvdVectorImageSettings.h               |  663 ++
 .../MonteverdiCore/include/mvdVisibleInterface.h   |  169 +
 .../Visualization/MonteverdiCore/otb-module.cmake  |   28 +
 .../MonteverdiCore/src/CMakeLists.txt              |  100 +
 .../MonteverdiCore/src/ConfigureMonteverdi.h.in    |  138 +
 .../MonteverdiCore/src/mvdAbstractImageModel.cxx   |  312 +
 .../MonteverdiCore/src/mvdAbstractLayerModel.cxx   |  211 +
 .../MonteverdiCore/src/mvdAbstractModel.cxx        |  106 +
 .../MonteverdiCore/src/mvdAbstractWorker.cxx       |  128 +
 .../MonteverdiCore/src/mvdApplicationsBrowser.cxx  |  224 +
 .../MonteverdiCore/src/mvdBackgroundTask.cxx       |  200 +
 .../Visualization/MonteverdiCore/src/mvdCore.cxx   |  107 +
 .../MonteverdiCore/src/mvdDataStream.cxx           |  134 +
 .../MonteverdiCore/src/mvdFilenameInterface.cxx    |  102 +
 .../MonteverdiCore/src/mvdHistogramModel.cxx       |  505 ++
 .../MonteverdiCore/src/mvdI18nCoreApplication.cxx  |  824 +++
 .../MonteverdiCore/src/mvdImageImporter.cxx        |  152 +
 .../MonteverdiCore/src/mvdImagePlacenameLoader.cxx |   66 +
 .../MonteverdiCore/src/mvdImageProperties.cxx      |  109 +
 .../MonteverdiCore/src/mvdImageSettings.cxx        |  168 +
 .../src/mvdImageSettingsInterface.cxx              |  126 +
 .../MonteverdiCore/src/mvdModifiableInterface.cxx  |   70 +
 .../MonteverdiCore/src/mvdMyClass.cxx              |   84 +
 .../MonteverdiCore/src/mvdOverviewBuilder.cxx      |  192 +
 .../src/mvdProcessObjectObserver.cxx               |  140 +
 .../MonteverdiCore/src/mvdProgressInterface.cxx    |   83 +
 .../MonteverdiCore/src/mvdQuicklookModel.cxx       |  154 +
 .../src/mvdSerializableInterface.cxx               |  158 +
 .../MonteverdiCore/src/mvdStackedLayerModel.cxx    |  731 ++
 .../MonteverdiCore/src/mvdTextStream.cxx           |   61 +
 .../Visualization/MonteverdiCore/src/mvdTypes.cxx  |   50 +
 .../MonteverdiCore/src/mvdVectorImageModel.cxx     |  998 +++
 .../MonteverdiCore/src/mvdVectorImageSettings.cxx  |  292 +
 .../MonteverdiCore/src/mvdVisibleInterface.cxx     |   91 +
 Modules/Visualization/MonteverdiGui/CMakeLists.txt |   10 +
 .../MonteverdiGui/include/mvdAboutDialog.h         |  111 +
 .../include/mvdAbstractDragAndDropEventFilter.h    |  172 +
 .../include/mvdAbstractImageViewManipulator.h      |  305 +
 .../include/mvdAbstractImageViewRenderer.h         |  526 ++
 .../include/mvdAbstractModelController.h           |  319 +
 .../MonteverdiGui/include/mvdApplicationLauncher.h |  181 +
 .../MonteverdiGui/include/mvdApplicationsToolBox.h |  197 +
 .../include/mvdApplicationsToolBoxController.h     |  170 +
 .../include/mvdColorBandDynamicsWidget.h           |  275 +
 .../include/mvdColorDynamicsController.h           |  399 ++
 .../MonteverdiGui/include/mvdColorDynamicsWidget.h |  373 +
 .../include/mvdColorSetupController.h              |  229 +
 .../MonteverdiGui/include/mvdColorSetupWidget.h    |  336 +
 .../MonteverdiGui/include/mvdDoubleValidator.h     |  172 +
 .../MonteverdiGui/include/mvdDropLineEdit.h        |  159 +
 .../include/mvdFilenameDragAndDropEventFilter.h    |  173 +
 .../Visualization/MonteverdiGui/include/mvdGui.h   |  189 +
 .../MonteverdiGui/include/mvdHistogramController.h |  201 +
 .../MonteverdiGui/include/mvdHistogramPlotPicker.h |  224 +
 .../MonteverdiGui/include/mvdHistogramWidget.h     |  353 +
 .../MonteverdiGui/include/mvdI18nApplication.h     |  198 +
 .../MonteverdiGui/include/mvdI18nMainWindow.h      |  399 ++
 .../include/mvdImageViewManipulator.h              |  475 ++
 .../MonteverdiGui/include/mvdImageViewRenderer.h   |  365 +
 .../MonteverdiGui/include/mvdImageViewWidget.h     |  500 ++
 .../MonteverdiGui/include/mvdImportImagesDialog.h  |  208 +
 .../include/mvdImportSubDatasetDialog.h            |  204 +
 .../MonteverdiGui/include/mvdKeymapDialog.h        |  111 +
 .../include/mvdLayerStackController.h              |  207 +
 .../MonteverdiGui/include/mvdLayerStackItemModel.h |  340 +
 .../MonteverdiGui/include/mvdLayerStackWidget.h    |  249 +
 .../include/mvdMainWindowTitleLoader.h             |   97 +
 .../include/mvdMultiResolutionPyramidWidget.h      |  178 +
 .../MonteverdiGui/include/mvdMyWidget.h            |  152 +
 .../include/mvdOTBApplicationsModel.h              |  218 +
 .../include/mvdPixelDescriptionWidget.h            |  186 +
 .../include/mvdQtWidgetParameterInitializers.h     |  737 ++
 .../MonteverdiGui/include/mvdQtWidgetView.h        |  324 +
 .../include/mvdQuicklookViewManipulator.h          |  197 +
 .../include/mvdQuicklookViewRenderer.h             |  203 +
 .../include/mvdSearchableTreeWidget.h              |  189 +
 .../MonteverdiGui/include/mvdShaderWidget.h        |  170 +
 .../MonteverdiGui/include/mvdStatusBarWidget.h     |  205 +
 .../MonteverdiGui/include/mvdTaskProgressDialog.h  |  204 +
 .../MonteverdiGui/include/mvdTreeWidget.h          |  223 +
 .../MonteverdiGui/include/mvdTreeWidgetItem.h      |  268 +
 .../mvdTreeWidgetItemDragAndDropEventFilter.h      |  169 +
 .../Visualization/MonteverdiGui/otb-module.cmake   |   23 +
 .../Visualization/MonteverdiGui/src/CMakeLists.txt |  182 +
 .../MonteverdiGui/src/mvdAboutDialog.cxx           |   75 +
 .../MonteverdiGui/src/mvdAboutDialog.ui            |  155 +
 .../src/mvdAbstractDragAndDropEventFilter.cxx      |  111 +
 .../src/mvdAbstractModelController.cxx             |  223 +
 .../MonteverdiGui/src/mvdApplicationLauncher.cxx   |  276 +
 .../MonteverdiGui/src/mvdApplicationsToolBox.cxx   |  384 +
 .../MonteverdiGui/src/mvdApplicationsToolBox.qrc   |    7 +
 .../MonteverdiGui/src/mvdApplicationsToolBox.ui    |   65 +
 .../src/mvdApplicationsToolBoxController.cxx       |  171 +
 .../src/mvdColorBandDynamicsWidget.cxx             |  394 ++
 .../src/mvdColorBandDynamicsWidget.ui              |  464 ++
 .../src/mvdColorDynamicsController.cxx             | 1467 ++++
 .../MonteverdiGui/src/mvdColorDynamicsWidget.cxx   |  457 ++
 .../MonteverdiGui/src/mvdColorDynamicsWidget.ui    |  329 +
 .../MonteverdiGui/src/mvdColorSetupController.cxx  |  438 ++
 .../MonteverdiGui/src/mvdColorSetupWidget.cxx      |  257 +
 .../MonteverdiGui/src/mvdColorSetupWidget.ui       |  593 ++
 .../MonteverdiGui/src/mvdDoubleValidator.cxx       |  115 +
 .../MonteverdiGui/src/mvdDropLineEdit.cxx          |  160 +
 .../src/mvdFilenameDragAndDropEventFilter.cxx      |  208 +
 Modules/Visualization/MonteverdiGui/src/mvdGui.cxx |  144 +
 .../MonteverdiGui/src/mvdHistogramController.cxx   |  279 +
 .../MonteverdiGui/src/mvdHistogramPlotPicker.cxx   |  437 ++
 .../MonteverdiGui/src/mvdHistogramWidget.cxx       |  770 ++
 .../MonteverdiGui/src/mvdHistogramWidget.ui        |  124 +
 .../MonteverdiGui/src/mvdI18nApplication.cxx       |   86 +
 .../MonteverdiGui/src/mvdI18nMainWindow.cxx        |  346 +
 .../Visualization/MonteverdiGui/src/mvdIcons.qrc   |    7 +
 .../MonteverdiGui/src/mvdImageViewManipulator.cxx  | 1029 +++
 .../MonteverdiGui/src/mvdImageViewRenderer.cxx     | 1296 ++++
 .../MonteverdiGui/src/mvdImageViewWidget.cxx       | 2428 +++++++
 .../MonteverdiGui/src/mvdImportImagesDialog.cxx    |  567 ++
 .../MonteverdiGui/src/mvdImportImagesDialog.ui     |   54 +
 .../src/mvdImportSubDatasetDialog.cxx              |  304 +
 .../MonteverdiGui/src/mvdImportSubDatasetDialog.ui |  125 +
 .../MonteverdiGui/src/mvdKeymapDialog.cxx          |   75 +
 .../MonteverdiGui/src/mvdKeymapDialog.html         |   89 +
 .../MonteverdiGui/src/mvdKeymapDialog.ui           |  653 ++
 .../MonteverdiGui/src/mvdLayerStackController.cxx  |  510 ++
 .../MonteverdiGui/src/mvdLayerStackItemModel.cxx   | 1076 +++
 .../MonteverdiGui/src/mvdLayerStackWidget.cxx      |  441 ++
 .../MonteverdiGui/src/mvdLayerStackWidget.ui       |  224 +
 .../MonteverdiGui/src/mvdMainWindowTitleLoader.cxx |   95 +
 .../src/mvdMultiResolutionPyramidWidget.cxx        |  433 ++
 .../src/mvdMultiResolutionPyramidWidget.ui         |  194 +
 .../MonteverdiGui/src/mvdMyWidget.cxx              |   86 +
 .../Visualization/MonteverdiGui/src/mvdMyWidget.ui |   22 +
 .../MonteverdiGui/src/mvdOTBApplicationsModel.cxx  |  114 +
 .../src/mvdPixelDescriptionWidget.cxx              |  256 +
 .../MonteverdiGui/src/mvdPixelDescriptionWidget.ui |   68 +
 .../MonteverdiGui/src/mvdQtWidgetView.cxx          |  731 ++
 .../src/mvdQuicklookViewManipulator.cxx            |  273 +
 .../MonteverdiGui/src/mvdQuicklookViewRenderer.cxx |  222 +
 .../MonteverdiGui/src/mvdSearchableTreeWidget.cxx  |  115 +
 .../MonteverdiGui/src/mvdSearchableTreeWidget.ui   |   53 +
 .../MonteverdiGui/src/mvdShaderWidget.cxx          |  278 +
 .../MonteverdiGui/src/mvdShaderWidget.ui           |  107 +
 .../MonteverdiGui/src/mvdStatusBarWidget.cxx       |  301 +
 .../MonteverdiGui/src/mvdStatusBarWidget.ui        |  190 +
 .../MonteverdiGui/src/mvdTaskProgressDialog.cxx    |  228 +
 .../MonteverdiGui/src/mvdTreeWidget.cxx            |  568 ++
 .../MonteverdiGui/src/mvdTreeWidgetItem.cxx        |  181 +
 .../mvdTreeWidgetItemDragAndDropEventFilter.cxx    |  161 +
 .../MonteverdiGui/src/mvdVideoColorToolBox.ui      |   68 +
 .../MonteverdiGui/test/CMakeLists.txt              |   15 +
 .../test/mvdApplicationsBrowserTest.cxx            |   53 +
 .../test/mvdApplicationsToolBoxTest.cxx            |   42 +
 .../test/mvdFillToolBoxWidgetTreeTest.cxx          |   92 +
 .../test/mvdMonteverdiGuiTestDriver.cxx            |   32 +
 .../include/otbWrapperAddProcessToWatchEvent.h     |    3 +-
 .../include/otbWrapperApplication.h                |   91 +-
 .../include/otbWrapperApplicationFactory.h         |    2 +-
 .../include/otbWrapperApplicationFactoryBase.h     |    3 +-
 .../otbWrapperApplicationHtmlDocGenerator.h        |    2 +-
 .../include/otbWrapperApplicationRegistry.h        |    2 +-
 .../include/otbWrapperChoiceParameter.h            |    2 +-
 .../include/otbWrapperComplexInputImageParameter.h |    2 +-
 .../otbWrapperComplexInputImageParameter.txx       |    9 +
 .../otbWrapperComplexOutputImageParameter.h        |    2 +-
 .../include/otbWrapperDirectoryParameter.h         |    2 +-
 .../include/otbWrapperDocExampleStructure.h        |   10 +-
 .../include/otbWrapperElevationParametersHandler.h |   14 +-
 .../include/otbWrapperEmptyParameter.h             |    2 +-
 .../include/otbWrapperInputFilenameListParameter.h |    2 +-
 .../include/otbWrapperInputFilenameParameter.h     |    2 +-
 .../include/otbWrapperInputImageListParameter.h    |   28 +-
 .../include/otbWrapperInputImageParameter.h        |    6 +-
 .../include/otbWrapperInputImageParameter.txx      |   23 +-
 .../include/otbWrapperInputProcessXMLParameter.h   |    2 +-
 .../otbWrapperInputVectorDataListParameter.h       |    2 +-
 .../include/otbWrapperInputVectorDataParameter.h   |    2 +-
 .../include/otbWrapperListViewParameter.h          |    2 +-
 .../otbWrapperMapProjectionParametersHandler.h     |   10 +-
 .../include/otbWrapperOutputFilenameParameter.h    |    2 +-
 .../include/otbWrapperOutputImageParameter.h       |    2 +-
 .../include/otbWrapperOutputProcessXMLParameter.h  |    2 +-
 .../include/otbWrapperOutputVectorDataParameter.h  |    2 +-
 .../include/otbWrapperParameter.h                  |    7 +-
 .../include/otbWrapperParameterGroup.h             |    4 +-
 .../include/otbWrapperParameterKey.h               |    3 +-
 .../include/otbWrapperRAMParameter.h               |    2 +-
 .../include/otbWrapperRadiusParameter.h            |    2 +-
 .../include/otbWrapperStringListParameter.h        |    2 +-
 .../include/otbWrapperStringParameter.h            |    2 +-
 .../Wrappers/ApplicationEngine/otb-module.cmake    |    4 +-
 .../src/otbWrapperApplication.cxx                  |  136 +-
 .../src/otbWrapperComplexInputImageParameter.cxx   |    9 -
 .../src/otbWrapperInputImageListParameter.cxx      |  166 +-
 .../src/otbWrapperInputProcessXMLParameter.cxx     |  314 +-
 .../otbWrapperMapProjectionParametersHandler.cxx   |    2 +-
 .../src/otbWrapperOutputProcessXMLParameter.cxx    |    6 +-
 .../src/otbWrapperParameterGroup.cxx               |   54 +-
 .../Wrappers/ApplicationEngine/test/CMakeLists.txt |    5 +
 .../test/otbApplicationEngineTestDriver.cxx        |    1 +
 .../test/otbApplicationMemoryConnectTest.cxx       |   71 +
 .../test/otbWrapperParameterKeyTest.cxx            |    4 +-
 .../include/otbWrapperCommandLineLauncher.h        |    4 +-
 Modules/Wrappers/CommandLine/src/CMakeLists.txt    |    2 +
 .../src/otbWrapperCommandLineLauncher.cxx          |   10 +-
 .../src/otbWrapperCommandLineParser.cxx            |   38 +-
 .../Wrappers/QtWidget/include/itkQtProgressBar.h   |    3 +-
 .../Wrappers/QtWidget/include/otbQtApplication.h   |    4 +-
 .../QtWidget/include/otbQtFileSelectionWidget.h    |   17 +-
 Modules/Wrappers/QtWidget/include/otbQtLogOutput.h |    4 +-
 .../QtWidget/include/otbQtStringSelectionWidget.h  |    4 +-
 .../include/otbWrapperQtWidgetChoiceParameter.h    |    2 +-
 .../otbWrapperQtWidgetComplexInputImageParameter.h |    2 +-
 ...otbWrapperQtWidgetComplexOutputImageParameter.h |    2 +-
 .../include/otbWrapperQtWidgetDirectoryParameter.h |    2 +-
 .../include/otbWrapperQtWidgetEmptyParameter.h     |    2 +-
 .../include/otbWrapperQtWidgetFloatParameter.h     |    2 +-
 .../otbWrapperQtWidgetInputFilenameListParameter.h |    2 +-
 .../otbWrapperQtWidgetInputFilenameParameter.h     |    2 +-
 .../otbWrapperQtWidgetInputImageListParameter.h    |    2 +-
 .../otbWrapperQtWidgetInputImageParameter.h        |    2 +-
 .../otbWrapperQtWidgetInputProcessXMLParameter.h   |    2 +-
 ...tbWrapperQtWidgetInputVectorDataListParameter.h |    2 +-
 .../otbWrapperQtWidgetInputVectorDataParameter.h   |    2 +-
 .../include/otbWrapperQtWidgetIntParameter.h       |    2 +-
 .../include/otbWrapperQtWidgetListViewParameter.h  |    2 +-
 .../QtWidget/include/otbWrapperQtWidgetModel.h     |    8 +-
 .../otbWrapperQtWidgetOutputFilenameParameter.h    |    2 +-
 .../otbWrapperQtWidgetOutputImageParameter.h       |    2 +-
 .../otbWrapperQtWidgetOutputProcessXMLParameter.h  |    2 +-
 .../otbWrapperQtWidgetOutputVectorDataParameter.h  |    2 +-
 .../include/otbWrapperQtWidgetParameterBase.h      |    3 +-
 .../include/otbWrapperQtWidgetParameterFactory.h   |    4 +-
 .../include/otbWrapperQtWidgetParameterGroup.h     |    2 +-
 .../include/otbWrapperQtWidgetParameterLabel.h     |    4 +-
 .../include/otbWrapperQtWidgetProgressReport.h     |    2 +-
 .../include/otbWrapperQtWidgetRAMParameter.h       |    2 +-
 .../otbWrapperQtWidgetSimpleProgressReport.h       |    2 +-
 .../otbWrapperQtWidgetStringListParameter.h        |    2 +-
 .../include/otbWrapperQtWidgetStringParameter.h    |    2 +-
 .../QtWidget/include/otbWrapperQtWidgetView.h      |    4 +-
 Modules/Wrappers/QtWidget/otb-module.cmake         |    4 +-
 Modules/Wrappers/QtWidget/src/CMakeLists.txt       |    6 +-
 .../QtWidget/src/otbQtFileSelectionWidget.cxx      |   69 +-
 ...tbWrapperQtWidgetComplexInputImageParameter.cxx |   57 +-
 ...bWrapperQtWidgetComplexOutputImageParameter.cxx |   39 +-
 .../src/otbWrapperQtWidgetDirectoryParameter.cxx   |   29 +-
 ...tbWrapperQtWidgetInputFilenameListParameter.cxx |    3 +
 .../otbWrapperQtWidgetInputFilenameParameter.cxx   |   59 +-
 .../otbWrapperQtWidgetInputImageListParameter.cxx  |    3 +
 .../src/otbWrapperQtWidgetInputImageParameter.cxx  |   61 +-
 .../otbWrapperQtWidgetInputProcessXMLParameter.cxx |   48 +-
 ...WrapperQtWidgetInputVectorDataListParameter.cxx |    3 +
 .../otbWrapperQtWidgetInputVectorDataParameter.cxx |   61 +-
 .../src/otbWrapperQtWidgetListViewParameter.cxx    |    2 +-
 .../otbWrapperQtWidgetOutputFilenameParameter.cxx  |   54 +-
 .../src/otbWrapperQtWidgetOutputImageParameter.cxx |   38 +-
 ...otbWrapperQtWidgetOutputProcessXMLParameter.cxx |   40 +-
 ...otbWrapperQtWidgetOutputVectorDataParameter.cxx |   42 +-
 .../src/otbWrapperQtWidgetParameterBase.cxx        |    6 +-
 .../src/otbWrapperQtWidgetParameterGroup.cxx       |    2 +-
 .../src/otbWrapperQtWidgetRAMParameter.cxx         |    2 +-
 .../src/otbWrapperQtWidgetStringParameter.cxx      |    2 +-
 .../QtWidget/src/otbWrapperQtWidgetView.cxx        |    4 +-
 .../QtWidget/test/otbWrapperQtWidgetShowWidget.cxx |    2 +-
 Modules/Wrappers/SWIG/src/otbApplication.i         |   40 +-
 Modules/Wrappers/SWIG/src/otbWrapperSWIGIncludes.h |    3 +
 Modules/Wrappers/SWIG/test/python/Bug440.py        |   20 +-
 Modules/Wrappers/SWIG/test/python/Bug736.py        |   27 +-
 Modules/Wrappers/SWIG/test/python/Bug804.py        |   10 +-
 Modules/Wrappers/SWIG/test/python/Bug823.py        |   24 +-
 Modules/Wrappers/SWIG/test/python/CMakeLists.txt   |  152 +-
 .../SWIG/test/python/PythonConnectApplications.py  |   26 +
 .../test/python/PythonHyperspectralUnmixing1.py    |   26 +-
 .../Wrappers/SWIG/test/python/PythonInXMLTest.py   |   17 +-
 .../PythonNewStyleParametersInstanciateAllTest.py  |   14 -
 .../PythonNewStyleParametersInstantiateAllTest.py  |   13 +
 .../test/python/PythonNewStyleParametersTest.py    |  176 +-
 .../Wrappers/SWIG/test/python/PythonNumpyTest.py   |   84 +-
 .../Wrappers/SWIG/test/python/PythonOutXMLTest.py  |   29 +-
 .../Wrappers/SWIG/test/python/PythonRescaleTest.py |   20 +-
 .../SWIG/test/python/PythonSmoothingTest.py        |   27 +-
 .../Wrappers/SWIG/test/python/PythonTestDriver.py  |   28 +
 README.md                                          |   25 +-
 RELEASE_NOTES.txt                                  |  101 +-
 Utilities/Data/CMakeLists.txt                      |   43 +
 Utilities/Data/Icons/LICENSE.TXT                   |   16 +
 Utilities/Data/Icons/NOTES                         |   13 +
 .../Data/Icons/action-zoomfullextent_24x24.png     |  Bin 0 -> 1259 bytes
 Utilities/Data/Icons/action-zoomin_24x24.png       |  Bin 0 -> 975 bytes
 Utilities/Data/Icons/action-zoomout_24x24.png      |  Bin 0 -> 937 bytes
 Utilities/Data/Icons/action-zoomtolayer_24x24.png  |  Bin 0 -> 1025 bytes
 Utilities/Data/Icons/alg.png                       |  Bin 0 -> 588 bytes
 Utilities/Data/Icons/check_24x24.png               |  Bin 0 -> 969 bytes
 Utilities/Data/Icons/document-open_32x32.png       |  Bin 0 -> 1550 bytes
 Utilities/Data/Icons/execute.png                   |  Bin 0 -> 686 bytes
 Utilities/Data/Icons/forbidden-128x128.png         |  Bin 0 -> 11569 bytes
 Utilities/Data/Icons/image-export_24x24.png        |  Bin 0 -> 868 bytes
 Utilities/Data/Icons/layer-bottom_24x24.png        |  Bin 0 -> 694 bytes
 Utilities/Data/Icons/layer-delete_24x24.png        |  Bin 0 -> 489 bytes
 Utilities/Data/Icons/layer-down_24x24.png          |  Bin 0 -> 759 bytes
 Utilities/Data/Icons/layer-top_24x24.png           |  Bin 0 -> 692 bytes
 Utilities/Data/Icons/layer-up_24x24.png            |  Bin 0 -> 768 bytes
 Utilities/Data/Icons/layers-remove_24x24.png       |  Bin 0 -> 658 bytes
 Utilities/Data/Icons/locked.png                    |  Bin 0 -> 883 bytes
 Utilities/Data/Icons/monteverdi-128x128.png        |  Bin 0 -> 13118 bytes
 Utilities/Data/Icons/monteverdi-16x16.png          |  Bin 0 -> 631 bytes
 Utilities/Data/Icons/monteverdi-32x32.png          |  Bin 0 -> 2036 bytes
 Utilities/Data/Icons/monteverdi-32x32.xpm          |  491 ++
 Utilities/Data/Icons/monteverdi-48x48.png          |  Bin 0 -> 4200 bytes
 Utilities/Data/Icons/monteverdi-48x48.xpm          |  233 +
 Utilities/Data/Icons/monteverdi-highres.png        |  Bin 0 -> 365200 bytes
 Utilities/Data/Icons/monteverdi-splash.png         |  Bin 0 -> 45745 bytes
 Utilities/Data/Icons/monteverdi.ico                |  Bin 0 -> 285141 bytes
 Utilities/Data/Icons/monteverdi.svg                |  102 +
 Utilities/Data/Icons/projection_24x24.png          |  Bin 0 -> 1359 bytes
 Utilities/Data/Icons/reload_24x24.png              |  Bin 0 -> 1276 bytes
 Utilities/Data/Icons/unlocked.png                  |  Bin 0 -> 880 bytes
 Utilities/Data/Icons/zoom-1to1.png                 |  Bin 0 -> 1312 bytes
 Utilities/Data/monteverdi.desktop                  |   13 +
 Utilities/Data/monteverdi2.desktop                 |   13 +
 Utilities/Doxygen/CMakeLists.txt                   |    6 +-
 Utilities/Doxygen/OTB/Geometry.dox                 |    2 +-
 Utilities/Doxygen/OTB/ImageSimilarityMetrics.dox   |    2 +-
 Utilities/Doxygen/OTB/Iterators.dox                |    2 +-
 Utilities/Doxygen/OTB/NeighborhoodIterators.dox    |    6 +-
 Utilities/Doxygen/OTB/Registration.dox             |    4 +-
 Utilities/Doxygen/OTB/Threading.dox                |    6 +-
 Utilities/Doxygen/doxygen.config.in                |    4 +-
 Utilities/Doxygen/otbdoxygen.pl.in                 |    9 -
 Utilities/Doxygen/vxl_doxy.pl                      |  127 -
 Utilities/Maintenance/BuildHeaderTest.py           |    2 +-
 Utilities/Maintenance/TravisBuild.sh               |   10 +-
 Utilities/Maintenance/fix_typos.sh                 |   78 +
 i18n/CMakeLists.txt                                |   64 +
 i18n/fr_FR.ts                                      | 5018 +++++++++++++
 1279 files changed, 83234 insertions(+), 9344 deletions(-)

diff --git a/CMake/CPackFunctions.cmake b/CMake/CPackFunctions.cmake
new file mode 100755
index 0000000..e630f7f
--- /dev/null
+++ b/CMake/CPackFunctions.cmake
@@ -0,0 +1,389 @@
+
+#RK: two packages.
+#function(create_cpack_config application)
+function(create_cpack_config)
+  #should we handle this when calling function ?
+  #for now mapla has no specific version or it is same as monteverdi
+  SET(CPACK_PACKAGE_VERSION "${Monteverdi_VERSION_MAJOR}.${Monteverdi_VERSION_MINOR}.${Monteverdi_VERSION_PATCH}${Monteverdi_VERSION_SUFFIX}")
+  SET(CPACK_PACKAGE_VERSION_MAJOR "${Monteverdi_VERSION_MAJOR}")
+  SET(CPACK_PACKAGE_VERSION_MINOR "${Monteverdi_VERSION_MINOR}")
+  SET(CPACK_PACKAGE_VERSION_PATCH "${Monteverdi_VERSION_PATCH}")
+  #monteverdi short version string - eg: 3.0.0-beta
+  SET(PACKAGE_SHORT_VERSION_STRING ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}${Monteverdi_VERSION_SUFFIX})
+
+  if(WIN32)
+    set(arch_prefix win32)
+    set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+      set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
+      set(arch_prefix win64)
+    endif()
+    SET(CPACK_GENERATOR "NSIS")
+    SET(CPACK_NSIS_MODIFY_PATH OFF)
+        SET(CPACK_NSIS_CONTACT "contact at orfeo-toolbox.org")
+
+    #RK: two packages.
+    #STRING(TOLOWER ${application} application_)
+    #SET(EXEFILE_NAME "${application_}.exe")
+    #SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\${EXEFILE_NAME}")
+    #SET(BATFILE_NAME "${application_}.bat")
+    #SET(CPACK_NSIS_MENU_LINKS "bin/${BATFILE_NAME}" "${application}" )
+    # SET(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
+    # "Delete \\\"$SMPROGRAMS\\\\${application}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}\\\\${application}.lnk\\\"  ")
+    # SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
+    #   "CreateShortCut \\\"$SMPROGRAMS\\\\${application}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}\\\\${application}.lnk\\\" \\\"$INSTDIR\\\\bin\\\\${BATFILE_NAME}\\\" \\\" \\\" \\\"$INSTDIR\\\\bin\\\\${EXEFILE_NAME}\\\"
+    # ")
+
+SET(application "Monteverdi")
+SET(startmenufolder "${application}-${PACKAGE_SHORT_VERSION_STRING}")
+
+#set(CPACK_NSIS_DEFINES "  !define MUI_STARTMENUPAGE_DEFAULTFOLDER \\\"${startmenufolder} (${arch_prefix})\\\"")
+#SET(CPACK_PACKAGE_EXECUTABLES "monteverdi.bat" "Monteverdi")
+#SET(CPACK_CREATE_DESKTOP_LINKS "monteverdi.bat" )
+
+SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\monteverdi.exe")
+SET(CPACK_PACKAGE_ICON   "${Monteverdi_SOURCE_DIR}\\\\Data\\\\Icons\\\\monteverdi.ico")
+SET(CPACK_NSIS_CREATE_ICONS "CreateShortCut '$SMPROGRAMS\\\\${startmenufolder}\\\\Monteverdi.lnk'  '$INSTDIR\\\\bin\\\\monteverdi.bat' ")
+SET(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\${startmenufolder}\\\\Mapla.lnk'     '$INSTDIR\\\\bin\\\\mapla.bat' ")
+SET(CPACK_NSIS_MUI_FINISHPAGE_RUN "monteverdi.bat")
+SET(CPACK_NSIS_DELETE_ICONS
+      "Delete \\\"$SMPROGRAMS\\\\${startmenufolder}\\\\Monteverdi.lnk\\\" ")
+SET(CPACK_NSIS_DELETE_ICONS_EXTRA
+      "Delete \\\"$SMPROGRAMS\\\\${startmenufolder}\\\\Mapla.lnk\\\" ")
+
+  else(APPLE)
+      set(arch_prefix Darwin)
+     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+      set(arch_prefix Darwin64)
+    endif()
+    SET(CPACK_GENERATOR "Bundle")
+    SET(CPACK_BUNDLE_ICON "${Monteverdi_SOURCE_DIR}/Packaging/MacOS/Monteverdi.icns" )
+    SET(CPACK_BUNDLE_NAME "${application}-${PACKAGE_SHORT_VERSION_STRING}" )
+    SET(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Packaging/MacOS/${application}-Info.plist" )
+    SET(CPACK_BUNDLE_STARTUP_COMMAND "${Monteverdi_SOURCE_DIR}/Packaging/MacOS/${application}-StartupCommand" )
+
+  endif()
+
+  #common cpack configurations.
+
+  ##################################
+  ##################################
+  #CAUTION: Be careful when changing values below.#
+  ##################################
+  ##################################
+
+  SET(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
+  SET(CPACK_MODULE_PATH "${Monteverdi_SOURCE_DIR}/CMake")
+  SET(CPACK_NSIS_INSTALLER_ICON_CODE "")
+  SET(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "")
+  SET(CPACK_PACKAGE_CONTACT "contact at orfeo-toolbox.org")
+  SET(CPACK_PACKAGE_DEFAULT_LOCATION "/")
+  SET(CPACK_PACKAGE_DESCRIPTION_FILE "${Monteverdi_SOURCE_DIR}/Description.txt")
+
+  SET(CPACK_RESOURCE_FILE_LICENSE "${Monteverdi_SOURCE_DIR}/Copyright/Copyright.txt")
+  SET(CPACK_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackConfig-${application}.cmake")
+  SET(CPACK_NSIS_MUI_ICON    "${Monteverdi_SOURCE_DIR}/Data/Icons/monteverdi.ico")
+  SET(CPACK_NSIS_MUI_UNIICON "${Monteverdi_SOURCE_DIR}/Data/Icons/monteverdi.ico")
+
+  SET(CPACK_COMPONENTS_ALL)
+  LIST(APPEND CPACK_COMPONENTS_ALL  "Resources")
+  LIST(APPEND CPACK_COMPONENTS_ALL "Runtime")
+
+  #RK: two packages
+  #LIST(APPEND CPACK_COMPONENTS_ALL "${application}")
+  LIST(APPEND CPACK_COMPONENTS_ALL "Monteverdi")
+  LIST(APPEND CPACK_COMPONENTS_ALL "Mapla")
+
+  SET(CPACK_COMPONENT_MAPLA_DEPENDS Runtime)
+  SET(CPACK_COMPONENT_MONTEVERDI_DEPENDS Runtime)
+  SET(CPACK_COMPONENT_RUNTIME_DEPENDS Resources)
+
+  SET(CPACK_COMPONENT_RUNTIME_REQUIRED ON)
+  SET(CPACK_COMPONENT_RESOURCES_REQUIRED ON)
+  SET(CPACK_COMPONENT_MAPLA_REQUIRED ON)
+  SET(CPACK_COMPONENT_MONTEVERDI_REQUIRED ON)
+
+  SET(CPACK_COMPONENT_RESOURCES_HIDDEN ON)
+
+  if(APPLE)
+  SET(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};${application};ALL;/")
+  else(WIN32)
+    SET(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};ALL;ALL;/")
+  endif()
+  SET(CPACK_PACKAGE_VENDOR "OTB Team")
+
+  SET(CPACK_PACKAGE_NAME "${application}")
+  SET(CPACK_NSIS_DISPLAY_NAME "${application}-${PACKAGE_SHORT_VERSION_STRING}")
+  SET(CPACK_NSIS_PACKAGE_NAME "${application}-${PACKAGE_SHORT_VERSION_STRING}")
+  SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${application}-${PACKAGE_SHORT_VERSION_STRING}")
+  SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${application}-${PACKAGE_SHORT_VERSION_STRING}")
+  SET(CPACK_PACKAGE_FILE_NAME "${application}-${CPACK_PACKAGE_VERSION}-${arch_prefix}")
+
+  INCLUDE(InstallRequiredSystemLibraries)
+  INCLUDE(CPack)
+
+endfunction(create_cpack_config)
+
+
+
+function(configure_app_package app with_otb_apps)
+
+  string(TOLOWER ${app} EXECUTABLE_NAME)
+  set(APP_QTCONF_DIR bin)
+  set(APP_QTSQLITE_FILENAME qsqlite4.dll)
+  set(APP_QTPLUGINS_DIR lib/qt4/plugins)
+  set(APP_OTBLIBS_DIR lib/otb)
+  set(APP_I18N_DIR lib/qt4/translations)
+  set(APP_DATA_DIR share)
+  set(APP_NAME "\${CMAKE_INSTALL_PREFIX}/bin/${EXECUTABLE_NAME}.exe")
+
+  install(CODE "file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${APP_QTCONF_DIR}/qt.conf\"
+                \"[Paths]
+                  Translations=../lib/qt4/translations
+                  Plugins=../lib/qt4/plugins
+                \")"
+    COMPONENT Runtime)
+
+  install(FILES ${Monteverdi_SOURCE_DIR}/Packaging/Windows/${EXECUTABLE_NAME}.bat
+    DESTINATION bin
+    COMPONENT ${app})
+
+  if(WIN32)
+
+    if(NOT CMAKE_CROSSCOMPILING AND Monteverdi_USE_CPACK)
+
+      file(TO_CMAKE_PATH "$ENV{OSGEO4W_ROOT}" OSGEO4W_ROOT)
+      if(NOT OSGEO4W_ROOT)
+        message(FATAL_ERROR "Cannot generate installer without OSGeo4W environment : OSGEO4W_ROOT")
+      endif(NOT OSGEO4W_ROOT)
+
+      # The following DLL handling is very specific
+      # both to OSGeo4W flavour (32 bit or 64 bit), OSGeo4W package state
+      # and the compiler used to make the Monteverdi installer (VC2010)
+      # Don't expect too much of it without VC2010.
+
+      # For some reason, fixup_bundle won't package the msvc runtime dll
+      # I guess it's because cpack already handles installing the runtime,
+      # but here we build with a particular version of Visual, but
+      # some OSGeo4W dependencies are built upon other runtimes
+      set(MVD2_ADDITIONAL_DLLS
+        ${OSGEO4W_ROOT}/bin/msvcp60.dll
+        ${OSGEO4W_ROOT}/bin/msvcp70.dll
+        ${OSGEO4W_ROOT}/bin/msvcp71.dll
+        ${OSGEO4W_ROOT}/bin/msvcr71.dll
+        ${OSGEO4W_ROOT}/bin/msvcrt.dll)
+
+      # Since an upgrade in OSGeo4W-32bit of libpq (around 2013/10)
+      # libpq depends on two additional libs that cmake
+      # surprisingly miss during package generation
+      # I really don't understand why.
+      # Let's add them manually
+
+      set(MVD2_ADDITIONAL_DLLS
+        ${MVD2_ADDITIONAL_DLLS}
+        ${OSGEO4W_ROOT}/bin/libgcc_s_dw2-1.dll
+        ${OSGEO4W_ROOT}/bin/libiconv-2.dll)
+
+      foreach(dll ${MVD2_ADDITIONAL_DLLS})
+        if (EXISTS ${dll})
+          install( FILES ${dll} DESTINATION bin COMPONENT Runtime )
+        endif()
+      endforeach()
+
+      #RK: two packages
+      # set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${app}")
+      # create_cpack_config(${app})
+
+    endif() #(NOT CMAKE_CROSSCOMPILING AND Monteverdi_USE_CPACK)
+
+
+    # if(CMAKE_CROSSCOMPILING)
+    #   if(NOT DEFINED MXE_TARGET_DIR)
+    #     message(FATAL_ERROR "MXE_TARGET_DIR is missing")
+    #   endif()
+    #   if(MXE_TARGET_DIR MATCHES "i686")
+    #     set(mxearch x86)
+    #     set(archive_name ${app}-${Monteverdi_VERSION_STRING}-win32)
+    #   elseif(MXE_TARGET_DIR MATCHES "x86_64")
+    #     set(mxearch x64)
+    #     set(archive_name ${app}-${Monteverdi_VERSION_STRING}-win64)
+    #   endif()
+
+    #   execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_INSTALL_PREFIX}/${archive_name}")
+
+    #   get_filename_component(mxeroot ${MXE_TARGET_DIR} PATH)
+    #   get_filename_component(mxeroot ${mxeroot} PATH)
+    #   file(WRITE "${CMAKE_BINARY_DIR}/_mingw/${app}/CMakeLists.txt"
+    #     "cmake_minimum_required(VERSION 2.6)
+    #    include(CMakeParseArguments)
+    #    set(Monteverdi_SOURCE_DIR \"${Monteverdi_SOURCE_DIR}\")
+    #    set(OTB_MODULES_DIR \"${OTB_MODULES_DIR}\")
+    #    set(QT_PLUGINS_DIR \"${QT_PLUGINS_DIR}\")
+    #    set(QT_TRANSLATIONS_DIR \"${QT_TRANSLATIONS_DIR}\")
+    #    set(Monteverdi_BINARY_DIR \"${CMAKE_BINARY_DIR}\")
+    #    set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")
+    #    set(Monteverdi_INSTALL_DATA_DIR \"${Monteverdi_INSTALL_DATA_DIR}\")
+    #     include(${CMAKE_SOURCE_DIR}/CMake/MinGWPackage.cmake)
+    #     include(${CMAKE_SOURCE_DIR}/CMake/CPackFunctions.cmake)
+    #     package_mingw(
+    #     ARCH \"${mxearch}\"
+    #     MXEROOT \"${mxeroot}\"
+    #     PREFIX_DIR \"${archive_name}\"
+    #     PEFILES \"${APP_NAME}\"
+    #     NEEDS_OTB_APPS ${with_otb_apps}
+    #     SEARCHDIRS \"\")")
+
+    #   set(GDAL_DATA ${MXE_TARGET_DIR}/share/gdal)
+
+    #   add_custom_target(configure-${app}-mingw-package
+    #     COMMAND ${CMAKE_COMMAND}
+    #     "${CMAKE_BINARY_DIR}/_mingw/${app}"
+    #     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/_mingw/${app}")
+
+    #   add_custom_target(make-${app}-mingw-package
+    #     COMMAND ${CMAKE_COMMAND}
+    #     "--build" "${CMAKE_BINARY_DIR}/_mingw/${app}" "--target" "install"
+    #     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/_mingw/${app}"
+    #     DEPENDS configure-${app}-mingw-package)
+
+    #   find_program(ZIP_EXECUTABLE zip)
+
+    #   if(ZIP_EXECUTABLE)
+    #     add_custom_target(create-${app}-mingw-archive
+    #       COMMAND ${ZIP_EXECUTABLE} "-r" "${CMAKE_BINARY_DIR}/${archive_name}.zip" "${archive_name}"
+    #       WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
+    #       DEPENDS make-${app}-mingw-package)
+    #   else()
+    #     message(FATAL_ERROR "Cannot find zip executable. Please add it to your path")
+    #   endif()
+
+    # endif() # (CMAKE_CROSSCOMPILING)
+
+  endif(WIN32)
+
+  if(APPLE)
+    set(APP_NAME "\${CMAKE_INSTALL_PREFIX}/${app}.app")
+    set(APP_PREFIX_DIR ${app}.app/Contents) #osx prefix
+    set(APP_QTCONF_DIR ${APP_PREFIX_DIR}/Resources)
+    set(APP_QTSQLITE_FILENAME libqsqlite.dylib)
+    set(APP_QTPLUGINS_DIR ${APP_PREFIX_DIR}/plugins)
+    set(APP_OTBLIBS_DIR ${APP_PREFIX_DIR}/MacOS/otb)
+    set(APP_I18N_DIR ${APP_PREFIX_DIR}/Resources/otb/translations) #translations
+    set(APP_DATA_DIR ${APP_PREFIX_DIR}/Resources)
+
+    install(FILES ${CMAKE_SOURCE_DIR}/Packaging/MacOS/Monteverdi.icns
+      DESTINATION ${APP_PREFIX_DIR}/Resources
+      COMPONENT Resources)
+
+    install(FILES ${CMAKE_BINARY_DIR}/Code/Application/${app}/${EXECUTABLE_NAME}_start
+      DESTINATION ${APP_PREFIX_DIR}/MacOS
+      PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+      COMPONENT Runtime)
+
+    install(CODE
+      "file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${APP_QTCONF_DIR}/qt.conf\"
+     \"[Paths]
+       Translations=Resources/otb/translations
+       Plugins=plugins
+     \")"
+      COMPONENT Runtime)
+
+    file(GLOB APP_QM_TRANSLATIONS /*.qm) # qm files
+
+    file(GLOB APP_TS_FILES ${CMAKE_SOURCE_DIR}/i18n/*.ts) # qm files
+
+    foreach(APP_TS_FILE ${APP_TS_FILES})
+      get_filename_component(APP_TS_FILENAME ${APP_TS_FILE} NAME_WE)
+      install(FILES ${CMAKE_BINARY_DIR}/i18n/${APP_TS_FILENAME}.qm
+        DESTINATION ${APP_PREFIX_DIR}/${Monteverdi_INSTALL_DATA_DIR}/i18n/
+        COMPONENT Resources)
+    endforeach()
+
+    set(CPACK_BINARY_DRAGNDROP ON)
+
+  endif(APPLE)
+
+#   ################################################################################
+#   ################################################################################
+#   ################### END OF PLATFORM SPECIFIC CMAKE VARIABLES ###################
+#   ################################################################################
+#   ################################################################################
+
+#   ####################### install sqldrivers plugin #######################
+
+#   install(FILES ${QT_PLUGINS_DIR}/sqldrivers/${APP_QTSQLITE_FILENAME}
+#     DESTINATION ${APP_QTPLUGINS_DIR}/sqldrivers
+#     COMPONENT Runtime)
+
+#   ####################### install translations #######################
+#   get_qt_translation_files(QT_TRANSLATIONS_FILES)
+
+#   install(FILES ${QT_TRANSLATIONS_FILES}
+#     DESTINATION ${APP_I18N_DIR}
+#     COMPONENT Resources)
+
+#   ####################### install GDAL data #######################
+
+
+#   if(NOT DEFINED GDAL_DATA)
+#     file(TO_CMAKE_PATH "$ENV{GDAL_DATA}" GDAL_DATA)
+#     if(NOT GDAL_DATA)
+#       if(Monteverdi_USE_CPACK)
+#         message(FATAL_ERROR "Cannot generate installer without GDAL_DATA : GDAL_DATA")
+#       else()
+#         message(WARNING "Cannot generate installer without GDAL_DATA : GDAL_DATA")
+#       endif()
+#     endif()
+#   endif() #(DEFINED GDAL_DATA)
+#   # Need to include csv files provided with GDAL that contains some needed EPSG definitions
+
+#   install(DIRECTORY ${GDAL_DATA}
+#     DESTINATION ${APP_DATA_DIR}
+#     COMPONENT Resources)
+
+#   ####################### Check otb applications #######################
+
+#   if(with_otb_apps)
+# #      message(FATAL_ERROR "No OTB-applications detected")
+#     file(GLOB OTB_APPS_LIST ${OTB_MODULES_DIR}/../../../otb/applications/otbapp_*${CMAKE_SHARED_LIBRARY_SUFFIX}) # /lib/otb
+#     if(NOT OTB_APPS_LIST)
+#       message(FATAL_ERROR "No OTB-applications detected")
+#     endif()
+
+#     ## otb apps dir /lib/otb/applications
+#     install(DIRECTORY "${OTB_MODULES_DIR}/../../../otb/applications"
+#       DESTINATION ${APP_OTBLIBS_DIR}
+#       COMPONENT Runtime)
+
+#   endif(with_otb_apps)
+
+#   ## directories to look for dependencies
+#   set(SEARCH_DIRS)
+#   list(APPEND SEARCH_DIRS "${QT_PLUGINS_DIR}/sqldrivers")
+#   list(APPEND SEARCH_DIRS "${ITK_MODULES_DIR}/../../../")
+#   list(APPEND SEARCH_DIRS "${OTB_MODULES_DIR}/../../../")
+#   list(APPEND SEARCH_DIRS "${CMAKE_INSTALL_PREFIX}/lib/otb/")
+
+#   ####################### install fixup_bundle code #######################
+#   ## fixup_bundle code
+#   if(NOT CMAKE_CROSSCOMPILING)
+#     if(with_otb_apps)
+#       install(CODE
+#         "file(GLOB APP_LIBS \"${CMAKE_INSTALL_PREFIX}/${APP_OTBLIBS_DIR}/applications/otbapp_*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
+#         list(APPEND APP_LIBS \"${CMAKE_INSTALL_PREFIX}/${APP_QTPLUGINS_DIR}/sqldrivers/${APP_QTSQLITE_FILENAME}\")
+#         include(BundleUtilities)
+#         set(BU_CHMOD_BUNDLE_ITEMS ON)
+#         fixup_bundle(\"${APP_NAME}\" \"\${APP_LIBS}\" \"${SEARCH_DIRS}\")"
+#         COMPONENT ${app})
+
+#     else() #(with_otb_apps)
+#       install(CODE
+#         "file(GLOB APP_LIBS \"${CMAKE_INSTALL_PREFIX}/${APP_QTPLUGINS_DIR}/sqldrivers/${APP_QTSQLITE_FILENAME}\")
+#         include(BundleUtilities)
+#         set(BU_CHMOD_BUNDLE_ITEMS ON)
+#         fixup_bundle(\"${APP_NAME}\" \"\${APP_LIBS}\" \"${SEARCH_DIRS}\")"
+#         COMPONENT ${app})
+#     endif() #(with_otb_apps)
+#   endif() #(NOT CMAKE_CROSSCOMPILING)
+endfunction(configure_app_package)
+
diff --git a/CMake/CTestCustom.cmake.in b/CMake/CTestCustom.cmake.in
index fdbf925..e03ae22 100644
--- a/CMake/CTestCustom.cmake.in
+++ b/CMake/CTestCustom.cmake.in
@@ -89,4 +89,5 @@ set(CTEST_CUSTOM_WARNING_EXCEPTION
   ".*boost.move.unique_ptr.hpp:.*"
   ".*include.mpValue.h.*[Ww]arning.*\\[-Wc\\+\\+11-extensions\\]"
   ".*itksys.SharedForward.h.*warning.*itksys_shared_forward_to_real.*"
+  ".*include.mpi_portable_platform.h.*warning.*invalid.suffix.on.literal.*"
   )
diff --git a/CMake/DeployQtConf.cmake b/CMake/DeployQtConf.cmake
new file mode 100644
index 0000000..63253e8
--- /dev/null
+++ b/CMake/DeployQtConf.cmake
@@ -0,0 +1,18 @@
+# Deploy a qt.conf file in the specified
+# target build directory, as a pre-build step
+macro( deploy_qt_conf TARGET_NAME )
+
+  add_custom_command( 
+      TARGET ${TARGET_NAME}
+      PRE_BUILD 
+      COMMAND ${CMAKE_COMMAND}
+      ARGS -D QT_TRANSLATIONS_DIR:PATH=${QT_TRANSLATIONS_DIR}
+           -D QT_PLUGINS_DIR:PATH=${QT_PLUGINS_DIR}
+           -D Monteverdi_SOURCE_DIR:PATH=${Monteverdi_SOURCE_DIR}
+           -D TARGET_DIR:PATH=$<TARGET_FILE_DIR:${TARGET_NAME}>
+           -P ${Monteverdi_SOURCE_DIR}/CMake/DeployQtConfScript.cmake
+      COMMENT "Deploying qt.conf in ${TARGET_NAME} build dir"
+      VERBATIM
+  )
+
+endmacro()
diff --git a/CMake/DeployQtConfScript.cmake b/CMake/DeployQtConfScript.cmake
new file mode 100644
index 0000000..3ef43cf
--- /dev/null
+++ b/CMake/DeployQtConfScript.cmake
@@ -0,0 +1,3 @@
+configure_file(${Monteverdi_SOURCE_DIR}/CMake/qt.conf.in
+               ${TARGET_DIR}/qt.conf
+               @ONLY)
\ No newline at end of file
diff --git a/CMake/Description.txt b/CMake/Description.txt
new file mode 100644
index 0000000..d1c13e2
--- /dev/null
+++ b/CMake/Description.txt
@@ -0,0 +1,13 @@
+Remote sensing processing library developed by CNES ORFEO Toolbox (OTB) is
+  distributed as an open source library of image processing algorithms. OTB is
+  based on the medical image processing library ITK and offers particular
+  functionalities for remote sensing image processing in general and for high
+  spatial resolution images in particular. OTB is distributed under a free
+  software licence CeCILL (similar to GPL) to encourage contribution from users
+  and to promote reproducible research. The library is intensively tested on
+  several platforms as Linux, Unix and Windows. Most functionnalies are also
+  adapted to process huge images using streaming and multithreading as often as
+  possible.
+  .
+  This package provide the new version of the Monteverdi GUI application
+  developed in Qt around the OTB library.
diff --git a/CMake/FindGBenchmark.cmake b/CMake/FindGBenchmark.cmake
index 55cef2d..ed2a367 100644
--- a/CMake/FindGBenchmark.cmake
+++ b/CMake/FindGBenchmark.cmake
@@ -11,7 +11,7 @@ endif ()
 
 if (NOT GBENCHMARK_INCLUDE_DIR)
   find_path(GBENCHMARK_INCLUDE_DIR NAMES benchmark.h PATH_SUFFIXES benchmark)
-  set(GBENCHMARK_INCLUDE_DIR ${GBENCHMARK_INCLUDE_DIR}/benchmark CACHE PATH "Google.benchmark include direcory")
+  set(GBENCHMARK_INCLUDE_DIR ${GBENCHMARK_INCLUDE_DIR}/benchmark CACHE PATH "Google.benchmark include directory")
 endif ()
 
 mark_as_advanced(GBENCHMARK_INCLUDE_DIR)
diff --git a/CMake/FindLibSVM.cmake b/CMake/FindLibSVM.cmake
index 9a0fefc..cc15db6 100644
--- a/CMake/FindLibSVM.cmake
+++ b/CMake/FindLibSVM.cmake
@@ -9,7 +9,7 @@
 #  LIBSVM_INCLUDE_DIR - where to find svm.h
 #  LIBSVM_INCLUDE_DIRS - libsvm includes
 #  LIBSVM_LIBRARY - where to find the LibSVM library
-#  LIBSVM_LIBRARIES - aditional libraries
+#  LIBSVM_LIBRARIES - additional libraries
 #  LIBSVM_MAJOR_VERSION - major version
 #  LIBSVM_MINOR_VERSION - minor version
 #  LIBSVM_PATCH_VERSION - patch version
diff --git a/CMake/FindOpenCV.cmake b/CMake/FindOpenCV.cmake
new file mode 100755
index 0000000..9a6ced7
--- /dev/null
+++ b/CMake/FindOpenCV.cmake
@@ -0,0 +1,108 @@
+set(OPENCV_SEARCH_PATH)
+
+if(OpenCV_DIR)
+  get_filename_component(OPENCV_SEARCH_PATH "${OpenCV_DIR}" PATH)
+  if(OPENCV_SEARCH_PATH)
+    get_filename_component(OPENCV_SEARCH_PATH "${OPENCV_SEARCH_PATH}" PATH)
+  endif()
+  if(OPENCV_SEARCH_PATH)
+    find_path(
+      opencv_INCLUDE_DIR
+      opencv/cv.h
+      PATHS "${OPENCV_SEARCH_PATH}"
+      PATH_SUFFIXES "include"
+      DOC "The directory where opencv/cv.h is installed")
+  endif()
+endif()
+
+if(NOT opencv_INCLUDE_DIR)
+  find_path(
+    opencv_INCLUDE_DIR
+    opencv/cv.h
+    PATHS "${OpenCV_DIR}"
+    PATH_SUFFIXES "include"
+    DOC "The directory where opencv/cv.h is installed")
+endif()
+
+if(NOT EXISTS ${opencv_INCLUDE_DIR}/opencv2/opencv.hpp)
+  message(FATAL_ERROR "${opencv_INCLUDE_DIR}/opencv2/opencv.hpp does not exists. "
+    "Make sure you have opencv 2.3 or higher. We had searched in ${OPENCV_SEARCH_PATHS}")
+endif()
+
+set(opencv_core_NAMES opencv_core)
+set(opencv_ml_NAMES opencv_ml)
+
+if ( opencv_INCLUDE_DIR )
+
+  set(OPENCV_INCLUDE_DIRS "${opencv_INCLUDE_DIR}")
+
+  if(NOT OpenCV_VERSION)
+    file(READ "${opencv_INCLUDE_DIR}/opencv2/core/version.hpp" _header_content)
+
+    string(REGEX MATCH  ".*# *define +CV_VERSION_EPOCH +([0-9]+).*" matched ${_header_content})
+    if( matched)
+      string(REGEX REPLACE ".*# *define +CV_VERSION_EPOCH +([0-9]+).*" "\\1"
+        OpenCV_VERSION_MAJOR ${_header_content})
+      string(REGEX REPLACE ".*# *define +CV_VERSION_MAJOR +([0-9]+).*" "\\1"
+        OpenCV_VERSION_MINOR ${_header_content})
+      string(REGEX REPLACE ".*# *define +CV_VERSION_MINOR +([0-9]+).*" "\\1"
+        OpenCV_VERSION_PATCH ${_header_content})
+      string(REGEX REPLACE ".*# *define +CV_VERSION_REVISION +([0-9]+).*" "\\1"
+        OpenCV_VERSION_TWEAK ${_header_content})
+    else()
+      #for opencv 2.3.x
+      string(REGEX REPLACE ".*# *define +CV_MAJOR_VERSION +([0-9]+).*" "\\1"
+        OpenCV_VERSION_MAJOR ${_header_content})
+      string(REGEX REPLACE ".*# *define +CV_MINOR_VERSION +([0-9]+).*" "\\1"
+        OpenCV_VERSION_MINOR ${_header_content})
+      string(REGEX REPLACE ".*# *define +CV_SUBMINOR_VERSION +([0-9]+).*" "\\1"
+        OpenCV_VERSION_PATCH ${_header_content})
+      set(OpenCV_VERSION_TWEAK)
+    endif()
+    set(OpenCV_VERSION
+      "${OpenCV_VERSION_MAJOR}.${OpenCV_VERSION_MINOR}.${OpenCV_VERSION_PATCH}")
+  endif()
+
+  if(WIN32)
+    list(APPEND opencv_core_NAMES
+      "opencv_core${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}")
+    list(APPEND opencv_ml_NAMES
+      "opencv_ml${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}")
+  endif()
+endif()
+
+if(NOT OPENCV_SEARCH_PATH)
+  get_filename_component(OPENCV_SEARCH_PATH "${opencv_INCLUDE_DIR}" PATH)
+endif()
+
+# Prefer the static library.
+find_library(
+  OPENCV_core_LIBRARY
+  NAMES ${opencv_core_NAMES}
+  PATHS ${OPENCV_SEARCH_PATH}
+  PATH_SUFFIXES "lib" "lib64" "lib/x86_64-linux-gnu"
+  NO_DEFAULT_PATH
+  DOC "Path to opencv_core library")
+
+find_library(
+  OPENCV_ml_LIBRARY
+  NAMES ${opencv_ml_NAMES}
+  PATHS ${OPENCV_SEARCH_PATH}
+  PATH_SUFFIXES "lib" "lib64" "lib/x86_64-linux-gnu"
+  NO_DEFAULT_PATH
+  DOC "Path to opencv_ml library")
+
+set(OpenCV_FOUND FALSE)
+if ( OPENCV_core_LIBRARY AND OPENCV_ml_LIBRARY )
+  set(OPENCV_LIBRARIES "${OPENCV_core_LIBRARY};${OPENCV_ml_LIBRARY}")
+endif ()
+
+if( OPENCV_INCLUDE_DIRS AND OPENCV_LIBRARIES )
+  set(OpenCV_FOUND TRUE)
+  set(OPENCV_VERSION ${OpenCV_VERSION}) #for compatility
+endif()
+
+include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenCV
+  REQUIRED_VARS OPENCV_core_LIBRARY OPENCV_INCLUDE_DIRS
+  VERSION_VAR OpenCV_VERSION)
diff --git a/CMake/FindQwt.cmake b/CMake/FindQwt.cmake
new file mode 100644
index 0000000..ee993dd
--- /dev/null
+++ b/CMake/FindQwt.cmake
@@ -0,0 +1,118 @@
+# Qt Widgets for Technical Applications
+# available at http://www.http://qwt.sourceforge.net/
+#
+# The module defines the following variables:
+#  QWT_FOUND - the system has Qwt
+#  QWT_INCLUDE_DIR - where to find qwt_plot.h
+#  QWT_INCLUDE_DIRS - qwt includes
+#  QWT_LIBRARY - where to find the Qwt library
+#  QWT_LIBRARIES - additional libraries
+#  QWT_MAJOR_VERSION - major version
+#  QWT_MINOR_VERSION - minor version
+#  QWT_PATCH_VERSION - patch version
+#  QWT_VERSION_STRING - version (ex. 5.2.1)
+#  QWT_ROOT_DIR - root dir (ex. /usr/local)
+
+#=============================================================================
+# Copyright 2010-2013, Julien Schueller
+# All rights reserved.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met: 
+# 
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer. 
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution. 
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# The views and conclusions contained in the software and documentation are those
+# of the authors and should not be interpreted as representing official policies, 
+# either expressed or implied, of the FreeBSD Project.
+#=============================================================================
+
+
+find_path ( QWT_INCLUDE_DIR
+  NAMES qwt_plot.h
+  HINTS ${QT_INCLUDE_DIR}
+  PATH_SUFFIXES qwt qwt-qt3 qwt-qt4 qwt-qt5
+)
+
+set ( QWT_INCLUDE_DIRS ${QWT_INCLUDE_DIR} )
+
+# version
+set ( _VERSION_FILE ${QWT_INCLUDE_DIR}/qwt_global.h )
+if ( EXISTS ${_VERSION_FILE} )
+  file ( STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+QWT_VERSION_STR" )
+  if ( _VERSION_LINE )
+    string ( REGEX REPLACE ".*define[ ]+QWT_VERSION_STR[ ]+\"(.*)\".*" "\\1" QWT_VERSION_STRING "${_VERSION_LINE}" )
+    string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" QWT_MAJOR_VERSION "${QWT_VERSION_STRING}" )
+    string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" QWT_MINOR_VERSION "${QWT_VERSION_STRING}" )
+    string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\3" QWT_PATCH_VERSION "${QWT_VERSION_STRING}" )
+  endif ()
+endif ()
+
+
+# check version
+set ( _QWT_VERSION_MATCH TRUE )
+if ( Qwt_FIND_VERSION AND QWT_VERSION_STRING )
+  if ( Qwt_FIND_VERSION_EXACT )
+    if ( NOT Qwt_FIND_VERSION VERSION_EQUAL QWT_VERSION_STRING )
+      set ( _QWT_VERSION_MATCH FALSE )
+    endif ()
+  else ()
+    if ( QWT_VERSION_STRING VERSION_LESS Qwt_FIND_VERSION )
+      set ( _QWT_VERSION_MATCH FALSE )
+    endif ()
+  endif ()
+endif ()
+
+
+find_library ( QWT_LIBRARY
+  NAMES qwt qwt-qt3 qwt-qt4 qwt-qt5 qwt${QWT_MAJOR_VERSION}
+  HINTS ${QT_LIBRARY_DIR}
+)
+
+set ( QWT_LIBRARIES ${QWT_LIBRARY} )
+
+
+# try to guess root dir from include dir
+if ( QWT_INCLUDE_DIR )
+  string ( REGEX REPLACE "(.*)/include.*" "\\1" QWT_ROOT_DIR ${QWT_INCLUDE_DIR} )
+# try to guess root dir from library dir
+elseif ( QWT_LIBRARY )
+  string ( REGEX REPLACE "(.*)/lib[/|32|64].*" "\\1" QWT_ROOT_DIR ${QWT_LIBRARY} )
+endif ()
+
+
+# handle the QUIETLY and REQUIRED arguments
+include ( FindPackageHandleStandardArgs )
+if ( CMAKE_VERSION LESS 2.8.3 )
+  find_package_handle_standard_args( Qwt DEFAULT_MSG QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH )
+else ()
+  find_package_handle_standard_args( Qwt REQUIRED_VARS QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH VERSION_VAR QWT_VERSION_STRING )
+endif ()
+
+
+mark_as_advanced (
+  QWT_LIBRARY 
+  QWT_LIBRARIES
+  QWT_INCLUDE_DIR
+  QWT_INCLUDE_DIRS
+  QWT_MAJOR_VERSION
+  QWT_MINOR_VERSION
+  QWT_PATCH_VERSION
+  QWT_VERSION_STRING
+  QWT_ROOT_DIR
+)
diff --git a/CMake/FindShark.cmake b/CMake/FindShark.cmake
new file mode 100755
index 0000000..800ba58
--- /dev/null
+++ b/CMake/FindShark.cmake
@@ -0,0 +1,74 @@
+# - Find Shark
+# Find the Shark includes and library
+#
+#   SHARK_FOUND       - True if Shark found.
+#   SHARK_INCLUDE_DIR - where to find Core/shark.h
+#   SHARK_LIBRARIES   - List of libraries required for shark.
+#
+
+set(SHARK_SEARCH_PATH)
+
+set(SHARK_CONFIG_FILE)
+
+if(Shark_DIR)
+  get_filename_component(SHARK_SEARCH_PATH "${Shark_DIR}" PATH)
+  get_filename_component(SHARK_SEARCH_PATH "${SHARK_SEARCH_PATH}" PATH)
+  get_filename_component(SHARK_SEARCH_PATH "${SHARK_SEARCH_PATH}" PATH)
+
+  if(EXISTS "${Shark_DIR}/SharkConfig.cmake")
+    set(SHARK_CONFIG_FILE ${Shark_DIR}/SharkConfig.cmake)
+  endif()
+
+endif() #if(Shark_DIR)
+
+find_path( SHARK_INCLUDE_DIR shark/Core/Shark.h
+  PATHS "${SHARK_SEARCH_PATH}"
+  PATH_SUFFIXES include include/shark shark)
+
+find_library( SHARK_LIBRARY
+  NAMES shark
+  PATHS "${SHARK_SEARCH_PATH}"
+  PATH_SUFFIXES lib
+  )
+
+mark_as_advanced( SHARK_INCLUDE_DIR
+                  SHARK_LIBRARY )
+find_package( 
+	Boost 1.48.0 REQUIRED QUIET COMPONENTS
+	system date_time filesystem
+	program_options serialization thread
+	unit_test_framework
+)
+
+if(NOT Boost_FOUND)
+  message(FATAL_ERROR "Please make sure Boost 1.48.0 is installed on your system")
+endif()
+
+if(NOT SHARK_CONFIG_FILE)
+  find_file(SHARK_CONFIG_FILE SharkConfig.cmake PATH_SUFFIXES lib/cmake/Shark share/Shark)
+endif()
+if(SHARK_CONFIG_FILE)
+  file(STRINGS "${SHARK_CONFIG_FILE}" SHARK_CONFIG_FILE_CONTENTS)
+  string(REGEX REPLACE
+      ".*set.*\\(SHARK_VERSION_MAJOR..([0-9]+)\"\\).*" "\\1"
+       SHARK_VERSION_MAJOR "${SHARK_CONFIG_FILE_CONTENTS}")
+  string(REGEX REPLACE
+      ".*set.*\\(SHARK_VERSION_MINOR..([0-9]+)\"\\).*" "\\1"
+       SHARK_VERSION_MINOR "${SHARK_CONFIG_FILE_CONTENTS}")
+  string(REGEX REPLACE
+      ".*set.*\\(SHARK_VERSION_PATCH..([0-9]+)\"\\).*" "\\1"
+       SHARK_VERSION_PATCH "${SHARK_CONFIG_FILE_CONTENTS}")       
+
+  set(SHARK_VERSION_STRING 
+  "${SHARK_VERSION_MAJOR}.${SHARK_VERSION_MINOR}.${SHARK_VERSION_PATCH}")
+
+endif()
+
+INCLUDE(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Shark
+                                  REQUIRED_VARS SHARK_LIBRARY SHARK_INCLUDE_DIR
+                                  VERSION_VAR SHARK_VERSION_STRING)
+if(SHARK_FOUND)
+  set(SHARK_INCLUDE_DIRS ${SHARK_INCLUDE_DIR} ${Boost_INCLUDE_DIR} )
+  set(SHARK_LIBRARIES ${SHARK_LIBRARY} ${Boost_LIBRARIES} )
+endif()
diff --git a/CMake/MonteverdiApplicationMacros.cmake b/CMake/MonteverdiApplicationMacros.cmake
new file mode 100644
index 0000000..fda4571
--- /dev/null
+++ b/CMake/MonteverdiApplicationMacros.cmake
@@ -0,0 +1,25 @@
+macro(create_monteverdi_application)
+  cmake_parse_arguments(APPLICATION  "" "NAME;OUTPUT_NAME;COMPONENT_NAME" "SOURCES;LINK_LIBRARIES" ${ARGN} )
+
+  if(WIN32)
+    add_executable(${APPLICATION_NAME}
+      WIN32
+      ${APPLICATION_SOURCES})
+  else() #Unix
+    add_executable(${APPLICATION_NAME}
+      ${APPLICATION_SOURCES})
+  endif()
+
+  if (APPLICATION_OUTPUT_NAME)
+    set_target_properties(${APPLICATION_NAME} PROPERTIES OUTPUT_NAME ${APPLICATION_OUTPUT_NAME})
+  endif()
+
+  target_link_libraries(${APPLICATION_NAME} ${APPLICATION_LINK_LIBRARIES})
+
+install(TARGETS ${APPLICATION_NAME}
+  RUNTIME DESTINATION ${Monteverdi_INSTALL_BIN_DIR} COMPONENT ${APPLICATION_COMPONENT_NAME}
+  LIBRARY DESTINATION ${Monteverdi_INSTALL_LIB_DIR} COMPONENT ${APPLICATION_COMPONENT_NAME}
+  ARCHIVE DESTINATION ${Monteverdi_INSTALL_LIB_DIR} COMPONENT ${APPLICATION_COMPONENT_NAME}
+  )
+
+endmacro(create_monteverdi_application)
\ No newline at end of file
diff --git a/CMake/OTBCheckCpp11Keywords.cmake b/CMake/OTBCheckCpp11Keywords.cmake
index 09e13b4..da30226 100644
--- a/CMake/OTBCheckCpp11Keywords.cmake
+++ b/CMake/OTBCheckCpp11Keywords.cmake
@@ -1,5 +1,83 @@
+include(CheckCXXSourceCompiles)
 
-try_compile(OTB_IS_UNIQUE_PTR_DEFINED ${CMAKE_CURRENT_BINARY_DIR}/CMake ${CMAKE_SOURCE_DIR}/CMake/otbTestUniquePtr.cpp)
-try_compile(OTB_IS_OVERRIDE_DEFINED ${CMAKE_CURRENT_BINARY_DIR}/CMake ${CMAKE_SOURCE_DIR}/CMake/otbTestUniquePtr.cpp)
-try_compile(OTB_IS_NULLPTR_DEFINED ${CMAKE_CURRENT_BINARY_DIR}/CMake ${CMAKE_SOURCE_DIR}/CMake/otbTestUniquePtr.cpp)
+unset(OTB_HAS_CXX11 CACHE)
+CHECK_CXX_SOURCE_COMPILES("
+#ifdef _MSC_VER
+  #if _MSC_VER <= 1700
+    #error Compiler is not C++11 compliant
+  #endif
+#else
+  #if __cplusplus <= 199711L
+    #error Compiler is not C++11 compliant
+  #endif
+#endif
+
+int main(int argc, char *argv[])
+{
+  return 0;
+}
+
+"
+OTB_HAS_CXX11 )
+
+unset(OTB_CXX_HAS_UNIQUE_PTR CACHE)
+CHECK_CXX_SOURCE_COMPILES("
+#include <memory>
+struct Foo
+{
+  Foo()  { }
+  ~Foo() { }
+};
+
+int main(int argc, char *argv[])
+{
+  std::unique_ptr<Foo> p(new Foo);
+  return 0;
+}
+
+"
+OTB_CXX_HAS_UNIQUE_PTR )
+
+unset(OTB_CXX_HAS_OVERRIDE_SPECIFIER CACHE)
+CHECK_CXX_SOURCE_COMPILES("
+struct A
+{
+  A()  { }
+  ~A() { }
+  virtual void foo( ) {  }
+};
+
+struct B : A
+{
+  B()  { }
+  ~B() { }
+  void foo( ) override {  }
+};
+
+int main(int argc, char *argv[])
+{
+  A* p = new B;
+  p->foo();
+  return 0;
+}
+
+"
+OTB_CXX_HAS_OVERRIDE_SPECIFIER )
+
+unset(OTB_CXX_HAS_NULLPTR CACHE)
+CHECK_CXX_SOURCE_COMPILES("
+#include <cstddef>
+int main(int argc, char *argv[])
+{
+  int *p = nullptr;
+  return 0;
+}
+"
+OTB_CXX_HAS_NULLPTR )
+
+# try_compile(
+#   OTB_HAS_CXX11
+#   ${CMAKE_CURRENT_BINARY_DIR}/CMake
+#   ${CMAKE_SOURCE_DIR}/CMake/otbTestUniquePtr.cpp
+#   )
 
diff --git a/CMake/OTBCheckTargetSystemArch.cmake b/CMake/OTBCheckTargetSystemArch.cmake
new file mode 100755
index 0000000..5764a21
--- /dev/null
+++ b/CMake/OTBCheckTargetSystemArch.cmake
@@ -0,0 +1,51 @@
+macro(OTB_CHECK_TARGET_SYSTEM_ARCH _RESULT1 _RESULT2)
+  set(${_RESULT1} "x64")
+  set(${_RESULT2} TRUE)
+
+  if(MSVC)
+    execute_process(
+      COMMAND ${CMAKE_C_COMPILER}
+      ERROR_VARIABLE ev
+      OUTPUT_VARIABLE ov
+      OUTPUT_QUIET
+      OUTPUT_STRIP_TRAILING_WHITESPACE
+      )
+
+    if("${ev}" MATCHES "x86")
+      set(${_RESULT1} "x86")
+      set(${_RESULT2} FALSE)
+    endif()
+  endif() #MSVC
+
+  if(UNIX)
+    execute_process(
+      COMMAND uname -m
+      ERROR_VARIABLE ev
+      OUTPUT_VARIABLE ov
+      OUTPUT_STRIP_TRAILING_WHITESPACE
+      )
+    
+    set(${_RESULT1} "${ov}")
+    set(${_RESULT2} FALSE)
+    if("${ov}" STREQUAL "x86_64")
+      set(${_RESULT2} TRUE)
+    endif()
+  endif()
+
+  if(WIN32 AND NOT MSVC)
+    if(MXE_TARGET_DIR)
+      if(MXE_TARGET_DIR MATCHES "i686")
+	set(${_RESULT1} "i686")
+	set(${_RESULT2} FALSE)
+      elseif(MXE_TARGET_DIR MATCHES "x86_64")
+	set(${_RESULT1} "x86_64")
+	set(${_RESULT2} TRUE)
+      endif()
+    else()
+      message(STATUS "MXE_TARGET_DIR not set!")
+    endif()
+  endif()
+endmacro()
+
+#call macro
+OTB_CHECK_TARGET_SYSTEM_ARCH(OTB_TARGET_SYSTEM_ARCH OTB_TARGET_SYSTEM_ARCH_IS_X64)
diff --git a/CMake/OTBModuleEnablement.cmake b/CMake/OTBModuleEnablement.cmake
index 174f85c..a2d78ac 100644
--- a/CMake/OTBModuleEnablement.cmake
+++ b/CMake/OTBModuleEnablement.cmake
@@ -58,6 +58,9 @@ macro(otb_module_check otb-module _needed_by stack)
     foreach(dep IN LISTS OTB_MODULE_${otb-module}_DEPENDS)
       otb_module_check(${dep} ${otb-module} "${otb-module};${stack}")
     endforeach()
+    foreach(dep IN LISTS OTB_MODULE_${otb-module}_OPTIONAL_DEPENDS)
+      otb_module_check(${dep} ${otb-module} "${otb-module};${stack}")
+    endforeach()
     set(check_finished_${otb-module} 1)
   endif()
 endmacro()
diff --git a/CMake/OTBModuleExternal.cmake b/CMake/OTBModuleExternal.cmake
index 9e70c3f..e4be6d5 100644
--- a/CMake/OTBModuleExternal.cmake
+++ b/CMake/OTBModuleExternal.cmake
@@ -48,11 +48,11 @@ if(NOT OTB_INSTALL_PACKAGE_DIR)
 endif()
 
 # Use OTB's flags.
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OTB_REQUIRED_C_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OTB_REQUIRED_CXX_FLAGS}")
-set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
+set(CMAKE_C_FLAGS "${OTB_REQUIRED_C_FLAGS} ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "${OTB_REQUIRED_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
+set(CMAKE_EXE_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
+set(CMAKE_SHARED_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
+set(CMAKE_MODULE_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
 option(BUILD_SHARED_LIBS "Build OTB with shared libraries." ${OTB_BUILD_SHARED})
 
 # Add the OTB_MODULES_DIR to the CMAKE_MODULE_PATH and then use the binary
diff --git a/CMake/OTBModuleHeaderTest.cmake b/CMake/OTBModuleHeaderTest.cmake
index c381f0d..6a1c721 100644
--- a/CMake/OTBModuleHeaderTest.cmake
+++ b/CMake/OTBModuleHeaderTest.cmake
@@ -25,7 +25,9 @@ SET(BANNED_HEADERS)
 if(NOT OTB_USE_OPENCV)
 	SET(BANNED_HEADERS "${BANNED_HEADERS} otbDecisionTreeMachineLearningModelFactory.h otbDecisionTreeMachineLearningModel.h otbKNearestNeighborsMachineLearningModelFactory.h otbKNearestNeighborsMachineLearningModel.h otbRandomForestsMachineLearningModelFactory.h otbRandomForestsMachineLearningModel.h otbSVMMachineLearningModelFactory.h otbSVMMachineLearningModel.h otbGradientBoostedTreeMachineLearningModelFactory.h otbGradientBoostedTreeMachineLearningModel.h otbBoostMachineLearningModelFa [...]
 endif()
- 
+if(NOT OTB_USE_SHARK)
+  SET(BANNED_HEADERS "${BANNED_HEADERS} otbSharkRandomForestsMachineLearningModel.h otbSharkRandomForestsMachineLearningModel.txx otbSharkUtils.h otbRequiresSharkCheck.h otbSharkRandomForestsMachineLearningModelFactory.h")  
+endif()
 if(NOT OTB_USE_LIBSVM)
 	SET(BANNED_HEADERS "${BANNED_HEADERS} otbLibSVMMachineLearningModel.h otbLibSVMMachineLearningModelFactory.h")
 endif()
diff --git a/CMake/OTBModuleMacros.cmake b/CMake/OTBModuleMacros.cmake
index 9f8afde..5a3e256 100644
--- a/CMake/OTBModuleMacros.cmake
+++ b/CMake/OTBModuleMacros.cmake
@@ -11,7 +11,12 @@ include(${_OTBModuleMacros_DIR}/OTBApplicationMacros.cmake)
 # don't work. Set the option to off and hide it.
 if(APPLE AND CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION  VERSION_LESS "4.3")
   set( USE_COMPILER_HIDDEN_VISIBILITY OFF CACHE INTERNAL "" )
+elseif(APPLE)
+  #RK:  compiler visibility nor woking on osx with appleclang xcode.
+  #gcc is a symlink to clang
+  set( USE_COMPILER_HIDDEN_VISIBILITY OFF CACHE INTERNAL "" )
 endif()
+
 include(GenerateExportHeader)
 
 if(OTB_CPPCHECK_TEST)
@@ -108,7 +113,7 @@ macro(otb_module_impl)
   add_custom_target(${otb-module}-all ALL SOURCES ${_srcs})
 
   otb_module_use(${OTB_MODULE_${otb-module}_DEPENDS})
-  
+
   foreach(dep IN LISTS OTB_MODULE_${otb-module}_OPTIONAL_DEPENDS)
     if (${dep}_ENABLED)
       otb_module_use(${dep})
@@ -117,11 +122,11 @@ macro(otb_module_impl)
 
   if(NOT DEFINED ${otb-module}_LIBRARIES)
     set(${otb-module}_LIBRARIES "")
-    
+
     foreach(dep IN LISTS OTB_MODULE_${otb-module}_DEPENDS)
       list(APPEND ${otb-module}_LIBRARIES "${${dep}_LIBRARIES}")
     endforeach()
-    
+
     foreach(dep IN LISTS OTB_MODULE_${otb-module}_OPTIONAL_DEPENDS)
       if (${dep}_ENABLED)
         list(APPEND ${otb-module}_LIBRARIES "${${dep}_LIBRARIES}")
@@ -137,11 +142,19 @@ macro(otb_module_impl)
     list(APPEND ${otb-module}_INCLUDE_DIRS ${${otb-module}_SOURCE_DIR}/include)
     install(DIRECTORY include/ DESTINATION ${${otb-module}_INSTALL_INCLUDE_DIR} COMPONENT Development)
   endif()
-  
+
   if(NOT OTB_SOURCE_DIR)
     # When building a module outside the OTB source tree, find the export
     # header.
     list(APPEND ${otb-module}_INCLUDE_DIRS ${${otb-module}_BINARY_DIR}/include)
+  else()
+    # if OTB_SOURCE_DIR is set all auto-generated export headers for a class
+    # goes into OTBCommon_BINARY_DIR/src.
+    # Hence it is required to include   ${OTBCommon_BINARY_DIR} to list of
+    # ${otb-module}_INCLUDE_DIRS. Not doing this will force developer to
+    # to include them explicitly for each module which can result in
+    # more problems. ( stephane albert)
+    list(APPEND ${otb-module}_INCLUDE_DIRS ${OTBCommon_BINARY_DIR})
   endif()
 
   if(${otb-module}_INCLUDE_DIRS)
@@ -319,3 +332,9 @@ macro(otb_module_target _name)
     otb_module_target_install(${_name})
   endif()
 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()  
+endmacro()
diff --git a/CMake/OTBSetStandardCompilerFlags.cmake b/CMake/OTBSetStandardCompilerFlags.cmake
index c44cb79..249b396 100644
--- a/CMake/OTBSetStandardCompilerFlags.cmake
+++ b/CMake/OTBSetStandardCompilerFlags.cmake
@@ -22,6 +22,17 @@
 include(OTB_CheckCCompilerFlag)
 include(OTB_CheckCXXCompilerFlag)
 
+macro( set_debug_flags )
+  string( TOUPPER "${CMAKE_BUILD_TYPE}" MODE )
+
+  if( "${MODE}" STREQUAL "DEBUG" )
+    message( STATUS "Adding -DOTB_DEBUG" )
+
+    set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DOTB_DEBUG" )
+    set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DOTB_DEBUG" )
+  endif()
+endmacro()
+
 function(check_c_compiler_warning_flags c_flag_var)
   set(local_c_flags "")
   set(flag_list "${ARGN}")
@@ -62,7 +73,7 @@ function(check_compiler_warning_flags c_warning_flags_var cxx_warning_flags_var)
   ## is reporting 1000's of wanings in windows
   ## header files, for now, limit the number of
   ## warnings to level 3
-  if( WIN32 )
+  if( MSVC )
     set(VerboseWarningsFlag -W3 )
     ## A better solution would be to use -Wall,
     ## and then disable warnings one by one
@@ -88,7 +99,7 @@ function(check_compiler_warning_flags c_warning_flags_var cxx_warning_flags_var)
       #-wd1419 #Needed for Intel compilers with remark  #1419: external declaration in primary source file
       #-wd1572 #Needed for Intel compilers with remark  #1572: floating-point equality and inequality comparisons are unreliable
       #-wd2259 #Needed for Intel compilers with remark  #2259: non-pointer conversion from "otb::SizeValueType={unsigned long}" to "double" may lose significant bits
-      #-wd1268 #Needed for Intel compliers with warning #1268: support for exported templates is disabled
+      #-wd1268 #Needed for Intel compilers with warning #1268: support for exported templates is disabled
     else()
       set(VerboseWarningsFlag -Wall )
     endif ()
@@ -132,23 +143,6 @@ endfunction()
 
 
 macro(check_compiler_platform_flags)
-  # Since CMake 2.8.11, the size of the stack is not modified by CMake on
-  # windows platform, it uses the default size: with visual compiler it is 1Mbyte
-  # which is to lower for us (thanks to 6S code).
-  if(MSVC)
-    if (${CMAKE_VERSION} VERSION_GREATER "2.8.10.2")
-      if("${CMAKE_EXE_LINKER_FLAGS}" MATCHES "/STACK:[0-9]+")
-          message(STATUS "The size of the stack is already defined, so we dont't modified it.")
-      else()
-          set(OTB_REQUIRED_LINK_FLAGS "${OTB_REQUIRED_LINK_FLAGS} /STACK:10000000")
-          message(STATUS "The stack size is set to 10 Mbytes (/STACK:10000000).")
-      endif()
-    endif() #if (${CMAKE_VERSION..
-  elseif(MINGW)
-    set(OTB_REQUIRED_LINK_FLAGS "${OTB_REQUIRED_LINK_FLAGS} -Wl,--stack,10000000")
-    message(STATUS "The stack size is set to 10 Mbytes (-Wl,--stack,10000000).")
-  endif() # if(MSVC)
-
   # On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
   # warnings
   if(WIN32)
@@ -195,12 +189,18 @@ macro(check_compiler_platform_flags)
         set(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-auto-import")
       endif()
     else()
-      if(BUILD_SHARED_LIBS)
-        set(OTB_LIBRARY_BUILD_TYPE "SHARED")
-      else()
-        set(OTB_LIBRARY_BUILD_TYPE "STATIC")
+      # if CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS is on, then
+      # BUILD_SHARED_LIBS works as it would on other systems
+      if(NOT CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS)
+        if(BUILD_SHARED_LIBS)
+          set(OTB_LIBRARY_BUILD_TYPE "SHARED")
+        else()
+          set(OTB_LIBRARY_BUILD_TYPE "STATIC")
+        endif()
+        # turn off BUILD_SHARED_LIBS as OTB_LIBRARY_BUILD_TYPE
+        # is used on the libraries that have markup.
+        set(BUILD_SHARED_LIBS OFF)
       endif()
-      set(BUILD_SHARED_LIBS OFF)
     endif()
   endif()
   #-----------------------------------------------------------------------------
@@ -307,9 +307,26 @@ check_compiler_warning_flags(C_WARNING_FLAGS CXX_WARNING_FLAGS)
 # Append OTB warnings to the CMake flags.
 # We do not set them in OTB_REQUIRED FLAGS because all project which
 # use OTB don't require these flags .
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_WARNING_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_WARNING_FLAGS}")
+set(CMAKE_C_FLAGS "${C_WARNING_FLAGS} ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CXX_WARNING_FLAGS} ${CMAKE_CXX_FLAGS}")
+
+set_debug_flags()
 
 #-----------------------------------------------------------------------------
 #Check the set of platform flags the compiler supports
 check_compiler_platform_flags()
+
+
+# Usage: set_linker_stack_size_flag(otbApplicationLauncherCommandLine 10000000)
+# The above macro call will set LINK_FLAGS executable target named
+# otbApplicationLauncherCommandLine to 10Mbytes
+macro(set_linker_stack_size_flag exe_target requested_stack_size)
+  # Since CMake 2.8.11, the size of the stack is not modified by CMake on
+  # windows platform, it uses the default size: with visual compiler it is 1Mbyte
+  # which is to lower for us (thanks to 6S code).
+  if(MSVC)
+    set_target_properties(${exe_target} PROPERTIES LINK_FLAGS "/STACK:${requested_stack_size}")
+  elseif(MINGW)
+    set_target_properties(${exe_target} PROPERTIES LINK_FLAGS "-Wl,--stack,${requested_stack_size}")
+  endif()
+endmacro()
\ No newline at end of file
diff --git a/CMake/SourceStatus.cmake b/CMake/SourceStatus.cmake
index 3e176df..4b245c8 100644
--- a/CMake/SourceStatus.cmake
+++ b/CMake/SourceStatus.cmake
@@ -48,16 +48,20 @@ function(repository_status root_repo_dir result_var1)
     WORKING_DIRECTORY ${root_repo_dir}
     OUTPUT_VARIABLE OTB_WC_REVISION
     OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
+
+  message(STATUS "Repository status (${dir_name}) :")
+  message(STATUS "  Repository revision is ${OTB_WC_REVISION}")
+
   execute_process(COMMAND ${GIT_EXECUTABLE} status -s
     WORKING_DIRECTORY ${root_repo_dir}
     OUTPUT_VARIABLE OTB_WC_STATUS
+    TIMEOUT 20
     OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
-  message(STATUS "Repository status (${dir_name}) :")
-  message(STATUS "  Repository revision is ${OTB_WC_REVISION}")
+
   if(OTB_WC_STATUS)
     message(STATUS "  Local file modifications (${dir_name}) :")
     string(REPLACE "\n" "\n--     " OTB_WC_STATUS_PRETTYPRINT "    ${OTB_WC_STATUS}")
-    message(STATUS "${OTB_WC_STATUS_PRETTYPRINT}")
+    message(WARNING "${OTB_WC_STATUS_PRETTYPRINT}")
   else()
     message(STATUS "  No files modified locally (${dir_name})")
   endif()
diff --git a/CMake/UseJava.cmake b/CMake/UseJava.cmake
index 969af2f..013a347 100644
--- a/CMake/UseJava.cmake
+++ b/CMake/UseJava.cmake
@@ -112,7 +112,7 @@
 #                [VERSION TRUE|FALSE]
 #               )
 #
-# Create jave documentation based on files or packages. For more
+# Create java documentation based on files or packages. For more
 # details please read the javadoc manpage.
 #
 # There are two main signatures for create_javadoc. The first
@@ -120,7 +120,7 @@
 #
 #   Example:
 #   create_javadoc(my_example_doc
-#     PACKAGES com.exmaple.foo com.example.bar
+#     PACKAGES com.example.foo com.example.bar
 #     SOURCEPATH ${CMAKE_CURRENT_SOURCE_PATH}
 #     CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH}
 #     WINDOWTITLE "My example"
diff --git a/CMake/UseOTB.cmake b/CMake/UseOTB.cmake
index ed0da34..5a891e4 100644
--- a/CMake/UseOTB.cmake
+++ b/CMake/UseOTB.cmake
@@ -4,12 +4,11 @@
 # obtained from OTBConfig.cmake.
 
 # Add compiler flags needed to use OTB.
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OTB_REQUIRED_C_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OTB_REQUIRED_CXX_FLAGS}")
-set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-
+set(CMAKE_C_FLAGS "${OTB_REQUIRED_C_FLAGS} ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "${OTB_REQUIRED_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
+set(CMAKE_EXE_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
+set(CMAKE_SHARED_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
+set(CMAKE_MODULE_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
 
 # Add include directories needed to use OTB.
 include_directories(${OTB_INCLUDE_DIRS})
diff --git a/CMake/cmake_uninstall.cmake.in b/CMake/cmake_uninstall.cmake.in
index fed0791..24327a8 100644
--- a/CMake/cmake_uninstall.cmake.in
+++ b/CMake/cmake_uninstall.cmake.in
@@ -20,3 +20,31 @@ foreach(file ${files})
     message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
   endif()
 endforeach(file)
+
+set(otb_dir_name "OTB- at OTB_VERSION_MAJOR@. at OTB_VERSION_MINOR@")
+
+set(installed_dirs)
+# include/OTB-X.Y directory
+list(APPEND installed_dirs "@CMAKE_INSTALL_PREFIX@/include/${otb_dir_name}")
+# lib/{otb,python} directory
+list(APPEND installed_dirs "@CMAKE_INSTALL_PREFIX@/lib/otb")
+# lib/cmake/OTB-X.Y directory
+list(APPEND installed_dirs "@CMAKE_INSTALL_PREFIX@/lib/cmake/${otb_dir_name}")
+# share/OTB-X.Y directory
+list(APPEND installed_dirs "@CMAKE_INSTALL_PREFIX@/share/${otb_dir_name}")
+# share/doc/OTB-X.Y directory
+list(APPEND installed_dirs "@CMAKE_INSTALL_PREFIX@/share/doc/${otb_dir_name}")
+
+foreach(installed_dir ${installed_dirs})
+  message(STATUS "Uninstalling ${installed_dir}")
+  if(EXISTS "${installed_dir}" AND IS_DIRECTORY "${installed_dir}")
+    execute_process(COMMAND
+      "@CMAKE_COMMAND@" -E remove_directory "${installed_dir}"
+      OUTPUT_VARIABLE out_rmdir
+      RESULT_VARIABLE res_rmdir
+      )
+    if(NOT "${res_rmdir}" STREQUAL 0)
+      message(FATAL_ERROR "Problem when removing ${installed_dir}")
+    endif()
+  endif()
+endforeach()
diff --git a/CMake/i18n_qt4.cmake b/CMake/i18n_qt4.cmake
new file mode 100644
index 0000000..4d02dda
--- /dev/null
+++ b/CMake/i18n_qt4.cmake
@@ -0,0 +1,101 @@
+#
+# Reset Qt I18N source files cache variable.
+macro( reset_qt4_i18n_sources )
+  set( OTB_QT_I18N_INCLUDE_PATH "" CACHE INTERNAL "" FORCE )
+  set( OTB_QT_I18N_HEADER_FILES "" CACHE INTERNAL "" FORCE )
+  set( OTB_QT_I18N_SOURCE_FILES "" CACHE INTERNAL "" FORCE )
+  set( OTB_QT_I18N_FORM_FILES "" CACHE INTERNAL "" FORCE )
+endmacro()
+
+# string( REPLACE ".cxx" ".h" OTB_QT_I18N_HEADER_FILES OTB_QT_I18N_SOURCE_FILES )
+
+# string( REPLACE ".cxx" ".ui" OTB_QT_I18N_HEADER_FILES OTB_QT_I18N_SOURCE_FILES )
+
+#
+# Func
+function( add_to_qt4_i18n_files RESULT )
+  foreach( F ${ARGN} )
+    #message( "${F}" )
+
+    get_filename_component( ABS_FILE ${F} ABSOLUTE )
+
+    set(${RESULT} ${${RESULT}} ${ABS_FILE} CACHE INTERNAL "")
+  endforeach()
+endfunction()
+
+#
+#
+macro( add_to_qt4_i18n_include_path DIRECTORY )
+  set(OTB_I18N_INCLUDE_PATH ${OTB_I18N_INCLUDE_PATH} ${DIRECTORY} CACHE INTERNAL "")
+endmacro()
+
+#
+#
+macro( add_to_qt4_i18n_headers INCLUDE_DIR )
+
+  get_filename_component( ABS_INCLUDE_DIR ${INCLUDE_DIR} ABSOLUTE )
+
+  set(OTB_QT_I18N_INCLUDE_PATH ${OTB_QT_I18N_INCLUDE_PATH} ${ABS_INCLUDE_DIR} CACHE INTERNAL "")
+
+  foreach( F ${ARGN} )
+    string( REPLACE ".cxx" ".h" HEADER ${F} )
+    set( ABS_HEADER "${ABS_INCLUDE_DIR}/${HEADER}" )
+    if(EXISTS ${ABS_HEADER})
+      set(OTB_QT_I18N_HEADER_FILES ${OTB_QT_I18N_HEADER_FILES} ${ABS_HEADER} CACHE INTERNAL "")
+    endif()
+  endforeach()
+endmacro()
+
+#
+# Add source files to Qt I18n translation build.
+macro( add_to_qt4_i18n_sources )
+  add_to_qt4_i18n_files( OTB_QT_I18N_SOURCE_FILES ${ARGN} )
+endmacro()
+
+#
+# Add source files to Qt I18n translation build.
+macro( add_to_qt4_i18n_forms )
+  add_to_qt4_i18n_files( OTB_QT_I18N_FORM_FILES ${ARGN} )
+endmacro()
+
+#
+#
+macro( generate_qt4_project FILENAME )
+  message( STATUS "Generating Qt4 '${FILENAME}' project file for I18N." )
+
+  unset(_OTB_QT_I18N_INCLUDE_PATH_PRO)
+  unset(_OTB_QT_I18N_HEADER_PRO)
+  unset(_OTB_QT_I18N_SOURCE_PRO)
+  unset(_OTB_QT_I18N_FORM_PRO)
+  foreach(_path ${OTB_QT_I18N_INCLUDE_PATH})
+    set(_OTB_QT_I18N_INCLUDE_PATH_PRO
+      "${_OTB_QT_I18N_INCLUDE_PATH_PRO} \"${_path}\"")
+  endforeach()
+  foreach(_file ${OTB_QT_I18N_HEADER_FILES})
+    set(_OTB_QT_I18N_HEADER_PRO
+      "${_OTB_QT_I18N_HEADER_PRO} \"${_file}\"")
+  endforeach()
+  foreach(_file ${OTB_QT_I18N_SOURCE_FILES})
+    set(_OTB_QT_I18N_SOURCE_PRO
+      "${_OTB_QT_I18N_SOURCE_PRO} \"${_file}\"")
+  endforeach()
+  foreach(_file ${OTB_QT_I18N_FORM_FILES})
+    set(_OTB_QT_I18N_FORM_PRO
+      "${_OTB_QT_I18N_FORM_PRO} \"${_file}\"")
+  endforeach()
+
+  file( WRITE
+    ${FILENAME}
+
+    "# OTB autogenerated .pro file needed to generate Qt I18N translations
+
+INCLUDEPATH = ${_OTB_QT_I18N_INCLUDE_PATH_PRO}
+
+HEADERS = ${_OTB_QT_I18N_HEADER_PRO}
+
+SOURCES = ${_OTB_QT_I18N_SOURCE_PRO}
+
+FORMS = ${_OTB_QT_I18N_FORM_PRO}
+"
+    )
+endmacro()
diff --git a/CMake/otbTestNullPtr.cpp b/CMake/otbTestNullPtr.cpp
deleted file mode 100644
index 8abf4a6..0000000
--- a/CMake/otbTestNullPtr.cpp
+++ /dev/null
@@ -1,6 +0,0 @@
-
-int main(int argc, char *argv[])
-{
-  int *p = ITK_NULLPTR;
-  return 0;
-}
diff --git a/CMake/otbTestNumpy.py b/CMake/otbTestNumpy.py
index 6b9a801..767bbba 100644
--- a/CMake/otbTestNumpy.py
+++ b/CMake/otbTestNumpy.py
@@ -1,2 +1,2 @@
 import numpy
-print numpy.get_include()
+print(numpy.get_include())
diff --git a/CMake/otbTestOverride.cpp b/CMake/otbTestOverride.cpp
deleted file mode 100644
index 54cf9a8..0000000
--- a/CMake/otbTestOverride.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <iostream>
-
-struct A
-{
-  A() {}
-  ~A() {}
-  virtual void foo() { std::cout << "A::foo()\n"; }
-};
-
-struct B : A
-{
-  B() {}
-  ~B() {}
-  void foo() override { std::cout << "B::foo()\n"; }
-};
-
-int main(int argc, char *argv[])
-{
-  A* p = new B;
-  p->foo();
-  return 0;
-}
diff --git a/CMake/otbTestUniquePtr.cpp b/CMake/otbTestUniquePtr.cpp
deleted file mode 100644
index 292792e..0000000
--- a/CMake/otbTestUniquePtr.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <iostream>
-#include <memory>
-
-struct Foo
-{
-  Foo() { std::cout << "Constructor\n"; }
-  ~Foo() { std::cout << "Destructor\n"; }
-};
-
-int main(int argc, char *argv[])
-{
-  std::unique_ptr<Foo> p(new Foo);
-  return 0;
-}
diff --git a/CMake/otbcli.sh.in b/CMake/otbcli.sh.in
index 0084a39..3fd44c7 100644
--- a/CMake/otbcli.sh.in
+++ b/CMake/otbcli.sh.in
@@ -1,13 +1,13 @@
-#!/bin/bash
+#!/bin/sh
 
 #
 # Autogenerated by OTB installation process
 # DO NOT MODIFY
 #
 
-CURRENT_SCRIPT_DIR=`dirname $0`
+CURRENT_SCRIPT_DIR=$(dirname "$0")
 
-if [ -e $CURRENT_SCRIPT_DIR/otbApplicationLauncherCommandLine ]
+if [ -e "$CURRENT_SCRIPT_DIR/otbApplicationLauncherCommandLine" ]
 then
   # Prefer using the launcher inside the script dir
   OTB_CLI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbApplicationLauncherCommandLine
@@ -17,7 +17,7 @@ else
 fi
 
 # works for install tree
-if [ -d $CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR@ ]
+if [ -d "$CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR@" ]
 then
   OTB_APPLICATION_PATH=$CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR@:$OTB_APPLICATION_PATH
 fi
@@ -28,5 +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"
+fi
+
 # start the application
 $OTB_CLI_LAUNCHER "$@"
diff --git a/CMake/otbcli_app.sh.in b/CMake/otbcli_app.sh.in
index f24399e..c073ae1 100644
--- a/CMake/otbcli_app.sh.in
+++ b/CMake/otbcli_app.sh.in
@@ -1,13 +1,13 @@
-#!/bin/bash
+#!/bin/sh
 
 #
 # Autogenerated by OTB installation process
 # DO NOT MODIFY
 #
 
-CURRENT_SCRIPT_DIR=`dirname $0`
+CURRENT_SCRIPT_DIR=$(dirname "$0")
 
-if [ -e $CURRENT_SCRIPT_DIR/otbcli ]
+if [ -e "$CURRENT_SCRIPT_DIR/otbcli" ]
 then
   # Prefer using the launcher inside the script dir
   OTB_CLI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbcli
diff --git a/CMake/otbgui.sh.in b/CMake/otbgui.sh.in
index d18a4e1..5b389e1 100644
--- a/CMake/otbgui.sh.in
+++ b/CMake/otbgui.sh.in
@@ -1,13 +1,13 @@
-#!/bin/bash
+#!/bin/sh
 
 #
 # Autogenerated by OTB installation process
 # DO NOT MODIFY
 #
 
-CURRENT_SCRIPT_DIR=`dirname $0`
+CURRENT_SCRIPT_DIR=$(dirname "$0")
 
-if [ -e $CURRENT_SCRIPT_DIR/otbApplicationLauncherQt ]
+if [ -e "$CURRENT_SCRIPT_DIR/otbApplicationLauncherQt" ]
 then
   # Prefer using the launcher inside the script dir
   OTB_GUI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbApplicationLauncherQt
@@ -17,7 +17,7 @@ else
 fi
 
 # use the default install tree path for applications
-if [ -d $CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR@ ]
+if [ -d "$CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR@" ]
 then
   OTB_APPLICATION_PATH=$CURRENT_SCRIPT_DIR/../@OTB_INSTALL_APP_DIR@:$OTB_APPLICATION_PATH
 fi
@@ -28,5 +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"
+fi
+
 # start the application
 $OTB_GUI_LAUNCHER "$@"
diff --git a/CMake/otbgui_app.sh.in b/CMake/otbgui_app.sh.in
index ab22b03..7243475 100644
--- a/CMake/otbgui_app.sh.in
+++ b/CMake/otbgui_app.sh.in
@@ -1,13 +1,13 @@
-#!/bin/bash
+#!/bin/sh
 
 #
 # Autogenerated by OTB installation process
 # DO NOT MODIFY
 #
 
-CURRENT_SCRIPT_DIR=`dirname $0`
+CURRENT_SCRIPT_DIR=$(dirname "$0")
 
-if [ -e $CURRENT_SCRIPT_DIR/otbgui ]
+if [ -e "$CURRENT_SCRIPT_DIR/otbgui" ]
 then
   # Prefer using the launcher inside the script dir
   OTB_GUI_LAUNCHER=$CURRENT_SCRIPT_DIR/otbgui
diff --git a/CMake/qt.conf.in b/CMake/qt.conf.in
new file mode 100644
index 0000000..4f62e27
--- /dev/null
+++ b/CMake/qt.conf.in
@@ -0,0 +1,3 @@
+[Paths]
+Translations=@QT_TRANSLATIONS_DIR@
+Plugins=@QT_PLUGINS_DIR@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index be435b9..998f039 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,4 @@
-if(WIN32)
-  cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
-else()
-  cmake_minimum_required(VERSION 2.8.6 FATAL_ERROR)
-endif()
+cmake_minimum_required(VERSION 2.8.11)
 
 foreach(p
     CMP0025 # CMake 3.0
@@ -67,6 +63,9 @@ include(PreventInBuildInstalls)
 include(OTBModuleMacros)
 include(OTBModuleRemote)
 include(OTBModuleTest)
+include( i18n_qt4 )
+
+reset_qt4_i18n_sources()
 
 repository_status(${PROJECT_SOURCE_DIR} OTB_GIT_STATUS_MESSAGE)
 
@@ -87,10 +86,21 @@ set(main_project_name ${_OTBModuleMacros_DEFAULT_LABEL})
 #-----------------------------------------------------------------------------
 # OTB version number.
 set(OTB_VERSION_MAJOR "5")
-set(OTB_VERSION_MINOR "6")
-set(OTB_VERSION_PATCH "1")
+set(OTB_VERSION_MINOR "8")
+set(OTB_VERSION_PATCH "0")
 set(OTB_VERSION_STRING "${OTB_VERSION_MAJOR}.${OTB_VERSION_MINOR}.${OTB_VERSION_PATCH}")
 
+# Monteverdi version number (follows OTB)
+set( Monteverdi_VERSION_MAJOR ${OTB_VERSION_MAJOR} )
+set( Monteverdi_VERSION_MINOR ${OTB_VERSION_MINOR} )
+set( Monteverdi_VERSION_PATCH ${OTB_VERSION_PATCH} )
+set( Monteverdi_VERSION_SUFFIX "" )
+
+set( Monteverdi_VERSION_STRING
+  "${Monteverdi_VERSION_MAJOR}.${Monteverdi_VERSION_MINOR}.${Monteverdi_VERSION_PATCH}${Monteverdi_VERSION_SUFFIX}"
+  )
+
+#-----------------------------------------------------------------------------
 string(TIMESTAMP OTB_BUILD_TIMESTAMP)
 
 if(NOT OTB_INSTALL_RUNTIME_DIR)
@@ -164,6 +174,13 @@ endmacro()
 option(BUILD_SHARED_LIBS "Build OTB with shared libraries." ON)
 set(OTB_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 
+if(MSVC)
+  option(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS "Build OTB with shared libraries." ON)
+  set(OTB_CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ${CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS})
+else()
+  set(OTB_CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS OFF)
+endif()
+
 #-----------------------------------------------------------------------------
 # Option to activate deprecated classes
 option(OTB_USE_DEPRECATED "Turn on the use and test of deprecated classes" OFF)
@@ -181,11 +198,11 @@ include(OTBSetStandardCompilerFlags)
 # TODO check if we need this
 #include(otbTestFriendTemplatedFunction)
 
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OTB_REQUIRED_C_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OTB_REQUIRED_CXX_FLAGS}")
-set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
-set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OTB_REQUIRED_LINK_FLAGS}")
+set(CMAKE_C_FLAGS "${OTB_REQUIRED_C_FLAGS} ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "${OTB_REQUIRED_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
+set(CMAKE_EXE_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
+set(CMAKE_SHARED_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
+set(CMAKE_MODULE_LINKER_FLAGS "${OTB_REQUIRED_LINK_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
 
 # detect some C++11 keywords
 include(OTBCheckCpp11Keywords)
@@ -230,6 +247,19 @@ if(OTB_DATA_USE_LARGEINPUT)
   mark_as_advanced(OTB_DATA_LARGEINPUT_ROOT)
 endif()
 
+# Small macro to copy a file and rename it
+macro(otb_copy_rename _input _output)
+  execute_process(
+    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_input}" "${_output}"
+    RESULT_VARIABLE _err_code
+    OUTPUT_QUIET
+    ERROR_QUIET
+    )
+  if(_err_code)
+    message(FATAL_ERROR "Failed to copy file ${_input} to ${_output}")
+  endif()
+endmacro()
+
 #Generate cmake variables with a set of largeinput data used in tests
 include(OTBManageLargeInputPaths)
 
@@ -361,7 +391,7 @@ add_subdirectory(Utilities/Doxygen)
 
 add_subdirectory(Utilities/Completion)
 
-#----------------------------------------------------------------------
+#----------------------------------------------------------------------------
 # Provide a target to generate the SuperBuild archive (only for Unix)
 if(UNIX)
   add_custom_target(SuperBuild-archive
@@ -376,6 +406,7 @@ endif()
 # Create target to download data from the OTBData group. This must come after
 # all tests have been added that reference the group, so we put it last.
 
+#-----------------------------------------------------------------------------
 # uninstall target
 configure_file(
     "${CMAKE_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in"
@@ -385,6 +416,19 @@ configure_file(
 add_custom_target(uninstall
   COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/cmake_uninstall.cmake)
 
+# #-----------------------------------------------------------------------------
+# # Packaging options for Windows packages
+# if(WIN32 OR CMAKE_CROSSCOMPILING)
+#   option(GENERATE_PACKAGE "Generate OTB package" OFF)
+#   option(GENERATE_XDK "Generate XDK for OTB development" OFF)
+#   if(GENERATE_PACKAGE OR GENERATE_XDK)
+#     set(MXE_TARGET_DIR "" CACHE PATH "path to mxe directory")
+#     set(PACKAGE_OTB_SRC_DIR ${OTB_SOURCE_DIR})
+#     add_subdirectory(${OTB_SOURCE_DIR}/SuperBuild/Packaging ${CMAKE_BINARY_DIR}/Packaging)
+#   endif() # (GENERATE_PACKAGE OR GENERATE_XDK)
+# endif() # (WIN32 OR CMAKE_CROSSCOMPILING)
+
+#-----------------------------------------------------------------------------
 #macro to put a fixed space between key, value  in summary
 macro(get_white_spaces var res)
   string(LENGTH "${var}" len)
@@ -419,6 +463,7 @@ foreach(otb_option
     CMAKE_BUILD_TYPE
     CMAKE_C_FLAGS
     CMAKE_CXX_FLAGS
+    OTB_HAS_CXX11
     ${option_list}
     OTB_WRAP_PYTHON
     OTB_WRAP_JAVA
@@ -434,7 +479,7 @@ endforeach()
 # message("OTB_MODULES_ENABLED      = ${modules_list_for_summary}")
 # unset(modules_list_for_summary)
 
-list(REMOVE_ITEM option_list "OTB_USE_6S" "OTB_USE_SIFTFAST" "OTB_USE_OPENCV" "OTB_USE_QT4")
+list(REMOVE_ITEM option_list "OTB_USE_6S" "OTB_USE_SIFTFAST" "OTB_USE_QT4")
 foreach(item ${option_list})
   if(NOT ${item})
     list(REMOVE_ITEM option_list "${item}" )
@@ -452,9 +497,6 @@ list(APPEND option_list TINYXML)
 #RK
 #Q: Why these two guys here? we already have option_list
 #A: Because cmake case sensitivity with variables.
-if(OTB_USE_OPENCV)
-  list(APPEND option_list OpenCV)
-endif()
 
 if(OTB_USE_QT4)
   list(APPEND option_list QT)
@@ -524,3 +566,7 @@ message("======================= End of OTB cmake summary ======================
 
 #don't need this one anymore. so unset it.
 unset(option_list)
+
+#----------------------------------------------------------------------------
+# I18N
+add_subdirectory( i18n )
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index d866c4a..5e4d028 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -1,7 +1,7 @@
 set(CTEST_PROJECT_NAME "OTB")
 set(CTEST_NIGHTLY_START_TIME "20:00:00 CEST")
 
-set(CTEST_DROP_METHOD "http")
+set(CTEST_DROP_METHOD "https")
 set(CTEST_DROP_SITE "dash.orfeo-toolbox.org")
 set(CTEST_DROP_LOCATION "/submit.php?project=OTB")
-set(CTEST_DROP_SITE_CDASH TRUE)
\ No newline at end of file
+set(CTEST_DROP_SITE_CDASH TRUE)
diff --git a/Examples/BasicFilters/BandMathXImageFilterExample.cxx b/Examples/BasicFilters/BandMathXImageFilterExample.cxx
index cf35e59..0f030a1 100644
--- a/Examples/BasicFilters/BandMathXImageFilterExample.cxx
+++ b/Examples/BasicFilters/BandMathXImageFilterExample.cxx
@@ -139,7 +139,7 @@ int main( int argc, char* argv[])
 //  Software Guide : BeginLatex
 //
 //  Now, we can define the expression. The variable im1 represents a pixel (made of 4 components) of the input image.
-//  The variable im1b1N5x5 represents a neigborhood of size 5x5 around this pixel (and so on for each band).
+//  The variable im1b1N5x5 represents a neighborhood of size 5x5 around this pixel (and so on for each band).
 //  The last element we need is the operator 'mean'. By setting its inputs with four neigborhoods, we tell this operator to process the four related bands.
 //  As output, it will produce a vector of four components; this is consistent with the fact that we wish to perform a difference with im1.
 //
@@ -154,7 +154,7 @@ int main( int argc, char* argv[])
 
 //  Software Guide : BeginLatex
 //
-//  Note that the importance of the averaging is driven by the names of the neigborhood variables.
+//  Note that the importance of the averaging is driven by the names of the neighborhood variables.
 //  Last thing we have to do, is to set the pipeline:
 //
 //  Software Guide : EndLatex
diff --git a/Examples/BasicFilters/PrintableImageFilterExample.cxx b/Examples/BasicFilters/PrintableImageFilterExample.cxx
index 4d07358..07f0544 100644
--- a/Examples/BasicFilters/PrintableImageFilterExample.cxx
+++ b/Examples/BasicFilters/PrintableImageFilterExample.cxx
@@ -51,7 +51,7 @@
 //
 // The band order in the image products can be also quite tricky. It could be in the wavelength order,
 // as it is the case for Quickbird (1: Blue, 2: Green, 3: Red, 4: NIR), in this case, you
-// have to be carefull to reverse the order if you want a natural display. It could also be reverse
+// have to be careful to reverse the order if you want a natural display. It could also be reverse
 // to facilitate direct viewing, as for SPOT5 (1: NIR, 2: Red, 3: Green, 4: SWIR) but in this situations
 // you have to be careful when you process the image.
 //
diff --git a/Examples/ChangeDetection/KullbackLeiblerProfileChDet.cxx b/Examples/ChangeDetection/KullbackLeiblerProfileChDet.cxx
index 7cef2c7..e528e13 100644
--- a/Examples/ChangeDetection/KullbackLeiblerProfileChDet.cxx
+++ b/Examples/ChangeDetection/KullbackLeiblerProfileChDet.cxx
@@ -59,7 +59,7 @@ int main(int argc, char * argv[])
     if (argc != 9)
       {
       std::cerr <<
-      "Detection de changements par mesure de Kullback-Leibler, optimisee par un developpement de Edgeworth\n";
+      "Change detection based on Kullback-Leibler distance betweenlocal pdf through an Edgeworth approximation\n";
       std::cerr << argv[0] <<
       " imgAv imgAp imgResu winSizeMin winSizeMax outRedIndex outGreenIndex outBlueIndex\n";
       return 1;
diff --git a/Examples/Classification/KMeansImageClassificationExample.cxx b/Examples/Classification/KMeansImageClassificationExample.cxx
index cd01749..5dde220 100644
--- a/Examples/Classification/KMeansImageClassificationExample.cxx
+++ b/Examples/Classification/KMeansImageClassificationExample.cxx
@@ -54,7 +54,7 @@ int main(int itkNotUsed(argc), char * argv[])
 // Software Guide : EndCodeSnippet
 // Software Guide : BeginLatex
 //
-// Our classifier will be genric enough to be able to process images
+// Our classifier will be generic enough to be able to process images
 // with any number of bands. We read the images as
 // \doxygen{otb}{VectorImage}s. The labeled image will be a scalar image.
 //
diff --git a/Examples/Classification/SOMImageClassificationExample.cxx b/Examples/Classification/SOMImageClassificationExample.cxx
index f58b935..ebbd6b4 100644
--- a/Examples/Classification/SOMImageClassificationExample.cxx
+++ b/Examples/Classification/SOMImageClassificationExample.cxx
@@ -57,7 +57,7 @@ int main(int itkNotUsed(argc), char * argv[])
 // Software Guide : EndCodeSnippet
 // Software Guide : BeginLatex
 //
-// Our classifier will be genric enough to be able to process images
+// Our classifier will be generic enough to be able to process images
 // with any number of bands. We read the images as
 // \doxygen{otb}{VectorImage}s. The labeled image will be a scalar image.
 //
diff --git a/Examples/DimensionReduction/ICAExample.cxx b/Examples/DimensionReduction/ICAExample.cxx
index de8f90d..ee11cbf 100644
--- a/Examples/DimensionReduction/ICAExample.cxx
+++ b/Examples/DimensionReduction/ICAExample.cxx
@@ -203,7 +203,7 @@ int main(int itkNotUsed(argc), char* argv[])
   // \itkcaption[PCA Filter (forward trasnformation)]{Result of applying the
   // \doxygen{otb}{FastICAImageFilter} to an image. From left
   // to right:
-  // original image, color composition with first three independant
+  // original image, color composition with first three independent
   // components and output of the
   // inverse mode (the input RGB image).}
   // \label{fig:FastICA_FILTER}
diff --git a/Examples/DisparityMap/FineRegistrationImageFilterExample.cxx b/Examples/DisparityMap/FineRegistrationImageFilterExample.cxx
index 0808cf5..d8900a7 100644
--- a/Examples/DisparityMap/FineRegistrationImageFilterExample.cxx
+++ b/Examples/DisparityMap/FineRegistrationImageFilterExample.cxx
@@ -181,7 +181,7 @@ int main(int argc, char** argv)
   // We need to set the sub-pixel accuracy we want to obtain:
   //
   // Software Guide : EndLatex
-  registrator->SetSubPixelAccuracy(atof(argv[10]));
+  registrator->SetConvergenceAccuracy(atof(argv[10]));
 
   // Software Guide : BeginLatex
   //
diff --git a/Examples/DisparityMap/NCCRegistrationFilterExample.cxx b/Examples/DisparityMap/NCCRegistrationFilterExample.cxx
index 249de01..6bdf3de 100644
--- a/Examples/DisparityMap/NCCRegistrationFilterExample.cxx
+++ b/Examples/DisparityMap/NCCRegistrationFilterExample.cxx
@@ -120,7 +120,7 @@ int main(int argc, char** argv)
 
   // Software Guide : BeginLatex
   //
-  // Now, we need to instanciate the NCCRegistrationFilter which is going to perform the registration:
+  // Now, we need to instantiate the NCCRegistrationFilter which is going to perform the registration:
   //
   // Software Guide : EndLatex
 
diff --git a/Examples/DisparityMap/SimpleDisparityMapEstimationExample.cxx b/Examples/DisparityMap/SimpleDisparityMapEstimationExample.cxx
index 09f78e7..d237807 100644
--- a/Examples/DisparityMap/SimpleDisparityMapEstimationExample.cxx
+++ b/Examples/DisparityMap/SimpleDisparityMapEstimationExample.cxx
@@ -110,7 +110,7 @@ int main(int argc, char* argv[])
   // Software Guide : BeginLatex
   //
   // Then we define the metric we will use to evaluate the local registration between the fixed and
-  // the moving image. In this example we choosed the \doxygen{itk}{NormalizedCorrelationImageToImageMetric}.
+  // the moving image. In this example we chose the \doxygen{itk}{NormalizedCorrelationImageToImageMetric}.
   //
   // Software Guide : EndLatex
 
@@ -122,7 +122,7 @@ int main(int argc, char* argv[])
   // Software Guide : BeginLatex
   //
   // Disparity map estimation implies evaluation of the moving image at non-grid position. Therefore, an
-  // interpolator is needed. In this example we choosed the \doxygen{itk}{WindowedSincInterpolateImageFunction}.
+  // interpolator is needed. In this example we chose the \doxygen{itk}{WindowedSincInterpolateImageFunction}.
   //
   // Software Guide : EndLatex
 
@@ -137,7 +137,7 @@ int main(int argc, char* argv[])
 
   // Software Guide : BeginLatex
   //
-  // To perform local registration, an optimizer is needed. In this example we choosed the
+  // To perform local registration, an optimizer is needed. In this example we chose the
   // \doxygen{itk}{GradientDescentOptimizer}.
   //
   // Software Guide : EndLatex
@@ -345,7 +345,7 @@ int main(int argc, char* argv[])
 
   // Software Guide : BeginLatex
   //
-  // The disparity map estimation filter is instanciated.
+  // The disparity map estimation filter is instantiated.
   //
   // Software Guide : EndLatex
 
@@ -379,7 +379,7 @@ int main(int argc, char* argv[])
   // Software Guide : BeginLatex
   //
   // The local registration process can lead to wrong deformation values and transform parameters. To Select only
-  // points in point set for which the registration process was succesful, one can set a threshold on the final metric
+  // points in point set for which the registration process was successful, one can set a threshold on the final metric
   // value : points for which the absolute final metric value is below this threshold will be discarded. This
   // threshold can be set with the \code{SetMetricThreshold()} method.
   //
diff --git a/Examples/FeatureExtraction/AssymmetricFusionOfLineDetectorExample.cxx b/Examples/FeatureExtraction/AssymmetricFusionOfLineDetectorExample.cxx
deleted file mode 100644
index 8783b68..0000000
--- a/Examples/FeatureExtraction/AssymmetricFusionOfLineDetectorExample.cxx
+++ /dev/null
@@ -1,225 +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.
-
-=========================================================================*/
-
-
-//  Software Guide : BeginCommandLineArgs
-//    INPUTS: {amst.png}
-//    OUTPUTS: {amstLineFusion.png}
-//    5 1
-//  Software Guide : EndCommandLineArgs
-
-// Software Guide : BeginLatex
-//
-// This example illustrates the use of the \doxygen{otb}{AssymmetricFusionOfLineDetectorImageFilter}.
-//
-// The first step required to use this filter is to include its header file.
-//
-// Software Guide : EndLatex
-
-// Software Guide : BeginCodeSnippet
-#include "otbAssymmetricFusionOfLineDetectorImageFilter.h"
-// Software Guide : EndCodeSnippet
-
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkRescaleIntensityImageFilter.h"
-#include "otbImageFileWriter.h"
-
-int main(int argc, char * argv[])
-{
-
-  if (argc != 5)
-    {
-    std::cerr << "Usage: " << argv[0] << " inputImageFile ";
-    std::cerr << " outputEdgesImageFile length width" << std::endl;
-    return EXIT_FAILURE;
-    }
-
-  //  Software Guide : BeginLatex
-  //
-  //  Then we must decide what pixel type to use for the image. We
-  //  choose to make all computations with floating point precision
-  //  and rescale the results between 0 and 255 in order to export PNG images.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef  float         InternalPixelType;
-  typedef  unsigned char OutputPixelType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  The images are defined using the pixel type and the dimension.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::Image<InternalPixelType,  2> InternalImageType;
-  typedef otb::Image<OutputPixelType,  2>   OutputImageType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  The filter can be instantiated using the image types defined above.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::AssymmetricFusionOfLineDetectorImageFilter<InternalImageType,
-      InternalImageType>
-  FilterType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  An \doxygen{otb}{ImageFileReader} class is also instantiated in order to read
-  //  image data from a file.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::ImageFileReader<InternalImageType> ReaderType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  // An \doxygen{otb}{ImageFileWriter} is instantiated in order to write the
-  // output image to a file.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  // The intensity rescaling of the results will be carried out by the
-  // \code{itk::RescaleIntensityImageFilter} which is templated by the
-  // input and output image types.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef itk::RescaleIntensityImageFilter<InternalImageType,
-      OutputImageType> RescalerType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  Both the filter and the reader are created by invoking their \code{New()}
-  //  methods and assigning the result to SmartPointers.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  ReaderType::Pointer reader = ReaderType::New();
-  FilterType::Pointer filter = FilterType::New();
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  The same is done for the rescaler and the writer.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  RescalerType::Pointer rescaler = RescalerType::New();
-  WriterType::Pointer   writer = WriterType::New();
-  // Software Guide : EndCodeSnippet
-
-  reader->SetFileName(argv[1]);
-
-  //  Software Guide : BeginLatex
-  //
-  //  The \code{itk::RescaleIntensityImageFilter} needs to know which
-  //  is the minimu and maximum values of the output generated
-  //  image. Those can be chosen in a generic way by using the
-  //  \code{NumericTraits} functions, since they are templated over
-  //  the pixel type.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  rescaler->SetOutputMinimum(itk::NumericTraits<OutputPixelType>::min());
-  rescaler->SetOutputMaximum(itk::NumericTraits<OutputPixelType>::max());
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  The image obtained with the reader is passed as input to the
-  //  \doxygen{otb}{AssymetricFusionOfDetectorImageFilter}. The pipeline is built as follows.
-  //
-  //  \index{otb::AssymetricFusionOfDetectorImageFilter!SetInput()}
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  filter->SetInput(reader->GetOutput());
-  rescaler->SetInput(filter->GetOutput());
-  writer->SetInput(rescaler->GetOutput());
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  The methods \code{SetLengthLine()} and \code{SetWidthLine()}
-  //  allow setting the minimum length and the typical witdh of the
-  //  lines which are to be detected.
-  //
-  //  \index{otb::AssymetricFusionOfDetector!SetWidthLine()}
-  //  \index{otb::AssymetricFusionOfDetector!SetLengthLine()}
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  filter->SetLengthLine(atoi(argv[3]));
-  filter->SetWidthLine(atoi(argv[4]));
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  The filter is executed by invoking the \code{Update()} method. If the
-  //  filter is part of a larger image processing pipeline, calling
-  //  \code{Update()} on a downstream filter will also trigger update of this
-  //  filter.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  filter->Update();
-  // Software Guide : EndCodeSnippet
-
-  writer->SetFileName(argv[2]);
-  writer->Update();
-
-  //  Software Guide : BeginLatex
-  // Figure~\ref{fig:LINEFUSION_FILTER}
-  // shows the result of applying the AssymetricFusionOf edge detector filter
-  // to a SAR image.  \begin{figure} \center
-  // \includegraphics[width=0.25\textwidth]{amst.eps}
-  // \includegraphics[width=0.25\textwidth]{amstLineFusion.eps}
-  // \itkcaption[Line Correlation Detector Application]{Result of applying
-  // the \doxygen{otb}{AssymetricFusionOfDetectorImageFilter} to a SAR
-  // image. From left to right : original image, line intensity.}  \label{fig:LINEFUSION_FILTER} \end{figure}
-  //
-  //  Software Guide : EndLatex
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx b/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx
new file mode 100644
index 0000000..7a8e700
--- /dev/null
+++ b/Examples/FeatureExtraction/AsymmetricFusionOfLineDetectorExample.cxx
@@ -0,0 +1,225 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+
+
+//  Software Guide : BeginCommandLineArgs
+//    INPUTS: {amst.png}
+//    OUTPUTS: {amstLineFusion.png}
+//    5 1
+//  Software Guide : EndCommandLineArgs
+
+// Software Guide : BeginLatex
+//
+// This example illustrates the use of the \doxygen{otb}{AssymmetricFusionOfLineDetectorImageFilter}.
+//
+// The first step required to use this filter is to include its header file.
+//
+// Software Guide : EndLatex
+
+// Software Guide : BeginCodeSnippet
+#include "otbAssymmetricFusionOfLineDetectorImageFilter.h"
+// Software Guide : EndCodeSnippet
+
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "itkUnaryFunctorImageFilter.h"
+#include "itkRescaleIntensityImageFilter.h"
+#include "otbImageFileWriter.h"
+
+int main(int argc, char * argv[])
+{
+
+  if (argc != 5)
+    {
+    std::cerr << "Usage: " << argv[0] << " inputImageFile ";
+    std::cerr << " outputEdgesImageFile length width" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  //  Software Guide : BeginLatex
+  //
+  //  Then we must decide what pixel type to use for the image. We
+  //  choose to make all computations with floating point precision
+  //  and rescale the results between 0 and 255 in order to export PNG images.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef  float         InternalPixelType;
+  typedef  unsigned char OutputPixelType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  The images are defined using the pixel type and the dimension.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::Image<InternalPixelType,  2> InternalImageType;
+  typedef otb::Image<OutputPixelType,  2>   OutputImageType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  The filter can be instantiated using the image types defined above.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::AssymmetricFusionOfLineDetectorImageFilter<InternalImageType,
+      InternalImageType>
+  FilterType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  An \doxygen{otb}{ImageFileReader} class is also instantiated in order to read
+  //  image data from a file.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::ImageFileReader<InternalImageType> ReaderType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  // An \doxygen{otb}{ImageFileWriter} is instantiated in order to write the
+  // output image to a file.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::ImageFileWriter<OutputImageType> WriterType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  // The intensity rescaling of the results will be carried out by the
+  // \code{itk::RescaleIntensityImageFilter} which is templated by the
+  // input and output image types.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef itk::RescaleIntensityImageFilter<InternalImageType,
+      OutputImageType> RescalerType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  Both the filter and the reader are created by invoking their \code{New()}
+  //  methods and assigning the result to SmartPointers.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  ReaderType::Pointer reader = ReaderType::New();
+  FilterType::Pointer filter = FilterType::New();
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  The same is done for the rescaler and the writer.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  RescalerType::Pointer rescaler = RescalerType::New();
+  WriterType::Pointer   writer = WriterType::New();
+  // Software Guide : EndCodeSnippet
+
+  reader->SetFileName(argv[1]);
+
+  //  Software Guide : BeginLatex
+  //
+  //  The \code{itk::RescaleIntensityImageFilter} needs to know which
+  //  is the minimu and maximum values of the output generated
+  //  image. Those can be chosen in a generic way by using the
+  //  \code{NumericTraits} functions, since they are templated over
+  //  the pixel type.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  rescaler->SetOutputMinimum(itk::NumericTraits<OutputPixelType>::min());
+  rescaler->SetOutputMaximum(itk::NumericTraits<OutputPixelType>::max());
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  The image obtained with the reader is passed as input to the
+  //  \doxygen{otb}{AsymmetricFusionOfDetectorImageFilter}. The pipeline is built as follows.
+  //
+  //  \index{otb::AsymmetricFusionOfDetectorImageFilter!SetInput()}
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  filter->SetInput(reader->GetOutput());
+  rescaler->SetInput(filter->GetOutput());
+  writer->SetInput(rescaler->GetOutput());
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  The methods \code{SetLengthLine()} and \code{SetWidthLine()}
+  //  allow setting the minimum length and the typical witdh of the
+  //  lines which are to be detected.
+  //
+  //  \index{otb::AsymmetricFusionOfDetector!SetWidthLine()}
+  //  \index{otb::AsymmetricFusionOfDetector!SetLengthLine()}
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  filter->SetLengthLine(atoi(argv[3]));
+  filter->SetWidthLine(atoi(argv[4]));
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  The filter is executed by invoking the \code{Update()} method. If the
+  //  filter is part of a larger image processing pipeline, calling
+  //  \code{Update()} on a downstream filter will also trigger update of this
+  //  filter.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  filter->Update();
+  // Software Guide : EndCodeSnippet
+
+  writer->SetFileName(argv[2]);
+  writer->Update();
+
+  //  Software Guide : BeginLatex
+  // Figure~\ref{fig:LINEFUSION_FILTER}
+  // shows the result of applying the AsymmetricFusionOf edge detector filter
+  // to a SAR image.  \begin{figure} \center
+  // \includegraphics[width=0.25\textwidth]{amst.eps}
+  // \includegraphics[width=0.25\textwidth]{amstLineFusion.eps}
+  // \itkcaption[Line Correlation Detector Application]{Result of applying
+  // the \doxygen{otb}{AsymmetricFusionOfDetectorImageFilter} to a SAR
+  // image. From left to right : original image, line intensity.}  \label{fig:LINEFUSION_FILTER} \end{figure}
+  //
+  //  Software Guide : EndLatex
+
+  return EXIT_SUCCESS;
+}
diff --git a/Examples/FeatureExtraction/CMakeLists.txt b/Examples/FeatureExtraction/CMakeLists.txt
index edce7bf..0fdca47 100644
--- a/Examples/FeatureExtraction/CMakeLists.txt
+++ b/Examples/FeatureExtraction/CMakeLists.txt
@@ -1,7 +1,7 @@
 project(FeatureExtractionExamples)
 
-add_executable(AssymmetricFusionOfLineDetectorExample AssymmetricFusionOfLineDetectorExample.cxx)
-target_link_libraries(AssymmetricFusionOfLineDetectorExample ${OTB_LIBRARIES})
+add_executable(AsymmetricFusionOfLineDetectorExample AsymmetricFusionOfLineDetectorExample.cxx)
+target_link_libraries(AsymmetricFusionOfLineDetectorExample ${OTB_LIBRARIES})
 
 add_executable(CloudDetectionExample CloudDetectionExample.cxx)
 target_link_libraries(CloudDetectionExample ${OTB_LIBRARIES})
diff --git a/Examples/FeatureExtraction/ComplexMomentsImageFunctionExample.cxx b/Examples/FeatureExtraction/ComplexMomentsImageFunctionExample.cxx
index 1bc5a8b..6affbfc 100644
--- a/Examples/FeatureExtraction/ComplexMomentsImageFunctionExample.cxx
+++ b/Examples/FeatureExtraction/ComplexMomentsImageFunctionExample.cxx
@@ -80,7 +80,7 @@ int main(int argc, char * argv[])
 
   //  Software Guide : BeginLatex
   //
-  // Next, we plug the input image into the complex moment fucntion
+  // Next, we plug the input image into the complex moment function
   // and we set its parameters.
   //
   //  Software Guide : EndLatex
diff --git a/Examples/FeatureExtraction/EdgeDensityExample.cxx b/Examples/FeatureExtraction/EdgeDensityExample.cxx
index ce39150..66b4722 100644
--- a/Examples/FeatureExtraction/EdgeDensityExample.cxx
+++ b/Examples/FeatureExtraction/EdgeDensityExample.cxx
@@ -97,7 +97,7 @@ int main(int itkNotUsed(argc), char* argv[])
   // We define now the type for the function which will be used by the
   // edge density filter to estimate this density. Here we choose a
   // function which counts the number of non null pixels per area. The
-  // fucntion takes as template the type of the image to be processed.
+  // function takes as template the type of the image to be processed.
   //
   // Software Guide : EndLatex
 
@@ -120,7 +120,7 @@ int main(int itkNotUsed(argc), char* argv[])
   //
   // Finally, we can define the type for the edge density filter which
   // takes as template the input and output image types, the edge
-  // detector type, and the count fucntion type..
+  // detector type, and the count function type..
   //
   // Software Guide : EndLatex
 
diff --git a/Examples/FeatureExtraction/ExtractRoadExample.cxx b/Examples/FeatureExtraction/ExtractRoadExample.cxx
index fbe1b2e..8d8c721 100644
--- a/Examples/FeatureExtraction/ExtractRoadExample.cxx
+++ b/Examples/FeatureExtraction/ExtractRoadExample.cxx
@@ -238,7 +238,7 @@ int main(int argc, char * argv[])
   // Software Guide : BeginLatex
   //
   // Roads are not likely to have sharp turns. Therefore we set the max angle parameter,
-  // as well as the link angular threshold. The value is typicaly $\frac{\pi}{8}$.
+  // as well as the link angular threshold. The value is typically $\frac{\pi}{8}$.
   //
   // Software Guide : EndLatex
 
diff --git a/Examples/FeatureExtraction/ExtractSegmentsByStepsExample.cxx b/Examples/FeatureExtraction/ExtractSegmentsByStepsExample.cxx
index ec7dab5..76e126b 100644
--- a/Examples/FeatureExtraction/ExtractSegmentsByStepsExample.cxx
+++ b/Examples/FeatureExtraction/ExtractSegmentsByStepsExample.cxx
@@ -234,8 +234,8 @@ int main(int argc, char * argv[])
 
   //  Software Guide : BeginLatex
   // \textbf{FIXME: set the methods}
-  //   \index{otb::AssymetricFusionOfDetector!SetWidthLine()}
-  //  \index{otb::AssymetricFusionOfDetector!SetLengthLine()}
+  //   \index{otb::AsymmetricFusionOfDetector!SetWidthLine()}
+  //  \index{otb::AsymmetricFusionOfDetector!SetLengthLine()}
 
   //  The filter is executed by invoking the \code{Update()} method. If the
   //  filter is part of a larger image processing pipeline, calling
@@ -254,18 +254,18 @@ int main(int argc, char * argv[])
   //  Software Guide : EndLatex
 
   //  Software Guide : BeginLatex Figure~\ref{fig:LINECORRELATION_FILTER}
-  // shows the result of applying the AssymetricFusionOf edge detector filter
+  // shows the result of applying the AsymmetricFusionOf edge detector filter
   // to a SAR image.  \begin{figure} \center
   // \includegraphics[width=0.25\textwidth]{amst.eps}
   // \includegraphics[width=0.25\textwidth]{amstSegmentExtractionBySteps.eps}
   // \itkcaption[Line Correlation Detector Application]{Result of applying
-  // the \doxygen{otb}{AssymetricFusionOfDetectorImageFilter} to a SAR
+  // the \doxygen{otb}{AsymmetricFusionOfDetectorImageFilter} to a SAR
   // image. From left to right : original image, line intensity and
   // edge orientation.}  \label{fig:LINECORRELATION_FILTER} \end{figure}
   //
   //  \relatedClasses
   //  \begin{itemize}
-  //  \item \doxygen{otb}{AssymetricFusionOfDetectorImageFilter}
+  //  \item \doxygen{otb}{AsymmetricFusionOfDetectorImageFilter}
   //  \end{itemize}
   //  Software Guide : EndLatex
 
diff --git a/Examples/FeatureExtraction/ExtractSegmentsExample.cxx b/Examples/FeatureExtraction/ExtractSegmentsExample.cxx
index d23bcba..ee31bf7 100644
--- a/Examples/FeatureExtraction/ExtractSegmentsExample.cxx
+++ b/Examples/FeatureExtraction/ExtractSegmentsExample.cxx
@@ -231,8 +231,8 @@ int main(int argc, char * argv[])
 
   //  Software Guide : BeginLatex
   // \textbf{FIXME: set the methods}
-  //   \index{otb::AssymetricFusionOfDetector!SetWidthLine()}
-  //  \index{otb::AssymetricFusionOfDetector!SetLengthLine()}
+  //   \index{otb::AsymmetricFusionOfDetector!SetWidthLine()}
+  //  \index{otb::AsymmetricFusionOfDetector!SetLengthLine()}
 
   //  The filter is executed by invoking the \code{Update()} method. If the
   //  filter is part of a larger image processing pipeline, calling
@@ -249,18 +249,18 @@ int main(int argc, char * argv[])
   writer->Update();
 
   //  Software Guide : BeginLatex Figure~\ref{fig:LINECORRELATION_FILTER}
-  // shows the result of applying the AssymetricFusionOf edge detector filter
+  // shows the result of applying the AsymmetricFusionOf edge detector filter
   // to a SAR image.  \begin{figure} \center
   // \includegraphics[width=0.25\textwidth]{amst.eps}
   // \includegraphics[width=0.25\textwidth]{amstSegmentExtraction.eps}
   // \itkcaption[Line Correlation Detector Application]{Result of applying
-  // the \doxygen{otb}{AssymetricFusionOfDetectorImageFilter} to a SAR
+  // the \doxygen{otb}{AsymmetricFusionOfDetectorImageFilter} to a SAR
   // image. From left to right : original image, line intensity and
   // edge orientation.}  \label{fig:LINECORRELATION_FILTER} \end{figure}
   //
   //  \relatedClasses
   //  \begin{itemize}
-  //  \item \doxygen{otb}{AssymetricFusionOfDetectorImageFilter}
+  //  \item \doxygen{otb}{AsymmetricFusionOfDetectorImageFilter}
   //  \end{itemize}
   //  Software Guide : EndLatex
 
diff --git a/Examples/FeatureExtraction/LineSegmentDetectorExample.cxx b/Examples/FeatureExtraction/LineSegmentDetectorExample.cxx
index 91ce491..c65676c 100644
--- a/Examples/FeatureExtraction/LineSegmentDetectorExample.cxx
+++ b/Examples/FeatureExtraction/LineSegmentDetectorExample.cxx
@@ -98,7 +98,7 @@ int main(int argc, char * argv[])
   // detected segments on top of the input image. For this matter, we
   // will use a \doxygen{otb}{VectorDataToMapFilter} which
   // is templated over the input vector data type and the output image
-  // type, and a conbination of a \doxygen{itk}{binaryFunctorImageFilter}
+  // type, and a combination of a \doxygen{itk}{binaryFunctorImageFilter}
   // and the \doxygen{otb}{Functor}{AlphaBlendingFunctor}.
   //
   // Software Guide : EndLatex
diff --git a/Examples/FeatureExtraction/RightAngleDetectionExample.cxx b/Examples/FeatureExtraction/RightAngleDetectionExample.cxx
index 24054c5..0fea278 100644
--- a/Examples/FeatureExtraction/RightAngleDetectionExample.cxx
+++ b/Examples/FeatureExtraction/RightAngleDetectionExample.cxx
@@ -155,7 +155,7 @@ int main(int argc, char * argv[])
   // image. For this matter, we will use a
   // \doxygen{otb}{VectorDataToMapFilter}  which is templated over
   // the  input vector data type and the output image type, and a
-  // conbination of a \doxygen{itk}{binaryFunctorImageFilter}
+  // combination of a \doxygen{itk}{binaryFunctorImageFilter}
   // and the \doxygen{otb}{Functor}{UnaryFunctorImageFilter}.
   //
   // Software Guide : EndLatex
diff --git a/Examples/FeatureExtraction/SFSExample.cxx b/Examples/FeatureExtraction/SFSExample.cxx
index eb9f364..c7945cb 100644
--- a/Examples/FeatureExtraction/SFSExample.cxx
+++ b/Examples/FeatureExtraction/SFSExample.cxx
@@ -33,7 +33,7 @@
 //
 // This example illustrates the use of the
 // \doxygen{otb}{SFSTexturesImageFilter}.
-// This filter computes the Structural Feature Set as descibed in
+// This filter computes the Structural Feature Set as described in
 // \cite{SFS}. These features are textural parameters which give
 // information about the structure of lines passing through each pixel
 // of the image.
diff --git a/Examples/FeatureExtraction/SeamCarvingExample.cxx b/Examples/FeatureExtraction/SeamCarvingExample.cxx
index 5880cd0..44009ea 100644
--- a/Examples/FeatureExtraction/SeamCarvingExample.cxx
+++ b/Examples/FeatureExtraction/SeamCarvingExample.cxx
@@ -82,7 +82,7 @@ int main(int itkNotUsed(argc), char * argv[])
   //  Software Guide : BeginLatex
   //
   // Energy is computed according to the gradient of the image, thus an
-  // \doxygen{itk}{GradientMagnitudeImageFilter} is instanciated
+  // \doxygen{itk}{GradientMagnitudeImageFilter} is instantiated
   //
   //  Software Guide : EndLatex
 
@@ -134,7 +134,7 @@ int main(int itkNotUsed(argc), char * argv[])
 
   //  Software Guide : BeginLatex
   //
-  // Now that all elements have been instanciated, we start to plug the pipeline
+  // Now that all elements have been instantiated, we start to plug the pipeline
   // and to define the loop.
   //
   //  Software Guide : EndLatex
diff --git a/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx b/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx
index 354abe9..cd10899 100644
--- a/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx
+++ b/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx
@@ -95,7 +95,7 @@ int main(int itkNotUsed(argc), char * argv[])
 
   // Software Guide : BeginLatex
   //
-  // We instanciate the different filters of the pipeline as before.
+  // We instantiate the different filters of the pipeline as before.
   //
   // Software Guide : EndLatex
 
diff --git a/Examples/FeatureExtraction/ThresholdToPointSetExample.cxx b/Examples/FeatureExtraction/ThresholdToPointSetExample.cxx
index b05a2ca..67b1c31 100644
--- a/Examples/FeatureExtraction/ThresholdToPointSetExample.cxx
+++ b/Examples/FeatureExtraction/ThresholdToPointSetExample.cxx
@@ -78,7 +78,7 @@ int main(int argc, char * argv[])
 
   //  Software Guide : BeginLatex
   //
-  // A reader is instanciated to read the input image
+  // A reader is instantiated to read the input image
   //
   //  Software Guide : EndLatex
 
@@ -124,7 +124,7 @@ int main(int argc, char * argv[])
   //  Software Guide : BeginLatex
   //
   // To manipulate and display the result of this filter, we manually
-  // instanciate a point set and we call the \code{Update()} method on the
+  // instantiate a point set and we call the \code{Update()} method on the
   // threshold filter to trigger the pipeline execution.
   //
   // After this step, the \code{pointSet} variable contains the point set.
diff --git a/Examples/FeatureExtraction/TouziEdgeDetectorExample.cxx b/Examples/FeatureExtraction/TouziEdgeDetectorExample.cxx
index d84ff81..5bdb91f 100644
--- a/Examples/FeatureExtraction/TouziEdgeDetectorExample.cxx
+++ b/Examples/FeatureExtraction/TouziEdgeDetectorExample.cxx
@@ -27,7 +27,7 @@
 //
 // This example illustrates the use of the \doxygen{otb}{TouziEdgeDetectorImageFilter}.
 // This filter belongs to the family of the fixed false alarm rate
-// edge detectors but it is apropriate for SAR images, where the
+// edge detectors but it is appropriate for SAR images, where the
 // speckle noise is considered as multiplicative. By analogy with the
 // classical gradient-based edge detectors which are suited to the
 // additive noise case, this filter computes a ratio of local means in
diff --git a/Examples/FeatureExtraction/test/CMakeLists.txt b/Examples/FeatureExtraction/test/CMakeLists.txt
index b748cac..edd248b 100644
--- a/Examples/FeatureExtraction/test/CMakeLists.txt
+++ b/Examples/FeatureExtraction/test/CMakeLists.txt
@@ -67,13 +67,13 @@ otb_add_test(NAME feTeExtractSegmentsByStepsExampleTest COMMAND ${OTB_TEST_DRIVE
     10 3 10 0.5 10 10 3 10 0.5
 )
 
-# ------- AssymmetricFusionOfLineDetectorExampleTest----------
+# ------- AsymmetricFusionOfLineDetectorExampleTest----------
 
-otb_add_test(NAME feTeAssymmetricFusionOfLineDetectorExampleTest COMMAND ${OTB_TEST_DRIVER}
+otb_add_test(NAME feTeAsymmetricFusionOfLineDetectorExampleTest COMMAND ${OTB_TEST_DRIVER}
   --compare-n-images ${NOTOL} 1
     ${BASELINE}/amstLineFusion.png
     ${TEMP}/amstLineFusion.png
-  Execute $<TARGET_FILE:AssymmetricFusionOfLineDetectorExample>
+  Execute $<TARGET_FILE:AsymmetricFusionOfLineDetectorExample>
     ${INPUTDATA}/amst.png
     ${TEMP}/amstLineFusion.png
     5 1
diff --git a/Examples/Filtering/CannyEdgeDetectionImageFilter.cxx b/Examples/Filtering/CannyEdgeDetectionImageFilter.cxx
index 6a504f8..2efcaa9 100644
--- a/Examples/Filtering/CannyEdgeDetectionImageFilter.cxx
+++ b/Examples/Filtering/CannyEdgeDetectionImageFilter.cxx
@@ -83,7 +83,7 @@ int main(int argc, char* argv[])
 
   //  Software Guide : BeginLatex
   //
-  // As the Canny filter works with real values, we can instanciated the reader using
+  // As the Canny filter works with real values, we can instantiated the reader using
   // an image with pixels as double. This does not imply anything on the real image
   // coding format which will be cast into double.
   //
diff --git a/Examples/IO/DEMHandlerExample.cxx b/Examples/IO/DEMHandlerExample.cxx
index f3fbdca..a49032d 100644
--- a/Examples/IO/DEMHandlerExample.cxx
+++ b/Examples/IO/DEMHandlerExample.cxx
@@ -27,8 +27,8 @@
 // OTB relies on OSSIM for elevation handling. Since release 3.16, there is a
 // single configuration class \doxygen{otb}{DEMHandler} to manage elevation (in
 // image projections or localization functions for example).  This configuration
-// is managed by the a proper instanciation and parameters setting of this
-// class.  These instanciations must be done before any call to geometric
+// is managed by the a proper instantiation and parameters setting of this
+// class.  These instantiations must be done before any call to geometric
 // filters or functionalities. Ossim internal accesses to elevation are also
 // configured by this class and this will ensure consistency throughout the
 // library.
diff --git a/Examples/IO/HDFReaderExample.cxx b/Examples/IO/HDFReaderExample.cxx
index f1bc0c6..6b6cd3f 100644
--- a/Examples/IO/HDFReaderExample.cxx
+++ b/Examples/IO/HDFReaderExample.cxx
@@ -55,7 +55,7 @@ int main(int itkNotUsed(argc), char * argv[])
 
 // Software Guide : BeginLatex
 //
-// We need now to declare the data types that we will be using and instanciate the
+// We need now to declare the data types that we will be using and instantiate the
 // reader (which is a \doxygen{otb}{PointSetFileReader}).
 //
 // Software Guide : EndLatex
@@ -90,7 +90,7 @@ int main(int itkNotUsed(argc), char * argv[])
 // You can access to subdatasets' information available in the HDF file using
 // the \code{GetSubDatasetInfo} method of \doxygen{otb}{GDALImageIO}.
 // It allows storing HDF subdatasets names and descriptions in vector of string.
-// You can find below how to print the name and the decription
+// You can find below how to print the name and the description
 // of all the subdatasets.
 //
 // Software Guide : EndLatex
diff --git a/Examples/IO/ImageToKmzAndMapFileProductExample.cxx b/Examples/IO/ImageToKmzAndMapFileProductExample.cxx
index d343441..11a173a 100644
--- a/Examples/IO/ImageToKmzAndMapFileProductExample.cxx
+++ b/Examples/IO/ImageToKmzAndMapFileProductExample.cxx
@@ -109,7 +109,7 @@ int main(int argc, char* argv[])
 //
 // Here, we set all the Ground Control Points associated to the image
 // indexes. This is the entry of the rpc sensor model
-// estimator. Everytime a GCP is added, the output image information
+// estimator. Every time a GCP is added, the output image information
 // or its keywordlist is updated. In general, a dozen of GCPs are
 // needed to estimate an accurate sensor model. The points are added
 // via the method AddGCP(PointType2D, PointType3D). The outpput image
@@ -154,7 +154,7 @@ int main(int argc, char* argv[])
 
 // Software Guide : BeginLatex
 //
-// Finally, we trigger the kmz writting by calling the \code{Update()}
+// Finally, we trigger the kmz writing by calling the \code{Update()}
 // method on the writer.
 //
 // Software Guide : EndLatex
diff --git a/Examples/IO/StreamingImageReadWrite.cxx b/Examples/IO/StreamingImageReadWrite.cxx
index 53c2037..d4524b1 100644
--- a/Examples/IO/StreamingImageReadWrite.cxx
+++ b/Examples/IO/StreamingImageReadWrite.cxx
@@ -25,7 +25,7 @@
 //  streaming. That means that a filter for which the
 //  \code{ThreadedGenerateData} method is implemented, will only produce the
 //  data for the region requested by the following filter in the
-//  pipeline. Therefore, in order to use the streaming functionnality
+//  pipeline. Therefore, in order to use the streaming functionality
 //  one needs to use a filter at the end of the pipeline which
 //  requests for adjacent regions of the image to be processed. In
 //  ITK, the \doxygen{itk}{StreamingImageFilter} class is used for
diff --git a/Examples/IO/TileMapImageIOExample.cxx b/Examples/IO/TileMapImageIOExample.cxx
index afb77ba..eb694b1 100644
--- a/Examples/IO/TileMapImageIOExample.cxx
+++ b/Examples/IO/TileMapImageIOExample.cxx
@@ -235,7 +235,7 @@ int main(int argc, char* argv[])
   // \center
   // \includegraphics[width=0.45\textwidth]{openStreetMap-Toulouse.eps}
   // \includegraphics[width=0.45\textwidth]{openStreetMap-Singapore.eps}
-  // \itkcaption[Open street map]{Map created from open street map showing the OTB headquaters}
+  // \itkcaption[Open street map]{Map created from open street map showing the OTB headquarters}
   // \label{fig:TILEMAPIMAGEIOEXAMPLE}
   // \end{figure}
   //
diff --git a/Examples/Learning/SEMModelEstimatorExample.cxx b/Examples/Learning/SEMModelEstimatorExample.cxx
index cbe329d..da99564 100644
--- a/Examples/Learning/SEMModelEstimatorExample.cxx
+++ b/Examples/Learning/SEMModelEstimatorExample.cxx
@@ -29,7 +29,7 @@
 // In this example, we present OTB's implementation of SEM, through the class
 // \doxygen{otb}{SEMClassifier}. This class performs a stochastic version
 // of the EM algorithm, but instead of inheriting from
-// \doxygen{itk}{ExpectationMaximizationMixtureModelEstimator}, we choosed to
+// \doxygen{itk}{ExpectationMaximizationMixtureModelEstimator}, we chose to
 // inherit from \subdoxygen{itk}{Statistics}{ListSample< TSample >},
 // in the same way as \doxygen{otb}{SVMClassifier}.
 //
@@ -159,7 +159,7 @@ int main(int argc, char * argv[])
 //  Software Guide : BeginLatex
 //
 //  By default, \doxygen{otb}{SEMClassifier} performs initialization of
-// \code{ModelComponentBase} by as many instanciation of
+// \code{ModelComponentBase} by as many instantiation of
 // \subdoxygen{otb}{Statistics}{GaussianModelComponent} as the number of
 // classes to estimate in the mixture. Nevertheless, the user may add specific
 // distribution into the mixture estimation. It is permitted by the use of
@@ -182,7 +182,7 @@ int main(int argc, char * argv[])
 
 //  Software Guide : BeginLatex
 //
-//  Once the pipeline is instanciated. The segmentation by itself may be
+//  Once the pipeline is instantiated. The segmentation by itself may be
 // launched by using the \code{Update} function.
 //  Software Guide : EndLatex
 
diff --git a/Examples/Learning/SOMClassifierExample.cxx b/Examples/Learning/SOMClassifierExample.cxx
index f262cdf..2397813 100644
--- a/Examples/Learning/SOMClassifierExample.cxx
+++ b/Examples/Learning/SOMClassifierExample.cxx
@@ -74,7 +74,7 @@ int main(int argc, char* argv[])
 // As for the SOM learning step, we must define the types for the
 // \code{otb::SOMMap}, and therefore, also for the distance to be
 // used. We will also define the type for the SOM reader, which is
-// actually an \subdoxygen{otb}{ImageFileReader} which the appropiate
+// actually an \subdoxygen{otb}{ImageFileReader} which the appropriate
 // image type.
 //
 //  Software Guide : EndLatex
diff --git a/Examples/Learning/SOMExample.cxx b/Examples/Learning/SOMExample.cxx
index aa867d4..03fefc5 100644
--- a/Examples/Learning/SOMExample.cxx
+++ b/Examples/Learning/SOMExample.cxx
@@ -173,7 +173,7 @@ int main(int itkNotUsed(argc), char* argv[])
 //
 //  Software Guide : BeginLatex
 //
-// As an alternative to standart \code{SOMType}, one can decide to use
+// As an alternative to standard \code{SOMType}, one can decide to use
 // an \doxygen{otb}{PeriodicSOM}, which behaves like \doxygen{otb}{SOM} but
 // is to be considered to as a torus instead of a simple map. Hence, the
 // neighborhood behavior of the winning neuron does not depend on its location
@@ -268,7 +268,7 @@ int main(int itkNotUsed(argc), char* argv[])
 //
 //  Software Guide : BeginLatex
 //
-//  Now comes the intialization of the functors.
+//  Now comes the initialization of the functors.
 //
 //  Software Guide : EndLatex
 
diff --git a/Examples/Learning/SVMGenericKernelImageClassificationExample.cxx b/Examples/Learning/SVMGenericKernelImageClassificationExample.cxx
index 765fe15..743f8fb 100644
--- a/Examples/Learning/SVMGenericKernelImageClassificationExample.cxx
+++ b/Examples/Learning/SVMGenericKernelImageClassificationExample.cxx
@@ -98,7 +98,7 @@ int main(int argc, char* argv[])
 // section \ref{ssec:LearningFromImages} for an example of model
 // estimation and storage to a file).
 //
-// When using a user defined kernel, an explicit instanciation has
+// When using a user defined kernel, an explicit instantiation has
 // to be performed.
 //
 // Software Guide : EndLatex
diff --git a/Examples/Learning/SVMGenericKernelImageModelEstimatorExample.cxx b/Examples/Learning/SVMGenericKernelImageModelEstimatorExample.cxx
index 61494ba..26e508f 100644
--- a/Examples/Learning/SVMGenericKernelImageModelEstimatorExample.cxx
+++ b/Examples/Learning/SVMGenericKernelImageModelEstimatorExample.cxx
@@ -78,7 +78,7 @@ int main(int argc, char* argv[])
 
 //  Software Guide : BeginLatex
 //
-//  Once the \doxygen{otb}{SVMImageModelEstimator} is instanciated,
+//  Once the \doxygen{otb}{SVMImageModelEstimator} is instantiated,
 //  it is possible to add the new kernel and its parameters.
 //
 //  Then in addition to the initial code:
@@ -95,7 +95,7 @@ int main(int argc, char* argv[])
 
 //  Software Guide : BeginLatex
 //
-//  The instanciation of the kernel is to be implemented. The kernel which is
+//  The instantiation of the kernel is to be implemented. The kernel which is
 //  used here is a linear combination of a polynomial kernel and an RBF one.
 //  It is written as $$\mu k_1(x, y) + (1-\mu) k_2(x, y)$$ with
 //  $k_1(x, y)=\left( \gamma_1 x\cdot y + c_0 \right) ^d$ and
@@ -108,7 +108,7 @@ int main(int argc, char* argv[])
 //  \item \code{DegreePoly} ($d$),
 //  \item \code{GammaRBF} ($\gamma_2$).
 //  \end{itemize}
-//  Their instanciations are achieved through the use of the \code{SetValue}
+//  Their instantiations are achieved through the use of the \code{SetValue}
 //  function.
 //
 //  Software Guide : EndLatex
diff --git a/Examples/Learning/SVMImageClassificationExample.cxx b/Examples/Learning/SVMImageClassificationExample.cxx
index 86b6dc7..60e3358 100644
--- a/Examples/Learning/SVMImageClassificationExample.cxx
+++ b/Examples/Learning/SVMImageClassificationExample.cxx
@@ -243,7 +243,7 @@ int main(int argc, char* argv[])
 
 // Software Guide : BeginLatex
 //
-// We can now declare the interators on the list that we get at the
+// We can now declare the iterators on the list that we get at the
 // output of the classifier as well as the iterator to fill the output image.
 //
 // Software Guide : EndLatex
diff --git a/Examples/Learning/SVMImageEstimatorClassificationMultiExample.cxx b/Examples/Learning/SVMImageEstimatorClassificationMultiExample.cxx
index 86b8a42..177b4a0 100644
--- a/Examples/Learning/SVMImageEstimatorClassificationMultiExample.cxx
+++ b/Examples/Learning/SVMImageEstimatorClassificationMultiExample.cxx
@@ -116,7 +116,7 @@ int main(int itkNotUsed(argc), char *argv[])
 //  Software Guide : BeginLatex
 //
 //  We read the images. It is worth to note that, in order to ensure
-//  the pipeline coherence, the output of the objects which preceed the
+//  the pipeline coherence, the output of the objects which precede the
 //  model estimator in the pipeline, must be up to date, so we call
 //  the corresponding \code{Update} methods.
 //
@@ -306,7 +306,7 @@ int main(int itkNotUsed(argc), char *argv[])
 
 // Software Guide : BeginLatex
 //
-// We can now declare the interators on the list that we get at the
+// We can now declare the iterators on the list that we get at the
 // output of the classifier as well as the iterator to fill the output image.
 //
 // Software Guide : EndLatex
diff --git a/Examples/Learning/SVMImageModelEstimatorExample.cxx b/Examples/Learning/SVMImageModelEstimatorExample.cxx
index 6dabad0..cd7173d 100644
--- a/Examples/Learning/SVMImageModelEstimatorExample.cxx
+++ b/Examples/Learning/SVMImageModelEstimatorExample.cxx
@@ -106,7 +106,7 @@ int main(int itkNotUsed(argc), char* argv[])
 //  Software Guide : BeginLatex
 //
 //  We read the images. It is worth to note that, in order to ensure
-//  the pipeline coherence, the output of the objects which preceed the
+//  the pipeline coherence, the output of the objects which precede the
 //  model estimator in the pipeline, must be up to date, so we call
 //  the corresponding \code{Update} methods.
 //
diff --git a/Examples/Markov/CMakeLists.txt b/Examples/Markov/CMakeLists.txt
index 8720492..6e5ca78 100644
--- a/Examples/Markov/CMakeLists.txt
+++ b/Examples/Markov/CMakeLists.txt
@@ -12,8 +12,8 @@ target_link_libraries(MarkovClassification3Example ${OTB_LIBRARIES})
 add_executable(MarkovRegularizationExample MarkovRegularizationExample.cxx)
 target_link_libraries(MarkovRegularizationExample ${OTB_LIBRARIES})
 
-add_executable(MarkovRestaurationExample MarkovRestaurationExample.cxx)
-target_link_libraries(MarkovRestaurationExample ${OTB_LIBRARIES})
+add_executable(MarkovRestorationExample MarkovRestorationExample.cxx)
+target_link_libraries(MarkovRestorationExample ${OTB_LIBRARIES})
 
 
 if(BUILD_TESTING)
diff --git a/Examples/Markov/MarkovClassification1Example.cxx b/Examples/Markov/MarkovClassification1Example.cxx
index 4889dc8..606d4b7 100644
--- a/Examples/Markov/MarkovClassification1Example.cxx
+++ b/Examples/Markov/MarkovClassification1Example.cxx
@@ -27,7 +27,7 @@
 //
 // This example illustrates the details of the \doxygen{otb}{MarkovRandomFieldFilter}.
 // This filter is an application of the Markov Random Fields for classification,
-// segmentation or restauration.
+// segmentation or restoration.
 //
 // This example applies the \doxygen{otb}{MarkovRandomFieldFilter} to
 // classify an image into four classes defined by their mean and variance. The
@@ -115,7 +115,7 @@ int main(int argc, char* argv[])
   //  Software Guide : BeginLatex
   //
   //  Finally, we define the different classes necessary for the Markov classification.
-  //  A \doxygen{otb}{MarkovRandomFieldFilter} is instanciated, this is the
+  //  A \doxygen{otb}{MarkovRandomFieldFilter} is instantiated, this is the
   // main class which connect the other to do the Markov classification.
   //
   //  Software Guide : EndLatex
@@ -128,7 +128,7 @@ int main(int argc, char* argv[])
   //  Software Guide : BeginLatex
   //
   //  An \doxygen{otb}{MRFSamplerRandomMAP}, which derives from the
-  // \doxygen{otb}{MRFSampler}, is instanciated. The sampler is in charge of
+  // \doxygen{otb}{MRFSampler}, is instantiated. The sampler is in charge of
   // proposing a modification for a given site. The
   // \doxygen{otb}{MRFSamplerRandomMAP}, randomly pick one possible value
   // according to the MAP probability.
@@ -142,7 +142,7 @@ int main(int argc, char* argv[])
   //  Software Guide : BeginLatex
   //
   //  An \doxygen{otb}{MRFOptimizerMetropoli}, which derives from the
-  // \doxygen{otb}{MRFOptimizer}, is instanciated. The optimizer is in charge
+  // \doxygen{otb}{MRFOptimizer}, is instantiated. The optimizer is in charge
   // of accepting or rejecting the value proposed by the sampler. The
   // \doxygen{otb}{MRFSamplerRandomMAP}, accept the proposal according to the
   // variation of energy it causes and a temperature parameter.
@@ -155,7 +155,7 @@ int main(int argc, char* argv[])
 
   //  Software Guide : BeginLatex
   //
-  // Two energy, deriving from the \doxygen{otb}{MRFEnergy} class need to be instanciated. One energy
+  // Two energy, deriving from the \doxygen{otb}{MRFEnergy} class need to be instantiated. One energy
   // is required for the regularization, taking into account the relashionship between neighborhing pixels
   // in the classified image. Here it is done with the \doxygen{otb}{MRFEnergyPotts} which implement
   // a Potts model.
@@ -284,7 +284,7 @@ int main(int argc, char* argv[])
   // \center
   // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
   // \includegraphics[width=0.44\textwidth]{MarkovRandomField1.eps}
-  // \itkcaption[MRF restauration]{Result of applying
+  // \itkcaption[MRF restoration]{Result of applying
   // the \doxygen{otb}{MarkovRandomFieldFilter} to an extract from a PAN Quickbird
   // image for classification. The result is obtained after 20 iterations with a
   // random sampler and a Metropolis optimizer. From left to right : original image,
diff --git a/Examples/Markov/MarkovClassification2Example.cxx b/Examples/Markov/MarkovClassification2Example.cxx
index a17b049..ba28b78 100644
--- a/Examples/Markov/MarkovClassification2Example.cxx
+++ b/Examples/Markov/MarkovClassification2Example.cxx
@@ -187,7 +187,7 @@ int main(int argc, char* argv[])
   // \center
   // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
   // \includegraphics[width=0.44\textwidth]{MarkovRandomField2.eps}
-  // \itkcaption[MRF restauration]{Result of applying
+  // \itkcaption[MRF restoration]{Result of applying
   // the \doxygen{otb}{MarkovRandomFieldFilter} to an extract from a PAN Quickbird
   // image for classification. The result is obtained after 5 iterations with a
   // MAP random sampler and an ICM optimizer. From left to right : original image,
diff --git a/Examples/Markov/MarkovClassification3Example.cxx b/Examples/Markov/MarkovClassification3Example.cxx
index ded3268..15816f9 100644
--- a/Examples/Markov/MarkovClassification3Example.cxx
+++ b/Examples/Markov/MarkovClassification3Example.cxx
@@ -125,7 +125,7 @@ int main(int argc, char* argv[] )
   // Software Guide : BeginLatex
   //
   //  An MRFSamplerRandomMAP, which derives from the
-  //  MRFSampler, is instanciated. The sampler is in charge of
+  //  MRFSampler, is instantiated. The sampler is in charge of
   // proposing a modification for a given site. The
   // MRFSamplerRandomMAP, randomly pick one possible value
   // according to the MAP probability.
@@ -139,7 +139,7 @@ int main(int argc, char* argv[] )
   // Software Guide : BeginLatex
   //
   //  An MRFOptimizerMetropolis, which derives from the
-  // MRFOptimizer, is instanciated. The optimizer is in charge
+  // MRFOptimizer, is instantiated. The optimizer is in charge
   // of accepting or rejecting the value proposed by the sampler. The
   // MRFSamplerRandomMAP, accept the proposal according to the
   // variation of energy it causes and a temperature parameter.
@@ -306,7 +306,7 @@ int main(int argc, char* argv[] )
   // \center
   // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
   // \includegraphics[width=0.44\textwidth]{MarkovRandomField3_color_value.eps}
-  // \itkcaption[MRF restauration]{Result of applying
+  // \itkcaption[MRF restoration]{Result of applying
   // the \doxygen{otb}{MarkovRandomFieldFilter} to an extract from a PAN Quickbird
   // image for classification into four classes using the Fisher-distribution as
   // likehood term. From left to right : original image,
diff --git a/Examples/Markov/MarkovRegularizationExample.cxx b/Examples/Markov/MarkovRegularizationExample.cxx
index 4f9dddd..f677495 100644
--- a/Examples/Markov/MarkovRegularizationExample.cxx
+++ b/Examples/Markov/MarkovRegularizationExample.cxx
@@ -175,7 +175,7 @@ int main(int argc, char* argv[])
   // \center
   // \includegraphics[width=0.44\textwidth]{MarkovRegularization.eps}
   // \includegraphics[width=0.44\textwidth]{MarkovRegularization-scaled.eps}
-  // \itkcaption[MRF restauration]{Result of applying
+  // \itkcaption[MRF restoration]{Result of applying
   // the \doxygen{otb}{MarkovRandomFieldFilter} to regularized the result of another
   // classification. From left to right : original classification, regularized
   // classification}
diff --git a/Examples/Markov/MarkovRestaurationExample.cxx b/Examples/Markov/MarkovRestaurationExample.cxx
deleted file mode 100644
index 92bfad7..0000000
--- a/Examples/Markov/MarkovRestaurationExample.cxx
+++ /dev/null
@@ -1,249 +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.
-
-=========================================================================*/
-
-
-//  Software Guide : BeginCommandLineArgs
-//    INPUTS: {QB_Suburb.png}, {QB_Suburb.png}
-//    OUTPUTS: {MarkovRestauration.png}
-//    10.0 30 1.0 1
-//  Software Guide : EndCommandLineArgs
-
-// Software Guide : BeginLatex
-//
-// The Markov Random Field framework can be used to apply an edge preserving
-// filtering, thus playing a role of restauration.
-//
-// This example applies the \doxygen{otb}{MarkovRandomFieldFilter} for
-// image restauration. The structure of the example is similar to the other MRF example.
-// The original image is assumed to be coded in one byte, thus 256 states
-// are possible for each pixel. The only other modifications reside in the energy
-// function chosen for the fidelity and for the regularization.
-//
-// For the regularization energy function, we choose an edge preserving function:
-//
-// \begin{equation}
-// \Phi(u) = \frac{u^2}{1+u^2}
-// \end{equation}
-//
-// and for the fidelity function, we choose a gaussian model.
-//
-// The starting state of the Markov Random Field is given by the image itself
-// as the final state should not be too far from it.
-//
-// Software Guide : EndLatex
-
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-#include "otbMarkovRandomFieldFilter.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkRescaleIntensityImageFilter.h"
-
-// Software Guide : BeginLatex
-//
-// The first step toward the use of this filter is the inclusion of the proper
-// header files:
-//
-// Software Guide : EndLatex
-
-// Software Guide : BeginCodeSnippet
-#include "otbMRFEnergyEdgeFidelity.h"
-#include "otbMRFEnergyGaussian.h"
-#include "otbMRFOptimizerMetropolis.h"
-#include "otbMRFSamplerRandom.h"
-// Software Guide : EndCodeSnippet
-
-int main(int argc, char* argv[])
-{
-
-  if (argc != 8)
-    {
-    std::cerr << "Missing Parameters " << std::endl;
-    std::cerr << "Usage: " << argv[0];
-    std::cerr <<
-    " inputImage inputInitialization output lambda iterations optimizerTemperature"
-              << std::endl;
-    std::cerr << " useRandomValue" << std::endl;
-    return 1;
-    }
-
-//  Software Guide : BeginLatex
-//
-//  We declare the usual types:
-//
-//  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  const unsigned int Dimension = 2;
-
-  typedef double                                   InternalPixelType;
-  typedef unsigned char                            LabelledPixelType;
-  typedef otb::Image<InternalPixelType, Dimension> InputImageType;
-  typedef otb::Image<LabelledPixelType, Dimension> LabelledImageType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  //  We need to declare an additional reader for the initial state of the
-  // MRF. This reader has to be instantiated on the LabelledImageType.
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::ImageFileReader<InputImageType>    ReaderType;
-  typedef otb::ImageFileReader<LabelledImageType> ReaderLabelledType;
-  typedef otb::ImageFileWriter<LabelledImageType> WriterType;
-
-  ReaderType::Pointer         reader = ReaderType::New();
-  ReaderLabelledType::Pointer reader2 = ReaderLabelledType::New();
-  WriterType::Pointer         writer = WriterType::New();
-
-  const char * inputFilename  = argv[1];
-  const char * labelledFilename  = argv[2];
-  const char * outputFilename = argv[3];
-
-  reader->SetFileName(inputFilename);
-  reader2->SetFileName(labelledFilename);
-  writer->SetFileName(outputFilename);
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  // We declare all the necessary types for the MRF:
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::MarkovRandomFieldFilter
-  <InputImageType, LabelledImageType> MarkovRandomFieldFilterType;
-
-  typedef otb::MRFSamplerRandom<InputImageType, LabelledImageType> SamplerType;
-
-  typedef otb::MRFOptimizerMetropolis OptimizerType;
-  // Software Guide : EndCodeSnippet
-
-  //  Software Guide : BeginLatex
-  //
-  // The regularization and the fidelity energy are declared and instanciated:
-  //
-  //  Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  typedef otb::MRFEnergyEdgeFidelity
-  <LabelledImageType, LabelledImageType>  EnergyRegularizationType;
-  typedef otb::MRFEnergyGaussian
-  <InputImageType, LabelledImageType>  EnergyFidelityType;
-  // Software Guide : EndCodeSnippet
-
-// Software Guide : BeginCodeSnippet
-  MarkovRandomFieldFilterType::Pointer markovFilter =
-    MarkovRandomFieldFilterType::New();
-
-  EnergyRegularizationType::Pointer energyRegularization =
-    EnergyRegularizationType::New();
-  EnergyFidelityType::Pointer energyFidelity = EnergyFidelityType::New();
-
-  OptimizerType::Pointer optimizer = OptimizerType::New();
-  SamplerType::Pointer   sampler = SamplerType::New();
-  // Software Guide : EndCodeSnippet
-
-  if ((bool) (atoi(argv[7])) == true)
-    {
-    // Overpass random calculation(for test only):
-    sampler->InitializeSeed(0);
-    optimizer->InitializeSeed(1);
-    markovFilter->InitializeSeed(2);
-    }
-
-  // Software Guide : BeginLatex
-  //
-  // The number of possible states for each pixel is 256 as the image is assumed
-  // to be coded on one byte and we pass the parameters to the markovFilter.
-  //
-  // Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  unsigned int nClass = 256;
-
-  optimizer->SetSingleParameter(atof(argv[6]));
-  markovFilter->SetNumberOfClasses(nClass);
-  markovFilter->SetMaximumNumberOfIterations(atoi(argv[5]));
-  markovFilter->SetErrorTolerance(0.0);
-  markovFilter->SetLambda(atof(argv[4]));
-  markovFilter->SetNeighborhoodRadius(1);
-
-  markovFilter->SetEnergyRegularization(energyRegularization);
-  markovFilter->SetEnergyFidelity(energyFidelity);
-  markovFilter->SetOptimizer(optimizer);
-  markovFilter->SetSampler(sampler);
-  // Software Guide : EndCodeSnippet
-
-  // Software Guide : BeginLatex
-  //
-  // The original state of the MRF filter is passed through the
-  // \code{SetTrainingInput()} method:
-  //
-  // Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  markovFilter->SetTrainingInput(reader2->GetOutput());
-// Software Guide : EndCodeSnippet
-
-  // Software Guide : BeginLatex
-  //
-  // And we plug the pipeline:
-  //
-  // Software Guide : EndLatex
-
-  // Software Guide : BeginCodeSnippet
-  markovFilter->SetInput(reader->GetOutput());
-
-  typedef itk::RescaleIntensityImageFilter
-  <LabelledImageType, LabelledImageType> RescaleType;
-  RescaleType::Pointer rescaleFilter = RescaleType::New();
-  rescaleFilter->SetOutputMinimum(0);
-  rescaleFilter->SetOutputMaximum(255);
-
-  rescaleFilter->SetInput(markovFilter->GetOutput());
-
-  writer->SetInput(rescaleFilter->GetOutput());
-
-  writer->Update();
-  // Software Guide : EndCodeSnippet
-
-  // Software Guide : BeginLatex
-  //
-  // Figure~\ref{fig:MRF_RESTAURATION} shows the output of the Markov Random
-  // Field restauration.
-  //
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
-  // \includegraphics[width=0.44\textwidth]{MarkovRestauration.eps}
-  // \itkcaption[MRF restauration]{Result of applying
-  // the \doxygen{otb}{MarkovRandomFieldFilter} to an extract from a PAN Quickbird
-  // image for restauration. From left to right : original image, restaured image
-  // with edge preservation.}
-  // \label{fig:MRF_RESTAURATION}
-  // \end{figure}
-  //
-  // Software Guide : EndLatex
-
-  return EXIT_SUCCESS;
-
-}
diff --git a/Examples/Markov/MarkovRestorationExample.cxx b/Examples/Markov/MarkovRestorationExample.cxx
new file mode 100644
index 0000000..3821d19
--- /dev/null
+++ b/Examples/Markov/MarkovRestorationExample.cxx
@@ -0,0 +1,249 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+
+
+//  Software Guide : BeginCommandLineArgs
+//    INPUTS: {QB_Suburb.png}, {QB_Suburb.png}
+//    OUTPUTS: {MarkovRestoration.png}
+//    10.0 30 1.0 1
+//  Software Guide : EndCommandLineArgs
+
+// Software Guide : BeginLatex
+//
+// The Markov Random Field framework can be used to apply an edge preserving
+// filtering, thus playing a role of restoration.
+//
+// This example applies the \doxygen{otb}{MarkovRandomFieldFilter} for
+// image restoration. The structure of the example is similar to the other MRF example.
+// The original image is assumed to be coded in one byte, thus 256 states
+// are possible for each pixel. The only other modifications reside in the energy
+// function chosen for the fidelity and for the regularization.
+//
+// For the regularization energy function, we choose an edge preserving function:
+//
+// \begin{equation}
+// \Phi(u) = \frac{u^2}{1+u^2}
+// \end{equation}
+//
+// and for the fidelity function, we choose a gaussian model.
+//
+// The starting state of the Markov Random Field is given by the image itself
+// as the final state should not be too far from it.
+//
+// Software Guide : EndLatex
+
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbImage.h"
+#include "otbMarkovRandomFieldFilter.h"
+#include "itkUnaryFunctorImageFilter.h"
+#include "itkRescaleIntensityImageFilter.h"
+
+// Software Guide : BeginLatex
+//
+// The first step toward the use of this filter is the inclusion of the proper
+// header files:
+//
+// Software Guide : EndLatex
+
+// Software Guide : BeginCodeSnippet
+#include "otbMRFEnergyEdgeFidelity.h"
+#include "otbMRFEnergyGaussian.h"
+#include "otbMRFOptimizerMetropolis.h"
+#include "otbMRFSamplerRandom.h"
+// Software Guide : EndCodeSnippet
+
+int main(int argc, char* argv[])
+{
+
+  if (argc != 8)
+    {
+    std::cerr << "Missing Parameters " << std::endl;
+    std::cerr << "Usage: " << argv[0];
+    std::cerr <<
+    " inputImage inputInitialization output lambda iterations optimizerTemperature"
+              << std::endl;
+    std::cerr << " useRandomValue" << std::endl;
+    return 1;
+    }
+
+//  Software Guide : BeginLatex
+//
+//  We declare the usual types:
+//
+//  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  const unsigned int Dimension = 2;
+
+  typedef double                                   InternalPixelType;
+  typedef unsigned char                            LabelledPixelType;
+  typedef otb::Image<InternalPixelType, Dimension> InputImageType;
+  typedef otb::Image<LabelledPixelType, Dimension> LabelledImageType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  //  We need to declare an additional reader for the initial state of the
+  // MRF. This reader has to be instantiated on the LabelledImageType.
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::ImageFileReader<InputImageType>    ReaderType;
+  typedef otb::ImageFileReader<LabelledImageType> ReaderLabelledType;
+  typedef otb::ImageFileWriter<LabelledImageType> WriterType;
+
+  ReaderType::Pointer         reader = ReaderType::New();
+  ReaderLabelledType::Pointer reader2 = ReaderLabelledType::New();
+  WriterType::Pointer         writer = WriterType::New();
+
+  const char * inputFilename  = argv[1];
+  const char * labelledFilename  = argv[2];
+  const char * outputFilename = argv[3];
+
+  reader->SetFileName(inputFilename);
+  reader2->SetFileName(labelledFilename);
+  writer->SetFileName(outputFilename);
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  // We declare all the necessary types for the MRF:
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::MarkovRandomFieldFilter
+  <InputImageType, LabelledImageType> MarkovRandomFieldFilterType;
+
+  typedef otb::MRFSamplerRandom<InputImageType, LabelledImageType> SamplerType;
+
+  typedef otb::MRFOptimizerMetropolis OptimizerType;
+  // Software Guide : EndCodeSnippet
+
+  //  Software Guide : BeginLatex
+  //
+  // The regularization and the fidelity energy are declared and instantiated:
+  //
+  //  Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  typedef otb::MRFEnergyEdgeFidelity
+  <LabelledImageType, LabelledImageType>  EnergyRegularizationType;
+  typedef otb::MRFEnergyGaussian
+  <InputImageType, LabelledImageType>  EnergyFidelityType;
+  // Software Guide : EndCodeSnippet
+
+// Software Guide : BeginCodeSnippet
+  MarkovRandomFieldFilterType::Pointer markovFilter =
+    MarkovRandomFieldFilterType::New();
+
+  EnergyRegularizationType::Pointer energyRegularization =
+    EnergyRegularizationType::New();
+  EnergyFidelityType::Pointer energyFidelity = EnergyFidelityType::New();
+
+  OptimizerType::Pointer optimizer = OptimizerType::New();
+  SamplerType::Pointer   sampler = SamplerType::New();
+  // Software Guide : EndCodeSnippet
+
+  if ((bool) (atoi(argv[7])) == true)
+    {
+    // Overpass random calculation(for test only):
+    sampler->InitializeSeed(0);
+    optimizer->InitializeSeed(1);
+    markovFilter->InitializeSeed(2);
+    }
+
+  // Software Guide : BeginLatex
+  //
+  // The number of possible states for each pixel is 256 as the image is assumed
+  // to be coded on one byte and we pass the parameters to the markovFilter.
+  //
+  // Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  unsigned int nClass = 256;
+
+  optimizer->SetSingleParameter(atof(argv[6]));
+  markovFilter->SetNumberOfClasses(nClass);
+  markovFilter->SetMaximumNumberOfIterations(atoi(argv[5]));
+  markovFilter->SetErrorTolerance(0.0);
+  markovFilter->SetLambda(atof(argv[4]));
+  markovFilter->SetNeighborhoodRadius(1);
+
+  markovFilter->SetEnergyRegularization(energyRegularization);
+  markovFilter->SetEnergyFidelity(energyFidelity);
+  markovFilter->SetOptimizer(optimizer);
+  markovFilter->SetSampler(sampler);
+  // Software Guide : EndCodeSnippet
+
+  // Software Guide : BeginLatex
+  //
+  // The original state of the MRF filter is passed through the
+  // \code{SetTrainingInput()} method:
+  //
+  // Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  markovFilter->SetTrainingInput(reader2->GetOutput());
+// Software Guide : EndCodeSnippet
+
+  // Software Guide : BeginLatex
+  //
+  // And we plug the pipeline:
+  //
+  // Software Guide : EndLatex
+
+  // Software Guide : BeginCodeSnippet
+  markovFilter->SetInput(reader->GetOutput());
+
+  typedef itk::RescaleIntensityImageFilter
+  <LabelledImageType, LabelledImageType> RescaleType;
+  RescaleType::Pointer rescaleFilter = RescaleType::New();
+  rescaleFilter->SetOutputMinimum(0);
+  rescaleFilter->SetOutputMaximum(255);
+
+  rescaleFilter->SetInput(markovFilter->GetOutput());
+
+  writer->SetInput(rescaleFilter->GetOutput());
+
+  writer->Update();
+  // Software Guide : EndCodeSnippet
+
+  // Software Guide : BeginLatex
+  //
+  // Figure~\ref{fig:MRF_RESTORATION} shows the output of the Markov Random
+  // Field restoration.
+  //
+  // \begin{figure}
+  // \center
+  // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
+  // \includegraphics[width=0.44\textwidth]{MarkovRestoration.eps}
+  // \itkcaption[MRF restoration]{Result of applying
+  // the \doxygen{otb}{MarkovRandomFieldFilter} to an extract from a PAN Quickbird
+  // image for restoration. From left to right : original image, restaured image
+  // with edge preservation.}
+  // \label{fig:MRF_RESTORATION}
+  // \end{figure}
+  //
+  // Software Guide : EndLatex
+
+  return EXIT_SUCCESS;
+
+}
diff --git a/Examples/Markov/test/CMakeLists.txt b/Examples/Markov/test/CMakeLists.txt
index ad7e18b..1682afc 100644
--- a/Examples/Markov/test/CMakeLists.txt
+++ b/Examples/Markov/test/CMakeLists.txt
@@ -37,14 +37,14 @@ otb_add_test(NAME maTeMarkovClassification3ExampleTest COMMAND ${OTB_TEST_DRIVER
     1.0 20 1.0 1
 )
 
-otb_add_test(NAME maTeMarkovRestaurationExampleTest COMMAND ${OTB_TEST_DRIVER}
+otb_add_test(NAME maTeMarkovRestorationExampleTest COMMAND ${OTB_TEST_DRIVER}
   --compare-image ${EPSILON_8}
-    ${BASELINE}/MarkovRestauration.png
-    ${TEMP}/MarkovRestauration.png
-  Execute $<TARGET_FILE:MarkovRestaurationExample>
+    ${BASELINE}/MarkovRestoration.png
+    ${TEMP}/MarkovRestoration.png
+  Execute $<TARGET_FILE:MarkovRestorationExample>
     ${INPUTDATA}/QB_Suburb.png
     ${INPUTDATA}/QB_Suburb.png
-    ${TEMP}/MarkovRestauration.png
+    ${TEMP}/MarkovRestoration.png
     10.0
     30.0
     1.
diff --git a/Examples/MultiScale/MorphologicalPyramidSegmentationExample.cxx b/Examples/MultiScale/MorphologicalPyramidSegmentationExample.cxx
index 1933d77..aa981c1 100644
--- a/Examples/MultiScale/MorphologicalPyramidSegmentationExample.cxx
+++ b/Examples/MultiScale/MorphologicalPyramidSegmentationExample.cxx
@@ -29,7 +29,7 @@
 // extraction and segmentation are computed using quantiles. A pre
 // processing step is applied by multiplying the full resolution
 // brighter details (resp. darker details) with the original image
-// (resp. the inverted original image). This perfoms an enhancement of
+// (resp. the inverted original image). This performs an enhancement of
 // the regions contour precision. The details from the pyramid are set
 // via the \code{SetBrighterDetails()} and \code{SetDarkerDetails()}
 // methods. The brighter and darker details depend on the filter used
diff --git a/Examples/MultiScale/MorphologicalPyramidSegmenterExample.cxx b/Examples/MultiScale/MorphologicalPyramidSegmenterExample.cxx
index 612222c..7b1a333 100644
--- a/Examples/MultiScale/MorphologicalPyramidSegmenterExample.cxx
+++ b/Examples/MultiScale/MorphologicalPyramidSegmenterExample.cxx
@@ -27,7 +27,7 @@
 // This example illustrates the use of the
 // \subdoxygen{otb}{MorphologicalPyramid}{Segmenter}. This class performs
 // the segmentation of a detail image extracted from a morphological
-// pyramid analysis. The Segmentation is perfomed using the
+// pyramid analysis. The Segmentation is performed using the
 // \doxygen{itk}{ConnectedThresholdImageFilter}. The seeds are
 // extracted from the image using the
 // \doxygen{otb}{ImageToPointSetFilter}. The thresolds are set by
@@ -117,7 +117,7 @@ int main(int itkNotUsed(argc), char * argv[])
 //
 // We instantiate the segmenter and set its parameters as follows. We
 // plug the output of the readers for the details image and the
-// original image; we set the boolean variable which controls wether
+// original image; we set the boolean variable which controls whether
 // the segmented details are bright or dark; we set the quantile used
 // to threshold the details image in order to obtain the seed points
 // for the segmentation; we set the quantile for setting the threshold
diff --git a/Examples/OBIA/HooverMetricsEstimation.cxx b/Examples/OBIA/HooverMetricsEstimation.cxx
index 179eda0..12408b3 100644
--- a/Examples/OBIA/HooverMetricsEstimation.cxx
+++ b/Examples/OBIA/HooverMetricsEstimation.cxx
@@ -30,8 +30,8 @@
 // The following example shows how to compare two segmentations, using Hoover
 // metrics. For instance, it can be used to compare a segmentation produced
 // by your algorithm against a partial ground truth segmentation. In this
-// example, the ground truth segmentation will be refered by the letters GT
-// whereas the machine segmentation will be refered by MS.
+// example, the ground truth segmentation will be referred by the letters GT
+// whereas the machine segmentation will be referred by MS.
 //
 // The estimation of Hoover metrics is done with two filters :
 // \doxygen{otb}{HooverMatrixFilter} and \doxygen{otb}{HooverInstanceFilter}.
diff --git a/Examples/OBIA/LabelMapToVectorData.cxx b/Examples/OBIA/LabelMapToVectorData.cxx
index 1546ed9..81051ee 100644
--- a/Examples/OBIA/LabelMapToVectorData.cxx
+++ b/Examples/OBIA/LabelMapToVectorData.cxx
@@ -31,7 +31,7 @@
 // The \doxygen{otb}{LabelMapToVectorDataFilter} converts an \doxygen{itk}{LabelMap} to an
 // \doxygen{otb}{VectorData} where all the pixels get the attribute
 // value of the label object they belong to.
-// It uses the class \doxygen{otb}{LabelObjectToPolygonFunctor} wich
+// It uses the class \doxygen{otb}{LabelObjectToPolygonFunctor} which
 // follows a finite state machine described in \cite{Francis2000}.
 //
 //  Only polygon conversion is available yet.
diff --git a/Examples/Patented/EstimateAffineTransformationExample.cxx b/Examples/Patented/EstimateAffineTransformationExample.cxx
index 6a3610d..6b34ce3 100644
--- a/Examples/Patented/EstimateAffineTransformationExample.cxx
+++ b/Examples/Patented/EstimateAffineTransformationExample.cxx
@@ -33,7 +33,7 @@
 // \doxygen{otb}{LeastSquareAffineTransformEstimator} will be used
 // to generate a transformation field by using
 // mean square optimisation to estimate
-// an affine transfrom from the point set.
+// an affine transform from the point set.
 //
 // The first step toward the use of these filters is to include the
 // appropriate header files.
diff --git a/Examples/Projections/EstimateRPCSensorModelExample.cxx b/Examples/Projections/EstimateRPCSensorModelExample.cxx
index b92829d..80424c1 100644
--- a/Examples/Projections/EstimateRPCSensorModelExample.cxx
+++ b/Examples/Projections/EstimateRPCSensorModelExample.cxx
@@ -101,7 +101,7 @@ int main(int argc, char* argv[])
   // set from the command line parameters and they are stored in:
   // \begin{itemize}
   // \item \doxygen{otb}{Point3DType} : Store the sensor point (3D ground point)
-  // \item \doxygen{otb}{Point2DType} : Pixel assotiated in the image (2D physical coordinates)
+  // \item \doxygen{otb}{Point2DType} : Pixel associated in the image (2D physical coordinates)
 
   // Here we do not use DEM or MeanElevation. It is also possible to give a 2D
   // ground point and use the DEM or MeanElevation to get
diff --git a/Examples/Projections/MapProjectionExample.cxx b/Examples/Projections/MapProjectionExample.cxx
index 13e88e5..9843707 100644
--- a/Examples/Projections/MapProjectionExample.cxx
+++ b/Examples/Projections/MapProjectionExample.cxx
@@ -38,7 +38,7 @@
 // file, over 30 projections are defined and ready to use. It is easy
 // to add new one.
 //
-// The otbGenericMapProjection enables you to instanciate a map
+// The otbGenericMapProjection enables you to instantiate a map
 // projection from a WKT (Well Known Text) string, which is popular
 // with OGR for example.
 //
diff --git a/Examples/Projections/OrthoRectificationExample.cxx b/Examples/Projections/OrthoRectificationExample.cxx
index 2a529cf..20f911e 100644
--- a/Examples/Projections/OrthoRectificationExample.cxx
+++ b/Examples/Projections/OrthoRectificationExample.cxx
@@ -97,7 +97,7 @@ int main(int argc, char* argv[])
 // Software Guide : BeginLatex
 //
 // Now we need to
-// instanciate the map projection, set the {\em zone} and {\em hemisphere}
+// instantiate the map projection, set the {\em zone} and {\em hemisphere}
 // parameters and pass this projection to the orthorectification filter.
 //
 // Software Guide : EndLatex
diff --git a/Examples/Projections/SensorModelExample.cxx b/Examples/Projections/SensorModelExample.cxx
index 2b6b9fc..d87f5d4 100644
--- a/Examples/Projections/SensorModelExample.cxx
+++ b/Examples/Projections/SensorModelExample.cxx
@@ -359,7 +359,7 @@ int main(int argc, char* argv[])
 // Software Guide : BeginLatex
 //
 // We use the sensor model to get the pixel coordinates in the input
-// image and we transform this coodinates to an index. Then we store
+// image and we transform this coordinates to an index. Then we store
 // the index in the array. Note that the \code{TransformPoint()}
 // method of the model has been overloaded so that it can be used with
 // a 3D point when the height of the ground point is known (DEM availability).
diff --git a/Examples/Projections/test/CMakeLists.txt b/Examples/Projections/test/CMakeLists.txt
index 7964d86..7c160f3 100644
--- a/Examples/Projections/test/CMakeLists.txt
+++ b/Examples/Projections/test/CMakeLists.txt
@@ -36,7 +36,7 @@ otb_add_test(NAME prTeOrthoRectificationExampleXSTest COMMAND ${OTB_TEST_DRIVER}
 )
 
 otb_add_test(NAME prTeMapProjectionExampleTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-ascii ${NOTOL}
+  --compare-ascii ${EPSILON_7}
     ${BASELINE}/mapProjectionExample.txt
     ${TEMP}/mapProjectionExample.txt
   Execute $<TARGET_FILE:MapProjectionExample>
diff --git a/Examples/Radiometry/AtmosphericCorrectionSequencement.cxx b/Examples/Radiometry/AtmosphericCorrectionSequencement.cxx
index 98a1837..ff248b7 100644
--- a/Examples/Radiometry/AtmosphericCorrectionSequencement.cxx
+++ b/Examples/Radiometry/AtmosphericCorrectionSequencement.cxx
@@ -87,7 +87,7 @@
 // \footnote{Before version 4.2, this class was storing all correction
 // parameters} \doxygen{otb}{AtmosphericCorrectionParameters}.
 // \item The acquisition correction parameters : sensor related information
-// about the way the image was taken, usualy available with the image
+// about the way the image was taken, usually available with the image
 // metadata (for instance : solar angles, spectral
 // sensitivity, ...). They are stored in the class
 // \doxygen{otb}{ImageMetadataCorrectionParameters}.
@@ -383,7 +383,7 @@ int main(int argc, char *argv[])
   // Software Guide : BeginLatex
   //
   // The \doxygen{otb}{ImageMetadataCorrectionParameters} class stores
-  // several parameters that are generaly present in the image metadata :
+  // several parameters that are generally present in the image metadata :
   // \begin{itemize}
   // \item The zenithal and azimutal solar angles that describe the solar incidence
   // configuration (in degrees);
@@ -624,7 +624,7 @@ int main(int argc, char *argv[])
 //  Software Guide : BeginLatex
 //
 // At this step, each filter of the chain is instancied and every one has its
-// input paramters set. A name can be given to the output image, each filter
+// input parameters set. A name can be given to the output image, each filter
 //  can be linked to the next one and create the final processing chain.
 //
 //  Software Guide : EndLatex
diff --git a/Examples/Radiometry/test/CMakeLists.txt b/Examples/Radiometry/test/CMakeLists.txt
index b77c8c8..67e2c10 100644
--- a/Examples/Radiometry/test/CMakeLists.txt
+++ b/Examples/Radiometry/test/CMakeLists.txt
@@ -68,7 +68,7 @@ otb_add_test(NAME raTeAtmosphericCorrectionSequencementTest COMMAND ${OTB_TEST_D
     # LuminanceToReflectance parameters
     27.3    #solar azimuthal elevation
     4       #day
-    12      #mounth
+    12      #month
     # AtmosphericCorrectionParametersTo6SAtmosphericRadiativeTerms parameters
     152.7
     2.5
diff --git a/Examples/Segmentation/FastMarchingImageFilter.cxx b/Examples/Segmentation/FastMarchingImageFilter.cxx
index f73c19c..bd5a047 100644
--- a/Examples/Segmentation/FastMarchingImageFilter.cxx
+++ b/Examples/Segmentation/FastMarchingImageFilter.cxx
@@ -525,7 +525,7 @@ int main(int argc, char *argv[])
 
   //  Here we configure all the writers required to see the intermediate
   //  outputs of the pipeline. This is added here only for
-  //  pedagogical/debugging purposes. These intermediate output are normaly not
+  //  pedagogical/debugging purposes. These intermediate output are normally not
   //  required. Only the output of the final thresholding filter should be
   //  relevant.  Observing intermediate output is helpful in the process of
   //  fine tuning the parameters of filters in the pipeline.
@@ -626,7 +626,7 @@ int main(int argc, char *argv[])
   writer4->Update();
 
   // The following writer type is used to save the output of the
-  // time-crossing map in a file with appropiate pixel representation. The
+  // time-crossing map in a file with appropriate pixel representation. The
   // advantage of saving this image in native format is that it can be used
   // with a viewer to help determine an appropriate threshold to be used on
   // the output of the \code{fastmarching} filter.
diff --git a/Examples/Segmentation/OtsuMultipleThresholdImageFilter.cxx b/Examples/Segmentation/OtsuMultipleThresholdImageFilter.cxx
index 11faabf..c61dc62 100644
--- a/Examples/Segmentation/OtsuMultipleThresholdImageFilter.cxx
+++ b/Examples/Segmentation/OtsuMultipleThresholdImageFilter.cxx
@@ -155,7 +155,7 @@ int main(int argc, char * argv[])
   CalculatorType::OutputType::const_iterator itNum = thresholdVector.begin();
   // Software Guide : EndCodeSnippet
 
-  //Threshold into seperate segments and write out as binary images
+  //Threshold into separate segments and write out as binary images
   double lowerThreshold = 0;
   double upperThreshold;
 
diff --git a/Examples/Segmentation/StreamingMeanShiftSegmentation.cxx b/Examples/Segmentation/StreamingMeanShiftSegmentation.cxx
index 177d53d..b2c037a 100644
--- a/Examples/Segmentation/StreamingMeanShiftSegmentation.cxx
+++ b/Examples/Segmentation/StreamingMeanShiftSegmentation.cxx
@@ -99,7 +99,7 @@ int main(int argc, char *argv[])
 
   // Software Guide : BeginLatex
   //
-  // Finaly we define a Reader on the input image and a mask reader.
+  // Finally we define a Reader on the input image and a mask reader.
   // All pixels in the mask with a value of 0 will not be considered suitable for vectorization.
   // Software Guide : EndLatex
   // Software Guide : BeginCodeSnippet
@@ -125,9 +125,9 @@ int main(int argc, char *argv[])
 
   // Software Guide : BeginLatex
   //
-  // The instanciation of the DataSource is slightly different as usual.
+  // The instantiation of the DataSource is slightly different as usual.
   // In fact the \code{New()} method on a \doxygen{otb}{ogr}{DataSource} can be called with or without parameters.
-  // Without parameters, the \code{New()} method instanciate a "Memory" DataSource, which means all the data are stored in memory.
+  // Without parameters, the \code{New()} method instantiate a "Memory" DataSource, which means all the data are stored in memory.
   // This is not useful in case of large scale segmentation as it will result in millions of polygons kept in memory ...
   // However the \code{New()} method can also take a filename (\code{std::String}) parameter. Then either the file already exists
   // and the corresponding ogr driver is used to open the file, or it doesn't exists and then it is created.
@@ -242,7 +242,7 @@ int main(int argc, char *argv[])
   // Polygons that have the largest intersection over a tile are fusioned. Each polygon can be fusioned
   // only once per tile border (row and column).
   // Let's look at the code for fusioning.
-  // As usual we declared and instanciate the \doxygen{otb}{OGRLayerStreamStitchingFilter}.
+  // As usual we declared and instantiate the \doxygen{otb}{OGRLayerStreamStitchingFilter}.
   // Software Guide : EndLatex
   // Software Guide : BeginCodeSnippet
   typedef otb::OGRLayerStreamStitchingFilter<ImageType>   FusionFilterType;
diff --git a/Examples/Simulation/LAIAndPROSAILToSensorResponse.cxx b/Examples/Simulation/LAIAndPROSAILToSensorResponse.cxx
index b972fd7..18f1378 100644
--- a/Examples/Simulation/LAIAndPROSAILToSensorResponse.cxx
+++ b/Examples/Simulation/LAIAndPROSAILToSensorResponse.cxx
@@ -419,7 +419,7 @@ protected:
 // Software Guide : BeginLatex
 //
 // \code{TernaryFunctorImageFilterWithNBands} class is defined here.
-// This class inherits form \doxygen{itk::TernaryFunctorImageFilter} with additionnal nuber of band parameters.
+// This class inherits form \doxygen{itk::TernaryFunctorImageFilter} with additional nuber of band parameters.
 // It's implementation is done to process Label, LAI, and mask image with Simulation functor.
 // Software Guide : EndLatex
 
@@ -591,7 +591,7 @@ int main(int argc, char *argv[])
 
   // Software Guide : BeginLatex
   //
-  // Acquisition parameters are loaded using text file. A detailled definition of acquisition parameters can
+  // Acquisition parameters are loaded using text file. A detailed definition of acquisition parameters can
   // be found in class \doxygen{SailModel}.
   //
   // Software Guide : EndLatex
@@ -641,7 +641,7 @@ int main(int argc, char *argv[])
   // Label parameters are loaded using text file.
   // Two type of object characteristic can be found. If label corresponds to vegetation class,
   // then leaf parameters are loaded.
-  // A detailled definition of leaf parameters can be found in class \doxygen{otb}{LeafParameters} class.
+  // A detailed definition of leaf parameters can be found in class \doxygen{otb}{LeafParameters} class.
   // Otherwise object reflectance is generated from $400$ to $2400nm$ using \href{http://speclib.jpl.nasa.gov/}{Aster database}.
   // Software Guide : EndLatex
 
diff --git a/Examples/Simulation/LAIFromNDVIImageTransform.cxx b/Examples/Simulation/LAIFromNDVIImageTransform.cxx
index 5e34a71..1e8c043 100644
--- a/Examples/Simulation/LAIFromNDVIImageTransform.cxx
+++ b/Examples/Simulation/LAIFromNDVIImageTransform.cxx
@@ -19,7 +19,7 @@
 //  Software Guide : BeginCommandLineArgs
 //
 // INPUTS:  {verySmallFSATSW.tif}
-// OUTPUTS: {siTvLAIFromNDVIImageTransfromExampleTest_verySmallFSATSW.tif}, {verySmallFSATSW_visu.png}, {siTvLAIFromNDVIImageTransfromExampleTest_verySmallFSATSW_visu.png}
+// OUTPUTS: {siTvLAIFromNDVIImageTransformExampleTest_verySmallFSATSW.tif}, {verySmallFSATSW_visu.png}, {siTvLAIFromNDVIImageTransformExampleTest_verySmallFSATSW_visu.png}
 // 1 4
 //  Software Guide : EndCommandLineArgs
 //
@@ -175,7 +175,7 @@ int main(int argc, char *argv[])
    // \begin{figure}
    // \center
    // \includegraphics[width=0.44\textwidth]{verySmallFSATSW_visu.eps}
-   // \includegraphics[width=0.44\textwidth]{siTvLAIFromNDVIImageTransfromExampleTest_verySmallFSATSW_visu.eps}
+   // \includegraphics[width=0.44\textwidth]{siTvLAIFromNDVIImageTransformExampleTest_verySmallFSATSW_visu.eps}
    // \itkcaption[LAIFromNDVIImageTransform Filter]{LAI generation \emph{(right)} from NDVI applied on Formosat 2 Image \emph{(left)} .}
    // \label{fig:LAIFromNDVIImageTransform}
    // \end{figure}
diff --git a/Examples/Simulation/ProsailModel.cxx b/Examples/Simulation/ProsailModel.cxx
index c864bcb..575f42f 100644
--- a/Examples/Simulation/ProsailModel.cxx
+++ b/Examples/Simulation/ProsailModel.cxx
@@ -135,7 +135,7 @@ int main(int argc, char *argv[])
   //  sail input parameters are :
   //  \begin{itemize}
   //  \item leaf area index (LAI).
-  //  \item average leaf angle (Ang) in $\deg$.
+  //  \item average leaf angle (Angle) in $\deg$.
   //  \item soil coefficient (PSoil).
   //  \item diffuse/direct radiation (Skyl).
   //  \item hot spot (HSpot).
@@ -149,7 +149,7 @@ int main(int argc, char *argv[])
 
   // Software Guide : BeginCodeSnippet
   double LAI = static_cast<double> (atof(argv[7]));
-  double Angl = static_cast<double> (atof(argv[8]));
+  double Angle = static_cast<double> (atof(argv[8]));
   double PSoil = static_cast<double> (atof(argv[9]));
   double Skyl = static_cast<double> (atof(argv[10]));
   double HSpot = static_cast<double> (atof(argv[11]));
@@ -162,7 +162,7 @@ int main(int argc, char *argv[])
   SailType::Pointer sail = SailType::New();
 
   sail->SetLAI(LAI);
-  sail->SetAngl(Angl);
+  sail->SetAngl(Angle);
   sail->SetPSoil(PSoil);
   sail->SetSkyl(Skyl);
   sail->SetHSpot(HSpot);
@@ -229,7 +229,7 @@ int main(int argc, char *argv[])
   //  \item Cm 0.009
   //  \item N 1.2
   //  \item LAI 2
-  //  \item Angl 50
+  //  \item Angle 50
   //  \item PSoil 1
   //  \item Skyl 70
   //  \item HSpot 0.2
diff --git a/Examples/Simulation/test/CMakeLists.txt b/Examples/Simulation/test/CMakeLists.txt
index 9cb0323..1d68427 100644
--- a/Examples/Simulation/test/CMakeLists.txt
+++ b/Examples/Simulation/test/CMakeLists.txt
@@ -45,15 +45,15 @@ Execute $<TARGET_FILE:LAIAndPROSAILToSensorResponse>
 
 endif()
 
-otb_add_test(NAME siTvLAIFromNDVIImageTransfromExampleTest  COMMAND ${OTB_TEST_DRIVER}
+otb_add_test(NAME siTvLAIFromNDVIImageTransformExampleTest  COMMAND ${OTB_TEST_DRIVER}
   --compare-image ${EPSILON_8}
     ${OTB_DATA_ROOT}/Baseline/OTB/Images/raRAndNIRVegetationIndex_LAIFromNDVIFormosat2_verySmallFSATSWcRcNir.tif
-    ${TEMP}/siTvLAIFromNDVIImageTransfromExampleTest_verySmallFSATSW.tif
+    ${TEMP}/siTvLAIFromNDVIImageTransformExampleTest_verySmallFSATSW.tif
   Execute $<TARGET_FILE:LAIFromNDVIImageTransform>
     ${INPUTDATA}/verySmallFSATSW.tif
-    ${TEMP}/siTvLAIFromNDVIImageTransfromExampleTest_verySmallFSATSW.tif
+    ${TEMP}/siTvLAIFromNDVIImageTransformExampleTest_verySmallFSATSW.tif
     ${TEMP}/verySmallFSATSW_visu.png
-    ${TEMP}/siTvLAIFromNDVIImageTransfromExampleTest_verySmallFSATSW_visu.png
+    ${TEMP}/siTvLAIFromNDVIImageTransformExampleTest_verySmallFSATSW_visu.png
     1  # red
     4  # nir
 )
diff --git a/Examples/Tutorials/FilteringPipeline.cxx b/Examples/Tutorials/FilteringPipeline.cxx
index 8b10f1a..e75707c 100644
--- a/Examples/Tutorials/FilteringPipeline.cxx
+++ b/Examples/Tutorials/FilteringPipeline.cxx
@@ -25,7 +25,7 @@
 //
 //
 //  We are going to use the \doxygen{itk}{GradientMagnitudeImageFilter}
-// to compute the gradient of the image. The begining of the file is
+// to compute the gradient of the image. The beginning of the file is
 // similar to the Pipeline.cxx.
 //
 // We include the required headers, without forgetting to add the header
diff --git a/Examples/Tutorials/Multispectral.cxx b/Examples/Tutorials/Multispectral.cxx
index 1da5a4a..7206bb5 100644
--- a/Examples/Tutorials/Multispectral.cxx
+++ b/Examples/Tutorials/Multispectral.cxx
@@ -24,7 +24,7 @@
 //  Software Guide : BeginLatex
 //
 //  First, we are going to use \doxygen{otb}{VectorImage} instead of the now
-// traditionnal \doxygen{otb}{Image}. So we include the required header:
+// traditional \doxygen{otb}{Image}. So we include the required header:
 //
 //  Software Guide : EndLatex
 
diff --git a/Examples/Tutorials/OrthoFusion.cxx b/Examples/Tutorials/OrthoFusion.cxx
index a1ae3c6..f2d9d98 100644
--- a/Examples/Tutorials/OrthoFusion.cxx
+++ b/Examples/Tutorials/OrthoFusion.cxx
@@ -102,7 +102,7 @@ int main(int argc, char* argv[])
   //  Software Guide : BeginLatex
   //
   // We declare the projection (here we chose the UTM projection, other choices
-  // are possible) and retrieve the paremeters from the command line:
+  // are possible) and retrieve the parameters from the command line:
   // \begin{itemize}
   // \item the UTM zone
   // \item the hemisphere
diff --git a/Examples/Tutorials/ScalingPipeline.cxx b/Examples/Tutorials/ScalingPipeline.cxx
index fcead9e..2a78f08 100644
--- a/Examples/Tutorials/ScalingPipeline.cxx
+++ b/Examples/Tutorials/ScalingPipeline.cxx
@@ -70,7 +70,7 @@ int main(int argc, char * argv[])
   //  Software Guide : BeginLatex
   //
   //  We declare the reader with the image template using the pixel type
-  // double. It is worth noticing that this instanciation does not imply
+  // double. It is worth noticing that this instantiation does not imply
   // anything about the type of the input image. The original image can be
   // anything, the reader will just convert the result to double.
   //
diff --git a/Modules/Adapters/BoostAdapters/include/otbStringUtils.h b/Modules/Adapters/BoostAdapters/include/otbStringUtils.h
index 57e0d32..af24621 100644
--- a/Modules/Adapters/BoostAdapters/include/otbStringUtils.h
+++ b/Modules/Adapters/BoostAdapters/include/otbStringUtils.h
@@ -27,6 +27,7 @@
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
 #include <boost/lexical_cast.hpp>
 #include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/predicate.hpp>
@@ -79,13 +80,13 @@ ConvertStringToVector(std::string const &str, T& ret, std::string const& errmsg,
 {
   typedef std::vector<boost::iterator_range<std::string::const_iterator> > ListType;
 
-  ListType splitted;
+  ListType split;
 
-  boost::split(splitted, str, boost::is_any_of(delims));
+  boost::split(split, str, boost::is_any_of(delims));
 
-  for(size_t i = 0; i < splitted.size(); i++)
+  for(size_t i = 0; i < split.size(); i++)
     {
-    typename T::value_type value = LexicalCast<typename T::value_type> (splitted[i], errmsg);
+    typename T::value_type value = LexicalCast<typename T::value_type> (split[i], errmsg);
     ret.push_back(value);
     }
 }
@@ -117,16 +118,16 @@ void SplitStringToSingleKeyValue(const std::string& str,
   typedef boost::iterator_range<std::string::const_iterator> BoostRangeIteratorType;
   typedef std::list< BoostRangeIteratorType > ListType;
 
-  ListType splitted;
+  ListType split;
 
-  boost::split( splitted, str, boost::is_any_of(delims), boost::token_compress_on );
+  boost::split( split, str, boost::is_any_of(delims), boost::token_compress_on );
 
-  typename ListType::iterator it = splitted.begin();
+  typename ListType::iterator it = split.begin();
   BoostRangeIteratorType kIt = boost::trim_copy((*it));
   key.assign( kIt.begin(), kIt.end());
   ++it;
 
-  if( it != splitted.end())
+  if( it != split.end())
     {
     value =  LexicalCast<T>(boost::trim_copy(*it), errmsg);
     ++it;
diff --git a/Modules/Adapters/BoostAdapters/include/otb_boost_math_normal_header.h b/Modules/Adapters/BoostAdapters/include/otb_boost_math_normal_header.h
index 4435f0c..29e7cd5 100644
--- a/Modules/Adapters/BoostAdapters/include/otb_boost_math_normal_header.h
+++ b/Modules/Adapters/BoostAdapters/include/otb_boost_math_normal_header.h
@@ -22,6 +22,7 @@
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wunused-parameter"
 #pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
 #include <boost/math/distributions/normal.hpp>
 #pragma GCC diagnostic pop
 #else
diff --git a/Modules/Adapters/CurlAdapters/include/otbCurlHelper.h b/Modules/Adapters/CurlAdapters/include/otbCurlHelper.h
index e3b5ad2..f88760f 100644
--- a/Modules/Adapters/CurlAdapters/include/otbCurlHelper.h
+++ b/Modules/Adapters/CurlAdapters/include/otbCurlHelper.h
@@ -33,7 +33,7 @@ namespace otb
  *
  * \ingroup OTBCurlAdapters
  */
-class ITK_EXPORT CurlHelper : public CurlHelperInterface
+class OTBCurlAdapters_EXPORT CurlHelper : public CurlHelperInterface
 {
 public:
   /** Standard class typedefs. */
@@ -46,11 +46,11 @@ public:
   itkNewMacro(Self);
 
   bool TestUrlAvailability(const std::string& url) const ITK_OVERRIDE;
-  
+
   bool IsCurlReturnHttpError(const std::string& url) const;
-  
+
   int RetrieveFile(const std::ostringstream& urlStream, std::string filename) const ITK_OVERRIDE;
-  
+
   int RetrieveFile(const std::string& urlString, std::string filename) const ITK_OVERRIDE;
 
   int RetrieveUrlInMemory(const std::string& urlString, std::string& output) const ITK_OVERRIDE;
@@ -60,7 +60,7 @@ public:
                         int maxConnect) const ITK_OVERRIDE;
 
   itkGetMacro(Timeout,long int);
-  
+
   itkSetMacro(Timeout,long int);
 
 protected:
diff --git a/Modules/Adapters/CurlAdapters/include/otbCurlHelperInterface.h b/Modules/Adapters/CurlAdapters/include/otbCurlHelperInterface.h
index 127eb53..98c620a 100644
--- a/Modules/Adapters/CurlAdapters/include/otbCurlHelperInterface.h
+++ b/Modules/Adapters/CurlAdapters/include/otbCurlHelperInterface.h
@@ -21,6 +21,7 @@
 #include <iosfwd>
 #include "itkObject.h"
 #include "itkObjectFactory.h"
+#include "OTBCurlAdaptersExport.h"
 
 namespace otb
 {
@@ -34,7 +35,7 @@ namespace otb
  *
  * \ingroup OTBCurlAdapters
  */
-class ITK_EXPORT CurlHelperInterface : public itk::Object
+class OTBCurlAdapters_EXPORT CurlHelperInterface : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Adapters/CurlAdapters/otb-module.cmake b/Modules/Adapters/CurlAdapters/otb-module.cmake
index fe31efd..53acf74 100644
--- a/Modules/Adapters/CurlAdapters/otb-module.cmake
+++ b/Modules/Adapters/CurlAdapters/otb-module.cmake
@@ -1,6 +1,7 @@
 set(DOCUMENTATION "Adapters for the Curl library.")
 
 otb_module(OTBCurlAdapters
+ENABLE_SHARED
   DEPENDS
     OTBCommon
     OTBITK
diff --git a/Modules/Adapters/CurlAdapters/src/otbCurlHelper.cxx b/Modules/Adapters/CurlAdapters/src/otbCurlHelper.cxx
index f72a109..08bc236 100644
--- a/Modules/Adapters/CurlAdapters/src/otbCurlHelper.cxx
+++ b/Modules/Adapters/CurlAdapters/src/otbCurlHelper.cxx
@@ -316,7 +316,6 @@ int CurlHelper::RetrieveFile(const std::ostringstream& urlStream, std::string fi
 int CurlHelper::RetrieveFile(const std::string& urlString, std::string filename) const
 {
 #ifdef OTB_USE_CURL
-  otbMsgDevMacro(<< "Retrieving: " << urlString);
 
   CURLcode res = CURLE_OK;
 
@@ -326,13 +325,19 @@ int CurlHelper::RetrieveFile(const std::string& urlString, std::string filename)
   output_file->OpenFile(filename.c_str());
 
   char url[256];
-  strcpy(url, urlString.c_str());
+  int len = static_cast<int>(urlString.size());
+  strncpy( url, urlString.c_str(), len + 1 );
+
+  otbMsgDevMacro(<< "Retrieving ( CurlHelper::RetrieveFile ): " << url );
 
   CurlHandleError::ProcessCURLcode(curl_easy_setopt(curlResource->GetCurlResource(), CURLOPT_URL, url));
 
   // Set timeout
   CurlHandleError::ProcessCURLcode(curl_easy_setopt(curlResource->GetCurlResource(), CURLOPT_TIMEOUT, m_Timeout));
 
+  CurlHandleError::ProcessCURLcode(curl_easy_setopt(curlResource->GetCurlResource(), CURLOPT_FRESH_CONNECT, 1));
+  CurlHandleError::ProcessCURLcode(curl_easy_setopt(curlResource->GetCurlResource(), CURLOPT_NOSIGNAL, 1));
+
   // Use our writing static function to avoid file descriptor
   // pointer crash on windows
   CurlHandleError::ProcessCURLcode(curl_easy_setopt(curlResource->GetCurlResource(), CURLOPT_WRITEFUNCTION,
@@ -403,7 +408,7 @@ int CurlHelper::RetrieveFileMulti(const std::vector<std::string>& listURLs,
     // Add easy handle to multi handle
     CurlHandleError::ProcessCURLcode(curl_multi_add_handle(multiHandle->GetCurlMultiResource(), lEasyHandle->GetCurlResource()));
 
-    // Add hanle to vector
+    // Add handle to vector
     listCurlHandles.push_back(lEasyHandle);
     ++url;
     ++file;
diff --git a/Modules/Adapters/GdalAdapters/include/otbGeometriesSet.h b/Modules/Adapters/GdalAdapters/include/otbGeometriesSet.h
index 9a43817..d504029 100644
--- a/Modules/Adapters/GdalAdapters/include/otbGeometriesSet.h
+++ b/Modules/Adapters/GdalAdapters/include/otbGeometriesSet.h
@@ -32,7 +32,7 @@ namespace otb
  *
  * \ingroup OTBGdalAdapters
  */
-class ITK_EXPORT GeometriesSet : public itk::DataObject
+class OTBGdalAdapters_EXPORT GeometriesSet : public itk::DataObject
   {
 public:
   /**\name Standard ITK typedefs */
diff --git a/Modules/Adapters/GdalAdapters/include/otbGeometriesSource.h b/Modules/Adapters/GdalAdapters/include/otbGeometriesSource.h
index 8d782b1..a28ead3 100644
--- a/Modules/Adapters/GdalAdapters/include/otbGeometriesSource.h
+++ b/Modules/Adapters/GdalAdapters/include/otbGeometriesSource.h
@@ -22,6 +22,8 @@
 #include "itkProcessObject.h"
 #include "itkMacro.h"
 
+#include "OTBGdalAdaptersExport.h"
+
 // Forward declarations
 namespace otb {
 namespace ogr {
@@ -62,7 +64,7 @@ namespace otb
  *
  * \ingroup OTBGdalAdapters
  */
-class ITK_EXPORT GeometriesSource : public itk::ProcessObject, boost::noncopyable
+class OTBGdalAdapters_EXPORT GeometriesSource : public itk::ProcessObject, boost::noncopyable
   {
 public:
   /**\name Standard ITK typedefs */
diff --git a/Modules/Adapters/GdalAdapters/include/otbGeometriesToGeometriesFilter.h b/Modules/Adapters/GdalAdapters/include/otbGeometriesToGeometriesFilter.h
index 90b37c8..98c7796 100644
--- a/Modules/Adapters/GdalAdapters/include/otbGeometriesToGeometriesFilter.h
+++ b/Modules/Adapters/GdalAdapters/include/otbGeometriesToGeometriesFilter.h
@@ -32,6 +32,8 @@
 #include <boost/type_traits/is_same.hpp>
 #include "otbOGRLayerWrapper.h"
 
+#include "otbMacro.h"
+
 // forward declarations
 namespace otb { namespace internal {
 struct ProcessVisitor;
@@ -46,7 +48,7 @@ namespace otb
  *
  * \ingroup OTBGdalAdapters
  */
-class ITK_EXPORT GeometriesToGeometriesFilter : public GeometriesSource
+class OTBGdalAdapters_EXPORT GeometriesToGeometriesFilter : public GeometriesSource
   {
 public:
   /**\name Standard ITK typedefs */
@@ -128,7 +130,7 @@ private:
    * \param[in] source  source \c Layer for reference (in case it has relevant
    * information).
    * \return a new \c OGRSpatialReference that the client code shall release
-   * with the appropiate OGR function.
+   * with the appropriate OGR function.
    * \return 0 by default.
    * \todo Return a <tt>unique_ptr<OGRSpatialReference></tt>.
    */
@@ -163,8 +165,17 @@ private:
    *
    * The default implementation does nothing.
    */
-  virtual void                     DoFinalizeInitialisation() {}
+  virtual void                     DoFinalizeInitialization() {}
   //@}
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  void DoFinalizeInitialisation()
+  {
+    otbWarningMacro(
+      << "DoFinalizeInitialisation has been deprecated.  Please use DoFinalizeInitialization() instead");
+    this->DoFinalizeInitialization();
+  }
+  
   friend struct otb::internal::ProcessVisitor;
   };
 
@@ -172,7 +183,7 @@ private:
  * Helper class to operate an exact copy of the fields from a source layer.
  * \since OTB v 3.14.0
  */
-struct FieldCopyTransformation
+struct OTBGdalAdapters_EXPORT FieldCopyTransformation
   {
   OGRFeatureDefn & getDefinition(ogr::Layer & outLayer) const
     {
@@ -205,7 +216,7 @@ struct FieldCopyTransformation
   void DefineFields(ogr::Layer const& source, ogr::Layer & dest) const;
 private:
   /** Associative table to know how fields are mapped from one layer to another.
-   * This table is necesary as:
+   * This table is necessary as:
    * - some data source drivers add their own fields (as a consequence, the
    * number of fields differ between two layers).
    * - other data source drivers truncate the name of the fields (as a
@@ -255,7 +266,7 @@ struct TransformationFunctorDispatcher
  * the transformation work.
  *
  * If you need to change the number of elements in a layer, use a \c
- * TransformationFunctor that works on layers. The dispatching mecanism will
+ * TransformationFunctor that works on layers. The dispatching mechanism will
  * automatically end up here.
  * \tparam TransformationFunctor actual transformation functor
  * \since OTB v 3.14.0
@@ -312,7 +323,7 @@ private:
 
 /**\ingroup GeometriesFilters
  * \class DefaultGeometriesToGeometriesFilter
- * Generic helper class to filter geometries sets given a tranformation functor.
+ * Generic helper class to filter geometries sets given a transformation functor.
  * This generic class provides the default behaviour for most filters that we
  * may need to implement.
  *
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRDataSourceWrapper.h b/Modules/Adapters/GdalAdapters/include/otbOGRDataSourceWrapper.h
index c1c9cee..acd14db 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRDataSourceWrapper.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRDataSourceWrapper.h
@@ -54,7 +54,7 @@ namespace otb { namespace ogr {
  * \class DataSource
  * \brief Collection of geometric objects.
  *
- * This class is meant to supercede \c otb::VectorData class.  It provides
+ * This class is meant to supersede \c otb::VectorData class.  It provides
  * an encapsulation of OGR classes. In that particular case, it's an
  * encapsulation of \c GDALDataset.
  *
@@ -72,7 +72,9 @@ namespace otb { namespace ogr {
  *
  * \ingroup OTBGdalAdapters
  */
-class DataSource : public itk::DataObject , public boost::noncopyable
+ #include "OTBGdalAdaptersExport.h"
+ 
+class OTBGdalAdapters_EXPORT DataSource : public itk::DataObject , public boost::noncopyable
   {
 public:
   /**\name Standard ITK typedefs */
@@ -432,13 +434,13 @@ public:
   Layer const GetLayerChecked(std::string const& name) const;
 
   /**
-   * Excecutes the statement..
+   * Executes the statement..
    * \param[in] statement  textual description of the SQL statement.
    * \param[in] poSpatialFilter  \c Geometry representing a spatial filter -- may be null.
    * \param[in] pszDialect  allows control of the statement dialect. If set to
    *                     NULL, the OGR SQL engine will be used, except for
    *                     RDBMS drivers that will use their dedicated SQL
-   *                     engine, unless OGRSQL is explicitely passed as the
+   *                     engine, unless OGRSQL is explicitly passed as the
    *                     dialect.
    * \return a new \c Layer that contains the matching \c Features. In case of
    * error, or no matching result sets, a \em null Layer will be returned.
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRDriversInit.h b/Modules/Adapters/GdalAdapters/include/otbOGRDriversInit.h
index 58ac052..750ee0a 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRDriversInit.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRDriversInit.h
@@ -20,6 +20,8 @@
 
 #include <boost/noncopyable.hpp>
 
+#include "OTBGdalAdaptersExport.h"
+
 namespace otb { namespace ogr {
   /**\ingroup Geometry
    * Singleton-like class to provide lazy-registering of all \c OGRDriver's.
@@ -37,7 +39,7 @@ namespace otb { namespace ogr {
    * VC++)
    * - Non-copyable
    */
-  class Drivers : private boost::noncopyable
+  class OTBGdalAdapters_EXPORT Drivers : private boost::noncopyable
   {
   /** \name Singleton related functions */
   //@{
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRFeatureWrapper.h b/Modules/Adapters/GdalAdapters/include/otbOGRFeatureWrapper.h
index a88ee29..0bda432 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRFeatureWrapper.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRFeatureWrapper.h
@@ -37,6 +37,8 @@ class OGRFeatureDefn;
 namespace otb {
 namespace ogr {
 class Feature;
+
+OTBGdalAdapters_EXPORT
 bool operator==(Feature const& lhs, Feature const& rhs);
 
 /**\ingroup gGeometry
@@ -61,7 +63,7 @@ bool operator==(Feature const& lhs, Feature const& rhs);
  *
  * \ingroup OTBGdalAdapters
  */
-class Feature
+class OTBGdalAdapters_EXPORT Feature
   {
 public:
   /**\name Construction, copy and destruction */
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.h b/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.h
index 8a6ef18..c5af3e9 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.h
@@ -22,9 +22,18 @@
 #include <boost/shared_ptr.hpp>
 class OGRFieldDefn;
 class OGRFeature;
+#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
 #include "itkIndent.h"
 
+#include "OTBGdalAdaptersExport.h"
+
 namespace otb { namespace ogr {
 
 /*===========================================================================*/
@@ -34,14 +43,14 @@ namespace otb { namespace ogr {
  * \class FieldDefn
  * \brief Encapsulation of \c OGRFieldDefn: field definition.
  * \invariant <tt>m_Definition != 0</tt>
- * \invariant \c m_Definition lifetime is of the responsability of the owning \c
+ * \invariant \c m_Definition lifetime is of the responsibility of the owning \c
  * \c OGRFeatureDefn.
  * \sa OGRFieldDefn
  * \since OTB v 3.14.0
  *
  * \ingroup OTBGdalAdapters
  */
-class FieldDefn
+class OTBGdalAdapters_EXPORT FieldDefn
   {
 public:
   FieldDefn(OGRFieldDefn& definition) : m_Definition(&definition){ }
@@ -65,6 +74,7 @@ bool operator==(FieldDefn const& lhs, FieldDefn const& rhs)
     &&   lhs.GetType() == rhs.GetType();
   }
 
+OTBGdalAdapters_EXPORT
 std::ostream & operator<<(std::ostream & os, FieldDefn const& defn);
 
 /*===========================================================================*/
@@ -91,7 +101,7 @@ class Feature;
  *
  * \ingroup OTBGdalAdapters
  */
-class Field
+class OTBGdalAdapters_EXPORT Field
 {
 public:
   /**
@@ -166,7 +176,7 @@ public:
 
   /** \copydoc Field::ogr() const */
   OGRField & ogr();
-    
+
 private:
   /**\name Unchecked definitions
    * All the definitions that follow do the real work. However, they are not the
@@ -201,11 +211,11 @@ private:
    * All the fields decoding is at the wrong place (\c OGRFeature instead of
    * \c OGRField) => need for an index.
    */
-   
+
   int        m_index;
 };
 
-} 
+}
 } // end namespace otb::ogr
 
 #ifndef OTB_MANUAL_INSTANTIATION
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.txx b/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.txx
index d015f1f..a1c3e67 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.txx
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRFieldWrapper.txx
@@ -52,6 +52,7 @@
 #include "otbOGRHelpers.h"
 
 
+
 /*===========================================================================*/
 /*================[ Associations C++ types -> OGR functions ]================*/
 /*===========================================================================*/
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRGeometryWrapper.h b/Modules/Adapters/GdalAdapters/include/otbOGRGeometryWrapper.h
index 261809f..1dbc5df 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRGeometryWrapper.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRGeometryWrapper.h
@@ -27,6 +27,8 @@
 #include <boost/interprocess/smart_ptr/unique_ptr.hpp>
 #endif
 
+#include "OTBGdalAdaptersExport.h"
+
 class OGRGeometry;
 
 namespace otb { namespace ogr {
@@ -41,7 +43,7 @@ namespace internal {
  * consequence, it is not in an anonymous namespace , but in \c
  * otb::ogr::internal.
  */
-struct GeometryDeleter
+struct OTBGdalAdapters_EXPORT GeometryDeleter
   {
   void operator()(OGRGeometry* p);
   };
@@ -99,34 +101,34 @@ struct GeometryDeleter
  */
 typedef boost::interprocess::unique_ptr<OGRGeometry, internal::GeometryDeleter> UniqueGeometryPtr;
 ///Do these features intersect?
-bool Intersects (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Intersects (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Returns wheither if two geometries are equivalent.
-bool Equals (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Equals (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Tests for disjointness.
-bool Disjoint (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Disjoint (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Tests for touching.
-bool Touches (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Touches (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Tests for crossing.
-bool Crosses (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Crosses (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Tests for containment.
-bool Within (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Within (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Tests for containment.
-bool Contains (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Contains (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Tests for overlap.
-bool Overlaps (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT bool Overlaps (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Computes distance between two geometries.
-double Distance (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT double Distance (OGRGeometry const& lhs, OGRGeometry const& rhs);
 
 /// Computes intersection.
-UniqueGeometryPtr Intersection (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr Intersection (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Computes union.
-UniqueGeometryPtr Union (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr Union (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Computes union using cascading.
-UniqueGeometryPtr UnionCascaded (OGRGeometry const& this_);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr UnionCascaded (OGRGeometry const& this_);
 /// Computes difference.
-UniqueGeometryPtr Difference (OGRGeometry const& lhs, OGRGeometry const& rhs);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr Difference (OGRGeometry const& lhs, OGRGeometry const& rhs);
 /// Computes symmetric difference.
-UniqueGeometryPtr SymDifference (OGRGeometry const& lhs, OGRGeometry const& rhs); // -1.8
+OTBGdalAdapters_EXPORT UniqueGeometryPtr SymDifference (OGRGeometry const& lhs, OGRGeometry const& rhs); // -1.8
 
 /** Simplifies Geometry.
  * This function tries to uses the best simplication algorithm available in the
@@ -137,19 +139,19 @@ UniqueGeometryPtr SymDifference (OGRGeometry const& lhs, OGRGeometry const& rhs)
  * \sa \c OGRGeometry::Simplify()
  * \sa \c OGRGeometry::SimplifyPreserveTopology()
  */
-UniqueGeometryPtr Simplify(OGRGeometry const& g, double tolerance);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr Simplify(OGRGeometry const& g, double tolerance);
 
 /** Simplifies Geometry with no guarantee of preserving the geometry.
  * \pre Requires GDAL 1.8.0
  * \sa \c OGRGeometry::Simplify()
  */
-UniqueGeometryPtr SimplifyDontPreserveTopology(OGRGeometry const& g, double tolerance);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr SimplifyDontPreserveTopology(OGRGeometry const& g, double tolerance);
 
 /** Simplifies Geometry while preserving topology.
  * \pre Requires GDAL 1.9.0
  * \sa \c OGRGeometry::SimplifyPreserveTopology()
  */
-UniqueGeometryPtr SimplifyPreserveTopology(OGRGeometry const& g, double tolerance);
+OTBGdalAdapters_EXPORT UniqueGeometryPtr SimplifyPreserveTopology(OGRGeometry const& g, double tolerance);
 
 /** @} */
 
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRHelpers.h b/Modules/Adapters/GdalAdapters/include/otbOGRHelpers.h
index 157e908..b10bff1 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRHelpers.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRHelpers.h
@@ -31,6 +31,8 @@
 #include "cpl_string.h" // CSLCount
 #endif
 
+#include "OTBGdalAdaptersExport.h"
+
 namespace otb
 {
 namespace ogr
@@ -55,7 +57,7 @@ namespace ogr
  *
  * \ingroup OTBGdalAdapters
  */
-struct StringListConverter
+struct OTBGdalAdapters_EXPORT StringListConverter
 {
 
   template <class ContainerType>
@@ -81,7 +83,7 @@ struct StringListConverter
     assert(CSLCount(const_cast <char**>(&m_raw[0])) == static_cast<int>(boost::size(strings)));
     }
   /**
-   * Acces to the OGR compliant list of strings.
+   * Access to the OGR compliant list of strings.
    */
   char ** to_ogr() const
     {
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRLayerWrapper.h b/Modules/Adapters/GdalAdapters/include/otbOGRLayerWrapper.h
index 851ce7e..4f328fe 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRLayerWrapper.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRLayerWrapper.h
@@ -49,6 +49,7 @@ class Layer;
  * Compares layers identities.
  * \return whether the two layers are in fact the same.
  */
+ OTBGdalAdapters_EXPORT
 bool operator==(Layer const& lhs, Layer const& rhs);
 
 /**\ingroup gGeometry
@@ -72,7 +73,7 @@ bool operator==(Layer const& lhs, Layer const& rhs);
  *
  * \ingroup OTBGdalAdapters
  */
-class Layer
+class OTBGdalAdapters_EXPORT Layer
   {
 public:
   /**\name ITK standard definitions */
@@ -95,7 +96,7 @@ public:
    * On destruction of the proxy class, the internal \c OGRLayer is left alone.
    *
    * \warning If the datasource hosting the layer (built with this constructor)
-   * is deleted, the layer won't be usable anymore. Unfortunatelly, there is no
+   * is deleted, the layer won't be usable anymore. Unfortunately, there is no
    * mean to report this to this layer proxy.
    */
   Layer(OGRLayer* layer, bool modifiable);
@@ -179,7 +180,7 @@ public:
    * id will be updated (in case it was previously set)
    *
    * \throw itk::ExceptionObject if the feature can't be set.
-   * \pre The Layer need to support <em>OLCRandomWrite</em> capability.
+   * \pre The Layer needs to support <em>OLCRandomWrite</em> capability.
    * \sa \c OGRLayer::SetFeature()
    * \warning Calls to this function may invalidate any feature iterator
    * previously obtained depending on the actual \c OGRDriver.
@@ -402,7 +403,7 @@ public:
    * \warning The definition obtained shall not be modified. Use the \c *Field
    * functions instead.
    * \internal
-   * The return type shall have been const, but unfortunatelly \c OGRFeatureDefn
+   * The return type shall have been const, but unfortunately \c OGRFeatureDefn
    * is not const-correct.
    * \sa \c OGRLayer::GetLayerDefn()
    */
@@ -415,7 +416,7 @@ public:
    * different form depending on the limitations of the format driver.
    *
    * \pre This function shall not be called while there are \c Feature in
-   * existance that were obtained or created with the previous layer definition.
+   * existence that were obtained or created with the previous layer definition.
    * \throw itk::ExceptionObject if the new field cannot be created
    * \sa \c OGRLayer::CreateField()
    * \warning Calls to this function may invalidate any feature iterator
@@ -429,7 +430,7 @@ public:
    * \param[in] fieldIndex  index of the field to remove.
    *
    * \pre This function shall not be called while there are \c Feature in
-   * existance that were obtained or created with the previous layer definition.
+   * existence that were obtained or created with the previous layer definition.
    * \throw itk::ExceptionObject if the new field cannot be deleted
    * \sa \c OGRLayer::DeleteField()
    * \pre To be available, this function requires OTB to be compiled against OGR
@@ -447,7 +448,7 @@ public:
    * taken into account.
    *
    * \pre This function shall not be called while there are \c Feature in
-   * existance that were obtained or created with the previous layer definition.
+   * existence that were obtained or created with the previous layer definition.
    * \throw itk::ExceptionObject if the new field cannot be modified
    * \sa \c OGRLayer::AlterFieldDefn()
    * \pre To be available, this function requires OTB to be compiled against OGR
@@ -462,7 +463,7 @@ public:
    * \param[in] newPos  new field index position
    *
    * \pre This function shall not be called while there are \c Feature in
-   * existance that were obtained or created with the previous layer definition.
+   * existence that were obtained or created with the previous layer definition.
    * \throw itk::ExceptionObject if the new field cannot be modified
    * \sa \c OGRLayer::ReorderField()
    * \pre To be available, this function requires OTB to be compiled against OGR
@@ -475,7 +476,7 @@ public:
    * \param[in] map array that tells the new position of each field.
    *
    * \pre This function shall not be called while there are \c Feature in
-   * existance that were obtained or created with the previous layer definition.
+   * existence that were obtained or created with the previous layer definition.
    * \throw itk::ExceptionObject if the new field cannot be modified
    * \sa \c OGRLayer::ReorderFields()
    * \pre To be available, this function requires OTB to be compiled against OGR
@@ -531,7 +532,7 @@ private:
 
 #if 0
   /** Related DataSource.
-   * Needed to acces OTB meta information.
+   * Needed to access OTB meta information.
    */
   DataSourcePtr m_DataSource;
 #endif
diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h b/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
index 7766d51..140520a 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
@@ -31,6 +31,8 @@ class OGRDataSource;
 class OGRSFDriver;
 #endif
 
+#include "OTBGdalAdaptersExport.h"
+
 namespace otb
 {
 namespace ogr
@@ -72,7 +74,8 @@ namespace version_proxy
    * \param filename Filename of the file to open
    * \param readOnly: If true, dataset is open in read-only mode.
    * \return NULL if file could not be open.
-   */ 
+   */
+  OTBGdalAdapters_EXPORT   
   GDALDatasetType * Open(const char * filename, bool readOnly = true);
 
   /**
@@ -84,6 +87,7 @@ namespace version_proxy
    * \param dataset Pointer to the dataset to close. Will not be
    * checked for null pointer.
    */
+  OTBGdalAdapters_EXPORT
   void Close(GDALDatasetType * dataset);
 
   /**
@@ -100,6 +104,7 @@ namespace version_proxy
    * 
    * \return NULL if dataset could not be created.
    */
+  OTBGdalAdapters_EXPORT
   GDALDatasetType * Create(GDALDriverType * driver, const char * name);
 
 
@@ -110,7 +115,8 @@ namespace version_proxy
    * and GDALDriver::Delete for gdal 2.x implementation.
    *
    * \param name Name of the dataset to destroy.
-   */ 
+   */
+  OTBGdalAdapters_EXPORT   
   bool Delete(const char * name);
 
   /**
@@ -125,9 +131,10 @@ namespace version_proxy
    * 
    * \return NULL if no driver could be retrieved.
    */
+  OTBGdalAdapters_EXPORT 
   GDALDriverType *  GetDriverByName(const char * name);
 
-
+  OTBGdalAdapters_EXPORT
   std::string GetDriverNameFromDataSource(const GDALDatasetType * ds);
 
   /**
@@ -141,18 +148,21 @@ namespace version_proxy
    *
    * \return True if sync went on without any error.
    */
-  bool SyncToDisk(GDALDatasetType * dataset);
+   OTBGdalAdapters_EXPORT
+   bool SyncToDisk(GDALDatasetType * dataset);
 
   /**
    * \return The name of the dataset class behind the implementation
    * (OGRDataSource for gdal 1.x and GdalDataset for gdal 2.x)
    */
+  OTBGdalAdapters_EXPORT
   std::string GetDatasetClassName();
 
   /**
    * \return The name of the driver class behind the implementation
    * (OGRSFDriver for gdal 1.x and GDALDriver for gdal 2.x)
    */
+  OTBGdalAdapters_EXPORT 
   std::string GetDriverClassName();
 
   /**
@@ -167,6 +177,8 @@ namespace version_proxy
    * 
    * \return A vector of string containing the list of files.
    */
+   
+  OTBGdalAdapters_EXPORT 
   std::vector<std::string> GetFileListAsStringVector(GDALDatasetType * dataset);
 
   /** 
@@ -178,6 +190,7 @@ namespace version_proxy
    *
    * \return A vector of string containing the list of available drivers.
    */  
+  OTBGdalAdapters_EXPORT
   std::vector<std::string> GetAvailableDriversAsStringVector();
 
 }
diff --git a/Modules/Adapters/GdalAdapters/otb-module.cmake b/Modules/Adapters/GdalAdapters/otb-module.cmake
index 199492c..72db31d 100644
--- a/Modules/Adapters/GdalAdapters/otb-module.cmake
+++ b/Modules/Adapters/GdalAdapters/otb-module.cmake
@@ -1,6 +1,7 @@
 set(DOCUMENTATION "Adapters for the Gdal Library ( for reading and writing  ).")
 
 otb_module(OTBGdalAdapters
+ENABLE_SHARED
   DEPENDS
     OTBBoostAdapters
     OTBBoost
diff --git a/Modules/Adapters/GdalAdapters/src/otbGeometriesToGeometriesFilter.cxx b/Modules/Adapters/GdalAdapters/src/otbGeometriesToGeometriesFilter.cxx
index 214aaed..216624f 100644
--- a/Modules/Adapters/GdalAdapters/src/otbGeometriesToGeometriesFilter.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbGeometriesToGeometriesFilter.cxx
@@ -33,7 +33,7 @@
  * Internal class used to dispatch filters on either \c ogr::DataSource, or \c
  * ogr::Layer.
  * As \c GeometriesSet is a variant that can contain either a \c ogr::DataSource
- * or a \c ogr::Layer, we need a way to dispath filtering operations on the
+ * or a \c ogr::Layer, we need a way to dispatch filtering operations on the
  * right type. This is done thanks to \c ProcessVisitor.
  * \since OTB v 3.14.0
  */
@@ -126,7 +126,7 @@ struct otb::internal::ProcessVisitor : boost::static_visitor<>
     }
 
   /**
-   * Fall-back visiting function for invalid mixed tranformations (layer ->
+   * Fall-back visiting function for invalid mixed transformations (layer ->
    * datasource).
    * The only transformations accepted are
    * - layer -> layer,
@@ -189,7 +189,7 @@ otb::GeometriesToGeometriesFilter::GetInput(void )
 void otb::GeometriesToGeometriesFilter::GenerateData(void )
 {
   this->DoAllocateOutputs();
-  this->DoFinalizeInitialisation();
+  this->DoFinalizeInitialization();
 
   InputGeometriesType::ConstPointer  input  = this->GetInput();
   // assert(input && "Cann't filter to a nil geometries set");
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRDataSourceWrapper.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRDataSourceWrapper.cxx
index a3d312e..19a2ee2 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRDataSourceWrapper.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRDataSourceWrapper.cxx
@@ -78,6 +78,7 @@ const ExtensionDriverAssociation k_ExtensionDriverMap[] =
     {".SHP", "ESRI Shapefile"},
     {".TAB", "MapInfo File"},
     {".GML", "GML"},
+    {".GMT", "OGR_GMT"},
     {".GPX", "GPX"},
     {".SQLITE", "SQLite"},
     {".KML", "KML"},
@@ -198,7 +199,7 @@ otb::ogr::DataSource::New(std::string const& datasourceName, Modes::type mode)
   bool ds_exists = (ds!=ITK_NULLPTR);
 
   ogr::version_proxy::Close(ds);
-  
+
 
   if (ds_exists && mode == Modes::Overwrite)
     {
@@ -279,7 +280,7 @@ otb::ogr::Layer otb::ogr::DataSource::CreateLayer(
     OGRLayer * ol = m_DataSource->CreateLayer(
       name.c_str(), poSpatialRef, eGType, otb::ogr::StringListConverter(papszOptions).to_ogr());
     if (!ol)
-      { 
+      {
       itkGenericExceptionMacro(<< "Failed to create the layer <"<<name
                                << "> in the GDALDataset file <" << GetDatasetDescription()
         <<">: " << CPLGetLastErrorMsg());
@@ -369,7 +370,7 @@ otb::ogr::Layer otb::ogr::DataSource::CopyLayer(
   OGRLayer * l0 = &srcLayer.ogr();
   OGRLayer * ol = m_DataSource->CopyLayer(l0, newName.c_str(), papszOptions);
   if (!ol)
-    {    
+    {
     itkGenericExceptionMacro(<< "Failed to copy the layer <"
       << srcLayer.GetName() << "> into the new layer <" <<newName
                              << "> in the GDALDataset file <" <<  GetDatasetDescription()
@@ -402,7 +403,7 @@ void otb::ogr::DataSource::DeleteLayer(size_t i)
 
   const int nb_layers = GetLayersCount();
   if (int(i) >= nb_layers)
-    {      
+    {
     itkExceptionMacro(<< "Cannot delete " << i << "th layer in the GDALDataset <"
                       <<  GetDatasetDescription() << "> as it contains only " << nb_layers << "layers.");
     }
@@ -465,7 +466,7 @@ size_t otb::ogr::DataSource::GetLayerID(std::string const& name) const
 {
   int const id = GetLayerIDUnchecked(name);
   if (id < 0)
-    {    
+    {
     itkExceptionMacro( << "Cannot fetch any layer named <" << name
                        << "> in the GDALDataset <" <<  GetDatasetDescription() << ">: "
       << CPLGetLastErrorMsg());
@@ -478,7 +479,7 @@ otb::ogr::Layer otb::ogr::DataSource::GetLayerChecked(size_t i)
   assert(m_DataSource && "Datasource not initialized");
   const int nb_layers = GetLayersCount();
   if (int(i) >= nb_layers)
-    {    
+    {
     itkExceptionMacro(<< "Cannot fetch " << i << "th layer in the GDALDataset <"
                       << GetDatasetDescription() << "> as it contains only " << nb_layers << "layers.");
     }
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRFieldWrapper.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRFieldWrapper.cxx
index d7ee47f..a5f33e1 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRFieldWrapper.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRFieldWrapper.cxx
@@ -24,6 +24,11 @@
 #pragma GCC diagnostic ignored "-Wshadow"
 #include "ogr_feature.h"
 #pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning ( push )
+#pragma warning ( disable: 4251 )
+#include "ogr_feature.h"
+#pragma warning ( pop )
 #else
 #include "ogr_feature.h"
 #endif
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRLayerWrapper.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRLayerWrapper.cxx
index 7b48b09..58c3b50 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRLayerWrapper.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRLayerWrapper.cxx
@@ -29,10 +29,16 @@
 #pragma GCC diagnostic ignored "-Wshadow"
 #include "gdal_priv.h"// GDALDataset
 #pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning ( push )
+#pragma warning ( disable: 4251 )
+#include "gdal_priv.h" // GDALDataset
+#pragma warning ( pop )
 #else
 #include "gdal_priv.h" // GDALDataset
 #endif
 
+
 #include "otbOGRDataSourceWrapper.h"
 
 /*===========================================================================*/
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
index a7ed8e3..81d0ff8 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
@@ -87,7 +87,7 @@ std::string GetDriverClassName()
 namespace raii
 {
 // This class is used in the next function, so as to prevent any
-// ressource leak on char ** returned by dataset->GetFileList()
+// resource leak on char ** returned by dataset->GetFileList()
 class CharPPCapsule
 {
 public:
diff --git a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt
index 978e59b..96b5404 100644
--- a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt
+++ b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt
@@ -2,7 +2,10 @@ otb_module_test()
 
 if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
   add_executable(otbOGRTests otbOGRDataSourceWrapperNew.cxx)
-  target_link_libraries(otbOGRTests ${OTBGdalAdapters-Test_LIBRARIES})
+  target_link_libraries(
+    otbOGRTests
+    ${OTBGdalAdapters-Test_LIBRARIES}
+    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} )
   
   add_test(NAME coTuOGRDataSourceWrapperNew
            COMMAND otbOGRTests coTuOGRDataSourceWrapperNew
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbDEMConvertAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbDEMConvertAdapter.h
index 778e20a..77ae37d 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbDEMConvertAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbDEMConvertAdapter.h
@@ -22,10 +22,12 @@
 #include "itkObject.h"
 #include "itkObjectFactory.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 namespace otb
 {
 
-class DEMConvertAdapter: public itk::Object
+class OTBOSSIMAdapters_EXPORT DEMConvertAdapter: public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h b/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h
index 75a94d9..30e3c48 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h
@@ -26,6 +26,8 @@
 #include "itkObjectFactory.h"
 #include "itkPoint.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 class ossimElevManager;
 
 namespace otb
@@ -83,7 +85,7 @@ namespace otb
  * \ingroup OTBOSSIMAdapters
  */
 
-class ITK_EXPORT DEMHandler : public itk::Object
+class OTBOSSIMAdapters_EXPORT DEMHandler : public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -104,7 +106,7 @@ public:
   virtual void OpenDEMDirectory(const char* DEMDirectory);
   virtual void OpenDEMDirectory(const std::string& DEMDirectory);
 
-  /** return true if the directoty contain DEM */
+  /** return true if the directory contain DEM */
   virtual bool IsValidDEMDirectory(const char* DEMDirectory);
 
   /**
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbDateTimeAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbDateTimeAdapter.h
index f8c3548..4f5c7aa 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbDateTimeAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbDateTimeAdapter.h
@@ -20,6 +20,7 @@
 
 #include "itkObject.h"
 #include "itkObjectFactory.h"
+#include "OTBOSSIMAdaptersExport.h"
 
 class ossimLocalTm;
 //class ossimDate;
@@ -36,7 +37,7 @@ namespace otb
  *
  * \ingroup OTBOSSIMAdapters
  **/
-class DateTimeAdapter : public itk::Object
+class OTBOSSIMAdapters_EXPORT DateTimeAdapter : public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -50,35 +51,35 @@ public:
 
   /** Run-time type information (and related methods). */
   itkTypeMacro(DateTimeAdapter, itk::Object);
-  
+
   /** Year Accessor*/
   int GetYear();
-  
+
   /** Month Accessor*/
   int GetMonth();
-  
+
   /** Day Accessor*/
   int GetDay();
-  
+
   /** Hour Accessor*/
   int GetHour();
-  
+
   /** Minute Accessor*/
   int GetMinute();
-  
+
   /** Seconds Accessor*/
   double GetSeconds() const;
-  
+
   /** Set the date and time from an Iso8601 string
    *  Return true if the date is valid
    */
   bool SetFromIso8601(const std::string &date);
-  
+
   /** Return the delta with an other date, expressed in seconds */
   double GetDeltaInSeconds(const DateTimeAdapter *pastDate);
-  
+
   // TODO : add print self function
-  
+
 protected:
   DateTimeAdapter();
   ~DateTimeAdapter() ITK_OVERRIDE;
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbEllipsoidAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbEllipsoidAdapter.h
index 29def35..6dc6f82 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbEllipsoidAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbEllipsoidAdapter.h
@@ -21,6 +21,8 @@
 #include "itkObject.h"
 #include "itkObjectFactory.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 class ossimEllipsoid;
 
 namespace otb
@@ -37,7 +39,7 @@ namespace otb
  * \ingroup OTBOSSIMAdapters
  **/
 
-class EllipsoidAdapter: public itk::Object
+class OTBOSSIMAdapters_EXPORT EllipsoidAdapter: public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -52,11 +54,11 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(EllipsoidAdapter, itk::Object);
 
-  /** Convert a XYZ coordinate into a lon, lat, heigh on the ellipsoid */
+  /** Convert a XYZ coordinate into a lon, lat, height on the ellipsoid */
   void XYZToLonLatHeight(double x, double y, double z,
                          double& lon, double& lat, double& h) const;
 
-  /** Convert a lon, lat, heigh on the ellipsoid into a XYZ geocentric system*/
+  /** Convert a lon, lat, height on the ellipsoid into a XYZ geocentric system*/
   void LonLatHeightToXYZ(double lon, double lat, double h,
                          double& x, double& y, double& z) const;
 
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbFilterFunctionValues.h b/Modules/Adapters/OSSIMAdapters/include/otbFilterFunctionValues.h
index e46abcb..448fc9f 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbFilterFunctionValues.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbFilterFunctionValues.h
@@ -25,6 +25,8 @@
 #include "itkObjectFactory.h"
 #include "itkMacro.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 namespace otb
 {
 /** \class FilterFunctionValues
@@ -37,7 +39,7 @@ namespace otb
  *
  * \ingroup OTBOSSIMAdapters
  */
-class ITK_EXPORT FilterFunctionValues : public itk::DataObject
+class OTBOSSIMAdapters_EXPORT FilterFunctionValues : public itk::DataObject
 {
 public:
   /** Standard typedefs */
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbGeometricSarSensorModelAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbGeometricSarSensorModelAdapter.h
index 5ba8899..d277230 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbGeometricSarSensorModelAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbGeometricSarSensorModelAdapter.h
@@ -23,6 +23,8 @@
 #include "itkObject.h"
 #include "itkObjectFactory.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 namespace ossimplugins
 {
 class ossimGeometricSarSensorModel;
@@ -47,7 +49,7 @@ class ImageKeywordlist;
  * \ingroup OTBOSSIMAdapters
  **/
 
-class GeometricSarSensorModelAdapter: public itk::Object
+class OTBOSSIMAdapters_EXPORT GeometricSarSensorModelAdapter: public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbImageKeywordlist.h b/Modules/Adapters/OSSIMAdapters/include/otbImageKeywordlist.h
index 112c907..33b0cfc 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbImageKeywordlist.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbImageKeywordlist.h
@@ -26,6 +26,8 @@
 #include "itkObject.h"
 #include "itkObjectFactory.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 //forward declaration
 class ossimKeywordlist;
 
@@ -71,7 +73,7 @@ namespace internal
  *
  * \ingroup OTBOSSIMAdapters
  */
-class ITK_EXPORT ImageKeywordlist
+class OTBOSSIMAdapters_EXPORT ImageKeywordlist
 {
 public:
   /** Standard class typedefs. */
@@ -151,12 +153,20 @@ private:
 
 };
 
+OTBOSSIMAdapters_EXPORT
 std::ostream & operator <<(std::ostream& os, const ImageKeywordlist& kwl);
 
 // Free function to handle the keywordlist <-> files
+OTBOSSIMAdapters_EXPORT
 ImageKeywordlist ReadGeometryFromImage(const std::string& filename, bool checkRpcTag=true);
+
+OTBOSSIMAdapters_EXPORT
 ImageKeywordlist ReadGeometryFromGEOMFile(const std::string& filename);
+
+OTBOSSIMAdapters_EXPORT
 ImageKeywordlist ReadGeometryFromRPCTag(const std::string& filename);
+
+OTBOSSIMAdapters_EXPORT
 void WriteGeometry(const ImageKeywordlist& otb_kwl, const std::string& filename);
 
 inline
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbMapProjectionAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbMapProjectionAdapter.h
index 4cbcb69..c0bca8e 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbMapProjectionAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbMapProjectionAdapter.h
@@ -24,6 +24,10 @@
 #include "itkObject.h"
 #include "itkObjectFactory.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
+#include "otbMacro.h"
+
 class ossimProjection;
 
 namespace otb
@@ -33,7 +37,7 @@ namespace otb
  * \class MapProjectionAdapter
  * \brief Wrapper class to group all dependencies to ossim for map projection
  *
- * This class is NOT intented to be used outside of OTB. Use the
+ * This class is NOT intended to be used outside of OTB. Use the
  * GenericMapProjection. If you feel that you need to use it directly,
  * think again!
  *
@@ -44,7 +48,7 @@ namespace otb
  * \ingroup OTBOSSIMAdapters
  **/
 
-class MapProjectionAdapter: public itk::Object
+class OTBOSSIMAdapters_EXPORT MapProjectionAdapter: public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -71,7 +75,15 @@ public:
   void SetParameter(const std::string& key, const std::string& value);
   std::string GetParameter(const std::string& key) const;
 
-  bool InstanciateProjection();
+  bool InstantiateProjection();
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  bool InstanciateProjection()
+  {
+    otbWarningMacro(
+      << "InstanciateProjection has been deprecated.  Please use InstanciateProjection() instead");
+    return this->InstantiateProjection();
+  }
 
   void InverseTransform(double x, double y, double z,
                         double& lon, double& lat, double& h);
@@ -103,10 +115,10 @@ private:
   bool m_ReinstanciateProjection;
 };
 
-// Some usefull free functions related to ossim
+// Some useful free functions related to ossim
 namespace Utils
 {
-int GetZoneFromGeoPoint(double lon, double lat);
+int OTBOSSIMAdapters_EXPORT GetZoneFromGeoPoint(double lon, double lat);
 }
 
 
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbMetaDataKey.h b/Modules/Adapters/OSSIMAdapters/include/otbMetaDataKey.h
index 4eb938e..180dfd5 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbMetaDataKey.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbMetaDataKey.h
@@ -23,6 +23,7 @@
 
 #include "itkDataObject.h"
 #include "itkVariableLengthVector.h"
+#include "OTBOSSIMAdaptersExport.h"
 
 namespace otb
 {
@@ -31,44 +32,44 @@ namespace otb
  */
 namespace MetaDataKey
 {
-  extern char const* DriverShortNameKey;
-  extern char const* DriverLongNameKey;
+  extern OTBOSSIMAdapters_EXPORT char const* DriverShortNameKey;
+  extern OTBOSSIMAdapters_EXPORT char const* DriverLongNameKey;
 
-  extern char const* ProjectionRefKey;
+  extern OTBOSSIMAdapters_EXPORT char const* ProjectionRefKey;
 
-  extern char const* GCPProjectionKey;
-  extern char const* GCPParametersKey;
-  extern char const* GCPCountKey;
+  extern OTBOSSIMAdapters_EXPORT char const* GCPProjectionKey;
+  extern OTBOSSIMAdapters_EXPORT char const* GCPParametersKey;
+  extern OTBOSSIMAdapters_EXPORT char const* GCPCountKey;
 
-  extern char const* GeoTransformKey;
+  extern OTBOSSIMAdapters_EXPORT char const* GeoTransformKey;
 
-  extern char const* MetadataKey;
-  extern char const* SubMetadataKey;
+  extern OTBOSSIMAdapters_EXPORT char const* MetadataKey;
+  extern OTBOSSIMAdapters_EXPORT char const* SubMetadataKey;
 
-  extern char const* UpperLeftCornerKey;
-  extern char const* UpperRightCornerKey;
-  extern char const* LowerLeftCornerKey;
-  extern char const* LowerRightCornerKey;
+  extern OTBOSSIMAdapters_EXPORT char const* UpperLeftCornerKey;
+  extern OTBOSSIMAdapters_EXPORT char const* UpperRightCornerKey;
+  extern OTBOSSIMAdapters_EXPORT char const* LowerLeftCornerKey;
+  extern OTBOSSIMAdapters_EXPORT char const* LowerRightCornerKey;
 
-  extern char const* ColorTableNameKey;
-  extern char const* ColorEntryCountKey;
-  extern char const* ColorEntryAsRGBKey;
+  extern OTBOSSIMAdapters_EXPORT char const* ColorTableNameKey;
+  extern OTBOSSIMAdapters_EXPORT char const* ColorEntryCountKey;
+  extern OTBOSSIMAdapters_EXPORT char const* ColorEntryAsRGBKey;
 
-  extern char const* OSSIMKeywordlistKey;
-  extern char const* OSSIMKeywordlistDelimiterKey;
+  extern OTBOSSIMAdapters_EXPORT char const* OSSIMKeywordlistKey;
+  extern OTBOSSIMAdapters_EXPORT char const* OSSIMKeywordlistDelimiterKey;
 
-  extern char const* VectorDataKeywordlistKey;
-  extern char const* VectorDataKeywordlistDelimiterKey;
+  extern OTBOSSIMAdapters_EXPORT char const* VectorDataKeywordlistKey;
+  extern OTBOSSIMAdapters_EXPORT char const* VectorDataKeywordlistDelimiterKey;
 
-  extern char const* ResolutionFactor;
-  extern char const* SubDatasetIndex;
-  extern char const* CacheSizeInBytes;
+  extern OTBOSSIMAdapters_EXPORT char const* ResolutionFactor;
+  extern OTBOSSIMAdapters_EXPORT char const* SubDatasetIndex;
+  extern OTBOSSIMAdapters_EXPORT char const* CacheSizeInBytes;
 
-  extern char const* TileHintX;
-  extern char const* TileHintY;
+  extern OTBOSSIMAdapters_EXPORT char const* TileHintX;
+  extern OTBOSSIMAdapters_EXPORT char const* TileHintY;
 
-  extern char const * NoDataValueAvailable;
-  extern char const * NoDataValue;
+  extern OTBOSSIMAdapters_EXPORT char const * NoDataValueAvailable;
+  extern OTBOSSIMAdapters_EXPORT char const * NoDataValue;
 
 
   enum  KeyType
@@ -103,7 +104,7 @@ namespace MetaDataKey
 
   };
 
-  KeyType GetKeyType(const std::string& name);
+  KeyType OTBOSSIMAdapters_EXPORT GetKeyType(const std::string& name);
 
   typedef std::vector<double>               VectorType;
   typedef std::vector<bool>                 BoolVectorType;
@@ -118,7 +119,7 @@ namespace MetaDataKey
  *
  * \ingroup OTBOSSIMAdapters
  */
-class ITK_EXPORT OTB_GCP
+class OTBOSSIMAdapters_EXPORT OTB_GCP
 {
 public:
 
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbPlatformPositionAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbPlatformPositionAdapter.h
index 85e7b75..d8eecb8 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbPlatformPositionAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbPlatformPositionAdapter.h
@@ -23,6 +23,8 @@
 #include "itkObject.h"
 #include "itkObjectFactory.h"
 
+#include "OTBOSSIMAdaptersExport.h"
+
 namespace ossimplugins
 {
 class ossimGeometricSarSensorModel;
@@ -46,7 +48,7 @@ class ImageKeywordlist;
  * \ingroup OTBOSSIMAdapters
  **/
 
-class PlatformPositionAdapter: public itk::Object
+class OTBOSSIMAdapters_EXPORT PlatformPositionAdapter: public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbRPCSolverAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbRPCSolverAdapter.h
index 4a21143..a087eb2 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbRPCSolverAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbRPCSolverAdapter.h
@@ -26,6 +26,7 @@
 #include "itkPoint.h"
 #include "itkSize.h"
 
+#include "OTBOSSIMAdaptersExport.h"
 
 class ossimRpcSolver;
 
@@ -43,7 +44,7 @@ class ImageKeywordlist;
  * \ingroup OTBOSSIMAdapters
  **/
 
-class RPCSolverAdapter
+class OTBOSSIMAdapters_EXPORT RPCSolverAdapter
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbSensorModelAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbSensorModelAdapter.h
index 34dacd7..7f7fa8e 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbSensorModelAdapter.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbSensorModelAdapter.h
@@ -32,7 +32,7 @@ class ImageKeywordlist;
  * \class SensorModelAdapter
  * \brief Wrapper class to group all dependencies to ossim for sensor models
  *
- * This class is NOT intented to be used outside of OTB. Use the
+ * This class is NOT intended to be used outside of OTB. Use the
  * InverseSensorModel and ForwardSensorModel. If you feel that you need to use
  * it directly, think again!
  *
@@ -44,7 +44,7 @@ class ImageKeywordlist;
  * \ingroup OTBOSSIMAdapters
  **/
 
-class SensorModelAdapter: public itk::Object
+class OTBOSSIMAdapters_EXPORT SensorModelAdapter: public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -100,7 +100,7 @@ public:
   /** Is sensor model valid method. return false if the m_SensorModel is null*/
   bool IsValidSensorModel() const;
 
-  /** Read geom file and instanciate sensor model */
+  /** Read geom file and instantiate sensor model */
   bool ReadGeomFile(const std::string & infile);
 
   /** Write geom file corresponding to sensor model */
diff --git a/Modules/Adapters/OSSIMAdapters/otb-module.cmake b/Modules/Adapters/OSSIMAdapters/otb-module.cmake
index 7efda9e..acdb4ec 100644
--- a/Modules/Adapters/OSSIMAdapters/otb-module.cmake
+++ b/Modules/Adapters/OSSIMAdapters/otb-module.cmake
@@ -4,6 +4,7 @@ several purposes: sensor models (especially RPC), metadata parsers, DEM handlers
 so on.")
 
 otb_module(OTBOSSIMAdapters
+ENABLE_SHARED
   DEPENDS
     OTBOpenThreads
     OTBITK
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbFilterFunctionValues.cxx b/Modules/Adapters/OSSIMAdapters/src/otbFilterFunctionValues.cxx
index 51fad9e..4a5965c 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbFilterFunctionValues.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbFilterFunctionValues.cxx
@@ -53,7 +53,7 @@ FilterFunctionValues
     total2 += m_FilterFunctionValues6S[centerIndex];
     if (total2 > total / 2) break;
     }
-  return m_MinSpectralValue + m_UserStep * centerIndex;
+  return m_MinSpectralValue + 0.0025 * centerIndex;
 }
 
 /**PrintSelf method */
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbMapProjectionAdapter.cxx b/Modules/Adapters/OSSIMAdapters/src/otbMapProjectionAdapter.cxx
index 8e161bf..1a7c074 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbMapProjectionAdapter.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbMapProjectionAdapter.cxx
@@ -90,7 +90,7 @@ MapProjectionAdapter::InternalMapProjectionPointer MapProjectionAdapter::GetMapP
   itkDebugMacro("returning MapProjection address " << this->m_MapProjection);
   if ((m_ReinstanciateProjection) || (m_MapProjection == ITK_NULLPTR))
     {
-    this->InstanciateProjection();
+    this->InstantiateProjection();
     }
 
   return this->m_MapProjection;
@@ -101,7 +101,7 @@ MapProjectionAdapter::InternalMapProjectionConstPointer MapProjectionAdapter::Ge
   itkDebugMacro("returning MapProjection address " << this->m_MapProjection);
   if ((m_ReinstanciateProjection) || (m_MapProjection == ITK_NULLPTR))
     {
-    itkExceptionMacro(<< "m_MapProjection not up-to-date, call InstanciateProjection() first");
+    itkExceptionMacro(<< "m_MapProjection not up-to-date, call InstantiateProjection() first");
     }
 
   return this->m_MapProjection;
@@ -126,7 +126,7 @@ void MapProjectionAdapter::SetWkt(const std::string& projectionRefWkt)
 {
   this->m_ProjectionRefWkt = projectionRefWkt;
   m_ReinstanciateProjection = true;
-  this->InstanciateProjection(); //Should not be needed, but it is...
+  this->InstantiateProjection(); //Should not be needed, but it is...
   this->Modified();
 }
 
@@ -134,7 +134,7 @@ void MapProjectionAdapter::SetParameter(const std::string& key, const std::strin
 {
   m_ParameterStore[key] = value;
   m_ReinstanciateProjection = true;
-  this->InstanciateProjection(); //Should not be needed, but it is...
+  this->InstantiateProjection(); //Should not be needed, but it is...
   this->Modified();
 }
 
@@ -215,7 +215,7 @@ std::string MapProjectionAdapter::GetParameter(const std::string& key) const
   return "";
 }
 
-bool MapProjectionAdapter::InstanciateProjection()
+bool MapProjectionAdapter::InstantiateProjection()
 {
   if ((this->m_ReinstanciateProjection) || (m_MapProjection == ITK_NULLPTR))
     {
@@ -232,7 +232,7 @@ bool MapProjectionAdapter::InstanciateProjection()
         std::string projectionString(kwl.find("type"));
         if (projectionString.find("ossimEquDistCylProjection") != string::npos)
           {
-            otbMsgDevMacro(<< "WARNING: Not instanciating a ossimEquDistCylProjection: " << projectionString);
+            otbMsgDevMacro(<< "WARNING: Not instantiating a ossimEquDistCylProjection: " << projectionString);
             otbMsgDevMacro(<< "Wkt was: " << kwl);
             otbMsgDevMacro(<< "From RefWkt: " << m_ProjectionRefWkt);
             return false;
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx b/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx
index 2e60780..8a16d71 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx
@@ -207,7 +207,7 @@ double SensorModelAdapter::Optimize()
 
     ossimRpcProjection * simpleRpcModel = dynamic_cast<ossimRpcProjection *>(m_SensorModel);
 
-     //Handle expections
+     //Handle exceptions
     if ( (sensorModel == ITK_NULLPTR ) && (simpleRpcModel == ITK_NULLPTR ) )
        itkExceptionMacro(<< "Optimize(): error, both dynamic_cast from ossimProjection* to ossimSensorModel* / ossimRpcProjection* failed.");
 
@@ -254,7 +254,7 @@ bool SensorModelAdapter::WriteGeomFile(const std::string & outfile)
 
     ossimRpcProjection * simpleRpcModel = dynamic_cast<ossimRpcProjection *>(m_SensorModel);
 
-    //Handle expections
+    //Handle exceptions
     if ( (sensorModel == ITK_NULLPTR ) && (simpleRpcModel == ITK_NULLPTR ) )
        itkExceptionMacro(<< "Optimize(): error, both dynamic_cast from ossimProjection* to ossimSensorModel* / ossimRpcProjection* failed.");
 
diff --git a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt
index 7938911..a89ea0c 100644
--- a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt
+++ b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt
@@ -3,7 +3,7 @@ otb_module_test()
 set(OTBOSSIMAdaptersTests
 otbOSSIMAdaptersTestDriver.cxx
 otbTestImageKeywordlist.cxx
-otbOssimJpegFileRessourceLeakTest.cxx
+otbOssimJpegFileResourceLeakTest.cxx
 otbMapProjectionAdapterTest.cxx
 otbOssimElevManagerTest2.cxx
 otbOssimElevManagerTest4.cxx
@@ -120,8 +120,8 @@ foreach( file ${NAME_TESTS} )
 endforeach()       
 
 
-otb_add_test(NAME ioTvOssimJpegFileRessourceLeak COMMAND otbOSSIMAdaptersTestDriver
-  otbOssimJpegFileRessourceLeakTest
+otb_add_test(NAME ioTvOssimJpegFileResourceLeak COMMAND otbOSSIMAdaptersTestDriver
+  otbOssimJpegFileResourceLeakTest
   ${INPUTDATA}/poupees.jpg
   1200
   )
@@ -155,25 +155,26 @@ otb_add_test(NAME prTvossimElevManagerTest4 COMMAND otbOSSIMAdaptersTestDriver
   -1.8 52   0.02 -0.018 232 422
   )
 
-otb_add_test(NAME uaTvGeometricSarSensorModelAdapterTest COMMAND otbOSSIMAdaptersTestDriver
-  --compare-ascii ${EPSILON_9}
-  ${BASELINE_FILES}/uaTvGeometricSarSensorModelAdapterTest.txt
-  ${TEMP}/uaTvGeometricSarSensorModelAdapterTest.txt
-  otbGeometricSarSensorModelAdapterTest
-  LARGEINPUT{TERRASARX/2008-03-10_GrandCanyon_SSC/TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228/TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228.xml}
-  ${TEMP}/uaTvGeometricSarSensorModelAdapterTest.txt)
+#commented below test. these are moved to dev_sar_tsx branch for further checks
+# otb_add_test(NAME uaTvGeometricSarSensorModelAdapterTest COMMAND otbOSSIMAdaptersTestDriver
+#   --compare-ascii ${EPSILON_9}
+#   ${BASELINE_FILES}/uaTvGeometricSarSensorModelAdapterTest.txt
+#   ${TEMP}/uaTvGeometricSarSensorModelAdapterTest.txt
+#   otbGeometricSarSensorModelAdapterTest
+#   LARGEINPUT{TERRASARX/2008-03-10_GrandCanyon_SSC//TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228/TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228.xml}
+#   ${TEMP}/uaTvGeometricSarSensorModelAdapterTest.txt)
+
+# otb_add_test(NAME uaTvPlatformPositionComputeBaselineTest COMMAND otbOSSIMAdaptersTestDriver
+#   --compare-ascii ${EPSILON_9}
+#   ${BASELINE_FILES}/uaTvPlatformPositionComputeBaselineTest.txt
+#   ${TEMP}/uaTvPlatformPositionComputeBaselineTest.txt
+#   otbPlatformPositionComputeBaselineTest
+#   LARGEINPUT{TERRASARX/2008-03-10_GrandCanyon_SSC//TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228/TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228.xml}
+#   ${TEMP}/uaTvPlatformPositionComputeBaselineTest.txt)
 
 otb_add_test(NAME uaTvGeometricSarSensorModelAdapterNew COMMAND otbOSSIMAdaptersTestDriver
   otbGeometricSarSensorModelAdapterNewTest)
 
-otb_add_test(NAME uaTvPlatformPositionComputeBaselineTest COMMAND otbOSSIMAdaptersTestDriver
-  --compare-ascii ${EPSILON_9}
-  ${BASELINE_FILES}/uaTvPlatformPositionComputeBaselineTest.txt
-  ${TEMP}/uaTvPlatformPositionComputeBaselineTest.txt
-  otbPlatformPositionComputeBaselineTest
-  LARGEINPUT{TERRASARX/2008-03-10_GrandCanyon_SSC/TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228/TSX1_SAR__SSC______SM_S_SRA_20080310T133220_20080310T133228.xml}
-  ${TEMP}/uaTvPlatformPositionComputeBaselineTest.txt)
-
 otb_add_test(NAME uaTvPlatformPositionComputeBaselineNew COMMAND otbOSSIMAdaptersTestDriver
   otbPlatformPositionComputeBaselineNewTest)
 
diff --git a/Modules/Adapters/OSSIMAdapters/test/otbMapProjectionAdapterTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbMapProjectionAdapterTest.cxx
index 88b9129..55cd9cb 100644
--- a/Modules/Adapters/OSSIMAdapters/test/otbMapProjectionAdapterTest.cxx
+++ b/Modules/Adapters/OSSIMAdapters/test/otbMapProjectionAdapterTest.cxx
@@ -30,13 +30,13 @@ int otbMapProjectionAdapterTest(int itkNotUsed(argc), char* argv[])
   file << std::setprecision(15);
 
   {
-  /** Test the ability to instanciate a projection from a wkt string*/
+  /** Test the ability to instantiate a projection from a wkt string*/
   std::string projectionRefWkt =
     "PROJCS[\"UTM Zone 31, Northern Hemisphere\", GEOGCS[\"WGS 84\", DATUM[\"WGS_1984\", SPHEROID[\"WGS 84\", 6378137, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], TOWGS84[0, 0, 0, 0, 0, 0, 0], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.0174532925199433, AUTHORITY[\"EPSG\",\"9108\"]], AXIS[\"Lat\", NORTH], AXIS[\"Long\", EAST], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin [...]
 
   otb::MapProjectionAdapter::Pointer genericMapProjection = otb::MapProjectionAdapter::New();
   genericMapProjection->SetWkt(projectionRefWkt);
-  file << "Instanciating from : " << projectionRefWkt << std::endl;
+  file << "Instantiating from : " << projectionRefWkt << std::endl;
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
 
   double lon = 1.44;
@@ -59,12 +59,12 @@ int otbMapProjectionAdapterTest(int itkNotUsed(argc), char* argv[])
   }
 
   {
-  /** Test the ability to instanciate a projection from an ossim string*/
+  /** Test the ability to instantiate a projection from an ossim string*/
   std::string projectionRefWkt ="ossimUtmProjection";
 
   otb::MapProjectionAdapter::Pointer genericMapProjection = otb::MapProjectionAdapter::New();
   genericMapProjection->SetWkt(projectionRefWkt);
-  file << "Instanciating from : " << projectionRefWkt << std::endl;
+  file << "Instantiating from : " << projectionRefWkt << std::endl;
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
 
   double lon = 1.44;
@@ -87,12 +87,12 @@ int otbMapProjectionAdapterTest(int itkNotUsed(argc), char* argv[])
   }
 
   {
-  /** Test the ability to instanciate a projection from an short string*/
+  /** Test the ability to instantiate a projection from an short string*/
   std::string projectionRefWkt ="Utm";
 
   otb::MapProjectionAdapter::Pointer genericMapProjection = otb::MapProjectionAdapter::New();
   genericMapProjection->SetWkt(projectionRefWkt);
-  file << "Instanciating from : " << projectionRefWkt << std::endl;
+  file << "Instantiating from : " << projectionRefWkt << std::endl;
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
 
   double lon = 1.44;
@@ -115,12 +115,12 @@ int otbMapProjectionAdapterTest(int itkNotUsed(argc), char* argv[])
   }
 
   {
-  /** Test the ability to instanciate a projection from an short string*/
+  /** Test the ability to instantiate a projection from an short string*/
   std::string projectionRefWkt ="Mercator";
 
   otb::MapProjectionAdapter::Pointer genericMapProjection = otb::MapProjectionAdapter::New();
   genericMapProjection->SetWkt(projectionRefWkt);
-  file << "Instanciating from : " << projectionRefWkt << std::endl;
+  file << "Instantiating from : " << projectionRefWkt << std::endl;
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
 
   double lon = 1.44;
@@ -143,12 +143,12 @@ int otbMapProjectionAdapterTest(int itkNotUsed(argc), char* argv[])
   }
 
   {
-  /** Test the ability to instanciate a projection from an short string*/
+  /** Test the ability to instantiate a projection from an short string*/
   std::string projectionRefWkt ="LambertConformalConic";
 
   otb::MapProjectionAdapter::Pointer genericMapProjection = otb::MapProjectionAdapter::New();
   genericMapProjection->SetWkt(projectionRefWkt);
-  file << "Instanciating from : " << projectionRefWkt << std::endl;
+  file << "Instantiating from : " << projectionRefWkt << std::endl;
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
 
   double lon = 1.44;
@@ -172,14 +172,14 @@ int otbMapProjectionAdapterTest(int itkNotUsed(argc), char* argv[])
 
 
   {
-  /** Test the ability to instanciate an Utm projection in a different zone */
+  /** Test the ability to instantiate an Utm projection in a different zone */
   std::string projectionRefWkt ="Utm";
 
   otb::MapProjectionAdapter::Pointer genericMapProjection = otb::MapProjectionAdapter::New();
   genericMapProjection->SetWkt(projectionRefWkt);
   genericMapProjection->SetParameter("Zone", "46");
   genericMapProjection->SetParameter("Hemisphere", "S");
-  file << "Instanciating from : " << projectionRefWkt << " with some extra parameters" << std::endl;
+  file << "Instantiating from : " << projectionRefWkt << " with some extra parameters" << std::endl;
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
 
   double lon = 91.44;
diff --git a/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx b/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx
index 97998ed..3e7e146 100644
--- a/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx
+++ b/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx
@@ -2,7 +2,7 @@
 void RegisterTests()
 {
   REGISTER_TEST(otbTestImageKeywordlist);
-  REGISTER_TEST(otbOssimJpegFileRessourceLeakTest);
+  REGISTER_TEST(otbOssimJpegFileResourceLeakTest);
   REGISTER_TEST(otbMapProjectionAdapterTest);
   REGISTER_TEST(otbOssimElevManagerTest2);
   REGISTER_TEST(otbOssimElevManagerTest4);
diff --git a/Modules/Adapters/OSSIMAdapters/test/otbOssimJpegFileResourceLeakTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbOssimJpegFileResourceLeakTest.cxx
new file mode 100644
index 0000000..d976f10
--- /dev/null
+++ b/Modules/Adapters/OSSIMAdapters/test/otbOssimJpegFileResourceLeakTest.cxx
@@ -0,0 +1,63 @@
+/*=========================================================================
+
+  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 <stdlib.h>
+#include <iostream>
+
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Woverloaded-virtual"
+#pragma GCC diagnostic ignored "-Wshadow"
+#include <ossim/imaging/ossimImageHandler.h>
+#include <ossim/imaging/ossimImageHandlerRegistry.h>
+#include <ossim/base/ossimFilename.h>
+#pragma GCC diagnostic pop
+#else
+#include <ossim/imaging/ossimImageHandler.h>
+#include <ossim/imaging/ossimImageHandlerRegistry.h>
+#include <ossim/base/ossimFilename.h>
+#endif
+
+// This test demonstrate that handler->close() does not release the file descriptor for jpeg files.
+
+int otbOssimJpegFileResourceLeakTest(int argc, char * argv[])
+{
+  if (argc != 3)
+    {
+    std::cerr << "Usage:" << std::endl;
+    std::cerr << argv[0] << " infname nbReading" << std::endl;
+    return 1;
+    }
+
+  const char *       infname = argv[1];
+  const unsigned int nbReading = atoi(argv[2]);
+
+  for (unsigned int i = 0; i < nbReading; ++i)
+    {
+    // Create the handler
+    ossimImageHandler * handler = ossimImageHandlerRegistry::instance()->open(ossimFilename(infname));
+    if (!handler)
+      {
+      std::cerr << "Failed to open image " << i << " times." << std::endl;
+      return 1;
+      }
+    handler->close();
+    }
+  return 0;
+}
diff --git a/Modules/Adapters/OSSIMAdapters/test/otbOssimJpegFileRessourceLeakTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbOssimJpegFileRessourceLeakTest.cxx
deleted file mode 100644
index 108d2b6..0000000
--- a/Modules/Adapters/OSSIMAdapters/test/otbOssimJpegFileRessourceLeakTest.cxx
+++ /dev/null
@@ -1,63 +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 <stdlib.h>
-#include <iostream>
-
-
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Woverloaded-virtual"
-#pragma GCC diagnostic ignored "-Wshadow"
-#include <ossim/imaging/ossimImageHandler.h>
-#include <ossim/imaging/ossimImageHandlerRegistry.h>
-#include <ossim/base/ossimFilename.h>
-#pragma GCC diagnostic pop
-#else
-#include <ossim/imaging/ossimImageHandler.h>
-#include <ossim/imaging/ossimImageHandlerRegistry.h>
-#include <ossim/base/ossimFilename.h>
-#endif
-
-// This test demonstrate that handler->close() does not release the file descriptor for jpeg files.
-
-int otbOssimJpegFileRessourceLeakTest(int argc, char * argv[])
-{
-  if (argc != 3)
-    {
-    std::cerr << "Usage:" << std::endl;
-    std::cerr << argv[0] << " infname nbReading" << std::endl;
-    return 1;
-    }
-
-  const char *       infname = argv[1];
-  const unsigned int nbReading = atoi(argv[2]);
-
-  for (unsigned int i = 0; i < nbReading; ++i)
-    {
-    // Create the handler
-    ossimImageHandler * handler = ossimImageHandlerRegistry::instance()->open(ossimFilename(infname));
-    if (!handler)
-      {
-      std::cerr << "Failed to open image " << i << " times." << std::endl;
-      return 1;
-      }
-    handler->close();
-    }
-  return 0;
-}
diff --git a/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx
index 86be001..3c9fa10 100644
--- a/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx
+++ b/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx
@@ -72,7 +72,7 @@ int otbRPCSolverAdapterTest(int argc, char* argv[])
 
   RSTranformType::Pointer fwd2dTransform = RSTranformType::New();
   fwd2dTransform->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist());
-  fwd2dTransform->InstanciateTransform();
+  fwd2dTransform->InstantiateTransform();
 
   ImageType::SizeType  size = reader->GetOutput()->GetLargestPossibleRegion().GetSize();
 
@@ -130,10 +130,10 @@ int otbRPCSolverAdapterTest(int argc, char* argv[])
   // Build forward and inverse rpc transform
   RSTranform3dType::Pointer rpcFwdTransform = RSTranform3dType::New();
   rpcFwdTransform->SetInputKeywordList(rpcKwl);
-  rpcFwdTransform->InstanciateTransform();
+  rpcFwdTransform->InstantiateTransform();
   RSTranformType::Pointer rpcInvTransform = RSTranformType::New();
   rpcInvTransform->SetOutputKeywordList(rpcKwl);
-  rpcInvTransform->InstanciateTransform();
+  rpcInvTransform->InstantiateTransform();
 
   EuclideanDistanceMetricType::Pointer euclideanDistanceMetric = EuclideanDistanceMetricType::New();
   GeoDistanceType::Pointer geoDistance = GeoDistanceType::New();
diff --git a/Modules/Adapters/OpenThreadsAdapters/include/otbThreads.h b/Modules/Adapters/OpenThreadsAdapters/include/otbThreads.h
index 507ac20..c7953a7 100644
--- a/Modules/Adapters/OpenThreadsAdapters/include/otbThreads.h
+++ b/Modules/Adapters/OpenThreadsAdapters/include/otbThreads.h
@@ -25,7 +25,7 @@ namespace otb
  * \brief Operation from open threads that are used in Monteverdi
  *
  * Implement the sleep operation from openthreads to remove Monteverdi
- * dependance to openthreads at compile time.
+ * dependence to openthreads at compile time.
  *
  *
  * \ingroup OTBOpenThreadsAdapters
diff --git a/Modules/Adapters/QtAdapters/CMakeLists.txt b/Modules/Adapters/QtAdapters/CMakeLists.txt
new file mode 100644
index 0000000..43b6774
--- /dev/null
+++ b/Modules/Adapters/QtAdapters/CMakeLists.txt
@@ -0,0 +1,6 @@
+project( OTBQtAdapters )
+
+set( OTBQtAdapters_LIBRARIES OTBQtAdapters)
+
+otb_module_impl()
+
diff --git a/Modules/Adapters/QtAdapters/include/otbQtAdapters.h b/Modules/Adapters/QtAdapters/include/otbQtAdapters.h
new file mode 100644
index 0000000..e4cdace
--- /dev/null
+++ b/Modules/Adapters/QtAdapters/include/otbQtAdapters.h
@@ -0,0 +1,216 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 otbQtAdapters_h
+#define otbQtAdapters_h
+
+
+#include "OTBQtAdaptersExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <QFileDialog>
+#endif //tag=QT4-boost-compatibility
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+//
+// Internal classes pre-declaration.
+namespace otb
+{
+} // end namespace 'otb'
+
+
+/*****************************************************************************/
+/* TYPE DEFINITION SECTION                                                   */
+
+namespace otb
+{
+} // end of namespace otb.
+
+
+/*****************************************************************************/
+/* FUNCTION DECLARATION SECTION                                              */
+
+namespace otb
+{
+
+/**
+ * \brief This is a convenience static method that will return an
+ * existing directory path selected by the user.
+ *
+ * This method stores the last accepted directory for next call.
+ *
+ * \see http://qt-project.org/doc/qt-4.8/qfiledialog.html#getExistingDirectory
+ *
+ * \param parent Parent widget of that QFileDialog.
+ * \param caption Title-bar caption of that QFileDialog.
+ * \param dir Directory location where to pick path.
+ * \param options of that QFileDialog.
+ *
+ * \return The selected path or an null QString if QFileDialog has
+ * been rejected.
+ */
+QString
+OTBQtAdapters_EXPORT
+GetExistingDirectory( QWidget * p = 0,
+		      const QString & caption = QString(),
+		      const QString & dir =  QString(),
+		      QFileDialog::Options options = QFileDialog::ShowDirsOnly );
+
+/**
+ * \brief This is a convenience static method that will return an
+ * existing filename selected by the user.
+ *
+ * This method stores the last accepted directory for next call.
+ *
+ * \see http://qt-project.org/doc/qt-4.8/qfiledialog.html#getOpenFileName
+ *
+ * \param parent Parent widget of that QFileDialog.
+ * \param caption Title-bar caption of that QFileDialog.
+ * \param dir Directory location where to pick path.
+ * \param filter Filename filter (e.g. wildcards).
+ * \param selectedFilter Filter which has been selected by the user.
+ * \param options Options of that QFileDialog.
+ *
+ * \return The selected filename or an null QString if QFileDialog has
+ * been rejected.
+ */
+QString
+OTBQtAdapters_EXPORT
+GetOpenFileName( QWidget * p =0,
+		 const QString & caption = QString(),
+		 const QString & dir = QString(),
+		 const QString & filter = QString(),
+		 QString * selectedFilter = 0,
+		 QFileDialog::Options options = 0 );
+
+/**
+ * \brief This is a convenience static method that will return a
+ * list of existing filenames selected by the user.
+ *
+ * This method stores the last accepted directory for next call.
+ *
+ * \see http://qt-project.org/doc/qt-4.8/qfiledialog.html#getOpenFileNames
+ *
+ * \param parent Parent widget of that QFileDialog.
+ * \param caption Title-bar caption of that QFileDialog.
+ * \param dir Directory location where to pick path.
+ * \param filter Filename filter (e.g. wildcards).
+ * \param selectedFilter Filter which has been selected by the user.
+ * \param options of that QFileDialog.
+ *
+ * \return The selected filename list or an empty QStringLIst if
+ * QFileDialog has been rejected.
+ */
+QStringList
+OTBQtAdapters_EXPORT
+GetOpenFileNames( QWidget * p =0,
+		  const QString & caption = QString(),
+		  const QString & dir = QString(),
+		  const QString & filter = QString(),
+		  QString * selectedFilter = 0,
+		  QFileDialog::Options options = 0 );
+
+/**
+ * \brief This is a convenience static method that will return a
+ * filename selected by the user. This file does not have to exist.
+ *
+ * This method stores the last accepted directory for next call.
+ *
+ * \see http://qt-project.org/doc/qt-4.8/qfiledialog.html#getSaveFileName
+ *
+ * \param parent Parent widget of that QFileDialog.
+ * \param caption Title-bar caption of that QFileDialog.
+ * \param dir Directory location where to pick path.
+ * \param filter Filename filter (e.g. wildcards).
+ * \param selectedFilter Filter which has been selected by the user.
+ * \param options of that QFileDialog.
+ *
+ * \return The selected filename list or an empty QStringLIst if
+ * QFileDialog has been rejected.
+ */
+QString
+OTBQtAdapters_EXPORT
+GetSaveFileName( QWidget * p =0,
+		 const QString & caption = QString(),
+		 const QString & dir = QString(),
+		 const QString & filter = QString(),
+		 QString * selectedFilter = 0,
+		 QFileDialog::Options options = 0 );
+
+/**
+ * \return Working directory of Qt-based applications (see
+ * http://doc.qt.io/qt-4.8/qdir.html#currentPath).
+ */
+QString
+OTBQtAdapters_EXPORT
+GetWorkingDir();
+
+/**
+ * \brief Set working directory for Qt-based applications (see
+ * http://doc.qt.io/qt-4.8/qdir.html#setCurrent).
+ *
+ * \param path Path to working directory.
+ *
+ * \return <code>true</code> if working directory has successfully
+ * been changed.
+ */
+bool
+OTBQtAdapters_EXPORT
+SetWorkingDir( const QString & path );
+
+/**
+ * \brief Static path to the last directory used in file dialogs
+ */
+static QString RecentDirectory;
+
+} // end namespace 'otb'.
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace otb
+{
+} // end namespace 'otb'.
+
+#endif // otbQtAdapters_h
diff --git a/Modules/Adapters/QtAdapters/otb-module.cmake b/Modules/Adapters/QtAdapters/otb-module.cmake
new file mode 100644
index 0000000..45cc5f0
--- /dev/null
+++ b/Modules/Adapters/QtAdapters/otb-module.cmake
@@ -0,0 +1,7 @@
+set( DOCUMENTATION "Adapters for the Qt Library.")
+
+otb_module( OTBQtAdapters
+  ENABLE_SHARED
+  DEPENDS  OTBQt4
+  DESCRIPTION "${DOCUMENTATION}"
+)
diff --git a/Modules/Adapters/QtAdapters/src/CMakeLists.txt b/Modules/Adapters/QtAdapters/src/CMakeLists.txt
new file mode 100644
index 0000000..831d44c
--- /dev/null
+++ b/Modules/Adapters/QtAdapters/src/CMakeLists.txt
@@ -0,0 +1,20 @@
+set( OTBQtAdapters_SRC
+  otbQtAdapters.cxx
+  )
+
+set( OTBQtAdapters_HEADERS_MOC
+  # otbQtAdapters.h
+  )
+
+add_to_qt4_i18n_sources( ${OTBQtAdapters_SRCS} )
+add_to_qt4_i18n_headers( "../include" ${OTBQtAdapters_SRCS} )
+
+qt4_wrap_cpp( OTBQtAdapters_SRC_MOC ${OTBQtAdapters_HEADERS_MOC} )
+
+add_library( OTBQtAdapters ${OTBQtAdapters_SRC} ${OTBQtAdapters_SRC_MOC})
+
+target_link_libraries( OTBQtAdapters 
+  ${OTBQt4_LIBRARIES}
+  )
+
+otb_module_target( OTBQtAdapters )
diff --git a/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx b/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx
new file mode 100644
index 0000000..b36d66c
--- /dev/null
+++ b/Modules/Adapters/QtAdapters/src/otbQtAdapters.cxx
@@ -0,0 +1,207 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "otbQtAdapters.h"
+
+
+#include <cassert>
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+namespace otb
+{
+/*
+  TRANSLATOR otb::QtAdapters
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+QString
+GetExistingDirectory( QWidget * p,
+		      const QString& caption,
+		      const QString& dir,
+		      QFileDialog::Options options )
+{
+  QString path(
+    QFileDialog::getExistingDirectory(
+      p,
+      caption.isEmpty()
+      ? QObject::tr( "Select directory..." )
+      : caption,
+      dir.isEmpty() ? RecentDirectory : dir,
+      options
+    )
+  );
+
+  if( !path.isNull() )
+    {
+    // Absolute path expected from QFileDialog
+    SetWorkingDir( path );
+    }
+
+  return path;
+}
+
+/*****************************************************************************/
+QString
+GetOpenFileName( QWidget * p,
+		 const QString& caption,
+		 const QString& dir,
+		 const QString& filter,
+		 QString* selectedFilter,
+		 QFileDialog::Options options )
+{
+  QString filename(
+    QFileDialog::getOpenFileName(
+      p,
+      caption.isEmpty()
+      ? QObject::tr( "Open file..." )
+      : caption,
+      dir.isEmpty() ? RecentDirectory : dir,
+      filter,
+      selectedFilter,
+      options
+    )
+  );
+
+  // Absolute path expected from QFileDialog
+  if( !filename.isNull() )
+    SetWorkingDir( filename );
+
+  return filename;
+}
+
+/*****************************************************************************/
+QStringList
+GetOpenFileNames( QWidget * p,
+		  const QString & caption,
+		  const QString & dir,
+		  const QString & filter,
+		  QString * selectedFilter,
+		  QFileDialog::Options options )
+{
+  QStringList filenames(
+    QFileDialog::getOpenFileNames(
+      p,
+      caption.isEmpty()
+      ? QObject::tr( "Open file..." )
+      : caption,
+      dir.isEmpty() ? RecentDirectory : dir,
+      filter,
+      selectedFilter,
+      options
+    )
+  );
+
+  // Absolute path expected from QFileDialog
+  if( !filenames.isEmpty() )
+    SetWorkingDir( filenames.back() );
+
+  return filenames;
+}
+
+/*****************************************************************************/
+QString
+GetSaveFileName( QWidget * p,
+		 const QString & caption,
+		 const QString & dir,
+		 const QString & filter,
+		 QString * selectedFilter,
+		 QFileDialog::Options options )
+{
+  QString filename(
+    QFileDialog::getSaveFileName(
+      p,
+      caption.isEmpty()
+      ? QObject::tr( "Save file..." )
+      : caption,
+      dir.isEmpty() ? RecentDirectory : dir,
+      filter,
+      selectedFilter,
+      options
+    )
+  );
+
+  // Absolute path expected from QFileDialog
+  if( !filename.isNull() )
+    SetWorkingDir( filename );
+
+  return filename;
+}
+
+/*****************************************************************************/
+QString
+GetWorkingDir()
+{
+  return RecentDirectory;
+}
+
+/*****************************************************************************/
+bool
+SetWorkingDir( const QString & filepath )
+{
+  assert( !filepath.isEmpty() );
+
+  QFileInfo finfo( filepath );
+
+#if 0
+  return QDir::setCurrent(
+    finfo.isDir()
+    ? filepath
+    : finfo.path()
+  );
+#else
+  // TODO : add mutex if needed
+  QString dir = finfo.isDir() ? filepath : finfo.path();
+  if ( !QFileInfo(dir).isDir() )
+    return false;
+  RecentDirectory = finfo.isDir() ? filepath : finfo.path();
+  return true;
+#endif
+}
+
+} // end namespace 'otb'
diff --git a/Modules/Adapters/QtAdapters/test/CMakeLists.txt b/Modules/Adapters/QtAdapters/test/CMakeLists.txt
new file mode 100644
index 0000000..c2ed9b5
--- /dev/null
+++ b/Modules/Adapters/QtAdapters/test/CMakeLists.txt
@@ -0,0 +1,3 @@
+otb_module_test()
+
+# include_directories( ${OTBCommon_BINARY_DIR} )
diff --git a/Modules/Applications/AppClassification/app/CMakeLists.txt b/Modules/Applications/AppClassification/app/CMakeLists.txt
index 3f46b91..982bbae 100644
--- a/Modules/Applications/AppClassification/app/CMakeLists.txt
+++ b/Modules/Applications/AppClassification/app/CMakeLists.txt
@@ -125,3 +125,8 @@ otb_create_application(
   NAME           SampleExtraction
   SOURCES        otbSampleExtraction.cxx
   LINK_LIBRARIES ${${otb-module}_LIBRARIES})
+
+otb_create_application(
+  NAME           MultiImageSamplingRate
+  SOURCES        otbMultiImageSamplingRate.cxx
+  LINK_LIBRARIES ${${otb-module}_LIBRARIES})
diff --git a/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx b/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx
index 4652d55..1219414 100644
--- a/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx
+++ b/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx
@@ -99,6 +99,13 @@ private:
     SetParameterDescription("ip.undecidedlabel", "Label for the Undecided class. By default, 'ip.undecidedlabel = 0'.");
     SetDefaultParameterInt("ip.undecidedlabel", 0.0);
 
+    AddParameter(ParameterType_Empty, "ip.onlyisolatedpixels", "Process isolated pixels only");
+    SetParameterDescription("ip.onlyisolatedpixels", "Only pixels whose label is unique in the neighbordhood will be processed. By default, 'ip.onlyisolatedpixels = false'.");
+
+    AddParameter(ParameterType_Int, "ip.isolatedthreshold", "Threshold for isolated pixels");
+    SetParameterDescription("ip.isolatedthreshold", "Maximum number of neighbours with the same label as the center pixel to consider that it is an isolated pixel. By default, 'ip.isolatedthreshold = 1'.");       
+    SetDefaultParameterInt("ip.isolatedthreshold", 1);
+
 
     AddRAMParameter();
 
@@ -107,6 +114,7 @@ private:
     SetDocExampleParameterValue("io.out", "clLabeledImageQB123_1_CMR_r2_nodl_10_undl_7.tif");
     SetDocExampleParameterValue("ip.radius", "2");
     SetDocExampleParameterValue("ip.suvbool", "true");
+    SetDocExampleParameterValue("ip.onlyisolatedpixels", "true");
     SetDocExampleParameterValue("ip.nodatalabel", "10");
     SetDocExampleParameterValue("ip.undecidedlabel", "7");
   }
@@ -149,6 +157,17 @@ private:
       m_NeighMajVotingFilter->SetKeepOriginalLabelBool(true);
       }
 
+    // Process isolated pixels only
+    if (IsParameterEnabled("ip.onlyisolatedpixels"))
+      {
+      m_NeighMajVotingFilter->SetOnlyIsolatedPixels(true);
+      m_NeighMajVotingFilter->SetIsolatedThreshold(GetParameterInt("ip.isolatedthreshold"));
+      }
+    else
+      {
+      m_NeighMajVotingFilter->SetOnlyIsolatedPixels(false);
+      }
+
     /** REGULARIZATION OF CLASSIFICATION */
     SetParameterOutputImage<IOLabelImageType>("io.out", m_NeighMajVotingFilter->GetOutput());
 
diff --git a/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx b/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx
index cf138b8..f320538 100644
--- a/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx
+++ b/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx
@@ -288,27 +288,17 @@ private:
         if ((labelRef != nodata) && (labelProd != nodata))
           {
           // If the current labels have not been added to their respective mapOfClasses yet
-          if (mapOfClassesRef.count(labelRef) == 0)
+          if (mapOfClassesRef.insert(MapOfClassesType::value_type(labelRef, itLabelRef)).second)
             {
-            mapOfClassesRef[labelRef] = itLabelRef;
             ++itLabelRef;
             }
-          if (mapOfClassesProd.count(labelProd) == 0)
+          if (mapOfClassesProd.insert(MapOfClassesType::value_type(labelProd, itLabelProd)).second)
             {
-            mapOfClassesProd[labelProd] = itLabelProd;
             ++itLabelProd;
             }
 
           // Filling of m_Matrix
-          if (m_Matrix[labelRef][labelProd] == 0)
-            {
-            m_Matrix[labelRef][labelProd] = 1;
-            }
-          else
-            {
-            m_Matrix[labelRef][labelProd]++;
-            }
-
+          m_Matrix[labelRef][labelProd]++;
           } // END if ((labelRef != nodata) && (labelProd != nodata))
         ++itRef;
         ++itInput;
@@ -325,9 +315,11 @@ private:
 
     // Filling ossHeaderRefLabels for the output file
     ossHeaderRefLabels << commentRefStr;
+
+    MapOfClassesType::iterator itMapOfClassesRefEnd = mapOfClassesRef.end();
     itMapOfClassesRef = mapOfClassesRef.begin();
     int indexLabelRef = 0;
-    while (itMapOfClassesRef != mapOfClassesRef.end())
+    while (itMapOfClassesRef != itMapOfClassesRefEnd)
       {
       // labels labelRef of mapOfClassesRef are already sorted
       labelRef = itMapOfClassesRef->first;
@@ -338,7 +330,7 @@ private:
 
       ossHeaderRefLabels << labelRef;
       ++itMapOfClassesRef;
-      if (itMapOfClassesRef != mapOfClassesRef.end())
+      if (itMapOfClassesRef != itMapOfClassesRefEnd)
         {
         ossHeaderRefLabels << separatorChar;
         }
@@ -352,9 +344,10 @@ private:
 
     // Filling ossHeaderProdLabels for the output file
     ossHeaderProdLabels << commentProdStr;
+    MapOfClassesType::iterator itMapOfClassesProdEnd = mapOfClassesProd.end();
     itMapOfClassesProd = mapOfClassesProd.begin();
     int indexLabelProd = 0;
-    while (itMapOfClassesProd != mapOfClassesProd.end())
+    while (itMapOfClassesProd != itMapOfClassesProdEnd)
       {
       // labels labelProd of mapOfClassesProd are already sorted
       labelProd = itMapOfClassesProd->first;
@@ -365,7 +358,7 @@ private:
 
       ossHeaderProdLabels << labelProd;
       ++itMapOfClassesProd;
-      if (itMapOfClassesProd != mapOfClassesProd.end())
+      if (itMapOfClassesProd != itMapOfClassesProdEnd)
         {
         ossHeaderProdLabels << separatorChar;
         }
@@ -402,13 +395,13 @@ private:
     // Initialization of m_MatrixLOG
     m_MatrixLOG.SetSize(nbClassesRef, nbClassesRef);
     m_MatrixLOG.Fill(0);
-    for (itMapOfClassesRef = mapOfClassesRef.begin(); itMapOfClassesRef != mapOfClassesRef.end(); ++itMapOfClassesRef)
+    for (itMapOfClassesRef = mapOfClassesRef.begin(); itMapOfClassesRef != itMapOfClassesRefEnd; ++itMapOfClassesRef)
       {
       // labels labelRef of mapOfClassesRef are already sorted
       labelRef = itMapOfClassesRef->first;
 
       indexLabelProd = 0;
-      for (itMapOfClassesProd = mapOfClassesProd.begin(); itMapOfClassesProd != mapOfClassesProd.end(); ++itMapOfClassesProd)
+      for (itMapOfClassesProd = mapOfClassesProd.begin(); itMapOfClassesProd != itMapOfClassesProdEnd; ++itMapOfClassesProd)
         {
         // labels labelProd of mapOfClassesProd are already sorted
         labelProd = itMapOfClassesProd->first;
@@ -458,7 +451,7 @@ private:
     confMatMeasurements->SetConfusionMatrix(m_MatrixLOG);
     confMatMeasurements->Compute();
 
-    for (itMapOfClassesRef = mapOfClassesRef.begin(); itMapOfClassesRef != mapOfClassesRef.end(); ++itMapOfClassesRef)
+    for (itMapOfClassesRef = mapOfClassesRef.begin(); itMapOfClassesRef != itMapOfClassesRefEnd; ++itMapOfClassesRef)
       {
       labelRef = itMapOfClassesRef->first;
       indexLabelRef = itMapOfClassesRef->second;
diff --git a/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx b/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx
index 990d41b..b3e2a04 100644
--- a/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx
+++ b/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx
@@ -66,6 +66,8 @@ private:
     SetParameterDescription( "out", "XML filename where the statistics are saved for future reuse." );
     MandatoryOff("out");
 
+    AddRAMParameter();
+
    // Doc example parameter settings
    SetDocExampleParameterValue("il", "QB_1_ortho.tif");
    SetDocExampleParameterValue("out", "EstimateImageStatisticsQB1.xml");
@@ -128,6 +130,7 @@ private:
       processName << "Processing Image (" << imageId+1 << "/" << imageList->Size() << ")";
       AddProcess(statsEstimator->GetStreamer(), processName.str().c_str());
       statsEstimator->SetInput(image);
+      statsEstimator->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
       if( HasValue( "bv" )==true )
         {
         statsEstimator->SetIgnoreUserDefinedValue(true);
diff --git a/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx b/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx
index 7b52a90..6663e7b 100644
--- a/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx
+++ b/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx
@@ -96,16 +96,16 @@ private:
     SetDescription("Fuses several classifications maps of the same image on the basis of class labels.");
     SetDocName("Fusion of Classifications");
     SetDocLongDescription("This application allows you to fuse several classification maps and produces a single more robust classification map. "
-        "Fusion is done either by mean of Majority Voting, or with the Dempster Shafer combination method on class labels.\n "
-        "-MAJORITY VOTING: for each pixel, the class with the highest number of votes is selected.\n "
-        "-DEMPSTER SHAFER: for each pixel, the class label for which the Belief Function is maximal is selected. This Belief Function is calculated "
+        "Fusion is done either by mean of Majority Voting, or with the Dempster Shafer combination method on class labels.\n\n"
+        "  - MAJORITY VOTING: for each pixel, the class with the highest number of votes is selected.\n"
+        "  - DEMPSTER SHAFER: for each pixel, the class label for which the Belief Function is maximal is selected. This Belief Function is calculated "
         "by mean of the Dempster Shafer combination of Masses of Belief, and indicates the belief that each input classification map presents for each label "
         "value. Moreover, the Masses of Belief are based on the input confusion matrices of each classification map, either by using the PRECISION or RECALL "
         "rates, or the OVERALL ACCURACY, or the KAPPA coefficient. Thus, each input classification map needs to be associated with its corresponding input "
         "confusion matrix file for the Dempster Shafer fusion.\n"
-        "-Input pixels with the NODATA label are not handled in the fusion of classification maps. Moreover, pixels for which all the input classifiers are set to NODATA "
+        "  - Input pixels with the NODATA label are not handled in the fusion of classification maps. Moreover, pixels for which all the input classifiers are set to NODATA "
         "keep this value in the output fused image.\n"
-        "-In case of number of votes equality, the UNDECIDED label is attributed to the pixel.");
+        "  - In case of number of votes equality, the UNDECIDED label is attributed to the pixel.\n");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso("ImageClassifier application");
diff --git a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx
new file mode 100644
index 0000000..826af62
--- /dev/null
+++ b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx
@@ -0,0 +1,370 @@
+/*=========================================================================
+
+ 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 "otbSamplingRateCalculatorList.h"
+#include "otbStatisticsXMLFileReader.h"
+
+namespace otb
+{
+namespace Wrapper
+{
+
+class MultiImageSamplingRate : public Application
+{
+public:
+  /** Standard class typedefs. */
+  typedef MultiImageSamplingRate        Self;
+  typedef Application                   Superclass;
+  typedef itk::SmartPointer<Self>       Pointer;
+  typedef itk::SmartPointer<const Self> ConstPointer;
+
+  /** Standard macro */
+  itkNewMacro(Self);
+
+  itkTypeMacro(MultiImageSamplingRate, otb::Application);
+
+  /** typedef */
+  typedef otb::SamplingRateCalculatorList           RateCalculatorListType;
+  
+  typedef RateCalculatorListType::ClassCountMapType      ClassCountMapType;
+  typedef RateCalculatorListType::MapRateType           MapRateType;
+
+  typedef itk::VariableLengthVector<float> MeasurementType;
+  typedef otb::StatisticsXMLFileReader<MeasurementType> XMLReaderType;
+
+private:
+  MultiImageSamplingRate()
+    {
+    m_CalculatorList = RateCalculatorListType::New();
+    }
+
+  void DoInit()
+  {
+    SetName("MultiImageSamplingRate");
+    SetDescription("Compute sampling rate for an input set of images.");
+
+    // Documentation
+    SetDocName("Multi-image sampling rate estimation");
+    SetDocLongDescription("The application computes sampling rates for a set of"
+      " input images. Before calling this application, each pair of image and "
+      "training vectors has to be analysed with the application "
+      "PolygonClassStatistics. The statistics file is then used to compute the "
+      "sampling rates for each class in each image. Several types of sampling "
+      " are implemented. Each one is a combination of a mono-image strategy "
+      "and a multi-image mode. The mono-image strategies are :\n\n"
+      "  * smallest (default) : select the same number of sample in each "
+      "class so that the smallest one is fully sampled.\n"
+      "  * constant : select the same number of samples N in each class "
+      "(with N below or equal to the size of the smallest class).\n"
+      "  * byclass : set the required number for each class manually, with an "
+      "input CSV file (first column is class name, second one is the required "
+      "samples number).\n\n"
+      "The multi-image modes (mim) are proportional, equal and custom. The custom "
+      "mode lets the users choose the distribution of samples among the "
+      "images. The different behaviours are described below. Ti(c) and Ni(c) "
+      " refers resp. to the total number and needed number of samples in "
+      "image i for class c. Let's call L the total number of images.\n"
+      "  * strategy = all\n\n"
+      "    - Same behaviour for all modes : take all samples\n\n"
+      "  * strategy = constant :"
+      " let's call M the global number of samples required per class."
+      " For each image i and each class c:\n\n"
+      "    - if mim = proportional, then Ni( c ) = M * Ti( c ) / sum_k( Tk(c) )\n\n"
+      "    - if mim = equal       , then Ni( c ) = M / L\n\n"
+      "    - if mim = custom      , then Ni( c ) = Mi where Mi is the custom requested number of samples for image i\n\n"
+      "  * strategy = byClass :"
+      " let's call M(c) the global number of samples for class c)."
+      " For each image i and each class c:\n\n"
+      "    - if mim = proportional, then Ni( c ) = M(c) * Ti( c ) / sum_k( Tk(c) )\n\n"
+      "    - if mim = equal       , then Ni( c ) = M(c) / L\n\n"
+      "    - if mim = custom      , then Ni( c ) = Mi(c) where Mi(c) is the custom requested number of samples for image i and class c\n\n"
+      "  * strategy = percent :"
+      " For each image i and each class c:\n\n"
+      "    - if mim = proportional, then Ni( c ) = p * Ti( c ) where p is the global percentage of samples\n\n"
+      "    - if mim = equal       , then Ni( c ) = p * sum_k(Tk(c)]/L where p is the global percentage of samples\n\n"
+      "    - if mim = custom      , then Ni( c ) = p(i) * Ti(c) where p(i) is the percentage of samples for image i. c\n\n"
+      "  * strategy = total :"
+      " For each image i and each class c:\n\n"
+      "    - if mim = proportional, then Ni( c ) = total * (sum_k(Ti(k))/sum_kl(Tl(k))) * (Ti(c)/sum_k(Ti(k))) where total is the total number of samples specified.\n\n"
+      "    - if mim = equal       , then Ni( c ) = (total / L) * (Ti(c)/sum_k(Ti(k))) where total is the total number of samples specified.\n\n"
+      "    - if mim = custom      , then Ni( c ) = total(i) * (Ti(c)/sum_k(Ti(k))) where total(i) is the total number of samples specified for image i. \n\n"                          
+      "  * strategy = smallest class\n\n"
+      "    - if mim = proportional, then the smallest class size (computed globally) is used for the strategy constant+proportional.\n\n"
+      "    - if mim = equal       , then the smallest class size (computed globally) is used for the strategy constant+equal.\n\n"
+      "    - if mim = custom      , then the smallest class is computed and used for each image separately.\n\n"
+      );
+    SetDocLimitations("None");
+    SetDocAuthors("OTB-Team");
+    SetDocSeeAlso(" ");
+
+    AddDocTag(Tags::Learning);
+
+    AddParameter(ParameterType_InputFilenameList,  "il",   "Input statistics");
+    SetParameterDescription("il", "List of statistics files for each input image.");
+
+    AddParameter(ParameterType_OutputFilename, "out", "Output sampling rates");
+    SetParameterDescription("out","Output filename storing sampling rates (CSV "
+      "format with class name, required samples, total samples, and rate). "
+      "The given filename will be used with a suffix to indicate the "
+      "corresponding input index (for instance: rates.csv will give rates_1.csv"
+      ", rates_2.csv, ...).");
+
+    AddParameter(ParameterType_Choice, "strategy", "Sampling strategy");
+
+    AddChoice("strategy.byclass","Set samples count for each class");
+    SetParameterDescription("strategy.byclass","Set samples count for each class");
+
+    AddParameter(ParameterType_InputFilenameList, "strategy.byclass.in", "Number of samples by class");
+    SetParameterDescription("strategy.byclass.in", "Number of samples by class "
+      "(CSV format with class name in 1st column and required samples in the 2nd)."
+      "In the case of the custom multi-image mode, several inputs may be given for each image.");
+
+    AddChoice("strategy.constant","Set the same samples counts for all classes");
+    SetParameterDescription("strategy.constant","Set the same samples counts for all classes");
+
+    AddParameter(ParameterType_String, "strategy.constant.nb", "Number of samples for all classes");
+    SetParameterDescription("strategy.constant.nb", "Number of samples for all classes."
+      "In the case of the custom multi-image mode, several values can be given for each image.");
+
+    AddChoice("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled");
+    SetParameterDescription("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled");
+
+    AddChoice("strategy.percent","Use a percentage of the samples available for each class");
+    SetParameterDescription("strategy.percent","Use a percentage of the samples available for each class");
+
+    AddParameter(ParameterType_String,"strategy.percent.p","The percentage(s) to use");
+    SetParameterDescription("strategy.percent.p","The percentage(s) to use " "In the case of the custom multi-image mode, several values can be given for each image.");
+
+    AddChoice("strategy.total","Set the total number of samples to generate, and use class proportions.");
+    SetParameterDescription("strategy.total","Set the total number of samples to generate, and use class proportions.");
+
+    AddParameter(ParameterType_String,"strategy.total.v","The number of samples to generate");
+    SetParameterDescription("strategy.total.v","The number of samples to generate" "In the case of the custom multi-image mode, several values can be given for each image.");
+ 
+    AddChoice("strategy.all","Take all samples");
+    SetParameterDescription("strategy.all","Take all samples");
+
+    // Default strategy : smallest
+    SetParameterString("strategy","smallest");
+
+    AddParameter(ParameterType_Choice, "mim", "Multi-Image Mode");
+
+    AddChoice("mim.proportional", "Proportional");
+    SetParameterDescription("mim.proportional","Split proportionally the required number of samples");
+
+    AddChoice("mim.equal", "equal");
+    SetParameterDescription("mim.equal","Split equally the required number of samples");
+
+    AddChoice("mim.custom", "Custom");
+    SetParameterDescription("mim.custom","Split the required number of samples following user choice.");
+
+    // Doc example parameter settings
+    SetDocExampleParameterValue("il", "stats_1.xml stats_2.xml");
+    SetDocExampleParameterValue("out", "rates.csv");
+    SetDocExampleParameterValue("strategy", "smallest");
+    SetDocExampleParameterValue("mim","proportional");
+  }
+
+  void DoUpdateParameters()
+  {
+  }
+
+  void DoExecute()
+    {
+    // Clear state
+    m_CalculatorList->Clear();
+    std::vector<std::string> inputs = this->GetParameterStringList("il");
+    unsigned int nbInputs = inputs.size();
+    XMLReaderType::Pointer statReader = XMLReaderType::New();
+    for (unsigned int i=0 ; i<nbInputs ; i++ )
+      {
+      m_CalculatorList->PushBack(otb::SamplingRateCalculator::New());
+      statReader->SetFileName(inputs[i]);
+      ClassCountMapType classCount = statReader->GetStatisticMapByName<ClassCountMapType>("samplesPerClass");
+      m_CalculatorList->SetNthClassCount(i,classCount);
+      }
+
+    // Cautions : direct mapping between the enum PartitionType and the choice order
+    RateCalculatorListType::PartitionType partitionMode =
+      static_cast<RateCalculatorListType::PartitionType>(this->GetParameterInt("mim"));
+
+    unsigned int minParamSize = 1;
+    if (partitionMode == RateCalculatorListType::CUSTOM)
+      {
+      // Check we have enough inputs for the custom mode
+      minParamSize = nbInputs;
+      }
+    
+    switch (this->GetParameterInt("strategy"))
+      {
+      // byclass
+      case 0:
+        {
+        std::vector<std::string> requiredFiles = this->GetParameterStringList("strategy.byclass.in");
+        std::vector<ClassCountMapType> requiredCounts;
+        if (requiredFiles.size() < minParamSize)
+          {
+          otbAppLogFATAL("Missing arguments in strategy.byclass.in to process sampling rates");
+          }
+        otbAppLogINFO("Sampling strategy : set number of samples for each class");
+        for (unsigned int i=0 ; i<minParamSize ; i++)
+          {
+          requiredCounts.push_back(otb::SamplingRateCalculator::ReadRequiredSamples(requiredFiles[i]));
+          }
+        m_CalculatorList->SetNbOfSamplesByClass(requiredCounts, partitionMode);
+        }
+      break;
+      // constant
+      case 1:
+        {
+        std::vector<itksys::String> parts = itksys::SystemTools::SplitString(this->GetParameterString("strategy.constant.nb"),' ');
+        std::vector<unsigned long> countList;
+        for (unsigned int i=0 ; i<parts.size() ; i++)
+          {
+          if (!parts[i].empty())
+            {
+            std::string::size_type pos1 = parts[i].find_first_not_of(" \t");
+            std::string::size_type pos2 = parts[i].find_last_not_of(" \t");
+            std::string value(parts[i].substr(pos1, pos2 - pos1 + 1));
+            countList.push_back(boost::lexical_cast<unsigned long>(parts[i]));
+            }
+          }
+        if (countList.size() < minParamSize)
+          {
+          otbAppLogFATAL("Missing arguments in strategy.constant.nb to process sampling rates");
+          }
+        otbAppLogINFO("Sampling strategy : set a constant number of samples for all classes");
+        m_CalculatorList->SetNbOfSamplesAllClasses(countList, partitionMode);
+        }
+      break;
+      // percent 
+      case 2:
+        {
+        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++)
+          {
+          if (!parts[i].empty())
+            {
+            std::string::size_type pos1 = parts[i].find_first_not_of(" \t");
+            std::string::size_type pos2 = parts[i].find_last_not_of(" \t");
+            std::string value(parts[i].substr(pos1, pos2 - pos1 + 1));
+            percentList.push_back(boost::lexical_cast<double>(parts[i]));
+
+            if(percentList.back()<0 || percentList.back()>1)
+              {
+              otbAppLogFATAL("Percent parameter should be in range [0,1]");
+              } 
+            }
+          }
+        if (percentList.size() < minParamSize)
+          {
+          otbAppLogFATAL("Missing arguments in strategy.percent.p to process sampling rates");
+          }
+        otbAppLogINFO("Sampling strategy : set a percentage of samples to be used.");
+        m_CalculatorList->SetPercentageOfSamples(percentList, partitionMode);        
+        }
+      break;
+
+      // total
+      case 3:
+        {
+        std::vector<itksys::String> parts = itksys::SystemTools::SplitString(this->GetParameterString("strategy.total.v"),' ');
+        std::vector<unsigned long> totalList;
+        for (unsigned int i=0 ; i<parts.size() ; i++)
+          {
+          if (!parts[i].empty())
+            {
+            std::string::size_type pos1 = parts[i].find_first_not_of(" \t");
+            std::string::size_type pos2 = parts[i].find_last_not_of(" \t");
+            std::string value(parts[i].substr(pos1, pos2 - pos1 + 1));
+            totalList.push_back(boost::lexical_cast<unsigned long>(parts[i]));
+            }
+          }
+        if (totalList.size() < minParamSize)
+          {
+          otbAppLogFATAL("Missing arguments in strategy.total.v to process sampling rates");
+          }
+        otbAppLogINFO("Sampling strategy : set a constant number of samples for all classes");
+        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:
+        {
+        otbAppLogINFO("Sampling strategy : take all samples");
+        m_CalculatorList->SetAllSamples(partitionMode);
+        }
+      break;
+      default:
+        otbAppLogFATAL("Strategy mode unknown :"<<this->GetParameterString("strategy"));
+      break;
+      }
+
+    std::ostringstream oss;    
+    std::string outputPath(this->GetParameterString("out"));
+    std::string outputBase = outputPath.substr(0, outputPath.find_last_of('.'));
+    std::string outputExt = outputPath.substr(outputPath.find_last_of('.'), std::string::npos);
+    unsigned int overflowCount = 0;
+    for (unsigned int i=0 ; i<nbInputs ; i++ )
+      {
+      // Print results
+      oss.str(std::string(""));
+      oss << " className  requiredSamples  totalSamples  rate" << std::endl;
+      MapRateType rates = m_CalculatorList->GetRatesByClass(i);
+      MapRateType::const_iterator itRates = rates.begin();
+      for(; itRates != rates.end(); ++itRates)
+        {
+        otb::SamplingRateCalculator::TripletType tpt = itRates->second;
+        oss << itRates->first << "\t" << tpt.Required << "\t" << tpt.Tot << "\t" << tpt.Rate;
+        if (tpt.Required > tpt.Tot)
+          {
+          overflowCount++;
+          oss << "\t[OVERFLOW]";
+          }
+        oss << std::endl;
+        }
+      otbAppLogINFO("Sampling rates for image "<< i+1 <<" : " << oss.str());
+      // Output results to disk
+      oss.str(std::string(""));
+      oss << outputBase << "_" << i+1 << outputExt;
+      m_CalculatorList->GetNthElement(i)->Write(oss.str());
+      }
+    if (overflowCount)
+      {
+      std::string plural(overflowCount>1?"s":"");
+      otbAppLogWARNING(<< overflowCount << " case"<<plural<<" of overflow detected! (requested number of samples higher than total available samples)");
+      }
+  }
+
+  RateCalculatorListType::Pointer m_CalculatorList;
+};
+
+} // end namespace Wrapper
+} // end namespace otb
+
+OTB_APPLICATION_EXPORT(otb::Wrapper::MultiImageSamplingRate)
diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
index c20c799..a6167fe 100644
--- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
+++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
@@ -149,7 +149,7 @@ private:
     inputGeomSet = GeometriesType::New(vectors);
     reprojVector = otb::ogr::DataSource::New();
     outputGeomSet = GeometriesType::New(reprojVector);
-    // Filter instanciation
+    // Filter instantiation
     geometriesProjFilter = ProjectionFilterType::New();
     geometriesProjFilter->SetInput(inputGeomSet);
     if (imageProjectionRef.empty())
@@ -171,6 +171,7 @@ private:
   filter->SetOGRData(reprojVector);
   filter->SetFieldName(fieldName);
   filter->SetLayerIndex(this->GetParameterInt("layer"));
+  filter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
   AddProcess(filter->GetStreamer(),"Analyse polygons...");
   filter->Update();
diff --git a/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx b/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx
index 440342f..f1cc0f9 100644
--- a/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx
+++ b/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx
@@ -158,7 +158,9 @@ private:
     filter->SetClassFieldName(this->GetParameterString("field"));
     filter->SetOutputFieldPrefix(namePrefix);
     filter->SetOutputFieldNames(nameList);
+    filter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
+    
     AddProcess(filter->GetStreamer(),"Extracting sample values...");
     filter->Update();
     output->SyncToDisk();
diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
index 11654d0..c4472b3 100644
--- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
+++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
@@ -87,27 +87,29 @@ private:
       "The input support image and the input training vectors shall be given in "
       "parameters 'in' and 'vec' respectively. Only the sampling grid (origin, size, spacing)"
       "will be read in the input image.\n"
-      "There are several strategies to select samples (parameter strategy) :\n"
-      "  - smallest (default) : select the same number of sample in each class\n" 
-      "    so that the smallest one is fully sampled.\n"
-      "  - constant : select the same number of samples N in each class\n" 
-      "    (with N below or equal to the size of the smallest class).\n"
-      "  - byclass : set the required number for each class manually, with an input CSV file\n" 
-      "    (first column is class name, second one is the required samples number).\n"
-      "There is also a choice on the sampling type to performs :\n"
+      "There are several strategies to select samples (parameter strategy) : \n\n"
+      "  - smallest (default) : select the same number of sample in each class" 
+      " so that the smallest one is fully sampled.\n"
+      "  - constant : select the same number of samples N in each class" 
+      " (with N below or equal to the size of the smallest class).\n"
+      "  - byclass : set the required number for each class manually, with an input CSV file"
+      " (first column is class name, second one is the required samples number).\n\n"
+      "  - percent: set a target global percentage of samples to use. Class proportions will be respected. \n\n"
+      "  - total: set a target total number of samples to use. Class proportions will be respected. \n\n"
+      "There is also a choice on the sampling type to performs : \n\n"
       "  - periodic : select samples uniformly distributed\n"
-      "  - random : select samples randomly distributed\n"
+      "  - random : select samples randomly distributed\n\n"
       "Once the strategy and type are selected, the application outputs samples positions"
       "(parameter out).\n\n"
       
-      "The other parameters to look at are :\n"
+      "The other parameters to look at are : \n\n"
       "  - layer : index specifying from which layer to pick geometries.\n"
       "  - field : set the field name containing the class.\n"
       "  - mask : an optional raster mask can be used to discard samples.\n"
       "  - outrates : allows outputting a CSV file that summarizes the sampling rates for each class.\n"
       
       "\nAs with the PolygonClassStatistics application, different types  of geometry are supported : "
-      "polygons, lines, points. \nThe behavior of this application is different for each type of geometry :\n"
+      "polygons, lines, points. \nThe behavior of this application is different for each type of geometry : \n\n"
       "  - polygon: select points whose center is inside the polygon\n"
       "  - lines  : select points intersecting the line\n"
       "  - points : select closest point to the provided point\n");
@@ -166,6 +168,23 @@ private:
     AddParameter(ParameterType_Int, "strategy.constant.nb", "Number of samples for all classes");
     SetParameterDescription("strategy.constant.nb", "Number of samples for all classes");
 
+    AddChoice("strategy.percent","Use a percentage of the samples available for each class");
+    SetParameterDescription("strategy.percent","Use a percentage of the samples available for each class");
+
+    AddParameter(ParameterType_Float,"strategy.percent.p","The percentage to use");
+    SetParameterDescription("strategy.percent.p","The percentage to use");
+    SetMinimumParameterFloatValue("strategy.percent.p",0);
+    SetMaximumParameterFloatValue("strategy.percent.p",1);
+    SetDefaultParameterFloat("strategy.percent.p",0.5);
+
+    AddChoice("strategy.total","Set the total number of samples to generate, and use class proportions.");
+    SetParameterDescription("strategy.total","Set the total number of samples to generate, and use class proportions.");
+
+    AddParameter(ParameterType_Int,"strategy.total.v","The number of samples to generate");
+    SetParameterDescription("strategy.total.v","The number of samples to generate");
+    SetMinimumParameterIntValue("strategy.total.v",1);
+    SetDefaultParameterInt("strategy.total.v",1000);
+    
     AddChoice("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled");
     SetParameterDescription("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled");
 
@@ -201,69 +220,16 @@ private:
   {
   }
 
-  ClassCountMapType ReadRequiredSamples(std::string filename)
-    {
-    ClassCountMapType output;
-    std::ifstream ifs(filename.c_str());
-
-    if (ifs)
-      {
-      std::string line;
-      std::string sep("");
-    
-      while(!ifs.eof())
-        {
-        std::getline(ifs,line);
-        if (line.empty()) continue;
-        std::string::size_type pos = line.find_first_not_of(" \t");
-        if (pos != std::string::npos && line[pos] == '#') continue;
-        
-        if (sep.size() == 0)
-          {
-          // Try to detect the separator
-          std::string separators("\t;,");
-          for (unsigned int k=0 ; k<separators.size() ; k++)
-            {
-            std::vector<itksys::String> words = itksys::SystemTools::SplitString(line,separators[k]);
-            if (words.size() >= 2)
-              {
-              sep.push_back(separators[k]);
-              break;
-              }
-            }
-          if (sep.size() == 0) continue;
-          }
-        // parse the line
-        std::vector<itksys::String> parts = itksys::SystemTools::SplitString(line,sep[0]);
-        if (parts.size() >= 2)
-          {
-          std::string::size_type pos1 = parts[0].find_first_not_of(" \t");
-          std::string::size_type pos2 = parts[0].find_last_not_of(" \t");
-          std::string::size_type pos3 = parts[1].find_first_not_of(" \t");
-          std::string::size_type pos4 = parts[1].find_last_not_of(" \t");
-          if (pos1 != std::string::npos && pos3 != std::string::npos)
-            {
-            std::string name = parts[0].substr(pos1, pos2 - pos1 + 1);
-            std::string value = parts[1].substr(pos3, pos4 - pos3 + 1);
-            output[name] = boost::lexical_cast<unsigned long>(value);
-            }
-          }
-        }
-      ifs.close();
-      }
-    else
-      {
-      otbAppLogFATAL(<< " Couldn't open " << filename);
-      }
-    return output;
-    }
-
   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"));
     
     m_ReaderStat->SetFileName(this->GetParameterString("instats"));
     ClassCountMapType classCount = m_ReaderStat->GetStatisticMapByName<ClassCountMapType>("samplesPerClass");
@@ -276,7 +242,7 @@ private:
         {
         otbAppLogINFO("Sampling strategy : set number of samples for each class");
         ClassCountMapType requiredCount = 
-          this->ReadRequiredSamples(this->GetParameterString("strategy.byclass.in"));
+          otb::SamplingRateCalculator::ReadRequiredSamples(this->GetParameterString("strategy.byclass.in"));
         m_RateCalculator->SetNbOfSamplesByClass(requiredCount);
         }
       break;
@@ -287,15 +253,30 @@ private:
         m_RateCalculator->SetNbOfSamplesAllClasses(GetParameterInt("strategy.constant.nb"));
         }
       break;
-      // smallest class
+      // percent
       case 2:
+      {
+      otbAppLogINFO("Sampling strategy: set a percentage of samples for each class.");
+      m_RateCalculator->SetPercentageOfSamples(this->GetParameterFloat("strategy.percent.p"));
+      }
+      break;
+      // total
+      case 3:
+      {
+      otbAppLogINFO("Sampling strategy: set the total number of samples to generate, use classes proportions.");
+      m_RateCalculator->SetTotalNumberOfSamples(this->GetParameterInt("strategy.total.v"));
+      }
+      break;
+
+      // smallest class
+      case 4:
         {
         otbAppLogINFO("Sampling strategy : fit the number of samples based on the smallest class");
         m_RateCalculator->SetMinimumNbOfSamplesByClass();
         }
       break;
       // all samples
-      case 3:
+      case 5:
         {
         otbAppLogINFO("Sampling strategy : take all samples");
         m_RateCalculator->SetAllSamples();
@@ -315,12 +296,24 @@ private:
     std::ostringstream oss;
     oss << " className  requiredSamples  totalSamples  rate" << std::endl;
     MapRateType::const_iterator itRates = rates.begin();
+    unsigned int overflowCount = 0;
     for(; itRates != rates.end(); ++itRates)
       {
       otb::SamplingRateCalculator::TripletType tpt = itRates->second;
-      oss << itRates->first << "\t" << tpt.Required << "\t" << tpt.Tot << "\t" << tpt.Rate << std::endl;
+      oss << itRates->first << "\t" << tpt.Required << "\t" << tpt.Tot << "\t" << tpt.Rate;
+      if (tpt.Required > tpt.Tot)
+        {
+        overflowCount++;
+        oss << "\t[OVERFLOW]";
+        }
+      oss << std::endl;
       }
     otbAppLogINFO("Sampling rates : " << oss.str());
+    if (overflowCount)
+      {
+      std::string plural(overflowCount>1?"s":"");
+      otbAppLogWARNING(<< overflowCount << " case"<<plural<<" of overflow detected! (requested number of samples higher than total available samples)");
+      }
 
     // Open input geometries
     otb::ogr::DataSource::Pointer vectors =
@@ -350,7 +343,7 @@ private:
       inputGeomSet = GeometriesType::New(vectors);
       reprojVector = otb::ogr::DataSource::New();
       outputGeomSet = GeometriesType::New(reprojVector);
-      // Filter instanciation
+      // Filter instantiation
       geometriesProjFilter = ProjectionFilterType::New();
       geometriesProjFilter->SetInput(inputGeomSet);
       if (imageProjectionRef.empty())
diff --git a/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx
index 87d80a7..932454f 100644
--- a/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx
@@ -120,8 +120,8 @@ void DoInit() ITK_OVERRIDE
     "validation sets per class and per image.\n Several classifier parameters can be set depending on the chosen classifier. In the "
     "validation process, the confusion matrix is organized the following way: rows = reference labels, columns = produced labels. "
     "In the header of the optional confusion matrix output file, the validation (reference) and predicted (produced) class labels"
-    " are ordered according to the rows/columns of the confusion matrix.\n This application is based on LibSVM and on OpenCV Machine Learning "
-    "classifiers, and is compatible with OpenCV 2.3.1 and later.");
+    " are ordered according to the rows/columns of the confusion matrix.\n This application is based on LibSVM and OpenCV Machine Learning "
+    "(2.3.1 and later).");
   SetDocLimitations("None");
   SetDocAuthors("OTB-Team");
   SetDocSeeAlso("OpenCV documentation for machine learning http://docs.opencv.org/modules/ml/doc/ml.html ");
diff --git a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
index ee4c3a8..09edbc6 100644
--- a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx
@@ -92,7 +92,7 @@ private:
     AddParameter(ParameterType_Group, "io", "Input and output data");
     SetParameterDescription("io", "This group of parameters allows setting input and output data.");
 
-    AddParameter(ParameterType_InputVectorData, "io.vd", "Input Vector Data");
+    AddParameter(ParameterType_InputVectorDataList, "io.vd", "Input Vector Data");
     SetParameterDescription("io.vd", "Input geometries used for training (note : all geometries from the layer will be used)");
 
     AddParameter(ParameterType_InputFilename, "io.stats", "Input XML image statistics file");
@@ -122,7 +122,7 @@ private:
     AddParameter(ParameterType_Group, "valid", "Validation data");
     SetParameterDescription("valid", "This group of parameters defines validation data.");
 
-    AddParameter(ParameterType_InputVectorData, "valid.vd", "Validation Vector Data");
+    AddParameter(ParameterType_InputVectorDataList, "valid.vd", "Validation Vector Data");
     SetParameterDescription("valid.vd", "Geometries used for validation "
       "(must contain the same fields used for training, all geometries from the layer will be used)");
     MandatoryOff("valid.vd");
@@ -148,9 +148,9 @@ private:
   {
     if ( HasValue("io.vd") )
       {
-      std::string vectorFile = GetParameterString("io.vd");
+      std::vector<std::string> vectorFileList = GetParameterStringList("io.vd");
       ogr::DataSource::Pointer ogrDS =
-        ogr::DataSource::New(vectorFile, ogr::DataSource::Modes::Read);
+        ogr::DataSource::New(vectorFileList[0], ogr::DataSource::Modes::Read);
       ogr::Layer layer = ogrDS->GetLayer(this->GetParameterInt("layer"));
       ogr::Feature feature = layer.ogr().GetNextFeature();
 
@@ -242,13 +242,30 @@ void LogConfusionMatrix(ConfusionMatrixCalculatorType* confMatCalc)
 
 void DoExecute()
   {
-  std::string shapefile = GetParameterString("io.vd");
-  std::string modelfile = GetParameterString("io.out");
   typedef int LabelPixelType;
   typedef itk::FixedArray<LabelPixelType,1> LabelSampleType;
   typedef itk::Statistics::ListSample <LabelSampleType> LabelListSampleType;
 
-  const int nbFeatures = GetSelectedItems("feat").size();
+  // Prepare selected field names (their position may change between two inputs)
+  std::vector<int> selectedIdx = GetSelectedItems("feat");
+  const unsigned int nbFeatures = selectedIdx.size();
+  std::vector<std::string> fieldNames = GetChoiceNames("feat");
+  std::vector<std::string> selectedNames(nbFeatures);
+  for (unsigned int i=0 ; i<nbFeatures ; i++)
+    {
+    selectedNames[i] = fieldNames[selectedIdx[i]];
+    }
+  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;
@@ -269,50 +286,55 @@ void DoExecute()
     stddevMeasurementVector.Fill(1.);
     }
 
-  ogr::DataSource::Pointer source = ogr::DataSource::New(shapefile, ogr::DataSource::Modes::Read);
-  ogr::Layer layer = source->GetLayer(this->GetParameterInt("layer"));
-  ogr::Feature feature = layer.ogr().GetNextFeature();
-  bool goesOn = feature.addr() != 0;
-
   ListSampleType::Pointer input = ListSampleType::New();
   LabelListSampleType::Pointer target = LabelListSampleType::New();
   input->SetMeasurementVectorSize(nbFeatures);
 
-  int cFieldIndex=-1;
-  std::vector<int> featureFieldIndex = GetSelectedItems("feat");
-  if (feature.addr())
+  std::vector<std::string> vectorFileList = GetParameterStringList("io.vd");
+  for (unsigned int k=0 ; k<vectorFileList.size() ; k++)
     {
-    cFieldIndex = feature.ogr().GetFieldIndex(GetParameterString("cfield").c_str());
-    }
+    otbAppLogINFO("Reading input vector file "<<k+1<<"/"<<vectorFileList.size());
+    ogr::DataSource::Pointer source = ogr::DataSource::New(vectorFileList[k], ogr::DataSource::Modes::Read);
+    ogr::Layer layer = source->GetLayer(this->GetParameterInt("layer"));
+    ogr::Feature feature = layer.ogr().GetNextFeature();
+    bool goesOn = feature.addr() != 0;
+    if (!goesOn)
+      {
+      otbAppLogWARNING("The layer "<<GetParameterInt("layer")<<" of "
+        <<vectorFileList[k]<<" is empty, input is skipped.");
+      continue;
+      }
 
-  // Check that the class field exists
-  if (cFieldIndex < 0)
-    {
-    std::ostringstream oss;
-    std::vector<std::string> names = GetChoiceNames("feat");
-    for (unsigned int i=0 ; i<names.size() ; i++)
+    // Check all needed fields are present :
+    //   - check class field
+    cFieldIndex = feature.ogr().GetFieldIndex(GetParameterString("cfield").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);
+    //   - check feature fields
+    for (unsigned int i=0 ; i<nbFeatures ; i++)
       {
-      if (i) oss << ", ";
-      oss << names[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);
       }
-    otbAppLogFATAL("The field name for class label ("<<GetParameterString("cfield")
-      <<") has not been found in the input vector file! Choices are "<< oss.str());
-    }
 
-  while(goesOn)
-    {
-    if(feature.ogr().IsFieldSet(cFieldIndex))
+    while(goesOn)
       {
-      MeasurementType mv;
-      mv.SetSize(nbFeatures);
-      for(int idx=0; idx < nbFeatures; ++idx)
-        mv[idx] = feature.ogr().GetFieldAsDouble(featureFieldIndex[idx]);
+      if(feature.ogr().IsFieldSet(cFieldIndex))
+        {
+        MeasurementType mv;
+        mv.SetSize(nbFeatures);
+        for(unsigned int idx=0; idx < nbFeatures; ++idx)
+          mv[idx] = feature.ogr().GetFieldAsDouble(featureFieldIndex[idx]);
 
-      input->PushBack(mv);
-      target->PushBack(feature.ogr().GetFieldAsInteger(cFieldIndex));
+        input->PushBack(mv);
+        target->PushBack(feature.ogr().GetFieldAsInteger(cFieldIndex));
+        }
+      feature = layer.ogr().GetNextFeature();
+      goesOn = feature.addr() != 0;
       }
-    feature = layer.ogr().GetNextFeature();
-    goesOn = feature.addr() != 0;
     }
 
   ShiftScaleFilterType::Pointer trainingShiftScaleFilter = ShiftScaleFilterType::New();
@@ -321,14 +343,8 @@ void DoExecute()
   trainingShiftScaleFilter->SetScales(stddevMeasurementVector);
   trainingShiftScaleFilter->Update();
 
-  ListSampleType::Pointer listSample;
-  LabelListSampleType::Pointer labelListSample;
-
-  listSample = trainingShiftScaleFilter->GetOutput();
-  labelListSample = target;
-
-  ListSampleType::Pointer trainingListSample = listSample;
-  LabelListSampleType::Pointer trainingLabeledListSample = labelListSample;
+  ListSampleType::Pointer trainingListSample= trainingShiftScaleFilter->GetOutput();
+  TargetListSampleType::Pointer trainingLabeledListSample = target;
 
   //--------------------------
   // Estimate model
@@ -344,34 +360,55 @@ void DoExecute()
   // Import validation data
   if (HasValue("valid.vd") && IsParameterEnabled("valid.vd"))
     {
-    std::string validFile = this->GetParameterString("valid.vd");
-    source = ogr::DataSource::New(validFile, ogr::DataSource::Modes::Read);
-    layer = source->GetLayer(this->GetParameterInt("valid.layer"));
-    feature = layer.ogr().GetNextFeature();
-    goesOn = feature.addr() != 0;
-
-    // find usefull field indexes
-
-    // TODO : detect corresponding indexes in validation data set, for the moment
-    // Assume they have the same fields, in the same order.
-
     input = ListSampleType::New();
     target = LabelListSampleType::New();
     input->SetMeasurementVectorSize(nbFeatures);
-    while(goesOn)
+
+    std::vector<std::string> validFileList = this->GetParameterStringList("valid.vd");
+    for (unsigned int k=0 ; k<validFileList.size() ; k++)
       {
-      if(feature.ogr().IsFieldSet(cFieldIndex))
+      otbAppLogINFO("Reading validation vector file "<<k+1<<"/"<<validFileList.size());
+      ogr::DataSource::Pointer source = ogr::DataSource::New(validFileList[k], ogr::DataSource::Modes::Read);
+      ogr::Layer layer = source->GetLayer(this->GetParameterInt("valid.layer"));
+      ogr::Feature feature = layer.ogr().GetNextFeature();
+      bool goesOn = feature.addr() != 0;
+      if (!goesOn)
         {
-        MeasurementType mv;
-        mv.SetSize(nbFeatures);
-        for(int idx=0; idx < nbFeatures; ++idx)
-          mv[idx] = feature.ogr().GetFieldAsDouble(featureFieldIndex[idx]);
+        otbAppLogWARNING("The layer "<<GetParameterInt("valid.layer")<<" of "
+          <<validFileList[k]<<" is empty, input is skipped.");
+        continue;
+        }
 
-        input->PushBack(mv);
-        target->PushBack(feature.ogr().GetFieldAsInteger(cFieldIndex));
+      // Check all needed fields are present :
+      //   - check class field
+      cFieldIndex = feature.ogr().GetFieldIndex(GetParameterString("cfield").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);
+      //   - 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);
+        }
+
+      while(goesOn)
+        {
+        if(feature.ogr().IsFieldSet(cFieldIndex))
+          {
+          MeasurementType mv;
+          mv.SetSize(nbFeatures);
+          for(unsigned int idx=0; idx < nbFeatures; ++idx)
+            mv[idx] = feature.ogr().GetFieldAsDouble(featureFieldIndex[idx]);
+
+          input->PushBack(mv);
+          target->PushBack(feature.ogr().GetFieldAsInteger(cFieldIndex));
+          }
+        feature = layer.ogr().GetNextFeature();
+        goesOn = feature.addr() != 0;
         }
-      feature = layer.ogr().GetNextFeature();
-      goesOn = feature.addr() != 0;
       }
 
     ShiftScaleFilterType::Pointer validShiftScaleFilter = ShiftScaleFilterType::New();
diff --git a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.h b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.h
index aaeb2e2..6fd04d0 100644
--- a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.h
+++ b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.h
@@ -31,22 +31,26 @@
 #include "otbMachineLearningModelFactory.h"
 
 #ifdef OTB_USE_OPENCV
-# include "otbKNearestNeighborsMachineLearningModel.h"
-# include "otbRandomForestsMachineLearningModel.h"
+#include "otbKNearestNeighborsMachineLearningModel.h"
+#include "otbRandomForestsMachineLearningModel.h"
 // OpenCV SVM implementation is buggy with linear kernel
 // Users should use the libSVM implementation instead.
-//# include "otbSVMMachineLearningModel.h"
-# include "otbBoostMachineLearningModel.h"
-# include "otbDecisionTreeMachineLearningModel.h"
-# include "otbGradientBoostedTreeMachineLearningModel.h"
-# include "otbNormalBayesMachineLearningModel.h"
-# include "otbNeuralNetworkMachineLearningModel.h"
+//#include "otbSVMMachineLearningModel.h"
+#include "otbBoostMachineLearningModel.h"
+#include "otbDecisionTreeMachineLearningModel.h"
+#include "otbGradientBoostedTreeMachineLearningModel.h"
+#include "otbNormalBayesMachineLearningModel.h"
+#include "otbNeuralNetworkMachineLearningModel.h"
 #endif
 
 #ifdef OTB_USE_LIBSVM 
 #include "otbLibSVMMachineLearningModel.h"
 #endif
 
+#ifdef OTB_USE_SHARK
+#include "otbSharkRandomForestsMachineLearningModel.h"
+#endif
+
 namespace otb
 {
 namespace Wrapper
@@ -62,11 +66,12 @@ namespace Wrapper
  * methods. The classes derived from LearningApplicationBase only need these
  * 3 methods to handle the machine learning model.
  *
- * There are multiple machine learning models in OTB, some imported from OpenCV,
- * and one imported from LibSVM. They all have different parameters. The
- * purpose of this class is to handle the creation of all parameters related to
- * machine learning models (in DoInit() ), and to dispatch the calls to
- * specific train functions in function Train().
+ * There are multiple machine learning models in OTB, some imported
+ * from OpenCV and one imported from LibSVM. They all have
+ * different parameters. The purpose of this class is to handle the
+ * creation of all parameters related to machine learning models (in
+ * DoInit() ), and to dispatch the calls to specific train functions
+ * in function Train().
  *
  * This class is templated over scalar types for input and output values.
  * Typically, the input value type will be either float of double. The choice
@@ -131,7 +136,11 @@ public:
 #ifdef OTB_USE_LIBSVM 
   typedef otb::LibSVMMachineLearningModel<InputValueType, OutputValueType> LibSVMType;
 #endif
- 
+
+#ifdef OTB_USE_SHARK
+  typedef otb::SharkRandomForestsMachineLearningModel<InputValueType, OutputValueType> SharkRandomForestType;
+#endif
+  
 protected:
   LearningApplicationBase();
 
@@ -206,6 +215,13 @@ private:
                 typename TargetListSampleType::Pointer trainingLabeledListSample,
                 std::string modelPath);
 #endif
+
+#ifdef OTB_USE_SHARK
+  void InitSharkRandomForestsParams();
+  void TrainSharkRandomForests(typename ListSampleType::Pointer trainingListSample,
+                               typename TargetListSampleType::Pointer trainingLabeledListSample,
+                               std::string modelPath);
+#endif
   //@}
 };
 
@@ -229,6 +245,9 @@ private:
 #ifdef OTB_USE_LIBSVM
 #include "otbTrainLibSVM.txx"
 #endif
+#ifdef OTB_USE_SHARK
+#include "otbTrainSharkRandomForests.txx"
+#endif
 #endif
 
 #endif
diff --git a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.txx b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.txx
index d92296f..bf110c8 100644
--- a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.txx
+++ b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.txx
@@ -73,6 +73,11 @@ LearningApplicationBase<TInputValue,TOutputValue>
   InitRandomForestsParams();
   InitKNNParams();
 #endif
+
+#ifdef OTB_USE_SHARK
+  InitSharkRandomForestsParams();
+#endif
+  
 }
 
 template <class TInputValue, class TOutputValue>
@@ -134,6 +139,15 @@ LearningApplicationBase<TInputValue,TOutputValue>
     otbAppLogFATAL("Module LIBSVM is not installed. You should consider turning OTB_USE_LIBSVM on during cmake configuration.");
     #endif
     }
+  if(modelName == "sharkrf")
+    {
+    #ifdef OTB_USE_SHARK
+    TrainSharkRandomForests(trainingListSample,trainingLabeledListSample,modelPath);
+    #else
+    otbAppLogFATAL("Module SharkLearning is not installed. You should consider turning OTB_USE_SHARK on during cmake configuration.");
+    #endif
+    }
+  
   // OpenCV SVM implementation is buggy with linear kernel
   // Users should use the libSVM implementation instead.
   // else if (modelName == "svm")
@@ -200,6 +214,7 @@ LearningApplicationBase<TInputValue,TOutputValue>
     otbAppLogFATAL("Module OPENCV is not installed. You should consider turning OTB_USE_OPENCV on during cmake configuration.");
     #endif
     }
+
   // update reporter
   dummyFilter->UpdateProgress(1.0f);
   dummyFilter->InvokeEvent(itk::EndEvent());
diff --git a/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx b/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx
new file mode 100644
index 0000000..c9b2d56
--- /dev/null
+++ b/Modules/Applications/AppClassification/include/otbTrainSharkRandomForests.txx
@@ -0,0 +1,98 @@
+/*=========================================================================
+ 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 otbTrainSharkRandomForests_txx
+#define otbTrainSharkRandomForests_txx
+
+#include "otbLearningApplicationBase.h"
+
+namespace otb
+{
+namespace Wrapper
+{
+
+template <class TInputValue, class TOutputValue>
+void
+LearningApplicationBase<TInputValue,TOutputValue>
+::InitSharkRandomForestsParams()
+{
+
+
+  AddChoice("classifier.sharkrf", "Shark Random forests classifier");
+  SetParameterDescription("classifier.sharkrf",
+                          "This group of parameters allows setting Shark Random Forests classifier parameters. "
+                          "See complete documentation here \\url{http://image.diku.dk/shark/doxygen_pages/html/classshark_1_1_r_f_trainer.html}.\n It is noteworthy that training is parallel.");
+  //MaxNumberOfTrees
+  AddParameter(ParameterType_Int, "classifier.sharkrf.nbtrees",
+               "Maximum number of trees in the forest");
+  SetParameterInt("classifier.sharkrf.nbtrees", 100);
+  SetParameterDescription(
+    "classifier.sharkrf.nbtrees",
+    "The maximum number of trees in the forest. Typically, the more trees you have, the better the accuracy. "
+    "However, the improvement in accuracy generally diminishes and reaches an asymptote for a certain number of trees. "
+    "Also to keep in mind, increasing the number of trees increases the prediction time linearly.");
+  
+  
+  //NodeSize
+  AddParameter(ParameterType_Int, "classifier.sharkrf.nodesize", "Min size of the node for a split");
+  SetParameterInt("classifier.sharkrf.nodesize", 25);
+  SetParameterDescription(
+    "classifier.sharkrf.nodesize",
+    "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.");
+
+  //MTry
+  AddParameter(ParameterType_Int, "classifier.sharkrf.mtry", "Number of features tested at each node");
+  SetParameterInt("classifier.sharkrf.mtry", 0);
+  SetParameterDescription(
+    "classifier.sharkrf.mtry",
+    "The number of features (variables) which will be tested at each node in "
+    "order to compute the split. If set to zero, the square root of the number of "
+    "features is used.");
+
+
+  //OOB Ratio
+  AddParameter(ParameterType_Float, "classifier.sharkrf.oobr", "Out of bound ratio");
+  SetParameterFloat("classifier.sharkrf.oobr", 0.66);
+  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. ");
+}
+
+template <class TInputValue, class TOutputValue>
+void
+LearningApplicationBase<TInputValue,TOutputValue>
+::TrainSharkRandomForests(typename ListSampleType::Pointer trainingListSample,
+                          typename TargetListSampleType::Pointer trainingLabeledListSample,
+                          std::string modelPath)
+{
+  typename SharkRandomForestType::Pointer classifier = SharkRandomForestType::New();
+  classifier->SetRegressionMode(this->m_RegressionFlag);
+  classifier->SetInputListSample(trainingListSample);
+  classifier->SetTargetListSample(trainingLabeledListSample);
+  classifier->SetNodeSize(GetParameterInt("classifier.sharkrf.nodesize"));
+  classifier->SetOobRatio(GetParameterFloat("classifier.sharkrf.oobr"));
+  classifier->SetNumberOfTrees(GetParameterInt("classifier.sharkrf.nbtrees"));
+  classifier->SetMTry(GetParameterInt("classifier.sharkrf.mtry"));
+
+  classifier->Train();
+  classifier->Save(modelPath);
+}
+
+} //end namespace wrapper
+} //end namespace otb
+
+#endif
diff --git a/Modules/Applications/AppClassification/test/CMakeLists.txt b/Modules/Applications/AppClassification/test/CMakeLists.txt
index 3d804e3..451c17e 100644
--- a/Modules/Applications/AppClassification/test/CMakeLists.txt
+++ b/Modules/Applications/AppClassification/test/CMakeLists.txt
@@ -75,6 +75,7 @@ set(ann_output_format ".ann")
 set(bayes_output_format ".bayes")
 set(rf_output_format ".rf")
 set(knn_output_format ".knn")
+set(sharkrf_output_format ".txt")
 
 # Training algorithms parameters
 set(libsvm_parameters "-classifier.libsvm.opt" "true" "-classifier.libsvm.prob" "true")
@@ -86,9 +87,10 @@ set(ann_parameters "-classifier.ann.sizes" "100")
 set(bayes_parameters "")
 set(rf_parameters "")
 set(knn_parameters "")
+set(sharkrf_parameters "")
 
 # Validation depending on mode
-set(ascii_comparison --compare-ascii ${NOTOL})
+set(ascii_comparison --compare-ascii ${EPSILON_6})
 set(raster_comparison --compare-image ${NOTOL})
 set(raster_comparison_two --compare-n-images ${NOTOL} 2)
 
@@ -104,8 +106,16 @@ if(OTB_USE_OPENCV)
   #list(APPEND classifierList "SVM" "BOOST" "DT" "GBT" "ANN" "BAYES" "RF" "KNN")
   list(APPEND classifierList "BOOST" "DT" "GBT" "ANN" "BAYES" "RF" "KNN")
 endif()
+if(OTB_USE_SHARK)
+  list(APPEND classifierList "SHARKRF")
+endif()
+
 set(classifier_with_confmap "LIBSVM" "BOOST" "KNN" "ANN" "RF")
 
+# This is a black list for classifier that can not have a baseline
+# because they are using randomness and seed can not be set
+set(classifier_without_baseline "SHARKRF")
+
 # Loop on classifiers
 foreach(classifier ${classifierList})
   string(TOLOWER ${classifier} lclassifier)
@@ -115,6 +125,13 @@ foreach(classifier ${classifierList})
   set(OUTRASTER cl${classifier}LabeledImageQB1${raster_output_format})
   set(OUTCONFMAP cl${classifier}ConfidenceMapQB1${raster_output_format})
 
+  list(FIND classifier_without_baseline ${classifier} _classifier_has_baseline)
+  if(${_classifier_has_baseline} EQUAL -1)
+    set(valid ${ascii_comparison} ${ascii_ref_path}/${OUTMODELFILE} ${TEMP}/${OUTMODELFILE})
+  else()
+    set(valid "")
+  endif()
+  
   otb_test_application(
                        NAME     apTvClTrainMethod${classifier}ImagesClassifierQB1
                        APP      TrainImagesClassifier
@@ -126,11 +143,15 @@ foreach(classifier ${classifierList})
                                 -io.out ${TEMP}/${OUTMODELFILE}
                                 -rand 121212
 
-                       VALID    ${ascii_comparison}
-                                ${ascii_ref_path}/${OUTMODELFILE}
-                                ${TEMP}/${OUTMODELFILE}
+                       VALID    ${valid}
                        )
 
+  if(${_classifier_has_baseline} EQUAL -1)
+    set(valid ${ascii_comparison} ${ascii_ref_path}/${OUTMODELFILE} ${TEMP}/OutXML1_${OUTMODELFILE})
+  else()
+    set(valid "")
+  endif()
+
   otb_test_application(
                        NAME     apTvClTrainMethod${classifier}ImagesClassifierQB1_OutXML1
                        APP      TrainImagesClassifier
@@ -143,11 +164,15 @@ foreach(classifier ${classifierList})
                                 -rand 121212
                                 -outxml ${TEMP}/cl${classifier}_OutXML1.xml
 
-                       VALID    ${ascii_comparison}
-                                ${ascii_ref_path}/${OUTMODELFILE}
-                                ${TEMP}/OutXML1_${OUTMODELFILE}
+                       VALID ${valid}
                        )
 
+  if(${_classifier_has_baseline} EQUAL -1)
+    set(valid ${ascii_comparison} ${ascii_ref_path}/${OUTMODELFILE} ${TEMP}/OutXML2_${OUTMODELFILE})
+  else()
+    set(valid "")
+  endif()
+
   otb_test_application(
                        NAME     apTvClTrainMethod${classifier}ImagesClassifierQB1_InXML1
                        APP      TrainImagesClassifier
@@ -157,9 +182,7 @@ foreach(classifier ${classifierList})
                                 -io.imstat ${INPUTDATA}/Classification/clImageStatisticsQB1${stat_input_format}
                                 -io.out ${TEMP}/OutXML2_${OUTMODELFILE}
 
-                       VALID    ${ascii_comparison}
-                                ${ascii_ref_path}/${OUTMODELFILE}
-                                ${TEMP}/OutXML2_${OUTMODELFILE}
+                       VALID    ${valid}
                        )
 
                      #set_tests_properties(apTvClTrainMethod${classifier}ImagesClassifierQB1_InXML1 PROPERTIES DEPENDS apTvClTrainMethod${classifier}ImagesClassifierQB1_OutXML1)
@@ -627,7 +650,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt_InXML
                               -classifier.libsvm.opt true
                               -rand 121212
                               -io.out ${TEMP}/clsvmModelQB1_allOpt_InXML.svm
-                      VALID   --compare-ascii ${NOTOL}
+                      VALID   ${ascii_comparison}
                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB1.svm
                               ${TEMP}/clsvmModelQB1_allOpt_InXML.svm)
 
@@ -641,7 +664,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_OutXML
                               -io.out ${TEMP}/clsvmModelQB1_OutXML.svm
                               -rand 121212
                               -outxml ${TEMP}/clsvmModelQB1_OutXML.xml
-                      VALID   --compare-ascii ${NOTOL}
+                      VALID   ${ascii_comparison}
                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB1.svm
                               ${TEMP}/clsvmModelQB1_OutXML.svm)
 
@@ -657,10 +680,11 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_OutXML
                                -classifier libsvm
                                -classifier.libsvm.opt true
                                -io.out ${TEMP}/clsvmModelQB123.svm
-                               -rand 121212
-                       VALID   --compare-ascii ${NOTOL}
-                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB123.svm
-                               ${TEMP}/clsvmModelQB123.svm)
+                               -rand 121212)
+# RK: 09/2016. same reason explained for leTvSVMImageModelEstimatorTrainWithOptimization test
+#                       VALID   --compare-ascii ${NOTOL}
+#                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB123.svm
+#                               ${TEMP}/clsvmModelQB123.svm
 
 otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1
                       APP  TrainImagesClassifier
@@ -671,7 +695,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1
                               -classifier.libsvm.opt true
                               -io.out ${TEMP}/clsvmModelQB1.svm
                               -rand 121212
-                      VALID   --compare-ascii ${NOTOL}
+                      VALID   ${ascii_comparison}
                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB1.svm
                               ${TEMP}/clsvmModelQB1.svm)
 
@@ -687,10 +711,12 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1
                                -classifier libsvm
                                -classifier.libsvm.opt true
                                -io.out ${TEMP}/clsvmModelQB456.svm
-                               -rand 121212
-                       VALID   --compare-ascii ${NOTOL}
-                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB456.svm
-                               ${TEMP}/clsvmModelQB456.svm)
+                               -rand 121212)
+
+# RK: 09/2016. same reason explained for leTvSVMImageModelEstimatorTrainWithOptimization test
+#                       VALID   --compare-ascii ${NOTOL}
+#                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB456.svm
+#                               ${TEMP}/clsvmModelQB456.svm
 
 otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt
                       APP  TrainImagesClassifier
@@ -704,7 +730,7 @@ otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt
                               -classifier.libsvm.opt true
                               -rand 121212
                               -io.out ${TEMP}/clsvmModelQB1_allOpt.svm
-                      VALID   --compare-ascii ${NOTOL}
+                      VALID   ${ascii_comparison}
                               ${OTBAPP_BASELINE_FILES}/clsvmModelQB1.svm
                               ${TEMP}/clsvmModelQB1_allOpt.svm)
 endif()
@@ -826,7 +852,7 @@ otb_test_application(NAME apTvClTrainRegressionTest_monovar
                              -classifier.rf.ra 0.0001
                              -classifier.rf.max 6
                              -classifier.rf.acc 0.0005
-                    VALID    --compare-ascii ${NOTOL}
+                    VALID    ${ascii_comparison}
                              ${OTBAPP_BASELINE_FILES}/apTvClTrainRegressionTest_monovar.rf
                              ${TEMP}/apTvClTrainRegressionTest_monovar.rf)
 
@@ -891,7 +917,27 @@ if(OTB_USE_OPENCV)
     -classifier rf
     -io.confmatout ${TEMP}/apTvClTrainVectorClassifierConfMat.txt
     -io.out ${TEMP}/apTvClTrainVectorClassifierModel.rf
-    VALID   --compare-ascii ${NOTOL}
+    VALID   ${ascii_comparison}
     ${OTBAPP_BASELINE_FILES}/apTvClTrainVectorClassifierModel.rf
     ${TEMP}/apTvClTrainVectorClassifierModel.rf)
-endif()
\ No newline at end of file
+endif()
+
+#------------ MultiImageSamplingRate TESTS ----------------
+otb_test_application(
+  NAME apTvClMultiImageSamplingRate
+  APP MultiImageSamplingRate
+  OPTIONS -il ${INPUTDATA}/Classification/vector_stats_QB1.xml
+  ${INPUTDATA}/Classification/vector_stats_QB2.xml
+  ${INPUTDATA}/Classification/vector_stats_QB3.xml
+  -out ${TEMP}/apTvClMultiImageSamplingRate_out.csv
+  -strategy constant
+  -strategy.constant.nb "300"
+  -mim proportional
+  VALID   --compare-n-ascii ${NOTOL} 3
+  ${OTBAPP_BASELINE_FILES}/apTvClMultiImageSamplingRate_out_1.csv
+  ${TEMP}/apTvClMultiImageSamplingRate_out_1.csv
+  ${OTBAPP_BASELINE_FILES}/apTvClMultiImageSamplingRate_out_2.csv
+  ${TEMP}/apTvClMultiImageSamplingRate_out_2.csv
+  ${OTBAPP_BASELINE_FILES}/apTvClMultiImageSamplingRate_out_3.csv
+  ${TEMP}/apTvClMultiImageSamplingRate_out_3.csv
+  )
diff --git a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx
index d0089f6..7ea322b 100644
--- a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx
+++ b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx
@@ -83,7 +83,7 @@ private:
     SetDocName("Homologous points extraction");
     SetDescription("Compute homologous points between images using keypoints");
     SetDocLongDescription("This application allows computing homologous points between images using keypoints. "
-      " SIFT or SURF keypoints can be used and the band on which keypoints are computed can be set independantly for both images."
+      " SIFT or SURF keypoints can be used and the band on which keypoints are computed can be set independently for both images."
       " The application offers two modes :"
       " the first is the full mode where keypoints are extracted from the full extent of both images"
       " (please note that in this mode large image file are not supported). "
@@ -143,7 +143,7 @@ private:
     SetParameterDescription("mode.full","Extract and match all keypoints, loading both images entirely into memory");
 
     AddChoice("mode.geobins","Search keypoints in small spatial bins regularly spread across first image");
-    SetParameterDescription("mode.geobins","This method allows retrieving a set of tie points regulary spread across image 1. Corresponding bins in image 2 are retrieved using sensor and geographical information if available. The first bin position takes into account the margin parameter. Bins are cropped to the largest image region shrinked by the margin parameter for both in1 and in2 images.");
+    SetParameterDescription("mode.geobins","This method allows retrieving a set of tie points regulary spread across image 1. Corresponding bins in image 2 are retrieved using sensor and geographical information if available. The first bin position takes into account the margin parameter. Bins are cropped to the largest image region shrunk by the margin parameter for both in1 and in2 images.");
 
     AddParameter(ParameterType_Int,"mode.geobins.binsize","Size of bin");
     SetParameterDescription("mode.geobins.binsize","Radius of the spatial bin in pixels");
@@ -361,9 +361,9 @@ private:
     // Setup the DEM Handler
     otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
 
-    rsTransform->InstanciateTransform();
-    rsTransform1ToWGS84->InstanciateTransform();
-    rsTransform2ToWGS84->InstanciateTransform();
+    rsTransform->InstantiateTransform();
+    rsTransform1ToWGS84->InstantiateTransform();
+    rsTransform2ToWGS84->InstantiateTransform();
 
 
     if(GetParameterString("mode")=="full")
diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
index 06e07d0..2359b00 100644
--- a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
+++ b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
@@ -169,6 +169,8 @@ private:
     SetParameterDescription("outmatrix", "Filename to store the transformation matrix (csv format)");
     MandatoryOff("outmatrix");
 
+    AddRAMParameter();
+
     // Doc example parameter settings
     SetDocExampleParameterValue("in", "cupriteSubHsi.tif");
     SetDocExampleParameterValue("out", "FilterOutput.tif");
@@ -420,7 +422,8 @@ private:
 
       m_MinMaxFilter = MinMaxFilterType::New();
       m_MinMaxFilter->SetInput(m_ForwardFilter->GetOutput());
-      m_MinMaxFilter->GetStreamer()->SetNumberOfLinesStrippedStreaming(50);
+      //m_MinMaxFilter->GetStreamer()->SetNumberOfLinesStrippedStreaming(50);
+      m_MinMaxFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
       AddProcess(m_MinMaxFilter->GetStreamer(), "Min/Max computing");
       m_MinMaxFilter->Update();
diff --git a/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx b/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx
index 4212104..e1f303b 100644
--- a/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx
+++ b/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx
@@ -77,6 +77,8 @@ private:
     SetParameterDescription("norescale","By default, the input image amplitude is rescaled between [0,255]. Turn on this parameter to skip rescaling");
     MandatoryOff("norescale");
 
+    AddRAMParameter();
+
     // Doc example parameter settings
     SetDocExampleParameterValue("in", "QB_Suburb.png");
     SetDocExampleParameterValue("out", "LineSegmentDetection.shp");
@@ -117,6 +119,7 @@ private:
     if ( !IsParameterEnabled("norescale") )
       {
       stats->SetInput(amplitudeConverter->GetOutput());
+      stats->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
       AddProcess(stats->GetStreamer(), "Image statistics");
       stats->Update();
@@ -133,6 +136,7 @@ private:
     LSDFilterType::Pointer lsd
       = LSDFilterType::New();
     lsd->GetFilter()->SetInput(image);
+    lsd->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
     AddProcess(lsd->GetStreamer(), "Running Line Segment Detector");
     lsd->Update();
diff --git a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
index 3894ed1..50c8c11 100644
--- a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
+++ b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx
@@ -18,7 +18,6 @@
 #include "otbWrapperApplication.h"
 #include "otbWrapperApplicationFactory.h"
 
-#include "otbStreamingStatisticsVectorImageFilter.h"
 #include "otbUnConstrainedLeastSquareImageFilter.h"
 #include "otbISRAUnmixingImageFilter.h"
 #include "otbNCLSUnmixingImageFilter.h"
@@ -30,9 +29,6 @@ namespace otb
 {
 namespace Wrapper
 {
-
-typedef otb::StreamingStatisticsVectorImageFilter<DoubleVectorImageType> StreamingStatisticsVectorImageFilterType;
-
 typedef otb::UnConstrainedLeastSquareImageFilter<DoubleVectorImageType, DoubleVectorImageType, double> UCLSUnmixingFilterType;
 typedef otb::ISRAUnmixingImageFilter<DoubleVectorImageType, DoubleVectorImageType, double>             ISRAUnmixingFilterType;
 typedef otb::NCLSUnmixingImageFilter<DoubleVectorImageType, DoubleVectorImageType, double>             NCLSUnmixingFilterType;
diff --git a/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx b/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx
index 37d5510..d4968e3 100644
--- a/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx
@@ -293,8 +293,6 @@ private:
     SetParameterDescription("out","Output image filename");
     SetDefaultOutputPixelType("out",ImagePixelType_uint8);
 
-    AddRAMParameter();
-
     // --- OPERATION --- : Label to color / Color to label
     AddParameter(ParameterType_Choice, "op", "Operation");
     SetParameterDescription("op","Selection of the operation to execute (default is : label to color).");
@@ -353,7 +351,7 @@ private:
     // Optimal LUT
     AddChoice("method.optimal","Compute an optimized look-up table");
     SetParameterDescription("method.optimal","[label to color] Compute an optimal look-up table such that neighboring labels"
-                            " in a segmentation are mapped to highly contrasted colors.\n"
+                            " in a segmentation are mapped to highly contrasted colors. "
                             "[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");
@@ -384,6 +382,7 @@ private:
     SetMinimumParameterIntValue("method.image.up", 0);
     SetMaximumParameterIntValue("method.image.up", 100);
 
+    AddRAMParameter();
 
     // Doc example parameter settings
     SetDocExampleParameterValue("in", "ROI_QB_MUL_1_SVN_CLASS_MULTI.png");
@@ -611,6 +610,8 @@ private:
       m_StatisticsMapFromLabelImageFilter = StreamingStatisticsMapFromLabelImageFilterType::New();
       m_StatisticsMapFromLabelImageFilter->SetInput(GetParameterImage("method.image.in"));
       m_StatisticsMapFromLabelImageFilter->SetInputLabelImage(m_CasterToLabelImage->GetOutput());
+      m_StatisticsMapFromLabelImageFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+      AddProcess(m_StatisticsMapFromLabelImageFilter->GetStreamer(), "Computing statistics on labels...");
       m_StatisticsMapFromLabelImageFilter->Update();
 
       StreamingStatisticsMapFromLabelImageFilterType::MeanValueMapType
diff --git a/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx b/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx
index 7cc5fec..f08ac34 100644
--- a/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx
@@ -52,7 +52,7 @@ private:
     SetDescription("Estimator between 2 images.");
 
     // Documentation
-    SetDocName("Images comparaison");
+    SetDocName("Images comparison");
     SetDocLongDescription("This application computes MSE (Mean Squared Error), MAE (Mean Absolute Error) and PSNR (Peak Signal to Noise Ratio) between the channel of two images (reference and measurement). The user has to set the used channel and can specify a ROI.");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
@@ -114,6 +114,8 @@ private:
     SetParameterDescription("count", "Nb of pixels which are different");
     SetParameterRole("count", Role_Output);
 
+    AddRAMParameter();
+
     // Doc example parameter settings
     SetDocExampleParameterValue("ref.in", "GomaApres.png");
     SetDocExampleParameterValue("ref.channel", "1");
@@ -202,10 +204,12 @@ private:
     m_ExtractRefFilter->SetChannel( this->GetParameterInt("ref.channel") );
     m_ExtractMeasFilter->SetChannel( this->GetParameterInt("meas.channel") );
 
-    // Compute comparaison
+    // Compute comparison
     m_CompareFilter->SetInput1(m_ExtractRefFilter->GetOutput());
     m_CompareFilter->SetInput2(m_ExtractMeasFilter->GetOutput());
     m_CompareFilter->SetPhysicalSpaceCheck(false);
+    m_CompareFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+    AddProcess(m_CompareFilter->GetStreamer(), "Comparing...");
     m_CompareFilter->Update();
 
     // Show result
diff --git a/Modules/Applications/AppImageUtils/app/otbConvert.cxx b/Modules/Applications/AppImageUtils/app/otbConvert.cxx
index 7de721d..7f7d565 100644
--- a/Modules/Applications/AppImageUtils/app/otbConvert.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbConvert.cxx
@@ -199,6 +199,7 @@ private:
       otbAppLogDEBUG( << "Shrink starts..." );
 
       shrinkFilter->SetShrinkFactor(shrinkFactor);
+      shrinkFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
       AddProcess(shrinkFilter->GetStreamer(), "Computing shrink Image for min/max estimation...");
 
       if ( rescaleType == "log2")
@@ -210,14 +211,12 @@ private:
 
         shrinkFilter->SetInput(m_TransferLog->GetOutput());
         rescaler->SetInput(m_TransferLog->GetOutput());
-        shrinkFilter->GetStreamer()->SetAutomaticTiledStreaming(GetParameterInt("ram"));
         shrinkFilter->Update();
         }
       else
         {
         shrinkFilter->SetInput(input);
         rescaler->SetInput(input);
-        shrinkFilter->GetStreamer()->SetAutomaticTiledStreaming(GetParameterInt("ram"));
         shrinkFilter->Update();
         }
 
@@ -226,7 +225,7 @@ private:
         {
         maskShrinkFilter->SetShrinkFactor(shrinkFactor);
         maskShrinkFilter->SetInput(mask);
-        maskShrinkFilter->GetStreamer()->SetAutomaticTiledStreaming(GetParameterInt("ram"));
+        maskShrinkFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
         maskShrinkFilter->Update();
         }
 
diff --git a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx
index cc99282..b036c0f 100644
--- a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx
@@ -167,7 +167,7 @@ private:
        rsTransformToWGS84->SetInputProjectionRef(inImage->GetProjectionRef());
        rsTransformToWGS84->SetOutputProjectionRef(static_cast<std::string> (otb::GeoInformationConversion::ToWKT(4326)));
 
-       rsTransformToWGS84->InstanciateTransform();
+       rsTransformToWGS84->InstantiateTransform();
 
        const SizeType size = inImage->GetLargestPossibleRegion().GetSize();
        const PointType origin=inImage->GetOrigin();
diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
index 82ad124..8a3bc91 100644
--- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
@@ -238,7 +238,7 @@ private:
       rsTransform->SetInputProjectionRef(referencePtr->GetProjectionRef());
       rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist());
       rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef());
-      rsTransform->InstanciateTransform();
+      rsTransform->InstantiateTransform();
 
       FloatVectorImageType::IndexType uli_ref,uri_ref,lli_ref,lri_ref;
 
diff --git a/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx b/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx
index d4b4514..0bb1633 100644
--- a/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx
@@ -73,7 +73,7 @@ private:
     SetParameterDescription("outkwl", "This option allows extracting the OSSIM keywordlist of the image into a geom file.");
     MandatoryOff("outkwl");
 
-    //Create output parameters to store image informations
+    //Create output parameters to store image information
     AddParameter(ParameterType_Int,"indexx","Start index X");
     SetParameterDescription("indexx","X start index");
     SetParameterRole("indexx", Role_Output);
@@ -127,8 +127,8 @@ private:
     SetParameterRole("time", Role_Output);
     EnableParameter("time");
 
-    AddParameter(ParameterType_Float,"ullat","Upper left lattitude");
-    SetParameterDescription("ullat", "Lattitude of the upper left corner.");
+    AddParameter(ParameterType_Float,"ullat","Upper left latitude");
+    SetParameterDescription("ullat", "Latitude of the upper left corner.");
     SetParameterRole("ullat", Role_Output);
     SetDefaultParameterFloat("ullat", 0);
 
@@ -137,8 +137,8 @@ private:
     SetParameterRole("ullon", Role_Output);
     SetDefaultParameterFloat("ullon", 0);
 
-    AddParameter(ParameterType_Float,"urlat","Upper right lattitude");
-    SetParameterDescription("urlat", "Lattitude of the upper right corner.");
+    AddParameter(ParameterType_Float,"urlat","Upper right latitude");
+    SetParameterDescription("urlat", "Latitude of the upper right corner.");
     SetParameterRole("urlat", Role_Output);
     SetDefaultParameterFloat("urlat", 0);
 
@@ -147,8 +147,8 @@ private:
     SetParameterRole("urlon", Role_Output);
     SetDefaultParameterFloat("urlon", 0);
 
-    AddParameter(ParameterType_Float,"lrlat","Lower right lattitude");
-    SetParameterDescription("lrlat", "Lattitude of the lower right corner.");
+    AddParameter(ParameterType_Float,"lrlat","Lower right latitude");
+    SetParameterDescription("lrlat", "Latitude of the lower right corner.");
     SetParameterRole("lrlat", Role_Output);
     SetDefaultParameterFloat("lrlat", 0);
 
@@ -157,8 +157,8 @@ private:
     SetParameterRole("lrlon", Role_Output);
     SetDefaultParameterFloat("lrlon", 0);
 
-    AddParameter(ParameterType_Float,"lllat","Lower left lattitude");
-    SetParameterDescription("lllat", "Lattitude of the lower left corner.");
+    AddParameter(ParameterType_Float,"lllat","Lower left latitude");
+    SetParameterDescription("lllat", "Latitude of the lower left corner.");
     SetParameterRole("lllat", Role_Output);
     SetDefaultParameterFloat("lllat", 0);
 
@@ -257,7 +257,7 @@ private:
 
     ossOutput << std::endl << "Image general information:" << std::endl;
 
-    // Read informations
+    // Read information
     typedef otb::ImageMetadataInterfaceBase ImageMetadataInterfaceType;
     ImageMetadataInterfaceType::Pointer metadataInterface = ImageMetadataInterfaceFactory::CreateIMI(inImage->GetMetaDataDictionary());
 
diff --git a/Modules/Applications/AppImageUtils/app/otbRescale.cxx b/Modules/Applications/AppImageUtils/app/otbRescale.cxx
index d0304e7..ea10954 100644
--- a/Modules/Applications/AppImageUtils/app/otbRescale.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbRescale.cxx
@@ -97,7 +97,7 @@ private:
 
     m_MinMaxFilter = MinMaxFilterType::New();
     m_MinMaxFilter->SetInput( inImage );
-    m_MinMaxFilter->GetStreamer()->SetNumberOfLinesStrippedStreaming( 50 );
+    m_MinMaxFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
     AddProcess(m_MinMaxFilter->GetStreamer(), "Min/Max computing");
     m_MinMaxFilter->Update();
diff --git a/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx b/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx
index 42e6091..7352c54 100644
--- a/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx
@@ -70,7 +70,7 @@ private:
 
   // Doc example parameter settings
     SetDocExampleParameterValue("in", "VegetationIndex.hd");
-    SetDocExampleParameterValue("out", "splittedImage.tif");
+    SetDocExampleParameterValue("out", "splitImage.tif");
   }
 
   void DoUpdateParameters() ITK_OVERRIDE
diff --git a/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx b/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx
index ab08761..91d8c87 100644
--- a/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx
+++ b/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx
@@ -87,8 +87,8 @@ private:
       "\n"
       "                   im1b1 + im2b1 \n"
       "                   im1b2 + im2b2       (2)\n"
-      "                         ...."
-      "\n\nNevertheless, the first expression is by far much pleaseant. We call this new functionnality the 'batch mode'\n"
+      "                   ..."
+      "\n\nNevertheless, the first expression is by far much pleaseant. We call this new functionality the 'batch mode'\n"
       "(performing the same operation in a band-to-band fashion).\n"
 
       "\n\n"
@@ -98,8 +98,8 @@ private:
       "- I is an number identifying the image input (remember, input #0 = im1, and so on)\n"
       "- J is an number identifying the band (remember, first band is indexed by 1)\n"
       "- KxP are two numbers that represent the size of the neighborhood (first one is related to the horizontal direction)\n"
-      "All neighborhood are centred, thus K and P must be odd numbers.\n"
-      "Many operators come with this new functionnality: dotpr, mean var median min max...\n"
+      "All neighborhood are centered, thus K and P must be odd numbers.\n"
+      "Many operators come with this new functionality: dotpr, mean var median min max...\n"
       "For instance, if im1 represents the pixel of 3 bands image:\n\n"
       "               im1 - mean(im1b1N5x5,im1b2N5x5,im1b3N5x5)       (3)\n"
       "\ncould represent a high pass filter (Note that by implying three neighborhoods, the operator mean returns a row vector of three components.\n"
@@ -112,7 +112,7 @@ private:
       "matrices (for instance cos, sin, ...). These new operators/ functions keep the original names to which we added the prefix 'v' for vector (vcos, vsin, ...).\n"
       "- mult, div and pow operators, that perform element-wise multiplication, division or exponentiation of vector/matrices (for instance im1 div im2)\n"
       "- mlt, dv and pw operators, that perform multiplication, division or exponentiation of vector/matrices by a scalar (for instance im1 dv 2.0)\n"
-      "- bands, which is a very usefull operator. It allows selecting specific bands from an image, and/or to rearrange them in a new vector;\n"
+      "- bands, which is a very useful operator. It allows selecting specific bands from an image, and/or to rearrange them in a new vector;\n"
       "for instance bands(im1,{1,2,1,1}) produces a vector of 4 components made of band 1, band 2, band 1 and band 1 values from the first input.\n"
       "Note that curly brackets must be used in order to select the desired band indices.\n"
       "... and so on.\n"
diff --git a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
index 150b595..10004ff 100644
--- a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
+++ b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
@@ -124,7 +124,7 @@ private:
   void DoInit() ITK_OVERRIDE
   {
     SetName("OpticalCalibration");
-    SetDescription("Perform optical calibration TOA/TOC (Top Of Atmosphere/Top Of Canopy). Supported sensors: QuickBird, Ikonos, WorldView2, Formosat, Spot5, Pleiades, Spot6. For other sensors the application also allows providing calibration parameters manually.");
+    SetDescription("Perform optical calibration TOA/TOC (Top Of Atmosphere/Top Of Canopy). Supported sensors: QuickBird, Ikonos, WorldView2, Formosat, Spot5, Pleiades, Spot6, Spot7. For other sensors the application also allows providing calibration parameters manually.");
     // Documentation
     SetDocName("Optical calibration");
     SetDocLongDescription("The application allows converting pixel values from DN (for Digital Numbers) to reflectance. Calibrated values are called surface reflectivity and its values lie in the range [0, 1].\nThe first level is called Top Of Atmosphere (TOA) reflectivity. It takes into account the sensor gain, sensor spectral response and the solar illuminations.\nThe second level is called Top Of Canopy (TOC) reflectivity. In addition to sensor gain and solar illuminations, it takes i [...]
@@ -152,8 +152,8 @@ private:
 "- pi is the famous mathematical constant (3.14159...) \n"
 "- d is the earth-sun distance (in astronomical units) and depends on the acquisition's day and month \n"
 "- ESUN(b) is the mean TOA solar irradiance (or solar illumination) in W/m2/micrometers\n"
-"- θ is the solar zenith angle in degrees. \n"
-"Note that the application asks for the solar elevation angle, and will perfom the conversion to the zenith angle itself (zenith_angle = 90 - elevation_angle , units : degrees).\n"
+"- θ is the solar zenith angle in degrees.\n\n"
+"Note that the application asks for the solar elevation angle, and will perform the conversion to the zenith angle itself (zenith_angle = 90 - elevation_angle , units : degrees).\n"
 "Note also that ESUN(b) not only depends on the band b, but also on the spectral sensitivity of the sensor in this particular band. "
 "In other words, the influence of spectral sensitivities is included within the ESUN different values.\n"
 "These values are provided by the user thanks to a txt file following the same convention as before.\n"
@@ -164,17 +164,17 @@ private:
 "by taking into account the original formula that the metadata files assumes.\n\n"
 
 "Below, we give two examples of txt files containing information about gains/biases and solar illuminations :\n\n"
-"- gainbias.txt :\n"
+"- gainbias.txt :\n\n"
 "# Gain values for each band. Each value must be separated with colons (:), with eventual spaces. Blank lines not allowed.\n"
 "10.4416 : 9.529 : 8.5175 : 14.0063\n"
 "# Bias values for each band.\n"
 "0.0 : 0.0 : 0.0 : 0.0\n\n"
-"- solarillumination.txt : \n"
+"- solarillumination.txt : \n\n"
 "# Solar illumination values in watt/m2/micron ('micron' means actually 'for each band').\n"
 "# Each value must be separated with colons (:), with eventual spaces. Blank lines not allowed.\n"
 "1540.494123 : 1826.087443 : 1982.671954 : 1094.747446\n\n"
 
-"Finally, the 'Logs' tab provides usefull messages that can help the user in knowing the process different status." );
+"Finally, the 'Logs' tab provides useful messages that can help the user in knowing the process different status." );
 
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
@@ -376,7 +376,7 @@ private:
       {
         ossOutput << std::endl << "File: " << m_inImageName << std::endl;
 
-        //Check if valid metadata informations are available to compute ImageToLuminance and LuminanceToReflectance
+        //Check if valid metadata information are available to compute ImageToLuminance and LuminanceToReflectance
         FloatVectorImageType::Pointer inImage = GetParameterFloatVectorImage("in");
         itk::MetaDataDictionary             dict = inImage->GetMetaDataDictionary();
         OpticalImageMetadataInterface::Pointer lImageMetadataInterface = OpticalImageMetadataInterfaceFactory::CreateIMI(dict);
@@ -560,14 +560,14 @@ private:
 
   void DoExecute() ITK_OVERRIDE
   {
-    //Main filters instanciations
+    //Main filters instantiations
     m_ImageToLuminanceFilter                = ImageToLuminanceImageFilterType::New();
     m_LuminanceToReflectanceFilter          = LuminanceToReflectanceImageFilterType::New();
     m_ReflectanceToSurfaceReflectanceFilter = ReflectanceToSurfaceReflectanceImageFilterType::New();
     m_ReflectanceToLuminanceFilter          = ReflectanceToLuminanceImageFilterType::New();
     m_LuminanceToImageFilter                = LuminanceToImageImageFilterType::New();
 
-    //Other instanciations
+    //Other instantiations
     m_ScaleFilter = ScaleFilterOutDoubleType::New();
     //m_ScaleFilter->InPlaceOn();
     m_ClampFilter = ClampFilterType::New();
@@ -812,8 +812,11 @@ private:
         }
         else if (IMIName != IMIOptDfltName)
         {
-          if (lImageMetadataInterface->GetSpectralSensitivity()->Size() > 0)
-            m_paramAcqui->SetWavelengthSpectralBand(lImageMetadataInterface->GetSpectralSensitivity());
+          //Avoid to call GetSpectralSensitivity() multiple times
+          OpticalImageMetadataInterface::WavelengthSpectralBandVectorType spectralSensitivity = lImageMetadataInterface->GetSpectralSensitivity();
+          
+          if (spectralSensitivity->Size() > 0)
+            m_paramAcqui->SetWavelengthSpectralBand(spectralSensitivity);
         }
         // Check that m_paramAcqui contains a real spectral profile.
         if (m_paramAcqui->GetWavelengthSpectralBand()->Size() == 0)
diff --git a/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx
index 2a59b8c..5dd1cdd 100644
--- a/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx
+++ b/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx
@@ -97,13 +97,13 @@ private:
     // Get the projectionRef
     std::string inputProjRef = MapProjectionParametersHandler::GetProjectionRefFromChoice(this, "mapproj");
 
-    // Instanciate a GenericRSTranform
+    // Instantiate a GenericRSTransform
     // Input : coordiante system picked up by the user
-    // Output : WGS84 correponding to epsg code 4326
+    // Output : WGS84 corresponding to epsg code 4326
     TransformType::Pointer  transform = TransformType::New();
     transform->SetInputProjectionRef(inputProjRef);
     transform->SetOutputProjectionRef(otb::GeoInformationConversion::ToWKT(4326));
-    transform->InstanciateTransform();
+    transform->InstantiateTransform();
 
     TransformType::InputPointType   cartoPoint;
     TransformType::OutputPointType  geoPoint;
diff --git a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx
index 8a01ff5..3b3140b 100644
--- a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx
+++ b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx
@@ -105,7 +105,7 @@ private:
     // Get input Image
     FloatVectorImageType::Pointer inImage = GetParameterImage("in");
 
-    // Instanciate a ForwardSensor Model
+    // Instantiate a ForwardSensor Model
     ModelType::Pointer model = ModelType::New();
     model->SetImageGeometry(inImage->GetImageKeywordlist());
     if ( model->IsValidSensorModel() == false )
diff --git a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
index 8936100..be181eb 100644
--- a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
+++ b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
@@ -179,7 +179,7 @@ private:
 
   RSTransformType::Pointer rsTransform = RSTransformType::New();
   rsTransform->SetOutputProjectionRef(MapProjectionParametersHandler::GetProjectionRefFromChoice(this, "map"));
-  rsTransform->InstanciateTransform();
+  rsTransform->InstantiateTransform();
 
   std::ofstream ofs;
   ofs<<std::fixed;
diff --git a/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx b/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx
index d6cf00d..5d782b3 100644
--- a/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx
+++ b/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx
@@ -89,7 +89,7 @@ private:
 
   GridBasedImageResampling()
   {
-    // Instanciate warp filter
+    // Instantiate warp filter
     m_WarpImageFilter = WarpFilterType::New();
     m_BandMathX = BandMathFilterType::New();
     m_BandMathY = BandMathFilterType::New();
@@ -168,7 +168,7 @@ private:
     SetParameterDescription("interpolator.linear","Linear interpolation leads to average image quality but is quite fast");
     AddChoice("interpolator.bco",    "Bicubic interpolation");
     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 artefacts.");
+    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");
 
diff --git a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx
index 987586e..e941684 100644
--- a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx
+++ b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx
@@ -115,7 +115,7 @@ private:
     // Build the Output Map Projection
     MapProjectionParametersHandler::AddMapProjectionParameters(this, "map");
 
-    // Add the output paramters in a group
+    // Add the output parameters in a group
     AddParameter(ParameterType_Group, "outputs", "Output Image Grid");
     SetParameterDescription("outputs","This group of parameters allows one to define the grid on which the input image will be resampled.");
 
@@ -193,7 +193,7 @@ private:
     AddParameter(ParameterType_Choice,   "interpolator", "Interpolation");
     AddChoice("interpolator.bco",    "Bicubic interpolation");
     AddParameter(ParameterType_Radius, "interpolator.bco.radius", "Radius for bicubic interpolation");
-    SetParameterDescription("interpolator.bco.radius","This parameter allows one to control 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 artefacts.");
+    SetParameterDescription("interpolator.bco.radius","This parameter allows one to control 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.");
     SetParameterDescription("interpolator","This group of parameters allows one to define how the input image will be interpolated during resampling.");
     AddChoice("interpolator.nn",     "Nearest Neighbor interpolation");
     SetParameterDescription("interpolator.nn","Nearest neighbor interpolation leads to poor image quality, but it is very fast.");
@@ -287,7 +287,7 @@ private:
        SetParameterFloat("outputs.lry", GetParameterFloat("outputs.uly") + GetParameterFloat("outputs.spacingy") * static_cast<double>(GetParameterInt("outputs.sizey")));
 
       // Handle the spacing and size field following the mode
-      // choosed by the user
+      // chose by the user
       switch (GetParameterInt("outputs.mode") )
         {
         case Mode_UserDefined:
@@ -595,7 +595,7 @@ private:
     // Get the input image
     FloatVectorImageType* inImage = GetParameterImage("io.in");
 
-    // Resampler Instanciation
+    // Resampler Instantiation
     m_ResampleFilter = ResampleFilterType::New();
     m_ResampleFilter->SetInput(inImage);
 
diff --git a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx
index a0c32c6..7036fac 100644
--- a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx
+++ b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx
@@ -194,7 +194,7 @@ private:
 
   RSTransformType::Pointer rsTransform = RSTransformType::New();
   rsTransform->SetOutputProjectionRef(MapProjectionParametersHandler::GetProjectionRefFromChoice(this, "map"));
-  rsTransform->InstanciateTransform();
+  rsTransform->InstantiateTransform();
 
   std::ofstream ofs;
   ofs<<std::fixed;
diff --git a/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx b/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx
index 30e0ba0..2bdaa25 100644
--- a/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx
+++ b/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx
@@ -154,7 +154,7 @@ private:
     SetParameterDescription("interpolator.linear","Linear interpolation leads to average image quality but is quite fast");
     AddChoice("interpolator.bco",    "Bicubic interpolation");
     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 artefacts.");
+    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");
 
diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
index 20cdd5b..3293c3a 100644
--- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
+++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
@@ -131,7 +131,7 @@ private:
     SetParameterDescription("interpolator.bco", "Bicubic interpolation leads to very good image quality but is slow.");
 
     AddParameter(ParameterType_Radius, "interpolator.bco.radius", "Radius for bicubic interpolation");
-    SetParameterDescription("interpolator.bco.radius","This parameter allows controling 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 artefacts.");
+    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);
 
     AddChoice("interpolator.nn",     "Nearest Neighbor interpolation");
@@ -202,7 +202,7 @@ private:
     // Setup the DEM Handler
     otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
 
-    // Set up output image informations
+    // Set up output image information
     FloatVectorImageType::SpacingType spacing = refImage->GetSpacing();
     FloatVectorImageType::IndexType   start   = refImage->GetLargestPossibleRegion().GetIndex();
     FloatVectorImageType::SizeType    size    = refImage->GetLargestPossibleRegion().GetSize();
diff --git a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx
index f829053..3b4cdde 100644
--- a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx
+++ b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx
@@ -131,7 +131,7 @@ private:
 
     m_InputGeomSet = InputGeometriesType::New(OGRDSin);
 
-    // Filter instanciation
+    // Filter instantiation
     m_GeometriesProjFilter = ProjectionFilterType::New();
     m_GeometriesProjFilter->SetInput(m_InputGeomSet);
 
diff --git a/Modules/Applications/AppProjection/test/CMakeLists.txt b/Modules/Applications/AppProjection/test/CMakeLists.txt
index 3ef6f01..bff0484 100644
--- a/Modules/Applications/AppProjection/test/CMakeLists.txt
+++ b/Modules/Applications/AppProjection/test/CMakeLists.txt
@@ -180,12 +180,12 @@ otb_test_application(NAME  apTuPrVectorDataReprojectionFromImageToMap
 otb_test_application(NAME  apTvPrVectorDataReprojectionFromMapToMap
                      APP  VectorDataReprojection
                      OPTIONS -in.vd  ${INPUTDATA}/ToulousePoints-examples.shp
-                 			       -out.vd ${TEMP}/apTvPrVectorDataReprojectionFromMapToMap.sqlite
+                 			       -out.vd ${TEMP}/apTvPrVectorDataReprojectionFromMapToMap.shp
                              -out.proj user
                              -out.proj.user.map  lambert93
                      VALID   --compare-ogr ${NOTOL}
                               ${BASELINE_FILES}/prTvVectorDataProjectionFilterFromMapToMap.sqlite
-                 			  ${TEMP}/apTvPrVectorDataReprojectionFromMapToMap.sqlite)
+                 			  ${TEMP}/apTvPrVectorDataReprojectionFromMapToMap.shp)
 
 otb_test_application(NAME  apTvPrVectorDataReprojectionFromMapToImage
                      APP  VectorDataReprojection
diff --git a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
index 208d135..1f16ac9 100644
--- a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
+++ b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
@@ -477,7 +477,7 @@ private:
 	else if ( (convType>=8) && (convType<=11)) // bsinclairtocoherency bsinclairtocovariance bsinclairtocircovariance sinclairtomueller
 	{
 	    if ( (!inhh) || (!inhv) || (!invh) || (!invv) )
-	        otbAppLogFATAL( << "Please, ensure that HH, HV, VH and VV complex images have been provided (paramaters inhh, inhv, invh, invv).");
+	        otbAppLogFATAL( << "Please, ensure that HH, HV, VH and VV complex images have been provided (parameters inhh, inhv, invh, invv).");
 	}
 	else if ( (convType==7) || (convType==12) ) // muellertomcovariance muellertopoldegandpower
 	{
diff --git a/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx b/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx
index 488b8c6..9f40387 100644
--- a/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx
+++ b/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx
@@ -50,23 +50,23 @@ private:
     SetDocName("SARPolarSynth");
     SetDocLongDescription("This application gives, for each pixel, the power that would have been received by a SAR system with a basis different from the classical (H,V) one (polarimetric synthetis).\n" 
 						  "The new basis A and B are indicated through two Jones vectors, defined by the user thanks to orientation (psi) and ellipticity (khi) parameters.\n"
-						  "These parameters are namely psii, khii, psir and khir. The suffixes (i) and (r) refer to the transmiting antenna and the receiving antenna respectively.\n"
+						  "These parameters are namely psii, khii, psir and khir. The suffixes (i) and (r) refer to the transmitting antenna and the receiving antenna respectively.\n"
 						  "Orientations and ellipticities are given in degrees, and are between -90/90 degrees and -45/45 degrees respectively.\n " 
 						  "\n"
-						  "Four polarization architectures can be processed : \n"
-						  "1) HH_HV_VH_VV : full polarization, general bistatic case.\n"
-						  "2) HH_HV_VV or HH_VH_VV : full polarization, monostatic case (transmitter and receiver are co-located).\n"
-						  "3) HH_HV : dual polarization.\n"
-						  "4) VH_VV : dual polarization.\n"
+						  "Four polarization architectures can be processed : \n\n"
+						  "1. HH_HV_VH_VV : full polarization, general bistatic case.\n"
+						  "2. HH_HV_VV or HH_VH_VV : full polarization, monostatic case (transmitter and receiver are co-located).\n"
+						  "3. HH_HV : dual polarization.\n"
+						  "4. VH_VV : dual polarization.\n\n"
 						  "The application takes a complex vector image as input, where each band correspond to a particular emission/reception polarization scheme.\n"
 						  "User must comply with the band order given above, since the bands are used to build the Sinclair matrix.\n"
 						  "\n"
-						  "In order to determine the architecture, the application first relies on the number of bands of the input image.\n" 
-						  "1) Architecture HH_HV_VH_VV is the only one with four bands, there is no possible confusion.\n"
-						  "2) Concerning HH_HV_VV and HH_VH_VV architectures, both correspond to a three channels image. But they are processed in the same way, as the Sinclair matrix is symmetric in the monostatic case.\n"
-						  "3) Finally, the two last architectures (dual polarizations), can't be distinguished only by the number of bands of the input image.\n"
-						  "   User must then use the parameters emissionh and emissionv to indicate the architecture of the system : emissionh=1 and emissionv=0 --> HH_HV,  emissionh=0 and emissionv=1 --> VH_VV.\n"
-						  "Note : if the architecture is HH_HV, khii and psii are automatically both set to 0 degree; if the architecture is VH_VV, khii and psii are automatically set to 0 degree and 90 degrees respectively.\n"
+						  "In order to determine the architecture, the application first relies on the number of bands of the input image.\n\n" 
+						  "1. Architecture HH_HV_VH_VV is the only one with four bands, there is no possible confusion.\n"
+						  "2. Concerning HH_HV_VV and HH_VH_VV architectures, both correspond to a three channels image. But they are processed in the same way, as the Sinclair matrix is symmetric in the monostatic case.\n"
+						  "3. Finally, the two last architectures (dual polarizations), can't be distinguished only by the number of bands of the input image."
+						  " User must then use the parameters emissionh and emissionv to indicate the architecture of the system : emissionh=1 and emissionv=0 --> HH_HV,  emissionh=0 and emissionv=1 --> VH_VV.\n"
+						  "\nNote : if the architecture is HH_HV, khii and psii are automatically both set to 0 degree; if the architecture is VH_VV, khii and psii are automatically set to 0 degree and 90 degrees respectively.\n"
 						  "\n"
 						  "It is also possible to force the calculation to co-polar or cross-polar modes.\n"
 						  "In the co-polar case, values for psir and khir will be ignored and forced to psii and khii; same as the cross-polar mode, where khir and psir will be forced to (psii + 90 degrees) and -khii.\n"
diff --git a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx
index 8f014d3..1c4e307 100644
--- a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx
@@ -108,6 +108,8 @@ private:
     // Elevation
     ElevationParametersHandler::AddElevationParameters(this, "elev");
 
+    AddRAMParameter();
+
    // Doc example parameter settings
    SetDocExampleParameterValue("in", "ROI_QB_MUL_4.tif");
    SetDocExampleParameterValue("mask", "\"((b1>80)*intensity>95)\"");
@@ -139,7 +141,8 @@ private:
     if (IsParameterEnabled("obia") && HasValue("obia"))
       m_Connected->GetFilter()->SetOBIAExpression(GetParameterString("obia"));
 
-    AddProcess(m_Connected,"Computing segmentation");
+    m_Connected->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+    AddProcess(m_Connected->GetStreamer(),"Computing segmentation");
     m_Connected->Update();
 
     /*
diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx
index 23f3397..5adea92 100644
--- a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx
@@ -108,6 +108,8 @@ private:
     SetDefaultParameterInt("tilesizey", 500);
     SetMinimumParameterIntValue("tilesizey", 1);
 
+    AddRAMParameter();
+
     // Doc example parameter settings
     SetDocExampleParameterValue("in","smooth.tif");
     SetDocExampleParameterValue("inseg","segmentation.tif");
@@ -142,6 +144,8 @@ private:
 
     StatisticsImageFilterType::Pointer stats = StatisticsImageFilterType::New();
     stats->SetInput(labelIn);
+    stats->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+    AddProcess(stats->GetStreamer(), "Retrieve region count...");
     stats->Update();
     unsigned int regionCount=stats->GetMaximum();
 
diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx
index 9a0c070..9238a00 100644
--- a/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx
@@ -94,6 +94,8 @@ private:
     SetDefaultParameterInt("tilesizey", 500);
     SetMinimumParameterIntValue("tilesizey", 1);
 
+    AddRAMParameter();
+
     // Doc example parameter settings
     SetDocExampleParameterValue("in","avions.tif");
     SetDocExampleParameterValue("inseg","merged.tif");
@@ -129,6 +131,8 @@ private:
 
     StatisticsImageFilterType::Pointer stats = StatisticsImageFilterType::New();
     stats->SetInput(labelIn);
+    stats->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+    AddProcess(stats->GetStreamer(), "Retrieve region count...");
     stats->Update();
     unsigned int regionCount=stats->GetMaximum();
 
diff --git a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx
index 3f8bcd0..4234666 100644
--- a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx
@@ -144,7 +144,7 @@ private:
                           " (norm of spectral bands vector). The application has two different modes that affects the nature of its output.\n\nIn raster mode,"
                           " the output of the application is a classical image of unique labels identifying the segmented regions. The labeled output can be passed to the"
                           " ColorMapping application to render regions with contrasted colours. Please note that this mode loads the whole input image into memory, and as such"
-                          " can not handle large images. \n\nTo segment large data, one can use the vector mode. In this case, the output of the application is a"
+                          " can not handle large images. \n\n To segment large data, one can use the vector mode. In this case, the output of the application is a"
                           " vector file or database. The input image is split into tiles (whose size can be set using the tilesize parameter), and each tile is loaded, segmented"
                           " with the chosen algorithm, vectorized, and written into the output file or database. This piece-wise behavior ensure that memory will never get overloaded,"
                           " and that images of any size can be processed. There are few more options in the vector mode. The simplify option allows simplifying the geometry"
diff --git a/Modules/Applications/AppSegmentation/test/CMakeLists.txt b/Modules/Applications/AppSegmentation/test/CMakeLists.txt
index cd32b30..cb4612e 100644
--- a/Modules/Applications/AppSegmentation/test/CMakeLists.txt
+++ b/Modules/Applications/AppSegmentation/test/CMakeLists.txt
@@ -23,14 +23,14 @@ set(raster_comparison --compare-image ${NOTOL})
 set(vector_ref_path ${BASELINE_FILES})
 set(raster_ref_path ${BASELINE})
 
-set(fitlerList "Meanshift" "CC" "Watershed")
+set(filterList "Meanshift" "CC" "Watershed")
 
 # Loop on modes
 foreach(mode "Raster" "Vector")
 string(TOLOWER ${mode} lmode)
 
 # Loop on filters
-foreach(filter ${fitlerList})
+foreach(filter ${filterList})
 string(TOLOWER ${filter} lfilter)
 
 # Derive output file name
diff --git a/Modules/Applications/AppStereo/app/otbFineRegistration.cxx b/Modules/Applications/AppStereo/app/otbFineRegistration.cxx
index 33481d3..8808d6d 100644
--- a/Modules/Applications/AppStereo/app/otbFineRegistration.cxx
+++ b/Modules/Applications/AppStereo/app/otbFineRegistration.cxx
@@ -205,6 +205,12 @@ private:
     SetMinimumParameterFloatValue("spa", 0.0);
     MandatoryOff("spa");
 
+    AddParameter(ParameterType_Float,  "cva",   "ConvergenceAccuracy");
+    SetParameterDescription( "cva", "Metric extrema will be refined up to the given accuracy. Default is 0.01" );
+    SetDefaultParameterFloat("cva", 0.01);
+    SetMinimumParameterFloatValue("cva", 0.0);
+    MandatoryOff("cva");
+
     AddParameter(ParameterType_Float,  "vmlt",   "Validity Mask Lower Threshold");
     SetParameterDescription( "vmlt", "Lower threshold to obtain a validity mask." );
     MandatoryOff("vmlt");
@@ -249,8 +255,6 @@ private:
     radius[0] = GetParameterInt("mrx");
     radius[1] = GetParameterInt("mry");
 
-    double accuracy = static_cast<double>(GetParameterFloat("spa"));
-
     ssrate[0] = GetParameterFloat("ssrx");
     ssrate[1] = GetParameterFloat("ssry");
 
@@ -265,12 +269,22 @@ private:
     otbAppLogINFO("Metric radius     : "<<radius<<" (pixels)");
     otbAppLogINFO("Sub-sampling rate : "<<ssrate<<" (pixels)");
     otbAppLogINFO("Coarse offset     : "<<initialOffset<<" (physical unit)");
-    otbAppLogINFO("Accuracy          : "<<accuracy<<" (physical unit)");
 
     m_Registration = RegistrationFilterType::New();
     m_Registration->SetRadius(radius);
     m_Registration->SetSearchRadius(sradius);
-    m_Registration->SetSubPixelAccuracy(accuracy);
+    if (IsParameterEnabled("cva") && HasValue("cva"))
+    {
+        double convAccuracy = static_cast<double>(GetParameterFloat("cva"));
+        m_Registration->SetConvergenceAccuracy(convAccuracy);
+        otbAppLogINFO("Convergence Accuracy          : "<<convAccuracy<<" (physical unit)");
+    }
+    if (IsParameterEnabled("spa") && HasValue("spa"))
+    {
+        double subPixAccuracy = static_cast<double>(GetParameterFloat("spa"));
+        m_Registration->SetSubPixelAccuracy(subPixAccuracy);
+        otbAppLogINFO("SubPixel Accuracy          : "<<subPixAccuracy<<" (physical unit)");
+    }
     m_Registration->SetGridStep(ssrate);
     m_Registration->SetInitialOffset(initialOffset);
 
diff --git a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx
index 0be9121..e237850 100644
--- a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx
+++ b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx
@@ -129,8 +129,8 @@ private:
 
     rsTransform->SetOutputProjectionRef(colorPtr->GetProjectionRef());
     rsTransform->SetOutputKeywordList(colorPtr->GetImageKeywordlist());
-    rsTransform->InstanciateTransform();
-    toMap->InstanciateTransform();
+    rsTransform->InstantiateTransform();
+    toMap->InstantiateTransform();
 
     unsigned long nbValidPoints = 0;
 
diff --git a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx
index 2c28ba7..1b18dc5 100644
--- a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx
+++ b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx
@@ -39,7 +39,6 @@
 
 #include "itkRescaleIntensityImageFilter.h"
 #include "otbStreamingMinMaxImageFilter.h"
-#include "otbStreamingStatisticsImageFilter.h"
 #include "otbExtractROI.h"
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
@@ -183,9 +182,6 @@ public:
   typedef otb::StreamingMinMaxImageFilter
     <FloatImageType>                          MinMaxFilterType;
 
-  typedef otb::StreamingStatisticsImageFilter
-    <FloatImageType>                          StatisticsFilterType;
-
   typedef otb::ExtractROI
     <FloatPixelType,FloatPixelType>           ExtractFilterType;
 
@@ -321,7 +317,7 @@ private:
     SetDocLongDescription("Compute the ground elevation with a stereo block matching algorithm "
                           "between one or multiple stereo pair in sensor geometry. The output is projected in "
                           "desired geographic or cartographic map projection (UTM by default). The pipeline is made of the following steps:\n"
-                          "for each sensor pair :\n"
+                          "for each sensor pair :\n\n"
                           "\t- compute the epipolar displacement grids from the stereo pair (direct and inverse)\n"
                           "\t- resample the stereo pair into epipolar geometry using BCO interpolation\n"
                           "\t- create masks for each epipolar image : remove black borders and resample"
@@ -331,7 +327,7 @@ private:
                           "\t- apply an optional median filter\n"
                           "\t- filter disparities based on the correlation score  and exploration bounds\n"
                           "\t- translate disparities in sensor geometry\n"
-                          "\t  convert disparity to 3D Map.\n"
+                          "\t  convert disparity to 3D Map.\n\n"
                           "Then fuse all 3D maps to produce DSM.");
     SetDocLimitations(" ");
     SetDocAuthors("OTB-Team");
@@ -339,7 +335,7 @@ private:
 
     AddDocTag(Tags::Stereo);
 
-    // Add the output paramters in a group
+    // Add the output parameters in a group
     AddParameter(ParameterType_Group, "input", "Input parameters");
     SetParameterDescription("input","This group of parameters allows one to parametrize input data.");
 
@@ -360,7 +356,7 @@ private:
 
     ElevationParametersHandler::AddElevationParameters(this, "elev");
 
-    // Add the output paramters in a group
+    // Add the output parameters in a group
     AddParameter(ParameterType_Group, "output", "Output parameters");
     SetParameterDescription("output","This group of parameters allows one to choose the DSM resolution, nodata value, and projection parameters.");
 
@@ -417,7 +413,7 @@ private:
     AddParameter(ParameterType_Float, "output.mode.user.spacingy", "Pixel Size Y ");
     SetParameterDescription("output.mode.user.spacingy","Size of each pixel along Y axis (meters for cartographic projections, degrees for geographic ones)");
 
-    // Add the output paramters in a group
+    // Add the output parameters in a group
     AddParameter(ParameterType_Group, "stereorect", "Stereorectification Grid parameters");
     SetParameterDescription("stereorect","This group of parameters allows one to choose direct and inverse grid subsampling. These parameters are very useful to tune time and memory consumption.");
 
diff --git a/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx b/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx
index de20a9b..b9f6b1f 100644
--- a/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx
+++ b/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx
@@ -75,7 +75,7 @@ private:
 
   StereoRectificationGridGenerator()
   {
-    // Instanciate deformation field source
+    // Instantiate deformation field source
     m_DisplacementFieldSource = DisplacementFieldSourceType::New();
     m_LeftInvertDisplacementFieldFilter = InverseDisplacementFieldFilterType::New();
     m_RightInvertDisplacementFieldFilter = InverseDisplacementFieldFilterType::New();
@@ -239,7 +239,8 @@ private:
       m_DEMToImageGenerator->AboveEllipsoidOn();
 
       m_StatisticsFilter->SetInput(m_DEMToImageGenerator->GetOutput());
-      AddProcess(m_StatisticsFilter,"Computing DEM statistics ...");
+      m_StatisticsFilter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
+      AddProcess(m_StatisticsFilter->GetStreamer(),"Computing DEM statistics ...");
       m_StatisticsFilter->Update();
 
       otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(m_StatisticsFilter->GetMean());
diff --git a/Modules/Applications/AppStereo/test/CMakeLists.txt b/Modules/Applications/AppStereo/test/CMakeLists.txt
index fa2da88..36883cd 100644
--- a/Modules/Applications/AppStereo/test/CMakeLists.txt
+++ b/Modules/Applications/AppStereo/test/CMakeLists.txt
@@ -85,6 +85,7 @@ otb_test_application(NAME apTvDmFineRegistrationTest
                              -ssrx 8
                              -ssry 8
                              -spa 0.1
+                             -cva 0.01
                              -cox -2
                              -vmlt 0.999
                      VALID   --compare-image ${EPSILON_10}
diff --git a/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx b/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx
index 9cacf04..683a46b 100644
--- a/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx
+++ b/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx
@@ -263,7 +263,7 @@ private:
           RSTransformType::Pointer rsTransform = RSTransformType::New();
           rsTransform->SetInputProjectionRef(inputProjectionRef);
           rsTransform->SetOutputProjectionRef(outputProjectionRef);
-          rsTransform->InstanciateTransform();
+          rsTransform->InstantiateTransform();
 
           corner = rsTransform->TransformPoint(corner);
           }
@@ -293,7 +293,7 @@ private:
           RSTransformType::Pointer rsTransform = RSTransformType::New();
           rsTransform->SetInputProjectionRef(inputProjectionRef);
           rsTransform->SetOutputProjectionRef(outputProjectionRef);
-          rsTransform->InstanciateTransform();
+          rsTransform->InstantiateTransform();
 
           lrout = rsTransform->TransformPoint(lrout);
           }
diff --git a/Modules/Applications/AppVectorUtils/test/CMakeLists.txt b/Modules/Applications/AppVectorUtils/test/CMakeLists.txt
index 0f2d295..3678828 100644
--- a/Modules/Applications/AppVectorUtils/test/CMakeLists.txt
+++ b/Modules/Applications/AppVectorUtils/test/CMakeLists.txt
@@ -48,15 +48,18 @@ otb_test_application(NAME apTvUtVectorDataSetField
                      )
 
 
-#----------- OSMDownloader TESTS ----------------
-otb_test_application(NAME apTvUtOSMDownloader
-                     APP OSMDownloader
-                     OPTIONS -support LARGEINPUT{DEMPSTER-SHAFER/ROI_QB_TOULOUSE.TIF}
-                             -key highway
-                             -out ${TEMP}/apTvUtOSMDownloader.shp
-                     VALID   --compare-ogr ${NOTOL}
-                             ${OTBAPP_BASELINE_FILES}/otbOSMDownloaderOutput.shp
-                             ${TEMP}/apTvUtOSMDownloader.shp)
+# ----------- OSMDownloader TESTS ----------------
+#RK: JIRA-1078: the test is failing on once in every two days.
+#it doesn't make much sense to keep this test which grabs input from openstreetmap
+#server. So skipping them below. (2/sep/2016)
+# otb_test_application(NAME apTvUtOSMDownloader
+#                      APP OSMDownloader
+#                      OPTIONS -support LARGEINPUT{DEMPSTER-SHAFER/ROI_QB_TOULOUSE.TIF}
+#                              -key highway
+#                              -out ${TEMP}/apTvUtOSMDownloader.shp
+#                      VALID   --compare-ogr ${NOTOL}
+#                              ${OTBAPP_BASELINE_FILES}/otbOSMDownloaderOutput.shp
+#                              ${TEMP}/apTvUtOSMDownloader.shp)
 
 
 #----------- ConcatenateVectorData TESTS ----------------
diff --git a/Modules/Core/Common/CMakeLists.txt b/Modules/Core/Common/CMakeLists.txt
index e180e1e..d468e29 100644
--- a/Modules/Core/Common/CMakeLists.txt
+++ b/Modules/Core/Common/CMakeLists.txt
@@ -7,6 +7,7 @@ foreach(_otb_module_activation_option IN LISTS OTB_MODULE_ACTIVATION_OPTION_LIST
   file(APPEND ${OTBCommon_BINARY_DIR}/otbConfigure.h.in
        "#cmakedefine ${_otb_module_activation_option}\n")
 endforeach()
+
 configure_file(${OTBCommon_BINARY_DIR}/otbConfigure.h.in otbConfigure.h)
 
 set(OTBCommon_INCLUDE_DIRS
diff --git a/Modules/Core/Common/include/otbCast.h b/Modules/Core/Common/include/otbCast.h
new file mode 100644
index 0000000..635e5bc
--- /dev/null
+++ b/Modules/Core/Common/include/otbCast.h
@@ -0,0 +1,96 @@
+/*=========================================================================
+
+  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 __otbCast_h
+#define __otbCast_h
+
+#include "itkSmartPointer.h"
+
+namespace otb
+{
+/**
+ * \brief dynamic_cast<>() like operator to work with itk::SmartPointer<>.
+ *
+ * Works like C++ dynamic_cast<>() operator:
+ *
+ *   DerivedClass::Pointer pointer(
+ *     itk::DynamicCast< DerivedClass >( smartPointerToBaseClass )
+ *   );
+ */
+template< typename T2, typename T1 >
+inline
+itk::SmartPointer< T2 >
+DynamicCast( const itk::SmartPointer< T1 > & p1 )
+{
+  return
+    typename itk::SmartPointer< T2 >(
+      dynamic_cast< typename itk::SmartPointer< T2 >::ObjectType * >(
+	p1.GetPointer()
+      )
+    );
+}
+
+/**
+ * \brief const_cast<>() like operator to work with itk::SmartPointer<>.
+ *
+ * Works like C++ const_cast<>() operator:
+ *
+ *   MyClass::Pointer pointer(
+ *     itk::ConstCast< DerivedClass >( smartPointerToConstInstance )
+ *   );
+ */
+template< typename T2, typename T1 >
+inline
+itk::SmartPointer< const T2 >
+ConstCast( const itk::SmartPointer< T1 > & p1 )
+{
+  return
+    typename itk::SmartPointer< const T2 >(
+      const_cast< typename itk::SmartPointer< const T2 >::ObjectType * >(
+	p1.GetPointer()
+      )
+    );
+}
+
+/**
+ * \brief const_cast<>() like operator to work with itk::SmartPointer<>.
+ *
+ * Works like C++ const_cast<>() operator:
+ *
+ *   MyClass::ConstPointer constPointer(
+ *     itk::ConstCast< const DerivedClass >(
+ *       smartPointerToNonConstInstance
+ *     )
+ *   );
+ */
+template< typename T2, typename T1 >
+inline
+itk::SmartPointer< T2 >
+ConstCast( const itk::SmartPointer< const T1 > & p1 )
+{
+  return
+    typename itk::SmartPointer< T2 >(
+      const_cast< typename itk::SmartPointer< T2 >::ObjectType * >(
+	p1.GetPointer()
+      )
+    );
+}
+
+} // end namespace otb.
+
+#endif // __otbCast_h
diff --git a/Modules/Core/Common/include/otbConfigurationManager.h b/Modules/Core/Common/include/otbConfigurationManager.h
index 6d8e7bc..60e9577 100644
--- a/Modules/Core/Common/include/otbConfigurationManager.h
+++ b/Modules/Core/Common/include/otbConfigurationManager.h
@@ -29,6 +29,8 @@
 #include <string>
 #include <boost/cstdint.hpp>
 
+#include "OTBCommonExport.h"
+
 namespace otb
 {
 /**
@@ -41,7 +43,7 @@ namespace otb
  * Please refer to each static method documentation for available
  * configuration values and related environment variables.
  */
-class ConfigurationManager
+class OTBCommon_EXPORT ConfigurationManager
 {
 public:
 #if ITK_VERSION_MAJOR < 4 || (ITK_VERSION_MAJOR == 4 && ITK_VERSION_MINOR <= 8)
@@ -51,7 +53,7 @@ public:
 #endif
 
   /**
-   * DEMDirectory is a directory were DEM tiles are stored. 
+   * DEMDirectory is a directory were DEM tiles are stored.
    *
    * If environment variable OTB_DEM_DIRECTORY is defined,
    * returns it contents as a string
@@ -74,7 +76,7 @@ public:
    *
    * If environment variable OTB_MAX_RAM_HINT is defined and could be
    * converted to int, return its content as a 64 bits unsigned int.
-   * Else, returns default value, which is 128 Mb 
+   * Else, returns default value, which is 128 Mb
    *
    */
   static RAMValueType GetMaxRAMHint();
diff --git a/Modules/Core/Common/include/otbFilterWatcherBase.h b/Modules/Core/Common/include/otbFilterWatcherBase.h
index e9d7475..ee4e61c 100644
--- a/Modules/Core/Common/include/otbFilterWatcherBase.h
+++ b/Modules/Core/Common/include/otbFilterWatcherBase.h
@@ -25,9 +25,11 @@
 #include "itkProcessObject.h"
 #include "itkTimeProbe.h"
 
+#include "OTBCommonExport.h"
+
 namespace otb
-{
 
+{
 /** \class FilterWatcherBase
  *  \brief This class is an abstract class
  *         Provides an interface to progress task mechanic
@@ -40,7 +42,7 @@ namespace otb
  *
  * \ingroup OTBCommon
  */
-class /*ITK_EXPORT*/ FilterWatcherBase
+class OTBCommon_EXPORT FilterWatcherBase
 {
 public:
 
diff --git a/Modules/Core/Common/include/otbFunctionToImageFilter.h b/Modules/Core/Common/include/otbFunctionToImageFilter.h
index 5cea5d2..40c1a24 100644
--- a/Modules/Core/Common/include/otbFunctionToImageFilter.h
+++ b/Modules/Core/Common/include/otbFunctionToImageFilter.h
@@ -93,6 +93,10 @@ public:
   {
     return m_PixelFunction;
   }
+  FunctionType const* GetFunction() const
+  {
+    return m_PixelFunction;
+  }
 
 
   /** Image dimensions */
diff --git a/Modules/Core/Common/include/otbImageAndVectorImageOperationFilter.h b/Modules/Core/Common/include/otbImageAndVectorImageOperationFilter.h
index 5eb8fac..dd664b0 100644
--- a/Modules/Core/Common/include/otbImageAndVectorImageOperationFilter.h
+++ b/Modules/Core/Common/include/otbImageAndVectorImageOperationFilter.h
@@ -25,6 +25,8 @@
 #include "itkBinaryFunctorImageFilter.h"
 #include "itkImageToImageFilter.h"
 
+#include "otbMacro.h"
+
 namespace otb
 {
 namespace Functor
@@ -35,7 +37,7 @@ class ITK_EXPORT ImageAndVectorImageOperationFunctor
 public:
   typedef typename TVectorInput::ValueType                        InternalInputPixelType;
   typedef typename TOutput::ValueType                             InternalOutputPixelType;
-  typedef enum {MULTIPLICATION, ADDITION, DIVISON, SUBSTRACTION } OperatorType;
+  typedef enum {MULTIPLICATION, ADDITION, DIVISION, SUBTRACTION } OperatorType;
 
   ImageAndVectorImageOperationFunctor()
     {
@@ -70,7 +72,7 @@ public:
         vInTmp += static_cast<InternalInputPixelType>(inPix);
         break;
         }
-      case DIVISON:
+      case DIVISION:
         {
         if (inPix != 0) vInTmp /= static_cast<InternalInputPixelType>(inPix);
         else
@@ -79,7 +81,7 @@ public:
           }
         break;
         }
-      case SUBSTRACTION:
+      case SUBTRACTION:
         {
         vInTmp -= static_cast<InternalInputPixelType>(inPix);
         break;
@@ -104,9 +106,9 @@ protected:
 /** \class ImageAndVectorImageOperationFilter
  * \brief Provides simple pixel to pixel operation between Image and VectorImage.
  *
- * Apply an operation (multiplication, division, addition or substraction) between
+ * Apply an operation (multiplication, division, addition or subtraction) between
  * the input image and each channel of the vector input image.
- * Use SetOperation( MULTIPLICATION, ADDITION, DIVISON or SUBSTRACTION ) to select the wanted operation.
+ * Use SetOperation( MULTIPLICATION, ADDITION, DIVISION or SUBTRACTION ) to select the wanted operation.
  * Default is an addition.
  *
  * This class is templated over the input Image and VectorImage and output VectorImage types.
@@ -171,14 +173,22 @@ public:
   itkGetMacro(UseAddition, bool);
   itkGetMacro(UseMultiplication, bool);
   itkGetMacro(UseDivision, bool);
-  itkGetMacro(UseSubstraction, bool);
+  itkGetMacro(UseSubtraction, bool);
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED.  */
+  virtual bool GetUseSubstraction()
+  {
+    otbWarningMacro(
+      << "GetUseSubstraction has been deprecated.  Please use GetUseSubtraction() instead");
+    return GetUseSubtraction();
+  }
 
   void UseAddition()
   {
     m_UseAddition = true;
     m_UseMultiplication = false;
     m_UseDivision = false;
-    m_UseSubstraction = false;
+    m_UseSubtraction = false;
     this->GetFunctor().SetOperator(static_cast<OperatorType>(1));
     this->Modified();
   }
@@ -187,7 +197,7 @@ public:
     m_UseAddition = false;
     m_UseMultiplication = true;
     m_UseDivision = false;
-    m_UseSubstraction = false;
+    m_UseSubtraction = false;
     this->GetFunctor().SetOperator(static_cast<OperatorType>(0));
     this->Modified();
   }
@@ -196,16 +206,16 @@ public:
     m_UseAddition = false;
     m_UseMultiplication = false;
     m_UseDivision = true;
-    m_UseSubstraction = false;
+    m_UseSubtraction = false;
     this->GetFunctor().SetOperator(static_cast<OperatorType>(2));
     this->Modified();
   }
-  void UseSubstraction()
+  void UseSubtraction()
   {
     m_UseAddition = false;
     m_UseMultiplication = false;
     m_UseDivision = false;
-    m_UseSubstraction = true;
+    m_UseSubtraction = true;
     this->GetFunctor().SetOperator(static_cast<OperatorType>(3));
     this->Modified();
   }
@@ -226,7 +236,7 @@ private:
   bool m_UseAddition;
   bool m_UseMultiplication;
   bool m_UseDivision;
-  bool m_UseSubstraction;
+  bool m_UseSubtraction;
 };
 
 } // end namespace otb
diff --git a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.h b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.h
index fc4cad3..41538ff 100644
--- a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.h
+++ b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.h
@@ -160,7 +160,7 @@ private:
   // This reflects the input image tiling
   SizeType   m_TileHint;
 
-  // This contains the ImageRegion that is currently beeing split
+  // This contains the ImageRegion that is currently being split
   RegionType m_ImageRegion;
 
   // This contains the requested number of splits
diff --git a/Modules/Core/Common/include/otbImageRegionNonUniformMultidimensionalSplitter.h b/Modules/Core/Common/include/otbImageRegionNonUniformMultidimensionalSplitter.h
index c257af0..bad655d 100644
--- a/Modules/Core/Common/include/otbImageRegionNonUniformMultidimensionalSplitter.h
+++ b/Modules/Core/Common/include/otbImageRegionNonUniformMultidimensionalSplitter.h
@@ -89,7 +89,7 @@ public:
   /** Region typedef support.   */
   typedef itk::ImageRegion<VImageDimension> RegionType;
 
-  /** How many pieces can the specifed region be split? A given region
+  /** How many pieces can the specified region be split? A given region
    * cannot always be divided into the requested number of pieces.  For
    * instance, if the numberOfPieces exceeds the number of pixels along
    * a certain dimensions, then some splits will not be possible. This
diff --git a/Modules/Core/Common/include/otbImageRegionTileMapSplitter.h b/Modules/Core/Common/include/otbImageRegionTileMapSplitter.h
index a7e5fca..d75b7d5 100644
--- a/Modules/Core/Common/include/otbImageRegionTileMapSplitter.h
+++ b/Modules/Core/Common/include/otbImageRegionTileMapSplitter.h
@@ -104,7 +104,7 @@ public:
   /** Region typedef support.   */
   typedef itk::ImageRegion<VImageDimension> RegionType;
 
-  /** How many pieces can the specifed region be split? A given region
+  /** How many pieces can the specified region be split? A given region
        * cannot always be divided into the requested number of pieces.  For
        * instance, if the numberOfPieces exceeds the number of pixels along
        * a certain dimensions, then some splits will not be possible. This
diff --git a/Modules/Core/Common/include/otbMacro.h b/Modules/Core/Common/include/otbMacro.h
index 9d74524..26b4873 100644
--- a/Modules/Core/Common/include/otbMacro.h
+++ b/Modules/Core/Common/include/otbMacro.h
@@ -179,7 +179,7 @@ namespace otb
     catch (...) \
       { \
       std::ostringstream message; \
-      message << "otb::ERROR Unknow error while running " << # command << " (catch(...) )"; \
+      message << "otb::ERROR Unknown error while running " << # command << " (catch(...) )"; \
       ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str(), ITK_LOCATION); \
       throw e_; \
       } \
@@ -210,7 +210,7 @@ namespace otb
     catch (...) \
       { \
       std::ostringstream message; \
-      message << "otb::ERROR Unknow error while running " << # command << " (catch(...) )"; \
+      message << "otb::ERROR Unknown error while running " << # command << " (catch(...) )"; \
       ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str(), ITK_LOCATION); \
       throw e_; \
       } \
@@ -225,4 +225,15 @@ namespace otb
 
 #  define otbUnusedMacro(x) do { (void)sizeof(x); } while(0)
 
+//
+// Unused variable warnings in Debug/Release management.
+// see http://stackoverflow.com/questions/2290509/debug-vs-ndebug#2290616
+#ifdef OTB_DEBUG
+# define otbUseInDebug( name ) name
+# define otbUseInRelease( name )
+#else // NDEBUG
+# define otbUseInDebug( name )
+# define otbUseInRelease( name ) name
+#endif // NDEBUG
+
 #endif //end of otbMacro.h
diff --git a/Modules/Core/Common/include/otbModelComponentBase.h b/Modules/Core/Common/include/otbModelComponentBase.h
index 3476680..51ae7df 100644
--- a/Modules/Core/Common/include/otbModelComponentBase.h
+++ b/Modules/Core/Common/include/otbModelComponentBase.h
@@ -134,7 +134,7 @@ protected:
   virtual void GenerateData();
 
   /** stores the pointer to the membership function.
-   * subclasses use this funtion to store their membership function
+   * subclasses use this function to store their membership function
    * object after dynamic creation, when available */
   void SetPdfMembershipFunction(MembershipFunctionType* function);
 
diff --git a/Modules/Core/Common/include/otbRGBAPixelConverter.h b/Modules/Core/Common/include/otbRGBAPixelConverter.h
index 5dc1cb2..2a47d0b 100644
--- a/Modules/Core/Common/include/otbRGBAPixelConverter.h
+++ b/Modules/Core/Common/include/otbRGBAPixelConverter.h
@@ -31,7 +31,7 @@ namespace otb
  * type
  *
  * To be usable, the desired conversion must be implemented through
- * partial specialisation mecanism.
+ * partial specialisation mechanism.
  *
  *
  * \ingroup OTBCommon
diff --git a/Modules/Core/Common/include/otbRectangle.h b/Modules/Core/Common/include/otbRectangle.h
index 7dd144e..a91a765 100644
--- a/Modules/Core/Common/include/otbRectangle.h
+++ b/Modules/Core/Common/include/otbRectangle.h
@@ -78,7 +78,7 @@ public:
   itkGetMacro(Orientation, ValueType);
 
   /**
-   * Check wether point is strictly inside the rectangle.
+   * Check whether point is strictly inside the rectangle.
    * \param point The point to check.
    * \return True if the point is inside the polygon.
    */
diff --git a/Modules/Core/Common/include/otbRectangle.txx b/Modules/Core/Common/include/otbRectangle.txx
index 7b8e4b8..b375932 100644
--- a/Modules/Core/Common/include/otbRectangle.txx
+++ b/Modules/Core/Common/include/otbRectangle.txx
@@ -24,7 +24,7 @@ namespace otb
 {
 
 /**
- * Check wether point is strictly inside the polygon.
+ * Check whether point is strictly inside the polygon.
  * \param point The point to check.
  * \return True if the point is inside the polygon.
  */
@@ -208,7 +208,7 @@ void
 Rectangle<TValue>
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
-  os << indent << "Verticies:  " << m_VertexList << std::endl;
+  os << indent << "Vertices:  " << m_VertexList << std::endl;
 }
 
 } // End namespace otb
diff --git a/Modules/Core/Common/include/otbStandardFilterWatcher.h b/Modules/Core/Common/include/otbStandardFilterWatcher.h
index 8bced11..acd3f60 100644
--- a/Modules/Core/Common/include/otbStandardFilterWatcher.h
+++ b/Modules/Core/Common/include/otbStandardFilterWatcher.h
@@ -48,7 +48,7 @@ namespace otb
  *
  * \ingroup OTBCommon
  */
-class /*ITK_EXPORT*/ StandardFilterWatcher : public FilterWatcherBase
+class OTBCommon_EXPORT StandardFilterWatcher : public FilterWatcherBase
 {
 public:
 
diff --git a/Modules/Core/Common/include/otbStandardOneLineFilterWatcher.h b/Modules/Core/Common/include/otbStandardOneLineFilterWatcher.h
index 453249d..642a24e 100644
--- a/Modules/Core/Common/include/otbStandardOneLineFilterWatcher.h
+++ b/Modules/Core/Common/include/otbStandardOneLineFilterWatcher.h
@@ -48,7 +48,7 @@ namespace otb
  *
  * \ingroup OTBCommon
  */
-class /*ITK_EXPORT*/ StandardOneLineFilterWatcher : public FilterWatcherBase
+class OTBCommon_EXPORT StandardOneLineFilterWatcher : public FilterWatcherBase
 {
 public:
 
diff --git a/Modules/Core/Common/include/otbStandardWriterWatcher.h b/Modules/Core/Common/include/otbStandardWriterWatcher.h
index 77a3f09..5c5d593 100644
--- a/Modules/Core/Common/include/otbStandardWriterWatcher.h
+++ b/Modules/Core/Common/include/otbStandardWriterWatcher.h
@@ -48,7 +48,7 @@ namespace otb
  *
  * \ingroup OTBCommon
  */
-class /*ITK_EXPORT*/ StandardWriterWatcher : public WriterWatcherBase
+class OTBCommon_EXPORT StandardWriterWatcher : public WriterWatcherBase
 {
 public:
 
diff --git a/Modules/Core/Common/include/otbSystem.h b/Modules/Core/Common/include/otbSystem.h
index ad2277e..975277a 100644
--- a/Modules/Core/Common/include/otbSystem.h
+++ b/Modules/Core/Common/include/otbSystem.h
@@ -24,6 +24,8 @@
 #include "itksys/SystemTools.hxx"
 #include "itkMacro.h"
 
+#include "OTBCommonExport.h"
+
 namespace otb
 {
 
@@ -35,7 +37,7 @@ namespace otb
  *
  * \ingroup OTBCommon
  */
-class ITK_EXPORT System
+class OTBCommon_EXPORT System
 {
 public:
 
@@ -55,7 +57,14 @@ public:
   static bool ParseHdfFileName(const std::string& id, std::string& file, unsigned int& datasetNum);
 
   /** Parse a filename with additional information */
-  static bool ParseFileNameForAdditonalInfo(const std::string& id, std::string& file, unsigned int& addNum);
+  static bool ParseFileNameForAdditionalInfo(const std::string& id, std::string& file, unsigned int& addNum);
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. use
+* ParseFileNameForAdditionalInfo instead*/
+  static bool ParseFileNameForAdditonalInfo (const std::string& id, std::string& file, unsigned int& addNum)
+  {
+    return ParseFileNameForAdditionalInfo(id, file, addNum);
+  }
 };
 
 } // namespace otb
diff --git a/Modules/Core/Common/include/otbUtils.h b/Modules/Core/Common/include/otbUtils.h
index 1784646..de2dd2b 100644
--- a/Modules/Core/Common/include/otbUtils.h
+++ b/Modules/Core/Common/include/otbUtils.h
@@ -19,6 +19,7 @@
 #define otbUtils_h
 
 #include "itkMacro.h"
+#include "OTBCommonExport.h"
 
 namespace otb
 {
@@ -26,7 +27,7 @@ namespace otb
 /** \class Utils
  * \brief Utils operations.
  *
- * Some usefull utilities in use across the library
+ * Some useful utilities in use across the library
  *
  *
  * \ingroup OTBCommon
@@ -34,7 +35,7 @@ namespace otb
 namespace Utils
 {
   /** Check that the values for lon, lat are reasonable */
-  bool IsLonLatValid(double lon, double lat);
+  bool OTBCommon_EXPORT IsLonLatValid(double lon, double lat);
 
   template <class T>
     inline std::string ConvertToString (const T& v)
diff --git a/Modules/Core/Common/include/otbVariableLengthVectorConverter.h b/Modules/Core/Common/include/otbVariableLengthVectorConverter.h
index 525abe5..93f336e 100644
--- a/Modules/Core/Common/include/otbVariableLengthVectorConverter.h
+++ b/Modules/Core/Common/include/otbVariableLengthVectorConverter.h
@@ -32,7 +32,7 @@ namespace otb
  * \brief Convert any data container type into a VariableLengthVector.
  *
  * To be usable, the desired conversion must be implemented through
- * partial specialisation mecanism.
+ * partial specialisation mechanism.
  *
  *
  * \ingroup OTBCommon
diff --git a/Modules/Core/Common/include/otbWriterWatcherBase.h b/Modules/Core/Common/include/otbWriterWatcherBase.h
index eacefa4..1fd6203 100644
--- a/Modules/Core/Common/include/otbWriterWatcherBase.h
+++ b/Modules/Core/Common/include/otbWriterWatcherBase.h
@@ -25,6 +25,8 @@
 #include "itkProcessObject.h"
 #include "itkTimeProbe.h"
 
+#include "OTBCommonExport.h"
+
 namespace otb
 {
 
@@ -43,7 +45,7 @@ namespace otb
  *
  * \ingroup OTBCommon
  */
-class /*ITK_EXPORT*/ WriterWatcherBase
+class OTBCommon_EXPORT WriterWatcherBase
 {
 public:
 
diff --git a/Modules/Core/Common/otb-module.cmake b/Modules/Core/Common/otb-module.cmake
index 7501fbd..f94865e 100644
--- a/Modules/Core/Common/otb-module.cmake
+++ b/Modules/Core/Common/otb-module.cmake
@@ -1,6 +1,7 @@
 set(DOCUMENTATION "TO BE DOCUMENTED")
 
 otb_module(OTBCommon
+ENABLE_SHARED
   DEPENDS
     OTBBoost
     OTBITK
diff --git a/Modules/Core/Common/src/otbConfigure.h.in b/Modules/Core/Common/src/otbConfigure.h.in
index 38ac5b8..b696d64 100644
--- a/Modules/Core/Common/src/otbConfigure.h.in
+++ b/Modules/Core/Common/src/otbConfigure.h.in
@@ -3,18 +3,11 @@
 #define OTB_VERSION_PATCH @OTB_VERSION_PATCH@
 #define OTB_VERSION_STRING "@OTB_VERSION_STRING@"
 
-/* TODO : do we need a compile macro for BUILD_SHARED_LIBS ? */
-#if 0
+#cmakedefine OTB_CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
+
 #cmakedefine OTB_BUILD_SHARED_LIBS
-#ifdef OTB_BUILD_SHARED_LIBS
-#define OTBDLL
-#else
-#define OTBSTATIC
-#define OSSIMSTATIC
-#endif
-#endif
 
-/* Show developper debug messages */
+/* Show developer debug messages */
 #cmakedefine OTB_SHOW_ALL_MSG_DEBUG
 
 #cmakedefine OTB_USE_GDAL_20
diff --git a/Modules/Core/Common/src/otbSystem.cxx b/Modules/Core/Common/src/otbSystem.cxx
index c0a0630..9b2c52a 100644
--- a/Modules/Core/Common/src/otbSystem.cxx
+++ b/Modules/Core/Common/src/otbSystem.cxx
@@ -181,7 +181,7 @@ bool System::ParseHdfFileName(const std::string& id, std::string& file, unsigned
  * it will return filelocation/file.*** in file
  * and 10 in addNum additional
  */
-bool System::ParseFileNameForAdditonalInfo(const std::string& id, std::string& file, unsigned int& addNum)
+bool System::ParseFileNameForAdditionalInfo(const std::string& id, std::string& file, unsigned int& addNum)
 {
   std::size_t pos = id.rfind(":");
   if (pos == std::string::npos) return false;
diff --git a/Modules/Core/Common/test/otbSystemTest.cxx b/Modules/Core/Common/test/otbSystemTest.cxx
index e2adb3a..493d3b5 100644
--- a/Modules/Core/Common/test/otbSystemTest.cxx
+++ b/Modules/Core/Common/test/otbSystemTest.cxx
@@ -28,7 +28,7 @@ int otbSystemTest(int itkNotUsed(argc), char * argv[])
   const char *       inputDirName   = argv[2];
   std::ostringstream msg;
 
-  // Check instanciation test
+  // Check instantiation test
   otb::System * var(ITK_NULLPTR);
   var = new otb::System();
   delete var;
diff --git a/Modules/Core/ImageBase/include/otbImageIOBase.h b/Modules/Core/ImageBase/include/otbImageIOBase.h
index 9e7ecba..015bfb2 100644
--- a/Modules/Core/ImageBase/include/otbImageIOBase.h
+++ b/Modules/Core/ImageBase/include/otbImageIOBase.h
@@ -24,6 +24,8 @@
 
 #include <string>
 
+#include "OTBImageBaseExport.h"
+
 namespace otb
 {
 
@@ -56,7 +58,7 @@ namespace otb
  *
  * \ingroup OTBImageBase
  */
-class ITK_EXPORT ImageIOBase : public itk::LightProcessObject
+class OTBImageBase_EXPORT ImageIOBase : public itk::LightProcessObject
 {
 public:
   /** Standard class typedefs. */
@@ -152,7 +154,7 @@ public:
    * to the IO mechanisms for data conversions.  PixelTypes can be
    * SCALAR, RGB, RGBA, VECTOR, COVARIANTVECTOR, POINT, INDEX. If
    * the PIXELTYPE is SCALAR, then the NumberOfComponents should be 1.
-   * Anyother of PIXELTYPE will have more than one component. */
+   * Any other of PIXELTYPE will have more than one component. */
   itkSetEnumMacro(PixelType, IOPixelType);
   itkGetEnumMacro(PixelType, IOPixelType);
 
@@ -310,7 +312,7 @@ public:
     return false;
     }
 
-  /** Read the spacing and dimentions of the image.
+  /** Read the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   virtual void ReadImageInformation() = 0;
 
@@ -334,7 +336,7 @@ public:
     return false;
     }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   virtual void WriteImageInformation() = 0;
 
@@ -374,13 +376,13 @@ public:
    * that is Streaming/PasteRegion/Compression/Filename etc
    * If pasting is being used the number of requested splits is for that
    * region not the largest. The derived ImageIO class should verify that
-   * the file is capable of being writen with this configuration.
+   * the file is capable of being written with this configuration.
    * If pasted is enabled and is not support or does not work with the file,
    * then an excepetion should be thrown.
    *
    * The default implementation depends on CanStreamWrite.
    * If false then 1 is returned (unless pasting is indicated), so that the whole file will be updated in one region.
-   * If true then its assumed that any arbitrary region can be writen
+   * If true then its assumed that any arbitrary region can be written
    * to any file. So the users request will be respected. If a derived
    * class has more restictive conditions then they should be checked
    */
diff --git a/Modules/Core/ImageBase/otb-module.cmake b/Modules/Core/ImageBase/otb-module.cmake
index c76c948..f366185 100644
--- a/Modules/Core/ImageBase/otb-module.cmake
+++ b/Modules/Core/ImageBase/otb-module.cmake
@@ -2,6 +2,7 @@ set(DOCUMENTATION "This module contains base classes that allow the
 representation of mono- and multiband images.")
 
 otb_module(OTBImageBase
+ENABLE_SHARED
   DEPENDS
     OTBCommon
     OTBITK
diff --git a/Modules/Core/ImageBase/test/otbImageAndVectorImageOperationFilterTest.cxx b/Modules/Core/ImageBase/test/otbImageAndVectorImageOperationFilterTest.cxx
index 700c26b..f80ec21 100644
--- a/Modules/Core/ImageBase/test/otbImageAndVectorImageOperationFilterTest.cxx
+++ b/Modules/Core/ImageBase/test/otbImageAndVectorImageOperationFilterTest.cxx
@@ -63,7 +63,7 @@ int otbImageAndVectorImageOperationFilterTest(int itkNotUsed(argc), char * argv[
   writerAdd->SetFileName(outfnameAdd);
   writerAdd->Update();
 
-  filter->UseSubstraction();
+  filter->UseSubtraction();
   writerSub->SetInput(filter->GetOutput());
   writerSub->SetFileName(outfnameSub);
   writerSub->Update();
diff --git a/Modules/Core/Interpolation/include/otbBSplineDecompositionImageFilter.txx b/Modules/Core/Interpolation/include/otbBSplineDecompositionImageFilter.txx
index c614e4b..04899fb 100644
--- a/Modules/Core/Interpolation/include/otbBSplineDecompositionImageFilter.txx
+++ b/Modules/Core/Interpolation/include/otbBSplineDecompositionImageFilter.txx
@@ -62,7 +62,7 @@ BSplineDecompositionImageFilter<TInputImage, TOutputImage>
 {
 
   // See Unser, 1993, Part II, Equation 2.5,
-  //   or Unser, 1999, Box 2. for an explaination.
+  //   or Unser, 1999, Box 2. for an explanation.
 
   double c0 = 1.0;
 
@@ -173,8 +173,8 @@ void
 BSplineDecompositionImageFilter<TInputImage, TOutputImage>
 ::SetInitialCausalCoefficient(double z)
 {
-  /* begining InitialCausalCoefficient */
-  /* See Unser, 1999, Box 2 for explaination */
+  /* beginning InitialCausalCoefficient */
+  /* See Unser, 1999, Box 2 for explanation */
 
   double        sum, zn, z2n, iz;
   unsigned long horizon;
@@ -220,7 +220,7 @@ BSplineDecompositionImageFilter<TInputImage, TOutputImage>
 ::SetInitialAntiCausalCoefficient(double z)
 {
   // this initialization corresponds to mirror boundaries
-  /* See Unser, 1999, Box 2 for explaination */
+  /* See Unser, 1999, Box 2 for explanation */
   //  Also see erratum at http://bigwww.epfl.ch/publications/unser9902.html
   m_Scratch[m_DataLength[m_IteratorDirection] - 1] =
     (z / (z * z - 1.0)) *
diff --git a/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.h b/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.h
index 0d9fabd..3b1d9ac 100644
--- a/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.h
+++ b/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.h
@@ -165,19 +165,19 @@ private:
     * to an N-dimensional index. */
   void GeneratePointsToIndex();
 
-  /** Determines the indicies to use give the splines region of support */
+  /** Determines the indices to use give the splines region of support */
   void DetermineRegionOfSupport(vnl_matrix<long>& evaluateIndex,
                                 const ContinuousIndexType& x,
                                 unsigned int splineOrder) const;
 
-  /** Set the indicies in evaluateIndex at the boundaries based on mirror
+  /** Set the indices in evaluateIndex at the boundaries based on mirror
     * boundary conditions. */
   void ApplyMirrorBoundaryConditions(vnl_matrix<long>& evaluateIndex,
                                      unsigned int splineOrder) const;
 
   Iterator               m_CIterator;       // Iterator for traversing spline coefficients.
   unsigned long          m_MaxNumberInterpolationPoints;    // number of neighborhood points used for interpolation
-  std::vector<IndexType> m_PointsToIndex;     // Preallocation of interpolation neighborhood indicies
+  std::vector<IndexType> m_PointsToIndex;     // Preallocation of interpolation neighborhood indices
 
   CoefficientFilterPointer m_CoefficientFilter;
 
diff --git a/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.txx b/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.txx
index e76b860..b263dad 100644
--- a/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.txx
+++ b/Modules/Core/Interpolation/include/otbBSplineInterpolateImageFunction.txx
@@ -355,7 +355,7 @@ BSplineInterpolateImageFunction<TImageType, TCoordRep, TCoefficientType>
 {
   // For speed improvements we could make each case a separate function and use
   // function pointers to reference the correct weight order.
-  // Another possiblity would be to loop inside the case statement (reducing the number
+  // Another possibility would be to loop inside the case statement (reducing the number
   // of switch statement executions to one per routine call.
   // Left as is for now for readability.
   double w, w1, w2, w3, w4, w5, t, t0, t1, t2;
diff --git a/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.h b/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.h
index f62a3f5..e41339d 100644
--- a/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.h
+++ b/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.h
@@ -103,7 +103,7 @@ public:
     return m_Function;
   }
 
-  /** Initialize tables: need to be call explicitely */
+  /** Initialize tables: need to be call explicitly */
   virtual void Initialize();
 
   /** Weights normalization accessors*/
diff --git a/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.txx b/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.txx
index 8ad04c8..151d406 100644
--- a/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.txx
+++ b/Modules/Core/Interpolation/include/otbGenericInterpolateImageFunction.txx
@@ -168,7 +168,7 @@ GenericInterpolateImageFunction<TInputImage, TFunction, TBoundaryCondition, TCoo
     }
 }
 
-/** Initialize tables: need to be call explicitely */
+/** Initialize tables: need to be call explicitly */
 template<class TInputImage, class TFunction, class TBoundaryCondition, class TCoordRep>
 void
 GenericInterpolateImageFunction<TInputImage, TFunction, TBoundaryCondition, TCoordRep>
@@ -178,7 +178,7 @@ GenericInterpolateImageFunction<TInputImage, TFunction, TBoundaryCondition, TCoo
   this->ResetOffsetTable();
   // Tables initialization
   this->InitializeTables();
-  // fill the weigth table
+  // fill the weight table
   this->FillWeightOffsetTable();
   m_TablesHaveBeenGenerated = true;
 }
diff --git a/Modules/Core/Interpolation/include/otbWindowedSincInterpolateImageFunctionBase.h b/Modules/Core/Interpolation/include/otbWindowedSincInterpolateImageFunctionBase.h
index 852566f..bf5f407 100644
--- a/Modules/Core/Interpolation/include/otbWindowedSincInterpolateImageFunctionBase.h
+++ b/Modules/Core/Interpolation/include/otbWindowedSincInterpolateImageFunctionBase.h
@@ -101,7 +101,7 @@ namespace otb
  * classes.
  *
  * \par
- * The fouth (TCoordRep) is again standard for interpolating functions,
+ * The fourth (TCoordRep) is again standard for interpolating functions,
  * and should be float or double.
  *
  * \par CAVEATS
diff --git a/Modules/Core/Interpolation/test/otbStreamingTraits.cxx b/Modules/Core/Interpolation/test/otbStreamingTraits.cxx
index 4a21b2c..b11d5a8 100644
--- a/Modules/Core/Interpolation/test/otbStreamingTraits.cxx
+++ b/Modules/Core/Interpolation/test/otbStreamingTraits.cxx
@@ -26,7 +26,7 @@ const unsigned int Dimension = 2;
 typedef double     PixelType;
 
 template<class TInterpolatorType>
-void TestInstanciate()
+void TestInstantiate()
 {
   typename TInterpolatorType::Pointer instance = TInterpolatorType::New();
   std::cout << instance << std::endl;
@@ -38,18 +38,18 @@ int otbStreamingTraitsImage(int itkNotUsed(argc), char* itkNotUsed(argv) [])
   typedef otb::Image<PixelType, Dimension>      ImageType;
   typedef otb::StreamingTraits<ImageType>       StreamingTraits;
 
-  // Check that all internal types can be instanciated
-  TestInstanciate<StreamingTraits::NearestNeighborInterpolationType>();
-  TestInstanciate<StreamingTraits::LinearInterpolationType>();
-  TestInstanciate<StreamingTraits::BSplineInterpolationType>();
-  TestInstanciate<StreamingTraits::GaussianInterpolationType>();
-  TestInstanciate<StreamingTraits::CosineInterpolationType>();
-  TestInstanciate<StreamingTraits::HammingInterpolationType>();
-  TestInstanciate<StreamingTraits::WelchInterpolationType>();
-  TestInstanciate<StreamingTraits::LanczosInterpolationType>();
-  TestInstanciate<StreamingTraits::BlackmanInterpolationType>();
-  TestInstanciate<StreamingTraits::ProlateInterpolationType>();
-  TestInstanciate<StreamingTraits::BCOInterpolationType>();
+  // Check that all internal types can be instantiated
+  TestInstantiate<StreamingTraits::NearestNeighborInterpolationType>();
+  TestInstantiate<StreamingTraits::LinearInterpolationType>();
+  TestInstantiate<StreamingTraits::BSplineInterpolationType>();
+  TestInstantiate<StreamingTraits::GaussianInterpolationType>();
+  TestInstantiate<StreamingTraits::CosineInterpolationType>();
+  TestInstantiate<StreamingTraits::HammingInterpolationType>();
+  TestInstantiate<StreamingTraits::WelchInterpolationType>();
+  TestInstantiate<StreamingTraits::LanczosInterpolationType>();
+  TestInstantiate<StreamingTraits::BlackmanInterpolationType>();
+  TestInstantiate<StreamingTraits::ProlateInterpolationType>();
+  TestInstantiate<StreamingTraits::BCOInterpolationType>();
 
   return EXIT_SUCCESS;
 }
@@ -60,11 +60,11 @@ int otbStreamingTraitsVectorImage(int itkNotUsed(argc), char * itkNotUsed(argv)
   typedef otb::VectorImage<PixelType, Dimension>      ImageType;
   typedef otb::StreamingTraits<ImageType>             StreamingTraits;
 
-  // Check that all internal types can be instanciated
-  TestInstanciate<StreamingTraits::NearestNeighborInterpolationType>();
-  TestInstanciate<StreamingTraits::LinearInterpolationType>();
-  TestInstanciate<StreamingTraits::GaussianInterpolationType>();
-  TestInstanciate<StreamingTraits::BCOInterpolationType>();
+  // Check that all internal types can be instantiated
+  TestInstantiate<StreamingTraits::NearestNeighborInterpolationType>();
+  TestInstantiate<StreamingTraits::LinearInterpolationType>();
+  TestInstantiate<StreamingTraits::GaussianInterpolationType>();
+  TestInstantiate<StreamingTraits::BCOInterpolationType>();
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Core/LabelMap/include/otbLabelMapFeaturesFunctorImageFilter.h b/Modules/Core/LabelMap/include/otbLabelMapFeaturesFunctorImageFilter.h
index 6366e3f..c1a1045 100644
--- a/Modules/Core/LabelMap/include/otbLabelMapFeaturesFunctorImageFilter.h
+++ b/Modules/Core/LabelMap/include/otbLabelMapFeaturesFunctorImageFilter.h
@@ -33,7 +33,7 @@ namespace otb {
  *
  *  The LabelObject type must be an AttributeMapLabelObject.
  *
- *  This filter can not be instanciated on its own, since its purpose
+ *  This filter can not be instantiated on its own, since its purpose
  *  is to provide a base class for all LabelMap attributes enriching filters
  *
  * \sa otb::AttributeMapLabelObject
diff --git a/Modules/Core/LabelMap/include/otbLabelMapToLabelImageFilter.h b/Modules/Core/LabelMap/include/otbLabelMapToLabelImageFilter.h
index 3614df3..5c9c013 100644
--- a/Modules/Core/LabelMap/include/otbLabelMapToLabelImageFilter.h
+++ b/Modules/Core/LabelMap/include/otbLabelMapToLabelImageFilter.h
@@ -26,7 +26,7 @@ namespace otb {
  *
  * LabelMapToBinaryImageFilter to a label image.
  *
- * \author Gaetan Lehmann. Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France.
+ * \author Gaetan Lehmann. Biologie du Developement et de la Reproduction, INRA de Jouy-en-Josas, France.
  *
  * This implementation was taken from the Insight Journal paper:
  * http://hdl.handle.net/1926/584  or
diff --git a/Modules/Core/LabelMap/include/otbLabelMapToSampleListFilter.txx b/Modules/Core/LabelMap/include/otbLabelMapToSampleListFilter.txx
index 603cca3..23e612c 100644
--- a/Modules/Core/LabelMap/include/otbLabelMapToSampleListFilter.txx
+++ b/Modules/Core/LabelMap/include/otbLabelMapToSampleListFilter.txx
@@ -106,7 +106,7 @@ LabelMapToSampleListFilter<TInputLabelMap,TOutputListSample,TMeasurementFunctor>
   while( !it.IsAtEnd() )
     {
     // Get the measurement vector size of the output samplelist : once
-    // in the begining of the iterator
+    // in the beginning of the iterator
     if( isFirstIteration )
       {
       typename OutputSampleListType::MeasurementVectorSizeType measurementSize;
diff --git a/Modules/Core/LabelMap/include/otbLabelMapWithAdjacency.h b/Modules/Core/LabelMap/include/otbLabelMapWithAdjacency.h
index f50f4bd..a543091 100644
--- a/Modules/Core/LabelMap/include/otbLabelMapWithAdjacency.h
+++ b/Modules/Core/LabelMap/include/otbLabelMapWithAdjacency.h
@@ -26,7 +26,7 @@ PURPOSE.  See the above copyright notices for more information.
 namespace otb
 {
 /** \class LabelMapWithAdjacency
-*   \brief This class is a LabelMap with additionnal adjacency information.
+*   \brief This class is a LabelMap with additional adjacency information.
 *
 *   The adjacency information is stored as a map of set of labels, in
 *   order to avoid duplicated neighbors.
@@ -160,7 +160,7 @@ public:
     MergeFunctorType mergeFunctor;
     typename LabelObjectType::Pointer loOut = mergeFunctor(lo1, lo2);
 
-    // Move every occurence of label2 to label1 in adjacency map
+    // Move every occurrence of label2 to label1 in adjacency map
     for(typename AdjacentLabelsContainerType::iterator it = m_AdjacencyMap[label2].begin();
         it != m_AdjacencyMap[label2].end(); ++it)
       {
diff --git a/Modules/Core/LabelMap/include/otbLabelObjectFieldsFunctor.h b/Modules/Core/LabelMap/include/otbLabelObjectFieldsFunctor.h
index 4140c94..92bcf84 100644
--- a/Modules/Core/LabelMap/include/otbLabelObjectFieldsFunctor.h
+++ b/Modules/Core/LabelMap/include/otbLabelObjectFieldsFunctor.h
@@ -28,7 +28,7 @@ namespace Functor
 {
 
 /** \class LabelObjectFieldsFunctor
- *  \brief Returns additionnal OGR fields to be saved in VectorData
+ *  \brief Returns additional OGR fields to be saved in VectorData
  *
  * \sa LabelObjectWithClassLabelFieldsFunctor
  *
diff --git a/Modules/Core/LabelMap/include/otbLabelObjectWithClassLabelFieldsFunctor.h b/Modules/Core/LabelMap/include/otbLabelObjectWithClassLabelFieldsFunctor.h
index 1c89d8f..1cade1b 100644
--- a/Modules/Core/LabelMap/include/otbLabelObjectWithClassLabelFieldsFunctor.h
+++ b/Modules/Core/LabelMap/include/otbLabelObjectWithClassLabelFieldsFunctor.h
@@ -28,7 +28,7 @@ namespace Functor
 {
 
 /** \class LabelObjectWithClassLabelFieldsFunctor
- *  \brief Returns additionnal OGR fields to be saved in VectorData
+ *  \brief Returns additional OGR fields to be saved in VectorData
  *
  * \sa LabelObjectFieldsFunctor
  *
diff --git a/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.h b/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.h
index 7aa2b3b..850bb15 100644
--- a/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.h
+++ b/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.h
@@ -188,7 +188,7 @@ private:
  * the Flusser moments for each LabelObject.
  *
  * The flag ReducedAttributesSet allows computing only non-redundant
- * statistics and statistics usefull for classification (not spatially
+ * statistics and statistics useful for classification (not spatially
  * dependent statitistics). Reduced set contains only Flusser moments,
  * physical size, elongation, Feret diameter (if activated),
  * perimeter (if activated) and roundness (if activated).
diff --git a/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.txx b/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.txx
index 4b50830..e63c672 100644
--- a/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.txx
+++ b/Modules/Core/LabelMap/include/otbShapeAttributesLabelMapFilter.txx
@@ -317,7 +317,7 @@ ShapeAttributesLabelObjectFunctor<TLabelObject, TLabelImage>
     // first, the dimension 0
     if (idx[0] == borderMin[0])
       {
-      // the begining of the line
+      // the beginning of the line
       physicalSizeOnBorder += sizePerPixelPerDimension[0];
       }
     if (idx[0] + (long) length - 1 == borderMax[0])
@@ -377,7 +377,7 @@ ShapeAttributesLabelObjectFunctor<TLabelObject, TLabelImage>
     // the other ones
     for (DimensionType i = 1; i < LabelObjectType::ImageDimension; ++i)
       {
-      // do this one here to avoid the double assigment in the following loop
+      // do this one here to avoid the double assignment in the following loop
       // when i == j
       centralMoments[i][i] += length * physicalPosition[i] * physicalPosition[i];
       // central moments are symmetrics, so avoid to compute them 2 times
diff --git a/Modules/Core/LabelMap/include/otbStatisticsAttributesLabelMapFilter.h b/Modules/Core/LabelMap/include/otbStatisticsAttributesLabelMapFilter.h
index 0631497..1fb6081 100644
--- a/Modules/Core/LabelMap/include/otbStatisticsAttributesLabelMapFilter.h
+++ b/Modules/Core/LabelMap/include/otbStatisticsAttributesLabelMapFilter.h
@@ -114,7 +114,7 @@ private:
  * be "STATS::FeatureName::StatisticName".
  *
  * The flag ReducedAttributesSet allows computing only non-redundant
- * statistics and statistics usefull for classification (not spatially
+ * statistics and statistics useful for classification (not spatially
  * dependent statitistics). Reduced set contains only mean, variance,
  * skewness and kurtosis.
  *
diff --git a/Modules/Core/LabelMap/test/otbBandsStatisticsAttributesLabelMapFilter.cxx b/Modules/Core/LabelMap/test/otbBandsStatisticsAttributesLabelMapFilter.cxx
index 8c925fa..2cfd1b3 100644
--- a/Modules/Core/LabelMap/test/otbBandsStatisticsAttributesLabelMapFilter.cxx
+++ b/Modules/Core/LabelMap/test/otbBandsStatisticsAttributesLabelMapFilter.cxx
@@ -57,7 +57,7 @@ int otbBandsStatisticsAttributesLabelMapFilter(int itkNotUsed(argc), char* argv[
   const char * lfname   = argv[2];
   const char * outfname = argv[3];
 
-  // Filters instanciation
+  // Filters instantiation
   ReaderType::Pointer                reader              = ReaderType::New();
   LabeledReaderType::Pointer         labeledReader       = LabeledReaderType::New();
   LabelMapFilterType::Pointer        filter              = LabelMapFilterType::New();
diff --git a/Modules/Core/LabelMap/test/otbImageToLabelMapWithAttributesFilter.cxx b/Modules/Core/LabelMap/test/otbImageToLabelMapWithAttributesFilter.cxx
index fa31ffa..ec8ae99 100644
--- a/Modules/Core/LabelMap/test/otbImageToLabelMapWithAttributesFilter.cxx
+++ b/Modules/Core/LabelMap/test/otbImageToLabelMapWithAttributesFilter.cxx
@@ -37,7 +37,7 @@ int otbImageToLabelMapWithAttributesFilter(int itkNotUsed(argc), char* argv[])
   typedef otb::ImageFileReader<ImageType>                      ReaderType;
   typedef otb::ImageFileReader<LabeledImageType>               LabeledReaderType;
 
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   FilterType::Pointer         filter = FilterType::New();
   ReaderType::Pointer         reader = ReaderType::New();
   LabeledReaderType::Pointer  labeledReader = LabeledReaderType::New();
diff --git a/Modules/Core/LabelMap/test/otbKMeansAttributesLabelMapFilter.cxx b/Modules/Core/LabelMap/test/otbKMeansAttributesLabelMapFilter.cxx
index 768507a..dff334b 100644
--- a/Modules/Core/LabelMap/test/otbKMeansAttributesLabelMapFilter.cxx
+++ b/Modules/Core/LabelMap/test/otbKMeansAttributesLabelMapFilter.cxx
@@ -56,7 +56,7 @@ int otbKMeansAttributesLabelMapFilter(int itkNotUsed(argc), char * argv[])
   const char * lfname  = argv[2];
   const char * outfname = argv[3];
 
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   ReaderType::Pointer         reader = ReaderType::New();
   LabeledReaderType::Pointer  labeledReader = LabeledReaderType::New();
   LabelMapFilterType::Pointer filter = LabelMapFilterType::New();
diff --git a/Modules/Core/LabelMap/test/otbMinMaxAttributesLabelMapFilter.cxx b/Modules/Core/LabelMap/test/otbMinMaxAttributesLabelMapFilter.cxx
index 0ba6d84..bd36fe9 100644
--- a/Modules/Core/LabelMap/test/otbMinMaxAttributesLabelMapFilter.cxx
+++ b/Modules/Core/LabelMap/test/otbMinMaxAttributesLabelMapFilter.cxx
@@ -54,7 +54,7 @@ int otbMinMaxAttributesLabelMapFilter(int itkNotUsed(argc), char * argv[])
   const char * lfname  = argv[2];
   const char * outfname = argv[3];
 
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   ReaderType::Pointer         reader = ReaderType::New();
   LabeledReaderType::Pointer  labeledReader = LabeledReaderType::New();
   LabelMapFilterType::Pointer filter = LabelMapFilterType::New();
diff --git a/Modules/Core/LabelMap/test/otbNormalizeAttributesLabelMapFilter.cxx b/Modules/Core/LabelMap/test/otbNormalizeAttributesLabelMapFilter.cxx
index 6ea0f9a..689e444 100644
--- a/Modules/Core/LabelMap/test/otbNormalizeAttributesLabelMapFilter.cxx
+++ b/Modules/Core/LabelMap/test/otbNormalizeAttributesLabelMapFilter.cxx
@@ -56,7 +56,7 @@ int otbNormalizeAttributesLabelMapFilter(int itkNotUsed(argc), char * argv[])
   const char * lfname   = argv[2];
   const char * outfname = argv[3];
 
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   ReaderType::Pointer         reader = ReaderType::New();
   LabeledReaderType::Pointer  labeledReader = LabeledReaderType::New();
   LabelMapFilterType::Pointer filter = LabelMapFilterType::New();
diff --git a/Modules/Core/Metadata/include/otbDefaultImageMetadataInterface.h b/Modules/Core/Metadata/include/otbDefaultImageMetadataInterface.h
index b2fa104..704859b 100644
--- a/Modules/Core/Metadata/include/otbDefaultImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbDefaultImageMetadataInterface.h
@@ -20,7 +20,7 @@
 
 #include <algorithm>
 
-
+#include "OTBMetadataExport.h"
 #include "otbImageMetadataInterfaceBase.h"
 
 namespace otb
@@ -32,7 +32,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT DefaultImageMetadataInterface : public ImageMetadataInterfaceBase
+class OTBMetadata_EXPORT DefaultImageMetadataInterface : public ImageMetadataInterfaceBase
 {
 public:
 
@@ -152,7 +152,7 @@ public:
 
   bool CanRead() const ITK_OVERRIDE
   {
-    // This clas is the default one, it has to be able to call every metadata
+    // This class is the default one, it has to be able to call every metadata
     return true;
   }
 
diff --git a/Modules/Core/Metadata/include/otbDefaultImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbDefaultImageMetadataInterfaceFactory.h
index 7515336..fa2d585 100644
--- a/Modules/Core/Metadata/include/otbDefaultImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbDefaultImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbDefaultImageMetadataInterfaceFactory_h
 #define otbDefaultImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT DefaultImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT DefaultImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbFormosatImageMetadataInterface.h b/Modules/Core/Metadata/include/otbFormosatImageMetadataInterface.h
index d2a005f..78d952a 100644
--- a/Modules/Core/Metadata/include/otbFormosatImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbFormosatImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT FormosatImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT FormosatImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbFormosatImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbFormosatImageMetadataInterfaceFactory.h
index 91a62c2..1a6b839 100644
--- a/Modules/Core/Metadata/include/otbFormosatImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbFormosatImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbFormosatImageMetadataInterfaceFactory_h
 #define otbFormosatImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT FormosatImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT FormosatImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbIkonosImageMetadataInterface.h b/Modules/Core/Metadata/include/otbIkonosImageMetadataInterface.h
index 358161f..2eac071 100644
--- a/Modules/Core/Metadata/include/otbIkonosImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbIkonosImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT IkonosImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT IkonosImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbIkonosImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbIkonosImageMetadataInterfaceFactory.h
index 24c9212..c62e6e0 100644
--- a/Modules/Core/Metadata/include/otbIkonosImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbIkonosImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbIkonosImageMetadataInterfaceFactory_h
 #define otbIkonosImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT IkonosImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT IkonosImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h b/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h
index f607d16..4fe96d7 100644
--- a/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h
+++ b/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h
@@ -25,6 +25,8 @@
 #include "otbMetaDataKey.h"
 #include "itkImageBase.h"
 
+#include "OTBMetadataExport.h"
+
 namespace otb
 {
 
@@ -35,7 +37,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT ImageMetadataInterfaceBase : public itk::Object
+class OTBMetadata_EXPORT ImageMetadataInterfaceBase : public itk::Object
 {
 public:
 
@@ -136,10 +138,16 @@ public:
 
   /** Get the ImageKeywordlist */
   ImageKeywordlistType GetImageKeywordlist();
+
   const ImageKeywordlistType GetImageKeywordlist() const;
 
+  /** This method is less performant and has extra copy.
+  Please use bool GetSensorID(std::string& ) **/
+  std::string const GetSensorID() const;
+
   /** Get the sensor ID from the ossim metadata */
-  std::string GetSensorID() const;
+  bool GetSensorID(std::string & sensorId) const;
+
   //otbMetadataGetMacro(SensorID, std::string);
 
   /** Get the number of bands from the ossim metadata */
diff --git a/Modules/Core/Metadata/include/otbImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbImageMetadataInterfaceFactory.h
index 11bea1a..ed14107 100644
--- a/Modules/Core/Metadata/include/otbImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbImageMetadataInterfaceFactory.h
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT ImageMetadataInterfaceFactory : public itk::Object
+class OTBMetadata_EXPORT ImageMetadataInterfaceFactory : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbNoDataHelper.h b/Modules/Core/Metadata/include/otbNoDataHelper.h
index 4ab2546..d74c8b0 100644
--- a/Modules/Core/Metadata/include/otbNoDataHelper.h
+++ b/Modules/Core/Metadata/include/otbNoDataHelper.h
@@ -21,6 +21,7 @@
 #include <cassert>
 #include "vnl/vnl_math.h"
 #include <itkVariableLengthVector.h>
+#include "OTBMetadataExport.h"
 
 namespace itk
 {
@@ -30,17 +31,17 @@ class MetaDataDictionary;
 namespace otb
 {
 
-/** 
- * Reads no data flag from the MetaDataDictionnary dict to flags and values
- * vectors. Returns true upon success. 
+/**
+ * Reads no data flag from the MetaDataDictionary dict to flags and values
+ * vectors. Returns true upon success.
  */
-bool ReadNoDataFlags(const itk::MetaDataDictionary& dict, std::vector<bool> & flags, std::vector<double> & values);
+bool OTBMetadata_EXPORT ReadNoDataFlags(const itk::MetaDataDictionary& dict, std::vector<bool> & flags, std::vector<double> & values);
 
-/** 
- * Write no data flags to the MetaDataDictionnary dict from flags and values
- * vectors. Returns true upon success. 
+/**
+ * Write no data flags to the MetaDataDictionary dict from flags and values
+ * vectors. Returns true upon success.
  */
-void WriteNoDataFlags(const std::vector<bool> & flags, const std::vector<double> & values, itk::MetaDataDictionary& dict);
+void OTBMetadata_EXPORT WriteNoDataFlags(const std::vector<bool> & flags, const std::vector<double> & values, itk::MetaDataDictionary& dict);
 
 /**
 * Test if the pixel corresponds to a no data pixel according to a
@@ -75,14 +76,14 @@ template<typename T> bool IsNoData(const T & pixel, const
 * Reads a pixel and change the no data value if it is found. No data
 * value is changed either if the pixel value is NaN or if the pixel
 * value equals the no data value and flag is true.
-* 
+*
 * \param pixel The pixel to process \param flags A vector of size > 1
 * containing a flag per band to indicate if a no data value is
 * available for this band
 * \param values A vector of size > 1 corresponding to the current no data
 * value for each band. If flag is 0, the value will be ignored.
 * \param newValues A vector of size > 1 corresponding to the new no data
-* value for each band. If flag is 0, the value will be ignored 
+* value for each band. If flag is 0, the value will be ignored
 * \param nanIsNoData If true, NaN values will be considered as no-data
 * and changed as well.
 *
@@ -95,7 +96,7 @@ template<typename T> T ChangeNoData(const T & pixel, const
   assert(flags.size()>0);
   assert(values.size()>0);
   assert(newValues.size()>0);
-  
+
   if(nanIsNoData && vnl_math_isnan(pixel))
     {
     return static_cast<T>(newValues[0]);
@@ -142,7 +143,7 @@ template <typename T> itk::VariableLengthVector<T> ChangeNoData(const itk::Varia
   assert(newValues.size()>=pixel.Size());
 
   itk::VariableLengthVector<T> outPixel(pixel.Size());
-  
+
   for(unsigned int i = 0; i < pixel.Size();++i)
     {
     if((nanIsNoData && vnl_math_isnan(pixel[i])) || (flags[i] && (pixel[i] == values[i])))
@@ -158,8 +159,6 @@ template <typename T> itk::VariableLengthVector<T> ChangeNoData(const itk::Varia
   return outPixel;
 }
 
-
-
 } // End namespace otb
 
 #endif
diff --git a/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterface.h b/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterface.h
index d25d96f..45da65a 100644
--- a/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterface.h
@@ -32,7 +32,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT OpticalDefaultImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT OpticalDefaultImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
@@ -152,7 +152,7 @@ public:
 
   bool CanRead() const ITK_OVERRIDE
   {
-    // This clas is the default one, it has to be able to call every metadata
+    // This class is the default one, it has to be able to call every metadata
     return false;
   }
 
diff --git a/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterfaceFactory.h
index af4d0f4..d4f1ffd 100644
--- a/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbOpticalDefaultImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbOpticalDefaultImageMetadataInterfaceFactory_h
 #define otbOpticalDefaultImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT OpticalDefaultImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT OpticalDefaultImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbOpticalImageMetadataInterface.h b/Modules/Core/Metadata/include/otbOpticalImageMetadataInterface.h
index 7c2ca87..cc2e46d 100644
--- a/Modules/Core/Metadata/include/otbOpticalImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbOpticalImageMetadataInterface.h
@@ -33,7 +33,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT OpticalImageMetadataInterface : public ImageMetadataInterfaceBase
+class OTBMetadata_EXPORT OpticalImageMetadataInterface : public ImageMetadataInterfaceBase
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbOpticalImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbOpticalImageMetadataInterfaceFactory.h
index 30310fa..398d921 100644
--- a/Modules/Core/Metadata/include/otbOpticalImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbOpticalImageMetadataInterfaceFactory.h
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT OpticalImageMetadataInterfaceFactory : public itk::Object
+class OTBMetadata_EXPORT OpticalImageMetadataInterfaceFactory : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterface.h b/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterface.h
index 64d8bf2..bb48a2d 100644
--- a/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT PleiadesImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT PleiadesImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterfaceFactory.h
index 6b31c3b..884e7b8 100644
--- a/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbPleiadesImageMetadataInterfaceFactory.h
@@ -18,8 +18,8 @@
 #ifndef otbPleiadesImageMetadataInterfaceFactory_h
 #define otbPleiadesImageMetadataInterfaceFactory_h
 
-
 #include "itkObjectFactoryBase.h"
+#include "OTBMetadataExport.h"
 
 namespace otb
 {
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT PleiadesImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT PleiadesImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h b/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h
index 81b79cd..aa83f14 100644
--- a/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT QuickBirdImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT QuickBirdImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterfaceFactory.h
index 426ff73..32862a1 100644
--- a/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbQuickBirdImageMetadataInterfaceFactory_h
 #define otbQuickBirdImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT QuickBirdImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT QuickBirdImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterface.h
index 7e4e725..b8d7627 100644
--- a/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterface.h
@@ -30,7 +30,7 @@ namespace otb
  * \ingroup OTBMetadata
  */
 
-class ITK_ABI_EXPORT Radarsat2ImageMetadataInterface : public SarImageMetadataInterface
+class OTBMetadata_EXPORT Radarsat2ImageMetadataInterface : public SarImageMetadataInterface
 {
 public:
 
@@ -87,7 +87,7 @@ public:
 
   double GetCenterIncidenceAngle() const ITK_OVERRIDE;
 
-  /*get lookup data for calulating backscatter */
+  /*get lookup data for calculating backscatter */
   void CreateCalibrationLookupData(const short type) ITK_OVERRIDE;
 
 
diff --git a/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterfaceFactory.h
index 388452d..0bc9c5d 100644
--- a/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbRadarsat2ImageMetadataInterfaceFactory.h
@@ -19,6 +19,7 @@
 #define otbRadarsat2ImageMetadataInterfaceFactory_h
 
 #include "itkObjectFactoryBase.h"
+#include "OTBMetadataExport.h"
 
 namespace otb
 {
@@ -27,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT Radarsat2ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT Radarsat2ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h b/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h
index 7168ff1..92df65e 100644
--- a/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h
+++ b/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h
@@ -5,9 +5,11 @@
 #include <itkNumericTraits.h>
 #include <itkObjectFactory.h>
 
+#include "OTBMetadataExport.h"
+
 namespace otb {
 
-class ITK_EXPORT SarCalibrationLookupData : public itk::LightObject {
+class OTBMetadata_EXPORT SarCalibrationLookupData : public itk::LightObject {
 
   public:
 
diff --git a/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h
index b109f34..e6157a5 100644
--- a/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h
@@ -32,7 +32,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT SarDefaultImageMetadataInterface : public SarImageMetadataInterface
+class OTBMetadata_EXPORT SarDefaultImageMetadataInterface : public SarImageMetadataInterface
 {
 public:
 
@@ -187,7 +187,7 @@ public:
 
   bool CanRead() const ITK_OVERRIDE
   {
-    // This clas is the default one, it has to be able to call every metadata
+    // This class is the default one, it has to be able to call every metadata
     return false;
   }
 
diff --git a/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterfaceFactory.h
index 71543d0..0863368 100644
--- a/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbSarDefaultImageMetadataInterfaceFactory_h
 #define otbSarDefaultImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT SarDefaultImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT SarDefaultImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h
index 1a9047b..d002f0d 100644
--- a/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h
@@ -20,6 +20,7 @@
 
 #include <string>
 #include <vector>
+#include "OTBMetadataExport.h"
 #include "otbImageMetadataInterfaceBase.h"
 #include "itkPointSet.h"
 #include "otbSarCalibrationLookupData.h"
@@ -34,7 +35,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT SarImageMetadataInterface : public ImageMetadataInterfaceBase
+class OTBMetadata_EXPORT SarImageMetadataInterface : public ImageMetadataInterfaceBase
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbSarImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbSarImageMetadataInterfaceFactory.h
index b12c0b9..444daab 100644
--- a/Modules/Core/Metadata/include/otbSarImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbSarImageMetadataInterfaceFactory.h
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT SarImageMetadataInterfaceFactory : public itk::Object
+class OTBMetadata_EXPORT SarImageMetadataInterfaceFactory : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h
index d465989..9f7c4f2 100644
--- a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h
@@ -31,7 +31,7 @@ namespace otb
  * \ingroup OTBMetadata
  */
 
-class ITK_ABI_EXPORT Sentinel1ImageMetadataInterface : public SarImageMetadataInterface
+class OTBMetadata_EXPORT Sentinel1ImageMetadataInterface : public SarImageMetadataInterface
 {
 public:
 
@@ -88,7 +88,7 @@ public:
 
   double GetCenterIncidenceAngle() const ITK_OVERRIDE;
 
-  /*get lookup data for calulating backscatter */
+  /*get lookup data for calculating backscatter */
   void CreateCalibrationLookupData(const short type) ITK_OVERRIDE;
 
 protected:
diff --git a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h
index 18e0fb0..a53100c 100644
--- a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbSentinel1ImageMetadataInterfaceFactory_h
 #define otbSentinel1ImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT Sentinel1ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT Sentinel1ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h
index d1d3483..01833fc 100644
--- a/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT Spot6ImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT Spot6ImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterfaceFactory.h
index 7958c3c..eb86c2a 100644
--- a/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbSpot6ImageMetadataInterfaceFactory_h
 #define otbSpot6ImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT Spot6ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT Spot6ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbSpotImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSpotImageMetadataInterface.h
index 5e802dc..3005dd4 100644
--- a/Modules/Core/Metadata/include/otbSpotImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSpotImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT SpotImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT SpotImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbSpotImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbSpotImageMetadataInterfaceFactory.h
index 8ea90bc..5fd851c 100644
--- a/Modules/Core/Metadata/include/otbSpotImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbSpotImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbSpotImageMetadataInterfaceFactory_h
 #define otbSpotImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT SpotImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT SpotImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterface.h b/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterface.h
index 6877a03..a8a5304 100644
--- a/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterface.h
@@ -33,7 +33,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT TerraSarImageMetadataInterface : public SarImageMetadataInterface
+class OTBMetadata_EXPORT TerraSarImageMetadataInterface : public SarImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterfaceFactory.h
index 4e33968..589f5e2 100644
--- a/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbTerraSarImageMetadataInterfaceFactory.h
@@ -18,7 +18,7 @@
 #ifndef otbTerraSarImageMetadataInterfaceFactory_h
 #define otbTerraSarImageMetadataInterfaceFactory_h
 
-
+#include "OTBMetadataExport.h"
 #include "itkObjectFactoryBase.h"
 
 namespace otb
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT TerraSarImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT TerraSarImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterface.h
index 5383ae7..e114d93 100644
--- a/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterface.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT WorldView2ImageMetadataInterface : public OpticalImageMetadataInterface
+class OTBMetadata_EXPORT WorldView2ImageMetadataInterface : public OpticalImageMetadataInterface
 {
 public:
 
diff --git a/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterfaceFactory.h
index 6d83e95..c8be257 100644
--- a/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterfaceFactory.h
+++ b/Modules/Core/Metadata/include/otbWorldView2ImageMetadataInterfaceFactory.h
@@ -18,8 +18,8 @@
 #ifndef otbWorldView2ImageMetadataInterfaceFactory_h
 #define otbWorldView2ImageMetadataInterfaceFactory_h
 
-
 #include "itkObjectFactoryBase.h"
+#include "OTBMetadataExport.h"
 
 namespace otb
 {
@@ -28,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBMetadata
  */
-class ITK_EXPORT WorldView2ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+class OTBMetadata_EXPORT WorldView2ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Core/Metadata/otb-module.cmake b/Modules/Core/Metadata/otb-module.cmake
index 6e0e51f..837b87b 100644
--- a/Modules/Core/Metadata/otb-module.cmake
+++ b/Modules/Core/Metadata/otb-module.cmake
@@ -3,6 +3,7 @@ metadata files from different types of sensor (both optical and radar sensor typ
 are supported. for instance: Pleiades, SPOT6, TerraSar, and so on).")
 
 otb_module(OTBMetadata
+ENABLE_SHARED
   DEPENDS
     OTBObjectList
     OTBBoostAdapters
diff --git a/Modules/Core/Metadata/src/otbFormosatImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbFormosatImageMetadataInterface.cxx
index 59be97f..2c0f475 100644
--- a/Modules/Core/Metadata/src/otbFormosatImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbFormosatImageMetadataInterface.cxx
@@ -750,53 +750,53 @@ FormosatImageMetadataInterface
     {
     const float b0[281] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0.000219376,   0.000219425,   0.000231534,   0.000284519,
-     0.000550079,   0.001,   0.003,   0.006,   0.012,   0.0235,
-     0.035,   0.043,   0.0503893,   0.0525,   0.055,   0.0565,
-     0.058,   0.059,   0.059,   0.0608594,   0.061,   0.0615,
-     0.062,   0.063,   0.063,   0.064,   0.063,   0.064,
-     0.065,   0.066,   0.066,   0.066,   0.066,   0.0675,
-     0.069,   0.0708104,   0.0709615,   0.0709001,   0.071,   0.0715,
-     0.073,   0.074,   0.074,   0.073,   0.073,   0.0735,
-     0.075,   0.0765,   0.078,   0.078,   0.078,   0.0785,
-     0.0800145,   0.0815,   0.083,   0.083,   0.083,   0.083,
-     0.083,   0.0835,   0.085,   0.0865,   0.087,   0.088,
-     0.087,   0.087,   0.088,   0.0885,   0.0907023,   0.0915,
-     0.092,   0.092,   0.092,   0.092,   0.093,   0.094,
-     0.095,   0.096,   0.096,   0.096,   0.095,   0.095,
-     0.095,   0.095,   0.096,   0.0975,   0.098,   0.099,
-     0.099,   0.098,   0.098,   0.0965,   0.096,   0.0965,
-     0.098,   0.0985,   0.099,   0.0995,   0.099,   0.0975,
-     0.097,   0.0955,   0.095,   0.095,   0.095,   0.0965,
-     0.097,   0.098,   0.098,   0.0975,   0.097,   0.096,
-     0.095,   0.095,   0.094,   0.094,   0.095,   0.0955,
-     0.096,   0.097,   0.097,   0.097,   0.097,   0.097,
-     0.097,   0.096,   0.097,   0.097,   0.097,   0.098,
-     0.098,   0.096,   0.095,   0.094,   0.093,   0.092,
-     0.091,   0.0905658,   0.089,   0.089,   0.089,   0.088,
-     0.088,   0.0875,   0.087,   0.086,   0.085,   0.084,
-     0.083,   0.0825,   0.082,   0.081,   0.081,   0.0804051,
-     0.079,   0.078,   0.077,   0.077,   0.076,   0.075,
-     0.074,   0.0735,   0.073,   0.0725,   0.072,   0.071,
-     0.071,   0.0704136,   0.069,   0.0685,   0.068,   0.067,
-     0.066,   0.0645,   0.063,   0.062,   0.0607892,   0.059,
-     0.058,   0.057,   0.056,   0.0545,   0.052,   0.0455,
-     0.038,   0.0286994,   0.0202138,   0.0125,   0.007,   0.004,
-     0.002,   0.001,   0.000909856,   0.000512159,   0.000357051,   0.00029112,
-     0.000215752,   0.000187213,   0.000171918,   0.000169724,   0.000166392,   0.000163058,
-     0.000159726,   0.000156393,   0.000153061,   0.000149728,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.000219376f,   0.000219425f,   0.000231534f,   0.000284519f,
+     0.000550079f,   0.001f,   0.003f,   0.006f,   0.012f,   0.0235f,
+     0.035f,   0.043f,   0.0503893f,   0.0525f,   0.055f,   0.0565f,
+     0.058f,   0.059f,   0.059f,   0.0608594f,   0.061f,   0.0615f,
+     0.062f,   0.063f,   0.063f,   0.064f,   0.063f,   0.064f,
+     0.065f,   0.066f,   0.066f,   0.066f,   0.066f,   0.0675f,
+     0.069f,   0.0708104f,   0.0709615f,   0.0709001f,   0.071f,   0.0715f,
+     0.073f,   0.074f,   0.074f,   0.073f,   0.073f,   0.0735f,
+     0.075f,   0.0765f,   0.078f,   0.078f,   0.078f,   0.0785f,
+     0.0800145f,   0.0815f,   0.083f,   0.083f,   0.083f,   0.083f,
+     0.083f,   0.0835f,   0.085f,   0.0865f,   0.087f,   0.088f,
+     0.087f,   0.087f,   0.088f,   0.0885f,   0.0907023f,   0.0915f,
+     0.092f,   0.092f,   0.092f,   0.092f,   0.093f,   0.094f,
+     0.095f,   0.096f,   0.096f,   0.096f,   0.095f,   0.095f,
+     0.095f,   0.095f,   0.096f,   0.0975f,   0.098f,   0.099f,
+     0.099f,   0.098f,   0.098f,   0.0965f,   0.096f,   0.0965f,
+     0.098f,   0.0985f,   0.099f,   0.0995f,   0.099f,   0.0975f,
+     0.097f,   0.0955f,   0.095f,   0.095f,   0.095f,   0.0965f,
+     0.097f,   0.098f,   0.098f,   0.0975f,   0.097f,   0.096f,
+     0.095f,   0.095f,   0.094f,   0.094f,   0.095f,   0.0955f,
+     0.096f,   0.097f,   0.097f,   0.097f,   0.097f,   0.097f,
+     0.097f,   0.096f,   0.097f,   0.097f,   0.097f,   0.098f,
+     0.098f,   0.096f,   0.095f,   0.094f,   0.093f,   0.092f,
+     0.091f,   0.0905658f,   0.089f,   0.089f,   0.089f,   0.088f,
+     0.088f,   0.0875f,   0.087f,   0.086f,   0.085f,   0.084f,
+     0.083f,   0.0825f,   0.082f,   0.081f,   0.081f,   0.0804051f,
+     0.079f,   0.078f,   0.077f,   0.077f,   0.076f,   0.075f,
+     0.074f,   0.0735f,   0.073f,   0.0725f,   0.072f,   0.071f,
+     0.071f,   0.0704136f,   0.069f,   0.0685f,   0.068f,   0.067f,
+     0.066f,   0.0645f,   0.063f,   0.062f,   0.0607892f,   0.059f,
+     0.058f,   0.057f,   0.056f,   0.0545f,   0.052f,   0.0455f,
+     0.038f,   0.0286994f,   0.0202138f,   0.0125f,   0.007f,   0.004f,
+     0.002f,   0.001f,   0.000909856f,   0.000512159f,   0.000357051f,   0.00029112f,
+     0.000215752f,   0.000187213f,   0.000171918f,   0.000169724f,   0.000166392f,   0.000163058f,
+     0.000159726f,   0.000156393f,   0.000153061f,   0.000149728f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f
     };
 
     //add panchromatic band to the temporary list
@@ -807,206 +807,206 @@ FormosatImageMetadataInterface
     {
     const float b1[281] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0.000354959,   0.000354603,   0.000376745,   0.000478212,
-     0.0009718,   0.002,   0.005,   0.0124297,   0.024,   0.0415,
-     0.057,   0.0685,   0.074,   0.074,   0.076,   0.0795695,
-     0.082,   0.084,   0.083,   0.0825,   0.086,   0.0910953,
-     0.094,   0.096,   0.096,   0.094,   0.094,   0.096,
-     0.099,   0.0995,   0.099,   0.098,   0.095,   0.092,
-     0.095,   0.0985,   0.092,   0.0695,   0.037,   0.025,
-     0.009,   0.0025,   0.001,   0.000847053,   0.000588401,   0.00051966,
-     0.00050602,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.000354959f,   0.000354603f,   0.000376745f,   0.000478212f,
+     0.0009718f,   0.002f,   0.005f,   0.0124297f,   0.024f,   0.0415f,
+     0.057f,   0.0685f,   0.074f,   0.074f,   0.076f,   0.0795695f,
+     0.082f,   0.084f,   0.083f,   0.0825f,   0.086f,   0.0910953f,
+     0.094f,   0.096f,   0.096f,   0.094f,   0.094f,   0.096f,
+     0.099f,   0.0995f,   0.099f,   0.098f,   0.095f,   0.092f,
+     0.095f,   0.0985f,   0.092f,   0.0695f,   0.037f,   0.025f,
+     0.009f,   0.0025f,   0.001f,   0.000847053f,   0.000588401f,   0.00051966f,
+     0.00050602f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0
     };
 
     const float b2[281] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0.000324677,   0.000326475,   0.000331943,   0.000386303,
-     0.000447683,   0.001,   0.003,   0.0045,   0.012,   0.0205,
-     0.036,   0.0615,   0.075,   0.081,   0.082,   0.0845,
-     0.087,   0.0885,   0.088,   0.087,   0.086,   0.0875,
-     0.0908484,   0.0925,   0.094,   0.094,   0.093,   0.0925,
-     0.093,   0.0955,   0.097,   0.098,   0.099,   0.099,
-     0.099,   0.099,   0.099,   0.099,   0.095,   0.0815,
-     0.057,   0.032,   0.018,   0.0112534,   0.005,   0.0015,
-     0.000758484,   0.000604297,   0.000512471,   0.000475316,   0.000453283,   0.00044559,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.000324677f,   0.000326475f,   0.000331943f,   0.000386303f,
+     0.000447683f,   0.001f,   0.003f,   0.0045f,   0.012f,   0.0205f,
+     0.036f,   0.0615f,   0.075f,   0.081f,   0.082f,   0.0845f,
+     0.087f,   0.0885f,   0.088f,   0.087f,   0.086f,   0.0875f,
+     0.0908484f,   0.0925f,   0.094f,   0.094f,   0.093f,   0.0925f,
+     0.093f,   0.0955f,   0.097f,   0.098f,   0.099f,   0.099f,
+     0.099f,   0.099f,   0.099f,   0.099f,   0.095f,   0.0815f,
+     0.057f,   0.032f,   0.018f,   0.0112534f,   0.005f,   0.0015f,
+     0.000758484f,   0.000604297f,   0.000512471f,   0.000475316f,   0.000453283f,   0.00044559f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0
     };
 
     const float b3[281] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0.000461752,
-     0.001,   0.001,   0.003,   0.006,   0.013,   0.0335,
-     0.063,   0.089,   0.098,   0.099,   0.099,   0.099,
-     0.099,   0.0985,   0.097,   0.0945,   0.092,   0.0906796,
-     0.089,   0.0907659,   0.093,   0.0965,   0.1,   0.097,
-     0.091,   0.0865,   0.086,   0.0910438,   0.094,   0.092,
-     0.093,   0.088,   0.064,   0.034,   0.015,   0.0075,
-     0.006,   0.0045,   0.003,   0.001,   0.000607601,   0.000202927,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.000461752f,
+     0.001f,   0.001f,   0.003f,   0.006f,   0.013f,   0.0335f,
+     0.063f,   0.089f,   0.098f,   0.099f,   0.099f,   0.099f,
+     0.099f,   0.0985f,   0.097f,   0.0945f,   0.092f,   0.0906796f,
+     0.089f,   0.0907659f,   0.093f,   0.0965f,   0.1f,   0.097f,
+     0.091f,   0.0865f,   0.086f,   0.0910438f,   0.094f,   0.092f,
+     0.093f,   0.088f,   0.064f,   0.034f,   0.015f,   0.0075f,
+     0.006f,   0.0045f,   0.003f,   0.001f,   0.000607601f,   0.000202927f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0
     };
 
     const float b4[281] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0.000481456,   0.00071923,   0.00098303,   0.001,   0.000947915,
-     0.00090899,   0.000887367,   0.000576847,   0.000470858,   0.00052246,   0.000713811,
-     0.001,   0.0015,   0.003,   0.005,   0.008,   0.0145,
-     0.022,   0.035,   0.049,   0.0595,   0.075,   0.0905,
-     0.098,   0.0995,   0.097,   0.093,   0.091,   0.0925,
-     0.094,   0.096,   0.096,   0.0955,   0.094,   0.092,
-     0.0907811,   0.089,   0.088,   0.088,   0.088,   0.088,
-     0.088,   0.0875,   0.087,   0.086,   0.085,   0.084,
-     0.083,   0.083,   0.082,   0.081,   0.0806396,   0.079,
-     0.078,   0.077,   0.076,   0.075,   0.074,   0.073,
-     0.072,   0.071,   0.0700369,   0.0685,   0.067,   0.0655,
-     0.064,   0.063,   0.063,   0.062,   0.059,   0.054,
-     0.043,   0.034,   0.025,   0.016,   0.009,   0.0055,
-     0.003,   0.0015,   0.001,   0.000691333,   0.000432126,   0.000356974,
-     0.000265441,   0.000219773,   0.000195346,   0.000192716,   0.000188932,   0.000185148,
-     0.000181364,   0.00017758,   0.000173796,   0.000170011,   0.000166227,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.000481456f,   0.00071923f,   0.00098303f,   0.001f,   0.000947915f,
+     0.00090899f,   0.000887367f,   0.000576847f,   0.000470858f,   0.00052246f,   0.000713811f,
+     0.001f,   0.0015f,   0.003f,   0.005f,   0.008f,   0.0145f,
+     0.022f,   0.035f,   0.049f,   0.0595f,   0.075f,   0.0905f,
+     0.098f,   0.0995f,   0.097f,   0.093f,   0.091f,   0.0925f,
+     0.094f,   0.096f,   0.096f,   0.0955f,   0.094f,   0.092f,
+     0.0907811f,   0.089f,   0.088f,   0.088f,   0.088f,   0.088f,
+     0.088f,   0.0875f,   0.087f,   0.086f,   0.085f,   0.084f,
+     0.083f,   0.083f,   0.082f,   0.081f,   0.0806396f,   0.079f,
+     0.078f,   0.077f,   0.076f,   0.075f,   0.074f,   0.073f,
+     0.072f,   0.071f,   0.0700369f,   0.0685f,   0.067f,   0.0655f,
+     0.064f,   0.063f,   0.063f,   0.062f,   0.059f,   0.054f,
+     0.043f,   0.034f,   0.025f,   0.016f,   0.009f,   0.0055f,
+     0.003f,   0.0015f,   0.001f,   0.000691333f,   0.000432126f,   0.000356974f,
+     0.000265441f,   0.000219773f,   0.000195346f,   0.000192716f,   0.000188932f,   0.000185148f,
+     0.000181364f,   0.00017758f,   0.000173796f,   0.000170011f,   0.000166227f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0
     };
 
     //Add multispectral bands to the temporary list
diff --git a/Modules/Core/Metadata/src/otbIkonosImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbIkonosImageMetadataInterface.cxx
index 7cf2314..cf09bfb 100644
--- a/Modules/Core/Metadata/src/otbIkonosImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbIkonosImageMetadataInterface.cxx
@@ -593,52 +593,52 @@ IkonosImageMetadataInterface
       {
       const float tmp[275] =
       {
-       0.000777411,   0.000698442,   0.000619473,   0.000490086,   0.000360699,   0.000302118,
-       0.000243538,   0.000339101,   0.000434664,   0.000674356,   0.000914047,   0.00165711,
-       0.00240018,   0.00382524,   0.00525031,   0.00774772,   0.0102451,   0.0136149,
-       0.0169847,   0.0216852,   0.0263858,   0.0322139,   0.0380419,   0.0451535,
-       0.052265,   0.059372,   0.066479,   0.0749836,   0.0834881,   0.0922321,
-       0.100976,   0.11238,   0.123783,   0.135806,   0.147828,   0.158671,
-       0.169515,   0.181498,   0.193481,   0.199257,   0.205034,   0.224842,
-       0.24465,   0.252955,   0.26126,   0.271512,   0.281764,   0.291251,
-       0.300738,   0.30953,   0.318322,   0.321402,   0.324481,   0.329386,
-       0.33429,   0.338595,   0.342899,   0.346889,   0.350879,   0.354954,
-       0.359028,   0.366986,   0.374944,   0.383555,   0.392166,   0.407887,
-       0.423609,   0.439638,   0.455668,   0.472286,   0.488904,   0.509193,
-       0.529483,   0.549106,   0.56873,   0.592408,   0.616086,   0.639134,
-       0.662182,   0.680563,   0.698943,   0.720886,   0.742829,   0.764357,
-       0.785886,   0.805496,   0.825106,   0.843924,   0.862743,   0.882061,
-       0.901379,   0.923168,   0.944958,   0.948979,   0.952999,   0.960789,
-       0.968579,   0.973284,   0.977989,   0.972502,   0.967015,   0.980472,
-       0.993929,   0.993271,   0.992614,   0.988076,   0.983538,   0.991769,
-       1,   0.996457,   0.992914,   0.996456,   0.999998,   0.993659,
-       0.98732,   0.980205,   0.973089,   0.957487,   0.941886,   0.939394,
-       0.936901,   0.920086,   0.90327,   0.895178,   0.887086,   0.878162,
-       0.869238,   0.876515,   0.883791,   0.883182,   0.882573,   0.883526,
-       0.884479,   0.889877,   0.895275,   0.895902,   0.89653,   0.911267,
-       0.926004,   0.924618,   0.923232,   0.91542,   0.907607,   0.904518,
-       0.90143,   0.903022,   0.904613,   0.902261,   0.899908,   0.893658,
-       0.887407,   0.890136,   0.892866,   0.889693,   0.88652,   0.892279,
-       0.898039,   0.904587,   0.911135,   0.927581,   0.944026,   0.951458,
-       0.95889,   0.947059,   0.935229,   0.946541,   0.957854,   0.965818,
-       0.973781,   0.973879,   0.973978,   0.971217,   0.968457,   0.96373,
-       0.959003,   0.95437,   0.949736,   0.932402,   0.915067,   0.906743,
-       0.898418,   0.90573,   0.913042,   0.923885,   0.934728,   0.931538,
-       0.928349,   0.934038,   0.939728,   0.923287,   0.906846,   0.914615,
-       0.922384,   0.929317,   0.93625,   0.943838,   0.951427,   0.948289,
-       0.945151,   0.949082,   0.953013,   0.938094,   0.923176,   0.921154,
-       0.919132,   0.890009,   0.860885,   0.867236,   0.873588,   0.850292,
-       0.826995,   0.817882,   0.808768,   0.800406,   0.792044,   0.777065,
-       0.762087,   0.755304,   0.748521,   0.727815,   0.707108,   0.696978,
-       0.686848,   0.68378,   0.680711,   0.675044,   0.669377,   0.641688,
-       0.613999,   0.596144,   0.578289,   0.567037,   0.555785,   0.536112,
-       0.516439,   0.498523,   0.480606,   0.475695,   0.470783,   0.452628,
-       0.434473,   0.415006,   0.395538,   0.373581,   0.351624,   0.344258,
-       0.336893,   0.323178,   0.309463,   0.296963,   0.284464,   0.277545,
-       0.270627,   0.259838,   0.249049,   0.242783,   0.236516,   0.226031,
-       0.215545,   0.205517,   0.195489,   0.187778,   0.180066,   0.172017,
-       0.163968,   0.156649,   0.14933,   0.142851,   0.136372,   0.127527,
-       0.118682,   0.111158,   0.103634,   0.0963653,   0
+       0.000777411f,   0.000698442f,   0.000619473f,   0.000490086f,   0.000360699f,   0.000302118f,
+       0.000243538f,   0.000339101f,   0.000434664f,   0.000674356f,   0.000914047f,   0.00165711f,
+       0.00240018f,   0.00382524f,   0.00525031f,   0.00774772f,   0.0102451f,   0.0136149f,
+       0.0169847f,   0.0216852f,   0.0263858f,   0.0322139f,   0.0380419f,   0.0451535f,
+       0.052265f,   0.059372f,   0.066479f,   0.0749836f,   0.0834881f,   0.0922321f,
+       0.100976f,   0.11238f,   0.123783f,   0.135806f,   0.147828f,   0.158671f,
+       0.169515f,   0.181498f,   0.193481f,   0.199257f,   0.205034f,   0.224842f,
+       0.24465f,   0.252955f,   0.26126f,   0.271512f,   0.281764f,   0.291251f,
+       0.300738f,   0.30953f,   0.318322f,   0.321402f,   0.324481f,   0.329386f,
+       0.33429f,   0.338595f,   0.342899f,   0.346889f,   0.350879f,   0.354954f,
+       0.359028f,   0.366986f,   0.374944f,   0.383555f,   0.392166f,   0.407887f,
+       0.423609f,   0.439638f,   0.455668f,   0.472286f,   0.488904f,   0.509193f,
+       0.529483f,   0.549106f,   0.56873f,   0.592408f,   0.616086f,   0.639134f,
+       0.662182f,   0.680563f,   0.698943f,   0.720886f,   0.742829f,   0.764357f,
+       0.785886f,   0.805496f,   0.825106f,   0.843924f,   0.862743f,   0.882061f,
+       0.901379f,   0.923168f,   0.944958f,   0.948979f,   0.952999f,   0.960789f,
+       0.968579f,   0.973284f,   0.977989f,   0.972502f,   0.967015f,   0.980472f,
+       0.993929f,   0.993271f,   0.992614f,   0.988076f,   0.983538f,   0.991769f,
+       1.0f,   0.996457f,   0.992914f,   0.996456f,   0.999998f,   0.993659f,
+       0.98732f,   0.980205f,   0.973089f,   0.957487f,   0.941886f,   0.939394f,
+       0.936901f,   0.920086f,   0.90327f,   0.895178f,   0.887086f,   0.878162f,
+       0.869238f,   0.876515f,   0.883791f,   0.883182f,   0.882573f,   0.883526f,
+       0.884479f,   0.889877f,   0.895275f,   0.895902f,   0.89653f,   0.911267f,
+       0.926004f,   0.924618f,   0.923232f,   0.91542f,   0.907607f,   0.904518f,
+       0.90143f,   0.903022f,   0.904613f,   0.902261f,   0.899908f,   0.893658f,
+       0.887407f,   0.890136f,   0.892866f,   0.889693f,   0.88652f,   0.892279f,
+       0.898039f,   0.904587f,   0.911135f,   0.927581f,   0.944026f,   0.951458f,
+       0.95889f,   0.947059f,   0.935229f,   0.946541f,   0.957854f,   0.965818f,
+       0.973781f,   0.973879f,   0.973978f,   0.971217f,   0.968457f,   0.96373f,
+       0.959003f,   0.95437f,   0.949736f,   0.932402f,   0.915067f,   0.906743f,
+       0.898418f,   0.90573f,   0.913042f,   0.923885f,   0.934728f,   0.931538f,
+       0.928349f,   0.934038f,   0.939728f,   0.923287f,   0.906846f,   0.914615f,
+       0.922384f,   0.929317f,   0.93625f,   0.943838f,   0.951427f,   0.948289f,
+       0.945151f,   0.949082f,   0.953013f,   0.938094f,   0.923176f,   0.921154f,
+       0.919132f,   0.890009f,   0.860885f,   0.867236f,   0.873588f,   0.850292f,
+       0.826995f,   0.817882f,   0.808768f,   0.800406f,   0.792044f,   0.777065f,
+       0.762087f,   0.755304f,   0.748521f,   0.727815f,   0.707108f,   0.696978f,
+       0.686848f,   0.68378f,   0.680711f,   0.675044f,   0.669377f,   0.641688f,
+       0.613999f,   0.596144f,   0.578289f,   0.567037f,   0.555785f,   0.536112f,
+       0.516439f,   0.498523f,   0.480606f,   0.475695f,   0.470783f,   0.452628f,
+       0.434473f,   0.415006f,   0.395538f,   0.373581f,   0.351624f,   0.344258f,
+       0.336893f,   0.323178f,   0.309463f,   0.296963f,   0.284464f,   0.277545f,
+       0.270627f,   0.259838f,   0.249049f,   0.242783f,   0.236516f,   0.226031f,
+       0.215545f,   0.205517f,   0.195489f,   0.187778f,   0.180066f,   0.172017f,
+       0.163968f,   0.156649f,   0.14933f,   0.142851f,   0.136372f,   0.127527f,
+       0.118682f,   0.111158f,   0.103634f,   0.0963653f,   0.0f
       };
 
       for (unsigned int j = 0; j < 275; ++j)
@@ -650,52 +650,52 @@ IkonosImageMetadataInterface
       {
       const float tmp[275] =
       {
-       0.000773147,   0.00111792,   0.00146269,   0.00116425,   0.000865817,   0.000798356,
-       0.000730896,   0.000724069,   0.000717243,   0.000983961,   0.00125068,   0.00147711,
-       0.00170354,   0.00181267,   0.0019218,   0.00235592,   0.00279004,   0.00398685,
-       0.00518366,   0.00642842,   0.00767318,   0.00823188,   0.00879058,   0.0103296,
-       0.0118686,   0.0146603,   0.017452,   0.0262281,   0.0350041,   0.0602011,
-       0.085398,   0.139163,   0.192928,   0.261737,   0.330546,   0.375015,
-       0.419484,   0.463835,   0.508186,   0.560708,   0.613231,   0.643718,
-       0.674206,   0.697319,   0.720432,   0.740631,   0.760831,   0.760468,
-       0.760104,   0.77422,   0.788336,   0.822457,   0.856578,   0.872968,
-       0.889358,   0.916497,   0.943636,   0.971818,   1,   0.993393,
-       0.986786,   0.956164,   0.925542,   0.843438,   0.761333,   0.651888,
-       0.542443,   0.428187,   0.31393,   0.259011,   0.204092,   0.178009,
-       0.151925,   0.118774,   0.0856216,   0.0643982,   0.0431748,   0.0370744,
-       0.030974,   0.0288085,   0.0266429,   0.0243978,   0.0221527,   0.0221454,
-       0.0221381,   0.0241802,   0.0262224,   0.027894,   0.0295655,   0.0282719,
-       0.0269782,   0.0247994,   0.0226207,   0.0240241,   0.0254275,   0.0279644,
-       0.0305013,   0.0289285,   0.0273557,   0.0243127,   0.0212697,   0.021495,
-       0.0217203,   0.0256572,   0.0295941,   0.0319082,   0.0342224,   0.0306457,
-       0.027069,   0.0232825,   0.019496,   0.0194953,   0.0194945,   0.019262,
-       0.0190295,   0.0165004,   0.0139713,   0.0106605,   0.00734963,   0.00665076,
-       0.00595189,   0.00555088,   0.00514986,   0.00651302,   0.00787617,   0.0101045,
-       0.0123327,   0.0161468,   0.0199609,   0.0210092,   0.0220576,   0.021422,
-       0.0207864,   0.0198958,   0.0190052,   0.0172422,   0.0154792,   0.012607,
-       0.00973489,   0.00827171,   0.00680854,   0.00586579,   0.00492304,   0.00515291,
-       0.00538278,   0.00845239,   0.011522,   0.0168842,   0.0222464,   0.0231172,
-       0.023988,   0.0180264,   0.0120648,   0.0080432,   0.00402165,   0.00311771,
-       0.00221378,   0.00238421,   0.00255463,   0.00240824,   0.00226184,   0.00286143,
-       0.00346102,   0.00296337,   0.00246571,   0.00239388,   0.00232204,   0.00315372,
-       0.0039854,   0.0037969,   0.00360839,   0.00315481,   0.00270124,   0.00254147,
-       0.0023817,   0.00250869,   0.00263568,   0.00244201,   0.00224833,   0.00192361,
-       0.00159888,   0.00157883,   0.00155879,   0.00177376,   0.00198873,   0.00199198,
-       0.00199522,   0.00225955,   0.00252388,   0.00306228,   0.00360067,   0.00461183,
-       0.00562299,   0.00610986,   0.00659673,   0.00707311,   0.00754949,   0.00775649,
-       0.00796349,   0.00871715,   0.00947081,   0.00887752,   0.00828423,   0.00852913,
-       0.00877403,   0.00901617,   0.00925831,   0.00995926,   0.0106602,   0.0115813,
-       0.0125024,   0.0128068,   0.0131113,   0.0130847,   0.0130581,   0.0124604,
-       0.0118627,   0.0111828,   0.0105029,   0.00998883,   0.00947476,   0.00913233,
-       0.00878991,   0.00859062,   0.00839133,   0.00830986,   0.0082284,   0.00812489,
-       0.00802138,   0.00818694,   0.0083525,   0.00823223,   0.00811195,   0.00805303,
-       0.00799411,   0.00800437,   0.00801463,   0.00743377,   0.00685291,   0.00615093,
-       0.00544896,   0.00512429,   0.00479963,   0.00463363,   0.00446762,   0.00428193,
-       0.00409623,   0.00384906,   0.00360189,   0.00353085,   0.00345981,   0.00336041,
-       0.00326101,   0.00300593,   0.00275086,   0.00278287,   0.00281488,   0.00259549,
-       0.00237609,   0.00236111,   0.00234613,   0.00248306,   0.00261998,   0.00263357,
-       0.00264716,   0.0026242,   0.00260124,   0.00210138,   0.00160152,   0.00177352,
-       0.00194551,   0.00218138,   0.00241724,   0.00185843,   0
+       0.000773147f,   0.00111792f,   0.00146269f,   0.00116425f,   0.000865817f,   0.000798356f,
+       0.000730896f,   0.000724069f,   0.000717243f,   0.000983961f,   0.00125068f,   0.00147711f,
+       0.00170354f,   0.00181267f,   0.0019218f,   0.00235592f,   0.00279004f,   0.00398685f,
+       0.00518366f,   0.00642842f,   0.00767318f,   0.00823188f,   0.00879058f,   0.0103296f,
+       0.0118686f,   0.0146603f,   0.017452f,   0.0262281f,   0.0350041f,   0.0602011f,
+       0.085398f,   0.139163f,   0.192928f,   0.261737f,   0.330546f,   0.375015f,
+       0.419484f,   0.463835f,   0.508186f,   0.560708f,   0.613231f,   0.643718f,
+       0.674206f,   0.697319f,   0.720432f,   0.740631f,   0.760831f,   0.760468f,
+       0.760104f,   0.77422f,   0.788336f,   0.822457f,   0.856578f,   0.872968f,
+       0.889358f,   0.916497f,   0.943636f,   0.971818f,   1.0f,   0.993393f,
+       0.986786f,   0.956164f,   0.925542f,   0.843438f,   0.761333f,   0.651888f,
+       0.542443f,   0.428187f,   0.31393f,   0.259011f,   0.204092f,   0.178009f,
+       0.151925f,   0.118774f,   0.0856216f,   0.0643982f,   0.0431748f,   0.0370744f,
+       0.030974f,   0.0288085f,   0.0266429f,   0.0243978f,   0.0221527f,   0.0221454f,
+       0.0221381f,   0.0241802f,   0.0262224f,   0.027894f,   0.0295655f,   0.0282719f,
+       0.0269782f,   0.0247994f,   0.0226207f,   0.0240241f,   0.0254275f,   0.0279644f,
+       0.0305013f,   0.0289285f,   0.0273557f,   0.0243127f,   0.0212697f,   0.021495f,
+       0.0217203f,   0.0256572f,   0.0295941f,   0.0319082f,   0.0342224f,   0.0306457f,
+       0.027069f,   0.0232825f,   0.019496f,   0.0194953f,   0.0194945f,   0.019262f,
+       0.0190295f,   0.0165004f,   0.0139713f,   0.0106605f,   0.00734963f,   0.00665076f,
+       0.00595189f,   0.00555088f,   0.00514986f,   0.00651302f,   0.00787617f,   0.0101045f,
+       0.0123327f,   0.0161468f,   0.0199609f,   0.0210092f,   0.0220576f,   0.021422f,
+       0.0207864f,   0.0198958f,   0.0190052f,   0.0172422f,   0.0154792f,   0.012607f,
+       0.00973489f,   0.00827171f,   0.00680854f,   0.00586579f,   0.00492304f,   0.00515291f,
+       0.00538278f,   0.00845239f,   0.011522f,   0.0168842f,   0.0222464f,   0.0231172f,
+       0.023988f,   0.0180264f,   0.0120648f,   0.0080432f,   0.00402165f,   0.00311771f,
+       0.00221378f,   0.00238421f,   0.00255463f,   0.00240824f,   0.00226184f,   0.00286143f,
+       0.00346102f,   0.00296337f,   0.00246571f,   0.00239388f,   0.00232204f,   0.00315372f,
+       0.0039854f,   0.0037969f,   0.00360839f,   0.00315481f,   0.00270124f,   0.00254147f,
+       0.0023817f,   0.00250869f,   0.00263568f,   0.00244201f,   0.00224833f,   0.00192361f,
+       0.00159888f,   0.00157883f,   0.00155879f,   0.00177376f,   0.00198873f,   0.00199198f,
+       0.00199522f,   0.00225955f,   0.00252388f,   0.00306228f,   0.00360067f,   0.00461183f,
+       0.00562299f,   0.00610986f,   0.00659673f,   0.00707311f,   0.00754949f,   0.00775649f,
+       0.00796349f,   0.00871715f,   0.00947081f,   0.00887752f,   0.00828423f,   0.00852913f,
+       0.00877403f,   0.00901617f,   0.00925831f,   0.00995926f,   0.0106602f,   0.0115813f,
+       0.0125024f,   0.0128068f,   0.0131113f,   0.0130847f,   0.0130581f,   0.0124604f,
+       0.0118627f,   0.0111828f,   0.0105029f,   0.00998883f,   0.00947476f,   0.00913233f,
+       0.00878991f,   0.00859062f,   0.00839133f,   0.00830986f,   0.0082284f,   0.00812489f,
+       0.00802138f,   0.00818694f,   0.0083525f,   0.00823223f,   0.00811195f,   0.00805303f,
+       0.00799411f,   0.00800437f,   0.00801463f,   0.00743377f,   0.00685291f,   0.00615093f,
+       0.00544896f,   0.00512429f,   0.00479963f,   0.00463363f,   0.00446762f,   0.00428193f,
+       0.00409623f,   0.00384906f,   0.00360189f,   0.00353085f,   0.00345981f,   0.00336041f,
+       0.00326101f,   0.00300593f,   0.00275086f,   0.00278287f,   0.00281488f,   0.00259549f,
+       0.00237609f,   0.00236111f,   0.00234613f,   0.00248306f,   0.00261998f,   0.00263357f,
+       0.00264716f,   0.0026242f,   0.00260124f,   0.00210138f,   0.00160152f,   0.00177352f,
+       0.00194551f,   0.00218138f,   0.00241724f,   0.00185843f,   0.0f
       };
 
       for (unsigned int j = 0; j < 275; ++j)
@@ -707,52 +707,52 @@ IkonosImageMetadataInterface
       {
       const float tmp[275] =
       {
-       0.000643373,   0.000721567,   0.000799761,   0.000764593,   0.000729425,   0.000767756,
-       0.000806087,   0.000691702,   0.000577317,   0.000709642,   0.000841967,   0.000741458,
-       0.000640949,   0.000754853,   0.000868757,   0.000732192,   0.000595627,   0.000952731,
-       0.00130983,   0.00125601,   0.00120219,   0.00194445,   0.00268671,   0.00183813,
-       0.000989541,   0.00113105,   0.00127256,   0.00160875,   0.00194493,   0.00229841,
-       0.00265189,   0.00301361,   0.00337532,   0.00370611,   0.00403689,   0.00486952,
-       0.00570216,   0.00738653,   0.0090709,   0.010205,   0.011339,   0.0113175,
-       0.011296,   0.0121669,   0.0130378,   0.0151163,   0.0171948,   0.0208267,
-       0.0244586,   0.0305813,   0.036704,   0.0434839,   0.0502638,   0.0565094,
-       0.0627551,   0.0860566,   0.109358,   0.151232,   0.193107,   0.242087,
-       0.291067,   0.365317,   0.439568,   0.545145,   0.650723,   0.728637,
-       0.806551,   0.839149,   0.871746,   0.88005,   0.888355,   0.889065,
-       0.889775,   0.882352,   0.874928,   0.863518,   0.852108,   0.872214,
-       0.89232,   0.944994,   0.997669,   0.981902,   0.966134,   0.936936,
-       0.907737,   0.900477,   0.893218,   0.919539,   0.94586,   0.971546,
-       0.997232,   0.978528,   0.959823,   0.918631,   0.877439,   0.813588,
-       0.749737,   0.625854,   0.50197,   0.392566,   0.283162,   0.22152,
-       0.159878,   0.133355,   0.106831,   0.0946597,   0.0824881,   0.0732495,
-       0.0640108,   0.0556904,   0.0473701,   0.039668,   0.031966,   0.0273263,
-       0.0226867,   0.0196283,   0.0165699,   0.0155271,   0.0144843,   0.0146602,
-       0.0148362,   0.0155289,   0.0162216,   0.0174317,   0.0186418,   0.0192574,
-       0.019873,   0.0193336,   0.0187943,   0.0169768,   0.0151594,   0.0138395,
-       0.0125197,   0.0122022,   0.0118846,   0.0113754,   0.0108661,   0.0122059,
-       0.0135457,   0.0150274,   0.0165092,   0.0174059,   0.0183026,   0.0170915,
-       0.0158804,   0.0135402,   0.0112001,   0.00877389,   0.00634772,   0.00592819,
-       0.00550866,   0.00444963,   0.0033906,   0.00363493,   0.00387926,   0.00369547,
-       0.00351167,   0.00323999,   0.0029683,   0.00304107,   0.00311383,   0.00269225,
-       0.00227067,   0.00285765,   0.00344463,   0.0035057,   0.00356676,   0.00444226,
-       0.00531776,   0.00591164,   0.00650553,   0.00683137,   0.00715721,   0.00801677,
-       0.00887633,   0.00920412,   0.0095319,   0.00876825,   0.00800459,   0.00751842,
-       0.00703224,   0.00673578,   0.00643931,   0.00627542,   0.00611152,   0.00586377,
-       0.00561602,   0.00543874,   0.00526147,   0.0057041,   0.00614673,   0.00676773,
-       0.00738874,   0.00702707,   0.00666541,   0.0066904,   0.0067154,   0.00807246,
-       0.00942952,   0.0111187,   0.0128079,   0.0135393,   0.0142706,   0.015097,
-       0.0159234,   0.0165052,   0.017087,   0.0171597,   0.0172324,   0.0167555,
-       0.0162786,   0.0157604,   0.0152423,   0.0143205,   0.0133987,   0.0126828,
-       0.0119669,   0.0112674,   0.0105679,   0.0102702,   0.00997248,   0.00958224,
-       0.009192,   0.00947248,   0.00975296,   0.00932626,   0.00889956,   0.00866396,
-       0.00842837,   0.0081121,   0.00779583,   0.00765918,   0.00752253,   0.00724579,
-       0.00696906,   0.0064155,   0.00586195,   0.00563761,   0.00541328,   0.00499098,
-       0.00456868,   0.00425882,   0.00394895,   0.00377609,   0.00360322,   0.00343181,
-       0.00326041,   0.00310311,   0.00294581,   0.00285307,   0.00276034,   0.00277242,
-       0.0027845,   0.00250953,   0.00223456,   0.00235165,   0.00246875,   0.00235075,
-       0.00223275,   0.00238435,   0.00253594,   0.00230124,   0.00206653,   0.00190024,
-       0.00173395,   0.00191697,   0.00209999,   0.00206986,   0.00203973,   0.002129,
-       0.00221828,   0.00179734,   0.00137641,   0.00148945,   0
+       0.000643373f,   0.000721567f,   0.000799761f,   0.000764593f,   0.000729425f,   0.000767756f,
+       0.000806087f,   0.000691702f,   0.000577317f,   0.000709642f,   0.000841967f,   0.000741458f,
+       0.000640949f,   0.000754853f,   0.000868757f,   0.000732192f,   0.000595627f,   0.000952731f,
+       0.00130983f,   0.00125601f,   0.00120219f,   0.00194445f,   0.00268671f,   0.00183813f,
+       0.000989541f,   0.00113105f,   0.00127256f,   0.00160875f,   0.00194493f,   0.00229841f,
+       0.00265189f,   0.00301361f,   0.00337532f,   0.00370611f,   0.00403689f,   0.00486952f,
+       0.00570216f,   0.00738653f,   0.0090709f,   0.010205f,   0.011339f,   0.0113175f,
+       0.011296f,   0.0121669f,   0.0130378f,   0.0151163f,   0.0171948f,   0.0208267f,
+       0.0244586f,   0.0305813f,   0.036704f,   0.0434839f,   0.0502638f,   0.0565094f,
+       0.0627551f,   0.0860566f,   0.109358f,   0.151232f,   0.193107f,   0.242087f,
+       0.291067f,   0.365317f,   0.439568f,   0.545145f,   0.650723f,   0.728637f,
+       0.806551f,   0.839149f,   0.871746f,   0.88005f,   0.888355f,   0.889065f,
+       0.889775f,   0.882352f,   0.874928f,   0.863518f,   0.852108f,   0.872214f,
+       0.89232f,   0.944994f,   0.997669f,   0.981902f,   0.966134f,   0.936936f,
+       0.907737f,   0.900477f,   0.893218f,   0.919539f,   0.94586f,   0.971546f,
+       0.997232f,   0.978528f,   0.959823f,   0.918631f,   0.877439f,   0.813588f,
+       0.749737f,   0.625854f,   0.50197f,   0.392566f,   0.283162f,   0.22152f,
+       0.159878f,   0.133355f,   0.106831f,   0.0946597f,   0.0824881f,   0.0732495f,
+       0.0640108f,   0.0556904f,   0.0473701f,   0.039668f,   0.031966f,   0.0273263f,
+       0.0226867f,   0.0196283f,   0.0165699f,   0.0155271f,   0.0144843f,   0.0146602f,
+       0.0148362f,   0.0155289f,   0.0162216f,   0.0174317f,   0.0186418f,   0.0192574f,
+       0.019873f,   0.0193336f,   0.0187943f,   0.0169768f,   0.0151594f,   0.0138395f,
+       0.0125197f,   0.0122022f,   0.0118846f,   0.0113754f,   0.0108661f,   0.0122059f,
+       0.0135457f,   0.0150274f,   0.0165092f,   0.0174059f,   0.0183026f,   0.0170915f,
+       0.0158804f,   0.0135402f,   0.0112001f,   0.00877389f,   0.00634772f,   0.00592819f,
+       0.00550866f,   0.00444963f,   0.0033906f,   0.00363493f,   0.00387926f,   0.00369547f,
+       0.00351167f,   0.00323999f,   0.0029683f,   0.00304107f,   0.00311383f,   0.00269225f,
+       0.00227067f,   0.00285765f,   0.00344463f,   0.0035057f,   0.00356676f,   0.00444226f,
+       0.00531776f,   0.00591164f,   0.00650553f,   0.00683137f,   0.00715721f,   0.00801677f,
+       0.00887633f,   0.00920412f,   0.0095319f,   0.00876825f,   0.00800459f,   0.00751842f,
+       0.00703224f,   0.00673578f,   0.00643931f,   0.00627542f,   0.00611152f,   0.00586377f,
+       0.00561602f,   0.00543874f,   0.00526147f,   0.0057041f,   0.00614673f,   0.00676773f,
+       0.00738874f,   0.00702707f,   0.00666541f,   0.0066904f,   0.0067154f,   0.00807246f,
+       0.00942952f,   0.0111187f,   0.0128079f,   0.0135393f,   0.0142706f,   0.015097f,
+       0.0159234f,   0.0165052f,   0.017087f,   0.0171597f,   0.0172324f,   0.0167555f,
+       0.0162786f,   0.0157604f,   0.0152423f,   0.0143205f,   0.0133987f,   0.0126828f,
+       0.0119669f,   0.0112674f,   0.0105679f,   0.0102702f,   0.00997248f,   0.00958224f,
+       0.009192f,   0.00947248f,   0.00975296f,   0.00932626f,   0.00889956f,   0.00866396f,
+       0.00842837f,   0.0081121f,   0.00779583f,   0.00765918f,   0.00752253f,   0.00724579f,
+       0.00696906f,   0.0064155f,   0.00586195f,   0.00563761f,   0.00541328f,   0.00499098f,
+       0.00456868f,   0.00425882f,   0.00394895f,   0.00377609f,   0.00360322f,   0.00343181f,
+       0.00326041f,   0.00310311f,   0.00294581f,   0.00285307f,   0.00276034f,   0.00277242f,
+       0.0027845f,   0.00250953f,   0.00223456f,   0.00235165f,   0.00246875f,   0.00235075f,
+       0.00223275f,   0.00238435f,   0.00253594f,   0.00230124f,   0.00206653f,   0.00190024f,
+       0.00173395f,   0.00191697f,   0.00209999f,   0.00206986f,   0.00203973f,   0.002129f,
+       0.00221828f,   0.00179734f,   0.00137641f,   0.00148945f,   0.0f
       };
 
       for (unsigned int j = 0; j < 275; ++j)
@@ -764,52 +764,52 @@ IkonosImageMetadataInterface
       {
       const float tmp[275] =
       {
-       0,   0.000251974,   0.000503948,   0.000447294,   0.000390639,   0.000493587,
-       0.000596534,   0.000462484,   0.000328434,   0.000587581,   0.000846728,   0.000748537,
-       0.000650345,   0.000516444,   0.000382543,   0.000939994,   0.00149745,   0.00175874,
-       0.00202003,   0.00252033,   0.00302063,   0.00326826,   0.00351589,   0.00376182,
-       0.00400775,   0.00406784,   0.00412793,   0.00595608,   0.00778423,   0.0080879,
-       0.00839158,   0.00829197,   0.00819236,   0.00662469,   0.00505701,   0.00383289,
-       0.00260876,   0.00345153,   0.00429429,   0.00487448,   0.00545468,   0.00545833,
-       0.00546199,   0.00418794,   0.00291388,   0.00230581,   0.00169773,   0.00162001,
-       0.0015423,   0.00259185,   0.00364139,   0.00396142,   0.00428144,   0.00339831,
-       0.00251517,   0.00227348,   0.00203179,   0.00167973,   0.00132766,   0.00141316,
-       0.00149866,   0.00150402,   0.00150938,   0.0018186,   0.00212782,   0.00224531,
-       0.0023628,   0.0025393,   0.0027158,   0.00304882,   0.00338183,   0.00312524,
-       0.00286866,   0.00286392,   0.00285919,   0.00345904,   0.0040589,   0.00503972,
-       0.00602055,   0.00659323,   0.00716591,   0.00825183,   0.00933776,   0.00929585,
-       0.00925395,   0.00899875,   0.00874355,   0.00912988,   0.0095162,   0.00993024,
-       0.0103443,   0.0118352,   0.0133262,   0.0168796,   0.020433,   0.0244432,
-       0.0284535,   0.0315921,   0.0347306,   0.0387702,   0.0428098,   0.0501643,
-       0.0575189,   0.0714861,   0.0854534,   0.105156,   0.124858,   0.150634,
-       0.17641,   0.217427,   0.258444,   0.338645,   0.418847,   0.528481,
-       0.638116,   0.721314,   0.804512,   0.841436,   0.87836,   0.898975,
-       0.91959,   0.936413,   0.953235,   0.954545,   0.955856,   0.942354,
-       0.928852,   0.933873,   0.938894,   0.962762,   0.98663,   0.991712,
-       0.996794,   0.952358,   0.907922,   0.838837,   0.769753,   0.68084,
-       0.591927,   0.506722,   0.421517,   0.363416,   0.305314,   0.265769,
-       0.226224,   0.192279,   0.158334,   0.131456,   0.104578,   0.0859652,
-       0.067352,   0.0560433,   0.0447347,   0.0373336,   0.0299325,   0.0269409,
-       0.0239493,   0.0229628,   0.0219762,   0.0201699,   0.0183636,   0.0171332,
-       0.0159029,   0.0160653,   0.0162278,   0.0159488,   0.0156697,   0.0160819,
-       0.0164941,   0.0168042,   0.0171144,   0.0167051,   0.0162959,   0.0141966,
-       0.0120973,   0.0105832,   0.00906906,   0.00792008,   0.0067711,   0.00649551,
-       0.00621991,   0.00588748,   0.00555504,   0.00486398,   0.00417292,   0.00419873,
-       0.00422454,   0.00461445,   0.00500436,   0.00449582,   0.00398727,   0.00397629,
-       0.00396531,   0.00332414,   0.00268297,   0.00284406,   0.00300515,   0.00277493,
-       0.00254471,   0.00290075,   0.00325678,   0.00290726,   0.00255773,   0.00259229,
-       0.00262684,   0.00269255,   0.00275825,   0.00271562,   0.00267299,   0.00275871,
-       0.00284443,   0.00269768,   0.00255094,   0.00257098,   0.00259103,   0.00253264,
-       0.00247425,   0.00242522,   0.00237619,   0.00235338,   0.00233057,   0.00261103,
-       0.00289149,   0.0028024,   0.00271332,   0.00290319,   0.00309306,   0.00350249,
-       0.00391192,   0.00395984,   0.00400776,   0.00401089,   0.00401403,   0.0037349,
-       0.00345576,   0.00305136,   0.00264696,   0.00241812,   0.00218929,   0.00191393,
-       0.00163858,   0.00153304,   0.00142751,   0.00137032,   0.00131312,   0.00134518,
-       0.00137723,   0.0012429,   0.00110858,   0.00114136,   0.00117415,   0.00116687,
-       0.00115959,   0.00108165,   0.00100371,   0.00131319,   0.00162267,   0.00130164,
-       0.000980609,   0.00115412,   0.00132762,   0.0013807,   0.00143378,   0.00218704,
-       0.00294031,   0.00234605,   0.00175179,   0.0020462,   0.0023406,   0.00180012,
-       0.00125963,   0.00107872,   0.000897814,   0.000448907,   0
+       0.0f,   0.000251974f,   0.000503948f,   0.000447294f,   0.000390639f,   0.000493587f,
+       0.000596534f,   0.000462484f,   0.000328434f,   0.000587581f,   0.000846728f,   0.000748537f,
+       0.000650345f,   0.000516444f,   0.000382543f,   0.000939994f,   0.00149745f,   0.00175874f,
+       0.00202003f,   0.00252033f,   0.00302063f,   0.00326826f,   0.00351589f,   0.00376182f,
+       0.00400775f,   0.00406784f,   0.00412793f,   0.00595608f,   0.00778423f,   0.0080879f,
+       0.00839158f,   0.00829197f,   0.00819236f,   0.00662469f,   0.00505701f,   0.00383289f,
+       0.00260876f,   0.00345153f,   0.00429429f,   0.00487448f,   0.00545468f,   0.00545833f,
+       0.00546199f,   0.00418794f,   0.00291388f,   0.00230581f,   0.00169773f,   0.00162001f,
+       0.0015423f,   0.00259185f,   0.00364139f,   0.00396142f,   0.00428144f,   0.00339831f,
+       0.00251517f,   0.00227348f,   0.00203179f,   0.00167973f,   0.00132766f,   0.00141316f,
+       0.00149866f,   0.00150402f,   0.00150938f,   0.0018186f,   0.00212782f,   0.00224531f,
+       0.0023628f,   0.0025393f,   0.0027158f,   0.00304882f,   0.00338183f,   0.00312524f,
+       0.00286866f,   0.00286392f,   0.00285919f,   0.00345904f,   0.0040589f,   0.00503972f,
+       0.00602055f,   0.00659323f,   0.00716591f,   0.00825183f,   0.00933776f,   0.00929585f,
+       0.00925395f,   0.00899875f,   0.00874355f,   0.00912988f,   0.0095162f,   0.00993024f,
+       0.0103443f,   0.0118352f,   0.0133262f,   0.0168796f,   0.020433f,   0.0244432f,
+       0.0284535f,   0.0315921f,   0.0347306f,   0.0387702f,   0.0428098f,   0.0501643f,
+       0.0575189f,   0.0714861f,   0.0854534f,   0.105156f,   0.124858f,   0.150634f,
+       0.17641f,   0.217427f,   0.258444f,   0.338645f,   0.418847f,   0.528481f,
+       0.638116f,   0.721314f,   0.804512f,   0.841436f,   0.87836f,   0.898975f,
+       0.91959f,   0.936413f,   0.953235f,   0.954545f,   0.955856f,   0.942354f,
+       0.928852f,   0.933873f,   0.938894f,   0.962762f,   0.98663f,   0.991712f,
+       0.996794f,   0.952358f,   0.907922f,   0.838837f,   0.769753f,   0.68084f,
+       0.591927f,   0.506722f,   0.421517f,   0.363416f,   0.305314f,   0.265769f,
+       0.226224f,   0.192279f,   0.158334f,   0.131456f,   0.104578f,   0.0859652f,
+       0.067352f,   0.0560433f,   0.0447347f,   0.0373336f,   0.0299325f,   0.0269409f,
+       0.0239493f,   0.0229628f,   0.0219762f,   0.0201699f,   0.0183636f,   0.0171332f,
+       0.0159029f,   0.0160653f,   0.0162278f,   0.0159488f,   0.0156697f,   0.0160819f,
+       0.0164941f,   0.0168042f,   0.0171144f,   0.0167051f,   0.0162959f,   0.0141966f,
+       0.0120973f,   0.0105832f,   0.00906906f,   0.00792008f,   0.0067711f,   0.00649551f,
+       0.00621991f,   0.00588748f,   0.00555504f,   0.00486398f,   0.00417292f,   0.00419873f,
+       0.00422454f,   0.00461445f,   0.00500436f,   0.00449582f,   0.00398727f,   0.00397629f,
+       0.00396531f,   0.00332414f,   0.00268297f,   0.00284406f,   0.00300515f,   0.00277493f,
+       0.00254471f,   0.00290075f,   0.00325678f,   0.00290726f,   0.00255773f,   0.00259229f,
+       0.00262684f,   0.00269255f,   0.00275825f,   0.00271562f,   0.00267299f,   0.00275871f,
+       0.00284443f,   0.00269768f,   0.00255094f,   0.00257098f,   0.00259103f,   0.00253264f,
+       0.00247425f,   0.00242522f,   0.00237619f,   0.00235338f,   0.00233057f,   0.00261103f,
+       0.00289149f,   0.0028024f,   0.00271332f,   0.00290319f,   0.00309306f,   0.00350249f,
+       0.00391192f,   0.00395984f,   0.00400776f,   0.00401089f,   0.00401403f,   0.0037349f,
+       0.00345576f,   0.00305136f,   0.00264696f,   0.00241812f,   0.00218929f,   0.00191393f,
+       0.00163858f,   0.00153304f,   0.00142751f,   0.00137032f,   0.00131312f,   0.00134518f,
+       0.00137723f,   0.0012429f,   0.00110858f,   0.00114136f,   0.00117415f,   0.00116687f,
+       0.00115959f,   0.00108165f,   0.00100371f,   0.00131319f,   0.00162267f,   0.00130164f,
+       0.000980609f,   0.00115412f,   0.00132762f,   0.0013807f,   0.00143378f,   0.00218704f,
+       0.00294031f,   0.00234605f,   0.00175179f,   0.0020462f,   0.0023406f,   0.00180012f,
+       0.00125963f,   0.00107872f,   0.000897814f,   0.000448907f,   0.0f
       };
 
       for (unsigned int j = 0; j < 275; ++j)
@@ -821,52 +821,52 @@ IkonosImageMetadataInterface
       {
       const float tmp[275] =
       {
-       0.000894394,   0.000713315,   0.000532235,   0.000603058,   0.000673881,   0.000760361,
-       0.00084684,   0.000787802,   0.000728763,   0.000817305,   0.000905846,   0.000904774,
-       0.000903701,   0.00160409,   0.00230447,   0.00221407,   0.00212367,   0.00314219,
-       0.00416071,   0.00470014,   0.00523956,   0.00641267,   0.00758578,   0.0090575,
-       0.0105292,   0.0156041,   0.0206791,   0.027643,   0.0346069,   0.0395911,
-       0.0445753,   0.0408266,   0.0370779,   0.0276002,   0.0181225,   0.017135,
-       0.0161476,   0.0168906,   0.0176337,   0.0172355,   0.0168373,   0.0168014,
-       0.0167656,   0.0178122,   0.0188588,   0.0165949,   0.0143311,   0.0120729,
-       0.0098147,   0.0125599,   0.0153051,   0.0187014,   0.0220978,   0.0244686,
-       0.0268393,   0.0270579,   0.0272765,   0.0223541,   0.0174318,   0.0124528,
-       0.00747381,   0.00633578,   0.00519774,   0.00546479,   0.00573183,   0.00496663,
-       0.00420143,   0.00375248,   0.00330354,   0.00289353,   0.00248353,   0.00252329,
-       0.00256304,   0.00431351,   0.00606397,   0.00864978,   0.0112356,   0.0122617,
-       0.0132878,   0.0113116,   0.00933533,   0.00834238,   0.00734942,   0.00698854,
-       0.00662766,   0.00662135,   0.00661504,   0.00802641,   0.00943779,   0.0113662,
-       0.0132947,   0.0126595,   0.0120243,   0.00943568,   0.0068471,   0.00523536,
-       0.00362362,   0.00341318,   0.00320274,   0.00318157,   0.00316041,   0.00303014,
-       0.00289988,   0.00349364,   0.0040874,   0.00427183,   0.00445627,   0.00425418,
-       0.0040521,   0.00432398,   0.00459586,   0.00500329,   0.00541072,   0.0052616,
-       0.00511248,   0.00619044,   0.0072684,   0.007209,   0.0071496,   0.00780861,
-       0.00846762,   0.0103595,   0.0122514,   0.014548,   0.0168445,   0.0180774,
-       0.0193103,   0.0203458,   0.0213814,   0.021739,   0.0220966,   0.0227061,
-       0.0233155,   0.0241796,   0.0250438,   0.0249493,   0.0248548,   0.0257403,
-       0.0266259,   0.0274829,   0.0283399,   0.0315445,   0.034749,   0.0392491,
-       0.0437491,   0.0488567,   0.0539644,   0.0651598,   0.0763552,   0.0905082,
-       0.104661,   0.125801,   0.146941,   0.17194,   0.196939,   0.22805,
-       0.25916,   0.283963,   0.308767,   0.332943,   0.357119,   0.400422,
-       0.443726,   0.504385,   0.565045,   0.633202,   0.701359,   0.76896,
-       0.83656,   0.889646,   0.942732,   0.971366,   1,   0.997999,
-       0.995998,   0.963345,   0.930691,   0.881401,   0.832111,   0.811504,
-       0.790896,   0.782153,   0.773411,   0.768032,   0.762653,   0.735848,
-       0.709043,   0.707354,   0.705666,   0.697871,   0.690076,   0.672979,
-       0.655882,   0.638978,   0.622073,   0.601538,   0.581002,   0.557459,
-       0.533915,   0.524241,   0.514567,   0.501153,   0.487739,   0.452918,
-       0.418097,   0.370059,   0.32202,   0.285355,   0.248689,   0.209974,
-       0.171259,   0.142537,   0.113816,   0.092517,   0.0712178,   0.0646218,
-       0.0580258,   0.050796,   0.0435662,   0.0353664,   0.0271667,   0.0232974,
-       0.0194282,   0.0176517,   0.0158752,   0.0144977,   0.0131202,   0.0118952,
-       0.0106703,   0.0101536,   0.00963684,   0.00921561,   0.00879438,   0.00794162,
-       0.00708886,   0.00654941,   0.00600996,   0.00563429,   0.00525862,   0.00510421,
-       0.00494981,   0.00454041,   0.00413101,   0.00410078,   0.00407056,   0.00396389,
-       0.00385722,   0.00364911,   0.00344101,   0.00333006,   0.00321911,   0.00300415,
-       0.00278918,   0.00317632,   0.00356346,   0.00312642,   0.00268937,   0.00260112,
-       0.00251287,   0.00263123,   0.00274958,   0.00362147,   0.00449336,   0.00413978,
-       0.0037862,   0.0028968,   0.0020074,   0.00190022,   0.00179303,   0.00227357,
-       0.0027541,   0.00137705,   0,   0,   0
+       0.000894394f,   0.000713315f,   0.000532235f,   0.000603058f,   0.000673881f,   0.000760361f,
+       0.00084684f,   0.000787802f,   0.000728763f,   0.000817305f,   0.000905846f,   0.000904774f,
+       0.000903701f,   0.00160409f,   0.00230447f,   0.00221407f,   0.00212367f,   0.00314219f,
+       0.00416071f,   0.00470014f,   0.00523956f,   0.00641267f,   0.00758578f,   0.0090575f,
+       0.0105292f,   0.0156041f,   0.0206791f,   0.027643f,   0.0346069f,   0.0395911f,
+       0.0445753f,   0.0408266f,   0.0370779f,   0.0276002f,   0.0181225f,   0.017135f,
+       0.0161476f,   0.0168906f,   0.0176337f,   0.0172355f,   0.0168373f,   0.0168014f,
+       0.0167656f,   0.0178122f,   0.0188588f,   0.0165949f,   0.0143311f,   0.0120729f,
+       0.0098147f,   0.0125599f,   0.0153051f,   0.0187014f,   0.0220978f,   0.0244686f,
+       0.0268393f,   0.0270579f,   0.0272765f,   0.0223541f,   0.0174318f,   0.0124528f,
+       0.00747381f,   0.00633578f,   0.00519774f,   0.00546479f,   0.00573183f,   0.00496663f,
+       0.00420143f,   0.00375248f,   0.00330354f,   0.00289353f,   0.00248353f,   0.00252329f,
+       0.00256304f,   0.00431351f,   0.00606397f,   0.00864978f,   0.0112356f,   0.0122617f,
+       0.0132878f,   0.0113116f,   0.00933533f,   0.00834238f,   0.00734942f,   0.00698854f,
+       0.00662766f,   0.00662135f,   0.00661504f,   0.00802641f,   0.00943779f,   0.0113662f,
+       0.0132947f,   0.0126595f,   0.0120243f,   0.00943568f,   0.0068471f,   0.00523536f,
+       0.00362362f,   0.00341318f,   0.00320274f,   0.00318157f,   0.00316041f,   0.00303014f,
+       0.00289988f,   0.00349364f,   0.0040874f,   0.00427183f,   0.00445627f,   0.00425418f,
+       0.0040521f,   0.00432398f,   0.00459586f,   0.00500329f,   0.00541072f,   0.0052616f,
+       0.00511248f,   0.00619044f,   0.0072684f,   0.007209f,   0.0071496f,   0.00780861f,
+       0.00846762f,   0.0103595f,   0.0122514f,   0.014548f,   0.0168445f,   0.0180774f,
+       0.0193103f,   0.0203458f,   0.0213814f,   0.021739f,   0.0220966f,   0.0227061f,
+       0.0233155f,   0.0241796f,   0.0250438f,   0.0249493f,   0.0248548f,   0.0257403f,
+       0.0266259f,   0.0274829f,   0.0283399f,   0.0315445f,   0.034749f,   0.0392491f,
+       0.0437491f,   0.0488567f,   0.0539644f,   0.0651598f,   0.0763552f,   0.0905082f,
+       0.104661f,   0.125801f,   0.146941f,   0.17194f,   0.196939f,   0.22805f,
+       0.25916f,   0.283963f,   0.308767f,   0.332943f,   0.357119f,   0.400422f,
+       0.443726f,   0.504385f,   0.565045f,   0.633202f,   0.701359f,   0.76896f,
+       0.83656f,   0.889646f,   0.942732f,   0.971366f,   1.0f,   0.997999f,
+       0.995998f,   0.963345f,   0.930691f,   0.881401f,   0.832111f,   0.811504f,
+       0.790896f,   0.782153f,   0.773411f,   0.768032f,   0.762653f,   0.735848f,
+       0.709043f,   0.707354f,   0.705666f,   0.697871f,   0.690076f,   0.672979f,
+       0.655882f,   0.638978f,   0.622073f,   0.601538f,   0.581002f,   0.557459f,
+       0.533915f,   0.524241f,   0.514567f,   0.501153f,   0.487739f,   0.452918f,
+       0.418097f,   0.370059f,   0.32202f,   0.285355f,   0.248689f,   0.209974f,
+       0.171259f,   0.142537f,   0.113816f,   0.092517f,   0.0712178f,   0.0646218f,
+       0.0580258f,   0.050796f,   0.0435662f,   0.0353664f,   0.0271667f,   0.0232974f,
+       0.0194282f,   0.0176517f,   0.0158752f,   0.0144977f,   0.0131202f,   0.0118952f,
+       0.0106703f,   0.0101536f,   0.00963684f,   0.00921561f,   0.00879438f,   0.00794162f,
+       0.00708886f,   0.00654941f,   0.00600996f,   0.00563429f,   0.00525862f,   0.00510421f,
+       0.00494981f,   0.00454041f,   0.00413101f,   0.00410078f,   0.00407056f,   0.00396389f,
+       0.00385722f,   0.00364911f,   0.00344101f,   0.00333006f,   0.00321911f,   0.00300415f,
+       0.00278918f,   0.00317632f,   0.00356346f,   0.00312642f,   0.00268937f,   0.00260112f,
+       0.00251287f,   0.00263123f,   0.00274958f,   0.00362147f,   0.00449336f,   0.00413978f,
+       0.0037862f,   0.0028968f,   0.0020074f,   0.00190022f,   0.00179303f,   0.00227357f,
+       0.0027541f,   0.00137705f,   0.0f,   0.0f,   0.0f
       };
 
       for (unsigned int j = 0; j < 275; ++j)
diff --git a/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx b/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx
index 013e4f9..3bd523b 100644
--- a/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx
+++ b/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx
@@ -321,23 +321,34 @@ ImageMetadataInterfaceBase::GetImageKeywordlist() const
   return (imageKeywordlist);
 }
 
-
-std::string
+std::string const
 ImageMetadataInterfaceBase::GetSensorID() const
 {
+  std::string s;
+  GetSensorID( s );
+  return s;
+}
+
+bool
+ImageMetadataInterfaceBase::GetSensorID(std::string & sensorId) const
+{
   ImageKeywordlistType imageKeywordlist;
   const MetaDataDictionaryType& dict = this->GetMetaDataDictionary();
 
-  if (dict.HasKey(MetaDataKey::OSSIMKeywordlistKey))
+  if ( dict.HasKey(MetaDataKey::OSSIMKeywordlistKey) )
     {
     itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, imageKeywordlist);
     }
-  if (!imageKeywordlist.HasKey("sensor"))
+
+  if ( !imageKeywordlist.HasKey("sensor") )
     {
-    return "";
+    return false;
     }
 
-  return imageKeywordlist.GetMetadataByKey("sensor");
+  sensorId = imageKeywordlist.GetMetadataByKey("sensor");
+
+  return true;
+
 }
 
 unsigned int
@@ -567,7 +578,9 @@ ImageMetadataInterfaceBase
     //os << indent << "LowerLeftCorner: " << this->GetLowerLeftCorner( ) << std::endl;
     //os << indent << "LowerRightCorner:" << this->GetLowerRightCorner( ) << std::endl;
     //os << indent << "ImageKeywordlist:" << this->GetImageKeywordlist( ) << std::endl;
-    os << indent << "SensorID:        " << this->GetSensorID( ) << std::endl;
+    std::string sensorId;
+    this->GetSensorID( sensorId );
+    os << indent << "SensorID:        " << sensorId << std::endl;
     os << indent << "NumberOfBands:   " << this->GetNumberOfBands( ) << std::endl;
 
     std::vector<std::string> bandNameList = this->GetBandName();
diff --git a/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx
index b4337e5..3b2bf16 100644
--- a/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx
@@ -786,60 +786,60 @@ QuickBirdImageMetadataInterface
     {
     const float b0[321] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0.0007015,   0.001403,   0.001291,   0.001179,   0.0011415,
-     0.001104,   0.00101145,   0.0009189,   0.00104845,   0.001178,   0.0016055,
-     0.002033,   0.0044495,   0.006866,   0.008873,   0.01088,   0.013805,
-     0.01673,   0.021325,   0.02592,   0.03106,   0.0362,   0.043415,
-     0.05063,   0.05879,   0.06695,   0.075765,   0.08458,   0.09389,
-     0.1032,   0.11255,   0.1219,   0.13345,   0.145,   0.1567,
-     0.1684,   0.17895,   0.1895,   0.2011,   0.2127,   0.21625,
-     0.2198,   0.2392,   0.2586,   0.26695,   0.2753,   0.2854,
-     0.2955,   0.30545,   0.3154,   0.3259,   0.3364,   0.341,
-     0.3456,   0.3501,   0.3546,   0.35785,   0.3611,   0.3648,
-     0.3685,   0.3733,   0.3781,   0.3875,   0.3969,   0.4055,
-     0.4141,   0.42755,   0.441,   0.4543,   0.4676,   0.4829,
-     0.4982,   0.5167,   0.5352,   0.5532,   0.5712,   0.59245,
-     0.6137,   0.6382,   0.6627,   0.6839,   0.7051,   0.7275,
-     0.7499,   0.77045,   0.791,   0.81055,   0.8301,   0.8465,
-     0.8629,   0.877,   0.8911,   0.9081,   0.9251,   0.9293,
-     0.9335,   0.94265,   0.9518,   0.95695,   0.9621,   0.96095,
-     0.9598,   0.97525,   0.9907,   0.9941,   0.9975,   0.9922,
-     0.9869,   0.99345,   1,   0.9938,   0.9876,   0.9877,
-     0.9878,   0.977,   0.9662,   0.95725,   0.9483,   0.934,
-     0.9197,   0.919,   0.9183,   0.90635,   0.8944,   0.8912,
-     0.888,   0.88305,   0.8781,   0.8865,   0.8949,   0.8921,
-     0.8893,   0.8858,   0.8823,   0.88695,   0.8916,   0.8848,
-     0.878,   0.8879,   0.8978,   0.8933,   0.8888,   0.8801,
-     0.8714,   0.86905,   0.8667,   0.8677,   0.8687,   0.86995,
-     0.8712,   0.86685,   0.8625,   0.87175,   0.881,   0.8814,
-     0.8818,   0.8897,   0.8976,   0.9024,   0.9072,   0.91835,
-     0.9295,   0.93105,   0.9326,   0.9198,   0.907,   0.91305,
-     0.9191,   0.9173,   0.9155,   0.9097,   0.9039,   0.89875,
-     0.8936,   0.88705,   0.8805,   0.8761,   0.8717,   0.8605,
-     0.8493,   0.8475,   0.8457,   0.8505,   0.8553,   0.85675,
-     0.8582,   0.85825,   0.8583,   0.8627,   0.8671,   0.8505,
-     0.8339,   0.83895,   0.844,   0.847,   0.85,   0.85265,
-     0.8553,   0.8447,   0.8341,   0.83675,   0.8394,   0.8235,
-     0.8076,   0.8091,   0.8106,   0.785,   0.7594,   0.7616,
-     0.7638,   0.749,   0.7342,   0.7204,   0.7066,   0.70035,
-     0.6941,   0.67875,   0.6634,   0.65895,   0.6545,   0.63655,
-     0.6186,   0.60945,   0.6003,   0.5961,   0.5919,   0.58315,
-     0.5744,   0.55265,   0.5309,   0.5139,   0.4969,   0.48835,
-     0.4798,   0.46305,   0.4463,   0.4305,   0.4147,   0.40975,
-     0.4048,   0.3893,   0.3738,   0.3593,   0.3448,   0.3283,
-     0.3118,   0.3035,   0.2952,   0.28405,   0.2729,   0.2648,
-     0.2567,   0.24975,   0.2428,   0.2322,   0.2216,   0.21615,
-     0.2107,   0.2039,   0.1971,   0.18735,   0.1776,   0.1703,
-     0.163,   0.15575,   0.1485,   0.14215,   0.1358,   0.1299,
-     0.124,   0.11625,   0.1085,   0.10197,   0.09544,   0.08927,
-     0.0831,   0.077305,   0.07151,   0.06746,   0.06341,   0.05911,
-     0.05481,   0.051195,   0.04758,   0.02882,   0.01006,   0.00503,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0007015f,   0.001403f,   0.001291f,   0.001179f,   0.0011415f,
+     0.001104f,   0.00101145f,   0.0009189f,   0.00104845f,   0.001178f,   0.0016055f,
+     0.002033f,   0.0044495f,   0.006866f,   0.008873f,   0.01088f,   0.013805f,
+     0.01673f,   0.021325f,   0.02592f,   0.03106f,   0.0362f,   0.043415f,
+     0.05063f,   0.05879f,   0.06695f,   0.075765f,   0.08458f,   0.09389f,
+     0.1032f,   0.11255f,   0.1219f,   0.13345f,   0.145f,   0.1567f,
+     0.1684f,   0.17895f,   0.1895f,   0.2011f,   0.2127f,   0.21625f,
+     0.2198f,   0.2392f,   0.2586f,   0.26695f,   0.2753f,   0.2854f,
+     0.2955f,   0.30545f,   0.3154f,   0.3259f,   0.3364f,   0.341f,
+     0.3456f,   0.3501f,   0.3546f,   0.35785f,   0.3611f,   0.3648f,
+     0.3685f,   0.3733f,   0.3781f,   0.3875f,   0.3969f,   0.4055f,
+     0.4141f,   0.42755f,   0.441f,   0.4543f,   0.4676f,   0.4829f,
+     0.4982f,   0.5167f,   0.5352f,   0.5532f,   0.5712f,   0.59245f,
+     0.6137f,   0.6382f,   0.6627f,   0.6839f,   0.7051f,   0.7275f,
+     0.7499f,   0.77045f,   0.791f,   0.81055f,   0.8301f,   0.8465f,
+     0.8629f,   0.877f,   0.8911f,   0.9081f,   0.9251f,   0.9293f,
+     0.9335f,   0.94265f,   0.9518f,   0.95695f,   0.9621f,   0.96095f,
+     0.9598f,   0.97525f,   0.9907f,   0.9941f,   0.9975f,   0.9922f,
+     0.9869f,   0.99345f,   1.0f,   0.9938f,   0.9876f,   0.9877f,
+     0.9878f,   0.977f,   0.9662f,   0.95725f,   0.9483f,   0.934f,
+     0.9197f,   0.919f,   0.9183f,   0.90635f,   0.8944f,   0.8912f,
+     0.888f,   0.88305f,   0.8781f,   0.8865f,   0.8949f,   0.8921f,
+     0.8893f,   0.8858f,   0.8823f,   0.88695f,   0.8916f,   0.8848f,
+     0.878f,   0.8879f,   0.8978f,   0.8933f,   0.8888f,   0.8801f,
+     0.8714f,   0.86905f,   0.8667f,   0.8677f,   0.8687f,   0.86995f,
+     0.8712f,   0.86685f,   0.8625f,   0.87175f,   0.881f,   0.8814f,
+     0.8818f,   0.8897f,   0.8976f,   0.9024f,   0.9072f,   0.91835f,
+     0.9295f,   0.93105f,   0.9326f,   0.9198f,   0.907f,   0.91305f,
+     0.9191f,   0.9173f,   0.9155f,   0.9097f,   0.9039f,   0.89875f,
+     0.8936f,   0.88705f,   0.8805f,   0.8761f,   0.8717f,   0.8605f,
+     0.8493f,   0.8475f,   0.8457f,   0.8505f,   0.8553f,   0.85675f,
+     0.8582f,   0.85825f,   0.8583f,   0.8627f,   0.8671f,   0.8505f,
+     0.8339f,   0.83895f,   0.844f,   0.847f,   0.85f,   0.85265f,
+     0.8553f,   0.8447f,   0.8341f,   0.83675f,   0.8394f,   0.8235f,
+     0.8076f,   0.8091f,   0.8106f,   0.785f,   0.7594f,   0.7616f,
+     0.7638f,   0.749f,   0.7342f,   0.7204f,   0.7066f,   0.70035f,
+     0.6941f,   0.67875f,   0.6634f,   0.65895f,   0.6545f,   0.63655f,
+     0.6186f,   0.60945f,   0.6003f,   0.5961f,   0.5919f,   0.58315f,
+     0.5744f,   0.55265f,   0.5309f,   0.5139f,   0.4969f,   0.48835f,
+     0.4798f,   0.46305f,   0.4463f,   0.4305f,   0.4147f,   0.40975f,
+     0.4048f,   0.3893f,   0.3738f,   0.3593f,   0.3448f,   0.3283f,
+     0.3118f,   0.3035f,   0.2952f,   0.28405f,   0.2729f,   0.2648f,
+     0.2567f,   0.24975f,   0.2428f,   0.2322f,   0.2216f,   0.21615f,
+     0.2107f,   0.2039f,   0.1971f,   0.18735f,   0.1776f,   0.1703f,
+     0.163f,   0.15575f,   0.1485f,   0.14215f,   0.1358f,   0.1299f,
+     0.124f,   0.11625f,   0.1085f,   0.10197f,   0.09544f,   0.08927f,
+     0.0831f,   0.077305f,   0.07151f,   0.06746f,   0.06341f,   0.05911f,
+     0.05481f,   0.051195f,   0.04758f,   0.02882f,   0.01006f,   0.00503f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f
     };
 
     //add panchromatic band to the temporary list
@@ -850,234 +850,234 @@ QuickBirdImageMetadataInterface
     {
     const float b1[321] =
     {
-     0,   4.816e-11,   9.632e-11,   1.4606e-10,   1.958e-10,   2.4715e-10,
-     2.985e-10,   3.514e-10,   4.043e-10,   0.000505,   0.00101,   0.0015305,
-     0.002051,   0.002587,   0.003123,   0.0036745,   0.004226,   0.0043815,
-     0.004537,   0.0049295,   0.005322,   0.0046895,   0.004057,   0.003661,
-     0.003265,   0.002984,   0.002703,   0.002503,   0.002303,   0.0017815,
-     0.00126,   0.0015305,   0.001801,   0.0020025,   0.002204,   0.0022995,
-     0.002395,   0.0024735,   0.002552,   0.002512,   0.002472,   0.0026895,
-     0.002907,   0.003455,   0.004003,   0.0052815,   0.00656,   0.00985,
-     0.01314,   0.02076,   0.02838,   0.04826,   0.06814,   0.11167,
-     0.1552,   0.2164,   0.2776,   0.35445,   0.4313,   0.5306,
-     0.6299,   0.677,   0.7241,   0.75775,   0.7914,   0.81765,
-     0.8439,   0.86675,   0.8896,   0.9037,   0.9178,   0.92355,
-     0.9293,   0.94475,   0.9602,   0.9801,   1,   0.9958,
-     0.9916,   0.95475,   0.9179,   0.84515,   0.7724,   0.6729,
-     0.5734,   0.4787,   0.384,   0.32465,   0.2653,   0.21225,
-     0.1592,   0.120415,   0.08163,   0.075435,   0.06924,   0.06627,
-     0.0633,   0.055115,   0.04693,   0.03814,   0.02935,   0.023495,
-     0.01764,   0.015185,   0.01273,   0.012595,   0.01246,   0.012675,
-     0.01289,   0.012755,   0.01262,   0.011865,   0.01111,   0.0106,
-     0.01009,   0.0098255,   0.009561,   0.0094225,   0.009284,   0.0095255,
-     0.009767,   0.0102035,   0.01064,   0.010515,   0.01039,   0.0091415,
-     0.007893,   0.006632,   0.005371,   0.004464,   0.003557,   0.0030945,
-     0.002632,   0.0025675,   0.002503,   0.0024945,   0.002486,   0.0025155,
-     0.002545,   0.002665,   0.002785,   0.0027235,   0.002662,   0.0027025,
-     0.002743,   0.0030155,   0.003288,   0.003867,   0.004446,   0.006651,
-     0.008856,   0.012518,   0.01618,   0.020175,   0.02417,   0.02563,
-     0.02709,   0.02308,   0.01907,   0.0136865,   0.008303,   0.006957,
-     0.005611,   0.0063045,   0.006998,   0.008584,   0.01017,   0.011135,
-     0.0121,   0.0106205,   0.009141,   0.006401,   0.003661,   0.003178,
-     0.002695,   0.002812,   0.002929,   0.0027945,   0.00266,   0.002858,
-     0.003056,   0.0031515,   0.003247,   0.0034115,   0.003576,   0.003427,
-     0.003278,   0.0034455,   0.003613,   0.0036285,   0.003644,   0.003367,
-     0.00309,   0.003232,   0.003374,   0.003267,   0.00316,   0.0031495,
-     0.003139,   0.003062,   0.002985,   0.003139,   0.003293,   0.0033135,
-     0.003334,   0.00345,   0.003566,   0.003647,   0.003728,   0.003857,
-     0.003986,   0.0040515,   0.004117,   0.004197,   0.004277,   0.004226,
-     0.004175,   0.0045645,   0.004954,   0.0048685,   0.004783,   0.005318,
-     0.005853,   0.005788,   0.005723,   0.00567,   0.005617,   0.00546,
-     0.005303,   0.005252,   0.005201,   0.005183,   0.005165,   0.0051595,
-     0.005154,   0.0052175,   0.005281,   0.00549,   0.005699,   0.0062505,
-     0.006802,   0.007529,   0.008256,   0.0090055,   0.009755,   0.0101475,
-     0.01054,   0.010745,   0.01095,   0.010137,   0.009324,   0.0084725,
-     0.007621,   0.0068735,   0.006126,   0.0055815,   0.005037,   0.0046315,
-     0.004226,   0.003881,   0.003536,   0.0032265,   0.002917,   0.002516,
-     0.002115,   0.0019205,   0.001726,   0.001647,   0.001568,   0.0014765,
-     0.001385,   0.001294,   0.001203,   0.001205,   0.001207,   0.0012145,
-     0.001222,   0.0011705,   0.001119,   0.0011195,   0.00112,   0.001082,
-     0.001044,   0.0010645,   0.001085,   0.001156,   0.001227,   0.001233,
-     0.001239,   0.00135,   0.001461,   0.001648,   0.001835,   0.001667,
-     0.001499,   0.001511,   0.001523,   0.0014645,   0.001406,   0.0013125,
-     0.001219,   0.0006095,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0
+     0.0f,   4.816e-11f,   9.632e-11f,   1.4606e-10f,   1.958e-10f,   2.4715e-10f,
+     2.985e-10f,   3.514e-10f,   4.043e-10f,   0.000505f,   0.00101f,   0.0015305f,
+     0.002051f,   0.002587f,   0.003123f,   0.0036745f,   0.004226f,   0.0043815f,
+     0.004537f,   0.0049295f,   0.005322f,   0.0046895f,   0.004057f,   0.003661f,
+     0.003265f,   0.002984f,   0.002703f,   0.002503f,   0.002303f,   0.0017815f,
+     0.00126f,   0.0015305f,   0.001801f,   0.0020025f,   0.002204f,   0.0022995f,
+     0.002395f,   0.0024735f,   0.002552f,   0.002512f,   0.002472f,   0.0026895f,
+     0.002907f,   0.003455f,   0.004003f,   0.0052815f,   0.00656f,   0.00985f,
+     0.01314f,   0.02076f,   0.02838f,   0.04826f,   0.06814f,   0.11167f,
+     0.1552f,   0.2164f,   0.2776f,   0.35445f,   0.4313f,   0.5306f,
+     0.6299f,   0.677f,   0.7241f,   0.75775f,   0.7914f,   0.81765f,
+     0.8439f,   0.86675f,   0.8896f,   0.9037f,   0.9178f,   0.92355f,
+     0.9293f,   0.94475f,   0.9602f,   0.9801f,   1.0f,   0.9958f,
+     0.9916f,   0.95475f,   0.9179f,   0.84515f,   0.7724f,   0.6729f,
+     0.5734f,   0.4787f,   0.384f,   0.32465f,   0.2653f,   0.21225f,
+     0.1592f,   0.120415f,   0.08163f,   0.075435f,   0.06924f,   0.06627f,
+     0.0633f,   0.055115f,   0.04693f,   0.03814f,   0.02935f,   0.023495f,
+     0.01764f,   0.015185f,   0.01273f,   0.012595f,   0.01246f,   0.012675f,
+     0.01289f,   0.012755f,   0.01262f,   0.011865f,   0.01111f,   0.0106f,
+     0.01009f,   0.0098255f,   0.009561f,   0.0094225f,   0.009284f,   0.0095255f,
+     0.009767f,   0.0102035f,   0.01064f,   0.010515f,   0.01039f,   0.0091415f,
+     0.007893f,   0.006632f,   0.005371f,   0.004464f,   0.003557f,   0.0030945f,
+     0.002632f,   0.0025675f,   0.002503f,   0.0024945f,   0.002486f,   0.0025155f,
+     0.002545f,   0.002665f,   0.002785f,   0.0027235f,   0.002662f,   0.0027025f,
+     0.002743f,   0.0030155f,   0.003288f,   0.003867f,   0.004446f,   0.006651f,
+     0.008856f,   0.012518f,   0.01618f,   0.020175f,   0.02417f,   0.02563f,
+     0.02709f,   0.02308f,   0.01907f,   0.0136865f,   0.008303f,   0.006957f,
+     0.005611f,   0.0063045f,   0.006998f,   0.008584f,   0.01017f,   0.011135f,
+     0.0121f,   0.0106205f,   0.009141f,   0.006401f,   0.003661f,   0.003178f,
+     0.002695f,   0.002812f,   0.002929f,   0.0027945f,   0.00266f,   0.002858f,
+     0.003056f,   0.0031515f,   0.003247f,   0.0034115f,   0.003576f,   0.003427f,
+     0.003278f,   0.0034455f,   0.003613f,   0.0036285f,   0.003644f,   0.003367f,
+     0.00309f,   0.003232f,   0.003374f,   0.003267f,   0.00316f,   0.0031495f,
+     0.003139f,   0.003062f,   0.002985f,   0.003139f,   0.003293f,   0.0033135f,
+     0.003334f,   0.00345f,   0.003566f,   0.003647f,   0.003728f,   0.003857f,
+     0.003986f,   0.0040515f,   0.004117f,   0.004197f,   0.004277f,   0.004226f,
+     0.004175f,   0.0045645f,   0.004954f,   0.0048685f,   0.004783f,   0.005318f,
+     0.005853f,   0.005788f,   0.005723f,   0.00567f,   0.005617f,   0.00546f,
+     0.005303f,   0.005252f,   0.005201f,   0.005183f,   0.005165f,   0.0051595f,
+     0.005154f,   0.0052175f,   0.005281f,   0.00549f,   0.005699f,   0.0062505f,
+     0.006802f,   0.007529f,   0.008256f,   0.0090055f,   0.009755f,   0.0101475f,
+     0.01054f,   0.010745f,   0.01095f,   0.010137f,   0.009324f,   0.0084725f,
+     0.007621f,   0.0068735f,   0.006126f,   0.0055815f,   0.005037f,   0.0046315f,
+     0.004226f,   0.003881f,   0.003536f,   0.0032265f,   0.002917f,   0.002516f,
+     0.002115f,   0.0019205f,   0.001726f,   0.001647f,   0.001568f,   0.0014765f,
+     0.001385f,   0.001294f,   0.001203f,   0.001205f,   0.001207f,   0.0012145f,
+     0.001222f,   0.0011705f,   0.001119f,   0.0011195f,   0.00112f,   0.001082f,
+     0.001044f,   0.0010645f,   0.001085f,   0.001156f,   0.001227f,   0.001233f,
+     0.001239f,   0.00135f,   0.001461f,   0.001648f,   0.001835f,   0.001667f,
+     0.001499f,   0.001511f,   0.001523f,   0.0014645f,   0.001406f,   0.0013125f,
+     0.001219f,   0.0006095f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0
     };
 
     const float b2[321] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0.001543,   0.003086,   0.0035565,   0.004027,   0.0031075,
-     0.002188,   0.0022535,   0.002319,   0.001899,   0.001479,   0.0014535,
-     0.001428,   0.00112715,   0.0008263,   0.00098315,   0.00114,   0.001191,
-     0.001242,   0.0011965,   0.001151,   0.001195,   0.001239,   0.00119,
-     0.001141,   0.001164,   0.001187,   0.001289,   0.001391,   0.0016425,
-     0.001894,   0.0021145,   0.002335,   0.002574,   0.002813,   0.0032595,
-     0.003706,   0.0046255,   0.005545,   0.0076825,   0.00982,   0.013835,
-     0.01785,   0.02064,   0.02343,   0.026765,   0.0301,   0.03563,
-     0.04116,   0.050415,   0.05967,   0.078915,   0.09816,   0.12738,
-     0.1566,   0.1924,   0.2282,   0.2739,   0.3196,   0.36855,
-     0.4175,   0.4726,   0.5277,   0.5928,   0.6579,   0.71385,
-     0.7698,   0.8005,   0.8312,   0.83785,   0.8445,   0.8575,
-     0.8705,   0.88935,   0.9082,   0.9271,   0.946,   0.96395,
-     0.9819,   0.99095,   1,   0.9967,   0.9934,   0.9876,
-     0.9818,   0.97545,   0.9691,   0.97325,   0.9774,   0.98215,
-     0.9869,   0.97605,   0.9652,   0.93155,   0.8979,   0.84445,
-     0.791,   0.72305,   0.6551,   0.56865,   0.4822,   0.3973,
-     0.3124,   0.25785,   0.2033,   0.17055,   0.1378,   0.11394,
-     0.09008,   0.072895,   0.05571,   0.046095,   0.03648,   0.032155,
-     0.02783,   0.026995,   0.02616,   0.02677,   0.02738,   0.02745,
-     0.02752,   0.02585,   0.02418,   0.02138,   0.01858,   0.016675,
-     0.01477,   0.01398,   0.01319,   0.013215,   0.01324,   0.01321,
-     0.01318,   0.01241,   0.01164,   0.0103975,   0.009155,   0.0076035,
-     0.006052,   0.005198,   0.004344,   0.003775,   0.003206,   0.0030305,
-     0.002855,   0.002863,   0.002871,   0.0034605,   0.00405,   0.0051125,
-     0.006175,   0.006901,   0.007627,   0.007632,   0.007637,   0.006665,
-     0.005693,   0.004709,   0.003725,   0.003184,   0.002643,   0.002404,
-     0.002165,   0.002389,   0.002613,   0.0028265,   0.00304,   0.0029335,
-     0.002827,   0.0029585,   0.00309,   0.003231,   0.003372,   0.0036625,
-     0.003953,   0.003888,   0.003823,   0.004107,   0.004391,   0.004264,
-     0.004137,   0.003973,   0.003809,   0.003648,   0.003487,   0.003354,
-     0.003221,   0.0031325,   0.003044,   0.0030325,   0.003021,   0.0030705,
-     0.00312,   0.0031665,   0.003213,   0.0032575,   0.003302,   0.0035005,
-     0.003699,   0.0040635,   0.004428,   0.004754,   0.00508,   0.0059895,
-     0.006899,   0.0073485,   0.007798,   0.008437,   0.009076,   0.0091385,
-     0.009201,   0.0091225,   0.009044,   0.0088315,   0.008619,   0.0082995,
-     0.00798,   0.00779,   0.0076,   0.007548,   0.007496,   0.007548,
-     0.0076,   0.007711,   0.007822,   0.0079615,   0.008101,   0.008127,
-     0.008153,   0.007961,   0.007769,   0.007238,   0.006707,   0.0061495,
-     0.005592,   0.005117,   0.004642,   0.0042505,   0.003859,   0.0034755,
-     0.003092,   0.00288,   0.002668,   0.0023465,   0.002025,   0.0018485,
-     0.001672,   0.001577,   0.001482,   0.001362,   0.001242,   0.001247,
-     0.001252,   0.001152,   0.001052,   0.00099725,   0.0009425,   0.0009543,
-     0.0009661,   0.00091635,   0.0008666,   0.0008281,   0.0007896,   0.00083065,
-     0.0008717,   0.00088005,   0.0008884,   0.00092515,   0.0009619,   0.00103995,
-     0.001118,   0.001196,   0.001274,   0.0011625,   0.001051,   0.0010565,
-     0.001062,   0.00096085,   0.0008597,   0.00091815,   0.0009766,   0.0009189,
-     0.0008612,   0.0004306,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.001543f,   0.003086f,   0.0035565f,   0.004027f,   0.0031075f,
+     0.002188f,   0.0022535f,   0.002319f,   0.001899f,   0.001479f,   0.0014535f,
+     0.001428f,   0.00112715f,   0.0008263f,   0.00098315f,   0.00114f,   0.001191f,
+     0.001242f,   0.0011965f,   0.001151f,   0.001195f,   0.001239f,   0.00119f,
+     0.001141f,   0.001164f,   0.001187f,   0.001289f,   0.001391f,   0.0016425f,
+     0.001894f,   0.0021145f,   0.002335f,   0.002574f,   0.002813f,   0.0032595f,
+     0.003706f,   0.0046255f,   0.005545f,   0.0076825f,   0.00982f,   0.013835f,
+     0.01785f,   0.02064f,   0.02343f,   0.026765f,   0.0301f,   0.03563f,
+     0.04116f,   0.050415f,   0.05967f,   0.078915f,   0.09816f,   0.12738f,
+     0.1566f,   0.1924f,   0.2282f,   0.2739f,   0.3196f,   0.36855f,
+     0.4175f,   0.4726f,   0.5277f,   0.5928f,   0.6579f,   0.71385f,
+     0.7698f,   0.8005f,   0.8312f,   0.83785f,   0.8445f,   0.8575f,
+     0.8705f,   0.88935f,   0.9082f,   0.9271f,   0.946f,   0.96395f,
+     0.9819f,   0.99095f,   1.0f,   0.9967f,   0.9934f,   0.9876f,
+     0.9818f,   0.97545f,   0.9691f,   0.97325f,   0.9774f,   0.98215f,
+     0.9869f,   0.97605f,   0.9652f,   0.93155f,   0.8979f,   0.84445f,
+     0.791f,   0.72305f,   0.6551f,   0.56865f,   0.4822f,   0.3973f,
+     0.3124f,   0.25785f,   0.2033f,   0.17055f,   0.1378f,   0.11394f,
+     0.09008f,   0.072895f,   0.05571f,   0.046095f,   0.03648f,   0.032155f,
+     0.02783f,   0.026995f,   0.02616f,   0.02677f,   0.02738f,   0.02745f,
+     0.02752f,   0.02585f,   0.02418f,   0.02138f,   0.01858f,   0.016675f,
+     0.01477f,   0.01398f,   0.01319f,   0.013215f,   0.01324f,   0.01321f,
+     0.01318f,   0.01241f,   0.01164f,   0.0103975f,   0.009155f,   0.0076035f,
+     0.006052f,   0.005198f,   0.004344f,   0.003775f,   0.003206f,   0.0030305f,
+     0.002855f,   0.002863f,   0.002871f,   0.0034605f,   0.00405f,   0.0051125f,
+     0.006175f,   0.006901f,   0.007627f,   0.007632f,   0.007637f,   0.006665f,
+     0.005693f,   0.004709f,   0.003725f,   0.003184f,   0.002643f,   0.002404f,
+     0.002165f,   0.002389f,   0.002613f,   0.0028265f,   0.00304f,   0.0029335f,
+     0.002827f,   0.0029585f,   0.00309f,   0.003231f,   0.003372f,   0.0036625f,
+     0.003953f,   0.003888f,   0.003823f,   0.004107f,   0.004391f,   0.004264f,
+     0.004137f,   0.003973f,   0.003809f,   0.003648f,   0.003487f,   0.003354f,
+     0.003221f,   0.0031325f,   0.003044f,   0.0030325f,   0.003021f,   0.0030705f,
+     0.00312f,   0.0031665f,   0.003213f,   0.0032575f,   0.003302f,   0.0035005f,
+     0.003699f,   0.0040635f,   0.004428f,   0.004754f,   0.00508f,   0.0059895f,
+     0.006899f,   0.0073485f,   0.007798f,   0.008437f,   0.009076f,   0.0091385f,
+     0.009201f,   0.0091225f,   0.009044f,   0.0088315f,   0.008619f,   0.0082995f,
+     0.00798f,   0.00779f,   0.0076f,   0.007548f,   0.007496f,   0.007548f,
+     0.0076f,   0.007711f,   0.007822f,   0.0079615f,   0.008101f,   0.008127f,
+     0.008153f,   0.007961f,   0.007769f,   0.007238f,   0.006707f,   0.0061495f,
+     0.005592f,   0.005117f,   0.004642f,   0.0042505f,   0.003859f,   0.0034755f,
+     0.003092f,   0.00288f,   0.002668f,   0.0023465f,   0.002025f,   0.0018485f,
+     0.001672f,   0.001577f,   0.001482f,   0.001362f,   0.001242f,   0.001247f,
+     0.001252f,   0.001152f,   0.001052f,   0.00099725f,   0.0009425f,   0.0009543f,
+     0.0009661f,   0.00091635f,   0.0008666f,   0.0008281f,   0.0007896f,   0.00083065f,
+     0.0008717f,   0.00088005f,   0.0008884f,   0.00092515f,   0.0009619f,   0.00103995f,
+     0.001118f,   0.001196f,   0.001274f,   0.0011625f,   0.001051f,   0.0010565f,
+     0.001062f,   0.00096085f,   0.0008597f,   0.00091815f,   0.0009766f,   0.0009189f,
+     0.0008612f,   0.0004306f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,
     };
 
     const float b3[321] =
     {
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0.0018575,   0.003715,   0.003079,   0.002443,   0.0020455,
-     0.001648,   0.0017865,   0.001925,   0.001553,   0.001181,   0.001127,
-     0.001073,   0.0009881,   0.0009032,   0.00093675,   0.0009703,   0.00094635,
-     0.0009224,   0.0011177,   0.001313,   0.000995,   0.000677,   0.0009465,
-     0.001216,   0.0012365,   0.001257,   0.001289,   0.001321,   0.0012365,
-     0.001152,   0.00107375,   0.0009955,   0.00125725,   0.001519,   0.001803,
-     0.002087,   0.002445,   0.002803,   0.0029485,   0.003094,   0.002991,
-     0.002888,   0.0028545,   0.002821,   0.002901,   0.002981,   0.0032205,
-     0.00346,   0.003574,   0.003688,   0.003422,   0.003156,   0.0026165,
-     0.002077,   0.002126,   0.002175,   0.0022785,   0.002382,   0.002534,
-     0.002686,   0.0028785,   0.003071,   0.003181,   0.003291,   0.0033965,
-     0.003502,   0.003615,   0.003728,   0.004149,   0.00457,   0.00494,
-     0.00531,   0.00563,   0.00595,   0.0061365,   0.006323,   0.006458,
-     0.006593,   0.0067545,   0.006916,   0.007343,   0.00777,   0.008377,
-     0.008984,   0.009607,   0.01023,   0.01101,   0.01179,   0.01283,
-     0.01387,   0.015775,   0.01768,   0.020725,   0.02377,   0.028595,
-     0.03342,   0.03993,   0.04644,   0.054755,   0.06307,   0.07513,
-     0.08719,   0.107645,   0.1281,   0.16655,   0.205,   0.26755,
-     0.3301,   0.41305,   0.496,   0.579,   0.662,   0.7337,
-     0.8054,   0.8447,   0.884,   0.8976,   0.9112,   0.9265,
-     0.9418,   0.9608,   0.9798,   0.9878,   0.9958,   0.9979,
-     1,   0.99615,   0.9923,   0.97235,   0.9524,   0.9125,
-     0.8726,   0.8128,   0.753,   0.6767,   0.6004,   0.51195,
-     0.4235,   0.35205,   0.2806,   0.22285,   0.1651,   0.130405,
-     0.09571,   0.07443,   0.05315,   0.041695,   0.03024,   0.026095,
-     0.02195,   0.021015,   0.02008,   0.020405,   0.02073,   0.021105,
-     0.02148,   0.02055,   0.01962,   0.01719,   0.01476,   0.0121415,
-     0.009523,   0.0080775,   0.006632,   0.0058285,   0.005025,   0.004769,
-     0.004513,   0.004338,   0.004163,   0.004345,   0.004527,   0.0047955,
-     0.005064,   0.005541,   0.006018,   0.0063415,   0.006665,   0.006433,
-     0.006201,   0.005328,   0.004455,   0.003759,   0.003063,   0.002884,
-     0.002705,   0.00257,   0.002435,   0.002453,   0.002471,   0.0024775,
-     0.002484,   0.0024255,   0.002367,   0.0024915,   0.002616,   0.00253,
-     0.002444,   0.002528,   0.002612,   0.0025575,   0.002503,   0.00255,
-     0.002597,   0.002551,   0.002505,   0.002426,   0.002347,   0.0023605,
-     0.002374,   0.0022935,   0.002213,   0.002167,   0.002121,   0.002053,
-     0.001985,   0.001928,   0.001871,   0.00194,   0.002009,   0.002071,
-     0.002133,   0.002293,   0.002453,   0.0026255,   0.002798,   0.0027925,
-     0.002787,   0.002651,   0.002515,   0.0020235,   0.001532,   0.001344,
-     0.001156,   0.001118,   0.00108,   0.0010297,   0.0009794,   0.0009771,
-     0.0009748,   0.0010049,   0.001035,   0.00092405,   0.0008131,   0.00082065,
-     0.0008282,   0.0007723,   0.0007164,   0.00070735,   0.0006983,   0.00070225,
-     0.0007062,   0.0006895,   0.0006728,   0.0006287,   0.0005846,   0.0006068,
-     0.000629,   0.00065395,   0.0006789,   0.00071925,   0.0007596,   0.000719,
-     0.0006784,   0.00066125,   0.0006441,   0.0007476,   0.0008511,   0.0008908,
-     0.0009305,   0.0008436,   0.0007567,   0.0007948,   0.0008329,   0.000872,
-     0.0009111,   0.00089545,   0.0008798,   0.0007618,   0.0006438,   0.00073805,
-     0.0008323,   0.00041615,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0018575f,   0.003715f,   0.003079f,   0.002443f,   0.0020455f,
+     0.001648f,   0.0017865f,   0.001925f,   0.001553f,   0.001181f,   0.001127f,
+     0.001073f,   0.0009881f,   0.0009032f,   0.00093675f,   0.0009703f,   0.00094635f,
+     0.0009224f,   0.0011177f,   0.001313f,   0.000995f,   0.000677f,   0.0009465f,
+     0.001216f,   0.0012365f,   0.001257f,   0.001289f,   0.001321f,   0.0012365f,
+     0.001152f,   0.00107375f,   0.0009955f,   0.00125725f,   0.001519f,   0.001803f,
+     0.002087f,   0.002445f,   0.002803f,   0.0029485f,   0.003094f,   0.002991f,
+     0.002888f,   0.0028545f,   0.002821f,   0.002901f,   0.002981f,   0.0032205f,
+     0.00346f,   0.003574f,   0.003688f,   0.003422f,   0.003156f,   0.0026165f,
+     0.002077f,   0.002126f,   0.002175f,   0.0022785f,   0.002382f,   0.002534f,
+     0.002686f,   0.0028785f,   0.003071f,   0.003181f,   0.003291f,   0.0033965f,
+     0.003502f,   0.003615f,   0.003728f,   0.004149f,   0.00457f,   0.00494f,
+     0.00531f,   0.00563f,   0.00595f,   0.0061365f,   0.006323f,   0.006458f,
+     0.006593f,   0.0067545f,   0.006916f,   0.007343f,   0.00777f,   0.008377f,
+     0.008984f,   0.009607f,   0.01023f,   0.01101f,   0.01179f,   0.01283f,
+     0.01387f,   0.015775f,   0.01768f,   0.020725f,   0.02377f,   0.028595f,
+     0.03342f,   0.03993f,   0.04644f,   0.054755f,   0.06307f,   0.07513f,
+     0.08719f,   0.107645f,   0.1281f,   0.16655f,   0.205f,   0.26755f,
+     0.3301f,   0.41305f,   0.496f,   0.579f,   0.662f,   0.7337f,
+     0.8054f,   0.8447f,   0.884f,   0.8976f,   0.9112f,   0.9265f,
+     0.9418f,   0.9608f,   0.9798f,   0.9878f,   0.9958f,   0.9979f,
+     1.0f,   0.99615f,   0.9923f,   0.97235f,   0.9524f,   0.9125f,
+     0.8726f,   0.8128f,   0.753f,   0.6767f,   0.6004f,   0.51195f,
+     0.4235f,   0.35205f,   0.2806f,   0.22285f,   0.1651f,   0.130405f,
+     0.09571f,   0.07443f,   0.05315f,   0.041695f,   0.03024f,   0.026095f,
+     0.02195f,   0.021015f,   0.02008f,   0.020405f,   0.02073f,   0.021105f,
+     0.02148f,   0.02055f,   0.01962f,   0.01719f,   0.01476f,   0.0121415f,
+     0.009523f,   0.0080775f,   0.006632f,   0.0058285f,   0.005025f,   0.004769f,
+     0.004513f,   0.004338f,   0.004163f,   0.004345f,   0.004527f,   0.0047955f,
+     0.005064f,   0.005541f,   0.006018f,   0.0063415f,   0.006665f,   0.006433f,
+     0.006201f,   0.005328f,   0.004455f,   0.003759f,   0.003063f,   0.002884f,
+     0.002705f,   0.00257f,   0.002435f,   0.002453f,   0.002471f,   0.0024775f,
+     0.002484f,   0.0024255f,   0.002367f,   0.0024915f,   0.002616f,   0.00253f,
+     0.002444f,   0.002528f,   0.002612f,   0.0025575f,   0.002503f,   0.00255f,
+     0.002597f,   0.002551f,   0.002505f,   0.002426f,   0.002347f,   0.0023605f,
+     0.002374f,   0.0022935f,   0.002213f,   0.002167f,   0.002121f,   0.002053f,
+     0.001985f,   0.001928f,   0.001871f,   0.00194f,   0.002009f,   0.002071f,
+     0.002133f,   0.002293f,   0.002453f,   0.0026255f,   0.002798f,   0.0027925f,
+     0.002787f,   0.002651f,   0.002515f,   0.0020235f,   0.001532f,   0.001344f,
+     0.001156f,   0.001118f,   0.00108f,   0.0010297f,   0.0009794f,   0.0009771f,
+     0.0009748f,   0.0010049f,   0.001035f,   0.00092405f,   0.0008131f,   0.00082065f,
+     0.0008282f,   0.0007723f,   0.0007164f,   0.00070735f,   0.0006983f,   0.00070225f,
+     0.0007062f,   0.0006895f,   0.0006728f,   0.0006287f,   0.0005846f,   0.0006068f,
+     0.000629f,   0.00065395f,   0.0006789f,   0.00071925f,   0.0007596f,   0.000719f,
+     0.0006784f,   0.00066125f,   0.0006441f,   0.0007476f,   0.0008511f,   0.0008908f,
+     0.0009305f,   0.0008436f,   0.0007567f,   0.0007948f,   0.0008329f,   0.000872f,
+     0.0009111f,   0.00089545f,   0.0008798f,   0.0007618f,   0.0006438f,   0.00073805f,
+     0.0008323f,   0.00041615f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f
     };
 
     const float b4[321] =
     {
-     0,   6.72e-11,   1.344e-10,   2.038e-10,   2.732e-10,   3.4475e-10,
-     4.163e-10,   4.901e-10,   5.639e-10,   0.0007045,   0.001409,   0.002135,
-     0.002861,   0.0036085,   0.004356,   0.0051255,   0.005895,   0.006112,
-     0.006329,   0.0061655,   0.006002,   0.005693,   0.005384,   0.0044505,
-     0.003517,   0.0028125,   0.002108,   0.002272,   0.002436,   0.002068,
-     0.0017,   0.0019855,   0.002271,   0.0020705,   0.00187,   0.0017455,
-     0.001621,   0.0017855,   0.00195,   0.0018905,   0.001831,   0.0016705,
-     0.00151,   0.0015045,   0.001499,   0.001721,   0.001943,   0.0018305,
-     0.001718,   0.002082,   0.002446,   0.002492,   0.002538,   0.002833,
-     0.003128,   0.003589,   0.00405,   0.0043915,   0.004733,   0.0047405,
-     0.004748,   0.004824,   0.0049,   0.004541,   0.004182,   0.004313,
-     0.004444,   0.0046115,   0.004779,   0.005007,   0.005235,   0.005396,
-     0.005557,   0.0054025,   0.005248,   0.0047195,   0.004191,   0.0035905,
-     0.00299,   0.0028175,   0.002645,   0.0026115,   0.002578,   0.002558,
-     0.002538,   0.0027,   0.002862,   0.002721,   0.00258,   0.002973,
-     0.003366,   0.004324,   0.005282,   0.006576,   0.00787,   0.008871,
-     0.009872,   0.010051,   0.01023,   0.0090465,   0.007863,   0.006367,
-     0.004871,   0.0048565,   0.004842,   0.0055935,   0.006345,   0.0069985,
-     0.007652,   0.0077885,   0.007925,   0.007197,   0.006469,   0.0054185,
-     0.004368,   0.004082,   0.003796,   0.003768,   0.00374,   0.0036695,
-     0.003599,   0.0036165,   0.003634,   0.0037785,   0.003923,   0.0042145,
-     0.004506,   0.004688,   0.00487,   0.0052705,   0.005671,   0.005878,
-     0.006085,   0.006441,   0.006797,   0.007044,   0.007291,   0.007926,
-     0.008561,   0.0092905,   0.01002,   0.010625,   0.01123,   0.01174,
-     0.01225,   0.012595,   0.01294,   0.01323,   0.01352,   0.01396,
-     0.0144,   0.01499,   0.01558,   0.01641,   0.01724,   0.01842,
-     0.0196,   0.021835,   0.02407,   0.026755,   0.02944,   0.03189,
-     0.03434,   0.03751,   0.04068,   0.04483,   0.04898,   0.05445,
-     0.05992,   0.066405,   0.07289,   0.081705,   0.09052,   0.10501,
-     0.1195,   0.141,   0.1625,   0.20245,   0.2424,   0.3015,
-     0.3606,   0.4268,   0.493,   0.564,   0.635,   0.71665,
-     0.7983,   0.8726,   0.9469,   0.97345,   1,   0.99855,
-     0.9971,   0.98365,   0.9702,   0.9526,   0.935,   0.91795,
-     0.9009,   0.88535,   0.8698,   0.86065,   0.8515,   0.84485,
-     0.8382,   0.8352,   0.8322,   0.8289,   0.8256,   0.823,
-     0.8204,   0.8137,   0.807,   0.7957,   0.7844,   0.76695,
-     0.7495,   0.72675,   0.704,   0.6911,   0.6782,   0.6638,
-     0.6494,   0.6313,   0.6132,   0.59005,   0.5669,   0.5493,
-     0.5317,   0.5117,   0.4917,   0.4644,   0.4371,   0.3943,
-     0.3515,   0.3134,   0.2753,   0.24845,   0.2216,   0.191,
-     0.1604,   0.1385,   0.1166,   0.1003,   0.084,   0.07559,
-     0.06718,   0.054015,   0.04085,   0.030665,   0.02048,   0.017005,
-     0.01353,   0.01178,   0.01003,   0.0089005,   0.007771,   0.007077,
-     0.006383,   0.0058745,   0.005366,   0.0049605,   0.004555,   0.0040195,
-     0.003484,   0.0031455,   0.002807,   0.002621,   0.002435,   0.0023315,
-     0.002228,   0.002158,   0.002088,   0.001973,   0.001858,   0.001839,
-     0.00182,   0.0018615,   0.001903,   0.001759,   0.001615,   0.0016735,
-     0.001732,   0.0017285,   0.001725,   0.001884,   0.002043,   0.0020925,
-     0.002142,   0.0020825,   0.002023,   0.001963,   0.001903,   0.0018045,
-     0.001706,   0.0017565,   0.001807,   0.0017525,   0.001698,   0.001849,
-     0.002,   0.001,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,
-     0,   0,   0
+     0.0f,   6.72e-11f,   1.344e-10f,   2.038e-10f,   2.732e-10f,   3.4475e-10f,
+     4.163e-10f,   4.901e-10f,   5.639e-10f,   0.0007045f,   0.001409f,   0.002135f,
+     0.002861f,   0.0036085f,   0.004356f,   0.0051255f,   0.005895f,   0.006112f,
+     0.006329f,   0.0061655f,   0.006002f,   0.005693f,   0.005384f,   0.0044505f,
+     0.003517f,   0.0028125f,   0.002108f,   0.002272f,   0.002436f,   0.002068f,
+     0.0017f,   0.0019855f,   0.002271f,   0.0020705f,   0.00187f,   0.0017455f,
+     0.001621f,   0.0017855f,   0.00195f,   0.0018905f,   0.001831f,   0.0016705f,
+     0.00151f,   0.0015045f,   0.001499f,   0.001721f,   0.001943f,   0.0018305f,
+     0.001718f,   0.002082f,   0.002446f,   0.002492f,   0.002538f,   0.002833f,
+     0.003128f,   0.003589f,   0.00405f,   0.0043915f,   0.004733f,   0.0047405f,
+     0.004748f,   0.004824f,   0.0049f,   0.004541f,   0.004182f,   0.004313f,
+     0.004444f,   0.0046115f,   0.004779f,   0.005007f,   0.005235f,   0.005396f,
+     0.005557f,   0.0054025f,   0.005248f,   0.0047195f,   0.004191f,   0.0035905f,
+     0.00299f,   0.0028175f,   0.002645f,   0.0026115f,   0.002578f,   0.002558f,
+     0.002538f,   0.0027f,   0.002862f,   0.002721f,   0.00258f,   0.002973f,
+     0.003366f,   0.004324f,   0.005282f,   0.006576f,   0.00787f,   0.008871f,
+     0.009872f,   0.010051f,   0.01023f,   0.0090465f,   0.007863f,   0.006367f,
+     0.004871f,   0.0048565f,   0.004842f,   0.0055935f,   0.006345f,   0.0069985f,
+     0.007652f,   0.0077885f,   0.007925f,   0.007197f,   0.006469f,   0.0054185f,
+     0.004368f,   0.004082f,   0.003796f,   0.003768f,   0.00374f,   0.0036695f,
+     0.003599f,   0.0036165f,   0.003634f,   0.0037785f,   0.003923f,   0.0042145f,
+     0.004506f,   0.004688f,   0.00487f,   0.0052705f,   0.005671f,   0.005878f,
+     0.006085f,   0.006441f,   0.006797f,   0.007044f,   0.007291f,   0.007926f,
+     0.008561f,   0.0092905f,   0.01002f,   0.010625f,   0.01123f,   0.01174f,
+     0.01225f,   0.012595f,   0.01294f,   0.01323f,   0.01352f,   0.01396f,
+     0.0144f,   0.01499f,   0.01558f,   0.01641f,   0.01724f,   0.01842f,
+     0.0196f,   0.021835f,   0.02407f,   0.026755f,   0.02944f,   0.03189f,
+     0.03434f,   0.03751f,   0.04068f,   0.04483f,   0.04898f,   0.05445f,
+     0.05992f,   0.066405f,   0.07289f,   0.081705f,   0.09052f,   0.10501f,
+     0.1195f,   0.141f,   0.1625f,   0.20245f,   0.2424f,   0.3015f,
+     0.3606f,   0.4268f,   0.493f,   0.564f,   0.635f,   0.71665f,
+     0.7983f,   0.8726f,   0.9469f,   0.97345f,   1.0f,   0.99855f,
+     0.9971f,   0.98365f,   0.9702f,   0.9526f,   0.935f,   0.91795f,
+     0.9009f,   0.88535f,   0.8698f,   0.86065f,   0.8515f,   0.84485f,
+     0.8382f,   0.8352f,   0.8322f,   0.8289f,   0.8256f,   0.823f,
+     0.8204f,   0.8137f,   0.807f,   0.7957f,   0.7844f,   0.76695f,
+     0.7495f,   0.72675f,   0.704f,   0.6911f,   0.6782f,   0.6638f,
+     0.6494f,   0.6313f,   0.6132f,   0.59005f,   0.5669f,   0.5493f,
+     0.5317f,   0.5117f,   0.4917f,   0.4644f,   0.4371f,   0.3943f,
+     0.3515f,   0.3134f,   0.2753f,   0.24845f,   0.2216f,   0.191f,
+     0.1604f,   0.1385f,   0.1166f,   0.1003f,   0.084f,   0.07559f,
+     0.06718f,   0.054015f,   0.04085f,   0.030665f,   0.02048f,   0.017005f,
+     0.01353f,   0.01178f,   0.01003f,   0.0089005f,   0.007771f,   0.007077f,
+     0.006383f,   0.0058745f,   0.005366f,   0.0049605f,   0.004555f,   0.0040195f,
+     0.003484f,   0.0031455f,   0.002807f,   0.002621f,   0.002435f,   0.0023315f,
+     0.002228f,   0.002158f,   0.002088f,   0.001973f,   0.001858f,   0.001839f,
+     0.00182f,   0.0018615f,   0.001903f,   0.001759f,   0.001615f,   0.0016735f,
+     0.001732f,   0.0017285f,   0.001725f,   0.001884f,   0.002043f,   0.0020925f,
+     0.002142f,   0.0020825f,   0.002023f,   0.001963f,   0.001903f,   0.0018045f,
+     0.001706f,   0.0017565f,   0.001807f,   0.0017525f,   0.001698f,   0.001849f,
+     0.002f,   0.001f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f,   0.0f,   0.0f,   0.0f,
+     0.0f,   0.0f,   0.0f
     };
     //Add multispectral bands to the temporary list
     const std::vector<float> vb1 (b1, b1 + sizeof(b1) / sizeof(float) );
diff --git a/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx
index b862f62..854c390 100644
--- a/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx
@@ -37,7 +37,7 @@ bool
 Spot6ImageMetadataInterface::CanRead() const
 {
   std::string sensorID = GetSensorID();
-  if (sensorID.find("SPOT 6") != std::string::npos)
+  if (sensorID.find("SPOT 6") != std::string::npos || sensorID.find("SPOT 7") != std::string::npos)
     return true;
   else
     return false;
@@ -127,12 +127,12 @@ Spot6ImageMetadataInterface::GetSolarIrradiance() const
 
   if (outputValues.size() > 0)
     {
-           for (unsigned int i = 0; i < outputValues.size(); ++i)
-              outputValuesVariableLengthVector[i] = outputValues[this->BandIndexToWavelengthPosition(i)];
+    for (unsigned int i = 0; i < outputValues.size(); ++i)
+      outputValuesVariableLengthVector[i] = outputValues[this->BandIndexToWavelengthPosition(i)];
     }
   else
     {
-           itkExceptionMacro("Invalid Physical Irradiance");
+    itkExceptionMacro("Invalid Physical Irradiance");
     }
 
   return outputValuesVariableLengthVector;
@@ -476,12 +476,12 @@ Spot6ImageMetadataInterface
 
   if (outputValues.size() > 0)
     {
-           for (unsigned int i = 0; i < outputValues.size(); ++i)
-              outputValuesVariableLengthVector[i] = outputValues[this->BandIndexToWavelengthPosition(i)];
+    for (unsigned int i = 0; i < outputValues.size(); ++i)
+      outputValuesVariableLengthVector[i] = outputValues[this->BandIndexToWavelengthPosition(i)];
     }
   else
     {
-           itkExceptionMacro("Invalid Physical Bias");
+    itkExceptionMacro("Invalid Physical Bias");
     }
 
   return outputValuesVariableLengthVector;
@@ -523,12 +523,12 @@ Spot6ImageMetadataInterface
 
   if (outputValues.size() > 0)
     {
-           for (unsigned int i = 0; i < outputValues.size(); ++i)
-              outputValuesVariableLengthVector[i] = outputValues[this->BandIndexToWavelengthPosition(i)];
+    for (unsigned int i = 0; i < outputValues.size(); ++i)
+      outputValuesVariableLengthVector[i] = outputValues[this->BandIndexToWavelengthPosition(i)];
     }
   else
     {
-           itkExceptionMacro("Invalid Physical Bias");
+    itkExceptionMacro("Invalid Physical Bias");
     }
 
   return outputValuesVariableLengthVector;
@@ -559,6 +559,11 @@ Spot6ImageMetadataInterface::GetSatElevation() const
   // MSD: for the moment take only topCenter value
   std::string valueString = imageKeywordlist.GetMetadataByKey("support_data.incident_angle");
   double value = atof(valueString.c_str());
+
+  // Elevation is measured from ground, incidence from zenith
+  // Elevation angle = 90° - Incidence angle
+  value = 90. - value;
+
   return value;
 }
 
@@ -617,18 +622,15 @@ Spot6ImageMetadataInterface
   if (nbBands == 1)
     {
     wavel.SetSize(1);
-    wavel.Fill(0.455); // todo
     }
-  else if (nbBands > 1 && nbBands < 5) // todo
+  else if (nbBands > 1 && nbBands < 5)
     {
     wavel.SetSize(4);
-    wavel[0] = 0.454;
-    wavel[1] = 0.527;
-    wavel[2] = 0.624;
-    wavel[3] = 0.756;
     }
   else itkExceptionMacro(<< "Invalid number of bands...");
 
+  wavel.Fill(0.4);
+
   return wavel;
 }
 
@@ -646,7 +648,7 @@ Spot6ImageMetadataInterface
 
   if (dict.HasKey(MetaDataKey::OSSIMKeywordlistKey))
     {
-           itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, imageKeywordlist);
+    itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, imageKeywordlist);
     }
 
   VariableLengthVectorType wavel(1);
@@ -655,21 +657,18 @@ Spot6ImageMetadataInterface
   int nbBands = this->GetNumberOfBands();
 
   // Panchromatic case
-  if (nbBands == 1) // todo
+  if (nbBands == 1)
     {
     wavel.SetSize(1);
-    wavel.Fill(0.744);
     }
-  else if (nbBands > 1 && nbBands < 5) // todo
+  else if (nbBands > 1 && nbBands < 5)
     {
     wavel.SetSize(4);
-    wavel[0] = 0.519;
-    wavel[1] = 0.587;
-    wavel[2] = 0.694;
-    wavel[3] = 0.880;
     }
   else itkExceptionMacro(<< "Invalid number of bands...");
 
+  wavel.Fill(1.0);
+
   return wavel;
 }
 
@@ -789,3078 +788,4338 @@ Spot6ImageMetadataInterface
   if (nbBands == 1)
     {
     //if (sensorId.find("PHR") != std::string::npos)
-    if (sensorId == "SPOT 6") // todo
+    if (sensorId == "SPOT 6") // todo: updated values for Spot7
       {
       const float pan[601] =
         {
-0.00007493,
-0.00008750,
-0.00009848,
-0.00010843,
-0.00011646,
-0.00012259,
-0.00012552,
-0.00012814,
-0.00013531,
-0.00015014,
-0.00017236,
-0.00019564,
-0.00021235,
-0.00022348,
-0.00022676,
-0.00022299,
-0.00021213,
-0.00020083,
-0.00019926,
-0.00021359,
-0.00025083,
-0.00030983,
-0.00038670,
-0.00047229,
-0.00056950,
-0.00067560,
-0.00078669,
-0.00090069,
-0.00103421,
-0.00131540,
-0.00169029,
-0.00228198,
-0.00312648,
-0.00417071,
-0.00533582,
-0.00661006,
-0.00802817,
-0.00960467,
-0.01132980,
-0.01334611,
-0.01609231,
-0.02038299,
-0.02732543,
-0.03802347,
-0.05294767,
-0.07167096,
-0.09348728,
-0.11872659,
-0.14830802,
-0.18269957,
-0.22269040,
-0.26906796,
-0.32263521,
-0.38325366,
-0.44824011,
-0.51559417,
-0.58258589,
-0.64645021,
-0.70236661,
-0.74583583,
-0.77585237,
-0.79433792,
-0.80499388,
-0.81090952,
-0.81371638,
-0.81431418,
-0.81316313,
-0.81141755,
-0.81097193,
-0.81322836,
-0.81878063,
-0.82800769,
-0.83916423,
-0.85084085,
-0.86161004,
-0.87040692,
-0.87637562,
-0.87967534,
-0.88047879,
-0.88112137,
-0.88175192,
-0.88365397,
-0.88759508,
-0.89291809,
-0.89912245,
-0.90543957,
-0.91146456,
-0.91547923,
-0.91843965,
-0.91963891,
-0.91975983,
-0.91963913,
-0.91947516,
-0.92025788,
-0.92260193,
-0.92575482,
-0.93070662,
-0.93550391,
-0.94001389,
-0.94383039,
-0.94609629,
-0.94688618,
-0.94624211,
-0.94455744,
-0.94265988,
-0.94120799,
-0.94079078,
-0.94176327,
-0.94473408,
-0.94915584,
-0.95419339,
-0.95954236,
-0.96459688,
-0.96902841,
-0.97179112,
-0.97317857,
-0.97320070,
-0.97218736,
-0.97091309,
-0.97035732,
-0.96996616,
-0.97140258,
-0.97376942,
-0.97636229,
-0.97957895,
-0.98311659,
-0.98550114,
-0.98688700,
-0.98705275,
-0.98569258,
-0.98301588,
-0.97915984,
-0.97493690,
-0.97129138,
-0.96813872,
-0.96649466,
-0.96685400,
-0.96849224,
-0.97201807,
-0.97702694,
-0.98197923,
-0.98753229,
-0.99230951,
-0.99540351,
-0.99740084,
-0.99730413,
-0.99558763,
-0.99262103,
-0.98803927,
-0.98368879,
-0.97966358,
-0.97601679,
-0.97409076,
-0.97356455,
-0.97460306,
-0.97733165,
-0.98142794,
-0.98607299,
-0.99104944,
-0.99556304,
-0.99892911,
-1.00128281,
-1.00206838,
-1.00124192,
-0.99879621,
-0.99466280,
-0.99032401,
-0.98568114,
-0.98102690,
-0.97756954,
-0.97495949,
-0.97366152,
-0.97436348,
-0.97596613,
-0.97930722,
-0.98307748,
-0.98726114,
-0.99154671,
-0.99533904,
-0.99803299,
-0.99950550,
-1.00000000,
-0.99848218,
-0.99593416,
-0.99288307,
-0.98834389,
-0.98366197,
-0.97971238,
-0.97601117,
-0.97307044,
-0.97155305,
-0.97102663,
-0.97152475,
-0.97341779,
-0.97585074,
-0.97896590,
-0.98255796,
-0.98543794,
-0.98789503,
-0.98994151,
-0.99059899,
-0.99029895,
-0.98922305,
-0.98676544,
-0.98389430,
-0.98067297,
-0.97675508,
-0.97324400,
-0.97055473,
-0.96803100,
-0.96629732,
-0.96561899,
-0.96564173,
-0.96639591,
-0.96771777,
-0.96934976,
-0.97124886,
-0.97291816,
-0.97432735,
-0.97530655,
-0.97542227,
-0.97463623,
-0.97308990,
-0.97065297,
-0.96750332,
-0.96379792,
-0.95963369,
-0.95522586,
-0.95099476,
-0.94711647,
-0.94373897,
-0.94086191,
-0.93909609,
-0.93751312,
-0.93716161,
-0.93749275,
-0.93844552,
-0.93992284,
-0.94157292,
-0.94327292,
-0.94494878,
-0.94621266,
-0.94689150,
-0.94695971,
-0.94601526,
-0.94485162,
-0.94216490,
-0.93936780,
-0.93516770,
-0.93117984,
-0.92600825,
-0.92184558,
-0.91679022,
-0.91281220,
-0.90873714,
-0.90559995,
-0.90280144,
-0.90151379,
-0.90018969,
-0.90026306,
-0.90055224,
-0.90169504,
-0.90303974,
-0.90479165,
-0.90660298,
-0.90788333,
-0.90928294,
-0.90961910,
-0.91044105,
-0.90941307,
-0.90884628,
-0.90648792,
-0.90426184,
-0.90090015,
-0.89728707,
-0.89360311,
-0.88921759,
-0.88536863,
-0.88109823,
-0.87784434,
-0.87367129,
-0.87100044,
-0.86849439,
-0.86645265,
-0.86555715,
-0.86486409,
-0.86444275,
-0.86462554,
-0.86421244,
-0.86509991,
-0.86504142,
-0.86574075,
-0.86547448,
-0.86537728,
-0.86481040,
-0.86329140,
-0.86242059,
-0.85986818,
-0.85807444,
-0.85502168,
-0.85224705,
-0.84852762,
-0.84517422,
-0.84157685,
-0.83807810,
-0.83443274,
-0.83120263,
-0.82819085,
-0.82520041,
-0.82259510,
-0.82050631,
-0.81863236,
-0.81673157,
-0.81518962,
-0.81376687,
-0.81276571,
-0.81111987,
-0.81039972,
-0.80884166,
-0.80742716,
-0.80605476,
-0.80328088,
-0.80094601,
-0.79797843,
-0.79448406,
-0.79079478,
-0.78664955,
-0.78403080,
-0.77837404,
-0.77671056,
-0.77071265,
-0.76860809,
-0.76568459,
-0.76096821,
-0.75943556,
-0.75440145,
-0.74853854,
-0.73756232,
-0.72050194,
-0.69619742,
-0.66466129,
-0.62570237,
-0.58042003,
-0.52946690,
-0.47429123,
-0.41572304,
-0.35577781,
-0.29694274,
-0.24182875,
-0.19245049,
-0.15026362,
-0.11482153,
-0.08854978,
-0.06698482,
-0.05109390,
-0.03916000,
-0.03018623,
-0.02342899,
-0.01832614,
-0.01444326,
-0.01147024,
-0.00918513,
-0.00740254,
-0.00609562,
-0.00491959,
-0.00435297,
-0.00335678,
-0.00291823,
-0.00234224,
-0.00205113,
-0.00167084,
-0.00145104,
-0.00124552,
-0.00104170,
-0.00108470,
-0.00077931,
-0.00084497,
-0.00059188,
-0.00063835,
-0.00045747,
-0.00040248,
-0.00043271,
-0.00031792,
-0.00033871,
-0.00025452,
-0.00026931,
-0.00020572,
-0.00018559,
-0.00019577,
-0.00015320,
-0.00016086,
-0.00012704,
-0.00011590,
-0.00012165,
-0.00009829,
-0.00010178,
-0.00008372,
-0.00007722,
-0.00008098,
-0.00007448,
-0.00006262,
-0.00006513,
-0.00005514,
-0.00005663,
-0.00004857,
-0.00004996,
-0.00004369,
-0.00004402,
-0.00003879,
-0.00003626,
-0.00003796,
-0.00003303,
-0.00003435,
-0.00003053,
-0.00003118,
-0.00002826,
-0.00002628,
-0.00002754,
-0.00002484,
-0.00002559,
-0.00002406,
-0.00002348,
-0.00002237,
-0.00002233,
-0.00002269,
-0.00002170,
-0.00001996,
-0.00002062,
-0.00001880,
-0.00002003,
-0.00001893,
-0.00001935,
-0.00001823,
-0.00001794,
-0.00001879,
-0.00001726,
-0.00001797,
-0.00001774,
-0.00001520,
-0.00001784,
-0.00001500,
-0.00001790,
-0.00001464,
-0.00001317,
-0.00001633,
-0.00001127,
-0.00001471,
-0.00001314,
-0.00001114,
-0.00000968,
-0.00001262,
-0.00001126,
-0.00002112,
-0.00001135,
-0.00001674,
-0.00001146,
-0.00001572,
-0.00002157,
-0.00001166,
-0.00002111,
-0.00001206,
-0.00002362,
-0.00002815,
-0.00001740,
-0.00001816,
-0.00002519,
-0.00001627,
-0.00002405,
-0.00002027,
-0.00002469,
-0.00002124,
-0.00001758,
-0.00002971,
-0.00002051,
-0.00002437,
-0.00002119,
-0.00001926,
-0.00001850,
-0.00001774,
-0.00002056,
-0.00002202,
-0.00001602,
-0.00001436,
-0.00001710,
-0.00001369,
-0.00001827,
-0.00001218,
-0.00001567,
-0.00001596,
-0.00001348,
-0.00001857,
-0.00001662,
-0.00001805,
-0.00002361,
-0.00001927,
-0.00003019,
-0.00003036,
-0.00003602,
-0.00003469,
-0.00004530,
-0.00004918,
-0.00005892,
-0.00005708,
-0.00006488,
-0.00006319,
-0.00007284,
-0.00006971,
-0.00007822,
-0.00007143,
-0.00007223,
-0.00007024,
-0.00007097,
-0.00007120,
-0.00006619,
-0.00006294,
-0.00005778,
-0.00005333,
-0.00005405,
-0.00004915,
-0.00004779,
-0.00004379,
-0.00004087,
-0.00003311,
-0.00003608,
-0.00003592,
-0.00002213,
-0.00002159,
-0.00002350,
-0.00001705,
-0.00002055,
-0.00001764,
-0.00001453,
-0.00001636,
-0.00001197,
-0.00001123,
-0.00001127,
-0.00001042,
-0.00001021,
-0.00001099,
-0.00001171,
-0.00001030,
-0.00001236,
-0.00001192,
-0.00000823,
-0.00000820,
-0.00000893,
-0.00001115,
-0.00001001,
-0.00000802,
-0.00000976,
-0.00000966,
-0.00000957,
-0.00000726,
-0.00000967,
-0.00001001,
-0.00000803,
-0.00000726,
-0.00000739,
-0.00000845,
-0.00000698,
-0.00000568,
-0.00000472,
-0.00000650,
-0.00000706,
-0.00000546,
-0.00000433,
-0.00000607,
-0.00000408,
-0.00000788,
-0.00000464,
-0.00000958,
-0.00000689,
-0.00000976,
-0.00000672,
-0.00000574,
-0.00000980,
-0.00000503,
-0.00000796,
-0.00000325,
-0.00000636,
-0.00000334,
-0.00000562,
-0.00000413,
-0.00000400,
-0.00000610,
-0.00000240,
-0.00000486,
-0.00000262,
-0.00000333,
-0.00000152,
-0.00000236,
-0.00000152,
-0.00000228,
-0.00000070,
-0.00000185,
-0.00000162,
-0.00000093,
-0.00000188,
-0.00000116,
-0.00000041,
-0.00000126
+          0.00007493f,
+          0.00008750f,
+          0.00009848f,
+          0.00010843f,
+          0.00011646f,
+          0.00012259f,
+          0.00012552f,
+          0.00012814f,
+          0.00013531f,
+          0.00015014f,
+          0.00017236f,
+          0.00019564f,
+          0.00021235f,
+          0.00022348f,
+          0.00022676f,
+          0.00022299f,
+          0.00021213f,
+          0.00020083f,
+          0.00019926f,
+          0.00021359f,
+          0.00025083f,
+          0.00030983f,
+          0.00038670f,
+          0.00047229f,
+          0.00056950f,
+          0.00067560f,
+          0.00078669f,
+          0.00090069f,
+          0.00103421f,
+          0.00131540f,
+          0.00169029f,
+          0.00228198f,
+          0.00312648f,
+          0.00417071f,
+          0.00533582f,
+          0.00661006f,
+          0.00802817f,
+          0.00960467f,
+          0.01132980f,
+          0.01334611f,
+          0.01609231f,
+          0.02038299f,
+          0.02732543f,
+          0.03802347f,
+          0.05294767f,
+          0.07167096f,
+          0.09348728f,
+          0.11872659f,
+          0.14830802f,
+          0.18269957f,
+          0.22269040f,
+          0.26906796f,
+          0.32263521f,
+          0.38325366f,
+          0.44824011f,
+          0.51559417f,
+          0.58258589f,
+          0.64645021f,
+          0.70236661f,
+          0.74583583f,
+          0.77585237f,
+          0.79433792f,
+          0.80499388f,
+          0.81090952f,
+          0.81371638f,
+          0.81431418f,
+          0.81316313f,
+          0.81141755f,
+          0.81097193f,
+          0.81322836f,
+          0.81878063f,
+          0.82800769f,
+          0.83916423f,
+          0.85084085f,
+          0.86161004f,
+          0.87040692f,
+          0.87637562f,
+          0.87967534f,
+          0.88047879f,
+          0.88112137f,
+          0.88175192f,
+          0.88365397f,
+          0.88759508f,
+          0.89291809f,
+          0.89912245f,
+          0.90543957f,
+          0.91146456f,
+          0.91547923f,
+          0.91843965f,
+          0.91963891f,
+          0.91975983f,
+          0.91963913f,
+          0.91947516f,
+          0.92025788f,
+          0.92260193f,
+          0.92575482f,
+          0.93070662f,
+          0.93550391f,
+          0.94001389f,
+          0.94383039f,
+          0.94609629f,
+          0.94688618f,
+          0.94624211f,
+          0.94455744f,
+          0.94265988f,
+          0.94120799f,
+          0.94079078f,
+          0.94176327f,
+          0.94473408f,
+          0.94915584f,
+          0.95419339f,
+          0.95954236f,
+          0.96459688f,
+          0.96902841f,
+          0.97179112f,
+          0.97317857f,
+          0.97320070f,
+          0.97218736f,
+          0.97091309f,
+          0.97035732f,
+          0.96996616f,
+          0.97140258f,
+          0.97376942f,
+          0.97636229f,
+          0.97957895f,
+          0.98311659f,
+          0.98550114f,
+          0.98688700f,
+          0.98705275f,
+          0.98569258f,
+          0.98301588f,
+          0.97915984f,
+          0.97493690f,
+          0.97129138f,
+          0.96813872f,
+          0.96649466f,
+          0.96685400f,
+          0.96849224f,
+          0.97201807f,
+          0.97702694f,
+          0.98197923f,
+          0.98753229f,
+          0.99230951f,
+          0.99540351f,
+          0.99740084f,
+          0.99730413f,
+          0.99558763f,
+          0.99262103f,
+          0.98803927f,
+          0.98368879f,
+          0.97966358f,
+          0.97601679f,
+          0.97409076f,
+          0.97356455f,
+          0.97460306f,
+          0.97733165f,
+          0.98142794f,
+          0.98607299f,
+          0.99104944f,
+          0.99556304f,
+          0.99892911f,
+          1.00128281f,
+          1.00206838f,
+          1.00124192f,
+          0.99879621f,
+          0.99466280f,
+          0.99032401f,
+          0.98568114f,
+          0.98102690f,
+          0.97756954f,
+          0.97495949f,
+          0.97366152f,
+          0.97436348f,
+          0.97596613f,
+          0.97930722f,
+          0.98307748f,
+          0.98726114f,
+          0.99154671f,
+          0.99533904f,
+          0.99803299f,
+          0.99950550f,
+          1.00000000f,
+          0.99848218f,
+          0.99593416f,
+          0.99288307f,
+          0.98834389f,
+          0.98366197f,
+          0.97971238f,
+          0.97601117f,
+          0.97307044f,
+          0.97155305f,
+          0.97102663f,
+          0.97152475f,
+          0.97341779f,
+          0.97585074f,
+          0.97896590f,
+          0.98255796f,
+          0.98543794f,
+          0.98789503f,
+          0.98994151f,
+          0.99059899f,
+          0.99029895f,
+          0.98922305f,
+          0.98676544f,
+          0.98389430f,
+          0.98067297f,
+          0.97675508f,
+          0.97324400f,
+          0.97055473f,
+          0.96803100f,
+          0.96629732f,
+          0.96561899f,
+          0.96564173f,
+          0.96639591f,
+          0.96771777f,
+          0.96934976f,
+          0.97124886f,
+          0.97291816f,
+          0.97432735f,
+          0.97530655f,
+          0.97542227f,
+          0.97463623f,
+          0.97308990f,
+          0.97065297f,
+          0.96750332f,
+          0.96379792f,
+          0.95963369f,
+          0.95522586f,
+          0.95099476f,
+          0.94711647f,
+          0.94373897f,
+          0.94086191f,
+          0.93909609f,
+          0.93751312f,
+          0.93716161f,
+          0.93749275f,
+          0.93844552f,
+          0.93992284f,
+          0.94157292f,
+          0.94327292f,
+          0.94494878f,
+          0.94621266f,
+          0.94689150f,
+          0.94695971f,
+          0.94601526f,
+          0.94485162f,
+          0.94216490f,
+          0.93936780f,
+          0.93516770f,
+          0.93117984f,
+          0.92600825f,
+          0.92184558f,
+          0.91679022f,
+          0.91281220f,
+          0.90873714f,
+          0.90559995f,
+          0.90280144f,
+          0.90151379f,
+          0.90018969f,
+          0.90026306f,
+          0.90055224f,
+          0.90169504f,
+          0.90303974f,
+          0.90479165f,
+          0.90660298f,
+          0.90788333f,
+          0.90928294f,
+          0.90961910f,
+          0.91044105f,
+          0.90941307f,
+          0.90884628f,
+          0.90648792f,
+          0.90426184f,
+          0.90090015f,
+          0.89728707f,
+          0.89360311f,
+          0.88921759f,
+          0.88536863f,
+          0.88109823f,
+          0.87784434f,
+          0.87367129f,
+          0.87100044f,
+          0.86849439f,
+          0.86645265f,
+          0.86555715f,
+          0.86486409f,
+          0.86444275f,
+          0.86462554f,
+          0.86421244f,
+          0.86509991f,
+          0.86504142f,
+          0.86574075f,
+          0.86547448f,
+          0.86537728f,
+          0.86481040f,
+          0.86329140f,
+          0.86242059f,
+          0.85986818f,
+          0.85807444f,
+          0.85502168f,
+          0.85224705f,
+          0.84852762f,
+          0.84517422f,
+          0.84157685f,
+          0.83807810f,
+          0.83443274f,
+          0.83120263f,
+          0.82819085f,
+          0.82520041f,
+          0.82259510f,
+          0.82050631f,
+          0.81863236f,
+          0.81673157f,
+          0.81518962f,
+          0.81376687f,
+          0.81276571f,
+          0.81111987f,
+          0.81039972f,
+          0.80884166f,
+          0.80742716f,
+          0.80605476f,
+          0.80328088f,
+          0.80094601f,
+          0.79797843f,
+          0.79448406f,
+          0.79079478f,
+          0.78664955f,
+          0.78403080f,
+          0.77837404f,
+          0.77671056f,
+          0.77071265f,
+          0.76860809f,
+          0.76568459f,
+          0.76096821f,
+          0.75943556f,
+          0.75440145f,
+          0.74853854f,
+          0.73756232f,
+          0.72050194f,
+          0.69619742f,
+          0.66466129f,
+          0.62570237f,
+          0.58042003f,
+          0.52946690f,
+          0.47429123f,
+          0.41572304f,
+          0.35577781f,
+          0.29694274f,
+          0.24182875f,
+          0.19245049f,
+          0.15026362f,
+          0.11482153f,
+          0.08854978f,
+          0.06698482f,
+          0.05109390f,
+          0.03916000f,
+          0.03018623f,
+          0.02342899f,
+          0.01832614f,
+          0.01444326f,
+          0.01147024f,
+          0.00918513f,
+          0.00740254f,
+          0.00609562f,
+          0.00491959f,
+          0.00435297f,
+          0.00335678f,
+          0.00291823f,
+          0.00234224f,
+          0.00205113f,
+          0.00167084f,
+          0.00145104f,
+          0.00124552f,
+          0.00104170f,
+          0.00108470f,
+          0.00077931f,
+          0.00084497f,
+          0.00059188f,
+          0.00063835f,
+          0.00045747f,
+          0.00040248f,
+          0.00043271f,
+          0.00031792f,
+          0.00033871f,
+          0.00025452f,
+          0.00026931f,
+          0.00020572f,
+          0.00018559f,
+          0.00019577f,
+          0.00015320f,
+          0.00016086f,
+          0.00012704f,
+          0.00011590f,
+          0.00012165f,
+          0.00009829f,
+          0.00010178f,
+          0.00008372f,
+          0.00007722f,
+          0.00008098f,
+          0.00007448f,
+          0.00006262f,
+          0.00006513f,
+          0.00005514f,
+          0.00005663f,
+          0.00004857f,
+          0.00004996f,
+          0.00004369f,
+          0.00004402f,
+          0.00003879f,
+          0.00003626f,
+          0.00003796f,
+          0.00003303f,
+          0.00003435f,
+          0.00003053f,
+          0.00003118f,
+          0.00002826f,
+          0.00002628f,
+          0.00002754f,
+          0.00002484f,
+          0.00002559f,
+          0.00002406f,
+          0.00002348f,
+          0.00002237f,
+          0.00002233f,
+          0.00002269f,
+          0.00002170f,
+          0.00001996f,
+          0.00002062f,
+          0.00001880f,
+          0.00002003f,
+          0.00001893f,
+          0.00001935f,
+          0.00001823f,
+          0.00001794f,
+          0.00001879f,
+          0.00001726f,
+          0.00001797f,
+          0.00001774f,
+          0.00001520f,
+          0.00001784f,
+          0.00001500f,
+          0.00001790f,
+          0.00001464f,
+          0.00001317f,
+          0.00001633f,
+          0.00001127f,
+          0.00001471f,
+          0.00001314f,
+          0.00001114f,
+          0.00000968f,
+          0.00001262f,
+          0.00001126f,
+          0.00002112f,
+          0.00001135f,
+          0.00001674f,
+          0.00001146f,
+          0.00001572f,
+          0.00002157f,
+          0.00001166f,
+          0.00002111f,
+          0.00001206f,
+          0.00002362f,
+          0.00002815f,
+          0.00001740f,
+          0.00001816f,
+          0.00002519f,
+          0.00001627f,
+          0.00002405f,
+          0.00002027f,
+          0.00002469f,
+          0.00002124f,
+          0.00001758f,
+          0.00002971f,
+          0.00002051f,
+          0.00002437f,
+          0.00002119f,
+          0.00001926f,
+          0.00001850f,
+          0.00001774f,
+          0.00002056f,
+          0.00002202f,
+          0.00001602f,
+          0.00001436f,
+          0.00001710f,
+          0.00001369f,
+          0.00001827f,
+          0.00001218f,
+          0.00001567f,
+          0.00001596f,
+          0.00001348f,
+          0.00001857f,
+          0.00001662f,
+          0.00001805f,
+          0.00002361f,
+          0.00001927f,
+          0.00003019f,
+          0.00003036f,
+          0.00003602f,
+          0.00003469f,
+          0.00004530f,
+          0.00004918f,
+          0.00005892f,
+          0.00005708f,
+          0.00006488f,
+          0.00006319f,
+          0.00007284f,
+          0.00006971f,
+          0.00007822f,
+          0.00007143f,
+          0.00007223f,
+          0.00007024f,
+          0.00007097f,
+          0.00007120f,
+          0.00006619f,
+          0.00006294f,
+          0.00005778f,
+          0.00005333f,
+          0.00005405f,
+          0.00004915f,
+          0.00004779f,
+          0.00004379f,
+          0.00004087f,
+          0.00003311f,
+          0.00003608f,
+          0.00003592f,
+          0.00002213f,
+          0.00002159f,
+          0.00002350f,
+          0.00001705f,
+          0.00002055f,
+          0.00001764f,
+          0.00001453f,
+          0.00001636f,
+          0.00001197f,
+          0.00001123f,
+          0.00001127f,
+          0.00001042f,
+          0.00001021f,
+          0.00001099f,
+          0.00001171f,
+          0.00001030f,
+          0.00001236f,
+          0.00001192f,
+          0.00000823f,
+          0.00000820f,
+          0.00000893f,
+          0.00001115f,
+          0.00001001f,
+          0.00000802f,
+          0.00000976f,
+          0.00000966f,
+          0.00000957f,
+          0.00000726f,
+          0.00000967f,
+          0.00001001f,
+          0.00000803f,
+          0.00000726f,
+          0.00000739f,
+          0.00000845f,
+          0.00000698f,
+          0.00000568f,
+          0.00000472f,
+          0.00000650f,
+          0.00000706f,
+          0.00000546f,
+          0.00000433f,
+          0.00000607f,
+          0.00000408f,
+          0.00000788f,
+          0.00000464f,
+          0.00000958f,
+          0.00000689f,
+          0.00000976f,
+          0.00000672f,
+          0.00000574f,
+          0.00000980f,
+          0.00000503f,
+          0.00000796f,
+          0.00000325f,
+          0.00000636f,
+          0.00000334f,
+          0.00000562f,
+          0.00000413f,
+          0.00000400f,
+          0.00000610f,
+          0.00000240f,
+          0.00000486f,
+          0.00000262f,
+          0.00000333f,
+          0.00000152f,
+          0.00000236f,
+          0.00000152f,
+          0.00000228f,
+          0.00000070f,
+          0.00000185f,
+          0.00000162f,
+          0.00000093f,
+          0.00000188f,
+          0.00000116f,
+          0.00000041f,
+          0.00000126f
         };
       //add panchromatic band to the temporary list
       const std::vector<float> vpan (pan, pan + sizeof(pan) / sizeof(float) );
       tmpSpectralBandList.push_back(vpan);
       }
-    else
-      {
-      itkExceptionMacro(<< "Invalid Spot6 Sensor ID");
-      }
-    }
-  else if (nbBands > 1 && nbBands < 5)
-    {
-    if (sensorId == "SPOT 6") // todo
+    else if (sensorId == "SPOT 7")
       {
-      //band B0 (blue band)
-      const float b0[601] =
+      const float pan[241] =
         {
-0.00006627,
-0.00006114,
-0.00005964,
-0.00006755,
-0.00007354,
-0.00007335,
-0.00007303,
-0.00006988,
-0.00006669,
-0.00006467,
-0.00008891,
-0.00010731,
-0.00006420,
-0.00008781,
-0.00008978,
-0.00008292,
-0.00008193,
-0.00005499,
-0.00008203,
-0.00011262,
-0.00009092,
-0.00010575,
-0.00013926,
-0.00016613,
-0.00019666,
-0.00019375,
-0.00021841,
-0.00033008,
-0.00059283,
-0.00096710,
-0.00120426,
-0.00143132,
-0.00190776,
-0.00246548,
-0.00314995,
-0.00393858,
-0.00502501,
-0.00693758,
-0.00995331,
-0.01395395,
-0.01816332,
-0.02248784,
-0.02806060,
-0.03582005,
-0.04774668,
-0.06795621,
-0.09842750,
-0.13108997,
-0.16221496,
-0.20486488,
-0.26488470,
-0.33784410,
-0.41558626,
-0.48567541,
-0.54882896,
-0.61466150,
-0.68475833,
-0.75228611,
-0.80736646,
-0.84246227,
-0.85754473,
-0.85841741,
-0.85407547,
-0.85129313,
-0.85144931,
-0.85321674,
-0.85405128,
-0.85387063,
-0.85555834,
-0.86252514,
-0.87558536,
-0.89251130,
-0.90900546,
-0.92154349,
-0.92918777,
-0.93306769,
-0.93515923,
-0.93666027,
-0.93739349,
-0.93661481,
-0.93379608,
-0.92929650,
-0.92442581,
-0.92058032,
-0.91895381,
-0.92090421,
-0.92631122,
-0.93455782,
-0.94463030,
-0.95473194,
-0.96364502,
-0.97043568,
-0.97436437,
-0.97495098,
-0.97200508,
-0.96636029,
-0.95962307,
-0.95371958,
-0.95061152,
-0.95192705,
-0.95818895,
-0.96856416,
-0.98070274,
-0.99142860,
-0.99788650,
-1.00000000,
-0.99910819,
-0.99808156,
-0.99650360,
-0.99314712,
-0.98404465,
-0.96550845,
-0.93867401,
-0.90804427,
-0.87480177,
-0.83387151,
-0.77606904,
-0.69859059,
-0.60871934,
-0.51759429,
-0.43125686,
-0.34977809,
-0.27392459,
-0.20473488,
-0.14738691,
-0.10459452,
-0.07555179,
-0.05654570,
-0.04380857,
-0.03477386,
-0.02793581,
-0.02225302,
-0.01751704,
-0.01359022,
-0.01046026,
-0.00814691,
-0.00649078,
-0.00530930,
-0.00446096,
-0.00383097,
-0.00333164,
-0.00292664,
-0.00257637,
-0.00225949,
-0.00198202,
-0.00172287,
-0.00150439,
-0.00130359,
-0.00113903,
-0.00099076,
-0.00086925,
-0.00076142,
-0.00067853,
-0.00060841,
-0.00055953,
-0.00051880,
-0.00049699,
-0.00047445,
-0.00045863,
-0.00044229,
-0.00042470,
-0.00040647,
-0.00038780,
-0.00035963,
-0.00033330,
-0.00029660,
-0.00027179,
-0.00024451,
-0.00022875,
-0.00021524,
-0.00021255,
-0.00021004,
-0.00021079,
-0.00021138,
-0.00021521,
-0.00021336,
-0.00021459,
-0.00020993,
-0.00020747,
-0.00019888,
-0.00019065,
-0.00018249,
-0.00017164,
-0.00016473,
-0.00015826,
-0.00015437,
-0.00015378,
-0.00015002,
-0.00015089,
-0.00015050,
-0.00015245,
-0.00015136,
-0.00015264,
-0.00015147,
-0.00015009,
-0.00014792,
-0.00014493,
-0.00014083,
-0.00013665,
-0.00013056,
-0.00012700,
-0.00012212,
-0.00011620,
-0.00011384,
-0.00010918,
-0.00010782,
-0.00010377,
-0.00010231,
-0.00010126,
-0.00010021,
-0.00009925,
-0.00009923,
-0.00009906,
-0.00009850,
-0.00009892,
-0.00009742,
-0.00009802,
-0.00009809,
-0.00009662,
-0.00009692,
-0.00009575,
-0.00009546,
-0.00009575,
-0.00009469,
-0.00009485,
-0.00009453,
-0.00009384,
-0.00009463,
-0.00009451,
-0.00009458,
-0.00009520,
-0.00009478,
-0.00009588,
-0.00009579,
-0.00009545,
-0.00009560,
-0.00009549,
-0.00009549,
-0.00009551,
-0.00009535,
-0.00009579,
-0.00009570,
-0.00009544,
-0.00009552,
-0.00009622,
-0.00009645,
-0.00009648,
-0.00009799,
-0.00009797,
-0.00009864,
-0.00009916,
-0.00010183,
-0.00010153,
-0.00010358,
-0.00010461,
-0.00010712,
-0.00010718,
-0.00011085,
-0.00011321,
-0.00011173,
-0.00011398,
-0.00011982,
-0.00011831,
-0.00012135,
-0.00012902,
-0.00012720,
-0.00013658,
-0.00013538,
-0.00014397,
-0.00014356,
-0.00015119,
-0.00015202,
-0.00015693,
-0.00015686,
-0.00015130,
-0.00015184,
-0.00013690,
-0.00013092,
-0.00013335,
-0.00011361,
-0.00010715,
-0.00010823,
-0.00009932,
-0.00009856,
-0.00009765,
-0.00009914,
-0.00010008,
-0.00010777,
-0.00010686,
-0.00011218,
-0.00012769,
-0.00012456,
-0.00014074,
-0.00014680,
-0.00014400,
-0.00015360,
-0.00015552,
-0.00015166,
-0.00015221,
-0.00014625,
-0.00014561,
-0.00013613,
-0.00013172,
-0.00013242,
-0.00012141,
-0.00012300,
-0.00011836,
-0.00010821,
-0.00010974,
-0.00010309,
-0.00010302,
-0.00010127,
-0.00009629,
-0.00009854,
-0.00009280,
-0.00009475,
-0.00009054,
-0.00009196,
-0.00008822,
-0.00008866,
-0.00008744,
-0.00008550,
-0.00008673,
-0.00008483,
-0.00008628,
-0.00008449,
-0.00009254,
-0.00008532,
-0.00009594,
-0.00008917,
-0.00009084,
-0.00010183,
-0.00009128,
-0.00010000,
-0.00008800,
-0.00009430,
-0.00008055,
-0.00008475,
-0.00007796,
-0.00007850,
-0.00007713,
-0.00007770,
-0.00007623,
-0.00007664,
-0.00007474,
-0.00007405,
-0.00007519,
-0.00007318,
-0.00007349,
-0.00007204,
-0.00007375,
-0.00007369,
-0.00007149,
-0.00007148,
-0.00007312,
-0.00007167,
-0.00007255,
-0.00007120,
-0.00007186,
-0.00007087,
-0.00007145,
-0.00007024,
-0.00007096,
-0.00007041,
-0.00007088,
-0.00006995,
-0.00007149,
-0.00006924,
-0.00007103,
-0.00006949,
-0.00007093,
-0.00006951,
-0.00007194,
-0.00007193,
-0.00006859,
-0.00006781,
-0.00007056,
-0.00006741,
-0.00006870,
-0.00006628,
-0.00006687,
-0.00006601,
-0.00006595,
-0.00006670,
-0.00006450,
-0.00006595,
-0.00006433,
-0.00006569,
-0.00006431,
-0.00006573,
-0.00006406,
-0.00006507,
-0.00006298,
-0.00006428,
-0.00006201,
-0.00006357,
-0.00006101,
-0.00006096,
-0.00006309,
-0.00006103,
-0.00006314,
-0.00006382,
-0.00006164,
-0.00006245,
-0.00006061,
-0.00005973,
-0.00006261,
-0.00005982,
-0.00006197,
-0.00005956,
-0.00006099,
-0.00005881,
-0.00005972,
-0.00006005,
-0.00005691,
-0.00005647,
-0.00005823,
-0.00005603,
-0.00005759,
-0.00005605,
-0.00005558,
-0.00005646,
-0.00005480,
-0.00005543,
-0.00005551,
-0.00005357,
-0.00005295,
-0.00005549,
-0.00005286,
-0.00005495,
-0.00005278,
-0.00005414,
-0.00005475,
-0.00005169,
-0.00005307,
-0.00005117,
-0.00005068,
-0.00005036,
-0.00005270,
-0.00004991,
-0.00005177,
-0.00005900,
-0.00004889,
-0.00006116,
-0.00005285,
-0.00006427,
-0.00005589,
-0.00006943,
-0.00006195,
-0.00007219,
-0.00007275,
-0.00006694,
-0.00007232,
-0.00006712,
-0.00007044,
-0.00006607,
-0.00007040,
-0.00007120,
-0.00006047,
-0.00006863,
-0.00006547,
-0.00005919,
-0.00006852,
-0.00005996,
-0.00006589,
-0.00006938,
-0.00006013,
-0.00007365,
-0.00006702,
-0.00007595,
-0.00008089,
-0.00006987,
-0.00008784,
-0.00007751,
-0.00009504,
-0.00010978,
-0.00008984,
-0.00012777,
-0.00010534,
-0.00014784,
-0.00012341,
-0.00017455,
-0.00018601,
-0.00015342,
-0.00020484,
-0.00017984,
-0.00018931,
-0.00022557,
-0.00022780,
-0.00021393,
-0.00022939,
-0.00023016,
-0.00021920,
-0.00021508,
-0.00022046,
-0.00020159,
-0.00021016,
-0.00018988,
-0.00019842,
-0.00017117,
-0.00018205,
-0.00015240,
-0.00014443,
-0.00015946,
-0.00014629,
-0.00012207,
-0.00013127,
-0.00010545,
-0.00011422,
-0.00009446,
-0.00009843,
-0.00008316,
-0.00008914,
-0.00008435,
-0.00006511,
-0.00007269,
-0.00006160,
-0.00006279,
-0.00005814,
-0.00005882,
-0.00005406,
-0.00005351,
-0.00005183,
-0.00005084,
-0.00004786,
-0.00004877,
-0.00004859,
-0.00004583,
-0.00004279,
-0.00004263,
-0.00004130,
-0.00004093,
-0.00004059,
-0.00004012,
-0.00004037,
-0.00004396,
-0.00004304,
-0.00004054,
-0.00004200,
-0.00004073,
-0.00004199,
-0.00004077,
-0.00004125,
-0.00003820,
-0.00003723,
-0.00003610,
-0.00003503,
-0.00003232,
-0.00003214,
-0.00003263,
-0.00003065,
-0.00003127,
-0.00002955,
-0.00002956,
-0.00002840,
-0.00002896,
-0.00002780,
-0.00002805,
-0.00002680,
-0.00002585,
-0.00002704,
-0.00002540,
-0.00002576,
-0.00002438,
-0.00002409,
-0.00002110,
-0.00002288,
-0.00001930,
-0.00002147,
-0.00001830,
-0.00001907,
-0.00001917,
-0.00001634,
-0.00001778,
-0.00001705,
-0.00001506,
-0.00001555,
-0.00001544,
-0.00001376,
-0.00001432,
-0.00001256,
-0.00001321,
-0.00001143,
-0.00001207,
-0.00001040,
-0.00001079,
-0.00001077,
-0.00000938,
-0.00000992,
-0.00000926,
-0.00000875,
-0.00000915,
-0.00000791,
-0.00000858,
-0.00000757,
-0.00000885,
-0.00000740,
-0.00000859,
-0.00000871,
-0.00000732,
-0.00000711
+          0.00006389f,
+0.00006904f,
+0.00007915f,
+0.00009378f,
+0.00010719f,
+0.00010807f,
+0.00005190f,
+0.00007085f,
+0.00008762f,
+0.00011574f,
+0.00012782f,
+0.00020258f,
+0.00028301f,
+0.00041885f,
+0.00079339f,
+0.00231845f,
+0.00809283f,
+0.02627796f,
+0.07986263f,
+0.21857411f,
+0.41950208f,
+0.58629708f,
+0.66050686f,
+0.68010722f,
+0.69547035f,
+0.73200613f,
+0.76244784f,
+0.77631573f,
+0.77685838f,
+0.77827649f,
+0.79088274f,
+0.82399853f,
+0.85580091f,
+0.86901807f,
+0.87815311f,
+0.88386190f,
+0.88817207f,
+0.88840904f,
+0.88986216f,
+0.89780237f,
+0.90741552f,
+0.92203907f,
+0.93653131f,
+0.94317059f,
+0.94634032f,
+0.94826607f,
+0.95033833f,
+0.95413215f,
+0.95048104f,
+0.94044263f,
+0.92879443f,
+0.91596982f,
+0.91697468f,
+0.93980602f,
+0.95870660f,
+0.95318054f,
+0.94231596f,
+0.94431035f,
+0.95901822f,
+0.97746502f,
+0.98759663f,
+0.98550275f,
+0.97993122f,
+0.97745334f,
+0.97810352f,
+0.98221381f,
+0.98793014f,
+0.98964682f,
+0.98759323f,
+0.98932633f,
+0.99590692f,
+1.00000000f,
+0.99684166f,
+0.98739921f,
+0.97751640f,
+0.97333810f,
+0.97745644f,
+0.98380626f,
+0.98261193f,
+0.97292962f,
+0.96647185f,
+0.97034470f,
+0.97825408f,
+0.98127712f,
+0.97970816f,
+0.97805235f,
+0.97616447f,
+0.97247933f,
+0.97166543f,
+0.97283831f,
+0.97422681f,
+0.97153287f,
+0.96550092f,
+0.96119938f,
+0.96103140f,
+0.96128770f,
+0.96042574f,
+0.95959210f,
+0.95853335f,
+0.95403997f,
+0.94406246f,
+0.93246052f,
+0.92672319f,
+0.92977305f,
+0.93586632f,
+0.93897168f,
+0.93690555f,
+0.93160952f,
+0.92690621f,
+0.92296771f,
+0.91842779f,
+0.91408514f,
+0.90917712f,
+0.90063878f,
+0.88604421f,
+0.86698768f,
+0.85188054f,
+0.84835188f,
+0.85624365f,
+0.86584046f,
+0.87078346f,
+0.86760443f,
+0.86093980f,
+0.85542417f,
+0.85190690f,
+0.84736153f,
+0.83999199f,
+0.83265310f,
+0.82574365f,
+0.81691630f,
+0.79906275f,
+0.76297024f,
+0.70997037f,
+0.65661413f,
+0.62490673f,
+0.61368617f,
+0.59949630f,
+0.55020515f,
+0.43968017f,
+0.29408377f,
+0.17078748f,
+0.09678961f,
+0.05559319f,
+0.03167753f,
+0.01645302f,
+0.00834098f,
+0.00415879f,
+0.00246672f,
+0.00161203f,
+0.00125129f,
+0.00104229f,
+0.00092455f,
+0.00089227f,
+0.00079671f,
+0.00081363f,
+0.00092827f,
+0.00069700f,
+0.00111498f,
+0.00114280f,
+0.00100619f,
+0.00078417f,
+0.00082583f,
+0.00081178f,
+0.00088529f,
+0.00079650f,
+0.00086426f,
+0.00073552f,
+0.00082226f,
+0.00078531f,
+0.00083777f,
+0.00101103f,
+0.00107977f,
+0.00122308f,
+0.00080949f,
+0.00071004f,
+0.00086922f,
+0.00109600f,
+0.00070790f,
+0.00070521f,
+0.00062633f,
+0.00057800f,
+0.00055688f,
+0.00036005f,
+0.00043799f,
+0.00082241f,
+0.00048577f,
+0.00065545f,
+0.00048744f,
+0.00073230f,
+0.00058760f,
+0.00049000f,
+0.00037912f,
+0.00023879f,
+0.00041582f,
+0.00049542f,
+0.00037382f,
+0.00035989f,
+0.00036581f,
+0.00036198f,
+0.00037810f,
+0.00041012f,
+0.00036016f,
+0.00040840f,
+0.00034388f,
+0.00031513f,
+0.00031990f,
+0.00027999f,
+0.00030759f,
+0.00022414f,
+0.00030194f,
+0.00023586f,
+0.00036102f,
+0.00028178f,
+0.00025961f,
+0.00017557f,
+0.00028227f,
+0.00039256f,
+0.00032632f,
+0.00025898f,
+0.00025288f,
+0.00035918f,
+0.00021611f,
+0.00015573f,
+0.00019060f,
+0.00020197f,
+0.00017782f,
+0.00011551f,
+0.00017122f,
+0.00008967f,
+0.00017285f,
+0.00026179f,
+0.00016810f,
+0.00008392f,
+0.00012216f,
+0.00015827f,
+0.00008757f,
+0.00003617f,
+0.00006631f,
+0.00006748f,
+0.00005452f,
+0.00004778f
         };
-      //B1 green band
-      const float b1[601] =
-        {
-0.00001010,
-0.00001389,
-0.00001902,
-0.00001356,
-0.00001327,
-0.00002873,
-0.00003122,
-0.00002184,
-0.00002860,
-0.00002274,
-0.00006723,
-0.00008343,
-0.00001226,
-0.00006171,
-0.00005563,
-0.00004426,
-0.00004539,
-0.00000677,
-0.00002035,
-0.00001522,
-0.00000528,
-0.00001865,
-0.00001834,
-0.00002028,
-0.00001608,
-0.00000017,
-0.00000057,
-0.00001313,
-0.00001658,
-0.00000224,
-0.00001983,
-0.00001885,
-0.00001859,
-0.00001975,
-0.00000023,
-0.00000139,
-0.00001634,
-0.00001789,
-0.00000616,
-0.00002267,
-0.00001903,
-0.00001956,
-0.00001844,
-0.00000342,
-0.00001448,
-0.00001340,
-0.00000774,
-0.00001880,
-0.00001632,
-0.00001912,
-0.00001915,
-0.00000950,
-0.00000865,
-0.00000927,
-0.00001089,
-0.00001236,
-0.00001349,
-0.00001273,
-0.00001062,
-0.00000958,
-0.00000938,
-0.00000973,
-0.00000998,
-0.00001014,
-0.00001042,
-0.00001060,
-0.00001115,
-0.00001174,
-0.00001254,
-0.00001338,
-0.00001400,
-0.00001431,
-0.00001481,
-0.00001528,
-0.00001646,
-0.00001812,
-0.00001991,
-0.00002232,
-0.00002548,
-0.00002855,
-0.00003235,
-0.00003705,
-0.00004200,
-0.00004766,
-0.00005414,
-0.00006070,
-0.00006821,
-0.00007648,
-0.00008464,
-0.00009410,
-0.00010524,
-0.00011803,
-0.00013402,
-0.00015319,
-0.00017614,
-0.00020243,
-0.00023094,
-0.00026260,
-0.00029673,
-0.00033499,
-0.00038048,
-0.00043594,
-0.00050952,
-0.00061362,
-0.00076395,
-0.00097908,
-0.00126923,
-0.00163382,
-0.00207590,
-0.00261314,
-0.00327921,
-0.00413303,
-0.00526369,
-0.00684627,
-0.00915649,
-0.01267648,
-0.01800685,
-0.02585007,
-0.03667779,
-0.05118064,
-0.07035894,
-0.09617429,
-0.13094754,
-0.17727190,
-0.23641290,
-0.30751157,
-0.38790047,
-0.47436827,
-0.56468213,
-0.65643377,
-0.74674718,
-0.82841738,
-0.89713046,
-0.94858047,
-0.98476388,
-1.00572477,
-1.01799762,
-1.02241761,
-1.02351216,
-1.02270186,
-1.02115905,
-1.01965328,
-1.01731773,
-1.01540955,
-1.01129946,
-1.00955329,
-1.00573235,
-1.00407549,
-1.00164097,
-1.00130077,
-0.99962912,
-1.00130006,
-1.00140898,
-1.00384853,
-1.00599723,
-1.00910590,
-1.01051975,
-1.01099594,
-1.00890543,
-1.00483865,
-0.99901144,
-0.99220799,
-0.98468953,
-0.97823873,
-0.97314859,
-0.97022501,
-0.96868569,
-0.97004107,
-0.97166154,
-0.97626613,
-0.98067188,
-0.98683373,
-0.99219054,
-0.99666299,
-1.00000000,
-0.99912543,
-0.99696320,
-0.99036225,
-0.98384547,
-0.97519907,
-0.96391617,
-0.94573906,
-0.91096960,
-0.85904551,
-0.79290657,
-0.72361833,
-0.65257621,
-0.57623116,
-0.48870213,
-0.39405229,
-0.29840580,
-0.21347365,
-0.14739732,
-0.10143634,
-0.07106678,
-0.05101665,
-0.03753145,
-0.02803887,
-0.02107987,
-0.01582745,
-0.01178705,
-0.00868732,
-0.00634606,
-0.00461992,
-0.00337907,
-0.00250694,
-0.00189987,
-0.00147499,
-0.00117574,
-0.00096470,
-0.00080813,
-0.00069267,
-0.00060187,
-0.00053101,
-0.00046977,
-0.00041864,
-0.00037515,
-0.00033197,
-0.00029595,
-0.00026098,
-0.00022974,
-0.00020299,
-0.00017878,
-0.00015870,
-0.00014470,
-0.00012912,
-0.00012281,
-0.00011148,
-0.00010580,
-0.00010508,
-0.00009942,
-0.00009982,
-0.00009664,
-0.00009667,
-0.00009589,
-0.00009628,
-0.00009600,
-0.00009459,
-0.00009484,
-0.00009162,
-0.00009246,
-0.00008883,
-0.00008616,
-0.00008688,
-0.00008318,
-0.00008295,
-0.00008153,
-0.00008262,
-0.00008265,
-0.00008855,
-0.00009224,
-0.00008974,
-0.00010120,
-0.00010537,
-0.00010299,
-0.00011271,
-0.00011213,
-0.00011810,
-0.00011639,
-0.00011824,
-0.00011152,
-0.00011302,
-0.00010361,
-0.00010441,
-0.00009482,
-0.00009519,
-0.00008675,
-0.00008735,
-0.00008078,
-0.00008067,
-0.00007509,
-0.00007486,
-0.00006895,
-0.00006944,
-0.00006375,
-0.00006358,
-0.00005878,
-0.00005896,
-0.00005523,
-0.00005501,
-0.00005343,
-0.00005281,
-0.00005140,
-0.00005170,
-0.00005134,
-0.00005138,
-0.00005107,
-0.00005085,
-0.00005096,
-0.00005018,
-0.00005046,
-0.00004904,
-0.00004833,
-0.00004769,
-0.00004781,
-0.00004694,
-0.00004600,
-0.00004584,
-0.00004562,
-0.00004584,
-0.00004525,
-0.00004562,
-0.00004612,
-0.00004747,
-0.00004854,
-0.00004734,
-0.00004932,
-0.00004894,
-0.00005047,
-0.00004972,
-0.00005030,
-0.00005129,
-0.00004999,
-0.00005048,
-0.00004864,
-0.00004901,
-0.00004923,
-0.00004719,
-0.00004950,
-0.00004776,
-0.00005348,
-0.00005702,
-0.00005214,
-0.00006320,
-0.00005556,
-0.00007144,
-0.00005903,
-0.00005649,
-0.00007807,
-0.00004800,
-0.00004042,
-0.00005618,
-0.00002571,
-0.00003251,
-0.00002175,
-0.00000592,
-0.00001077,
-0.00000286,
-0.00000380,
-0.00000323,
-0.00000149,
-0.00000247,
-0.00000112,
-0.00000145,
-0.00000111,
-0.00000139,
-0.00000105,
-0.00000141,
-0.00000097,
-0.00000085,
-0.00000123,
-0.00000158,
-0.00000089,
-0.00000137,
-0.00000086,
-0.00000158,
-0.00000202,
-0.00000091,
-0.00000174,
-0.00000102,
-0.00000200,
-0.00000128,
-0.00000479,
-0.00000149,
-0.00000719,
-0.00000417,
-0.00000502,
-0.00000963,
-0.00000561,
-0.00000984,
-0.00000949,
-0.00000318,
-0.00000643,
-0.00000153,
-0.00000184,
-0.00000116,
-0.00000173,
-0.00000086,
-0.00000185,
-0.00000089,
-0.00000193,
-0.00000096,
-0.00000196,
-0.00000116,
-0.00000200,
-0.00000115,
-0.00000195,
-0.00000131,
-0.00000197,
-0.00000125,
-0.00000187,
-0.00000099,
-0.00000070,
-0.00000049,
-0.00000119,
-0.00000051,
-0.00000135,
-0.00000086,
-0.00000153,
-0.00000104,
-0.00000186,
-0.00000156,
-0.00000205,
-0.00000293,
-0.00000170,
-0.00000296,
-0.00000182,
-0.00000266,
-0.00000171,
-0.00000236,
-0.00000240,
-0.00000093,
-0.00000174,
-0.00000183,
-0.00000096,
-0.00000144,
-0.00000177,
-0.00000076,
-0.00000198,
-0.00000079,
-0.00000160,
-0.00000058,
-0.00000154,
-0.00000070,
-0.00000161,
-0.00000076,
-0.00000068,
-0.00000245,
-0.00000079,
-0.00000299,
-0.00000128,
-0.00000285,
-0.00000154,
-0.00000296,
-0.00000178,
-0.00000333,
-0.00000130,
-0.00000347,
-0.00000220,
-0.00000159,
-0.00000449,
-0.00000188,
-0.00000635,
-0.00000903,
-0.00000344,
-0.00001051,
-0.00000601,
-0.00000991,
-0.00001299,
-0.00000632,
-0.00001514,
-0.00000941,
-0.00001426,
-0.00000749,
-0.00001524,
-0.00000887,
-0.00000743,
-0.00001404,
-0.00000558,
-0.00001092,
-0.00001135,
-0.00000460,
-0.00001024,
-0.00000547,
-0.00001036,
-0.00000503,
-0.00001140,
-0.00000557,
-0.00001124,
-0.00000612,
-0.00001120,
-0.00000642,
-0.00001093,
-0.00000638,
-0.00001191,
-0.00000531,
-0.00000907,
-0.00000487,
-0.00000794,
-0.00000998,
-0.00000316,
-0.00000322,
-0.00001260,
-0.00000365,
-0.00000446,
-0.00001209,
-0.00000567,
-0.00001173,
-0.00000705,
-0.00001006,
-0.00000466,
-0.00000325,
-0.00000921,
-0.00000755,
-0.00000493,
-0.00000922,
-0.00000673,
-0.00001643,
-0.00001135,
-0.00001160,
-0.00002335,
-0.00001573,
-0.00002364,
-0.00001931,
-0.00002613,
-0.00002318,
-0.00001698,
-0.00001954,
-0.00001127,
-0.00001395,
-0.00001618,
-0.00000862,
-0.00001383,
-0.00000962,
-0.00000696,
-0.00000696,
-0.00000561,
-0.00000807,
-0.00000905,
-0.00000632,
-0.00000850,
-0.00000820,
-0.00001222,
-0.00000921,
-0.00001027,
-0.00001204,
-0.00001323,
-0.00001373,
-0.00001579,
-0.00001521,
-0.00002156,
-0.00001894,
-0.00002375,
-0.00002243,
-0.00002409,
-0.00002019,
-0.00002182,
-0.00001452,
-0.00001755,
-0.00001475,
-0.00000805,
-0.00001071,
-0.00000537,
-0.00000682,
-0.00000663,
-0.00000526,
-0.00000418,
-0.00000477,
-0.00000426,
-0.00000405,
-0.00000367,
-0.00000399,
-0.00000340,
-0.00000339,
-0.00000169,
-0.00000178,
-0.00000242,
-0.00000171,
-0.00000172,
-0.00000233,
-0.00000182,
-0.00000230,
-0.00000204,
-0.00000245,
-0.00000243,
-0.00000136,
-0.00000259,
-0.00000105,
-0.00000239,
-0.00000090,
-0.00000213,
-0.00000104,
-0.00000226,
-0.00000088,
-0.00000229,
-0.00000065,
-0.00000246,
-0.00000063,
-0.00000238,
-0.00000072,
-0.00000210,
-0.00000091,
-0.00000122,
-0.00000184,
-0.00000177,
-0.00000066,
-0.00000153,
-0.00000065,
-0.00000147,
-0.00000054,
-0.00000145,
-0.00000023,
-0.00000134,
-0.00000029,
-0.00000141,
-0.00000045,
-0.00000127,
-0.00000146,
-0.00000040,
-0.00000142,
-0.00000038
-        };
-      //B2 red band
-      const float b2[601] =
-        {
-0.00001168,
-0.00001419,
-0.00001348,
-0.00000996,
-0.00001009,
-0.00001366,
-0.00003289,
-0.00001748,
-0.00002207,
-0.00002377,
-0.00002383,
-0.00002470,
-0.00001811,
-0.00001353,
-0.00001155,
-0.00001303,
-0.00001374,
-0.00001126,
-0.00000712,
-0.00000464,
-0.00000438,
-0.00000381,
-0.00000312,
-0.00000581,
-0.00000319,
-0.00000473,
-0.00000585,
-0.00000644,
-0.00000967,
-0.00000918,
-0.00000742,
-0.00001090,
-0.00001649,
-0.00002016,
-0.00001631,
-0.00001673,
-0.00001578,
-0.00001766,
-0.00002209,
-0.00003114,
-0.00003091,
-0.00001848,
-0.00003451,
-0.00003492,
-0.00004332,
-0.00004770,
-0.00004658,
-0.00004547,
-0.00004239,
-0.00005155,
-0.00005834,
-0.00006365,
-0.00005824,
-0.00004581,
-0.00003799,
-0.00003584,
-0.00003689,
-0.00003817,
-0.00003951,
-0.00004017,
-0.00003987,
-0.00003754,
-0.00003651,
-0.00003781,
-0.00003645,
-0.00003408,
-0.00003160,
-0.00003251,
-0.00003509,
-0.00003935,
-0.00004494,
-0.00005115,
-0.00005707,
-0.00006145,
-0.00006038,
-0.00005716,
-0.00005354,
-0.00004978,
-0.00004759,
-0.00004735,
-0.00005985,
-0.00006501,
-0.00005803,
-0.00006474,
-0.00006650,
-0.00006908,
-0.00006585,
-0.00005102,
-0.00003616,
-0.00002648,
-0.00002034,
-0.00001645,
-0.00001363,
-0.00001142,
-0.00000950,
-0.00000755,
-0.00000648,
-0.00000560,
-0.00000476,
-0.00000466,
-0.00000444,
-0.00000389,
-0.00000408,
-0.00000399,
-0.00000392,
-0.00000436,
-0.00000413,
-0.00000397,
-0.00000424,
-0.00000400,
-0.00000389,
-0.00000385,
-0.00000390,
-0.00000379,
-0.00000357,
-0.00000383,
-0.00000386,
-0.00000378,
-0.00000439,
-0.00000377,
-0.00000416,
-0.00000494,
-0.00000455,
-0.00000553,
-0.00000605,
-0.00000613,
-0.00000672,
-0.00000696,
-0.00000744,
-0.00000760,
-0.00000766,
-0.00000770,
-0.00000725,
-0.00000682,
-0.00000716,
-0.00000758,
-0.00000759,
-0.00000722,
-0.00000805,
-0.00000826,
-0.00000816,
-0.00000835,
-0.00000798,
-0.00000798,
-0.00000796,
-0.00000817,
-0.00000856,
-0.00000897,
-0.00000920,
-0.00000935,
-0.00000980,
-0.00001003,
-0.00000998,
-0.00001038,
-0.00001044,
-0.00001035,
-0.00001090,
-0.00001143,
-0.00001155,
-0.00001240,
-0.00001322,
-0.00001374,
-0.00001466,
-0.00001507,
-0.00001561,
-0.00001799,
-0.00001806,
-0.00001990,
-0.00002207,
-0.00002400,
-0.00002768,
-0.00003153,
-0.00003519,
-0.00003855,
-0.00004048,
-0.00004339,
-0.00004685,
-0.00004712,
-0.00004885,
-0.00005031,
-0.00005058,
-0.00005380,
-0.00006109,
-0.00006875,
-0.00008360,
-0.00010367,
-0.00013385,
-0.00017220,
-0.00021349,
-0.00025613,
-0.00029745,
-0.00033957,
-0.00038077,
-0.00042014,
-0.00045664,
-0.00049082,
-0.00052462,
-0.00057202,
-0.00064046,
-0.00073788,
-0.00088389,
-0.00109195,
-0.00138377,
-0.00179072,
-0.00234897,
-0.00310035,
-0.00409611,
-0.00539886,
-0.00764596,
-0.00982485,
-0.01250677,
-0.01576553,
-0.01971871,
-0.02460136,
-0.03076162,
-0.03870973,
-0.04932564,
-0.06405112,
-0.08527458,
-0.11683854,
-0.16336997,
-0.22811553,
-0.30778033,
-0.39105868,
-0.46939880,
-0.54633346,
-0.62987089,
-0.71765372,
-0.80227884,
-0.87400338,
-0.92669327,
-0.95728386,
-0.97246242,
-0.98093913,
-0.98815314,
-0.99512479,
-1.00000000,
-1.00071278,
-0.99509151,
-0.98322813,
-0.96618038,
-0.94726377,
-0.92911907,
-0.91427200,
-0.90407257,
-0.89868685,
-0.89729260,
-0.90048309,
-0.90619876,
-0.91486402,
-0.92548194,
-0.93716217,
-0.95109280,
-0.96341044,
-0.97756310,
-0.98873468,
-1.00002059,
-1.00784176,
-1.01361246,
-1.01518655,
-1.01365106,
-1.00889905,
-1.00094470,
-0.99098939,
-0.97907661,
-0.96736515,
-0.95491923,
-0.94403019,
-0.93408742,
-0.92588661,
-0.91979557,
-0.91551236,
-0.91345541,
-0.91406966,
-0.91586446,
-0.92112352,
-0.92637606,
-0.93343259,
-0.93977000,
-0.94511856,
-0.94655018,
-0.94482431,
-0.93695460,
-0.92470622,
-0.90515848,
-0.87651239,
-0.84722733,
-0.81626058,
-0.77926628,
-0.74095072,
-0.69853161,
-0.65530863,
-0.60957078,
-0.56408506,
-0.51760530,
-0.47150814,
-0.42482252,
-0.37706746,
-0.32909071,
-0.28093192,
-0.23513938,
-0.19289082,
-0.15584587,
-0.12438828,
-0.09857760,
-0.07759031,
-0.06074302,
-0.04708451,
-0.03618668,
-0.02749464,
-0.02064713,
-0.01533676,
-0.01131374,
-0.00832392,
-0.00613477,
-0.00454626,
-0.00340798,
-0.00258536,
-0.00199356,
-0.00156305,
-0.00125005,
-0.00101327,
-0.00085049,
-0.00071368,
-0.00062520,
-0.00054959,
-0.00049985,
-0.00047162,
-0.00043891,
-0.00042848,
-0.00040347,
-0.00038227,
-0.00035692,
-0.00033769,
-0.00030789,
-0.00029814,
-0.00024879,
-0.00021170,
-0.00018471,
-0.00013393,
-0.00012509,
-0.00007240,
-0.00006419,
-0.00003891,
-0.00003294,
-0.00002353,
-0.00002711,
-0.00001690,
-0.00001474,
-0.00001598,
-0.00001292,
-0.00001366,
-0.00001329,
-0.00001411,
-0.00002354,
-0.00009563,
-0.00012882,
-0.00011528,
-0.00001687,
-0.00015343,
-0.00012777,
-0.00015354,
-0.00024298,
-0.00015520,
-0.00024274,
-0.00012696,
-0.00014910,
-0.00000979,
-0.00000629,
-0.00000738,
-0.00000483,
-0.00000489,
-0.00000536,
-0.00000458,
-0.00000528,
-0.00000438,
-0.00000475,
-0.00000446,
-0.00000488,
-0.00000456,
-0.00000547,
-0.00000448,
-0.00000478,
-0.00000435,
-0.00000470,
-0.00000425,
-0.00000458,
-0.00000435,
-0.00000380,
-0.00000373,
-0.00000298,
-0.00000390,
-0.00000278,
-0.00000290,
-0.00000277,
-0.00000307,
-0.00000247,
-0.00000231,
-0.00000301,
-0.00000293,
-0.00000319,
-0.00000351,
-0.00000323,
-0.00000339,
-0.00000318,
-0.00000318,
-0.00000396,
-0.00000313,
-0.00000364,
-0.00000310,
-0.00000419,
-0.00000349,
-0.00000396,
-0.00000341,
-0.00000365,
-0.00000362,
-0.00000290,
-0.00000345,
-0.00000289,
-0.00000288,
-0.00000429,
-0.00000323,
-0.00000329,
-0.00000329,
-0.00000455,
-0.00000497,
-0.00000353,
-0.00000556,
-0.00000383,
-0.00000507,
-0.00000482,
-0.00000484,
-0.00000546,
-0.00000374,
-0.00000601,
-0.00000422,
-0.00000512,
-0.00000509,
-0.00000286,
-0.00000637,
-0.00000539,
-0.00000579,
-0.00000462,
-0.00000647,
-0.00000604,
-0.00000432,
-0.00000662,
-0.00000521,
-0.00000680,
-0.00001180,
-0.00000638,
-0.00000805,
-0.00000389,
-0.00001200,
-0.00001134,
-0.00000562,
-0.00001181,
-0.00000868,
-0.00001541,
-0.00001086,
-0.00001222,
-0.00000823,
-0.00000960,
-0.00000871,
-0.00001051,
-0.00001235,
-0.00000864,
-0.00001357,
-0.00001158,
-0.00001522,
-0.00001091,
-0.00001237,
-0.00000928,
-0.00000973,
-0.00000865,
-0.00001333,
-0.00000847,
-0.00001329,
-0.00000740,
-0.00000974,
-0.00001229,
-0.00001128,
-0.00000704,
-0.00001244,
-0.00000915,
-0.00001448,
-0.00001164,
-0.00000861,
-0.00001441,
-0.00000700,
-0.00001461,
-0.00001401,
-0.00001007,
-0.00001695,
-0.00002042,
-0.00002108,
-0.00003064,
-0.00003171,
-0.00004339,
-0.00004171,
-0.00005692,
-0.00007019,
-0.00007121,
-0.00007122,
-0.00008504,
-0.00007450,
-0.00008010,
-0.00008936,
-0.00008826,
-0.00008831,
-0.00009721,
-0.00009019,
-0.00008741,
-0.00008467,
-0.00007373,
-0.00006748,
-0.00006984,
-0.00005307,
-0.00004844,
-0.00005417,
-0.00004482,
-0.00004483,
-0.00003814,
-0.00003524,
-0.00002726,
-0.00002455,
-0.00002566,
-0.00002043,
-0.00001759,
-0.00001473,
-0.00001512,
-0.00001132,
-0.00000862,
-0.00001262,
-0.00000857,
-0.00000918,
-0.00000689,
-0.00000671,
-0.00000434,
-0.00000648,
-0.00000513,
-0.00000748,
-0.00000691,
-0.00000789,
-0.00000754,
-0.00000715,
-0.00000806,
-0.00000701,
-0.00000449,
-0.00000640,
-0.00000595,
-0.00000877,
-0.00000724,
-0.00000837,
-0.00000733,
-0.00000815,
-0.00000621,
-0.00000755,
-0.00000444,
-0.00000580,
-0.00000524,
-0.00000343,
-0.00000356,
-0.00000340,
-0.00000361,
-0.00000245,
-0.00000146,
-0.00000232,
-0.00000165,
-0.00000168,
-0.00000491,
-0.00000168,
-0.00000411,
-0.00000122,
-0.00000367,
-0.00000244,
-0.00000179,
-0.00000395,
-0.00000177,
-0.00000108,
-0.00000330,
-0.00000166,
-0.00000258,
-0.00000204,
-0.00000054,
-0.00000259,
-0.00000133,
-0.00000205,
-0.00000101,
-0.00000210,
-0.00000084,
-0.00000090,
-0.00000176,
-0.00000079,
-0.00000165,
-0.00000071,
-0.00000173,
-0.00000070,
-0.00000043,
-0.00000056,
-0.00000159
-        };
-      //B3 nir band
-      const float b3[601] =
-        {
-0.00000184,
-0.00000202,
-0.00000371,
-0.00000470,
-0.00000487,
-0.00000512,
-0.00000521,
-0.00000490,
-0.00000308,
-0.00000160,
-0.00000126,
-0.00000131,
-0.00000119,
-0.00000105,
-0.00000082,
-0.00000078,
-0.00000076,
-0.00000059,
-0.00000058,
-0.00000052,
-0.00000064,
-0.00000070,
-0.00000068,
-0.00000068,
-0.00000079,
-0.00000093,
-0.00000124,
-0.00000092,
-0.00000124,
-0.00000117,
-0.00000125,
-0.00000129,
-0.00000121,
-0.00000153,
-0.00000149,
-0.00000148,
-0.00000139,
-0.00000166,
-0.00000211,
-0.00000193,
-0.00000241,
-0.00000211,
-0.00000228,
-0.00000294,
-0.00000406,
-0.00000507,
-0.00001753,
-0.00062612,
-0.00099041,
-0.00038281,
-0.00084800,
-0.00090343,
-0.00098820,
-0.00100027,
-0.00030612,
-0.00003473,
-0.00002650,
-0.00002396,
-0.00002429,
-0.00002735,
-0.00003712,
-0.00005612,
-0.00007768,
-0.00008914,
-0.00009611,
-0.00010759,
-0.00011246,
-0.00011011,
-0.00009290,
-0.00006854,
-0.00005014,
-0.00003890,
-0.00003142,
-0.00002673,
-0.00002266,
-0.00002061,
-0.00002008,
-0.00002029,
-0.00002207,
-0.00002564,
-0.00003063,
-0.00003885,
-0.00004812,
-0.00005996,
-0.00007077,
-0.00007965,
-0.00008609,
-0.00008841,
-0.00008691,
-0.00008090,
-0.00007026,
-0.00005867,
-0.00004706,
-0.00003684,
-0.00002888,
-0.00002252,
-0.00001864,
-0.00001631,
-0.00001512,
-0.00001579,
-0.00001740,
-0.00002076,
-0.00002500,
-0.00002970,
-0.00003324,
-0.00003568,
-0.00003719,
-0.00003637,
-0.00003522,
-0.00003204,
-0.00002806,
-0.00002554,
-0.00002401,
-0.00002509,
-0.00002676,
-0.00003097,
-0.00003703,
-0.00004613,
-0.00006025,
-0.00007876,
-0.00010325,
-0.00012473,
-0.00014349,
-0.00015902,
-0.00017128,
-0.00017677,
-0.00017814,
-0.00017111,
-0.00016498,
-0.00016271,
-0.00016590,
-0.00017244,
-0.00018189,
-0.00018854,
-0.00019224,
-0.00019405,
-0.00019354,
-0.00018898,
-0.00018087,
-0.00017218,
-0.00016359,
-0.00015899,
-0.00015586,
-0.00015606,
-0.00015819,
-0.00016068,
-0.00016530,
-0.00016816,
-0.00017049,
-0.00017164,
-0.00017169,
-0.00017074,
-0.00017054,
-0.00016913,
-0.00016744,
-0.00016766,
-0.00016951,
-0.00017426,
-0.00018167,
-0.00019232,
-0.00020428,
-0.00021790,
-0.00023244,
-0.00024402,
-0.00025416,
-0.00026158,
-0.00026375,
-0.00026297,
-0.00026655,
-0.00026988,
-0.00027504,
-0.00028070,
-0.00028807,
-0.00030046,
-0.00031707,
-0.00033920,
-0.00036610,
-0.00039570,
-0.00043575,
-0.00048703,
-0.00053825,
-0.00057909,
-0.00060314,
-0.00061674,
-0.00061491,
-0.00059039,
-0.00054258,
-0.00047833,
-0.00039787,
-0.00031987,
-0.00025214,
-0.00019590,
-0.00015376,
-0.00012305,
-0.00010304,
-0.00008730,
-0.00007548,
-0.00006686,
-0.00006139,
-0.00005448,
-0.00005006,
-0.00004759,
-0.00004287,
-0.00003904,
-0.00003667,
-0.00003331,
-0.00003138,
-0.00002877,
-0.00002657,
-0.00002417,
-0.00002328,
-0.00002129,
-0.00002036,
-0.00001896,
-0.00001779,
-0.00001738,
-0.00001579,
-0.00001598,
-0.00001498,
-0.00001430,
-0.00001381,
-0.00001310,
-0.00001315,
-0.00001249,
-0.00001236,
-0.00001250,
-0.00001178,
-0.00001194,
-0.00001165,
-0.00001136,
-0.00001177,
-0.00001162,
-0.00001149,
-0.00001162,
-0.00001162,
-0.00001183,
-0.00001163,
-0.00001211,
-0.00001182,
-0.00001142,
-0.00001146,
-0.00001129,
-0.00001064,
-0.00001038,
-0.00001123,
-0.00001061,
-0.00001039,
-0.00001007,
-0.00001068,
-0.00001053,
-0.00001131,
-0.00001150,
-0.00001210,
-0.00001199,
-0.00001228,
-0.00001244,
-0.00001267,
-0.00001226,
-0.00001236,
-0.00001242,
-0.00001236,
-0.00001227,
-0.00001222,
-0.00001218,
-0.00001214,
-0.00001206,
-0.00001202,
-0.00001242,
-0.00001231,
-0.00001283,
-0.00001325,
-0.00001395,
-0.00001410,
-0.00001399,
-0.00001534,
-0.00001580,
-0.00001690,
-0.00001748,
-0.00001885,
-0.00001898,
-0.00001988,
-0.00002137,
-0.00002320,
-0.00002504,
-0.00002641,
-0.00002837,
-0.00003079,
-0.00003251,
-0.00003533,
-0.00003740,
-0.00004081,
-0.00004361,
-0.00004639,
-0.00004986,
-0.00005346,
-0.00005805,
-0.00006226,
-0.00006694,
-0.00007188,
-0.00007800,
-0.00008485,
-0.00009055,
-0.00010008,
-0.00010713,
-0.00011933,
-0.00012975,
-0.00014324,
-0.00015785,
-0.00017539,
-0.00019507,
-0.00021689,
-0.00024318,
-0.00027135,
-0.00030518,
-0.00034281,
-0.00039712,
-0.00044651,
-0.00050188,
-0.00056707,
-0.00063984,
-0.00072378,
-0.00081879,
-0.00092782,
-0.00105511,
-0.00120160,
-0.00137088,
-0.00156792,
-0.00180276,
-0.00207920,
-0.00240799,
-0.00280298,
-0.00327494,
-0.00384821,
-0.00454832,
-0.00540493,
-0.00645469,
-0.00774941,
-0.00936399,
-0.01137832,
-0.01388118,
-0.01700597,
-0.02092752,
-0.02586928,
-0.03206911,
-0.03985523,
-0.04956652,
-0.06173849,
-0.07680296,
-0.09550239,
-0.11837088,
-0.14615821,
-0.19110224,
-0.23178705,
-0.27801636,
-0.33031673,
-0.38771033,
-0.44914649,
-0.51370254,
-0.57939644,
-0.64484781,
-0.70835304,
-0.76788190,
-0.82252523,
-0.87063314,
-0.91086251,
-0.94360264,
-0.96734308,
-0.98447500,
-0.99402844,
-0.99904759,
-1.00000000,
-0.99829749,
-0.99534944,
-0.99113813,
-0.98712837,
-0.98344438,
-0.97955733,
-0.97683333,
-0.97381307,
-0.97171326,
-0.96937935,
-0.96682308,
-0.96494693,
-0.96155704,
-0.95914861,
-0.95524656,
-0.95141098,
-0.94725240,
-0.94238136,
-0.93805030,
-0.93299243,
-0.92787669,
-0.92261726,
-0.91765026,
-0.91344782,
-0.90866986,
-0.90481152,
-0.90031693,
-0.89720732,
-0.89342505,
-0.89040645,
-0.88745245,
-0.88446834,
-0.88140255,
-0.87825555,
-0.87487903,
-0.87077850,
-0.86665463,
-0.86193864,
-0.85704385,
-0.85203260,
-0.84608531,
-0.84067874,
-0.83464870,
-0.82847182,
-0.82237664,
-0.81646034,
-0.81067178,
-0.80547624,
-0.79996761,
-0.79538371,
-0.79048464,
-0.78593335,
-0.78246221,
-0.77854086,
-0.77505353,
-0.77183963,
-0.76834628,
-0.76559075,
-0.76238953,
-0.75915219,
-0.75631414,
-0.75288758,
-0.74984835,
-0.74648701,
-0.74311251,
-0.73936992,
-0.73559705,
-0.73163277,
-0.72765295,
-0.72334537,
-0.71892768,
-0.71424776,
-0.70932732,
-0.70417024,
-0.69865547,
-0.69314542,
-0.68706957,
-0.68120878,
-0.67553032,
-0.66989091,
-0.66440763,
-0.65922988,
-0.65415969,
-0.64965635,
-0.64537477,
-0.64153052,
-0.63820324,
-0.63506916,
-0.63264959,
-0.62992135,
-0.62726732,
-0.62445640,
-0.62156999,
-0.61847181,
-0.61501909,
-0.61133939,
-0.60744762,
-0.60314205,
-0.59883705,
-0.59425662,
-0.58928886,
-0.58381508,
-0.57719033,
-0.56857851,
-0.55699311,
-0.54163099,
-0.52202898,
-0.49847084,
-0.47191641,
-0.44270534,
-0.41155122,
-0.37843868,
-0.34304355,
-0.30590964,
-0.26730226,
-0.22805403,
-0.18974714,
-0.15369596,
-0.12145605,
-0.09413162,
-0.07189929,
-0.05457376,
-0.04144546,
-0.03158417,
-0.02425525,
-0.01879617,
-0.01470317,
-0.01163795,
-0.00930858,
-0.00744330,
-0.00607348,
-0.00501379,
-0.00413379,
-0.00347084,
-0.00293573,
-0.00250919,
-0.00215786,
-0.00186591,
-0.00163284,
-0.00142997,
-0.00127599,
-0.00112918,
-0.00102171,
-0.00091069,
-0.00083541,
-0.00075489,
-0.00069931,
-0.00063879,
-0.00059080,
-0.00055023,
-0.00050660,
-0.00047777,
-0.00044789,
-0.00041317,
-0.00039493,
-0.00035947,
-0.00033744,
-0.00031989,
-0.00028719,
-0.00027707,
-0.00025430,
-0.00023132,
-0.00022543,
-0.00019537,
-0.00018380,
-0.00016713,
-0.00014542,
-0.00013876,
-0.00011616,
-0.00011019,
-0.00009086,
-0.00009183,
-0.00006774,
-0.00006181,
-0.00006360,
-0.00004633,
-0.00005224,
-0.00003735,
-0.00003902,
-0.00002393,
-0.00003180,
-0.00001716,
-0.00001762,
-0.00002033,
-0.00001262,
-0.00001259,
-0.00001118,
-0.00001421,
-0.00000830,
-0.00001294,
-0.00000699,
-0.00000782,
-0.00000718,
-0.00000642,
-0.00000548,
-0.00000427,
-0.00000417,
-0.00000440,
-0.00000377,
-0.00000253,
-0.00000456,
-0.00000202,
-0.00000373,
-0.00000325,
-0.00000341,
-0.00000232,
-0.00000301,
-0.00000117,
-0.00000319,
-0.00000169,
-0.00000286,
-0.00000184,
-0.00000260,
-0.00000212,
-0.00000293,
-0.00000175,
-0.00000229,
-0.00000126,
-0.00000232,
-0.00000099,
-0.00000250,
-0.00000135,
-0.00000090,
-0.00000289,
-0.00000070,
-0.00000210,
-0.00000118,
-0.00000072,
-0.00000182,
-0.00000111
-        };
-      //Add multispectral bands to the temporary list
-      const std::vector<float> vb0 (b0, b0 + sizeof(b0) / sizeof(float) );
-      const std::vector<float> vb1 (b1, b1 + sizeof(b1) / sizeof(float) );
-      const std::vector<float> vb2 (b2, b2 + sizeof(b2) / sizeof(float) );
-      const std::vector<float> vb3 (b3, b3 + sizeof(b3) / sizeof(float) );
-      //For Spot6 MS image the order of band is: B2 B1 B0 B3
-      //(BandIndexToWavelength method could be used here)
-      tmpSpectralBandList.push_back(vb2);
-      tmpSpectralBandList.push_back(vb1);
-      tmpSpectralBandList.push_back(vb0);
-      tmpSpectralBandList.push_back(vb3);
+      //add panchromatic band to the temporary list
+      const std::vector<float> vpan (pan, pan + sizeof(pan) / sizeof(float) );
+      tmpSpectralBandList.push_back(vpan);
       }
     else
       {
-      itkExceptionMacro(<< "Invalid Spot6 Sensor ID");
-      }
+    itkExceptionMacro(<< "Invalid Spot6 Sensor ID");
     }
-  else
-    {
+    }
+    else if (nbBands > 1 && nbBands < 5)
+      {
+    if (sensorId == "SPOT 6") // todo: updated values for Spot7
+      {
+    //band B0 (blue band)
+    const float b0[601] =
+      {
+    0.00006627f,
+      0.00006114f,
+      0.00005964f,
+      0.00006755f,
+      0.00007354f,
+      0.00007335f,
+      0.00007303f,
+      0.00006988f,
+      0.00006669f,
+      0.00006467f,
+      0.00008891f,
+      0.00010731f,
+      0.00006420f,
+      0.00008781f,
+      0.00008978f,
+      0.00008292f,
+      0.00008193f,
+      0.00005499f,
+      0.00008203f,
+      0.00011262f,
+      0.00009092f,
+      0.00010575f,
+      0.00013926f,
+      0.00016613f,
+      0.00019666f,
+      0.00019375f,
+      0.00021841f,
+      0.00033008f,
+      0.00059283f,
+      0.00096710f,
+      0.00120426f,
+      0.00143132f,
+      0.00190776f,
+      0.00246548f,
+      0.00314995f,
+      0.00393858f,
+      0.00502501f,
+      0.00693758f,
+      0.00995331f,
+      0.01395395f,
+      0.01816332f,
+      0.02248784f,
+      0.02806060f,
+      0.03582005f,
+      0.04774668f,
+      0.06795621f,
+      0.09842750f,
+      0.13108997f,
+      0.16221496f,
+      0.20486488f,
+      0.26488470f,
+      0.33784410f,
+      0.41558626f,
+      0.48567541f,
+      0.54882896f,
+      0.61466150f,
+      0.68475833f,
+      0.75228611f,
+      0.80736646f,
+      0.84246227f,
+      0.85754473f,
+      0.85841741f,
+      0.85407547f,
+      0.85129313f,
+      0.85144931f,
+      0.85321674f,
+      0.85405128f,
+      0.85387063f,
+      0.85555834f,
+      0.86252514f,
+      0.87558536f,
+      0.89251130f,
+      0.90900546f,
+      0.92154349f,
+      0.92918777f,
+      0.93306769f,
+      0.93515923f,
+      0.93666027f,
+      0.93739349f,
+      0.93661481f,
+      0.93379608f,
+      0.92929650f,
+      0.92442581f,
+      0.92058032f,
+      0.91895381f,
+      0.92090421f,
+      0.92631122f,
+      0.93455782f,
+      0.94463030f,
+      0.95473194f,
+      0.96364502f,
+      0.97043568f,
+      0.97436437f,
+      0.97495098f,
+      0.97200508f,
+      0.96636029f,
+      0.95962307f,
+      0.95371958f,
+      0.95061152f,
+      0.95192705f,
+      0.95818895f,
+      0.96856416f,
+      0.98070274f,
+      0.99142860f,
+      0.99788650f,
+      1.00000000f,
+      0.99910819f,
+      0.99808156f,
+      0.99650360f,
+      0.99314712f,
+      0.98404465f,
+      0.96550845f,
+      0.93867401f,
+      0.90804427f,
+      0.87480177f,
+      0.83387151f,
+      0.77606904f,
+      0.69859059f,
+      0.60871934f,
+      0.51759429f,
+      0.43125686f,
+      0.34977809f,
+      0.27392459f,
+      0.20473488f,
+      0.14738691f,
+      0.10459452f,
+      0.07555179f,
+      0.05654570f,
+      0.04380857f,
+      0.03477386f,
+      0.02793581f,
+      0.02225302f,
+      0.01751704f,
+      0.01359022f,
+      0.01046026f,
+      0.00814691f,
+      0.00649078f,
+      0.00530930f,
+      0.00446096f,
+      0.00383097f,
+      0.00333164f,
+      0.00292664f,
+      0.00257637f,
+      0.00225949f,
+      0.00198202f,
+      0.00172287f,
+      0.00150439f,
+      0.00130359f,
+      0.00113903f,
+      0.00099076f,
+      0.00086925f,
+      0.00076142f,
+      0.00067853f,
+      0.00060841f,
+      0.00055953f,
+      0.00051880f,
+      0.00049699f,
+      0.00047445f,
+      0.00045863f,
+      0.00044229f,
+      0.00042470f,
+      0.00040647f,
+      0.00038780f,
+      0.00035963f,
+      0.00033330f,
+      0.00029660f,
+      0.00027179f,
+      0.00024451f,
+      0.00022875f,
+      0.00021524f,
+      0.00021255f,
+      0.00021004f,
+      0.00021079f,
+      0.00021138f,
+      0.00021521f,
+      0.00021336f,
+      0.00021459f,
+      0.00020993f,
+      0.00020747f,
+      0.00019888f,
+      0.00019065f,
+      0.00018249f,
+      0.00017164f,
+      0.00016473f,
+      0.00015826f,
+      0.00015437f,
+      0.00015378f,
+      0.00015002f,
+      0.00015089f,
+      0.00015050f,
+      0.00015245f,
+      0.00015136f,
+      0.00015264f,
+      0.00015147f,
+      0.00015009f,
+      0.00014792f,
+      0.00014493f,
+      0.00014083f,
+      0.00013665f,
+      0.00013056f,
+      0.00012700f,
+      0.00012212f,
+      0.00011620f,
+      0.00011384f,
+      0.00010918f,
+      0.00010782f,
+      0.00010377f,
+      0.00010231f,
+      0.00010126f,
+      0.00010021f,
+      0.00009925f,
+      0.00009923f,
+      0.00009906f,
+      0.00009850f,
+      0.00009892f,
+      0.00009742f,
+      0.00009802f,
+      0.00009809f,
+      0.00009662f,
+      0.00009692f,
+      0.00009575f,
+      0.00009546f,
+      0.00009575f,
+      0.00009469f,
+      0.00009485f,
+      0.00009453f,
+      0.00009384f,
+      0.00009463f,
+      0.00009451f,
+      0.00009458f,
+      0.00009520f,
+      0.00009478f,
+      0.00009588f,
+      0.00009579f,
+      0.00009545f,
+      0.00009560f,
+      0.00009549f,
+      0.00009549f,
+      0.00009551f,
+      0.00009535f,
+      0.00009579f,
+      0.00009570f,
+      0.00009544f,
+      0.00009552f,
+      0.00009622f,
+      0.00009645f,
+      0.00009648f,
+      0.00009799f,
+      0.00009797f,
+      0.00009864f,
+      0.00009916f,
+      0.00010183f,
+      0.00010153f,
+      0.00010358f,
+      0.00010461f,
+      0.00010712f,
+      0.00010718f,
+      0.00011085f,
+      0.00011321f,
+      0.00011173f,
+      0.00011398f,
+      0.00011982f,
+      0.00011831f,
+      0.00012135f,
+      0.00012902f,
+      0.00012720f,
+      0.00013658f,
+      0.00013538f,
+      0.00014397f,
+      0.00014356f,
+      0.00015119f,
+      0.00015202f,
+      0.00015693f,
+      0.00015686f,
+      0.00015130f,
+      0.00015184f,
+      0.00013690f,
+      0.00013092f,
+      0.00013335f,
+      0.00011361f,
+      0.00010715f,
+      0.00010823f,
+      0.00009932f,
+      0.00009856f,
+      0.00009765f,
+      0.00009914f,
+      0.00010008f,
+      0.00010777f,
+      0.00010686f,
+      0.00011218f,
+      0.00012769f,
+      0.00012456f,
+      0.00014074f,
+      0.00014680f,
+      0.00014400f,
+      0.00015360f,
+      0.00015552f,
+      0.00015166f,
+      0.00015221f,
+      0.00014625f,
+      0.00014561f,
+      0.00013613f,
+      0.00013172f,
+      0.00013242f,
+      0.00012141f,
+      0.00012300f,
+      0.00011836f,
+      0.00010821f,
+      0.00010974f,
+      0.00010309f,
+      0.00010302f,
+      0.00010127f,
+      0.00009629f,
+      0.00009854f,
+      0.00009280f,
+      0.00009475f,
+      0.00009054f,
+      0.00009196f,
+      0.00008822f,
+      0.00008866f,
+      0.00008744f,
+      0.00008550f,
+      0.00008673f,
+      0.00008483f,
+      0.00008628f,
+      0.00008449f,
+      0.00009254f,
+      0.00008532f,
+      0.00009594f,
+      0.00008917f,
+      0.00009084f,
+      0.00010183f,
+      0.00009128f,
+      0.00010000f,
+      0.00008800f,
+      0.00009430f,
+      0.00008055f,
+      0.00008475f,
+      0.00007796f,
+      0.00007850f,
+      0.00007713f,
+      0.00007770f,
+      0.00007623f,
+      0.00007664f,
+      0.00007474f,
+      0.00007405f,
+      0.00007519f,
+      0.00007318f,
+      0.00007349f,
+      0.00007204f,
+      0.00007375f,
+      0.00007369f,
+      0.00007149f,
+      0.00007148f,
+      0.00007312f,
+      0.00007167f,
+      0.00007255f,
+      0.00007120f,
+      0.00007186f,
+      0.00007087f,
+      0.00007145f,
+      0.00007024f,
+      0.00007096f,
+      0.00007041f,
+      0.00007088f,
+      0.00006995f,
+      0.00007149f,
+      0.00006924f,
+      0.00007103f,
+      0.00006949f,
+      0.00007093f,
+      0.00006951f,
+      0.00007194f,
+      0.00007193f,
+      0.00006859f,
+      0.00006781f,
+      0.00007056f,
+      0.00006741f,
+      0.00006870f,
+      0.00006628f,
+      0.00006687f,
+      0.00006601f,
+      0.00006595f,
+      0.00006670f,
+      0.00006450f,
+      0.00006595f,
+      0.00006433f,
+      0.00006569f,
+      0.00006431f,
+      0.00006573f,
+      0.00006406f,
+      0.00006507f,
+      0.00006298f,
+      0.00006428f,
+      0.00006201f,
+      0.00006357f,
+      0.00006101f,
+      0.00006096f,
+      0.00006309f,
+      0.00006103f,
+      0.00006314f,
+      0.00006382f,
+      0.00006164f,
+      0.00006245f,
+      0.00006061f,
+      0.00005973f,
+      0.00006261f,
+      0.00005982f,
+      0.00006197f,
+      0.00005956f,
+      0.00006099f,
+      0.00005881f,
+      0.00005972f,
+      0.00006005f,
+      0.00005691f,
+      0.00005647f,
+      0.00005823f,
+      0.00005603f,
+      0.00005759f,
+      0.00005605f,
+      0.00005558f,
+      0.00005646f,
+      0.00005480f,
+      0.00005543f,
+      0.00005551f,
+      0.00005357f,
+      0.00005295f,
+      0.00005549f,
+      0.00005286f,
+      0.00005495f,
+      0.00005278f,
+      0.00005414f,
+      0.00005475f,
+      0.00005169f,
+      0.00005307f,
+      0.00005117f,
+      0.00005068f,
+      0.00005036f,
+      0.00005270f,
+      0.00004991f,
+      0.00005177f,
+      0.00005900f,
+      0.00004889f,
+      0.00006116f,
+      0.00005285f,
+      0.00006427f,
+      0.00005589f,
+      0.00006943f,
+      0.00006195f,
+      0.00007219f,
+      0.00007275f,
+      0.00006694f,
+      0.00007232f,
+      0.00006712f,
+      0.00007044f,
+      0.00006607f,
+      0.00007040f,
+      0.00007120f,
+      0.00006047f,
+      0.00006863f,
+      0.00006547f,
+      0.00005919f,
+      0.00006852f,
+      0.00005996f,
+      0.00006589f,
+      0.00006938f,
+      0.00006013f,
+      0.00007365f,
+      0.00006702f,
+      0.00007595f,
+      0.00008089f,
+      0.00006987f,
+      0.00008784f,
+      0.00007751f,
+      0.00009504f,
+      0.00010978f,
+      0.00008984f,
+      0.00012777f,
+      0.00010534f,
+      0.00014784f,
+      0.00012341f,
+      0.00017455f,
+      0.00018601f,
+      0.00015342f,
+      0.00020484f,
+      0.00017984f,
+      0.00018931f,
+      0.00022557f,
+      0.00022780f,
+      0.00021393f,
+      0.00022939f,
+      0.00023016f,
+      0.00021920f,
+      0.00021508f,
+      0.00022046f,
+      0.00020159f,
+      0.00021016f,
+      0.00018988f,
+      0.00019842f,
+      0.00017117f,
+      0.00018205f,
+      0.00015240f,
+      0.00014443f,
+      0.00015946f,
+      0.00014629f,
+      0.00012207f,
+      0.00013127f,
+      0.00010545f,
+      0.00011422f,
+      0.00009446f,
+      0.00009843f,
+      0.00008316f,
+      0.00008914f,
+      0.00008435f,
+      0.00006511f,
+      0.00007269f,
+      0.00006160f,
+      0.00006279f,
+      0.00005814f,
+      0.00005882f,
+      0.00005406f,
+      0.00005351f,
+      0.00005183f,
+      0.00005084f,
+      0.00004786f,
+      0.00004877f,
+      0.00004859f,
+      0.00004583f,
+      0.00004279f,
+      0.00004263f,
+      0.00004130f,
+      0.00004093f,
+      0.00004059f,
+      0.00004012f,
+      0.00004037f,
+      0.00004396f,
+      0.00004304f,
+      0.00004054f,
+      0.00004200f,
+      0.00004073f,
+      0.00004199f,
+      0.00004077f,
+      0.00004125f,
+      0.00003820f,
+      0.00003723f,
+      0.00003610f,
+      0.00003503f,
+      0.00003232f,
+      0.00003214f,
+      0.00003263f,
+      0.00003065f,
+      0.00003127f,
+      0.00002955f,
+      0.00002956f,
+      0.00002840f,
+      0.00002896f,
+      0.00002780f,
+      0.00002805f,
+      0.00002680f,
+      0.00002585f,
+      0.00002704f,
+      0.00002540f,
+      0.00002576f,
+      0.00002438f,
+      0.00002409f,
+      0.00002110f,
+      0.00002288f,
+      0.00001930f,
+      0.00002147f,
+      0.00001830f,
+      0.00001907f,
+      0.00001917f,
+      0.00001634f,
+      0.00001778f,
+      0.00001705f,
+      0.00001506f,
+      0.00001555f,
+      0.00001544f,
+      0.00001376f,
+      0.00001432f,
+      0.00001256f,
+      0.00001321f,
+      0.00001143f,
+      0.00001207f,
+      0.00001040f,
+      0.00001079f,
+      0.00001077f,
+      0.00000938f,
+      0.00000992f,
+      0.00000926f,
+      0.00000875f,
+      0.00000915f,
+      0.00000791f,
+      0.00000858f,
+      0.00000757f,
+      0.00000885f,
+      0.00000740f,
+      0.00000859f,
+      0.00000871f,
+      0.00000732f,
+      0.00000711f
+      };
+    //B1 green band
+    const float b1[601] =
+      {
+    0.00001010f,
+      0.00001389f,
+      0.00001902f,
+      0.00001356f,
+      0.00001327f,
+      0.00002873f,
+      0.00003122f,
+      0.00002184f,
+      0.00002860f,
+      0.00002274f,
+      0.00006723f,
+      0.00008343f,
+      0.00001226f,
+      0.00006171f,
+      0.00005563f,
+      0.00004426f,
+      0.00004539f,
+      0.00000677f,
+      0.00002035f,
+      0.00001522f,
+      0.00000528f,
+      0.00001865f,
+      0.00001834f,
+      0.00002028f,
+      0.00001608f,
+      0.00000017f,
+      0.00000057f,
+      0.00001313f,
+      0.00001658f,
+      0.00000224f,
+      0.00001983f,
+      0.00001885f,
+      0.00001859f,
+      0.00001975f,
+      0.00000023f,
+      0.00000139f,
+      0.00001634f,
+      0.00001789f,
+      0.00000616f,
+      0.00002267f,
+      0.00001903f,
+      0.00001956f,
+      0.00001844f,
+      0.00000342f,
+      0.00001448f,
+      0.00001340f,
+      0.00000774f,
+      0.00001880f,
+      0.00001632f,
+      0.00001912f,
+      0.00001915f,
+      0.00000950f,
+      0.00000865f,
+      0.00000927f,
+      0.00001089f,
+      0.00001236f,
+      0.00001349f,
+      0.00001273f,
+      0.00001062f,
+      0.00000958f,
+      0.00000938f,
+      0.00000973f,
+      0.00000998f,
+      0.00001014f,
+      0.00001042f,
+      0.00001060f,
+      0.00001115f,
+      0.00001174f,
+      0.00001254f,
+      0.00001338f,
+      0.00001400f,
+      0.00001431f,
+      0.00001481f,
+      0.00001528f,
+      0.00001646f,
+      0.00001812f,
+      0.00001991f,
+      0.00002232f,
+      0.00002548f,
+      0.00002855f,
+      0.00003235f,
+      0.00003705f,
+      0.00004200f,
+      0.00004766f,
+      0.00005414f,
+      0.00006070f,
+      0.00006821f,
+      0.00007648f,
+      0.00008464f,
+      0.00009410f,
+      0.00010524f,
+      0.00011803f,
+      0.00013402f,
+      0.00015319f,
+      0.00017614f,
+      0.00020243f,
+      0.00023094f,
+      0.00026260f,
+      0.00029673f,
+      0.00033499f,
+      0.00038048f,
+      0.00043594f,
+      0.00050952f,
+      0.00061362f,
+      0.00076395f,
+      0.00097908f,
+      0.00126923f,
+      0.00163382f,
+      0.00207590f,
+      0.00261314f,
+      0.00327921f,
+      0.00413303f,
+      0.00526369f,
+      0.00684627f,
+      0.00915649f,
+      0.01267648f,
+      0.01800685f,
+      0.02585007f,
+      0.03667779f,
+      0.05118064f,
+      0.07035894f,
+      0.09617429f,
+      0.13094754f,
+      0.17727190f,
+      0.23641290f,
+      0.30751157f,
+      0.38790047f,
+      0.47436827f,
+      0.56468213f,
+      0.65643377f,
+      0.74674718f,
+      0.82841738f,
+      0.89713046f,
+      0.94858047f,
+      0.98476388f,
+      1.00572477f,
+      1.01799762f,
+      1.02241761f,
+      1.02351216f,
+      1.02270186f,
+      1.02115905f,
+      1.01965328f,
+      1.01731773f,
+      1.01540955f,
+      1.01129946f,
+      1.00955329f,
+      1.00573235f,
+      1.00407549f,
+      1.00164097f,
+      1.00130077f,
+      0.99962912f,
+      1.00130006f,
+      1.00140898f,
+      1.00384853f,
+      1.00599723f,
+      1.00910590f,
+      1.01051975f,
+      1.01099594f,
+      1.00890543f,
+      1.00483865f,
+      0.99901144f,
+      0.99220799f,
+      0.98468953f,
+      0.97823873f,
+      0.97314859f,
+      0.97022501f,
+      0.96868569f,
+      0.97004107f,
+      0.97166154f,
+      0.97626613f,
+      0.98067188f,
+      0.98683373f,
+      0.99219054f,
+      0.99666299f,
+      1.00000000f,
+      0.99912543f,
+      0.99696320f,
+      0.99036225f,
+      0.98384547f,
+      0.97519907f,
+      0.96391617f,
+      0.94573906f,
+      0.91096960f,
+      0.85904551f,
+      0.79290657f,
+      0.72361833f,
+      0.65257621f,
+      0.57623116f,
+      0.48870213f,
+      0.39405229f,
+      0.29840580f,
+      0.21347365f,
+      0.14739732f,
+      0.10143634f,
+      0.07106678f,
+      0.05101665f,
+      0.03753145f,
+      0.02803887f,
+      0.02107987f,
+      0.01582745f,
+      0.01178705f,
+      0.00868732f,
+      0.00634606f,
+      0.00461992f,
+      0.00337907f,
+      0.00250694f,
+      0.00189987f,
+      0.00147499f,
+      0.00117574f,
+      0.00096470f,
+      0.00080813f,
+      0.00069267f,
+      0.00060187f,
+      0.00053101f,
+      0.00046977f,
+      0.00041864f,
+      0.00037515f,
+      0.00033197f,
+      0.00029595f,
+      0.00026098f,
+      0.00022974f,
+      0.00020299f,
+      0.00017878f,
+      0.00015870f,
+      0.00014470f,
+      0.00012912f,
+      0.00012281f,
+      0.00011148f,
+      0.00010580f,
+      0.00010508f,
+      0.00009942f,
+      0.00009982f,
+      0.00009664f,
+      0.00009667f,
+      0.00009589f,
+      0.00009628f,
+      0.00009600f,
+      0.00009459f,
+      0.00009484f,
+      0.00009162f,
+      0.00009246f,
+      0.00008883f,
+      0.00008616f,
+      0.00008688f,
+      0.00008318f,
+      0.00008295f,
+      0.00008153f,
+      0.00008262f,
+      0.00008265f,
+      0.00008855f,
+      0.00009224f,
+      0.00008974f,
+      0.00010120f,
+      0.00010537f,
+      0.00010299f,
+      0.00011271f,
+      0.00011213f,
+      0.00011810f,
+      0.00011639f,
+      0.00011824f,
+      0.00011152f,
+      0.00011302f,
+      0.00010361f,
+      0.00010441f,
+      0.00009482f,
+      0.00009519f,
+      0.00008675f,
+      0.00008735f,
+      0.00008078f,
+      0.00008067f,
+      0.00007509f,
+      0.00007486f,
+      0.00006895f,
+      0.00006944f,
+      0.00006375f,
+      0.00006358f,
+      0.00005878f,
+      0.00005896f,
+      0.00005523f,
+      0.00005501f,
+      0.00005343f,
+      0.00005281f,
+      0.00005140f,
+      0.00005170f,
+      0.00005134f,
+      0.00005138f,
+      0.00005107f,
+      0.00005085f,
+      0.00005096f,
+      0.00005018f,
+      0.00005046f,
+      0.00004904f,
+      0.00004833f,
+      0.00004769f,
+      0.00004781f,
+      0.00004694f,
+      0.00004600f,
+      0.00004584f,
+      0.00004562f,
+      0.00004584f,
+      0.00004525f,
+      0.00004562f,
+      0.00004612f,
+      0.00004747f,
+      0.00004854f,
+      0.00004734f,
+      0.00004932f,
+      0.00004894f,
+      0.00005047f,
+      0.00004972f,
+      0.00005030f,
+      0.00005129f,
+      0.00004999f,
+      0.00005048f,
+      0.00004864f,
+      0.00004901f,
+      0.00004923f,
+      0.00004719f,
+      0.00004950f,
+      0.00004776f,
+      0.00005348f,
+      0.00005702f,
+      0.00005214f,
+      0.00006320f,
+      0.00005556f,
+      0.00007144f,
+      0.00005903f,
+      0.00005649f,
+      0.00007807f,
+      0.00004800f,
+      0.00004042f,
+      0.00005618f,
+      0.00002571f,
+      0.00003251f,
+      0.00002175f,
+      0.00000592f,
+      0.00001077f,
+      0.00000286f,
+      0.00000380f,
+      0.00000323f,
+      0.00000149f,
+      0.00000247f,
+      0.00000112f,
+      0.00000145f,
+      0.00000111f,
+      0.00000139f,
+      0.00000105f,
+      0.00000141f,
+      0.00000097f,
+      0.00000085f,
+      0.00000123f,
+      0.00000158f,
+      0.00000089f,
+      0.00000137f,
+      0.00000086f,
+      0.00000158f,
+      0.00000202f,
+      0.00000091f,
+      0.00000174f,
+      0.00000102f,
+      0.00000200f,
+      0.00000128f,
+      0.00000479f,
+      0.00000149f,
+      0.00000719f,
+      0.00000417f,
+      0.00000502f,
+      0.00000963f,
+      0.00000561f,
+      0.00000984f,
+      0.00000949f,
+      0.00000318f,
+      0.00000643f,
+      0.00000153f,
+      0.00000184f,
+      0.00000116f,
+      0.00000173f,
+      0.00000086f,
+      0.00000185f,
+      0.00000089f,
+      0.00000193f,
+      0.00000096f,
+      0.00000196f,
+      0.00000116f,
+      0.00000200f,
+      0.00000115f,
+      0.00000195f,
+      0.00000131f,
+      0.00000197f,
+      0.00000125f,
+      0.00000187f,
+      0.00000099f,
+      0.00000070f,
+      0.00000049f,
+      0.00000119f,
+      0.00000051f,
+      0.00000135f,
+      0.00000086f,
+      0.00000153f,
+      0.00000104f,
+      0.00000186f,
+      0.00000156f,
+      0.00000205f,
+      0.00000293f,
+      0.00000170f,
+      0.00000296f,
+      0.00000182f,
+      0.00000266f,
+      0.00000171f,
+      0.00000236f,
+      0.00000240f,
+      0.00000093f,
+      0.00000174f,
+      0.00000183f,
+      0.00000096f,
+      0.00000144f,
+      0.00000177f,
+      0.00000076f,
+      0.00000198f,
+      0.00000079f,
+      0.00000160f,
+      0.00000058f,
+      0.00000154f,
+      0.00000070f,
+      0.00000161f,
+      0.00000076f,
+      0.00000068f,
+      0.00000245f,
+      0.00000079f,
+      0.00000299f,
+      0.00000128f,
+      0.00000285f,
+      0.00000154f,
+      0.00000296f,
+      0.00000178f,
+      0.00000333f,
+      0.00000130f,
+      0.00000347f,
+      0.00000220f,
+      0.00000159f,
+      0.00000449f,
+      0.00000188f,
+      0.00000635f,
+      0.00000903f,
+      0.00000344f,
+      0.00001051f,
+      0.00000601f,
+      0.00000991f,
+      0.00001299f,
+      0.00000632f,
+      0.00001514f,
+      0.00000941f,
+      0.00001426f,
+      0.00000749f,
+      0.00001524f,
+      0.00000887f,
+      0.00000743f,
+      0.00001404f,
+      0.00000558f,
+      0.00001092f,
+      0.00001135f,
+      0.00000460f,
+      0.00001024f,
+      0.00000547f,
+      0.00001036f,
+      0.00000503f,
+      0.00001140f,
+      0.00000557f,
+      0.00001124f,
+      0.00000612f,
+      0.00001120f,
+      0.00000642f,
+      0.00001093f,
+      0.00000638f,
+      0.00001191f,
+      0.00000531f,
+      0.00000907f,
+      0.00000487f,
+      0.00000794f,
+      0.00000998f,
+      0.00000316f,
+      0.00000322f,
+      0.00001260f,
+      0.00000365f,
+      0.00000446f,
+      0.00001209f,
+      0.00000567f,
+      0.00001173f,
+      0.00000705f,
+      0.00001006f,
+      0.00000466f,
+      0.00000325f,
+      0.00000921f,
+      0.00000755f,
+      0.00000493f,
+      0.00000922f,
+      0.00000673f,
+      0.00001643f,
+      0.00001135f,
+      0.00001160f,
+      0.00002335f,
+      0.00001573f,
+      0.00002364f,
+      0.00001931f,
+      0.00002613f,
+      0.00002318f,
+      0.00001698f,
+      0.00001954f,
+      0.00001127f,
+      0.00001395f,
+      0.00001618f,
+      0.00000862f,
+      0.00001383f,
+      0.00000962f,
+      0.00000696f,
+      0.00000696f,
+      0.00000561f,
+      0.00000807f,
+      0.00000905f,
+      0.00000632f,
+      0.00000850f,
+      0.00000820f,
+      0.00001222f,
+      0.00000921f,
+      0.00001027f,
+      0.00001204f,
+      0.00001323f,
+      0.00001373f,
+      0.00001579f,
+      0.00001521f,
+      0.00002156f,
+      0.00001894f,
+      0.00002375f,
+      0.00002243f,
+      0.00002409f,
+      0.00002019f,
+      0.00002182f,
+      0.00001452f,
+      0.00001755f,
+      0.00001475f,
+      0.00000805f,
+      0.00001071f,
+      0.00000537f,
+      0.00000682f,
+      0.00000663f,
+      0.00000526f,
+      0.00000418f,
+      0.00000477f,
+      0.00000426f,
+      0.00000405f,
+      0.00000367f,
+      0.00000399f,
+      0.00000340f,
+      0.00000339f,
+      0.00000169f,
+      0.00000178f,
+      0.00000242f,
+      0.00000171f,
+      0.00000172f,
+      0.00000233f,
+      0.00000182f,
+      0.00000230f,
+      0.00000204f,
+      0.00000245f,
+      0.00000243f,
+      0.00000136f,
+      0.00000259f,
+      0.00000105f,
+      0.00000239f,
+      0.00000090f,
+      0.00000213f,
+      0.00000104f,
+      0.00000226f,
+      0.00000088f,
+      0.00000229f,
+      0.00000065f,
+      0.00000246f,
+      0.00000063f,
+      0.00000238f,
+      0.00000072f,
+      0.00000210f,
+      0.00000091f,
+      0.00000122f,
+      0.00000184f,
+      0.00000177f,
+      0.00000066f,
+      0.00000153f,
+      0.00000065f,
+      0.00000147f,
+      0.00000054f,
+      0.00000145f,
+      0.00000023f,
+      0.00000134f,
+      0.00000029f,
+      0.00000141f,
+      0.00000045f,
+      0.00000127f,
+      0.00000146f,
+      0.00000040f,
+      0.00000142f,
+      0.00000038f
+      };
+    //B2 red band
+    const float b2[601] =
+      {
+    0.00001168f,
+      0.00001419f,
+      0.00001348f,
+      0.00000996f,
+      0.00001009f,
+      0.00001366f,
+      0.00003289f,
+      0.00001748f,
+      0.00002207f,
+      0.00002377f,
+      0.00002383f,
+      0.00002470f,
+      0.00001811f,
+      0.00001353f,
+      0.00001155f,
+      0.00001303f,
+      0.00001374f,
+      0.00001126f,
+      0.00000712f,
+      0.00000464f,
+      0.00000438f,
+      0.00000381f,
+      0.00000312f,
+      0.00000581f,
+      0.00000319f,
+      0.00000473f,
+      0.00000585f,
+      0.00000644f,
+      0.00000967f,
+      0.00000918f,
+      0.00000742f,
+      0.00001090f,
+      0.00001649f,
+      0.00002016f,
+      0.00001631f,
+      0.00001673f,
+      0.00001578f,
+      0.00001766f,
+      0.00002209f,
+      0.00003114f,
+      0.00003091f,
+      0.00001848f,
+      0.00003451f,
+      0.00003492f,
+      0.00004332f,
+      0.00004770f,
+      0.00004658f,
+      0.00004547f,
+      0.00004239f,
+      0.00005155f,
+      0.00005834f,
+      0.00006365f,
+      0.00005824f,
+      0.00004581f,
+      0.00003799f,
+      0.00003584f,
+      0.00003689f,
+      0.00003817f,
+      0.00003951f,
+      0.00004017f,
+      0.00003987f,
+      0.00003754f,
+      0.00003651f,
+      0.00003781f,
+      0.00003645f,
+      0.00003408f,
+      0.00003160f,
+      0.00003251f,
+      0.00003509f,
+      0.00003935f,
+      0.00004494f,
+      0.00005115f,
+      0.00005707f,
+      0.00006145f,
+      0.00006038f,
+      0.00005716f,
+      0.00005354f,
+      0.00004978f,
+      0.00004759f,
+      0.00004735f,
+      0.00005985f,
+      0.00006501f,
+      0.00005803f,
+      0.00006474f,
+      0.00006650f,
+      0.00006908f,
+      0.00006585f,
+      0.00005102f,
+      0.00003616f,
+      0.00002648f,
+      0.00002034f,
+      0.00001645f,
+      0.00001363f,
+      0.00001142f,
+      0.00000950f,
+      0.00000755f,
+      0.00000648f,
+      0.00000560f,
+      0.00000476f,
+      0.00000466f,
+      0.00000444f,
+      0.00000389f,
+      0.00000408f,
+      0.00000399f,
+      0.00000392f,
+      0.00000436f,
+      0.00000413f,
+      0.00000397f,
+      0.00000424f,
+      0.00000400f,
+      0.00000389f,
+      0.00000385f,
+      0.00000390f,
+      0.00000379f,
+      0.00000357f,
+      0.00000383f,
+      0.00000386f,
+      0.00000378f,
+      0.00000439f,
+      0.00000377f,
+      0.00000416f,
+      0.00000494f,
+      0.00000455f,
+      0.00000553f,
+      0.00000605f,
+      0.00000613f,
+      0.00000672f,
+      0.00000696f,
+      0.00000744f,
+      0.00000760f,
+      0.00000766f,
+      0.00000770f,
+      0.00000725f,
+      0.00000682f,
+      0.00000716f,
+      0.00000758f,
+      0.00000759f,
+      0.00000722f,
+      0.00000805f,
+      0.00000826f,
+      0.00000816f,
+      0.00000835f,
+      0.00000798f,
+      0.00000798f,
+      0.00000796f,
+      0.00000817f,
+      0.00000856f,
+      0.00000897f,
+      0.00000920f,
+      0.00000935f,
+      0.00000980f,
+      0.00001003f,
+      0.00000998f,
+      0.00001038f,
+      0.00001044f,
+      0.00001035f,
+      0.00001090f,
+      0.00001143f,
+      0.00001155f,
+      0.00001240f,
+      0.00001322f,
+      0.00001374f,
+      0.00001466f,
+      0.00001507f,
+      0.00001561f,
+      0.00001799f,
+      0.00001806f,
+      0.00001990f,
+      0.00002207f,
+      0.00002400f,
+      0.00002768f,
+      0.00003153f,
+      0.00003519f,
+      0.00003855f,
+      0.00004048f,
+      0.00004339f,
+      0.00004685f,
+      0.00004712f,
+      0.00004885f,
+      0.00005031f,
+      0.00005058f,
+      0.00005380f,
+      0.00006109f,
+      0.00006875f,
+      0.00008360f,
+      0.00010367f,
+      0.00013385f,
+      0.00017220f,
+      0.00021349f,
+      0.00025613f,
+      0.00029745f,
+      0.00033957f,
+      0.00038077f,
+      0.00042014f,
+      0.00045664f,
+      0.00049082f,
+      0.00052462f,
+      0.00057202f,
+      0.00064046f,
+      0.00073788f,
+      0.00088389f,
+      0.00109195f,
+      0.00138377f,
+      0.00179072f,
+      0.00234897f,
+      0.00310035f,
+      0.00409611f,
+      0.00539886f,
+      0.00764596f,
+      0.00982485f,
+      0.01250677f,
+      0.01576553f,
+      0.01971871f,
+      0.02460136f,
+      0.03076162f,
+      0.03870973f,
+      0.04932564f,
+      0.06405112f,
+      0.08527458f,
+      0.11683854f,
+      0.16336997f,
+      0.22811553f,
+      0.30778033f,
+      0.39105868f,
+      0.46939880f,
+      0.54633346f,
+      0.62987089f,
+      0.71765372f,
+      0.80227884f,
+      0.87400338f,
+      0.92669327f,
+      0.95728386f,
+      0.97246242f,
+      0.98093913f,
+      0.98815314f,
+      0.99512479f,
+      1.00000000f,
+      1.00071278f,
+      0.99509151f,
+      0.98322813f,
+      0.96618038f,
+      0.94726377f,
+      0.92911907f,
+      0.91427200f,
+      0.90407257f,
+      0.89868685f,
+      0.89729260f,
+      0.90048309f,
+      0.90619876f,
+      0.91486402f,
+      0.92548194f,
+      0.93716217f,
+      0.95109280f,
+      0.96341044f,
+      0.97756310f,
+      0.98873468f,
+      1.00002059f,
+      1.00784176f,
+      1.01361246f,
+      1.01518655f,
+      1.01365106f,
+      1.00889905f,
+      1.00094470f,
+      0.99098939f,
+      0.97907661f,
+      0.96736515f,
+      0.95491923f,
+      0.94403019f,
+      0.93408742f,
+      0.92588661f,
+      0.91979557f,
+      0.91551236f,
+      0.91345541f,
+      0.91406966f,
+      0.91586446f,
+      0.92112352f,
+      0.92637606f,
+      0.93343259f,
+      0.93977000f,
+      0.94511856f,
+      0.94655018f,
+      0.94482431f,
+      0.93695460f,
+      0.92470622f,
+      0.90515848f,
+      0.87651239f,
+      0.84722733f,
+      0.81626058f,
+      0.77926628f,
+      0.74095072f,
+      0.69853161f,
+      0.65530863f,
+      0.60957078f,
+      0.56408506f,
+      0.51760530f,
+      0.47150814f,
+      0.42482252f,
+      0.37706746f,
+      0.32909071f,
+      0.28093192f,
+      0.23513938f,
+      0.19289082f,
+      0.15584587f,
+      0.12438828f,
+      0.09857760f,
+      0.07759031f,
+      0.06074302f,
+      0.04708451f,
+      0.03618668f,
+      0.02749464f,
+      0.02064713f,
+      0.01533676f,
+      0.01131374f,
+      0.00832392f,
+      0.00613477f,
+      0.00454626f,
+      0.00340798f,
+      0.00258536f,
+      0.00199356f,
+      0.00156305f,
+      0.00125005f,
+      0.00101327f,
+      0.00085049f,
+      0.00071368f,
+      0.00062520f,
+      0.00054959f,
+      0.00049985f,
+      0.00047162f,
+      0.00043891f,
+      0.00042848f,
+      0.00040347f,
+      0.00038227f,
+      0.00035692f,
+      0.00033769f,
+      0.00030789f,
+      0.00029814f,
+      0.00024879f,
+      0.00021170f,
+      0.00018471f,
+      0.00013393f,
+      0.00012509f,
+      0.00007240f,
+      0.00006419f,
+      0.00003891f,
+      0.00003294f,
+      0.00002353f,
+      0.00002711f,
+      0.00001690f,
+      0.00001474f,
+      0.00001598f,
+      0.00001292f,
+      0.00001366f,
+      0.00001329f,
+      0.00001411f,
+      0.00002354f,
+      0.00009563f,
+      0.00012882f,
+      0.00011528f,
+      0.00001687f,
+      0.00015343f,
+      0.00012777f,
+      0.00015354f,
+      0.00024298f,
+      0.00015520f,
+      0.00024274f,
+      0.00012696f,
+      0.00014910f,
+      0.00000979f,
+      0.00000629f,
+      0.00000738f,
+      0.00000483f,
+      0.00000489f,
+      0.00000536f,
+      0.00000458f,
+      0.00000528f,
+      0.00000438f,
+      0.00000475f,
+      0.00000446f,
+      0.00000488f,
+      0.00000456f,
+      0.00000547f,
+      0.00000448f,
+      0.00000478f,
+      0.00000435f,
+      0.00000470f,
+      0.00000425f,
+      0.00000458f,
+      0.00000435f,
+      0.00000380f,
+      0.00000373f,
+      0.00000298f,
+      0.00000390f,
+      0.00000278f,
+      0.00000290f,
+      0.00000277f,
+      0.00000307f,
+      0.00000247f,
+      0.00000231f,
+      0.00000301f,
+      0.00000293f,
+      0.00000319f,
+      0.00000351f,
+      0.00000323f,
+      0.00000339f,
+      0.00000318f,
+      0.00000318f,
+      0.00000396f,
+      0.00000313f,
+      0.00000364f,
+      0.00000310f,
+      0.00000419f,
+      0.00000349f,
+      0.00000396f,
+      0.00000341f,
+      0.00000365f,
+      0.00000362f,
+      0.00000290f,
+      0.00000345f,
+      0.00000289f,
+      0.00000288f,
+      0.00000429f,
+      0.00000323f,
+      0.00000329f,
+      0.00000329f,
+      0.00000455f,
+      0.00000497f,
+      0.00000353f,
+      0.00000556f,
+      0.00000383f,
+      0.00000507f,
+      0.00000482f,
+      0.00000484f,
+      0.00000546f,
+      0.00000374f,
+      0.00000601f,
+      0.00000422f,
+      0.00000512f,
+      0.00000509f,
+      0.00000286f,
+      0.00000637f,
+      0.00000539f,
+      0.00000579f,
+      0.00000462f,
+      0.00000647f,
+      0.00000604f,
+      0.00000432f,
+      0.00000662f,
+      0.00000521f,
+      0.00000680f,
+      0.00001180f,
+      0.00000638f,
+      0.00000805f,
+      0.00000389f,
+      0.00001200f,
+      0.00001134f,
+      0.00000562f,
+      0.00001181f,
+      0.00000868f,
+      0.00001541f,
+      0.00001086f,
+      0.00001222f,
+      0.00000823f,
+      0.00000960f,
+      0.00000871f,
+      0.00001051f,
+      0.00001235f,
+      0.00000864f,
+      0.00001357f,
+      0.00001158f,
+      0.00001522f,
+      0.00001091f,
+      0.00001237f,
+      0.00000928f,
+      0.00000973f,
+      0.00000865f,
+      0.00001333f,
+      0.00000847f,
+      0.00001329f,
+      0.00000740f,
+      0.00000974f,
+      0.00001229f,
+      0.00001128f,
+      0.00000704f,
+      0.00001244f,
+      0.00000915f,
+      0.00001448f,
+      0.00001164f,
+      0.00000861f,
+      0.00001441f,
+      0.00000700f,
+      0.00001461f,
+      0.00001401f,
+      0.00001007f,
+      0.00001695f,
+      0.00002042f,
+      0.00002108f,
+      0.00003064f,
+      0.00003171f,
+      0.00004339f,
+      0.00004171f,
+      0.00005692f,
+      0.00007019f,
+      0.00007121f,
+      0.00007122f,
+      0.00008504f,
+      0.00007450f,
+      0.00008010f,
+      0.00008936f,
+      0.00008826f,
+      0.00008831f,
+      0.00009721f,
+      0.00009019f,
+      0.00008741f,
+      0.00008467f,
+      0.00007373f,
+      0.00006748f,
+      0.00006984f,
+      0.00005307f,
+      0.00004844f,
+      0.00005417f,
+      0.00004482f,
+      0.00004483f,
+      0.00003814f,
+      0.00003524f,
+      0.00002726f,
+      0.00002455f,
+      0.00002566f,
+      0.00002043f,
+      0.00001759f,
+      0.00001473f,
+      0.00001512f,
+      0.00001132f,
+      0.00000862f,
+      0.00001262f,
+      0.00000857f,
+      0.00000918f,
+      0.00000689f,
+      0.00000671f,
+      0.00000434f,
+      0.00000648f,
+      0.00000513f,
+      0.00000748f,
+      0.00000691f,
+      0.00000789f,
+      0.00000754f,
+      0.00000715f,
+      0.00000806f,
+      0.00000701f,
+      0.00000449f,
+      0.00000640f,
+      0.00000595f,
+      0.00000877f,
+      0.00000724f,
+      0.00000837f,
+      0.00000733f,
+      0.00000815f,
+      0.00000621f,
+      0.00000755f,
+      0.00000444f,
+      0.00000580f,
+      0.00000524f,
+      0.00000343f,
+      0.00000356f,
+      0.00000340f,
+      0.00000361f,
+      0.00000245f,
+      0.00000146f,
+      0.00000232f,
+      0.00000165f,
+      0.00000168f,
+      0.00000491f,
+      0.00000168f,
+      0.00000411f,
+      0.00000122f,
+      0.00000367f,
+      0.00000244f,
+      0.00000179f,
+      0.00000395f,
+      0.00000177f,
+      0.00000108f,
+      0.00000330f,
+      0.00000166f,
+      0.00000258f,
+      0.00000204f,
+      0.00000054f,
+      0.00000259f,
+      0.00000133f,
+      0.00000205f,
+      0.00000101f,
+      0.00000210f,
+      0.00000084f,
+      0.00000090f,
+      0.00000176f,
+      0.00000079f,
+      0.00000165f,
+      0.00000071f,
+      0.00000173f,
+      0.00000070f,
+      0.00000043f,
+      0.00000056f,
+      0.00000159f
+      };
+    //B3 nir band
+    const float b3[601] =
+      {
+    0.00000184f,
+      0.00000202f,
+      0.00000371f,
+      0.00000470f,
+      0.00000487f,
+      0.00000512f,
+      0.00000521f,
+      0.00000490f,
+      0.00000308f,
+      0.00000160f,
+      0.00000126f,
+      0.00000131f,
+      0.00000119f,
+      0.00000105f,
+      0.00000082f,
+      0.00000078f,
+      0.00000076f,
+      0.00000059f,
+      0.00000058f,
+      0.00000052f,
+      0.00000064f,
+      0.00000070f,
+      0.00000068f,
+      0.00000068f,
+      0.00000079f,
+      0.00000093f,
+      0.00000124f,
+      0.00000092f,
+      0.00000124f,
+      0.00000117f,
+      0.00000125f,
+      0.00000129f,
+      0.00000121f,
+      0.00000153f,
+      0.00000149f,
+      0.00000148f,
+      0.00000139f,
+      0.00000166f,
+      0.00000211f,
+      0.00000193f,
+      0.00000241f,
+      0.00000211f,
+      0.00000228f,
+      0.00000294f,
+      0.00000406f,
+      0.00000507f,
+      0.00001753f,
+      0.00062612f,
+      0.00099041f,
+      0.00038281f,
+      0.00084800f,
+      0.00090343f,
+      0.00098820f,
+      0.00100027f,
+      0.00030612f,
+      0.00003473f,
+      0.00002650f,
+      0.00002396f,
+      0.00002429f,
+      0.00002735f,
+      0.00003712f,
+      0.00005612f,
+      0.00007768f,
+      0.00008914f,
+      0.00009611f,
+      0.00010759f,
+      0.00011246f,
+      0.00011011f,
+      0.00009290f,
+      0.00006854f,
+      0.00005014f,
+      0.00003890f,
+      0.00003142f,
+      0.00002673f,
+      0.00002266f,
+      0.00002061f,
+      0.00002008f,
+      0.00002029f,
+      0.00002207f,
+      0.00002564f,
+      0.00003063f,
+      0.00003885f,
+      0.00004812f,
+      0.00005996f,
+      0.00007077f,
+      0.00007965f,
+      0.00008609f,
+      0.00008841f,
+      0.00008691f,
+      0.00008090f,
+      0.00007026f,
+      0.00005867f,
+      0.00004706f,
+      0.00003684f,
+      0.00002888f,
+      0.00002252f,
+      0.00001864f,
+      0.00001631f,
+      0.00001512f,
+      0.00001579f,
+      0.00001740f,
+      0.00002076f,
+      0.00002500f,
+      0.00002970f,
+      0.00003324f,
+      0.00003568f,
+      0.00003719f,
+      0.00003637f,
+      0.00003522f,
+      0.00003204f,
+      0.00002806f,
+      0.00002554f,
+      0.00002401f,
+      0.00002509f,
+      0.00002676f,
+      0.00003097f,
+      0.00003703f,
+      0.00004613f,
+      0.00006025f,
+      0.00007876f,
+      0.00010325f,
+      0.00012473f,
+      0.00014349f,
+      0.00015902f,
+      0.00017128f,
+      0.00017677f,
+      0.00017814f,
+      0.00017111f,
+      0.00016498f,
+      0.00016271f,
+      0.00016590f,
+      0.00017244f,
+      0.00018189f,
+      0.00018854f,
+      0.00019224f,
+      0.00019405f,
+      0.00019354f,
+      0.00018898f,
+      0.00018087f,
+      0.00017218f,
+      0.00016359f,
+      0.00015899f,
+      0.00015586f,
+      0.00015606f,
+      0.00015819f,
+      0.00016068f,
+      0.00016530f,
+      0.00016816f,
+      0.00017049f,
+      0.00017164f,
+      0.00017169f,
+      0.00017074f,
+      0.00017054f,
+      0.00016913f,
+      0.00016744f,
+      0.00016766f,
+      0.00016951f,
+      0.00017426f,
+      0.00018167f,
+      0.00019232f,
+      0.00020428f,
+      0.00021790f,
+      0.00023244f,
+      0.00024402f,
+      0.00025416f,
+      0.00026158f,
+      0.00026375f,
+      0.00026297f,
+      0.00026655f,
+      0.00026988f,
+      0.00027504f,
+      0.00028070f,
+      0.00028807f,
+      0.00030046f,
+      0.00031707f,
+      0.00033920f,
+      0.00036610f,
+      0.00039570f,
+      0.00043575f,
+      0.00048703f,
+      0.00053825f,
+      0.00057909f,
+      0.00060314f,
+      0.00061674f,
+      0.00061491f,
+      0.00059039f,
+      0.00054258f,
+      0.00047833f,
+      0.00039787f,
+      0.00031987f,
+      0.00025214f,
+      0.00019590f,
+      0.00015376f,
+      0.00012305f,
+      0.00010304f,
+      0.00008730f,
+      0.00007548f,
+      0.00006686f,
+      0.00006139f,
+      0.00005448f,
+      0.00005006f,
+      0.00004759f,
+      0.00004287f,
+      0.00003904f,
+      0.00003667f,
+      0.00003331f,
+      0.00003138f,
+      0.00002877f,
+      0.00002657f,
+      0.00002417f,
+      0.00002328f,
+      0.00002129f,
+      0.00002036f,
+      0.00001896f,
+      0.00001779f,
+      0.00001738f,
+      0.00001579f,
+      0.00001598f,
+      0.00001498f,
+      0.00001430f,
+      0.00001381f,
+      0.00001310f,
+      0.00001315f,
+      0.00001249f,
+      0.00001236f,
+      0.00001250f,
+      0.00001178f,
+      0.00001194f,
+      0.00001165f,
+      0.00001136f,
+      0.00001177f,
+      0.00001162f,
+      0.00001149f,
+      0.00001162f,
+      0.00001162f,
+      0.00001183f,
+      0.00001163f,
+      0.00001211f,
+      0.00001182f,
+      0.00001142f,
+      0.00001146f,
+      0.00001129f,
+      0.00001064f,
+      0.00001038f,
+      0.00001123f,
+      0.00001061f,
+      0.00001039f,
+      0.00001007f,
+      0.00001068f,
+      0.00001053f,
+      0.00001131f,
+      0.00001150f,
+      0.00001210f,
+      0.00001199f,
+      0.00001228f,
+      0.00001244f,
+      0.00001267f,
+      0.00001226f,
+      0.00001236f,
+      0.00001242f,
+      0.00001236f,
+      0.00001227f,
+      0.00001222f,
+      0.00001218f,
+      0.00001214f,
+      0.00001206f,
+      0.00001202f,
+      0.00001242f,
+      0.00001231f,
+      0.00001283f,
+      0.00001325f,
+      0.00001395f,
+      0.00001410f,
+      0.00001399f,
+      0.00001534f,
+      0.00001580f,
+      0.00001690f,
+      0.00001748f,
+      0.00001885f,
+      0.00001898f,
+      0.00001988f,
+      0.00002137f,
+      0.00002320f,
+      0.00002504f,
+      0.00002641f,
+      0.00002837f,
+      0.00003079f,
+      0.00003251f,
+      0.00003533f,
+      0.00003740f,
+      0.00004081f,
+      0.00004361f,
+      0.00004639f,
+      0.00004986f,
+      0.00005346f,
+      0.00005805f,
+      0.00006226f,
+      0.00006694f,
+      0.00007188f,
+      0.00007800f,
+      0.00008485f,
+      0.00009055f,
+      0.00010008f,
+      0.00010713f,
+      0.00011933f,
+      0.00012975f,
+      0.00014324f,
+      0.00015785f,
+      0.00017539f,
+      0.00019507f,
+      0.00021689f,
+      0.00024318f,
+      0.00027135f,
+      0.00030518f,
+      0.00034281f,
+      0.00039712f,
+      0.00044651f,
+      0.00050188f,
+      0.00056707f,
+      0.00063984f,
+      0.00072378f,
+      0.00081879f,
+      0.00092782f,
+      0.00105511f,
+      0.00120160f,
+      0.00137088f,
+      0.00156792f,
+      0.00180276f,
+      0.00207920f,
+      0.00240799f,
+      0.00280298f,
+      0.00327494f,
+      0.00384821f,
+      0.00454832f,
+      0.00540493f,
+      0.00645469f,
+      0.00774941f,
+      0.00936399f,
+      0.01137832f,
+      0.01388118f,
+      0.01700597f,
+      0.02092752f,
+      0.02586928f,
+      0.03206911f,
+      0.03985523f,
+      0.04956652f,
+      0.06173849f,
+      0.07680296f,
+      0.09550239f,
+      0.11837088f,
+      0.14615821f,
+      0.19110224f,
+      0.23178705f,
+      0.27801636f,
+      0.33031673f,
+      0.38771033f,
+      0.44914649f,
+      0.51370254f,
+      0.57939644f,
+      0.64484781f,
+      0.70835304f,
+      0.76788190f,
+      0.82252523f,
+      0.87063314f,
+      0.91086251f,
+      0.94360264f,
+      0.96734308f,
+      0.98447500f,
+      0.99402844f,
+      0.99904759f,
+      1.00000000f,
+      0.99829749f,
+      0.99534944f,
+      0.99113813f,
+      0.98712837f,
+      0.98344438f,
+      0.97955733f,
+      0.97683333f,
+      0.97381307f,
+      0.97171326f,
+      0.96937935f,
+      0.96682308f,
+      0.96494693f,
+      0.96155704f,
+      0.95914861f,
+      0.95524656f,
+      0.95141098f,
+      0.94725240f,
+      0.94238136f,
+      0.93805030f,
+      0.93299243f,
+      0.92787669f,
+      0.92261726f,
+      0.91765026f,
+      0.91344782f,
+      0.90866986f,
+      0.90481152f,
+      0.90031693f,
+      0.89720732f,
+      0.89342505f,
+      0.89040645f,
+      0.88745245f,
+      0.88446834f,
+      0.88140255f,
+      0.87825555f,
+      0.87487903f,
+      0.87077850f,
+      0.86665463f,
+      0.86193864f,
+      0.85704385f,
+      0.85203260f,
+      0.84608531f,
+      0.84067874f,
+      0.83464870f,
+      0.82847182f,
+      0.82237664f,
+      0.81646034f,
+      0.81067178f,
+      0.80547624f,
+      0.79996761f,
+      0.79538371f,
+      0.79048464f,
+      0.78593335f,
+      0.78246221f,
+      0.77854086f,
+      0.77505353f,
+      0.77183963f,
+      0.76834628f,
+      0.76559075f,
+      0.76238953f,
+      0.75915219f,
+      0.75631414f,
+      0.75288758f,
+      0.74984835f,
+      0.74648701f,
+      0.74311251f,
+      0.73936992f,
+      0.73559705f,
+      0.73163277f,
+      0.72765295f,
+      0.72334537f,
+      0.71892768f,
+      0.71424776f,
+      0.70932732f,
+      0.70417024f,
+      0.69865547f,
+      0.69314542f,
+      0.68706957f,
+      0.68120878f,
+      0.67553032f,
+      0.66989091f,
+      0.66440763f,
+      0.65922988f,
+      0.65415969f,
+      0.64965635f,
+      0.64537477f,
+      0.64153052f,
+      0.63820324f,
+      0.63506916f,
+      0.63264959f,
+      0.62992135f,
+      0.62726732f,
+      0.62445640f,
+      0.62156999f,
+      0.61847181f,
+      0.61501909f,
+      0.61133939f,
+      0.60744762f,
+      0.60314205f,
+      0.59883705f,
+      0.59425662f,
+      0.58928886f,
+      0.58381508f,
+      0.57719033f,
+      0.56857851f,
+      0.55699311f,
+      0.54163099f,
+      0.52202898f,
+      0.49847084f,
+      0.47191641f,
+      0.44270534f,
+      0.41155122f,
+      0.37843868f,
+      0.34304355f,
+      0.30590964f,
+      0.26730226f,
+      0.22805403f,
+      0.18974714f,
+      0.15369596f,
+      0.12145605f,
+      0.09413162f,
+      0.07189929f,
+      0.05457376f,
+      0.04144546f,
+      0.03158417f,
+      0.02425525f,
+      0.01879617f,
+      0.01470317f,
+      0.01163795f,
+      0.00930858f,
+      0.00744330f,
+      0.00607348f,
+      0.00501379f,
+      0.00413379f,
+      0.00347084f,
+      0.00293573f,
+      0.00250919f,
+      0.00215786f,
+      0.00186591f,
+      0.00163284f,
+      0.00142997f,
+      0.00127599f,
+      0.00112918f,
+      0.00102171f,
+      0.00091069f,
+      0.00083541f,
+      0.00075489f,
+      0.00069931f,
+      0.00063879f,
+      0.00059080f,
+      0.00055023f,
+      0.00050660f,
+      0.00047777f,
+      0.00044789f,
+      0.00041317f,
+      0.00039493f,
+      0.00035947f,
+      0.00033744f,
+      0.00031989f,
+      0.00028719f,
+      0.00027707f,
+      0.00025430f,
+      0.00023132f,
+      0.00022543f,
+      0.00019537f,
+      0.00018380f,
+      0.00016713f,
+      0.00014542f,
+      0.00013876f,
+      0.00011616f,
+      0.00011019f,
+      0.00009086f,
+      0.00009183f,
+      0.00006774f,
+      0.00006181f,
+      0.00006360f,
+      0.00004633f,
+      0.00005224f,
+      0.00003735f,
+      0.00003902f,
+      0.00002393f,
+      0.00003180f,
+      0.00001716f,
+      0.00001762f,
+      0.00002033f,
+      0.00001262f,
+      0.00001259f,
+      0.00001118f,
+      0.00001421f,
+      0.00000830f,
+      0.00001294f,
+      0.00000699f,
+      0.00000782f,
+      0.00000718f,
+      0.00000642f,
+      0.00000548f,
+      0.00000427f,
+      0.00000417f,
+      0.00000440f,
+      0.00000377f,
+      0.00000253f,
+      0.00000456f,
+      0.00000202f,
+      0.00000373f,
+      0.00000325f,
+      0.00000341f,
+      0.00000232f,
+      0.00000301f,
+      0.00000117f,
+      0.00000319f,
+      0.00000169f,
+      0.00000286f,
+      0.00000184f,
+      0.00000260f,
+      0.00000212f,
+      0.00000293f,
+      0.00000175f,
+      0.00000229f,
+      0.00000126f,
+      0.00000232f,
+      0.00000099f,
+      0.00000250f,
+      0.00000135f,
+      0.00000090f,
+      0.00000289f,
+      0.00000070f,
+      0.00000210f,
+      0.00000118f,
+      0.00000072f,
+      0.00000182f,
+      0.00000111f
+      };
+    //Add multispectral bands to the temporary list
+    const std::vector<float> vb0 (b0, b0 + sizeof(b0) / sizeof(float) );
+    const std::vector<float> vb1 (b1, b1 + sizeof(b1) / sizeof(float) );
+    const std::vector<float> vb2 (b2, b2 + sizeof(b2) / sizeof(float) );
+    const std::vector<float> vb3 (b3, b3 + sizeof(b3) / sizeof(float) );
+    //For Spot6 MS image the order of band is: B2 B1 B0 B3
+    //(BandIndexToWavelength method could be used here)
+    tmpSpectralBandList.push_back(vb2);
+    tmpSpectralBandList.push_back(vb1);
+    tmpSpectralBandList.push_back(vb0);
+    tmpSpectralBandList.push_back(vb3);
+    }
+    else if (sensorId == "SPOT 7")
+      {
+    //band B0 (blue band)
+    const float b0[241] =
+      {
+    0.00006223f,
+0.00009415f,
+0.00012429f,
+0.00013639f,
+0.00013753f,
+0.00012891f,
+0.00010218f,
+0.00009278f,
+0.00008783f,
+0.00009141f,
+0.00009723f,
+0.00010706f,
+0.00010524f,
+0.00020698f,
+0.00039717f,
+0.00075474f,
+0.00127926f,
+0.00311549f,
+0.01205305f,
+0.06233600f,
+0.18105752f,
+0.38256698f,
+0.59043414f,
+0.70848867f,
+0.77207521f,
+0.79575312f,
+0.80384998f,
+0.81939978f,
+0.84908020f,
+0.87380894f,
+0.88619128f,
+0.89387948f,
+0.90177013f,
+0.90729110f,
+0.91984833f,
+0.93185189f,
+0.95079208f,
+0.95735099f,
+0.94209245f,
+0.92804056f,
+0.94022333f,
+0.95422481f,
+0.96305217f,
+0.96145513f,
+0.96493862f,
+0.98962585f,
+1.00000000f,
+0.95819838f,
+0.84154929f,
+0.65895898f,
+0.39954244f,
+0.18259058f,
+0.07126465f,
+0.02385368f,
+0.00665853f,
+0.00371385f,
+0.00301785f,
+0.00199155f,
+0.00060530f,
+0.00028358f,
+0.00016827f,
+0.00020355f,
+0.00021207f,
+0.00025503f,
+0.00031159f,
+0.00030672f,
+0.00028100f,
+0.00027885f,
+0.00027786f,
+0.00029299f,
+0.00028906f,
+0.00032038f,
+0.00032455f,
+0.00031566f,
+0.00031624f,
+0.00034902f,
+0.00034040f,
+0.00030293f,
+0.00027660f,
+0.00028711f,
+0.00028857f,
+0.00026469f,
+0.00024329f,
+0.00027568f,
+0.00028253f,
+0.00027954f,
+0.00022052f,
+0.00021894f,
+0.00022427f,
+0.00022480f,
+0.00027263f,
+0.00027193f,
+0.00028123f,
+0.00029369f,
+0.00032476f,
+0.00027348f,
+0.00019338f,
+0.00019522f,
+0.00022102f,
+0.00026397f,
+0.00032200f,
+0.00030746f,
+0.00028825f,
+0.00056141f,
+0.00098123f,
+0.00115372f,
+0.00083003f,
+0.00034274f,
+0.00030276f,
+0.00136481f,
+0.00174203f,
+0.00528887f,
+0.00363463f,
+0.00263354f,
+0.00023767f,
+0.00085373f,
+0.00308313f,
+0.00383517f,
+0.00350842f,
+0.00187129f,
+0.00114591f,
+0.00039397f,
+0.00036147f,
+0.00047659f,
+0.00028036f,
+0.00032295f,
+0.00022860f,
+0.00021316f,
+0.00024186f,
+0.00015903f,
+0.00019401f,
+0.00016204f,
+0.00022580f,
+0.00014776f,
+0.00016706f,
+0.00014137f,
+0.00018257f,
+0.00013750f,
+0.00020102f,
+0.00016524f,
+0.00022404f,
+0.00013058f,
+0.00017588f,
+0.00021843f,
+0.00033274f,
+0.00040937f,
+0.00022751f,
+0.00026991f,
+0.00011570f,
+0.00018936f,
+0.00007716f,
+0.00009678f,
+0.00005590f,
+0.00014024f,
+0.00006012f,
+0.00008625f,
+0.00005988f,
+0.00007702f,
+0.00004836f,
+0.00005283f,
+0.00001724f,
+0.00008368f,
+0.00015662f,
+0.00018147f,
+0.00014258f,
+0.00019128f,
+0.00017554f,
+0.00015024f,
+0.00009702f,
+0.00011595f,
+0.00009845f,
+0.00010465f,
+0.00007963f,
+0.00010628f,
+0.00011597f,
+0.00009482f,
+0.00008396f,
+0.00014762f,
+0.00016181f,
+0.00021927f,
+0.00024570f,
+0.00031710f,
+0.00034636f,
+0.00041754f,
+0.00047979f,
+0.00047446f,
+0.00046590f,
+0.00045465f,
+0.00046585f,
+0.00048115f,
+0.00050182f,
+0.00046597f,
+0.00044784f,
+0.00040927f,
+0.00037423f,
+0.00045082f,
+0.00060266f,
+0.00068456f,
+0.00095082f,
+0.00158306f,
+0.00213891f,
+0.00203578f,
+0.00209486f,
+0.00179064f,
+0.00170038f,
+0.00133240f,
+0.00127140f,
+0.00103228f,
+0.00083963f,
+0.00080970f,
+0.00080732f,
+0.00071204f,
+0.00076914f,
+0.00090316f,
+0.00113432f,
+0.00122795f,
+0.00121075f,
+0.00226176f,
+0.00213613f,
+0.00268812f,
+0.00258953f,
+0.00201580f,
+0.00199608f,
+0.00087274f,
+0.00076959f,
+0.00026605f,
+0.00023035f,
+0.00008012f,
+0.00002169f,
+0.00002845f,
+0.00002870f,
+0.00001083f,
+0.00000787f,
+0.00000498f,
+0.00000366f,
+0.00000709f,
+0.00001239f,
+0.00000419f,
+0.00000676f,
+0.00000507f,
+0.00000356f
+    };
+
+    //band B1 (green band)
+    const float b1[241] =
+      {
+    0.00000000f,
+0.00000000f,
+0.00000386f,
+0.00000566f,
+0.00000404f,
+0.00000759f,
+0.00001803f,
+0.00002936f,
+0.00003640f,
+0.00003122f,
+0.00001728f,
+0.00001678f,
+0.00000855f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00001174f,
+0.00003061f,
+0.00001542f,
+0.00000002f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00001264f,
+0.00003533f,
+0.00001653f,
+0.00000938f,
+0.00003380f,
+0.00001204f,
+0.00002568f,
+0.00006421f,
+0.00011657f,
+0.00019268f,
+0.00034781f,
+0.00065634f,
+0.00158903f,
+0.00438411f,
+0.01335476f,
+0.06107908f,
+0.18681701f,
+0.40314601f,
+0.65792919f,
+0.80353053f,
+0.82833979f,
+0.80070713f,
+0.81789228f,
+0.86938944f,
+0.91191222f,
+0.93590656f,
+0.94933428f,
+0.95315901f,
+0.95612825f,
+0.96015344f,
+0.96488804f,
+0.97405185f,
+0.98775038f,
+0.99694634f,
+0.99953635f,
+0.99920681f,
+0.99995509f,
+1.00000000f,
+0.98413416f,
+0.92515351f,
+0.85770369f,
+0.75506786f,
+0.65784685f,
+0.53623586f,
+0.31657708f,
+0.12855983f,
+0.04354890f,
+0.01832512f,
+0.00806139f,
+0.00339129f,
+0.00133028f,
+0.00066241f,
+0.00033912f,
+0.00014269f,
+0.00005860f,
+0.00002161f,
+0.00004310f,
+0.00005128f,
+0.00005092f,
+0.00002347f,
+0.00000002f,
+0.00000650f,
+0.00002838f,
+0.00003072f,
+0.00001848f,
+0.00002796f,
+0.00001389f,
+0.00000612f,
+0.00000025f,
+0.00003069f,
+0.00003600f,
+0.00001337f,
+0.00002671f,
+0.00002978f,
+0.00003422f,
+0.00001379f,
+0.00002347f,
+0.00004055f,
+0.00002227f,
+0.00001294f,
+0.00003483f,
+0.00001712f,
+0.00000002f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00001081f,
+0.00000769f,
+0.00002469f,
+0.00003172f,
+0.00001765f,
+0.00001146f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00000000f,
+0.00001915f,
+0.00010077f,
+0.00009227f,
+0.00036170f,
+0.00041903f,
+0.00028285f,
+0.00011955f,
+0.00013258f,
+0.00013216f,
+0.00016185f,
+0.00023636f,
+0.00022910f,
+0.00016182f,
+0.00003655f,
+0.00000822f,
+0.00000813f,
+0.00002457f,
+0.00005473f,
+0.00014214f,
+0.00013627f,
+0.00019327f,
+0.00023474f,
+0.00020969f,
+0.00028852f,
+0.00027134f,
+0.00022611f,
+0.00017862f,
+0.00011338f,
+0.00010355f,
+0.00010164f,
+0.00006384f,
+0.00006032f,
+0.00005830f,
+0.00004039f,
+0.00003523f,
+0.00004225f,
+0.00005370f,
+0.00006190f,
+0.00004503f,
+0.00007030f,
+0.00007374f,
+0.00007399f,
+0.00009285f,
+0.00007544f,
+0.00008048f,
+0.00007956f,
+0.00014808f,
+0.00028476f,
+0.00033229f,
+0.00059065f,
+0.00081565f,
+0.00091910f,
+0.00084857f,
+0.00064772f,
+0.00049455f,
+0.00030383f,
+0.00028348f,
+0.00026936f,
+0.00027984f,
+0.00026084f,
+0.00027212f,
+0.00018413f,
+0.00012211f,
+0.00012484f,
+0.00011296f,
+0.00019231f,
+0.00027856f,
+0.00040423f,
+0.00056768f,
+0.00054620f,
+0.00053311f,
+0.00061131f,
+0.00042033f,
+0.00034603f,
+0.00022132f,
+0.00021608f,
+0.00020483f,
+0.00012462f,
+0.00008773f,
+0.00008066f,
+0.00008884f,
+0.00008933f,
+0.00006750f,
+0.00007617f,
+0.00007908f,
+0.00006165f,
+0.00004525f,
+0.00004836f,
+0.00003234f,
+0.00003518f,
+0.00003174f,
+0.00001670f,
+0.00001955f,
+0.00000830f,
+0.00001164f,
+0.00000610f,
+0.00000576f,
+0.00000441f,
+0.00000591f,
+0.00000682f,
+0.00000867f
+    };
+
+    //band B2 (red band)
+    const float b2[241] =
+      {
+    0.00006712f,
+0.00010372f,
+0.00014401f,
+0.00016823f,
+0.00018607f,
+0.00020871f,
+0.00050585f,
+0.00279268f,
+0.00632703f,
+0.00707717f,
+0.00330878f,
+0.00074050f,
+0.00128845f,
+0.00173704f,
+0.00116168f,
+0.00082131f,
+0.00110044f,
+0.00126307f,
+0.00132016f,
+0.00114549f,
+0.00107557f,
+0.00144593f,
+0.00153967f,
+0.00088105f,
+0.00082143f,
+0.00114470f,
+0.00127469f,
+0.00133542f,
+0.00115328f,
+0.00079149f,
+0.00077299f,
+0.00090499f,
+0.00105427f,
+0.00090991f,
+0.00083955f,
+0.00066794f,
+0.00067541f,
+0.00066792f,
+0.00068078f,
+0.00080775f,
+0.00085164f,
+0.00085421f,
+0.00082583f,
+0.00080782f,
+0.00079826f,
+0.00092916f,
+0.00091108f,
+0.00094218f,
+0.00089515f,
+0.00076910f,
+0.00082056f,
+0.00081487f,
+0.00081175f,
+0.00089594f,
+0.00104200f,
+0.00111628f,
+0.00108311f,
+0.00092050f,
+0.00082103f,
+0.00076961f,
+0.00073415f,
+0.00075688f,
+0.00079026f,
+0.00092809f,
+0.00112965f,
+0.00129699f,
+0.00116185f,
+0.00100703f,
+0.00077365f,
+0.00076033f,
+0.00080477f,
+0.00080677f,
+0.00083078f,
+0.00088649f,
+0.00133616f,
+0.00228180f,
+0.00311165f,
+0.00337426f,
+0.00247413f,
+0.00177023f,
+0.00173937f,
+0.00256226f,
+0.00416833f,
+0.00730146f,
+0.01307862f,
+0.02642362f,
+0.06885090f,
+0.15790517f,
+0.26507651f,
+0.35581948f,
+0.36234721f,
+0.34595470f,
+0.38409276f,
+0.46785520f,
+0.55768332f,
+0.66561640f,
+0.79823243f,
+0.91459526f,
+0.96232534f,
+0.96952002f,
+0.98582495f,
+1.00000000f,
+0.99443971f,
+0.98397125f,
+0.98187568f,
+0.98041741f,
+0.96491138f,
+0.93163418f,
+0.89816790f,
+0.88514299f,
+0.89755385f,
+0.92254931f,
+0.93973289f,
+0.93678803f,
+0.91972131f,
+0.90149737f,
+0.89571277f,
+0.89773936f,
+0.87641072f,
+0.80610845f,
+0.68062720f,
+0.52091655f,
+0.35563494f,
+0.21526112f,
+0.12155259f,
+0.07558788f,
+0.05580549f,
+0.04684205f,
+0.04082636f,
+0.03321721f,
+0.02271154f,
+0.01282745f,
+0.00644798f,
+0.00375586f,
+0.00268764f,
+0.00244160f,
+0.00251460f,
+0.00274482f,
+0.00284903f,
+0.00283393f,
+0.00229636f,
+0.00179541f,
+0.00141479f,
+0.00155409f,
+0.00176736f,
+0.00186357f,
+0.00211627f,
+0.00176027f,
+0.00116946f,
+0.00085689f,
+0.00080209f,
+0.00079516f,
+0.00085574f,
+0.00079376f,
+0.00084450f,
+0.00093073f,
+0.00069627f,
+0.00111129f,
+0.00096584f,
+0.00137960f,
+0.00142059f,
+0.00168015f,
+0.00164225f,
+0.00153220f,
+0.00138690f,
+0.00114578f,
+0.00107348f,
+0.00089340f,
+0.00089331f,
+0.00082670f,
+0.00069853f,
+0.00070151f,
+0.00041916f,
+0.00060178f,
+0.00039900f,
+0.00047821f,
+0.00073072f,
+0.00054756f,
+0.00046307f,
+0.00038372f,
+0.00040120f,
+0.00094566f,
+0.00144115f,
+0.00174783f,
+0.00160637f,
+0.00207648f,
+0.00184054f,
+0.00120344f,
+0.00136012f,
+0.00065528f,
+0.00021298f,
+0.00029801f,
+0.00023598f,
+0.00043383f,
+0.00039109f,
+0.00036737f,
+0.00034646f,
+0.00038008f,
+0.00062999f,
+0.00069556f,
+0.00086262f,
+0.00106473f,
+0.00139535f,
+0.00143002f,
+0.00159045f,
+0.00149705f,
+0.00143753f,
+0.00108801f,
+0.00100188f,
+0.00143027f,
+0.00216615f,
+0.00284243f,
+0.00233023f,
+0.00366138f,
+0.00515819f,
+0.00414161f,
+0.00255302f,
+0.00219772f,
+0.00093040f,
+0.00092687f,
+0.00062159f,
+0.00057901f,
+0.00041318f,
+0.00042130f,
+0.00028280f,
+0.00033035f,
+0.00030452f,
+0.00024442f,
+0.00025135f,
+0.00018402f,
+0.00021192f,
+0.00016193f,
+0.00016590f,
+0.00011075f,
+0.00013043f,
+0.00007256f,
+0.00006166f,
+0.00005303f,
+0.00005455f,
+0.00004600f,
+0.00004757f
+    };
+
+    //band B3 (NIR band)
+    const float b3[241] =
+      {
+    0.00001292f,
+0.00002171f,
+0.00004807f,
+0.00011182f,
+0.00025418f,
+0.00039857f,
+0.00046443f,
+0.00047839f,
+0.00044713f,
+0.00037654f,
+0.00035148f,
+0.00034462f,
+0.00033637f,
+0.00051395f,
+0.00079863f,
+0.00092629f,
+0.00091280f,
+0.00081377f,
+0.00060282f,
+0.00061723f,
+0.00092913f,
+0.00135949f,
+0.00180283f,
+0.00217378f,
+0.00232524f,
+0.00179411f,
+0.00127217f,
+0.00106374f,
+0.00082233f,
+0.00044924f,
+0.00037015f,
+0.00032951f,
+0.00019803f,
+0.00014290f,
+0.00014584f,
+0.00011731f,
+0.00014607f,
+0.00015945f,
+0.00016082f,
+0.00016211f,
+0.00016332f,
+0.00017511f,
+0.00023669f,
+0.00032355f,
+0.00033368f,
+0.00023295f,
+0.00015066f,
+0.00032285f,
+0.00066048f,
+0.00112654f,
+0.00108799f,
+0.00054363f,
+0.00026323f,
+0.00041415f,
+0.00077743f,
+0.00113221f,
+0.00111148f,
+0.00081011f,
+0.00059036f,
+0.00065976f,
+0.00101972f,
+0.00135998f,
+0.00140171f,
+0.00102011f,
+0.00059021f,
+0.00033876f,
+0.00021227f,
+0.00019790f,
+0.00021420f,
+0.00026787f,
+0.00026668f,
+0.00028505f,
+0.00027375f,
+0.00020546f,
+0.00021823f,
+0.00030911f,
+0.00047168f,
+0.00065687f,
+0.00084531f,
+0.00102653f,
+0.00104974f,
+0.00067340f,
+0.00034568f,
+0.00020268f,
+0.00015007f,
+0.00015894f,
+0.00014163f,
+0.00013650f,
+0.00016949f,
+0.00013145f,
+0.00014790f,
+0.00014450f,
+0.00016482f,
+0.00013165f,
+0.00014328f,
+0.00015615f,
+0.00016551f,
+0.00012613f,
+0.00014439f,
+0.00016190f,
+0.00016368f,
+0.00016309f,
+0.00016247f,
+0.00016185f,
+0.00016121f,
+0.00016054f,
+0.00015987f,
+0.00014932f,
+0.00015809f,
+0.00011786f,
+0.00013893f,
+0.00015448f,
+0.00015548f,
+0.00015471f,
+0.00015391f,
+0.00015308f,
+0.00015226f,
+0.00015141f,
+0.00015056f,
+0.00014968f,
+0.00014878f,
+0.00014787f,
+0.00014695f,
+0.00017325f,
+0.00016332f,
+0.00020224f,
+0.00023233f,
+0.00026294f,
+0.00031470f,
+0.00036507f,
+0.00044863f,
+0.00054533f,
+0.00070811f,
+0.00098155f,
+0.00144124f,
+0.00224364f,
+0.00359220f,
+0.00600863f,
+0.01034187f,
+0.01844116f,
+0.03239372f,
+0.05644336f,
+0.09596693f,
+0.16642227f,
+0.29891104f,
+0.46664393f,
+0.65196155f,
+0.82462228f,
+0.93492473f,
+0.96391539f,
+0.95443216f,
+0.94614531f,
+0.94775818f,
+0.95521775f,
+0.96787170f,
+0.98075567f,
+0.99990788f,
+1.00000000f,
+0.99361003f,
+0.97888468f,
+0.96699472f,
+0.95409755f,
+0.94033720f,
+0.92803915f,
+0.91619283f,
+0.90622111f,
+0.89602226f,
+0.88630428f,
+0.87500909f,
+0.86095237f,
+0.84370968f,
+0.82545572f,
+0.80461400f,
+0.78501260f,
+0.76772428f,
+0.75486365f,
+0.74647323f,
+0.73951238f,
+0.73121168f,
+0.72267447f,
+0.70863907f,
+0.69074451f,
+0.66813774f,
+0.64157628f,
+0.61222073f,
+0.58351079f,
+0.55338601f,
+0.52370658f,
+0.49552374f,
+0.46688500f,
+0.43837106f,
+0.40924006f,
+0.37555859f,
+0.33386557f,
+0.28478902f,
+0.22725968f,
+0.16595809f,
+0.10930651f,
+0.06488794f,
+0.03605219f,
+0.01953905f,
+0.01126891f,
+0.00690848f,
+0.00468269f,
+0.00344177f,
+0.00292199f,
+0.00233016f,
+0.00218781f,
+0.00181206f,
+0.00165803f,
+0.00144119f,
+0.00123269f,
+0.00109776f,
+0.00075502f,
+0.00044380f,
+0.00037750f,
+0.00032479f,
+0.00017482f,
+0.00008358f,
+0.00008118f,
+0.00004817f,
+0.00004175f,
+0.00004611f,
+0.00003185f,
+0.00000389f,
+0.00002899f,
+0.00003629f,
+0.00001965f,
+0.00000707f,
+0.00001519f,
+0.00000235f,
+0.00001547f,
+0.00001885f,
+0.00000892f,
+0.00000652f,
+0.00000763f,
+0.00000967f,
+0.00000820f,
+0.00000825f,
+0.00000750f,
+0.00000634f
+    };
+    
+    //Add multispectral bands to the temporary list
+    const std::vector<float> vb0 (b0, b0 + sizeof(b0) / sizeof(float) );
+    const std::vector<float> vb1 (b1, b1 + sizeof(b1) / sizeof(float) );
+    const std::vector<float> vb2 (b2, b2 + sizeof(b2) / sizeof(float) );
+    const std::vector<float> vb3 (b3, b3 + sizeof(b3) / sizeof(float) );
+    //For Spot6 MS image the order of band is: B2 B1 B0 B3
+    //(BandIndexToWavelength method could be used here)
+    tmpSpectralBandList.push_back(vb2);
+    tmpSpectralBandList.push_back(vb1);
+    tmpSpectralBandList.push_back(vb0);
+    tmpSpectralBandList.push_back(vb3);
+    }
+    else
+      {
+    itkExceptionMacro(<< "Invalid Spot6 Sensor ID");
+    }
+    }
+    else
+      {
     itkExceptionMacro(<< "Invalid number of bands...");
     }
 
-  unsigned int j = 0;
-  for (std::list <std::vector<float> >::const_iterator it = tmpSpectralBandList.begin(); it != tmpSpectralBandList.end(); ++it)
-    {
+    unsigned int j = 0;
+    for (std::list <std::vector<float> >::const_iterator it = tmpSpectralBandList.begin(); it != tmpSpectralBandList.end(); ++it)
+      {
     wavelengthSpectralBand->PushBack(FilterFunctionValues::New());
     wavelengthSpectralBand->GetNthElement(j)->SetFilterFunctionValues(*it);
     wavelengthSpectralBand->GetNthElement(j)->SetMinSpectralValue(0.4);
     wavelengthSpectralBand->GetNthElement(j)->SetMaxSpectralValue(1.0);
-    wavelengthSpectralBand->GetNthElement(j)->SetUserStep(0.001);
+
+    if (sensorId == "SPOT 6")
+      {
+      wavelengthSpectralBand->GetNthElement(j)->SetUserStep(0.001);
+      }
+    else if (sensorId == "SPOT 7")
+      {
+      wavelengthSpectralBand->GetNthElement(j)->SetUserStep(0.0025);
+      }
+    else
+      {
+      itkExceptionMacro(<< "Invalid Spot6 Sensor ID");
+      }
     ++j;
     }
-  return wavelengthSpectralBand;
-}
+    return wavelengthSpectralBand;
+    }
 
-} // end namespace otb
+    } // end namespace otb
diff --git a/Modules/Core/Metadata/src/otbSpotImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSpotImageMetadataInterface.cxx
index 7c4b751..c0284ce 100644
--- a/Modules/Core/Metadata/src/otbSpotImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbSpotImageMetadataInterface.cxx
@@ -759,380 +759,379 @@ SpotImageMetadataInterface
     //FIXME add other instrument relative spectral response (not only HRG1)
     const float green[541] =
         {
-          0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0022771144,
-0.0045542287,0.021714223,0.038874217,0.088104725,0.13733523,0.21823871,
-0.29914218,0.38027802,0.46141386,0.52832052,0.59522718,0.64936955,
-0.70351192,0.74529693,0.78708195,0.82499008,0.86289822,0.891466,
-0.92003378,0.94254762,0.96506146,0.9776788,0.99029614,0.99514807,
-1.0,0.99612511,0.99225022,0.9804036,0.96855699,0.94715939,
-0.9257618,0.90154813,0.87733446,0.84871261,0.82009075,0.78645969,
-0.75282863,0.71875799,0.68468734,0.64818039,0.61167343,0.57338572,
-0.53509801,0.49156491,0.44803182,0.39732491,0.346618,0.29724838,
-0.24787875,0.20190886,0.15593897,0.12403284,0.09212672,0.070920769,
-0.049714818,0.03798244,0.026250061,0.019816831,0.013383602,0.010152718,
-0.006921834,0.0054235249,0.0039252158,0.0033455489,0.002765882,0.001382941,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0
-        };
+          0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0022771144f,
+0.0045542287f,0.021714223f,0.038874217f,0.088104725f,0.13733523f,0.21823871f,
+0.29914218f,0.38027802f,0.46141386f,0.52832052f,0.59522718f,0.64936955f,
+0.70351192f,0.74529693f,0.78708195f,0.82499008f,0.86289822f,0.891466f,
+0.92003378f,0.94254762f,0.96506146f,0.9776788f,0.99029614f,0.99514807f,
+1.0f,0.99612511f,0.99225022f,0.9804036f,0.96855699f,0.94715939f,
+0.9257618f,0.90154813f,0.87733446f,0.84871261f,0.82009075f,0.78645969f,
+0.75282863f,0.71875799f,0.68468734f,0.64818039f,0.61167343f,0.57338572f,
+0.53509801f,0.49156491f,0.44803182f,0.39732491f,0.346618f,0.29724838f,
+0.24787875f,0.20190886f,0.15593897f,0.12403284f,0.09212672f,0.070920769f,
+0.049714818f,0.03798244f,0.026250061f,0.019816831f,0.013383602f,0.010152718f,
+0.006921834f,0.0054235249f,0.0039252158f,0.0033455489f,0.002765882f,0.001382941f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f};
 
     const float red[541] =
         {
-          0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0007673711,
-0.0015347422,0.010419638,0.019304534,0.061542786,0.10378104,0.20079599,
-0.29781095,0.41207816,0.52634536,0.62039262,0.71443988,0.78093055,
-0.84742121,0.88691213,0.92640305,0.95094047,0.9754779,0.98546823,
-0.99545857,0.99772928,1.0,0.99374775,0.98749549,0.97497667,
-0.96245784,0.94318133,0.92390482,0.89924371,0.8745826,0.84464903,
-0.81471546,0.76863444,0.72255341,0.65866954,0.59478567,0.5169305,
-0.43907532,0.36620824,0.29334116,0.23579319,0.17824522,0.14140026,
-0.1045553,0.082135956,0.059716612,0.047238187,0.034759762,0.027242624,
-0.019725486,0.015547759,0.011370033,0.0090187963,0.0066675595,0.0050977127,
-0.0035278658,0.0028316045,0.0021353432,0.0010676716,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0
+          0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0007673711f,
+0.0015347422f,0.010419638f,0.019304534f,0.061542786f,0.10378104f,0.20079599f,
+0.29781095f,0.41207816f,0.52634536f,0.62039262f,0.71443988f,0.78093055f,
+0.84742121f,0.88691213f,0.92640305f,0.95094047f,0.9754779f,0.98546823f,
+0.99545857f,0.99772928f,1.0f,0.99374775f,0.98749549f,0.97497667f,
+0.96245784f,0.94318133f,0.92390482f,0.89924371f,0.8745826f,0.84464903f,
+0.81471546f,0.76863444f,0.72255341f,0.65866954f,0.59478567f,0.5169305f,
+0.43907532f,0.36620824f,0.29334116f,0.23579319f,0.17824522f,0.14140026f,
+0.1045553f,0.082135956f,0.059716612f,0.047238187f,0.034759762f,0.027242624f,
+0.019725486f,0.015547759f,0.011370033f,0.0090187963f,0.0066675595f,0.0050977127f,
+0.0035278658f,0.0028316045f,0.0021353432f,0.0010676716f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f
         };
     const float nir[541] =
         {
-          0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.00046485267,
-0.00092970533,0.0022703511,0.0036109969,0.0072833599,0.010955723,0.020381246,
-0.029806769,0.050425041,0.071043314,0.10698612,0.14292892,0.19323862,
-0.24354832,0.30664343,0.36973854,0.43590247,0.5020664,0.56601537,
-0.62996434,0.68195348,0.73394262,0.77728387,0.82062512,0.85237025,
-0.88411539,0.91130117,0.93848695,0.95316338,0.96783982,0.9764626,
-0.98508538,0.99215522,0.99922506,0.99961253,1.0,0.99705423,
-0.99410845,0.98330518,0.97250191,0.95825152,0.94400112,0.93075194,
-0.91750276,0.90228886,0.88707495,0.87152458,0.8559742,0.82966368,
-0.80335316,0.7684215,0.73348985,0.68197206,0.63045427,0.56244955,
-0.49444484,0.43235415,0.37026347,0.30941829,0.24857311,0.20286212,
-0.15715112,0.13022816,0.1033052,0.084892217,0.06647923,0.053553967,
-0.040628703,0.03389025,0.027151797,0.022906605,0.018661412,0.015551925,
-0.012442438,0.010396472,0.0083505073,0.0070520644,0.0057536215,0.0049600816,
-0.0041665416,0.0035720051,0.0029774686,0.0029639347,0.0029504007,0.0029368668,
-0.0029233328,0.0029097989,0.0028962649,0.002882731,0.0028691971,0.0028556631,
-0.0028421292,0.0028285952,0.0028150613,0.0028015273,0.0027879934,0.0027744594,
-0.0027609255,0.0027473915,0.0027338576,0.0027203236,0.0027067897,0.0026932557,
-0.0026797218,0.0026661878,0.0026526539,0.0026391199,0.002625586,0.002612052,
-0.0025985181,0.0025849841,0.0025714502,0.0025579162,0.0025443823,0.0025308483,
-0.0025173144,0.0025037804,0.0024902465,0.0024767125,0.0024631786,0.0024496447,
-0.0024361107,0.0024225768,0.0024090428,0.0023955089,0.0023819749,0.002368441,
-0.002354907,0.0023413731,0.0023278391,0.0023143052,0.0023007712,0.0022872373,
-0.0022737033,0.0022601694,0.0022466354,0.0022331015,0.0022195675,0.0022060336,
-0.0021924996,0.0021789657,0.0021654317,0.0021518978,0.0021383638,0.0021248299,
-0.0021112959,0.002097762,0.002084228,0.0020706941,0.0020571601,0.0020436262,
-0.0020300923,0.0020165583,0.0020030244,0.0019894904,0.0019759565,0.0019624225,
-0.0019488886,0.0019353546,0.0019218207,0.0019082867,0.0018947528,0.0018812188,
-0.0018676849,0.0018541509,0.001840617,0.001827083,0.0018135491,0.0018000151,
-0.0017864812,0.0017729472,0.0017594133,0.0017458793,0.0017323454,0.0017188114,
-0.0017052775,0.0016917435,0.0016782096,0.0016646756,0.0016511417,0.0016376078,
-0.0016240738,0.0016105399,0.0015970059,0.001583472,0.001569938,0.0015564041,
-0.0015428701,0.0015293362,0.0015158022,0.0015022683,0.0014887343,0.0014752004,
-0.0014616664,0.0014481325,0.0014345985,0.0014210646,0.0014075306,0.0013939967,
-0.0013804627,0.0013669288,0.0013533948,0.0013398609,0.0013263269,0.001312793,
-0.001299259,0.0012857251,0.0012721911,0.0012586572,0.0012451232,0.0012315893,
-0.0012180554,0.0012045214,0.0011909875,0.0011774535,0.0011639196,0.0011503856,
-0.0011368517,0.0011233177,0.0011097838,0.0010962498,0.0010827159,0.0010691819,
-0.001055648,0.001042114,0.0010285801,0.0010150461,0.0010015122,0.00098797823,
-0.00097444428,0.00096091033,0.00094737638,0.00093384244,0.00092030849,0.00090677454,
-0.00089324059,0.00087970664,0.00086617269,0.00085263875,0.0008391048,0.00082557085,
-0.0008120369,0.00079850295,0.000784969,0.00077143506,0.00075790111,0.00074436716,
-0.00073083321,0.00071729926,0.00070376531,0.00069023137,0.00067669742,0.00066316347,
-0.00064962952,0.00063609557,0.00062256162,0.00060902768,0.00059549373,0.00058195978,
-0.00056842583,0.00055489188,0.00054135793,0.00052782399,0.00051429004,0.00050075609,
-0.00048722214,0.00047368819,0.00046015424,0.0004466203,0.00043308635,0.0004195524,
-0.00040601845,0.0003924845,0.00037895055,0.00036541661,0.00035188266,0.00033834871,
-0.00032481476,0.00031128081,0.00029774686,0.00028421292,0.00027067897,0.00025714502,
-0.00024361107,0.00023007712,0.00021654317,0.00020300923,0.00018947528,0.00017594133,
-0.00016240738,0.00014887343,0.00013533948,0.00012180554,0.00010827159,9.4737638e-05,
-8.120369e-05,6.7669742e-05,5.4135793e-05,4.0601845e-05,2.7067897e-05,1.3533948e-05,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0
+          0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.00046485267f,
+0.00092970533f,0.0022703511f,0.0036109969f,0.0072833599f,0.010955723f,0.020381246f,
+0.029806769f,0.050425041f,0.071043314f,0.10698612f,0.14292892f,0.19323862f,
+0.24354832f,0.30664343f,0.36973854f,0.43590247f,0.5020664f,0.56601537f,
+0.62996434f,0.68195348f,0.73394262f,0.77728387f,0.82062512f,0.85237025f,
+0.88411539f,0.91130117f,0.93848695f,0.95316338f,0.96783982f,0.9764626f,
+0.98508538f,0.99215522f,0.99922506f,0.99961253f,1.0f,0.99705423f,
+0.99410845f,0.98330518f,0.97250191f,0.95825152f,0.94400112f,0.93075194f,
+0.91750276f,0.90228886f,0.88707495f,0.87152458f,0.8559742f,0.82966368f,
+0.80335316f,0.7684215f,0.73348985f,0.68197206f,0.63045427f,0.56244955f,
+0.49444484f,0.43235415f,0.37026347f,0.30941829f,0.24857311f,0.20286212f,
+0.15715112f,0.13022816f,0.1033052f,0.084892217f,0.06647923f,0.053553967f,
+0.040628703f,0.03389025f,0.027151797f,0.022906605f,0.018661412f,0.015551925f,
+0.012442438f,0.010396472f,0.0083505073f,0.0070520644f,0.0057536215f,0.0049600816f,
+0.0041665416f,0.0035720051f,0.0029774686f,0.0029639347f,0.0029504007f,0.0029368668f,
+0.0029233328f,0.0029097989f,0.0028962649f,0.002882731f,0.0028691971f,0.0028556631f,
+0.0028421292f,0.0028285952f,0.0028150613f,0.0028015273f,0.0027879934f,0.0027744594f,
+0.0027609255f,0.0027473915f,0.0027338576f,0.0027203236f,0.0027067897f,0.0026932557f,
+0.0026797218f,0.0026661878f,0.0026526539f,0.0026391199f,0.002625586f,0.002612052f,
+0.0025985181f,0.0025849841f,0.0025714502f,0.0025579162f,0.0025443823f,0.0025308483f,
+0.0025173144f,0.0025037804f,0.0024902465f,0.0024767125f,0.0024631786f,0.0024496447f,
+0.0024361107f,0.0024225768f,0.0024090428f,0.0023955089f,0.0023819749f,0.002368441f,
+0.002354907f,0.0023413731f,0.0023278391f,0.0023143052f,0.0023007712f,0.0022872373f,
+0.0022737033f,0.0022601694f,0.0022466354f,0.0022331015f,0.0022195675f,0.0022060336f,
+0.0021924996f,0.0021789657f,0.0021654317f,0.0021518978f,0.0021383638f,0.0021248299f,
+0.0021112959f,0.002097762f,0.002084228f,0.0020706941f,0.0020571601f,0.0020436262f,
+0.0020300923f,0.0020165583f,0.0020030244f,0.0019894904f,0.0019759565f,0.0019624225f,
+0.0019488886f,0.0019353546f,0.0019218207f,0.0019082867f,0.0018947528f,0.0018812188f,
+0.0018676849f,0.0018541509f,0.001840617f,0.001827083f,0.0018135491f,0.0018000151f,
+0.0017864812f,0.0017729472f,0.0017594133f,0.0017458793f,0.0017323454f,0.0017188114f,
+0.0017052775f,0.0016917435f,0.0016782096f,0.0016646756f,0.0016511417f,0.0016376078f,
+0.0016240738f,0.0016105399f,0.0015970059f,0.001583472f,0.001569938f,0.0015564041f,
+0.0015428701f,0.0015293362f,0.0015158022f,0.0015022683f,0.0014887343f,0.0014752004f,
+0.0014616664f,0.0014481325f,0.0014345985f,0.0014210646f,0.0014075306f,0.0013939967f,
+0.0013804627f,0.0013669288f,0.0013533948f,0.0013398609f,0.0013263269f,0.001312793f,
+0.001299259f,0.0012857251f,0.0012721911f,0.0012586572f,0.0012451232f,0.0012315893f,
+0.0012180554f,0.0012045214f,0.0011909875f,0.0011774535f,0.0011639196f,0.0011503856f,
+0.0011368517f,0.0011233177f,0.0011097838f,0.0010962498f,0.0010827159f,0.0010691819f,
+0.001055648f,0.001042114f,0.0010285801f,0.0010150461f,0.0010015122f,0.00098797823f,
+0.00097444428f,0.00096091033f,0.00094737638f,0.00093384244f,0.00092030849f,0.00090677454f,
+0.00089324059f,0.00087970664f,0.00086617269f,0.00085263875f,0.0008391048f,0.00082557085f,
+0.0008120369f,0.00079850295f,0.000784969f,0.00077143506f,0.00075790111f,0.00074436716f,
+0.00073083321f,0.00071729926f,0.00070376531f,0.00069023137f,0.00067669742f,0.00066316347f,
+0.00064962952f,0.00063609557f,0.00062256162f,0.00060902768f,0.00059549373f,0.00058195978f,
+0.00056842583f,0.00055489188f,0.00054135793f,0.00052782399f,0.00051429004f,0.00050075609f,
+0.00048722214f,0.00047368819f,0.00046015424f,0.0004466203f,0.00043308635f,0.0004195524f,
+0.00040601845f,0.0003924845f,0.00037895055f,0.00036541661f,0.00035188266f,0.00033834871f,
+0.00032481476f,0.00031128081f,0.00029774686f,0.00028421292f,0.00027067897f,0.00025714502f,
+0.00024361107f,0.00023007712f,0.00021654317f,0.00020300923f,0.00018947528f,0.00017594133f,
+0.00016240738f,0.00014887343f,0.00013533948f,0.00012180554f,0.00010827159f,9.4737638e-05f,
+8.120369e-05f,6.7669742e-05f,5.4135793e-05f,4.0601845e-05f,2.7067897e-05f,1.3533948e-05f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f
         };
     const float mir[541] =
         {
-          0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0,0.0,0.0,0.0,0.0,
-0.0,0.0088105211,0.017621042,0.020528086,0.02343513,0.026392526,
-0.029349921,0.033664215,0.037978508,0.042245031,0.046511554,0.055648902,
-0.064786249,0.07395196,0.08311767,0.10386151,0.12460535,0.14594447,
-0.16728359,0.20442288,0.24156217,0.27841272,0.31526328,0.35919335,
-0.40312341,0.44621342,0.48930344,0.53207715,0.57485086,0.61905294,
-0.66325502,0.7114532,0.75965137,0.8076253,0.85559924,0.89376042,
-0.93192161,0.9659608,1.0,0.99696894,0.99393787,0.99224825,
-0.99055862,0.96192825,0.93329788,0.90629723,0.87929659,0.87156435,
-0.8638321,0.85303543,0.84223875,0.85502674,0.86781473,0.88056734,
-0.89331995,0.89301593,0.89271191,0.86628263,0.83985335,0.80572933,
-0.77160531,0.73099612,0.69038694,0.64866608,0.60694523,0.56782227,
-0.52869932,0.48719362,0.44568791,0.40599882,0.36630972,0.32807542,
-0.28984112,0.25834284,0.22684456,0.19656397,0.16628339,0.14643708,
-0.12659078,0.106444,0.086297227,0.076081433,0.065865639,0.055683249,
-0.045500859,0.040629869,0.03575888,0.031127116,0.026495353,0.024316707,
-0.022138061,0.019934653,0.017731245,0.01619062,0.014649995,0.013104617,
-0.011559239,0.01030835,0.0090574603,0.0078583703,0.0066592804,0.0059099939,
-0.0051607074,0.0044159179,0.0036711284,0.0033605972,0.0030500659,0.0027368724,
-0.0024236788,0.0021708901,0.0019181013,0.0016732152,0.001428329,0.001428329,
-0.001428329
+          0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
+0.0f,0.0088105211f,0.017621042f,0.020528086f,0.02343513f,0.026392526f,
+0.029349921f,0.033664215f,0.037978508f,0.042245031f,0.046511554f,0.055648902f,
+0.064786249f,0.07395196f,0.08311767f,0.10386151f,0.12460535f,0.14594447f,
+0.16728359f,0.20442288f,0.24156217f,0.27841272f,0.31526328f,0.35919335f,
+0.40312341f,0.44621342f,0.48930344f,0.53207715f,0.57485086f,0.61905294f,
+0.66325502f,0.7114532f,0.75965137f,0.8076253f,0.85559924f,0.89376042f,
+0.93192161f,0.9659608f,1.0f,0.99696894f,0.99393787f,0.99224825f,
+0.99055862f,0.96192825f,0.93329788f,0.90629723f,0.87929659f,0.87156435f,
+0.8638321f,0.85303543f,0.84223875f,0.85502674f,0.86781473f,0.88056734f,
+0.89331995f,0.89301593f,0.89271191f,0.86628263f,0.83985335f,0.80572933f,
+0.77160531f,0.73099612f,0.69038694f,0.64866608f,0.60694523f,0.56782227f,
+0.52869932f,0.48719362f,0.44568791f,0.40599882f,0.36630972f,0.32807542f,
+0.28984112f,0.25834284f,0.22684456f,0.19656397f,0.16628339f,0.14643708f,
+0.12659078f,0.106444f,0.086297227f,0.076081433f,0.065865639f,0.055683249f,
+0.045500859f,0.040629869f,0.03575888f,0.031127116f,0.026495353f,0.024316707f,
+0.022138061f,0.019934653f,0.017731245f,0.01619062f,0.014649995f,0.013104617f,
+0.011559239f,0.01030835f,0.0090574603f,0.0078583703f,0.0066592804f,0.0059099939f,
+0.0051607074f,0.0044159179f,0.0036711284f,0.0033605972f,0.0030500659f,0.0027368724f,
+0.0024236788f,0.0021708901f,0.0019181013f,0.0016732152f,0.001428329f,0.001428329f,
+0.001428329f
         };
 
     //Add multispectral bands to the temporary list
diff --git a/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx
index 968b8f8..271ec50 100644
--- a/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx
@@ -539,15 +539,15 @@ double
 TerraSarImageMetadataInterface
 ::ConvertStringTimeUTCToJulianDay(const std::string& value) const
 {
-  std::vector<std::string> splittedDate;
-  boost::split(splittedDate, value, boost::is_any_of("-T:Z"));
-
-  int year = atoi(splittedDate[0].c_str());
-  int month = atoi(splittedDate[1].c_str());
-  int day = atoi(splittedDate[2].c_str());
-  int hour = atoi(splittedDate[3].c_str());
-  int minu = atoi(splittedDate[4].c_str());
-  double sec = atof(splittedDate[5].c_str());
+  std::vector<std::string> splitDate;
+  boost::split(splitDate, value, boost::is_any_of("-T:Z"));
+
+  int year = atoi(splitDate[0].c_str());
+  int month = atoi(splitDate[1].c_str());
+  int day = atoi(splitDate[2].c_str());
+  int hour = atoi(splitDate[3].c_str());
+  int minu = atoi(splitDate[4].c_str());
+  double sec = atof(splitDate[5].c_str());
 
   // Conversion to julian day
   // according to http://en.wikipedia.org/wiki/Julian_day
diff --git a/Modules/Core/Metadata/test/otbDefaultImageMetadataInterface.cxx b/Modules/Core/Metadata/test/otbDefaultImageMetadataInterface.cxx
index cfb0d88..0141f75 100644
--- a/Modules/Core/Metadata/test/otbDefaultImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/test/otbDefaultImageMetadataInterface.cxx
@@ -27,9 +27,9 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
 
   ObjectType::Pointer obj = ObjectType::New();
 
-  bool hasRisedException;
+  bool hasRaisedException;
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -39,16 +39,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetPhysicalBias() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
 
   try
@@ -59,16 +59,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetPhysicalGain() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -78,16 +78,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetSolarIrradiance() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -97,16 +97,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetDay() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -116,16 +116,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetMonth() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -135,16 +135,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetYear() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -154,16 +154,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetHour() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -173,16 +173,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetMinute() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -192,16 +192,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetProductionDay() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -211,16 +211,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetProductionMonth() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -230,16 +230,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetProductionYear() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -249,16 +249,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetSatElevation() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -268,16 +268,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetSatAzimuth() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -287,16 +287,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetFirstWavelengths() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -306,16 +306,16 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     {
     std::cout << "ExceptionObject caught for GetLastWavelengths() !" << std::endl;
     std::cout << err << std::endl;
-    hasRisedException =true;
+    hasRaisedException =true;
     }
 
-  if(!hasRisedException)
+  if(!hasRaisedException)
     {
     std::cerr << " Should has raise an exception !"<< std::endl;
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
@@ -332,7 +332,7 @@ int otbDefaultImageMetadataInterface(int itkNotUsed(argc), char* itkNotUsed(argv
     return EXIT_FAILURE;
     }
 
-  hasRisedException = false;
+  hasRaisedException = false;
 
   try
     {
diff --git a/Modules/Core/Metadata/test/otbImageMetadataInterfaceBaseTest.cxx b/Modules/Core/Metadata/test/otbImageMetadataInterfaceBaseTest.cxx
index 2a5bff2..0b2785c 100644
--- a/Modules/Core/Metadata/test/otbImageMetadataInterfaceBaseTest.cxx
+++ b/Modules/Core/Metadata/test/otbImageMetadataInterfaceBaseTest.cxx
@@ -58,7 +58,9 @@ int otbImageMetadataInterfaceBaseTest(int itkNotUsed(argc), char* argv[])
     file << "GCPId:           " << lImageMetadata->GetGCPId(gcpIdx) << std::endl;
     file << "GCPInfo:         " << lImageMetadata->GetGCPInfo(gcpIdx) << std::endl;
   }
-  file << "SensorID:        " << lImageMetadata->GetSensorID( ) << std::endl;
+  std::string sensorId;
+  lImageMetadata->GetSensorID( sensorId );
+  file << "SensorID:        " << sensorId << std::endl;
   file << "NumberOfBands:   " << lImageMetadata->GetNumberOfBands( ) << std::endl;
   file << "XPixelSpacing:   " << lImageMetadata->GetXPixelSpacing( ) << std::endl;
   file << "YPixelSpacing:   " << lImageMetadata->GetYPixelSpacing( ) << std::endl;
diff --git a/Modules/Core/ObjectList/include/otbImageListSource.h b/Modules/Core/ObjectList/include/otbImageListSource.h
index bdd1648..f852dd7 100644
--- a/Modules/Core/ObjectList/include/otbImageListSource.h
+++ b/Modules/Core/ObjectList/include/otbImageListSource.h
@@ -55,7 +55,7 @@ public:
   typedef ImageList<OutputImageType>                 OutputImageListType;
   typedef typename OutputImageListType::Pointer      OutputImageListPointerType;
   typedef typename OutputImageListType::ConstPointer OutputImageListConstPointerType;
-  /** Overiding of the GetOutput() method */
+  /** Overriding of the GetOutput() method */
   virtual OutputImageListType * GetOutput(void);
 
 protected:
diff --git a/Modules/Core/ObjectList/include/otbImageListToImageFilter.h b/Modules/Core/ObjectList/include/otbImageListToImageFilter.h
index 7388945..0a309ab 100644
--- a/Modules/Core/ObjectList/include/otbImageListToImageFilter.h
+++ b/Modules/Core/ObjectList/include/otbImageListToImageFilter.h
@@ -63,7 +63,7 @@ public:
 
   /** InputImage dimension constant */
   itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Overiding the SetInput() and GetInput() methods */
+  /** Overriding the SetInput() and GetInput() methods */
   using Superclass::SetInput;
   virtual void SetInput(const InputImageListType * image);
   InputImageListType * GetInput(void);
diff --git a/Modules/Core/ObjectList/include/otbImageListToImageListFilter.h b/Modules/Core/ObjectList/include/otbImageListToImageListFilter.h
index 72a7ddd..895951b 100644
--- a/Modules/Core/ObjectList/include/otbImageListToImageListFilter.h
+++ b/Modules/Core/ObjectList/include/otbImageListToImageListFilter.h
@@ -61,7 +61,7 @@ public:
   typedef typename Superclass::OutputImagePointerType     OutputImagePointer;
   /** InputImage dimension constant */
   itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Overiding the SetInput() and GetInput() methods */
+  /** Overriding the SetInput() and GetInput() methods */
   using Superclass::SetInput;
   virtual void SetInput(const InputImageListType * imageList);
   virtual InputImageListType * GetInput(void);
diff --git a/Modules/Core/ObjectList/include/otbImageToImageListFilter.h b/Modules/Core/ObjectList/include/otbImageToImageListFilter.h
index fbb7791..1e153a2 100644
--- a/Modules/Core/ObjectList/include/otbImageToImageListFilter.h
+++ b/Modules/Core/ObjectList/include/otbImageToImageListFilter.h
@@ -59,7 +59,7 @@ public:
   typedef typename Superclass::OutputImagePointerType OutputImagePointerType;
   /** InputImage dimension constant */
   itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Overiding the SetInput() and GetInput() methods */
+  /** Overriding the SetInput() and GetInput() methods */
   using Superclass::SetInput;
   virtual void SetInput(const InputImageType * image);
   InputImageType * GetInput(void);
diff --git a/Modules/Core/ObjectList/include/otbObjectListToObjectListFilter.txx b/Modules/Core/ObjectList/include/otbObjectListToObjectListFilter.txx
index 99edfd1..c018369 100644
--- a/Modules/Core/ObjectList/include/otbObjectListToObjectListFilter.txx
+++ b/Modules/Core/ObjectList/include/otbObjectListToObjectListFilter.txx
@@ -171,7 +171,7 @@ ObjectListToObjectListFilter<TInputList, TOutputList>
     }
   // else
   //   {
-  //   otherwise don't use this thread. Sometimes the threads dont
+  //   otherwise don't use this thread. Sometimes the threads don't
   //   break up very well and it is just as efficient to leave a
   //   few threads idle.
   //   }
diff --git a/Modules/Core/PointSet/include/otbImageToPointSetFilter.txx b/Modules/Core/PointSet/include/otbImageToPointSetFilter.txx
index d79425d..a262786 100644
--- a/Modules/Core/PointSet/include/otbImageToPointSetFilter.txx
+++ b/Modules/Core/PointSet/include/otbImageToPointSetFilter.txx
@@ -292,7 +292,7 @@ ImageToPointSetFilter<TInputImage, TOutputPointSet>
     }
   // else
   //   {
-  //   otherwise don't use this thread. Sometimes the threads dont
+  //   otherwise don't use this thread. Sometimes the threads don't
   //   break up very well and it is just as efficient to leave a
   //   few threads idle.
   //   }
diff --git a/Modules/Core/PointSet/include/otbPointSetAndValuesFunction.h b/Modules/Core/PointSet/include/otbPointSetAndValuesFunction.h
index c6348a1..ea1d553 100644
--- a/Modules/Core/PointSet/include/otbPointSetAndValuesFunction.h
+++ b/Modules/Core/PointSet/include/otbPointSetAndValuesFunction.h
@@ -86,7 +86,7 @@ public:
    * Subclasses must provide this method. */
   virtual TValue EvaluateAtIndex(const IndexType& index) const = 0;
 
-  /** Evaluate the function at specified ContinousIndex position.
+  /** Evaluate the function at specified ContinuousIndex position.
    * Subclasses must provide this method. */
   virtual TValue EvaluateAtContinuousIndex(const ContinuousIndexType& index) const = 0;
 
diff --git a/Modules/Core/SpatialObjects/include/otbLineSpatialObject.h b/Modules/Core/SpatialObjects/include/otbLineSpatialObject.h
index 05601ad..b97202c 100644
--- a/Modules/Core/SpatialObjects/include/otbLineSpatialObject.h
+++ b/Modules/Core/SpatialObjects/include/otbLineSpatialObject.h
@@ -81,7 +81,7 @@ public:
   }
 
   /** Return the number of points in the list */
-  unsigned long GetNumberOfPoints(void) const ITK_OVERRIDE
+  itk::SizeValueType GetNumberOfPoints(void) const ITK_OVERRIDE
   {
     return m_Points.size();
   }
diff --git a/Modules/Core/SpatialObjects/test/otbLineSpatialObjectNew.cxx b/Modules/Core/SpatialObjects/test/otbLineSpatialObjectNew.cxx
index 8c3e00b..61e0670 100644
--- a/Modules/Core/SpatialObjects/test/otbLineSpatialObjectNew.cxx
+++ b/Modules/Core/SpatialObjects/test/otbLineSpatialObjectNew.cxx
@@ -21,8 +21,7 @@
 
 int otbLineSpatialObjectNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
 {
-  const unsigned int Dimension = 2;
-  typedef otb::LineSpatialObject<Dimension> LineSpatialObjectType;
+  typedef otb::LineSpatialObject<2> LineSpatialObjectType;
 
   // Instantiating object
   LineSpatialObjectType::Pointer object = LineSpatialObjectType::New();
diff --git a/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h b/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h
index b623f29..9a4577f 100644
--- a/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h
+++ b/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h
@@ -26,6 +26,8 @@
 #endif
 #include <set>
 
+#include "OTBStreamingExport.h"
+
 namespace otb
 {
 /** \class PipelineMemoryPrintCalculator
@@ -64,7 +66,7 @@ namespace otb
  *
  * \ingroup OTBStreaming
  */
-class ITK_EXPORT PipelineMemoryPrintCalculator :
+class OTBStreaming_EXPORT PipelineMemoryPrintCalculator :
   public itk::Object
 {
 public:
diff --git a/Modules/Core/Streaming/include/otbRAMDrivenAdaptativeStreamingManager.h b/Modules/Core/Streaming/include/otbRAMDrivenAdaptativeStreamingManager.h
index 40f5ed6..ac32ae9 100644
--- a/Modules/Core/Streaming/include/otbRAMDrivenAdaptativeStreamingManager.h
+++ b/Modules/Core/Streaming/include/otbRAMDrivenAdaptativeStreamingManager.h
@@ -29,7 +29,7 @@ namespace otb
  *  available RAM.
  *
  * This streaming manager uses the TileHint from the
- * MetaDataDictionnary to find out the tiling sheme of the input file
+ * MetaDataDictionary to find out the tiling sheme of the input file
  * if available.
  *
  * You can use SetAvailableRAMInMB to set the available RAM. An
diff --git a/Modules/Core/Streaming/otb-module.cmake b/Modules/Core/Streaming/otb-module.cmake
index 00615c8..2e63671 100644
--- a/Modules/Core/Streaming/otb-module.cmake
+++ b/Modules/Core/Streaming/otb-module.cmake
@@ -4,6 +4,7 @@ useful when big images must be processed: processing is done piecewise, which pr
 the system from running out of memory.")
 
 otb_module(OTBStreaming
+ENABLE_SHARED
   DEPENDS
     OTBCommon
     OTBITK
diff --git a/Modules/Core/Transform/include/otbGenericMapProjection.h b/Modules/Core/Transform/include/otbGenericMapProjection.h
index eb89c86..b7f35a8 100644
--- a/Modules/Core/Transform/include/otbGenericMapProjection.h
+++ b/Modules/Core/Transform/include/otbGenericMapProjection.h
@@ -90,14 +90,22 @@ public:
   /** Return the Wkt representation of the projection*/
   virtual std::string GetWkt();
 
-  /** Instanciate the projection according to the Wkt specification*/
+  /** Instantiate the projection according to the Wkt specification*/
   virtual void SetWkt(const std::string& projectionRefWkt);
 
   virtual void PrintMap() const;
 
   OutputPointType TransformPoint(const InputPointType& point) const ITK_OVERRIDE;
 
-  virtual bool InstanciateProjection();
+  virtual bool InstantiateProjection();
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  virtual bool InstanciateProjection()
+  {
+    otbWarningMacro(
+      << "InstanciateProjection has been deprecated.  Please use InstantiateProjection() instead");
+    return this->InstantiateProjection();
+  }
 
   const MapProjectionAdapter* GetMapProjection() const;
 
diff --git a/Modules/Core/Transform/include/otbGenericMapProjection.txx b/Modules/Core/Transform/include/otbGenericMapProjection.txx
index 11df836..7201f36 100644
--- a/Modules/Core/Transform/include/otbGenericMapProjection.txx
+++ b/Modules/Core/Transform/include/otbGenericMapProjection.txx
@@ -72,9 +72,9 @@ template<TransformDirection::TransformationDirection TDirectionOfMapping, class
     unsigned int NOutputDimensions>
 bool
 GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
-::InstanciateProjection()
+::InstantiateProjection()
 {
-  return m_MapProjection->InstanciateProjection();
+  return m_MapProjection->InstantiateProjection();
 }
 
 template<TransformDirection::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.h b/Modules/Core/Transform/include/otbGenericRSTransform.h
index 5137aef..84e0003 100644
--- a/Modules/Core/Transform/include/otbGenericRSTransform.h
+++ b/Modules/Core/Transform/include/otbGenericRSTransform.h
@@ -167,8 +167,15 @@ public:
 
   OutputPointType TransformPoint(const InputPointType& point) const ITK_OVERRIDE;
 
-  virtual void  InstanciateTransform();
+  virtual void  InstantiateTransform();
 
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  void  InstanciateTransform()
+  {
+    otbWarningMacro(<< "InstanciateTransform has been deprecated.  Please use InstantiateTransform instead");
+    this->InstantiateTransform();
+  }
+  
   // Get inverse methods
   bool GetInverse(Self * inverseTransform) const;
   InverseTransformBasePointer GetInverseTransform() const ITK_OVERRIDE;
diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.txx b/Modules/Core/Transform/include/otbGenericRSTransform.txx
index 4d000da..f784b58 100644
--- a/Modules/Core/Transform/include/otbGenericRSTransform.txx
+++ b/Modules/Core/Transform/include/otbGenericRSTransform.txx
@@ -58,19 +58,19 @@ GenericRSTransform<TScalarType, NInputDimensions, NOutputDimensions>
   itkDebugMacro("returning MapProjection address " << this->m_Transform);
   if ((!m_TransformUpToDate) || (m_Transform.IsNull()))
     {
-    itkExceptionMacro(<< "m_Transform not up-to-date, call InstanciateTransform() first");
+    itkExceptionMacro(<< "m_Transform not up-to-date, call InstantiateTransform() first");
     }
 
   return this->m_Transform;
 }
 
 /**
- * Instanciate the transformation according to information
+ * Instantiate the transformation according to information
  */
 template<class TScalarType, unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
 GenericRSTransform<TScalarType, NInputDimensions, NOutputDimensions>
-::InstanciateTransform(void)
+::InstantiateTransform(void)
 {
   m_Transform = TransformType::New();
 
@@ -83,7 +83,7 @@ GenericRSTransform<TScalarType, NInputDimensions, NOutputDimensions>
     itk::ExposeMetaData<std::string>(m_InputDictionary, MetaDataKey::ProjectionRefKey, m_InputProjectionRef);
     }
 
-  otbMsgDevMacro(<< "Information to instanciate transform: ");
+  otbMsgDevMacro(<< "Information to instantiate transform: ");
   otbMsgDevMacro(<< " * Input Origin: " << m_InputOrigin);
   otbMsgDevMacro(<< " * Input Spacing: " << m_InputSpacing);
   otbMsgDevMacro(<< " * Input keyword list: "
@@ -309,7 +309,7 @@ GenericRSTransform<TScalarType, NInputDimensions, NOutputDimensions>
   inverseTransform->SetOutputOrigin(m_InputOrigin);
 
   // Instantiate transform
-  inverseTransform->InstanciateTransform();
+  inverseTransform->InstantiateTransform();
 
   return true;
 }
diff --git a/Modules/Core/Transform/include/otbGeoInformationConversion.h b/Modules/Core/Transform/include/otbGeoInformationConversion.h
index 37a141e..c408fce 100644
--- a/Modules/Core/Transform/include/otbGeoInformationConversion.h
+++ b/Modules/Core/Transform/include/otbGeoInformationConversion.h
@@ -20,6 +20,7 @@
 #define otbGeoInformationConversion_h
 
 #include <string>
+#include "OTBTransformExport.h"
 
 namespace otb
 {
@@ -34,11 +35,11 @@ namespace otb
 namespace GeoInformationConversion
 {
   /** method used to create a wkt from an epsg number  */
-  std::string ToWKT(int srid);
-  std::string ToWKT(const std::string& candidateSrid);
+  OTBTransform_EXPORT std::string ToWKT(int srid);
+  OTBTransform_EXPORT std::string ToWKT(const std::string& candidateSrid);
 
   /** this method try to morph a wkt to ESRI WKT format and returns the error code**/
-  bool IsESRIValidWKT(const std::string &Wkt);
+  OTBTransform_EXPORT bool IsESRIValidWKT(const std::string &Wkt);
 }
 
 } // End namespace otb
diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.txx b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.txx
index e9806ef..8f974d2 100644
--- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.txx
+++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.txx
@@ -77,7 +77,7 @@ ImageToGenericRSOutputParameters<TImage>
   m_Transform->SetOutputDictionary(this->GetInput()->GetMetaDataDictionary());
   m_Transform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef());
   m_Transform->SetOutputKeywordList(this->GetInput()->GetImageKeywordlist());
-  m_Transform->InstanciateTransform();
+  m_Transform->InstantiateTransform();
 }
 
 
@@ -165,7 +165,7 @@ void
 ImageToGenericRSOutputParameters<TImage>
 ::EstimateOutputOrigin()
 {
-  // Set the output orgin in carto
+  // Set the output origin in carto
   // projection
   PointType   origin;
   origin[0] = m_OutputExtent.minX + 0.5 * this->GetOutputSpacing()[0];
diff --git a/Modules/Core/Transform/include/otbStreamingWarpImageFilter.txx b/Modules/Core/Transform/include/otbStreamingWarpImageFilter.txx
index 08cb65d..00d071f 100644
--- a/Modules/Core/Transform/include/otbStreamingWarpImageFilter.txx
+++ b/Modules/Core/Transform/include/otbStreamingWarpImageFilter.txx
@@ -154,7 +154,7 @@ StreamingWarpImageFilter<TInputImage, TOutputImage, TDisplacementField>
     ++defIt;
     }
 
-  // Convert physical bouding box to requested region
+  // Convert physical bounding box to requested region
   typename InputImageType::IndexType inputStartIndex, inputEndIndex;
   inputPtr->TransformPhysicalPointToIndex(inputStartPoint, inputStartIndex);
   inputPtr->TransformPhysicalPointToIndex(inputEndPoint, inputEndIndex);
diff --git a/Modules/Core/Transform/include/otbTransform.h b/Modules/Core/Transform/include/otbTransform.h
index 167a739..9caa121 100644
--- a/Modules/Core/Transform/include/otbTransform.h
+++ b/Modules/Core/Transform/include/otbTransform.h
@@ -126,7 +126,7 @@ public:
 
   void ComputeJacobianWithRespectToParameters(const InputPointType  &, JacobianType& ) const ITK_OVERRIDE
   {
-    itkExceptionMacro(<<  "Subclasses should ITK_OVERRIDE this method (ComputeJacobianWithRespectToParamters)" );
+    itkExceptionMacro(<<  "Subclasses should ITK_OVERRIDE this method (ComputeJacobianWithRespectToParameters)" );
   }
 
   /** Set the transformation parameters and update internal transformation.
diff --git a/Modules/Core/Transform/otb-module.cmake b/Modules/Core/Transform/otb-module.cmake
index 3c4b916..8f6a150 100644
--- a/Modules/Core/Transform/otb-module.cmake
+++ b/Modules/Core/Transform/otb-module.cmake
@@ -4,6 +4,7 @@ itk -see itk::Transform-). this mainly concerns transformations of coordinates
 from any map projection or sensor model to any map projection or sensor model.")
 
 otb_module(OTBTransform
+ENABLE_SHARED
   DEPENDS
     OTBBoost
     OTBCommon
diff --git a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx
index 2d0abb3..5c2c4da 100644
--- a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx
+++ b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx
@@ -72,7 +72,7 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[])
       return EXIT_FAILURE;
     }
 
-  otbGenericMsgDebugMacro(<< "Foreward model creation...");
+  otbGenericMsgDebugMacro(<< "Forward model creation...");
   forward_model->SetImageGeometry(inputImage->GetImageKeywordlist());
   if( forward_model->IsValidSensorModel() == false )
     {
diff --git a/Modules/Core/Transform/test/otbGenericMapProjection.cxx b/Modules/Core/Transform/test/otbGenericMapProjection.cxx
index 8d80226..3480f85 100644
--- a/Modules/Core/Transform/test/otbGenericMapProjection.cxx
+++ b/Modules/Core/Transform/test/otbGenericMapProjection.cxx
@@ -29,7 +29,7 @@ int otbGenericMapProjection(int itkNotUsed(argc), char* argv[])
 
   file << std::setprecision(15);
 
-  /** Test the ability to instanciate a projection from a string*/
+  /** Test the ability to instantiate a projection from a string*/
   std::string projectionRefWkt =
     "PROJCS[\"UTM Zone 31, Northern Hemisphere\", GEOGCS[\"WGS 84\", DATUM[\"WGS_1984\", SPHEROID[\"WGS 84\", 6378137, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], TOWGS84[0, 0, 0, 0, 0, 0, 0], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.0174532925199433, AUTHORITY[\"EPSG\",\"9108\"]], AXIS[\"Lat\", NORTH], AXIS[\"Long\", EAST], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin [...]
 
diff --git a/Modules/Core/Transform/test/otbGenericRSTransform.cxx b/Modules/Core/Transform/test/otbGenericRSTransform.cxx
index 2899c5e..79e002d 100644
--- a/Modules/Core/Transform/test/otbGenericRSTransform.cxx
+++ b/Modules/Core/Transform/test/otbGenericRSTransform.cxx
@@ -72,7 +72,7 @@ int otbGenericRSTransform(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer wgs2utm        = TransformType::New();
   wgs2utm->SetInputProjectionRef(wgsRef);
   wgs2utm->SetOutputProjectionRef(utmRef);
-  wgs2utm->InstanciateTransform();
+  wgs2utm->InstantiateTransform();
 
   TransformType::Pointer utm2wgs        = TransformType::New();
   wgs2utm->GetInverse(utm2wgs);
@@ -80,7 +80,7 @@ int otbGenericRSTransform(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer wgs2lambert    = TransformType::New();
   wgs2lambert->SetInputProjectionRef(wgsRef);
   wgs2lambert->SetOutputProjectionRef(lambertRef);
-  wgs2lambert->InstanciateTransform();
+  wgs2lambert->InstantiateTransform();
 
   TransformType::Pointer lambert2wgs    = TransformType::New();
   wgs2lambert->GetInverse(lambert2wgs);
@@ -88,7 +88,7 @@ int otbGenericRSTransform(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer wgs2tmt        = TransformType::New();
   wgs2tmt->SetInputProjectionRef(wgsRef);
   wgs2tmt->SetOutputProjectionRef(tmtRef);
-  wgs2tmt->InstanciateTransform();
+  wgs2tmt->InstantiateTransform();
 
   TransformType::Pointer tmt2wgs        = TransformType::New();
   wgs2tmt->GetInverse(tmt2wgs);
@@ -96,27 +96,27 @@ int otbGenericRSTransform(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer wgs2wgs        = TransformType::New();
   wgs2wgs->SetInputProjectionRef(wgsRef);
   wgs2wgs->SetOutputProjectionRef(wgsRef);
-  wgs2wgs->InstanciateTransform();
+  wgs2wgs->InstantiateTransform();
 
   TransformType::Pointer utm2utm        = TransformType::New();
   utm2utm->SetInputProjectionRef(utmRef);
   utm2utm->SetOutputProjectionRef(utmRef);
-  utm2utm->InstanciateTransform();
+  utm2utm->InstantiateTransform();
 
   TransformType::Pointer lambert2lambert = TransformType::New();
   lambert2lambert->SetInputProjectionRef(lambertRef);
   lambert2lambert->SetOutputProjectionRef(lambertRef);
-  lambert2lambert->InstanciateTransform();
+  lambert2lambert->InstantiateTransform();
 
   TransformType::Pointer tmt2tmt        = TransformType::New();
   tmt2tmt->SetInputProjectionRef(tmtRef);
   tmt2tmt->SetOutputProjectionRef(tmtRef);
-  tmt2tmt->InstanciateTransform();
+  tmt2tmt->InstantiateTransform();
 
   TransformType::Pointer utm2lambert    = TransformType::New();
   utm2lambert->SetInputProjectionRef(utmRef);
   utm2lambert->SetOutputProjectionRef(lambertRef);
-  utm2lambert->InstanciateTransform();
+  utm2lambert->InstantiateTransform();
 
   TransformType::Pointer lambert2utm    = TransformType::New();
   utm2lambert->GetInverse(lambert2utm);
@@ -124,7 +124,7 @@ int otbGenericRSTransform(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer utm2tmt        = TransformType::New();
   utm2tmt->SetInputProjectionRef(utmRef);
   utm2tmt->SetOutputProjectionRef(tmtRef);
-  utm2tmt->InstanciateTransform();
+  utm2tmt->InstantiateTransform();
 
   TransformType::Pointer tmt2utm        = TransformType::New();
   utm2tmt->GetInverse(tmt2utm);
@@ -132,7 +132,7 @@ int otbGenericRSTransform(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer lambert2tmt    = TransformType::New();
   lambert2tmt->SetInputProjectionRef(lambertRef);
   lambert2tmt->SetOutputProjectionRef(tmtRef);
-  lambert2tmt->InstanciateTransform();
+  lambert2tmt->InstantiateTransform();
 
   TransformType::Pointer tmt2lambert    = TransformType::New();
   lambert2tmt->GetInverse(tmt2lambert);
diff --git a/Modules/Core/Transform/test/otbGenericRSTransformWithSRID.cxx b/Modules/Core/Transform/test/otbGenericRSTransformWithSRID.cxx
index 40474c4..02269e6 100644
--- a/Modules/Core/Transform/test/otbGenericRSTransformWithSRID.cxx
+++ b/Modules/Core/Transform/test/otbGenericRSTransformWithSRID.cxx
@@ -66,7 +66,7 @@ int otbGenericRSTransformWithSRID(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer wgs2utm        = TransformType::New();
   wgs2utm->SetInputProjectionRef("4326");   // WGS 84
   wgs2utm->SetOutputProjectionRef("32631"); // UTM 31 N
-  wgs2utm->InstanciateTransform();
+  wgs2utm->InstantiateTransform();
 
   TransformType::Pointer utm2wgs        = TransformType::New();
   wgs2utm->GetInverse(utm2wgs);
@@ -75,7 +75,7 @@ int otbGenericRSTransformWithSRID(int itkNotUsed(argc), char* argv[])
   wgs2lambert->SetInputProjectionRef("4326");   // WGS 84
   wgs2lambert->SetOutputProjectionRef(lambertRef);
 
-  wgs2lambert->InstanciateTransform();
+  wgs2lambert->InstantiateTransform();
 
   TransformType::Pointer lambert2wgs    = TransformType::New();
   wgs2lambert->GetInverse(lambert2wgs);
@@ -84,7 +84,7 @@ int otbGenericRSTransformWithSRID(int itkNotUsed(argc), char* argv[])
   wgs2tmt->SetInputProjectionRef("4326");   // WGS 84
   wgs2tmt->SetOutputProjectionRef(tmtRef);
 
-  wgs2tmt->InstanciateTransform();
+  wgs2tmt->InstantiateTransform();
 
   TransformType::Pointer tmt2wgs        = TransformType::New();
   wgs2tmt->GetInverse(tmt2wgs);
@@ -92,29 +92,29 @@ int otbGenericRSTransformWithSRID(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer wgs2wgs        = TransformType::New();
   wgs2wgs->SetInputProjectionRef("4326");   // WGS 84
   wgs2wgs->SetOutputProjectionRef("4326");  // WGS 84
-  wgs2wgs->InstanciateTransform();
+  wgs2wgs->InstantiateTransform();
 
   TransformType::Pointer utm2utm        = TransformType::New();
   utm2utm->SetInputProjectionRef("32631");   // UTM 31 N
   utm2utm->SetOutputProjectionRef("32631");  // UTM 31 N
-  utm2utm->InstanciateTransform();
+  utm2utm->InstantiateTransform();
 
   TransformType::Pointer lambert2lambert = TransformType::New();
   lambert2lambert->SetInputProjectionRef(lambertRef);
   lambert2lambert->SetOutputProjectionRef(lambertRef);
 
-  lambert2lambert->InstanciateTransform();
+  lambert2lambert->InstantiateTransform();
 
   TransformType::Pointer tmt2tmt        = TransformType::New();
   tmt2tmt->SetInputProjectionRef(tmtRef);
   tmt2tmt->SetOutputProjectionRef(tmtRef);
-  tmt2tmt->InstanciateTransform();
+  tmt2tmt->InstantiateTransform();
 
   TransformType::Pointer utm2lambert    = TransformType::New();
   utm2lambert->SetInputProjectionRef("32631");  // UTM
   utm2lambert->SetOutputProjectionRef(lambertRef);
 
-  utm2lambert->InstanciateTransform();
+  utm2lambert->InstantiateTransform();
 
   TransformType::Pointer lambert2utm    = TransformType::New();
   utm2lambert->GetInverse(lambert2utm);
@@ -122,7 +122,7 @@ int otbGenericRSTransformWithSRID(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer utm2tmt        = TransformType::New();
   utm2tmt->SetInputProjectionRef("32631");
   utm2tmt->SetOutputProjectionRef(tmtRef);
-  utm2tmt->InstanciateTransform();
+  utm2tmt->InstantiateTransform();
 
   TransformType::Pointer tmt2utm        = TransformType::New();
   utm2tmt->GetInverse(tmt2utm);
@@ -130,7 +130,7 @@ int otbGenericRSTransformWithSRID(int itkNotUsed(argc), char* argv[])
   TransformType::Pointer lambert2tmt    = TransformType::New();
   lambert2tmt->SetInputProjectionRef(lambertRef);
   lambert2tmt->SetOutputProjectionRef(tmtRef);
-  lambert2tmt->InstanciateTransform();
+  lambert2tmt->InstantiateTransform();
 
   TransformType::Pointer tmt2lambert    = TransformType::New();
   lambert2tmt->GetInverse(tmt2lambert);
diff --git a/Modules/Core/Transform/test/otbStreamingResampleImageFilterWithAffineTransform.cxx b/Modules/Core/Transform/test/otbStreamingResampleImageFilterWithAffineTransform.cxx
index 503e12f..fbe092b 100644
--- a/Modules/Core/Transform/test/otbStreamingResampleImageFilterWithAffineTransform.cxx
+++ b/Modules/Core/Transform/test/otbStreamingResampleImageFilterWithAffineTransform.cxx
@@ -51,7 +51,7 @@ int otbStreamingResampleImageFilterWithAffineTransform(int argc, char* argv[])
     // Instantiate an affine transformation Pointer
     AffineTransformType::Pointer affineTransform    = AffineTransformType::New();
 
-    // Instanciate reader
+    // Instantiate reader
     ReaderType::Pointer reader = ReaderType::New();
 
     // Get the image file
diff --git a/Modules/Core/VectorDataBase/include/otbPolygon.h b/Modules/Core/VectorDataBase/include/otbPolygon.h
index a16b1f9..20bfa3e 100644
--- a/Modules/Core/VectorDataBase/include/otbPolygon.h
+++ b/Modules/Core/VectorDataBase/include/otbPolygon.h
@@ -64,14 +64,14 @@ public:
   itkGetMacro(Epsilon, double);
 
   /**
-   * Check wether point is strictly inside the polygon.
+   * Check whether point is strictly inside the polygon.
    * \param point The point to check.
    * \return True if the point is inside the polygon.
    */
   bool IsInside(VertexType point) const;
 
   /**
-   * Check wether point is strictly on the edge of the polygon.
+   * Check whether point is strictly on the edge of the polygon.
    * \param point The point to check.
    * \return True if the point is on the edge of the polygon.
    */
@@ -94,7 +94,7 @@ public:
   unsigned int NbTouching(VertexType a, VertexType b) const;
 
   /**
-   * Check wether two segments [a1a2] and [b1b2] are strictly crossing.
+   * Check whether two segments [a1a2] and [b1b2] are strictly crossing.
    * \param a1 First point of the first segment,
    * \param a1 Second point of the first segment,
    * \param a1 First point of the second segment,
@@ -104,7 +104,7 @@ public:
   bool IsCrossing(VertexType a1, VertexType a2, VertexType b1, VertexType b2) const;
 
   /**
-   * Check wether two segments[a1a2] and [b1b2] are touching without crossing.
+   * Check whether two segments[a1a2] and [b1b2] are touching without crossing.
    * \param a1 First point of the first segment,
    * \param a1 Second point of the first segment,
    * \param a1 First point of the second segment,
diff --git a/Modules/Core/VectorDataBase/include/otbPolygon.txx b/Modules/Core/VectorDataBase/include/otbPolygon.txx
index 526d876..0a13887 100644
--- a/Modules/Core/VectorDataBase/include/otbPolygon.txx
+++ b/Modules/Core/VectorDataBase/include/otbPolygon.txx
@@ -33,7 +33,7 @@ Polygon<TValue>
 }
 
 /**
- * Check wether point is strictly inside the polygon.
+ * Check whether point is strictly inside the polygon.
  * \param point The point to check.
  * \return True if the point is inside the polygon.
  */
@@ -113,7 +113,7 @@ Polygon<TValue>
 }
 
 /**
- * Check wether point is strictly on the edge of the polygon.
+ * Check whether point is strictly on the edge of the polygon.
  * \param point The point to check.
  * \return True if the point is on the edge of the polygon.
  */
@@ -268,7 +268,7 @@ Polygon<TValue>
   return resp;
 }
 /**
- * Check wether two segments [a1a2] and [b1b2] are strictly crossing.
+ * Check whether two segments [a1a2] and [b1b2] are strictly crossing.
  * \param a1 First point of the first segment,
  * \param a1 Second point of the first segment,
  * \param a1 First point of the second segment,
@@ -325,7 +325,7 @@ Polygon<TValue>
   return resp;
 }
 /**
- * Check wether two segments[a1a2] and [b1b2] are touching without crossing.
+ * Check whether two segments[a1a2] and [b1b2] are touching without crossing.
  * \param a1 First point of the first segment,
  * \param a1 Second point of the first segment,
  * \param a1 First point of the second segment,
diff --git a/Modules/Core/VectorDataBase/include/otbVectorDataIOBase.h b/Modules/Core/VectorDataBase/include/otbVectorDataIOBase.h
index ae857e6..c01b295 100644
--- a/Modules/Core/VectorDataBase/include/otbVectorDataIOBase.h
+++ b/Modules/Core/VectorDataBase/include/otbVectorDataIOBase.h
@@ -25,6 +25,8 @@
 #include "itkPoint.h"
 #include "itkDataObject.h"
 
+#include "OTBVectorDataBaseExport.h"
+
 namespace otb
 {
 
@@ -52,7 +54,7 @@ namespace otb
  *
  * \ingroup OTBVectorDataBase
  */
-class ITK_EXPORT VectorDataIOBase : public itk::LightProcessObject
+class OTBVectorDataBase_EXPORT VectorDataIOBase : public itk::LightProcessObject
 {
 public:
   /** Standard class typedefs. */
@@ -117,7 +119,7 @@ public:
     return false;
   }
 
-  /*   /\** Read the spacing and dimentions of the VectorData. */
+  /*   /\** Read the spacing and dimensions of the VectorData. */
   /*    * Assumes SetFileName has been called with a valid file name. *\/ */
   /*   virtual void ReadVectorDataInformation() = 0; */
 
diff --git a/Modules/Core/VectorDataBase/include/otbVectorDataKeywordlist.h b/Modules/Core/VectorDataBase/include/otbVectorDataKeywordlist.h
index 7f86a6d..81edc0a 100644
--- a/Modules/Core/VectorDataBase/include/otbVectorDataKeywordlist.h
+++ b/Modules/Core/VectorDataBase/include/otbVectorDataKeywordlist.h
@@ -46,8 +46,9 @@ namespace otb
  *
  * \ingroup OTBVectorDataBase
  */
+#include "OTBVectorDataBaseExport.h"
 
-class VectorDataKeywordlist
+class OTBVectorDataBase_EXPORT VectorDataKeywordlist
 {
 public:
   /** Smart pointer typedef support. */
@@ -162,7 +163,7 @@ private:
   FieldListType m_FieldList;
 
 };
-
+OTBVectorDataBase_EXPORT
 extern std::ostream & operator <<(std::ostream& os, const VectorDataKeywordlist& kwl);
 
 }
diff --git a/Modules/Core/VectorDataBase/include/otbVectorDataProperties.txx b/Modules/Core/VectorDataBase/include/otbVectorDataProperties.txx
index 33de79d..9295504 100644
--- a/Modules/Core/VectorDataBase/include/otbVectorDataProperties.txx
+++ b/Modules/Core/VectorDataBase/include/otbVectorDataProperties.txx
@@ -71,7 +71,7 @@ void
 VectorDataProperties<TVectorData>
 ::ComputeBoundingRegion()
 {
-  /** Initialize the bouding region to null*/
+  /** Initialize the bounding region to null*/
   IndexType index;
   SizeType  size;
   index.Fill(itk::NumericTraits<Type>::ZeroValue());
diff --git a/Modules/Core/VectorDataBase/include/otbVectorDataSource.h b/Modules/Core/VectorDataBase/include/otbVectorDataSource.h
index 029c859..0a2a188 100644
--- a/Modules/Core/VectorDataBase/include/otbVectorDataSource.h
+++ b/Modules/Core/VectorDataBase/include/otbVectorDataSource.h
@@ -19,7 +19,7 @@
 #ifndef otbVectorDataSource_h
 #define otbVectorDataSource_h
 
-
+#include "OTBVectorDataBaseExport.h"
 #include "itkProcessObject.h"
 #include "itkMacro.h"
 
@@ -36,7 +36,7 @@ namespace otb
  */
 
 template <class TOutputVectorData>
-class ITK_EXPORT VectorDataSource : public itk::ProcessObject
+class ITK_ABI_EXPORT VectorDataSource : public itk::ProcessObject
 {
 public:
 
diff --git a/Modules/Core/VectorDataBase/otb-module.cmake b/Modules/Core/VectorDataBase/otb-module.cmake
index ea1dc85..92c6e17 100644
--- a/Modules/Core/VectorDataBase/otb-module.cmake
+++ b/Modules/Core/VectorDataBase/otb-module.cmake
@@ -2,6 +2,7 @@ set(DOCUMENTATION "This module contains base classes for representing vector
 data (see also VectorDataIO and VectorDataManipulation modules).")
 
 otb_module(OTBVectorDataBase
+ENABLE_SHARED
   DEPENDS
     OTBCommon
     OTBGDAL
diff --git a/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx b/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx
index 4cb63fe..ff4d413 100644
--- a/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx
+++ b/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx
@@ -39,7 +39,7 @@ typedef double     CoordRepType;
 typedef otb::Image<PixelType, Dimension>                               ImageType;
 typedef otb::VectorData<>                                              VectorDataType;
 typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType>  FunctionType;
-typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType> AdapatedFunctionType;
+typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType> AdaptedFunctionType;
 
 typedef itk::VariableLengthVector<FunctionPrecisionType> SampleType;
 typedef itk::Statistics::ListSample<SampleType>          ListSampleType;
@@ -140,7 +140,7 @@ int otbDescriptorsListSampleGenerator(int argc, char* argv[])
   //imageReader->Update();
   //vectorDataReader->Update();
 
-  AdapatedFunctionType::Pointer descriptorsFunction = AdapatedFunctionType::New();
+  AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New();
   descriptorsFunction->SetInputImage(imageReader->GetOutput());
   descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(5);
 
@@ -214,7 +214,7 @@ int otbDescriptorsSVMModelCreation(int argc, char* argv[])
   //imageReader->Update();
   //vectorDataReader->Update();
 
-  AdapatedFunctionType::Pointer descriptorsFunction = AdapatedFunctionType::New();
+  AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New();
   descriptorsFunction->SetInputImage(imageReader->GetOutput());
   descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(neighborhood);
 
diff --git a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h b/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h
index 6f5b324..a78f3a1 100644
--- a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h
+++ b/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h
@@ -48,7 +48,7 @@ namespace otb
  * processed to improve the results removing some occultations and false
  * detections.
  *
- * The full method is detailled in E. Christophe and J. Inglada, "Robust Road
+ * The full method is detailed in E. Christophe and J. Inglada, "Robust Road
  * Extraction for High Resolution Satellite Images," in IEEE International
  * Conference on Image Processing, ICIP'07, 2007.
  *
diff --git a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h
index a9e5a1c..a82ea0a 100644
--- a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h
+++ b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h
@@ -93,16 +93,16 @@ protected:
    * \param v2 second vertex (first path ending),
    * \param v3 third vertex (second path beginning),
    * \param v4 fourth vertex (second path after beginning),
-   * \return True or false wether the condition is verified or not.
+   * \return True or false whether the condition is verified or not.
    **/
   bool VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
 
   /**
    * Actually link the end of path p1 to the beginning of path p2.
    * \param p1 First path to link,
-   * \param revert1 wether p1 need to be reverted or not,
+   * \param revert1 whether p1 need to be reverted or not,
    * \param p2 second path to link,
-   * \param revert2 wether p2 need to be reverted or not,
+   * \param revert2 whether p2 need to be reverted or not,
    * \return the linked path.
    */
   PathPointerType LinkPath(PathPointerType p1, bool revert1, PathPointerType p2, bool revert2);
diff --git a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.txx b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.txx
index d102bab..6c2a863 100644
--- a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.txx
+++ b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.txx
@@ -219,7 +219,7 @@ LinkPathListFilter<TPath>
  * \param v2 second vertex (first path ending),
  * \param v3 third vertex (second path beginning),
  * \param v4 fourth vertex (second path after beginning),
- * \return True or false wether the condition is verified or not.
+ * \return True or false whether the condition is verified or not.
  **/
 template <class TPath>
 bool
@@ -251,9 +251,9 @@ LinkPathListFilter<TPath>
 /**
  * Actually link the end of path p1 to the beginning of path p2.
  * \param p1 First path to link,
- * \param revert1 wether p1 need to be reverted or not,
+ * \param revert1 whether p1 need to be reverted or not,
  * \param p2 second path to link,
- * \param revert2 wether p2 need to be reverted or not,
+ * \param revert2 whether p2 need to be reverted or not,
  * \return the linked path.
  */
 template <class TPath>
diff --git a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.txx b/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.txx
index ec95e1d..75c3204 100644
--- a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.txx
+++ b/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.txx
@@ -81,7 +81,7 @@ NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection>
 
     while ((!neighInputIt.IsAtEnd()) && (!outputIt.IsAtEnd()) && (!outputDirIt.IsAtEnd()))
       {
-      // local variable intialization
+      // local variable initialization
       int    neighborhoodNumberMax = 0;
       double scalarMaxValue = 0;
       //TODO for a more general algorithm this might be replaced by:
diff --git a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h
index 815e43f..5f5b19c 100644
--- a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h
+++ b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h
@@ -103,7 +103,7 @@ protected:
   * (not necessarily the path ending).
   * Return true if the condition is verified.
   *
-  * This is the first criteria to be fullfilled.
+  * This is the first criteria to be fulfilled.
   **/
   bool VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
 
@@ -116,7 +116,7 @@ protected:
   * (not necessarily the path ending).
   * Return true if the condition is verified.
   *
-  * This is the second criteria to be fullfilled.
+  * This is the second criteria to be fulfilled.
   **/
   bool VerifyMaxDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
 
@@ -131,7 +131,7 @@ protected:
   * (not necessarily the path ending).
   * Return true if the condition is verified.
   *
-  * This is the third criteria to be fullfilled.
+  * This is the third criteria to be fulfilled.
   **/
   bool VerifyCommonDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
 
diff --git a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.txx b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.txx
index e117e47..0bb6a90 100644
--- a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.txx
+++ b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.txx
@@ -178,7 +178,7 @@ ParallelLinePathListFilter<TPath>
  * (not necessarily the path ending).
  * Return true if the condition is verified.
  *
- * This is the first criteria to be fullfilled.
+ * This is the first criteria to be fulfilled.
  **/
 template <class TPath>
 bool
@@ -207,7 +207,7 @@ ParallelLinePathListFilter<TPath>
  * (not necessarily the path ending).
  * Return true if the condition is verified.
  *
- * This is the second criteria to be fullfilled.
+ * This is the second criteria to be fulfilled.
  **/
 template <class TPath>
 bool
@@ -246,7 +246,7 @@ ParallelLinePathListFilter<TPath>
  * (not necessarily the path ending).
  * Return true if the condition is verified.
  *
- * This is the third criteria to be fullfilled.
+ * This is the third criteria to be fulfilled.
  **/
 template <class TPath>
 bool
diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h
index 9e3282d..4ebf69c 100644
--- a/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h
+++ b/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h
@@ -34,7 +34,7 @@ namespace otb
    * the PathMeanDistanceFunctor.
    *
    *<b>Recent API changes:</b>
-   * Now part of the UnaryFunctorObjectListBooleanFilter hierachy, replace call to SetMeanDistanceThreshold()
+   * Now part of the UnaryFunctorObjectListBooleanFilter hierarchy, replace call to SetMeanDistanceThreshold()
    * by GetFunctor().SetThreshold().
    *
    * The inequality is now a strict one.
diff --git a/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h
index 8470045..351a510 100644
--- a/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h
+++ b/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h
@@ -36,7 +36,7 @@ namespace otb
    *  vertices between them, the euclidean distance to this line is computed. If for one vertex, this distance
    *  is upper than the tolerance threshold, the path is considered to be inconsistent and no vertices can be removed.
    *
-   *  If the path is considered consistent (which will occure at least with a 2 vertices path),
+   *  If the path is considered consistent (which will occur at least with a 2 vertices path),
    * only the beginning and ending
    *  vertices are kept and a new search iteration begin at its end.
    *
@@ -46,7 +46,7 @@ namespace otb
    * the SimplifyPathFunctor.
    *
    *   <b>Recent API changes:</b>
-   * Now part of the UnaryFunctorObjectListFilter hierachy, replace call to SetTolerance()
+   * Now part of the UnaryFunctorObjectListFilter hierarchy, replace call to SetTolerance()
    * by GetFunctor().SetTolerance().
    *
    *
diff --git a/Modules/Detection/RoadExtraction/test/CMakeLists.txt b/Modules/Detection/RoadExtraction/test/CMakeLists.txt
index d123b70..b0fa655 100644
--- a/Modules/Detection/RoadExtraction/test/CMakeLists.txt
+++ b/Modules/Detection/RoadExtraction/test/CMakeLists.txt
@@ -211,14 +211,14 @@ otb_add_test(NAME feTpSimplifyManyPathListFilter COMMAND otbRoadExtractionTestDr
 
 otb_add_test(NAME feTvNeighborhoodScalarProductFilter COMMAND otbRoadExtractionTestDriver
   --compare-n-images ${EPSILON_6} 2
-  ${BASELINE}/feTvNeigborhoodScalarProductModulusOutput.hdr
-  ${TEMP}/feTvNeigborhoodScalarProductModulusOutput.hdr
-  ${BASELINE}/feTvNeigborhoodScalarProductDirectionOutput.hdr
-  ${TEMP}/feTvNeigborhoodScalarProductDirectionOutput.hdr
+  ${BASELINE}/feTvNeighborhoodScalarProductModulusOutput.hdr
+  ${TEMP}/feTvNeighborhoodScalarProductModulusOutput.hdr
+  ${BASELINE}/feTvNeighborhoodScalarProductDirectionOutput.hdr
+  ${TEMP}/feTvNeighborhoodScalarProductDirectionOutput.hdr
   otbNeighborhoodScalarProductFilter
   ${INPUTDATA}/InputForRoadDetection_SpectralAngle.hdr
-  ${TEMP}/feTvNeigborhoodScalarProductModulusOutput.hdr
-  ${TEMP}/feTvNeigborhoodScalarProductDirectionOutput.hdr
+  ${TEMP}/feTvNeighborhoodScalarProductModulusOutput.hdr
+  ${TEMP}/feTvNeighborhoodScalarProductDirectionOutput.hdr
   1.0
   )
 
diff --git a/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.h b/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.h
index 17b142a..c9e71cd 100644
--- a/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.h
+++ b/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.h
@@ -95,7 +95,7 @@ public:
 protected:
 
   /**
-   * Without the GenrateOutputInformation below it does not work
+   * Without the GenerateOutputInformation below it does not work
    * Because the ProcessObject class do a static_cast to allow memory and copy
    * the output (here a pointset). It works fine with images but with pointsets
    * no size is specified ...
diff --git a/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.txx b/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.txx
index fc396e5..18b31e1 100644
--- a/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.txx
+++ b/Modules/Feature/Corner/include/otbLineSpatialObjectListToRightAnglePointSetFilter.txx
@@ -81,7 +81,7 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage, TLinesList, TPointSet>
   /** Get The input Lines*/
   typename InputLinesListType::Pointer inputLinesList = const_cast<InputLinesListType *>(this->GetInput());
 
-  /** Instancition of Cheking availability Matrix*/
+  /** Instancition of Checking availability Matrix*/
   unsigned int numberOfLines = inputLinesList->size();
   checkMatrixType              segmentsUsedMatrix(numberOfLines, numberOfLines);
   segmentsUsedMatrix.Fill(0);
diff --git a/Modules/Feature/Corner/include/otbVectorDataToRightAngleVectorDataFilter.h b/Modules/Feature/Corner/include/otbVectorDataToRightAngleVectorDataFilter.h
index db552a5..d247194 100644
--- a/Modules/Feature/Corner/include/otbVectorDataToRightAngleVectorDataFilter.h
+++ b/Modules/Feature/Corner/include/otbVectorDataToRightAngleVectorDataFilter.h
@@ -33,7 +33,7 @@ namespace otb
  *  included in the input VectorData. It outputs a vector data
  *  containing right angle localizations symbolized by points.
  *
- *  The entire input vector data will be processed concidering the two
+ *  The entire input vector data will be processed considering the two
  *  firsts vertex of each line features as a segment.
  *
  *
diff --git a/Modules/Feature/Corner/test/otbLineSpatialObjectListToRightAnglePointSetFilterByStepsOutputAscii.cxx b/Modules/Feature/Corner/test/otbLineSpatialObjectListToRightAnglePointSetFilterByStepsOutputAscii.cxx
index 076f478..0cdc158 100644
--- a/Modules/Feature/Corner/test/otbLineSpatialObjectListToRightAnglePointSetFilterByStepsOutputAscii.cxx
+++ b/Modules/Feature/Corner/test/otbLineSpatialObjectListToRightAnglePointSetFilterByStepsOutputAscii.cxx
@@ -135,7 +135,7 @@ int otbLineSpatialObjectListToRightAnglePointSetFilterByStepsOutputAscii(int itk
     segmentOrtho->GetPoint(i, &pRight);
     outfile << " Right Angle found in point : " <<  pRight << std::endl;
 
-    /** Exemple To extract The coordinate of the segment (Just for example)*/
+    /** Example To extract The coordinate of the segment (Just for example)*/
     segmentOrtho->GetPointData(i, &outputVectorLines);
     outputLinesList->push_back(outputVectorLines[0]);
     outputLinesList->push_back(outputVectorLines[1]);
diff --git a/Modules/Feature/Descriptors/include/otbImageToHessianDeterminantImageFilter.txx b/Modules/Feature/Descriptors/include/otbImageToHessianDeterminantImageFilter.txx
index 3b1e401..7438a4b 100644
--- a/Modules/Feature/Descriptors/include/otbImageToHessianDeterminantImageFilter.txx
+++ b/Modules/Feature/Descriptors/include/otbImageToHessianDeterminantImageFilter.txx
@@ -29,7 +29,7 @@ template <class TInputImage, class TOutputImage, class TPrecision>
 ImageToHessianDeterminantImageFilter<TInputImage, TOutputImage, TPrecision>
 ::ImageToHessianDeterminantImageFilter()
 {
-  // Filter intialization
+  // Filter initialization
   m_HessianFilter = ImageToHessianImageFilterType::New();
   m_DeterminantFilter = DeterminantFilterType::New();
 
diff --git a/Modules/Feature/Descriptors/include/otbImageToSURFKeyPointSetFilter.txx b/Modules/Feature/Descriptors/include/otbImageToSURFKeyPointSetFilter.txx
index f274b78..45f1405 100644
--- a/Modules/Feature/Descriptors/include/otbImageToSURFKeyPointSetFilter.txx
+++ b/Modules/Feature/Descriptors/include/otbImageToSURFKeyPointSetFilter.txx
@@ -551,7 +551,7 @@ ImageToSURFKeyPointSetFilter<TInputImage, TOutputPointSet>
 
     if (dist < 6 * S)
       {
-      // Haar Wavelets responses accumulated in an histogram with Pi/3 precison
+      // Haar Wavelets responses accumulated in an histogram with Pi/3 precision
       if ((col > pas && col < Largeur - pas) && (raw > pas && raw < Largeur - pas))
         {
 
diff --git a/Modules/Feature/Descriptors/include/otbKeyPointSetsMatchingFilter.h b/Modules/Feature/Descriptors/include/otbKeyPointSetsMatchingFilter.h
index 9e656a4..4a33e40 100644
--- a/Modules/Feature/Descriptors/include/otbKeyPointSetsMatchingFilter.h
+++ b/Modules/Feature/Descriptors/include/otbKeyPointSetsMatchingFilter.h
@@ -32,7 +32,7 @@ namespace otb
  *   template parameters. It has to implement the Evaluate() method (see EuclideanDistanceMetric for more details).
  *
  *   By default, the algorithm tries to match points from pointset 1 to points from pointset 2. If back matching is activated,
- *   it will aslo try to match points from pointset 2 to points from pointset 2, and discard matches that do not appear both in
+ *   it will also try to match points from pointset 2 to points from pointset 2, and discard matches that do not appear both in
  *   forward and backward matching.
  *
  *   Matches are stored in a landmark object containing both matched points and point data. The landmark data will hold the distance value
diff --git a/Modules/Feature/Descriptors/include/otbSiftFastImageFilter.h b/Modules/Feature/Descriptors/include/otbSiftFastImageFilter.h
index 41062e2..f0da039 100644
--- a/Modules/Feature/Descriptors/include/otbSiftFastImageFilter.h
+++ b/Modules/Feature/Descriptors/include/otbSiftFastImageFilter.h
@@ -88,16 +88,16 @@ public:
 
 protected:
   /** Actually process the input */
-  virtual void GenerateData();
+  void GenerateData() ITK_OVERRIDE;
 
   /** Constructor */
   SiftFastImageFilter();
 
   /** Destructor */
-  virtual ~SiftFastImageFilter() {}
+  ~SiftFastImageFilter() ITK_OVERRIDE {}
 
   /** PrintSelf method */
-  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
 private:
   /** The number of scales */
diff --git a/Modules/Feature/Descriptors/test/CMakeLists.txt b/Modules/Feature/Descriptors/test/CMakeLists.txt
index f6e2fed..3edb18f 100644
--- a/Modules/Feature/Descriptors/test/CMakeLists.txt
+++ b/Modules/Feature/Descriptors/test/CMakeLists.txt
@@ -275,10 +275,13 @@ otb_add_test(NAME feTvImageToFastSIFTKeyPointSetFilterSceneOutputInterestPointAs
   6
   )
 
+# RK: 06/2016. the root cause of this test having different output on platforms comes from libsiftfast (3rd party code)
+# Until there is a fix, that failure cannot be attributed to OTB or dashboard results
+#  --ignore-order --epsilon-boundary 0.01 --compare-ascii ${EPSILON_2}
+#  ${BASELINE_FILES}/feTvImageToFastSIFTKeyPointSetFilterSceneKeysOutputDescriptor.txt
+#  ${TEMP}/feTvImageToFastSIFTKeyPointSetFilterSceneKeysOutputDescriptor.txt
+
 otb_add_test(NAME feTvImageToFastSIFTKeyPointSetFilterSceneOutputDescriptorAscii COMMAND otbDescriptorsTestDriver
-  --ignore-order --epsilon-boundary 0.01 --compare-ascii ${EPSILON_2}
-  ${BASELINE_FILES}/feTvImageToFastSIFTKeyPointSetFilterSceneKeysOutputDescriptor.txt
-  ${TEMP}/feTvImageToFastSIFTKeyPointSetFilterSceneKeysOutputDescriptor.txt
   otbImageToFastSIFTKeyPointSetFilterOutputDescriptorAscii
   ${INPUTDATA}/ROI_IKO_PAN_LesHalles_sub.tif
   ${TEMP}/feTvImageToFastSIFTKeyPointSetFilterSceneKeysOutputDescriptor.txt
diff --git a/Modules/Feature/Edge/include/otbAssymmetricFusionOfLineDetectorImageFilter.h b/Modules/Feature/Edge/include/otbAssymmetricFusionOfLineDetectorImageFilter.h
index 01b90d7..0225c60 100644
--- a/Modules/Feature/Edge/include/otbAssymmetricFusionOfLineDetectorImageFilter.h
+++ b/Modules/Feature/Edge/include/otbAssymmetricFusionOfLineDetectorImageFilter.h
@@ -24,6 +24,8 @@
 #include "otbLineCorrelationDetectorImageFilter.h"
 #include "otbAssociativeSymmetricalSumImageFilter.h"
 
+#include "vcl_deprecated_header.h"
+
 namespace otb
 {
 
diff --git a/Modules/Feature/Edge/include/otbAsymmetricFusionOfLineDetectorImageFilter.h b/Modules/Feature/Edge/include/otbAsymmetricFusionOfLineDetectorImageFilter.h
new file mode 100644
index 0000000..d1a7640
--- /dev/null
+++ b/Modules/Feature/Edge/include/otbAsymmetricFusionOfLineDetectorImageFilter.h
@@ -0,0 +1,108 @@
+/*=========================================================================
+
+  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 otbAsymmetricFusionOfLineDetectorImageFilter_h
+#define otbAsymmetricFusionOfLineDetectorImageFilter_h
+
+#include "itkImageToImageFilter.h"
+
+#include "otbLineRatioDetectorImageFilter.h"
+#include "otbLineCorrelationDetectorImageFilter.h"
+#include "otbAssociativeSymmetricalSumImageFilter.h"
+
+namespace otb
+{
+
+/** \class AsymmetricFusionOfLineDetectorImageFilter
+ *
+ * This class implements a composite filter that combines three filters:
+ * two filters of line detector ( a line detector by ratio and a line
+ * detector by croos-correlation) and a filter that produces a fusion of
+ * those two line detector filters.
+ *
+ *
+ * \ingroup OTBEdge
+ */
+
+template <class TInputImage,
+    class TOutputImage,
+    class TOutputImageDirection = TOutputImage,
+    class TInterpolator = itk::LinearInterpolateImageFunction<TInputImage> >
+class ITK_EXPORT AsymmetricFusionOfLineDetectorImageFilter :
+  public LineDetectorImageFilterBase<TInputImage, TOutputImage, TOutputImageDirection, TInterpolator>
+{
+public:
+
+  itkStaticConstMacro(InputImageDimension,
+                      unsigned int,
+                      TInputImage::ImageDimension);
+  itkStaticConstMacro(OutputImageDimension,
+                      unsigned int,
+                      TOutputImage::ImageDimension);
+
+  typedef AsymmetricFusionOfLineDetectorImageFilter                                                   Self;
+  typedef LineDetectorImageFilterBase<TInputImage, TOutputImage, TOutputImageDirection, TInterpolator> Superclass;
+  typedef itk::SmartPointer<Self>                                                                      Pointer;
+  typedef itk::SmartPointer<const Self>                                                                ConstPointer;
+
+  itkNewMacro(Self);
+
+  itkTypeMacro(AsymmetricFusionOfLineDetectorImageFilter, LineDetectorImageFilterBase);
+
+  typedef typename Superclass::InputImageType           InputImageType;
+  typedef typename Superclass::OutputImageType          OutputImageType;
+  typedef typename Superclass::OutputImageDirectionType OutputImageDirectionType;
+  typedef typename Superclass::InterpolatorType         InterpolatorType;
+
+  typedef OutputImageType InputImageType1;
+  typedef OutputImageType InputImageType2;
+
+  typedef typename InputImageType::PixelType InputPixelType;
+  typedef typename InputImageType::SizeType  SizeType;
+
+  typedef typename OutputImageType::PixelType OutputPixelType;
+
+protected:
+  AsymmetricFusionOfLineDetectorImageFilter();
+  ~AsymmetricFusionOfLineDetectorImageFilter() ITK_OVERRIDE {}
+
+  typedef otb::LineRatioDetectorImageFilter<InputImageType, OutputImageType, OutputImageDirectionType,
+      InterpolatorType>        LineRatioType;
+  typedef otb::LineCorrelationDetectorImageFilter<InputImageType, OutputImageType, OutputImageDirectionType,
+      InterpolatorType>  LineCorrelationType;
+  typedef otb::AssociativeSymmetricalSumImageFilter<InputImageType1, InputImageType2,
+      OutputImageType> AssSymSumType;
+
+  void GenerateData() ITK_OVERRIDE;
+
+  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
+
+private:
+  AsymmetricFusionOfLineDetectorImageFilter(const Self &); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+
+  typename LineRatioType::Pointer m_LineRatio;
+  typename LineCorrelationType::Pointer m_LineCorrelation;
+  typename AssSymSumType::Pointer m_AssSymSum;
+};
+} // end namespace otb
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbAsymmetricFusionOfLineDetectorImageFilter.txx"
+#endif
+
+#endif
diff --git a/Modules/Feature/Edge/include/otbAsymmetricFusionOfLineDetectorImageFilter.txx b/Modules/Feature/Edge/include/otbAsymmetricFusionOfLineDetectorImageFilter.txx
new file mode 100644
index 0000000..870c41a
--- /dev/null
+++ b/Modules/Feature/Edge/include/otbAsymmetricFusionOfLineDetectorImageFilter.txx
@@ -0,0 +1,79 @@
+/*=========================================================================
+
+  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 otbAsymmetricFusionOfLineDetectorImageFilter_txx
+#define otbAsymmetricFusionOfLineDetectorImageFilter_txx
+
+#include "otbAsymmetricFusionOfLineDetectorImageFilter.h"
+
+namespace otb
+{
+
+/**
+ *
+ */
+template <class TInputImage, class TOutputImage, class TOutputImageDirection, class TInterpolator>
+AsymmetricFusionOfLineDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection, TInterpolator>
+::AsymmetricFusionOfLineDetectorImageFilter()
+{
+  this->m_Radius.Fill(1);
+  this->m_LengthLine = 1;
+  this->m_WidthLine = 0;
+  this->m_NumberOfDirections = 8;
+
+  m_LineRatio         = LineRatioType::New();
+  m_LineCorrelation   = LineCorrelationType::New();
+  m_AssSymSum         = AssSymSumType::New();
+}
+
+template <class TInputImage, class TOutputImage, class TOutputImageDirection, class TInterpolator>
+void
+AsymmetricFusionOfLineDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection, TInterpolator>
+::GenerateData()
+{
+  m_LineRatio->SetInput( this->GetInput() );
+  m_LineRatio->SetLengthLine( this->m_LengthLine );
+  m_LineRatio->SetWidthLine( this->m_WidthLine );
+  m_LineRatio->SetNumberOfDirections( this->m_NumberOfDirections );
+
+  m_LineCorrelation->SetInput( this->GetInput() );
+  m_LineCorrelation->SetLengthLine( this->m_LengthLine );
+  m_LineCorrelation->SetWidthLine( this->m_WidthLine );
+  m_LineCorrelation->SetNumberOfDirections( this->m_NumberOfDirections );
+
+  m_AssSymSum->SetInput1( m_LineRatio->GetOutput() );
+  m_AssSymSum->SetInput2( m_LineCorrelation->GetOutput() );
+
+  m_AssSymSum->GraftOutput(this->GetOutput() );
+  m_AssSymSum->Update();
+  this->GraftOutput(m_AssSymSum->GetOutput() );
+}
+
+/**
+ * Standard "PrintSelf" method
+ */
+template <class TInputImage, class TOutputImage, class TOutputImageDirection, class TInterpolator>
+void
+AsymmetricFusionOfLineDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection, TInterpolator>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+}
+} //namespace otb
+#endif
+
+
diff --git a/Modules/Feature/Edge/include/otbHorizontalSobelVectorImageFilter.h b/Modules/Feature/Edge/include/otbHorizontalSobelVectorImageFilter.h
index 6788cf9..a94cc99 100644
--- a/Modules/Feature/Edge/include/otbHorizontalSobelVectorImageFilter.h
+++ b/Modules/Feature/Edge/include/otbHorizontalSobelVectorImageFilter.h
@@ -67,7 +67,7 @@ class ITK_EXPORT HorizontalSobelVectorImageFilter
               typename TOutputImage::PixelType > >
 {
 public:
-  /** Standart class typedefs */
+  /** Standard class typedefs */
   typedef HorizontalSobelVectorImageFilter Self;
   typedef UnaryFunctorNeighborhoodVectorImageFilter< TInputImage, TOutputImage,
             Functor::HorizontalSobelOperator<
diff --git a/Modules/Feature/Edge/include/otbLineSegmentDetector.txx b/Modules/Feature/Edge/include/otbLineSegmentDetector.txx
index e3eea27..4526557 100644
--- a/Modules/Feature/Edge/include/otbLineSegmentDetector.txx
+++ b/Modules/Feature/Edge/include/otbLineSegmentDetector.txx
@@ -182,7 +182,7 @@ LineSegmentDetector<TInputImage, TPrecision>
   SizeType       size = modulusImage->GetRequestedRegion().GetSize();
   InputIndexType id = modulusImage->GetRequestedRegion().GetIndex();
 
-  // Don't take in carre the boudary of the image.
+  // Don't take in carre the boundary of the image.
   // Special cases for streamed call
   if (modulusImage->GetRequestedRegion().GetIndex()[0] == 0)
     {
@@ -392,7 +392,7 @@ LineSegmentDetector<TInputImage, TPrecision>
 
   if (nfa_rect > 0.) return nfa_rect;
 
-  /*Try to improve the precison of the oriented */
+  /*Try to improve the precision of the oriented */
   CopyRectangle(r, rec);
   for (n = 0; n < 5; ++n)
     {
diff --git a/Modules/Feature/Edge/include/otbSobelVectorImageFilter.h b/Modules/Feature/Edge/include/otbSobelVectorImageFilter.h
index aac4016..3221ff9 100644
--- a/Modules/Feature/Edge/include/otbSobelVectorImageFilter.h
+++ b/Modules/Feature/Edge/include/otbSobelVectorImageFilter.h
@@ -76,7 +76,7 @@ class ITK_EXPORT SobelVectorImageFilter
               typename TOutputImage::PixelType > >
 {
 public:
-  /** Standart class typedefs */
+  /** Standard class typedefs */
   typedef SobelVectorImageFilter Self;
   typedef UnaryFunctorNeighborhoodVectorImageFilter< TInputImage, TOutputImage,
             Functor::SobelOperator<
diff --git a/Modules/Feature/Edge/include/otbStreamingLineSegmentDetector.txx b/Modules/Feature/Edge/include/otbStreamingLineSegmentDetector.txx
index c9d4abf..e73febc 100644
--- a/Modules/Feature/Edge/include/otbStreamingLineSegmentDetector.txx
+++ b/Modules/Feature/Edge/include/otbStreamingLineSegmentDetector.txx
@@ -73,7 +73,7 @@ PersistentStreamingLineSegmentDetector<TInputImage>
   extract->SetExtractionRegion( this->GetInput()->GetBufferedRegion() );
   extract->Update();
 
-  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionnary
+  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionary
   // but LSD filter need the projection ref if available
   extract->GetOutput()->SetMetaDataDictionary(this->GetInput()->GetMetaDataDictionary());
 
diff --git a/Modules/Feature/Edge/include/otbTouziEdgeDetectorImageFilter.h b/Modules/Feature/Edge/include/otbTouziEdgeDetectorImageFilter.h
index 1cabe79..35fe682 100644
--- a/Modules/Feature/Edge/include/otbTouziEdgeDetectorImageFilter.h
+++ b/Modules/Feature/Edge/include/otbTouziEdgeDetectorImageFilter.h
@@ -31,7 +31,7 @@ namespace otb
  * This class implements the Touzi's ratio edge detector used to detect
  * contours.
  *
- * We define a square region of size 2n+1 that we devided in two regions.
+ * We define a square region of size 2n+1 that we divided in two regions.
  *
  * The response of the edge detector between two regions 1 and 2 in
  * one direction \f$ \theta_{i} \f$ is:
@@ -110,7 +110,7 @@ protected:
   /** TouziEdgeDetectorImageFilter can be implemented for a multithreaded filter treatment.
    * Thus, this implementation give the ThreadedGenerateData() method.
    * that is called for each process thread. Image datas are automatically allocated
-   * throught the parent class calling the ThreadedGenerateData() method.
+   * through the parent class calling the ThreadedGenerateData() method.
    * ThreadedGenerateData() can only write the area of the image specified by the parameter "outputRegionForThread"
    *
    * \sa ImageToImageFilter::ThreadedGenerateData(),
diff --git a/Modules/Feature/Edge/include/otbVerticalSobelVectorImageFilter.h b/Modules/Feature/Edge/include/otbVerticalSobelVectorImageFilter.h
index db5f316..989382e 100644
--- a/Modules/Feature/Edge/include/otbVerticalSobelVectorImageFilter.h
+++ b/Modules/Feature/Edge/include/otbVerticalSobelVectorImageFilter.h
@@ -67,7 +67,7 @@ class ITK_EXPORT VerticalSobelVectorImageFilter
               typename TOutputImage::PixelType > >
 {
 public:
-  /** Standart class typedefs */
+  /** Standard class typedefs */
   typedef VerticalSobelVectorImageFilter Self;
   typedef UnaryFunctorNeighborhoodVectorImageFilter< TInputImage, TOutputImage,
             Functor::VerticalSobelOperator<
diff --git a/Modules/Feature/Edge/test/CMakeLists.txt b/Modules/Feature/Edge/test/CMakeLists.txt
index e647bf8..c95a008 100644
--- a/Modules/Feature/Edge/test/CMakeLists.txt
+++ b/Modules/Feature/Edge/test/CMakeLists.txt
@@ -5,7 +5,7 @@ otbEdgeTestDriver.cxx
 otbPixelSuppressionByDirectionNew.cxx
 otbEdgeDetectorImageFilter.cxx
 otbHorizontalSobelVectorImageFilter.cxx
-otbAssymmetricFusionOfLineDetector.cxx
+otbAsymmetricFusionOfLineDetector.cxx
 otbLocalHoughDraw.cxx
 otbAssociativeSymmetricalSum.cxx
 otbPersistentVectorizationFilterNew.cxx
@@ -23,7 +23,7 @@ otbEdgeDensityImageFilterNew.cxx
 otbLocalHough.cxx
 otbExtractSegments.cxx
 otbExtractSegmentsNew.cxx
-otbAssymmetricFusionOfLineDetectorNew.cxx
+otbAsymmetricFusionOfLineDetectorNew.cxx
 otbLineRatioDetector.cxx
 otbTouziEdgeDetectorDirection.cxx
 otbTouziEdgeDetectorNew.cxx
@@ -70,12 +70,12 @@ otb_add_test(NAME bfTvHorizontalSobelVectorImageFilter COMMAND otbEdgeTestDriver
 otb_add_test(NAME bfTuHorizontalSobelVectorImageFilterNew COMMAND otbEdgeTestDriver
   otbHorizontalSobelVectorImageFilterNewTest)
 
-otb_add_test(NAME feTvAssymmetricFusionOfLineDetector COMMAND otbEdgeTestDriver
-  --compare-image ${EPSILON_8}  ${BASELINE}/feFiltreAssymmetricFusion_amst_2_3.hdr
-  ${TEMP}/feFiltreAssymmetricFusion_amst_2_3.hdr
-  otbAssymmetricFusionOfLineDetector
+otb_add_test(NAME feTvAsymmetricFusionOfLineDetector COMMAND otbEdgeTestDriver
+  --compare-image ${EPSILON_8}  ${BASELINE}/feFiltreAsymmetricFusion_amst_2_3.hdr
+  ${TEMP}/feFiltreAsymmetricFusion_amst_2_3.hdr
+  otbAsymmetricFusionOfLineDetector
   ${INPUTDATA}/amst.png
-  ${TEMP}/feFiltreAssymmetricFusion_amst_2_3.hdr
+  ${TEMP}/feFiltreAsymmetricFusion_amst_2_3.hdr
   2 3)
 
 
@@ -210,8 +210,8 @@ otb_add_test(NAME feTvExtractSegments COMMAND otbEdgeTestDriver
 otb_add_test(NAME feTuExtractSegmentsNew COMMAND otbEdgeTestDriver
   otbExtractSegmentsNew)
 
-otb_add_test(NAME feTuAssymmetricFusionOfLineDetectorNew COMMAND otbEdgeTestDriver
-  otbAssymmetricFusionOfLineDetectorNew)
+otb_add_test(NAME feTuAsymmetricFusionOfLineDetectorNew COMMAND otbEdgeTestDriver
+  otbAsymmetricFusionOfLineDetectorNew)
 
 otb_add_test(NAME feTvLineRatio COMMAND otbEdgeTestDriver
   --compare-image ${EPSILON_8}  ${BASELINE}/feFiltreLineRatio_amst_2_3.hdr
diff --git a/Modules/Feature/Edge/test/otbAssymmetricFusionOfLineDetector.cxx b/Modules/Feature/Edge/test/otbAssymmetricFusionOfLineDetector.cxx
deleted file mode 100644
index aa59a2c..0000000
--- a/Modules/Feature/Edge/test/otbAssymmetricFusionOfLineDetector.cxx
+++ /dev/null
@@ -1,72 +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 "itkMacro.h"
-#include <iostream>
-
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbAssymmetricFusionOfLineDetectorImageFilter.h"
-
-int otbAssymmetricFusionOfLineDetector(int itkNotUsed(argc), char * argv[])
-{
-  const char * inputFilename  = argv[1];
-  const char * outputFilename = argv[2];
-
-  // Width of the linear feature = 2*WidthLine+1
-  unsigned int WidthLine((unsigned int) ::atoi(argv[3]));
-  // Length of the linear feature = 2*LengthLine+1
-  unsigned int LengthLine((unsigned int) ::atoi(argv[4]));
-
-  typedef unsigned char InputPixelType;
-  typedef double        OutputPixelType;
-  const unsigned int Dimension = 2;
-
-  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageDirectionType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef itk::LinearInterpolateImageFunction<InputImageType, double> InterpolatorType;
-
-  typedef otb::AssymmetricFusionOfLineDetectorImageFilter<InputImageType, OutputImageType, OutputImageDirectionType,
-      InterpolatorType> FilterType;
-
-  FilterType::Pointer FilterAssSymSum = FilterType::New();
-
-  FilterAssSymSum->SetWidthLine(WidthLine);
-  FilterAssSymSum->SetLengthLine(LengthLine);
-
-  ReaderType::Pointer reader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-
-  reader->SetFileName(inputFilename);
-  writer->SetFileName(outputFilename);
-
-  FilterAssSymSum->SetInput(reader->GetOutput());
-  writer->SetInput(FilterAssSymSum->GetOutput());
-
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Feature/Edge/test/otbAssymmetricFusionOfLineDetectorNew.cxx b/Modules/Feature/Edge/test/otbAssymmetricFusionOfLineDetectorNew.cxx
deleted file mode 100644
index 511a61a..0000000
--- a/Modules/Feature/Edge/test/otbAssymmetricFusionOfLineDetectorNew.cxx
+++ /dev/null
@@ -1,51 +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 "itkMacro.h"
-
-#include <iostream>
-
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-
-#include "otbAssymmetricFusionOfLineDetectorImageFilter.h"
-
-int otbAssymmetricFusionOfLineDetectorNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
-{
-  typedef unsigned char InputPixelType;
-  typedef double        OutputPixelType;
-  const unsigned int Dimension = 2;
-
-  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageDirectionType;
-
-  typedef itk::LinearInterpolateImageFunction<InputImageType, double> InterpolatorType;
-
-  typedef otb::AssymmetricFusionOfLineDetectorImageFilter<InputImageType, OutputImageType, OutputImageDirectionType,
-      InterpolatorType> FilterType;
-
-  FilterType::Pointer filter = FilterType::New();
-
-  std::cout << filter << std::endl;
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Feature/Edge/test/otbAsymmetricFusionOfLineDetector.cxx b/Modules/Feature/Edge/test/otbAsymmetricFusionOfLineDetector.cxx
new file mode 100644
index 0000000..0e63d7b
--- /dev/null
+++ b/Modules/Feature/Edge/test/otbAsymmetricFusionOfLineDetector.cxx
@@ -0,0 +1,72 @@
+/*=========================================================================
+
+  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 "itkMacro.h"
+#include <iostream>
+
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbAsymmetricFusionOfLineDetectorImageFilter.h"
+
+int otbAsymmetricFusionOfLineDetector(int itkNotUsed(argc), char * argv[])
+{
+  const char * inputFilename  = argv[1];
+  const char * outputFilename = argv[2];
+
+  // Width of the linear feature = 2*WidthLine+1
+  unsigned int WidthLine((unsigned int) ::atoi(argv[3]));
+  // Length of the linear feature = 2*LengthLine+1
+  unsigned int LengthLine((unsigned int) ::atoi(argv[4]));
+
+  typedef unsigned char InputPixelType;
+  typedef double        OutputPixelType;
+  const unsigned int Dimension = 2;
+
+  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
+  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
+  typedef otb::Image<OutputPixelType, Dimension> OutputImageDirectionType;
+
+  typedef otb::ImageFileReader<InputImageType>  ReaderType;
+  typedef otb::ImageFileWriter<OutputImageType> WriterType;
+
+  typedef itk::LinearInterpolateImageFunction<InputImageType, double> InterpolatorType;
+
+  typedef otb::AsymmetricFusionOfLineDetectorImageFilter<InputImageType, OutputImageType, OutputImageDirectionType,
+      InterpolatorType> FilterType;
+
+  FilterType::Pointer FilterAssSymSum = FilterType::New();
+
+  FilterAssSymSum->SetWidthLine(WidthLine);
+  FilterAssSymSum->SetLengthLine(LengthLine);
+
+  ReaderType::Pointer reader = ReaderType::New();
+  WriterType::Pointer writer = WriterType::New();
+
+  reader->SetFileName(inputFilename);
+  writer->SetFileName(outputFilename);
+
+  FilterAssSymSum->SetInput(reader->GetOutput());
+  writer->SetInput(FilterAssSymSum->GetOutput());
+
+  writer->Update();
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Feature/Edge/test/otbAsymmetricFusionOfLineDetectorNew.cxx b/Modules/Feature/Edge/test/otbAsymmetricFusionOfLineDetectorNew.cxx
new file mode 100644
index 0000000..e79a58f
--- /dev/null
+++ b/Modules/Feature/Edge/test/otbAsymmetricFusionOfLineDetectorNew.cxx
@@ -0,0 +1,51 @@
+/*=========================================================================
+
+  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 "itkMacro.h"
+
+#include <iostream>
+
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+
+#include "otbAsymmetricFusionOfLineDetectorImageFilter.h"
+
+int otbAsymmetricFusionOfLineDetectorNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
+{
+  typedef unsigned char InputPixelType;
+  typedef double        OutputPixelType;
+  const unsigned int Dimension = 2;
+
+  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
+  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
+  typedef otb::Image<OutputPixelType, Dimension> OutputImageDirectionType;
+
+  typedef itk::LinearInterpolateImageFunction<InputImageType, double> InterpolatorType;
+
+  typedef otb::AsymmetricFusionOfLineDetectorImageFilter<InputImageType, OutputImageType, OutputImageDirectionType,
+      InterpolatorType> FilterType;
+
+  FilterType::Pointer filter = FilterType::New();
+
+  std::cout << filter << std::endl;
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Feature/Edge/test/otbEdgeTestDriver.cxx b/Modules/Feature/Edge/test/otbEdgeTestDriver.cxx
index 3bdab86..4dd0f6c 100644
--- a/Modules/Feature/Edge/test/otbEdgeTestDriver.cxx
+++ b/Modules/Feature/Edge/test/otbEdgeTestDriver.cxx
@@ -5,7 +5,7 @@ void RegisterTests()
   REGISTER_TEST(otbEdgeDetectorImageFilter);
   REGISTER_TEST(otbHorizontalSobelVectorImageFilterNewTest);
   REGISTER_TEST(otbHorizontalSobelVectorImageFilterTest);
-  REGISTER_TEST(otbAssymmetricFusionOfLineDetector);
+  REGISTER_TEST(otbAsymmetricFusionOfLineDetector);
   REGISTER_TEST(otbLocalHoughDraw);
   REGISTER_TEST(otbAssociativeSymmetricalSum);
   REGISTER_TEST(otbPersistentVectorizationFilterNew);
@@ -24,7 +24,7 @@ void RegisterTests()
   REGISTER_TEST(otbLocalHough);
   REGISTER_TEST(otbExtractSegments);
   REGISTER_TEST(otbExtractSegmentsNew);
-  REGISTER_TEST(otbAssymmetricFusionOfLineDetectorNew);
+  REGISTER_TEST(otbAsymmetricFusionOfLineDetectorNew);
   REGISTER_TEST(otbLineRatioDetector);
   REGISTER_TEST(otbTouziEdgeDetectorDirection);
   REGISTER_TEST(otbTouziEdgeDetectorNew);
diff --git a/Modules/Feature/Moments/include/otbComplexMomentsImageFunction.txx b/Modules/Feature/Moments/include/otbComplexMomentsImageFunction.txx
index 349ba60..d79b171 100644
--- a/Modules/Feature/Moments/include/otbComplexMomentsImageFunction.txx
+++ b/Modules/Feature/Moments/include/otbComplexMomentsImageFunction.txx
@@ -60,10 +60,10 @@ ComplexMomentsImageFunction<TInputImage, TCoordRep>
   // Initialize moments
   for (unsigned int p = 0; p <= m_Pmax; p++)
     {
-    moments.at(p).resize(m_Qmax+1);
+    moments[p].resize(m_Qmax+1);
     for (unsigned int q = 0; q <= m_Qmax; q++)
       {
-      moments.at(p).at(q) =  ScalarComplexType(0.0, 0.0);
+      moments[p][q] =  ScalarComplexType(0.0, 0.0);
       }
     }
 
@@ -110,25 +110,25 @@ ComplexMomentsImageFunction<TInputImage, TCoordRep>
 	  ScalarComplexType pow2(1,0);
 	  if(p!=0 || x!=0 || y != 0)
 	    {
-	      pow1=vcl_pow(xpy,p);
+	      pow1 = std::pow(xpy, static_cast<int>(p) );
 	    }
 	  if(q!=0 || x!=0 || y != 0)
 	    {
-	      pow2=vcl_pow(xqy,q);
+	      pow2 = std::pow(xqy, static_cast<int>(q) );
 	    }
-	  
-	  moments.at(p).at(q) += pow1 * pow2 * value;
-	  
+
+	  moments[p][q] += pow1 * pow2 * value;
+
         }
       }
     }
-  
+
   // Normalisation
   for (int p = m_Pmax; p >= 0; p--)
     {
     for (int q= m_Qmax; q >= 0; q--)
       {
-      moments.at(p).at(q) /= moments.at(0).at(0);
+      moments[p][q] /= moments[0][0];
       }
     }
 
diff --git a/Modules/Feature/Moments/include/otbFlusserMomentsImageFunction.txx b/Modules/Feature/Moments/include/otbFlusserMomentsImageFunction.txx
index 6ae90ae..525cb17 100644
--- a/Modules/Feature/Moments/include/otbFlusserMomentsImageFunction.txx
+++ b/Modules/Feature/Moments/include/otbFlusserMomentsImageFunction.txx
@@ -71,7 +71,7 @@ FlusserMomentsImageFunction<TInputImage, TCoordRep>
   // Define complex type
   typedef std::complex<ScalarRealType> ComplexType;
 
-  // Define and intialize cumulants for complex moments
+  // Define and initialize cumulants for complex moments
   ComplexType c11, c12, c21, c20, c30, c22, c31, c40;
   c11 = itk::NumericTraits<ComplexType>::Zero;
   c12 = itk::NumericTraits<ComplexType>::Zero;
diff --git a/Modules/Feature/Moments/include/otbHuMomentsImageFunction.txx b/Modules/Feature/Moments/include/otbHuMomentsImageFunction.txx
index 8be5f71..c02d2da 100644
--- a/Modules/Feature/Moments/include/otbHuMomentsImageFunction.txx
+++ b/Modules/Feature/Moments/include/otbHuMomentsImageFunction.txx
@@ -71,7 +71,7 @@ HuMomentsImageFunction<TInputImage, TCoordRep>
   // Define complex type
   typedef std::complex<ScalarRealType> ComplexType;
 
-  // Define and intialize cumulants for complex moments
+  // Define and initialize cumulants for complex moments
   ComplexType c11, c20, c02, c30, c03, c21, c12;
   c11 = itk::NumericTraits<ComplexType>::Zero;
   c20 = itk::NumericTraits<ComplexType>::Zero;
diff --git a/Modules/Feature/Moments/include/otbRadiometricMomentsImageFilter.h b/Modules/Feature/Moments/include/otbRadiometricMomentsImageFilter.h
index 8b718f7..27d6222 100644
--- a/Modules/Feature/Moments/include/otbRadiometricMomentsImageFilter.h
+++ b/Modules/Feature/Moments/include/otbRadiometricMomentsImageFilter.h
@@ -77,7 +77,7 @@ public:
     itkSetMacro(Radius, InputImageSizeType);
     itkGetMacro(Radius, InputImageSizeType);
 
-    /** Set unsinged int radius */
+    /** Set unsigned int radius */
     void SetRadius(unsigned int radius)
     {
       m_Radius.Fill(radius);
diff --git a/Modules/Feature/Textures/include/otbGreyLevelCooccurrenceIndexedList.h b/Modules/Feature/Textures/include/otbGreyLevelCooccurrenceIndexedList.h
index 7c03056..198fc68 100644
--- a/Modules/Feature/Textures/include/otbGreyLevelCooccurrenceIndexedList.h
+++ b/Modules/Feature/Textures/include/otbGreyLevelCooccurrenceIndexedList.h
@@ -39,7 +39,7 @@ namespace otb
 * as a lookup array with size as [nbbins x nbbins]. The lookup array stores
 * position CooccurrencePairType in the VectorType. It ensures us that all elements
 * in Vector are unqiue in terms of the index value in the pair. For any given
-* pixel index, -1 value indicates zero existance of the index in the
+* pixel index, -1 value indicates zero existence of the index in the
 * VectorType. This avoid searching all elements in VectorType for each pixel
 * index added during neighborhood iterator. It is also used to decide wheather
 * to update the frequency of pair or to insert a new element in the vector.
@@ -118,7 +118,7 @@ public:
   VectorType GetVector();
 
   /** Initialize the lowerbound and upper bound vecotor, Fill m_LookupArray with
-    * -1 and set m_TotalFreqency to zero */
+    * -1 and set m_TotalFrequency to zero */
   void Initialize(const unsigned int nbins, const PixelValueType min,
                   const PixelValueType max, const bool symmetry = true);
 
@@ -139,7 +139,7 @@ protected:
 
   /** create a cooccurrence pair with given index and frequency = 1
     * value. Next occurrence of same index is checked via m_LookupArray and the
-    * correspoding frequency value is incremented. If m_Symmetry is true the
+    * corresponding frequency value is incremented. If m_Symmetry is true the
     * co-occurrence pair is added again with index values swapped */
   void AddPairToVector(IndexType index);
 
diff --git a/Modules/Feature/Textures/include/otbHaralickTexturesImageFunction.txx b/Modules/Feature/Textures/include/otbHaralickTexturesImageFunction.txx
index f88081c..0e12bbc 100644
--- a/Modules/Feature/Textures/include/otbHaralickTexturesImageFunction.txx
+++ b/Modules/Feature/Textures/include/otbHaralickTexturesImageFunction.txx
@@ -135,7 +135,7 @@ HaralickTexturesImageFunction<TInputImage, TCoordRep>
   double marginalDevSquared = 0.;
   double pixelVariance = 0.;
 
-  //Create and Intialize marginalSums
+  //Create and Initialize marginalSums
   std::vector<double> marginalSums(m_NumberOfBinsPerAxis, 0);
 
   //get co-occurrence vector and totalfrequency
diff --git a/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h b/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h
index cb04ff9..456cf4a 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h
+++ b/Modules/Feature/Textures/include/otbScalarImageToAdvancedTexturesFilter.h
@@ -219,7 +219,7 @@ private:
   /** Offset for co-occurence */
   OffsetType m_Offset;
 
-  /** Radius of the neighborhood iterator which is minumum of m_Radius */
+  /** Radius of the neighborhood iterator which is minimum of m_Radius */
   SizeType m_NeighborhoodRadius;
 
   /** Number of bins per axis */
diff --git a/Modules/Feature/Textures/include/otbScalarImageToPanTexTextureFilter.txx b/Modules/Feature/Textures/include/otbScalarImageToPanTexTextureFilter.txx
index c355964..439d359 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToPanTexTextureFilter.txx
+++ b/Modules/Feature/Textures/include/otbScalarImageToPanTexTextureFilter.txx
@@ -165,7 +165,7 @@ ScalarImageToPanTexTextureFilter<TInputImage, TOutputImage>
 
 
       SizeType neighborhoodRadius;
-      /** calulate minimum offset and set it as neigborhood radius **/
+      /** calculate minimum offset and set it as neighborhood radius **/
       unsigned int minRadius = 0;
       for ( unsigned int i = 0; i < currentOffset.GetOffsetDimension(); i++ )
         {
diff --git a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h
index 3c02ade..bb40e17 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h
+++ b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.h
@@ -215,7 +215,7 @@ private:
   /** Offset for co-occurence */
   OffsetType m_Offset;
 
-  /** Radius of the neighborhood iterator which is minumum of m_Radius */
+  /** Radius of the neighborhood iterator which is minimum of m_Radius */
   SizeType m_NeighborhoodRadius;
 
   /** Number of bins per axis */
diff --git a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx
index 7607041..c67e3a9 100644
--- a/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx
+++ b/Modules/Feature/Textures/include/otbScalarImageToTexturesFilter.txx
@@ -333,7 +333,7 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
     double marginalDevSquared = 0.;
     double pixelVariance = 0.;
 
-    //Create and Intialize marginalSums
+    //Create and Initialize marginalSums
     std::vector<double> marginalSums(m_NumberOfBinsPerAxis, 0);
 
     //get co-occurrence vector and totalfrequency
@@ -396,7 +396,7 @@ ScalarImageToTexturesFilter<TInputImage, TOutputImage>
       pixelVarianceSquared = 1.;
       }
 
-    //Initalize texture variables;
+    //Initialize texture variables;
     PixelValueType energy      = itk::NumericTraits< PixelValueType >::Zero;
     PixelValueType entropy     = itk::NumericTraits< PixelValueType >::Zero;
     PixelValueType correlation = itk::NumericTraits< PixelValueType >::Zero;
diff --git a/Modules/Feature/Textures/test/otbGreyLevelCooccurrenceIndexedList.cxx b/Modules/Feature/Textures/test/otbGreyLevelCooccurrenceIndexedList.cxx
index f938065..1a69d38 100644
--- a/Modules/Feature/Textures/test/otbGreyLevelCooccurrenceIndexedList.cxx
+++ b/Modules/Feature/Textures/test/otbGreyLevelCooccurrenceIndexedList.cxx
@@ -84,7 +84,7 @@ int otbGreyLevelCooccurrenceIndexedList(int, char* [] )
     bool passed = true;
     try
       {
-      // Check Intialize method.
+      // Check Initialize method.
       cooccurrenceObj1->Initialize(4, 0, 8);
       bool symmetry = cooccurrenceObj1->GetSymmetry();
       float totalFrequency = cooccurrenceObj1->GetTotalFrequency();
diff --git a/Modules/Filtering/ChangeDetection/include/otbKullbackLeiblerDistanceImageFilter.h b/Modules/Filtering/ChangeDetection/include/otbKullbackLeiblerDistanceImageFilter.h
index c29c345..cd0e11a 100644
--- a/Modules/Filtering/ChangeDetection/include/otbKullbackLeiblerDistanceImageFilter.h
+++ b/Modules/Filtering/ChangeDetection/include/otbKullbackLeiblerDistanceImageFilter.h
@@ -67,7 +67,7 @@ public:
 
 protected:
 
-  /** Moment estimation from intial neighborhood */
+  /** Moment estimation from initial neighborhood */
   void  MakeSumAndMoments(const TInput& input);
   /** Moment estimation from raw data */
   void  MakeSumAndMoments(const itk::Image<typename TInput::ImageType::PixelType, 1> * input);
diff --git a/Modules/Filtering/ChangeDetection/include/otbMultivariateAlterationDetectorImageFilter.txx b/Modules/Filtering/ChangeDetection/include/otbMultivariateAlterationDetectorImageFilter.txx
index 6080c21..ec05f08 100644
--- a/Modules/Filtering/ChangeDetection/include/otbMultivariateAlterationDetectorImageFilter.txx
+++ b/Modules/Filtering/ChangeDetection/include/otbMultivariateAlterationDetectorImageFilter.txx
@@ -152,7 +152,7 @@ MultivariateAlterationDetectorImageFilter<TInputImage, TOutputImage>
 
     m_V1 = ges.V;
 
-    // Compute cannonical correlation matrix
+    // Compute canonical correlation matrix
     m_Rho = ges.D.get_diagonal();
     m_Rho = m_Rho.apply(&vcl_sqrt);
 
diff --git a/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerDistanceImageFilter.cxx b/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerDistanceImageFilter.cxx
index 0630081..a2e0062 100644
--- a/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerDistanceImageFilter.cxx
+++ b/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerDistanceImageFilter.cxx
@@ -26,7 +26,7 @@ int otbKullbackLeiblerDistanceImageFilter(int argc, char * argv[])
   if (argc != 5)
     {
     std::cerr <<
-    "Detection de changements par mesure de Kullback-Leibler, optimisee par un developpement de Edgeworth\n";
+    "Detection de changements par mesure de Kullback-Leibler, optimisee par un development de Edgeworth\n";
     std::cerr << argv[0] << " imgAv imgAp imgResu winSize\n";
     return 1;
     }
diff --git a/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerProfileImageFilter.cxx b/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerProfileImageFilter.cxx
index 625d2f7..9af4b35 100644
--- a/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerProfileImageFilter.cxx
+++ b/Modules/Filtering/ChangeDetection/test/otbKullbackLeiblerProfileImageFilter.cxx
@@ -27,7 +27,7 @@ int otbKullbackLeiblerProfileImageFilter(int argc, char * argv[])
   if (argc != 6)
     {
     std::cerr <<
-    "Detection de changements par mesure de Kullback-Leibler, optimisee par un developpement de Edgeworth\n";
+    "Detection de changements par mesure de Kullback-Leibler, optimisee par un development de Edgeworth\n";
     std::cerr << argv[0] << " imgAv imgAp imgResu winSizeMin winSizeMax\n";
     return 1;
     }
diff --git a/Modules/Filtering/ColorMap/include/otbReliefColormapFunctor.txx b/Modules/Filtering/ColorMap/include/otbReliefColormapFunctor.txx
index 4134e5d..12ad6a3 100644
--- a/Modules/Filtering/ColorMap/include/otbReliefColormapFunctor.txx
+++ b/Modules/Filtering/ColorMap/include/otbReliefColormapFunctor.txx
@@ -30,10 +30,10 @@ ReliefColormapFunctor<TScalar, TRGBPixel>
 ::operator() (const TScalar &v) const
 {
 
-  float m_Borders[]     = {0.0,  0.00001, 0.2,  0.43, 0.71, 1.0};
-  float m_RedValues[]   = {0.75, 0.64,    0.47, 0.89, 0.58, 1.0};
-  float m_GreenValues[] = {0.91, 0.84,    0.76, 0.90, 0.32, 1.0};
-  float m_BlueValues[]  = {0.96, 0.59,    0.40, 0.57, 0.00, 1.0};
+  float m_Borders[]     = {0.0f,  0.00001f, 0.2f,  0.43f, 0.71f, 1.0f};
+  float m_RedValues[]   = {0.75f, 0.64f,    0.47f, 0.89f, 0.58f, 1.0f};
+  float m_GreenValues[] = {0.91f, 0.84f,    0.76f, 0.90f, 0.32f, 1.0f};
+  float m_BlueValues[]  = {0.96f, 0.59f,    0.40f, 0.57f, 0.00f, 1.0f};
 
   // Map the input scalar between [0, 1].
   RealType value = this->RescaleInputValue(v);
diff --git a/Modules/Filtering/Convolution/include/otbGaborFilterGenerator.h b/Modules/Filtering/Convolution/include/otbGaborFilterGenerator.h
index 9871761..d5807f1 100644
--- a/Modules/Filtering/Convolution/include/otbGaborFilterGenerator.h
+++ b/Modules/Filtering/Convolution/include/otbGaborFilterGenerator.h
@@ -42,7 +42,7 @@ namespace otb
  * known as the carrier, and a gaussian-shaped function, also knwown as the envelop.
  *
  * Please note that this helper class generates a filter whose coefficients are the real part
- * of a complex Gabor fucntion.
+ * of a complex Gabor function.
  *
  * The formula used to compute these coefficients is as follows:
  *
@@ -83,7 +83,7 @@ public:
   itkNewMacro(Self);
   itkTypeMacro(GaborFilterGenerator, Object);
 
-  // usefull typedefs
+  // useful typedefs
   typedef TPrecision                PrecisionType;
   typedef itk::Array<PrecisionType> ArrayType;
   typedef itk::Size<2>              RadiusType;
@@ -141,7 +141,7 @@ private:
   /** Output filter coefficient array */
   ArrayType m_Filter;
 
-  /** Wether we need to regenerate the filter */
+  /** Whether we need to regenerate the filter */
   mutable bool m_NeedToRegenerateFilter;
 
 };
diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h
index e6d5790..3d68568 100644
--- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h
+++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h
@@ -105,7 +105,15 @@ public:
   itkGetMacro(AboveEllipsoid,bool);
   itkBooleanMacro(AboveEllipsoid);
 
-  void InstanciateTransform();
+  void InstantiateTransform();
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  void InstanciateTransform()
+  {
+    otbWarningMacro(
+      << "InstanciateTransform has been deprecated.  Please use InstanciateTransform() instead");
+    this->InstantiateTransform();
+  }
 
   /**
    * Set/Get input & output projections.
@@ -168,7 +176,7 @@ public:
     this->SetOutputProjectionRef(image->GetProjectionRef());
     this->SetOutputKeywordList(image->GetImageKeywordlist());
 
-    InstanciateTransform();
+    InstantiateTransform();
     }
 
 protected:
diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.txx b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.txx
index 3d80be2..842d396 100644
--- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.txx
+++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.txx
@@ -78,19 +78,19 @@ void DEMToImageGenerator<TDEMImage>
     }
 }
 
-// InstanciateTransform method
+// InstantiateTransform method
 template <class TDEMImage>
 void DEMToImageGenerator<TDEMImage>
-::InstanciateTransform()
+::InstantiateTransform()
 {
-  m_Transform->InstanciateTransform();
+  m_Transform->InstantiateTransform();
 }
 
 template <class TDEMImage>
 void DEMToImageGenerator<TDEMImage>
 ::BeforeThreadedGenerateData()
 {
-  InstanciateTransform();
+  InstantiateTransform();
   DEMImagePointerType DEMImage = this->GetOutput();
 
   // allocate the output buffer
diff --git a/Modules/Filtering/DEM/test/otbDEMToImageGeneratorFromImageTest.cxx b/Modules/Filtering/DEM/test/otbDEMToImageGeneratorFromImageTest.cxx
index 16c4bbb..8536c7d 100644
--- a/Modules/Filtering/DEM/test/otbDEMToImageGeneratorFromImageTest.cxx
+++ b/Modules/Filtering/DEM/test/otbDEMToImageGeneratorFromImageTest.cxx
@@ -109,7 +109,7 @@ int otbDEMToImageGeneratorFromImageTest(int argc, char * argv[])
     {
     char * outputName2 = argv[4];
     generatorFilter2->SetOutputParametersFromImage(reader->GetOutput());
-    generatorFilter2->InstanciateTransform();
+    generatorFilter2->InstantiateTransform();
 
     extract2->SetInput(generatorFilter2->GetOutput());
     extract2->SetSizeX(atoi(argv[7]));
diff --git a/Modules/Filtering/DimensionalityReduction/include/otbEstimateInnerProductPCAImageFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbEstimateInnerProductPCAImageFilter.h
index cc0ce6a..9fe806c 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbEstimateInnerProductPCAImageFilter.h
+++ b/Modules/Filtering/DimensionalityReduction/include/otbEstimateInnerProductPCAImageFilter.h
@@ -95,7 +95,7 @@ private:
   EstimateInnerProductPCAImageFilter(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
-  /** The number of output Pricipal Components */
+  /** The number of output Principal Components */
   unsigned int m_NumberOfPrincipalComponentsRequired;
 
   /** Enable/Disable center data */
diff --git a/Modules/Filtering/DimensionalityReduction/include/otbLocalActivityVectorImageFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbLocalActivityVectorImageFilter.h
index 388a81e..49f679f 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbLocalActivityVectorImageFilter.h
+++ b/Modules/Filtering/DimensionalityReduction/include/otbLocalActivityVectorImageFilter.h
@@ -89,7 +89,7 @@ class ITK_EXPORT LocalActivityVectorImageFilter
               typename TOutputImage::PixelType > >
 {
 public:
-  /** Standart class typedefs */
+  /** Standard class typedefs */
   typedef LocalActivityVectorImageFilter Self;
   typedef UnaryFunctorNeighborhoodVectorImageFilter< TInputImage, TOutputImage,
             Functor::LocalActivityOperator<
diff --git a/Modules/Filtering/DimensionalityReduction/include/otbSparseWvltToAngleMapperListFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbSparseWvltToAngleMapperListFilter.h
index ee7b9da..8f42047 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbSparseWvltToAngleMapperListFilter.h
+++ b/Modules/Filtering/DimensionalityReduction/include/otbSparseWvltToAngleMapperListFilter.h
@@ -33,7 +33,7 @@ namespace otb {
  *
  * This class performs a kind of scatter plot of wavelet coeff of N images and yields
  * the angle values (through a generalized spherical coordinate representation)) of
- * the most significant coeff (up to a threashold).
+ * the most significant coeff (up to a threshold).
  *
  * \ingroup Threaded
  *
diff --git a/Modules/Filtering/ImageManipulation/include/otbBinaryFunctorNeighborhoodVectorImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbBinaryFunctorNeighborhoodVectorImageFilter.h
index ccd6497..d254c2e 100644
--- a/Modules/Filtering/ImageManipulation/include/otbBinaryFunctorNeighborhoodVectorImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbBinaryFunctorNeighborhoodVectorImageFilter.h
@@ -25,7 +25,7 @@
 namespace otb
 {
 /** \class BinaryFunctorNeighborhoodVectorImageFilter
- * \brief Implements neighborhood-wise generic operation of two images beeing vector images.
+ * \brief Implements neighborhood-wise generic operation of two images being vector images.
  *
  * This class is parameterized over the types of the two input images
  * and the type of the output image.  It is also parameterized by the
diff --git a/Modules/Filtering/ImageManipulation/include/otbFlexibleDistanceWithMissingValue.h b/Modules/Filtering/ImageManipulation/include/otbFlexibleDistanceWithMissingValue.h
index ac156f9..0da1750 100644
--- a/Modules/Filtering/ImageManipulation/include/otbFlexibleDistanceWithMissingValue.h
+++ b/Modules/Filtering/ImageManipulation/include/otbFlexibleDistanceWithMissingValue.h
@@ -89,7 +89,7 @@ public:
 
   /** Set the value of the parameter a and b.
    * Those parameters are defined as static component in order to call it far
-   * away from the instanciation of the class (through the SOM training for instance) */
+   * away from the instantiation of the class (through the SOM training for instance) */
   static double Alpha;
   static double Beta;
   static void SetAlphaBeta(double a, double b);
@@ -102,7 +102,7 @@ protected:
   ~FlexibleDistanceWithMissingValue() ITK_OVERRIDE {}
 };  // end of class
 
-/** Static variable instanciation */
+/** Static variable instantiation */
 template<class TVector>
 double FlexibleDistanceWithMissingValue<TVector>::Alpha = 1.0;
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbGridResampleImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbGridResampleImageFilter.h
index d6e9e9e..78f3c3f 100644
--- a/Modules/Filtering/ImageManipulation/include/otbGridResampleImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbGridResampleImageFilter.h
@@ -37,7 +37,7 @@ namespace otb
  * 
  *  This is equivalent to a itk::ResampleImageFilter using an
  *  itk::IdentityTransform, except that it is slightly more efficient
- *  and that in this simplified case it is possible to explicitely
+ *  and that in this simplified case it is possible to explicitly
  *  compute the input requested region. The GridResampleImageFilter
  *  therefore supports streaming, contrary to the
  *  itk::ResampleImageFilter.
diff --git a/Modules/Filtering/ImageManipulation/include/otbImageToNoDataMaskFilter.h b/Modules/Filtering/ImageManipulation/include/otbImageToNoDataMaskFilter.h
index c15518d..22d7618 100644
--- a/Modules/Filtering/ImageManipulation/include/otbImageToNoDataMaskFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbImageToNoDataMaskFilter.h
@@ -139,6 +139,14 @@ protected:
     std::vector<double> noDataValues;
 
     ReadNoDataFlags(this->GetInput()->GetMetaDataDictionary(),noDataValueAvailable,noDataValues);
+
+    // don't pass empty containers to the functor
+    if (noDataValueAvailable.empty() || noDataValues.empty())
+      {
+      const TInputImage* input = this->GetInput();
+      noDataValueAvailable.assign(input->GetNumberOfComponentsPerPixel(),false);
+      noDataValues.assign(input->GetNumberOfComponentsPerPixel(),0.0);
+      }
     
     this->GetFunctor().m_Flags = noDataValueAvailable;
     this->GetFunctor().m_Values = noDataValues;
diff --git a/Modules/Filtering/ImageManipulation/include/otbImageToVectorImageCastFilter.h b/Modules/Filtering/ImageManipulation/include/otbImageToVectorImageCastFilter.h
index 566a1d1..2f63aca 100644
--- a/Modules/Filtering/ImageManipulation/include/otbImageToVectorImageCastFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbImageToVectorImageCastFilter.h
@@ -94,7 +94,7 @@ protected:
   ImageToVectorImageCastFilter() {}
   /// Detructor
   ~ImageToVectorImageCastFilter() ITK_OVERRIDE {}
-  /// Additionnal output information for allocation
+  /// Additional output information for allocation
   void GenerateOutputInformation(void) ITK_OVERRIDE
   {
     Superclass::GenerateOutputInformation();
diff --git a/Modules/Filtering/ImageManipulation/include/otbLocalGradientVectorImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbLocalGradientVectorImageFilter.h
index 7a20193..ee66de4 100644
--- a/Modules/Filtering/ImageManipulation/include/otbLocalGradientVectorImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbLocalGradientVectorImageFilter.h
@@ -72,7 +72,7 @@ class ITK_EXPORT LocalGradientVectorImageFilter
               typename TOutputImage::PixelType > >
 {
 public:
-  /** Standart class typedefs */
+  /** Standard class typedefs */
   typedef LocalGradientVectorImageFilter Self;
   typedef UnaryFunctorNeighborhoodVectorImageFilter< TInputImage, TOutputImage,
             Functor::LocalGradientOperator<
diff --git a/Modules/Filtering/ImageManipulation/include/otbMaskedIteratorDecorator.txx b/Modules/Filtering/ImageManipulation/include/otbMaskedIteratorDecorator.txx
index ce75332..414fd90 100644
--- a/Modules/Filtering/ImageManipulation/include/otbMaskedIteratorDecorator.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbMaskedIteratorDecorator.txx
@@ -218,7 +218,7 @@ MaskedIteratorDecorator<TIteratorType,TMaskIteratorType>
 ::ComputeMaskedBegin()
 {
   // We must search for the first index where the image is not masked
-  // Start searching at the begining
+  // Start searching at the beginning
   m_ItMask.GoToBegin();
   m_ItImage.GoToBegin();
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbMatrixImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbMatrixImageFilter.h
index d3e1a7a..2b63b26 100644
--- a/Modules/Filtering/ImageManipulation/include/otbMatrixImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbMatrixImageFilter.h
@@ -119,7 +119,7 @@ protected:
   /** MatrixImageFilter can be implemented for a multithreaded filter treatment.
    * Thus, this implementation give the ThreadedGenerateData() method.
    * that is called for each process thread. Image datas are automatically allocated
-   * throught the parent class calling the ThreadedGenerateData() method.
+   * through the parent class calling the ThreadedGenerateData() method.
    * ThreadedGenerateData() can only write the area of the image specified by the parameter "outputRegionForThread"
    *
    * \sa ImageToImageFilter::ThreadedGenerateData(),
diff --git a/Modules/Filtering/ImageManipulation/include/otbPrintableImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbPrintableImageFilter.h
index 8e7c25c..db1fe17 100644
--- a/Modules/Filtering/ImageManipulation/include/otbPrintableImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbPrintableImageFilter.h
@@ -191,7 +191,7 @@ public:
   {
     return m_ChannelList;
   }
-  /* Set the selected channle index (order is important) */
+  /* Set the selected channel index (order is important) */
   void SetChannelList(ChannelsType chList)
   {
     if (chList.size() != 3)
diff --git a/Modules/Filtering/ImageManipulation/include/otbShiftScaleImageAdaptor.h b/Modules/Filtering/ImageManipulation/include/otbShiftScaleImageAdaptor.h
index faaf39a..59c041c 100644
--- a/Modules/Filtering/ImageManipulation/include/otbShiftScaleImageAdaptor.h
+++ b/Modules/Filtering/ImageManipulation/include/otbShiftScaleImageAdaptor.h
@@ -32,11 +32,11 @@ namespace Accessor
  *
  * ShiftScalePixelAccessor shifts the input pixel by Shift
  * and then scales the pixel by Scale. All computations
- * are performed in the precison of the input pixel's RealType
+ * are performed in the precision of the input pixel's RealType
  *
  * ShiftScalePixelAccessor is templated over an internal type and an
  * external type representation. This class cast the input
- * applies the funtion to it and cast the result according
+ * applies the function to it and cast the result according
  * to the types defined as template parameters
  *
  * \ingroup ImageAdaptors
diff --git a/Modules/Filtering/ImageManipulation/include/otbSpectralAngleDistanceImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbSpectralAngleDistanceImageFilter.h
index db1f3b7..7c9b6af 100644
--- a/Modules/Filtering/ImageManipulation/include/otbSpectralAngleDistanceImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbSpectralAngleDistanceImageFilter.h
@@ -34,7 +34,7 @@ namespace otb
  * with \f$b\f$ being the spectral band, \f$r\f$ the reference pixel and \f$p\f$
  * the current pixel.
  *
- * Since the spectral angle deals with multi-bands image, the InputImage pixels are suposed to
+ * Since the spectral angle deals with multi-bands image, the InputImage pixels are supposed to
  * support the [] operator, and the input image to support the GetNumberOfComponentsPerPixel() method.
  *
  * \sa VectorImage
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingMatrixTransposeMatrixImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbStreamingMatrixTransposeMatrixImageFilter.txx
index 14cb93b..fe3ca99 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingMatrixTransposeMatrixImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingMatrixTransposeMatrixImageFilter.txx
@@ -226,12 +226,6 @@ PersistentMatrixTransposeMatrixImageFilter<TInputImage, TInputImage2>
 
   // support progress methods/callbacks
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
-  input1Ptr->SetRequestedRegion(outputRegionForThread);
-  input2Ptr->SetRequestedRegion(outputRegionForThread);
-  input1Ptr->PropagateRequestedRegion();
-  input1Ptr->UpdateOutputData();
-  input2Ptr->PropagateRequestedRegion();
-  input2Ptr->UpdateOutputData();
 
   itk::ImageRegionConstIterator<TInputImage> it1(input1Ptr, outputRegionForThread);
   itk::ImageRegionConstIterator<TInputImage2> it2(input2Ptr, outputRegionForThread);
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingResampleImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbStreamingResampleImageFilter.txx
index c710047..f980e1d 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingResampleImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingResampleImageFilter.txx
@@ -28,11 +28,11 @@ template <class TInputImage, class TOutputImage, class TInterpolatorPrecisionTyp
 StreamingResampleImageFilter<TInputImage, TOutputImage, TInterpolatorPrecisionType>
 ::StreamingResampleImageFilter()
 {
-  // internal filters instanciation
+  // internal filters instantiation
   m_DisplacementFilter = DisplacementFieldGeneratorType::New();
   m_WarpFilter        = WarpImageFilterType::New();
 
-  // Initialize the displacement field spacing to zero : inconsistant
+  // Initialize the displacement field spacing to zero : inconsistent
   // value
   this->SetDisplacementFieldSpacing(itk::NumericTraits<SpacingType>::ZeroValue());
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
index 9524f87..38d511a 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
@@ -196,11 +196,18 @@ public:
   /** Smart Pointer type to a DataObject. */
   typedef typename itk::DataObject::Pointer DataObjectPointer;
 
-  OutputImageType * GetShrinkedOutput()
+  OutputImageType * GetShrunkOutput()
   {
-    return m_ShrinkedOutput;
+    return m_ShrunkOutput;
   }
 
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  OutputImageType * GetShrinkedOutput()
+  {
+    otbWarningMacro(<< "GetShrinkedOutput has been deprecated.  Please use GetShrunkOutput instead");
+    return GetShrunkOutput();
+  }
+  
   void Synthetize(void) ITK_OVERRIDE;
 
   void Reset(void) ITK_OVERRIDE;
@@ -234,8 +241,8 @@ private:
   PersistentShrinkImageFilter(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
-  /* the output shrinked image */
-  OutputImagePointer m_ShrinkedOutput;
+  /* the output shrunk image */
+  OutputImagePointer m_ShrunkOutput;
 
   /** The shrink factor */
   unsigned int m_ShrinkFactor;
@@ -294,7 +301,7 @@ public:
 
   OutputImageType * GetOutput()
   {
-    return this->GetFilter()->GetShrinkedOutput();
+    return this->GetFilter()->GetShrunkOutput();
   }
 
   otbSetObjectMemberMacro(Filter, ShrinkFactor, unsigned int);
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
index bbe7e02..d20cd23 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
@@ -118,42 +118,42 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
   InputImageType* inputPtr = const_cast<InputImageType*>(this->GetInput());
   inputPtr->UpdateOutputInformation();
 
-  m_ShrinkedOutput = OutputImageType::New();
-  m_ShrinkedOutput->CopyInformation(inputPtr);
+  m_ShrunkOutput = OutputImageType::New();
+  m_ShrunkOutput->CopyInformation(inputPtr);
 
   const typename InputImageType::SpacingType&
                                            inputSpacing = inputPtr->GetSpacing();
   const typename InputImageType::SizeType& inputSize
     = inputPtr->GetLargestPossibleRegion().GetSize();
 
-  typename OutputImageType::SpacingType shrinkedOutputSpacing;
-  typename OutputImageType::RegionType  shrinkedOutputLargestPossibleRegion;
-  typename OutputImageType::SizeType    shrinkedOutputSize;
-  typename OutputImageType::IndexType   shrinkedOutputStartIndex;
-  typename OutputImageType::PointType   shrinkedOutputOrigin;
+  typename OutputImageType::SpacingType shrunkOutputSpacing;
+  typename OutputImageType::RegionType  shrunkOutputLargestPossibleRegion;
+  typename OutputImageType::SizeType    shrunkOutputSize;
+  typename OutputImageType::IndexType   shrunkOutputStartIndex;
+  typename OutputImageType::PointType   shrunkOutputOrigin;
 
   for (unsigned int i = 0; i < OutputImageType::ImageDimension; ++i)
     {
-    shrinkedOutputSpacing[i] = inputSpacing[i] * static_cast<double>(m_ShrinkFactor);
-    shrinkedOutputSize[i] = inputSize[i] > m_ShrinkFactor ? inputSize[i] / m_ShrinkFactor : 1;
+    shrunkOutputSpacing[i] = inputSpacing[i] * static_cast<double>(m_ShrinkFactor);
+    shrunkOutputSize[i] = inputSize[i] > m_ShrinkFactor ? inputSize[i] / m_ShrinkFactor : 1;
     
-    shrinkedOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] *
+    shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] *
       (static_cast<double>(inputPtr->GetLargestPossibleRegion().GetIndex(i)) - 0.5)
-      + shrinkedOutputSpacing[i] * 0.5;
+      + shrunkOutputSpacing[i] * 0.5;
 
     // we choose to output a region with a start index [0,0]
     // the origin is set accordingly
-    shrinkedOutputStartIndex[i] = 0;
+    shrunkOutputStartIndex[i] = 0;
     }
 
-  m_ShrinkedOutput->SetSpacing(shrinkedOutputSpacing);
-  m_ShrinkedOutput->SetOrigin(shrinkedOutputOrigin);
+  m_ShrunkOutput->SetSpacing(shrunkOutputSpacing);
+  m_ShrunkOutput->SetOrigin(shrunkOutputOrigin);
 
-  shrinkedOutputLargestPossibleRegion.SetSize(shrinkedOutputSize);
-  shrinkedOutputLargestPossibleRegion.SetIndex(shrinkedOutputStartIndex);
+  shrunkOutputLargestPossibleRegion.SetSize(shrunkOutputSize);
+  shrunkOutputLargestPossibleRegion.SetIndex(shrunkOutputStartIndex);
 
-  m_ShrinkedOutput->SetRegions(shrinkedOutputLargestPossibleRegion);
-  m_ShrinkedOutput->Allocate();
+  m_ShrunkOutput->SetRegions(shrunkOutputLargestPossibleRegion);
+  m_ShrunkOutput->Allocate();
 }
 
 template<class TInputImage, class TOutputImage>
@@ -187,11 +187,11 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
     if (inIndex[0] % m_ShrinkFactor == 0
         && inIndex[1] % m_ShrinkFactor == 0 )
       {
-      IndexType shrinkedIndex;
-      shrinkedIndex[0] = inIndex[0] / m_ShrinkFactor;
-      shrinkedIndex[1] = inIndex[1] / m_ShrinkFactor;
-      if (m_ShrinkedOutput->GetLargestPossibleRegion().IsInside(shrinkedIndex))
-        m_ShrinkedOutput->SetPixel(shrinkedIndex, inIt.Get());
+      IndexType shrunkIndex;
+      shrunkIndex[0] = inIndex[0] / m_ShrinkFactor;
+      shrunkIndex[1] = inIndex[1] / m_ShrinkFactor;
+      if (m_ShrunkOutput->GetLargestPossibleRegion().IsInside(shrunkIndex))
+        m_ShrunkOutput->SetPixel(shrunkIndex, inIt.Get());
       }
     }
 }
diff --git a/Modules/Filtering/ImageManipulation/include/otbUnaryFunctorNeighborhoodImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbUnaryFunctorNeighborhoodImageFilter.h
index 336b9cd..cfe3a94 100644
--- a/Modules/Filtering/ImageManipulation/include/otbUnaryFunctorNeighborhoodImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbUnaryFunctorNeighborhoodImageFilter.h
@@ -71,7 +71,7 @@ public:
   itkSetMacro(Radius, InputImageSizeType);
   itkGetMacro(Radius, InputImageSizeType);
 
-  /** Set unsinged int radius */
+  /** Set unsigned int radius */
   void SetRadius(unsigned int radius)
   {
     m_Radius.Fill(radius);
diff --git a/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx
index db37158..46ca563 100644
--- a/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx
@@ -52,7 +52,7 @@ int otbChangeNoDataValueFilter(int itkNotUsed(argc),char * itkNotUsed(argv) [])
       it.Set(-10.);
     }
 
-  // Instanciate filter
+  // Instantiate filter
   typedef otb::ChangeNoDataValueFilter<ImageType,ImageType> FilterType;
   FilterType::Pointer filter = FilterType::New();
 
diff --git a/Modules/Filtering/ImageManipulation/test/otbExtractROIResample.cxx b/Modules/Filtering/ImageManipulation/test/otbExtractROIResample.cxx
index d997a12..ade91c5 100644
--- a/Modules/Filtering/ImageManipulation/test/otbExtractROIResample.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbExtractROIResample.cxx
@@ -24,7 +24,7 @@
 
 // Pipeline reader -> Resampler (with Identity transform) -> ExtractROI
 // -> Writer
-// the resample is optionaly removed with the command line parameter.
+// the resample is optionally removed with the command line parameter.
 //
 
 int otbExtractROIResample(int argc, char* argv[])
diff --git a/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx
index d5c2b42..fa36d5b 100644
--- a/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx
@@ -52,7 +52,7 @@ int otbImageToNoDataMaskFilter(int itkNotUsed(argc),char * itkNotUsed(argv) [])
       it.Set(-10.);
     }
 
-  // Instanciate filter
+  // Instantiate filter
   typedef otb::ImageToNoDataMaskFilter<ImageType,ImageType> FilterType;
   FilterType::Pointer filter = FilterType::New();
 
diff --git a/Modules/Filtering/ImageManipulation/test/otbLog10ThresholdedImageFilterTest.cxx b/Modules/Filtering/ImageManipulation/test/otbLog10ThresholdedImageFilterTest.cxx
index 7995327..5e98858 100644
--- a/Modules/Filtering/ImageManipulation/test/otbLog10ThresholdedImageFilterTest.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbLog10ThresholdedImageFilterTest.cxx
@@ -40,7 +40,7 @@ int otbLog10ThresholdedImageFilterTest(int argc, char* argv[])
   typedef itk::ImageRegionIterator<ImageType> IteratorType;
   typedef otb::Log10ThresholdedImageFilter<ImageType, ImageType> FilterType;
 
-  // INSTANCIATIONS
+  // INSTANTIATIONS
   ImageType::Pointer image = ImageType::New();
   ImageType::Pointer imageOut = ImageType::New();
   FilterType::Pointer filter = FilterType::New();
diff --git a/Modules/Filtering/ImageManipulation/test/otbMaskedIteratorDecorator.cxx b/Modules/Filtering/ImageManipulation/test/otbMaskedIteratorDecorator.cxx
index d93396d..0772217 100644
--- a/Modules/Filtering/ImageManipulation/test/otbMaskedIteratorDecorator.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbMaskedIteratorDecorator.cxx
@@ -62,7 +62,7 @@ void FillHalf(typename ImageType::Pointer image, const typename ImageType::Regio
   }
 }
 
-// Test template instanciation
+// Test template instantiation
 int otbMaskedIteratorDecoratorNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
 {
   typedef otb::Image<double, 2> ImageType;
@@ -184,7 +184,7 @@ int BijectiveTest(typename MaskIteratorType::ImageType::Pointer mask, typename I
   it.GoToBegin();
   itDecorated.GoToBegin();
 
-  // Find the non maked begin for the image iterator
+  // Find the non masked begin for the image iterator
   if (itDecorated.HasMask())
     {
     while (mask->GetPixel(it.GetIndex()) == 0 && !it.IsAtEnd())
diff --git a/Modules/Filtering/ImageNoise/include/otbFrostImageFilter.h b/Modules/Filtering/ImageNoise/include/otbFrostImageFilter.h
index 62956d3..802595e 100644
--- a/Modules/Filtering/ImageNoise/include/otbFrostImageFilter.h
+++ b/Modules/Filtering/ImageNoise/include/otbFrostImageFilter.h
@@ -106,7 +106,7 @@ protected:
   /** FrostImageFilter can be implemented for a multithreaded filter treatment.
    * Thus, this implementation give the ThreadedGenerateData() method.
    * that is called for each process thread. Image datas are automatically allocated
-   * throught the parent class calling the ThreadedGenerateData() method.
+   * through the parent class calling the ThreadedGenerateData() method.
    * ThreadedGenerateData() can only write the area of the image specified by the parameter "outputRegionForThread"
    *
    * \sa ImageToImageFilter::ThreadedGenerateData(),
diff --git a/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.h b/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.h
index 4e2d873..325d692 100644
--- a/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.h
+++ b/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.h
@@ -166,14 +166,14 @@ private :
   void OutputsDimensions();
 
   std::vector<std::string>                  m_Expression;
-  std::vector<ParserType::Pointer>          m_VParser;
+  std::vector< std::vector<ParserType::Pointer> > m_VParser;
   std::vector< std::vector<adhocStruct> >   m_AImage;
   std::vector< adhocStruct >                m_VVarName;
   std::vector< adhocStruct >                m_VAllowedVarNameAuto;
   std::vector< adhocStruct >                m_VAllowedVarNameAddedByUser;
   std::vector< adhocStruct >                m_VFinalAllowedVarName;   // m_VFinalAllowedVarName = m_VAllowedVarNameAuto + m_VAllowedVarNameAddedByUser
   std::vector< adhocStruct >                m_VNotAllowedVarName;
-  std::vector< int >                        m_outputsDimensions;
+  std::vector< unsigned int >                        m_outputsDimensions;
 
   unsigned int                             m_SizeNeighbourhood;
 
diff --git a/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.txx b/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.txx
index eecaf97..9030e2c 100644
--- a/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.txx
+++ b/Modules/Filtering/MathParserX/include/otbBandMathXImageFilter.txx
@@ -24,6 +24,9 @@
 
 #include "itkImageRegionIterator.h"
 #include "itkImageRegionConstIterator.h"
+#include "itkImageScanlineConstIterator.h"
+#include "itkImageScanlineIterator.h"
+#include "itkImageRegionConstIteratorWithOnlyIndex.h"
 #include "itkConstNeighborhoodIterator.h"
 #include "itkNumericTraits.h"
 #include "itkProgressReporter.h"
@@ -515,7 +518,7 @@ template< typename TImage >
 std::string BandMathXImageFilter<TImage>
 ::GetExpression(int IDExpression) const
 {
-  return m_Expression.at(IDExpression);
+  return m_Expression[IDExpression];
 }
 
 
@@ -567,8 +570,8 @@ void BandMathXImageFilter<TImage>
   for(unsigned int i=0; i<m_VAllowedVarNameAuto.size(); i++)
     m_VFinalAllowedVarName.push_back(m_VAllowedVarNameAuto[i]);
 
-
-  for(unsigned int IDExpression=0; IDExpression<m_Expression.size(); ++IDExpression) // For each expression
+  unsigned int nbExpr = m_Expression.size();
+  for(unsigned int IDExpression=0; IDExpression < nbExpr; ++IDExpression) // For each expression
   {
       ParserType::Pointer dummyParser = ParserType::New();
       dummyParser->SetExpr(this->GetExpression(IDExpression));
@@ -608,14 +611,17 @@ void BandMathXImageFilter<TImage>
   }
 
 
-  // Register variables for each parser (important : one parser per thread)
+  // Register variables for each parser (important : one parser per thread and per expression)
   m_VParser.clear();
   unsigned int nbThreads = this->GetNumberOfThreads();
-  typename std::vector<ParserType::Pointer>::iterator        itParser;
-  m_VParser.resize(nbThreads);
-  for(itParser = m_VParser.begin(); itParser < m_VParser.end(); itParser++)
+  for (unsigned int k=0 ; k<nbThreads ; k++)
     {
-      *itParser = ParserType::New();
+    std::vector<ParserType::Pointer> parserList;
+    for (unsigned int i=0 ; i<nbExpr ; i++)
+      {
+      parserList.push_back(ParserType::New());
+      }
+    m_VParser.push_back(parserList);
     }
 
   // Important to remember that variables of m_VVarName come from a call of GetExprVar method
@@ -724,7 +730,10 @@ void BandMathXImageFilter<TImage>
 
 
         //Register variable
-        m_VParser.at(i)->DefineVar(m_AImage[i][j].name, &(m_AImage[i][j].value));
+        for (unsigned int k=0 ; k<nbExpr ; k++)
+          {
+          m_VParser[i][k]->DefineVar(m_AImage[i][j].name, &(m_AImage[i][j].value));
+          }
 
 
         initValue += 0.001;
@@ -733,6 +742,15 @@ void BandMathXImageFilter<TImage>
       }
   }
 
+  // Set expressions
+  for (unsigned int k=0 ; k<nbThreads ; k++)
+    {
+    for (unsigned int i=0 ; i<nbExpr ; i++)
+      {
+      m_VParser[k][i]->SetExpr(m_Expression[i]);
+      }
+    }
+
 }
 
 
@@ -821,11 +839,14 @@ void BandMathXImageFilter< TImage >
 
   for(int i=0; i<(int) m_Expression.size(); ++i)
   {
-    m_VParser.at(0)->SetExpr(m_Expression[i]);
-    ValueType value = m_VParser.at(0)->Eval();
+    ValueType value = m_VParser[0][i]->EvalRef();
 
     switch (value.GetType())
     {   //ValueType
+        case 'b':
+        itkExceptionMacro(<< "Booleans not supported." << std::endl);
+        break;
+        
         case 'i':
         m_outputsDimensions.push_back(1);
         break;
@@ -839,13 +860,18 @@ void BandMathXImageFilter< TImage >
         break;
 
         case 'm':
-        mup::matrix_type vect = value.GetArray();
+        {
+        const mup::matrix_type &vect = value.GetArray();
         if ( vect.GetRows() == 1 ) //Vector
           m_outputsDimensions.push_back(vect.GetCols());
         else //Matrix
           itkExceptionMacro(<< "Result of the evaluation can't be a matrix." << std::endl);
+        }
         break;
 
+        default:
+          itkExceptionMacro(<< "Unknown output type : "<< value.GetType() << std::endl);
+        break;
     }
 
     //std::cout << "Type = " << value.GetType() << " dimension = " << m_outputsDimensions.back() << std::endl;
@@ -1024,17 +1050,19 @@ void BandMathXImageFilter<TImage>
   //----------------- --------- -----------------//
   //----------------- Iterators -----------------//
   //----------------- --------- -----------------//
-  typedef itk::ImageRegionConstIterator<TImage> ImageRegionConstIteratorType;
-  std::vector< ImageRegionConstIteratorType > Vit;
+  typedef itk::ImageScanlineConstIterator<TImage> ImageScanlineConstIteratorType;
+  typedef itk::ImageScanlineIterator<TImage> ImageScanlineIteratorType;
+  typedef itk::ImageRegionConstIteratorWithOnlyIndex<TImage> IndexIteratorType;
+  std::vector< ImageScanlineConstIteratorType > Vit;
   Vit.resize(nbInputImages);
   for(unsigned int j=0; j < nbInputImages; ++j)
-    Vit[j] = ImageRegionConstIteratorType (this->GetNthInput(j), outputRegionForThread);
+    Vit[j] = ImageScanlineConstIteratorType (this->GetNthInput(j), outputRegionForThread);
     
 
-  std::vector< ImageRegionConstIteratorType > VoutIt;
+  std::vector< ImageScanlineIteratorType > VoutIt;
   VoutIt.resize(m_Expression.size());
   for(unsigned int j=0; j < VoutIt.size(); ++j)
-    VoutIt[j] = ImageRegionConstIteratorType (this->GetOutput(j), outputRegionForThread);
+    VoutIt[j] = ImageScanlineIteratorType (this->GetOutput(j), outputRegionForThread);
     
 
   //Special case : neighborhoods
@@ -1049,10 +1077,24 @@ void BandMathXImageFilter<TImage>
         VNit.back().NeedToUseBoundaryConditionOn();
      }
 
+  // Index only iterator
+  IndexIteratorType indexIterator(this->GetNthInput(0), outputRegionForThread);
 
   // Support progress methods/callbacks
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
 
+  // iterator on variables
+  typename std::vector<adhocStruct>::iterator iterVarStart =
+    m_AImage[threadId].begin();
+  typename std::vector<adhocStruct>::iterator iterVarEnd =
+    m_AImage[threadId].end();
+  typename std::vector<adhocStruct>::iterator iterVar =
+    iterVarStart;
+
+  // temporary output vectors
+  std::vector<PixelType> tmpOutputs(m_Expression.size());
+  for(unsigned int k=0; k<m_Expression.size(); ++k)
+    tmpOutputs[k].SetSize(m_outputsDimensions[k]);
 
   //----------------- --------------------- -----------------//
   //----------------- Variable affectations -----------------//
@@ -1060,23 +1102,25 @@ void BandMathXImageFilter<TImage>
   for(unsigned int j=0; j < nbInputImages; ++j)       {  Vit[j].GoToBegin();     }
   for(unsigned int j=0; j < m_Expression.size(); ++j) {  VoutIt[j].GoToBegin();  }
   for(unsigned int j=0; j < VNit.size(); ++j)         {  VNit[j].GoToBegin();    }
+  indexIterator.GoToBegin();
 
   while(!Vit[0].IsAtEnd()) // For each pixel
-  {
-
-    int ngbhNameIndex=0; int index;
-    for(unsigned int j=0; j < m_AImage[threadId].size(); ++j) // For each variable, perform a copy
     {
+    while(!Vit[0].IsAtEndOfLine()) // For each line
+      {
+      int ngbhNameIndex=0; int index;
 
-       switch (m_AImage[threadId][j].type)
+      iterVar = iterVarStart;
+      while (iterVar != iterVarEnd)
         {
-
+        switch (iterVar->type)
+          {
           case 0 : //idxX
-            m_AImage[threadId][j].value = static_cast<double>(Vit[0].GetIndex()[0]);
+            iterVar->value = static_cast<double>(indexIterator.GetIndex()[0]);
           break;
 
           case 1 : //idxY
-            m_AImage[threadId][j].value = static_cast<double>(Vit[0].GetIndex()[1]);
+            iterVar->value = static_cast<double>(indexIterator.GetIndex()[1]);
           break;
 
           case 2 : //Spacing X (imiPhyX)
@@ -1088,28 +1132,28 @@ void BandMathXImageFilter<TImage>
           break;
 
           case 4 : //vector
-            // m_AImage[threadId][j].info[0] : Input image #ID
-            for(int p=0; p < m_AImage[threadId][j].value.GetCols(); ++p)
-              m_AImage[threadId][j].value.At(0,p) = Vit[m_AImage[threadId][j].info[0]].Get()[p];
+            // iterVar->info[0] : Input image #ID
+            for(int p=0; p < iterVar->value.GetCols(); ++p)
+              iterVar->value.At(0,p) = Vit[iterVar->info[0]].Get()[p];
           break;
 
           case 5 : //pixel
-            // m_AImage[threadId][j].info[0] : Input image #ID
-            // m_AImage[threadId][j].info[1] : Band #ID
-            m_AImage[threadId][j].value = Vit[m_AImage[threadId][j].info[0]].Get()[m_AImage[threadId][j].info[1]];
+            // iterVar->info[0] : Input image #ID
+            // iterVar->info[1] : Band #ID
+            iterVar->value = Vit[iterVar->info[0]].Get()[iterVar->info[1]];
           break;
 
           case 6 : //neighborhood
     
-          // m_AImage[threadId][j].info[1] : Band #ID
-          if (m_AImage[threadId][j].info[2]*m_AImage[threadId][j].info[3] != (int) VNit[ngbhNameIndex].Size() )
+          // iterVar->info[1] : Band #ID
+          if (iterVar->info[2]*iterVar->info[3] != (int) VNit[ngbhNameIndex].Size() )
             itkExceptionMacro(<< "Size of muparserx variable is different from its related otb neighborhood iterator")
 
           index=0;
-          for(int rows=0; rows<m_AImage[threadId][j].info[3]; ++rows)
-            for(int cols=0; cols<m_AImage[threadId][j].info[2]; ++cols)
+          for(int rows=0; rows<iterVar->info[3]; ++rows)
+            for(int cols=0; cols<iterVar->info[2]; ++cols)
               {
-                m_AImage[threadId][j].value.At(rows,cols) = VNit[ngbhNameIndex].GetPixel(index)[m_AImage[threadId][j].info[1]];
+                iterVar->value.At(rows,cols) = VNit[ngbhNameIndex].GetPixel(index)[iterVar->info[1]];
                 index++;
               }
 
@@ -1127,72 +1171,76 @@ void BandMathXImageFilter<TImage>
           default :
             itkExceptionMacro(<< "Type of the variable is unknown");
           break;
-        }
-    }//End while
-
-
-  //----------------- ----------- -----------------//
-  //----------------- Evaluations -----------------//
-  //----------------- ----------- -----------------//
-  for(unsigned int IDExpression=0; IDExpression<m_Expression.size(); ++IDExpression)
-  {
+          }
 
-        m_VParser[threadId]->SetExpr(m_Expression[IDExpression]);
+        iterVar++;
+        }//End while on vars
 
-        value = m_VParser[threadId]->Eval();
+      //----------------- ----------- -----------------//
+      //----------------- Evaluations -----------------//
+      //----------------- ----------- -----------------//
+      for(unsigned int IDExpression=0; IDExpression<m_Expression.size(); ++IDExpression)
+        {
+        value = m_VParser[threadId][IDExpression]->EvalRef();
 
         switch (value.GetType())
-        {   //ValueType
-            case 'i':
-            VoutIt[IDExpression].Get()[0] = value.GetInteger();
-            break;
-
-            case 'f':
-            VoutIt[IDExpression].Get()[0] = value.GetFloat();
-            break;
+          {   //ValueType
+          case 'i':
+          tmpOutputs[IDExpression][0] = value.GetInteger();
+          break;
 
-            case 'c':
-            itkExceptionMacro(<< "Complex numbers are not supported." << std::endl);
-            break;
+          case 'f':
+          tmpOutputs[IDExpression][0] = value.GetFloat();
+          break;
 
-            case 'm':
-            mup::matrix_type vect = value.GetArray();
+          case 'c':
+          itkExceptionMacro(<< "Complex numbers are not supported." << std::endl);
+          break;
 
+          case 'm':
+            {
+            const mup::matrix_type &vect = value.GetArray();
+  
             if ( vect.GetRows() == 1 ) //Vector
               for(int p=0; p<vect.GetCols(); ++p)
-                VoutIt[IDExpression].Get()[p] = vect.At(0,p).GetFloat();
+                tmpOutputs[IDExpression][p] = vect.At(0,p).GetFloat();
             else //Matrix
               itkExceptionMacro(<< "Result of the evaluation can't be a matrix." << std::endl);
-            break;
-        }
-
+            }
+          break;
+          }
  
         //----------------- Pixel affectations -----------------//
-        for(unsigned int p=0; p<VoutIt[IDExpression].Get().GetSize(); ++p)
-        {
-            // Case value is equal to -inf or inferior to the minimum value
-            // allowed by the PixelValueType cast
-            if (VoutIt[IDExpression].Get()[p] < double(itk::NumericTraits<PixelValueType>::NonpositiveMin()))
+        for(unsigned int p=0; p<m_outputsDimensions[IDExpression]; ++p)
+          {
+          // Case value is equal to -inf or inferior to the minimum value
+          // allowed by the PixelValueType cast
+          if (tmpOutputs[IDExpression][p] < double(itk::NumericTraits<PixelValueType>::NonpositiveMin()))
             {
-                VoutIt[IDExpression].Get()[p] = itk::NumericTraits<PixelValueType>::NonpositiveMin();
-                m_ThreadUnderflow[threadId]++;
+            tmpOutputs[IDExpression][p] = itk::NumericTraits<PixelValueType>::NonpositiveMin();
+            m_ThreadUnderflow[threadId]++;
             }
-            // Case value is equal to inf or superior to the maximum value
-            // allowed by the PixelValueType cast
-            else if (VoutIt[IDExpression].Get()[p] > double(itk::NumericTraits<PixelValueType>::max()))
+          // Case value is equal to inf or superior to the maximum value
+          // allowed by the PixelValueType cast
+          else if (tmpOutputs[IDExpression][p] > double(itk::NumericTraits<PixelValueType>::max()))
             {
-               VoutIt[IDExpression].Get()[p] = itk::NumericTraits<PixelValueType>::max();
-               m_ThreadOverflow[threadId]++;
+            tmpOutputs[IDExpression][p] = itk::NumericTraits<PixelValueType>::max();
+            m_ThreadOverflow[threadId]++;
             }
+          }
+        VoutIt[IDExpression].Set(tmpOutputs[IDExpression]);
         }
-    }
 
-    for(unsigned int j=0; j < nbInputImages; ++j)        {   ++Vit[j];    }
-    for(unsigned int j=0; j < m_Expression.size(); ++j)  {   ++VoutIt[j]; }
-    for(unsigned int j=0; j < VNit.size(); ++j)          {   ++VNit[j];   }
+      for(unsigned int j=0; j < nbInputImages; ++j)        {   ++Vit[j];    }
+      for(unsigned int j=0; j < m_Expression.size(); ++j)  {   ++VoutIt[j]; }
+      for(unsigned int j=0; j < VNit.size(); ++j)          {   ++VNit[j];   }
+      ++indexIterator;
 
-    progress.CompletedPixel();
-  }
+      progress.CompletedPixel();
+      }
+    for(unsigned int j=0; j < nbInputImages; ++j)        {   Vit[j].NextLine();    }
+    for(unsigned int j=0; j < m_Expression.size(); ++j)  {   VoutIt[j].NextLine(); }
+    }
 
 }
 
diff --git a/Modules/Filtering/MathParserX/include/otbParserX.h b/Modules/Filtering/MathParserX/include/otbParserX.h
index a62d109..eb58857 100644
--- a/Modules/Filtering/MathParserX/include/otbParserX.h
+++ b/Modules/Filtering/MathParserX/include/otbParserX.h
@@ -63,6 +63,7 @@ public:
   /** Convenient type definitions */
   typedef ParserX                                   ParserXType;
   typedef mup::Value                                ValueType;
+  typedef mup::IValue                               IValueType;
 
   /** Set the expression to be parsed */
   virtual void SetExpr(const std::string & Expression);
@@ -70,6 +71,9 @@ public:
   /** Trigger the parsing */
   ValueType Eval();
 
+  /** Trigger the parsing but return a const ref */
+  const IValueType & EvalRef();
+
   /** Define a variable */
   void DefineVar(const std::string &sName, ValueType *fVar);
 
diff --git a/Modules/Filtering/MathParserX/include/otbParserXPlugins.h b/Modules/Filtering/MathParserX/include/otbParserXPlugins.h
index 443768e..6918fb1 100644
--- a/Modules/Filtering/MathParserX/include/otbParserXPlugins.h
+++ b/Modules/Filtering/MathParserX/include/otbParserXPlugins.h
@@ -355,7 +355,7 @@ public:
 
     const mup::char_type* GetDesc() const ITK_OVERRIDE
     {
-      return "vmin(m1) - overall minimun";
+      return "vmin(m1) - overall minimum";
     }
 
     mup::IToken* Clone() const ITK_OVERRIDE
diff --git a/Modules/Filtering/MathParserX/src/otbParserX.cxx b/Modules/Filtering/MathParserX/src/otbParserX.cxx
index 9a3ccd2..b6d4ac8 100644
--- a/Modules/Filtering/MathParserX/src/otbParserX.cxx
+++ b/Modules/Filtering/MathParserX/src/otbParserX.cxx
@@ -40,6 +40,7 @@ public:
 
   /** Convenient type definitions */
   typedef mup::Value                                ValueType;
+  typedef mup::IValue                                IValueType;
   typedef mup::ParserError                          ExceptionType;
 
   /** Initialize user defined constants */
@@ -117,6 +118,19 @@ public:
     return result;
   }
 
+  const IValueType & EvalRef()
+    {
+    try
+      {
+      return m_MuParserX.Eval();
+      }
+    catch(ExceptionType &e)
+      {
+      ExceptionHandler(e);
+      }
+    return m_NullValue;
+    }
+
 
   /** Define a variable */
   void DefineVar(const std::string &sName, ValueType *fVar)
@@ -228,6 +242,7 @@ public:
 protected:
   ParserXImpl()
   {
+    m_NullValue = ValueType(0.0);
     InitFun();
     InitConst();
   }
@@ -248,6 +263,8 @@ private:
 
   mup::ParserX m_MuParserX;
 
+  ValueType m_NullValue;
+
 
 }; // end class
 
@@ -277,6 +294,11 @@ ParserX::ValueType ParserX::Eval()
   return m_InternalParserX->Eval();
 }
 
+const ParserX::IValueType &  ParserX::EvalRef()
+{
+  return m_InternalParserX->EvalRef();
+}
+
 void ParserX::DefineVar(const std::string &sName, ValueType *fVar)
 {
   m_InternalParserX->DefineVar(sName, fVar);
diff --git a/Modules/Filtering/MathParserX/test/otbBandMathXImageFilter.cxx b/Modules/Filtering/MathParserX/test/otbBandMathXImageFilter.cxx
index 139e5a7..1ffd2cd 100644
--- a/Modules/Filtering/MathParserX/test/otbBandMathXImageFilter.cxx
+++ b/Modules/Filtering/MathParserX/test/otbBandMathXImageFilter.cxx
@@ -85,15 +85,26 @@ int otbBandMathXImageFilter( int itkNotUsed(argc), char* itkNotUsed(argv) [])
   IteratorType it2(image2, region);
   IteratorType it3(image3, region);
 
+  ImageType::PixelType val1, val2, val3;
+  val1.SetSize(D1);
+  val2.SetSize(D2);
+  val3.SetSize(D3);
+
   for (it1.GoToBegin(), it2.GoToBegin(), it3.GoToBegin(); !it1.IsAtEnd(); ++it1, ++it2, ++it3)
   {
     ImageType::IndexType i1 = it1.GetIndex();
     ImageType::IndexType i2 = it2.GetIndex();
     ImageType::IndexType i3 = it3.GetIndex();
 
-    it1.Get()[0] = i1[0] + i1[1] -50; it1.Get()[1] = i1[0] * i1[1] -50; it1.Get()[2] = i1[0] / (i1[1]+1)+5;
-    it2.Get()[0] = i2[0] * i2[1];
-    it3.Get()[0] = i3[0] + i3[1] * i3[1];
+    val1[0] = i1[0] + i1[1] -50;
+    val1[1] = i1[0] * i1[1] -50;
+    val1[2] = i1[0] / (i1[1]+1)+5;
+    val2[0] = i2[0] * i2[1];
+    val3[0] = i3[0] + i3[1] * i3[1];
+
+    it1.Set(val1);
+    it2.Set(val2);
+    it3.Set(val3);
 
   }
 
@@ -118,8 +129,6 @@ int otbBandMathXImageFilter( int itkNotUsed(argc), char* itkNotUsed(argv) [])
   std::cout << "\n---  Standard Use\n";
   std::cout << "Parsed Expression :   " << filter->GetExpression(0) << std::endl;
 
-
-
   //Sub-test 1
   IteratorType itoutput1(output1, region);
 
@@ -329,7 +338,7 @@ int otbBandMathXImageFilterConv( int itkNotUsed(argc), char* argv [])
     PixelType px1(output1->GetNumberOfComponentsPerPixel());
     PixelType px2(output2->GetNumberOfComponentsPerPixel());
 
-    float coefs[15] = { 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 1.0 , 1.1 , 1.2 , 1.3 , 1.4 , 1.5};
+    float coefs[15] = { 0.1f , 0.2f , 0.3f , 0.4f , 0.5f , 0.6f , 0.7f , 0.8f , 0.9f , 1.0f , 1.1f , 1.2f , 1.3f , 1.4f , 1.5f};
 
     //expression 1
     px1[0]=0;
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.txx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.txx
index f010b4c..310fa52 100644
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.txx
+++ b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.txx
@@ -228,7 +228,7 @@ MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
 
     otbMsgDevMacro(
       << "MorphologicalPyramidAnalysisFilter: DownSampling OK " << currentImage->GetLargestPossibleRegion().GetSize());
-    // New current image is appeneded to the output list
+    // New current image is appended to the output list
     OutputImageList->PushBack(currentImage);
 
     // Image upsampling
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h
index a47b433..81a672f 100644
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h
+++ b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h
@@ -30,11 +30,11 @@ namespace otb
  *
  * The segmentation algorithm used is based on seeds extraction using the ImageToPointSetFilter, followed by
  * a connected threshold segmentation using the ConnectedThresholdImageFilter. A final relabelling step is done
- * with the LabelImageFilter adn RelabelImageFilter to remove object whose sizes are to small regarding the
+ * with the LabelImageFilter and RelabelImageFilter to remove object whose sizes are to small regarding the
  * MinimumObjectSize parameter. The threshold for seeds extraction and segmentation are computed using quantiles.
  *
  * A pre processing step is applied by multiplying the full resolution brighter details (resp. darker details)
- * with the original image (resp. the inverted original image). This perfoms an enhancement of the regions contour
+ * with the original image (resp. the inverted original image). This performs an enhancement of the regions contour
  * precision.
  *
  * The details from the pyramid are set via the SetBrighterDetails() and SetDarkerDetails() methods. The brighter and
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h
index 79652b1..f38faee 100644
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h
+++ b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h
@@ -32,7 +32,7 @@ namespace MorphologicalPyramid
  * This class performs the segmentation of a detail image extracted from a
  * morphological pyramid analysis.
  *
- * The Segmentation is perfomed using the ConnectedThresholdImageFilter. The seeds
+ * The Segmentation is performed using the ConnectedThresholdImageFilter. The seeds
  * are extracted from the image using the ImageToPointSetFilter. The thresolds are set
  * by using quantiles computed with the HistogramGenerator.
  *
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h
index 45b5ace..39e6706 100644
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h
+++ b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h
@@ -30,7 +30,7 @@ namespace otb
  * Once a morphological pyramidal decompisition has been made, it is
  * possible to rebuild without any loss of information the original
  * image at full resolution. The MorphologicalPyramidsynthesisFilter
- * provides such a functionality. At each iteration, it perfoms the
+ * provides such a functionality. At each iteration, it performs the
  * up-sampling of the current image using the
  * otb::morphologicalPyramid::Resampler filter, the addition of
  * the details lost in down-sampling, and the addition of the details
diff --git a/Modules/Filtering/Path/include/otbClosePathFunctor.h b/Modules/Filtering/Path/include/otbClosePathFunctor.h
index 9d7d44b..df84b78 100644
--- a/Modules/Filtering/Path/include/otbClosePathFunctor.h
+++ b/Modules/Filtering/Path/include/otbClosePathFunctor.h
@@ -26,7 +26,7 @@ namespace otb
 /** \class ClosePathFunctor
 *    \brief This filter close the input path, making the last point equal to the first one.
 *
-* This filter may be useful when a truely closed polygon is needed (to draw it for example)
+* This filter may be useful when a truly closed polygon is needed (to draw it for example)
 *
 * \sa UnaryFunctorObjectListFilter
 *
diff --git a/Modules/Filtering/Path/include/otbImageFittingPolygonListFilter.txx b/Modules/Filtering/Path/include/otbImageFittingPolygonListFilter.txx
index 8994376..4ae115d 100644
--- a/Modules/Filtering/Path/include/otbImageFittingPolygonListFilter.txx
+++ b/Modules/Filtering/Path/include/otbImageFittingPolygonListFilter.txx
@@ -59,7 +59,7 @@ ImageFittingPolygonListFilter<TPath, TImage>
 }
 
 //FIXME
-//There is an issue here with integer and continous indexes
+//There is an issue here with integer and continuous indexes
 //maybe we should use the itk::LineConstIterator
 template <class TPath, class TImage>
 void
diff --git a/Modules/Filtering/Path/include/otbImageToEdgePathFilter.h b/Modules/Filtering/Path/include/otbImageToEdgePathFilter.h
index 87d6301..0c1dab4 100644
--- a/Modules/Filtering/Path/include/otbImageToEdgePathFilter.h
+++ b/Modules/Filtering/Path/include/otbImageToEdgePathFilter.h
@@ -35,7 +35,7 @@ namespace otb
  *
  * The edge computation is divided into two steps.
  *
- * First, a linear search is perfomed to detect a first pixel belonging to the edge of
+ * First, a linear search is performed to detect a first pixel belonging to the edge of
  * the object.
  *
  * From that pixel and until the algorithm comes back to this position, the neighborhood
@@ -45,7 +45,7 @@ namespace otb
  * opposite directions, thus producing an edge with a null surface and twice the length of the
  * object as perimeter.
  *
- * This leads to consistant result for geometric descriptors (for instance compacity).
+ * This leads to consistent result for geometric descriptors (for instance compacity).
  * \sa ImageToPathFilter
  *
  * \ingroup OTBPath
@@ -75,6 +75,7 @@ public:
   typedef typename OutputPathType::ContinuousIndexType ContinuousIndexType;
 
   typedef typename InputImageType::PixelType PixelType;
+  typedef typename InputImageType::SizeType SizeType;
 
   /** Set and Get foreground value */
   itkSetMacro(ForegroundValue, PixelType);
diff --git a/Modules/Filtering/Path/include/otbImageToEdgePathFilter.txx b/Modules/Filtering/Path/include/otbImageToEdgePathFilter.txx
index 9306826..eb3c642 100644
--- a/Modules/Filtering/Path/include/otbImageToEdgePathFilter.txx
+++ b/Modules/Filtering/Path/include/otbImageToEdgePathFilter.txx
@@ -63,7 +63,9 @@ ImageToEdgePathFilter<TInputImage, TOutputPath>
   typename PadFilterType::Pointer pad = PadFilterType::New();
   pad->SetInput(inputImage);
   pad->SetConstant(initPadConstant);
-  long unsigned int padSize[2] = {1, 1};
+  SizeType padSize;
+  padSize[ 0 ] = 1;
+  padSize[ 1 ] = 1;
   pad->SetPadUpperBound(padSize);
   pad->SetPadLowerBound(padSize);
   pad->Update();
@@ -141,7 +143,7 @@ ImageToEdgePathFilter<TInputImage, TOutputPath>
     int move = nextStart;
     // edgeFound indicate that the edge has been found.
     bool EdgeFound = false;
-    // LastWasPositive indicate wether the previous pixel belong to the object or not
+    // LastWasPositive indicate whether the previous pixel belong to the object or not
     bool LastWasPositive(false);
     // While unexplored pixels remain and no edge was found
     while ((move < nextStart + 8) && (!EdgeFound))
diff --git a/Modules/Filtering/Path/include/otbPathListToHistogramGenerator.h b/Modules/Filtering/Path/include/otbPathListToHistogramGenerator.h
index 2f46aad..172e68a 100644
--- a/Modules/Filtering/Path/include/otbPathListToHistogramGenerator.h
+++ b/Modules/Filtering/Path/include/otbPathListToHistogramGenerator.h
@@ -25,7 +25,7 @@
 #include "itkVector.h"
 #include "otbObjectList.h"
 
-//TODO : write a HistogramSource when outputing Histogram
+//TODO : write a HistogramSource when outputting Histogram
 
 namespace otb
 {
diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h
index 0775f5d..d225a11 100644
--- a/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h
+++ b/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h
@@ -84,7 +84,7 @@ public:
     vnlMat[2][1] = std::conj(ComplexType(Coherency[4]));
     vnlMat[2][2] = ComplexType(T2,  0.);
 
-    // Only compute the left symetry to respect the previous Hermitian Analisys code
+    // Only compute the left symmetry to respect the previous Hermitian Analisys code
     vnl_complex_eigensystem syst(vnlMat, false, true);
     const VNLMatrixType eigenVectors( syst.L );
     const VNLVectorType eigenValues(syst.W);
diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h
index f3a1f8f..727ec7a 100644
--- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h
+++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h
@@ -55,7 +55,7 @@ namespace otb {
  * The RMS (root mean square) ground error is available through the
  * appropriate getter.
  *
- * Please note that GCPs are infered to be given in physical
+ * Please note that GCPs are inferred to be given in physical
  * coordinates. This is seamless in most cases.
  *
  * Please note that at least 16 GCPs are required to estimate a proper
diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.txx b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.txx
index f9b78b9..26ccb04 100644
--- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.txx
+++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.txx
@@ -129,7 +129,7 @@ GCPsToRPCSensorModelImageFilter<TImage>
   groundPointWithElevation[0] = groundPoint[0];
   groundPointWithElevation[1] = groundPoint[1];
 
-  // Check wether we are using a DEM or not
+  // Check whether we are using a DEM or not
   if (m_UseDEM)
     {
     // If so, use it to get the elevation
@@ -243,7 +243,7 @@ GCPsToRPCSensorModelImageFilter<TImage>
 
   RSTransformType::Pointer rsTransform = RSTransformType::New();
   rsTransform->SetInputKeywordList(m_Keywordlist);
-  rsTransform->InstanciateTransform();
+  rsTransform->InstantiateTransform();
 
   ContinuousIndexType   idFix, idOut;
   Continuous3DIndexType idOut3D, idTrans3D;
diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h
index 97ff952..83c6d16 100644
--- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h
+++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h
@@ -218,7 +218,7 @@ public:
     m_InputRpcEstimator->SetGridSize(gridSize);
     this->Modified();
   }
-  /** unsigned int as paramater */
+  /** unsigned int as parameter */
   void SetInputRpcGridSize(unsigned int gridSize)
   {
     m_InputRpcEstimator->SetGridSize(gridSize);
@@ -241,7 +241,7 @@ public:
     m_OutputRpcEstimator->SetGridSize(gridSize);
     this->Modified();
   }
-  /** unsigned int as paramater */
+  /** unsigned int as parameter */
   void SetOutputRpcGridSize(unsigned int gridSize)
   {
     m_OutputRpcEstimator->SetGridSize(gridSize);
diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.txx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.txx
index 10c6fab..032686d 100644
--- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.txx
+++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.txx
@@ -45,7 +45,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage>
   m_EstimateOutputRpcModel = false;
   m_RpcEstimationUpdated   = false;
 
-  // internal filters instanciation
+  // internal filters instantiation
   m_Resampler         = ResamplerType::New();
   m_InputRpcEstimator = InputRpcModelEstimatorType::New();
   m_OutputRpcEstimator= OutputRpcModelEstimatorType::New();
@@ -92,7 +92,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage>
     this->EstimateInputRpcModel();
     }
 
-  // Instanciate the RS transform
+  // Instantiate the RS transform
   this->UpdateTransform();
 
   m_Resampler->SetInput(this->GetInput());
@@ -151,7 +151,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage>
 
 /**
   * Fill with the default dict of the input and the output
-  * and instanciate the transform
+  * and instantiate the transform
   */
 template <class TInputImage, class TOutputImage>
 void
@@ -164,7 +164,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage>
     m_Transform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef());
     m_Transform->SetOutputKeywordList(this->GetInput()->GetImageKeywordlist());
     }
-  m_Transform->InstanciateTransform();
+  m_Transform->InstantiateTransform();
 }
 
 template <class TInputImage, class TOutputImage>
@@ -262,7 +262,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage>
   const InputImageType* input = this->GetInput();
 
   // Update the transform with input information
-  // Done here because the transform is not instanciated
+  // Done here because the transform is not instantiated
   // yet
   this->UpdateTransform();
 
diff --git a/Modules/Filtering/Projection/include/otbGeographicalDistance.h b/Modules/Filtering/Projection/include/otbGeographicalDistance.h
index c05ee32..fde49c1 100644
--- a/Modules/Filtering/Projection/include/otbGeographicalDistance.h
+++ b/Modules/Filtering/Projection/include/otbGeographicalDistance.h
@@ -29,7 +29,7 @@ namespace otb
  * \class GeographicalDistance
  * \brief Compute the metric distance between two geographical points
  *
- * Vector lenght must be at least two, otherwise the Evaluate method
+ * Vector length must be at least two, otherwise the Evaluate method
  * will throw an exception.
  *
  * First dimension is assumed to be the longitude, and second
@@ -62,7 +62,7 @@ public:
   /** Method for creation through the object factory. */
   itkNewMacro(Self);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TVector                                  VectorType;
 
   /** Gets the distance between the origin point and x. This function
diff --git a/Modules/Filtering/Projection/include/otbGeographicalDistance.txx b/Modules/Filtering/Projection/include/otbGeographicalDistance.txx
index fb75398..f0cd5a3 100644
--- a/Modules/Filtering/Projection/include/otbGeographicalDistance.txx
+++ b/Modules/Filtering/Projection/include/otbGeographicalDistance.txx
@@ -37,7 +37,7 @@ double
 GeographicalDistance<TVector>
 ::Evaluate(const VectorType & x) const
 {
-  // First check if vector lenght is sufficient
+  // First check if vector length is sufficient
   if(x.Size()<2)
     itkExceptionMacro(<<"Vector length must be at least 2 to compute geographical distance.");
 
@@ -55,7 +55,7 @@ double
 GeographicalDistance<TVector>
 ::Evaluate(const VectorType & x, const VectorType & y) const
 {
-  // First check if vector lenght is sufficient
+  // First check if vector length is sufficient
   if(x.Size()<2 || y.Size()<2)
     itkExceptionMacro(<<"Vector length must be at least 2 to compute geographical distance.");
 
@@ -64,7 +64,7 @@ GeographicalDistance<TVector>
   const double Two = One + One;
   const double Deg2Rad = CONST_PI/180.;
 
-  // Compute lattitude and longitude differences
+  // Compute latitude and longitude differences
   double dLat = (vcl_fabs(x[1] - y[1])) * Deg2Rad;
   double dLon = (vcl_fabs(x[0] - y[0])) * Deg2Rad;
 
diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h
index 542916f..e424eb0 100644
--- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h
+++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h
@@ -24,6 +24,8 @@
 #include "itkTransform.h"
 #include "otbGenericRSTransform.h"
 
+#include "OTBProjectionExport.h"
+
 class OGRCoordinateTransformation;
 
 namespace otb
@@ -41,7 +43,7 @@ namespace internal
  *
  * \since OTB v 3.14.0
  */
-struct ReprojectTransformationFunctor
+struct OTBProjection_EXPORT ReprojectTransformationFunctor
   {
   typedef OGRGeometry TransformedElementType;
 
@@ -151,7 +153,7 @@ private:
  *
  * \ingroup OTBProjection
  */
-class ITK_EXPORT GeometriesProjectionFilter : public GeometriesToGeometriesFilter
+class OTBProjection_EXPORT GeometriesProjectionFilter : public GeometriesToGeometriesFilter
 {
 public:
   /**\name Standard ITK typedefs */
@@ -208,7 +210,16 @@ private:
    * forwarded to the functor. \c ogr::Layer specific settings will be set at
    * the last moment from \c DoProcessLayer().
    */
-  void DoFinalizeInitialisation() ITK_OVERRIDE;
+  void DoFinalizeInitialization() ITK_OVERRIDE;
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  void DoFinalizeInitialisation()
+  {
+    otbWarningMacro(
+      << "DoFinalizeInitialisation has been deprecated.  Please use DoFinalizeInitialization() instead");
+    this->DoFinalizeInitialization();
+  }
+  
   /**
    * Hook used to define the fields of the new layer.
    * \param[in] source  source \c Layer -- for reference
diff --git a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.h b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.h
index 70e3945..86d89e8 100644
--- a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.h
+++ b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.h
@@ -81,18 +81,18 @@ public:
   itkStaticConstMacro(ImageDimension, unsigned int, InputImageType::ImageDimension);
 
   /** Evalulate the function at specified index */
-  virtual FloatType EvaluateAtIndex(const IndexType& index) const;
+  FloatType EvaluateAtIndex(const IndexType& index) const ITK_OVERRIDE;
 
   /** Evaluate the function at non-integer positions */
-  virtual FloatType Evaluate(const PointType& point) const
+  FloatType Evaluate(const PointType& point) const ITK_OVERRIDE
   {
     IndexType index;
     this->ConvertPointToNearestIndex(point, index);
     return this->EvaluateAtIndex(index);
   }
 
-  virtual FloatType EvaluateAtContinuousIndex(
-    const ContinuousIndexType& cindex) const
+  FloatType EvaluateAtContinuousIndex(
+    const ContinuousIndexType& cindex) const ITK_OVERRIDE
   {
     IndexType index;
     this->ConvertContinuousIndexToNearestIndex(cindex, index);
@@ -103,8 +103,8 @@ public:
 
 protected:
   GroundSpacingImageFunction();
-  virtual ~GroundSpacingImageFunction(){}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+  ~GroundSpacingImageFunction() ITK_OVERRIDE{}
+  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
 private:
   GroundSpacingImageFunction(const Self &);  //purposely not implemented
diff --git a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.txx b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.txx
index b966d64..6c3a5e9 100644
--- a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.txx
+++ b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.txx
@@ -133,7 +133,7 @@ GroundSpacingImageFunction<TInputImage, TCoordRep>
   transform->SetInputOrigin(this->GetInputImage()->GetOrigin());
   transform->SetInputSpacing(this->GetInputImage()->GetSpacing());
 
-  transform->InstanciateTransform();
+  transform->InstantiateTransform();
   return transform->TransformPoint(inputPoint);
 }
 
diff --git a/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.txx b/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.txx
index 3f7908b..a7b72b4 100644
--- a/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.txx
+++ b/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.txx
@@ -111,7 +111,7 @@ ImageToEnvelopeVectorDataFilter<TInputImage, TOutputVectorData>
   m_Transform->SetOutputProjectionRef(m_OutputProjectionRef);
   m_Transform->SetInputProjectionRef(inputPtr->GetProjectionRef());
   m_Transform->SetInputKeywordList(inputPtr->GetImageKeywordlist());
-  m_Transform->InstanciateTransform();
+  m_Transform->InstantiateTransform();
 }
 
 
diff --git a/Modules/Filtering/Projection/include/otbLeastSquareAffineTransformEstimator.h b/Modules/Filtering/Projection/include/otbLeastSquareAffineTransformEstimator.h
index d593ca9..0e81817 100644
--- a/Modules/Filtering/Projection/include/otbLeastSquareAffineTransformEstimator.h
+++ b/Modules/Filtering/Projection/include/otbLeastSquareAffineTransformEstimator.h
@@ -30,7 +30,7 @@ namespace otb {
  * \brief This class provide the affine transform LSQR estimation
  *
  * This class uses the classical least square optimisation to estimate
- * an affine transfrom from a set of tie points.
+ * an affine transform from a set of tie points.
  *
  * This implementation supports points of any dimension.
  *
@@ -39,7 +39,7 @@ namespace otb {
  * The ClearTiePoints() method allows removing all the tie points
  * that has been previously set.
  *
- * Once all the tie points have been feeded into the estimator, the
+ * Once all the tie points have been fed into the estimator, the
  * Compute() method will perform the optimization.
  *
  * Matrix of the estimated affine transform can be retrieved using the
@@ -48,8 +48,8 @@ namespace otb {
  * Offset of the estimated affine transform can be retrieved using the
  * GetOffset() method.
  *
- * Alternatively, the GetAffineTransfrom() methods return a pointer to
- * a fully set-up forward affine transfrom (\sa AffineTransform).
+ * Alternatively, the GetAffineTransform() methods return a pointer to
+ * a fully set-up forward affine transform (\sa AffineTransform).
  *
  * Estimation errors are available per dimension using the
  * GetRMSError() (root mean square location error) or
@@ -106,7 +106,7 @@ public:
   /** Get the affine transform offset */
   itkGetConstReferenceMacro(Offset, VectorType);
 
-  /** Get the estimated affine transfrom */
+  /** Get the estimated affine transform */
   itkGetObjectMacro(AffineTransform, AffineTransformType);
 
   /** Get the RMS error */
@@ -159,7 +159,7 @@ private:
   /** Affine transform offset */
   VectorType m_Offset;
 
-  /** Affine transfrom */
+  /** Affine transform */
   AffineTransformPointerType m_AffineTransform;
 
 }; // end of class
diff --git a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.txx b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.txx
index d9c619c..d39635b 100644
--- a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.txx
+++ b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.txx
@@ -66,7 +66,7 @@ PhysicalToRPCSensorModelImageFilter<TImage>
     // Generate GCPs from physical sensor model
     RSTransformPointerType  rsTransform = RSTransformType::New();
     rsTransform->SetInputKeywordList(input->GetImageKeywordlist());
-    rsTransform->InstanciateTransform();
+    rsTransform->InstantiateTransform();
 
     // Compute the size of the grid
     typename ImageType::SizeType  size = input->GetLargestPossibleRegion().GetSize();
diff --git a/Modules/Filtering/Projection/include/otbPleiadesPToXSAffineTransformCalculator.h b/Modules/Filtering/Projection/include/otbPleiadesPToXSAffineTransformCalculator.h
index bfd7665..7f2c2c2 100644
--- a/Modules/Filtering/Projection/include/otbPleiadesPToXSAffineTransformCalculator.h
+++ b/Modules/Filtering/Projection/include/otbPleiadesPToXSAffineTransformCalculator.h
@@ -21,6 +21,7 @@
 #include "itkLightObject.h"
 #include "itkScalableAffineTransform.h"
 #include "itkImageBase.h"
+#include "OTBProjectionExport.h"
 
 namespace otb {
 /**
@@ -30,13 +31,13 @@ namespace otb {
  * Pleiades sensor bundle are exactly homotetic, it is therefore
  * possible to corregister the pancrhomatic and multispectral images
  * with a simple affine transform without using any sensor
- * modelling. This yelds a very accurate corregistration and avoid the
+ * modelling. This yields a very accurate corregistration and avoid the
  * use of a DSM which may cause registration errors due to height errors.
  *
  * This calculator is a helper class to build the affine transform. It
  * consists in only two static methods: one to check if the transform
  * calculation applies to the given pair of images, the other to
- * actually estimate the transfrom.
+ * actually estimate the transform.
  *
  * The estimated transform returned by the latter transforms
  * pancrhomatic image positions to multispectral image positions. If
@@ -46,7 +47,7 @@ namespace otb {
  *
  * \ingroup OTBProjection
  */
-class ITK_EXPORT PleiadesPToXSAffineTransformCalculator
+class OTBProjection_EXPORT PleiadesPToXSAffineTransformCalculator
   : public itk::LightObject
 {
 public:
@@ -64,7 +65,7 @@ public:
   /**
    * This function checks if the transform calculation applies to the
    * given pair of images. Checked items are:
-   * - Both images are sucessfully undertood by OTB as Pleiades images,
+   * - Both images are successfully undertood by OTB as Pleiades images,
    * - Both images processing level is SENSOR",
    * - XS and Pan ids (except last 4 letters) are equal.
    * \return True if the calculation applies
diff --git a/Modules/Filtering/Projection/include/otbRationalTransform.h b/Modules/Filtering/Projection/include/otbRationalTransform.h
index bdd8891..9c746fc 100644
--- a/Modules/Filtering/Projection/include/otbRationalTransform.h
+++ b/Modules/Filtering/Projection/include/otbRationalTransform.h
@@ -81,7 +81,7 @@ public:
   void SetNumeratorDegree(unsigned int value)
   {
     this->m_NumeratorDegree = value;
-    this->InitalizeParameters();
+    this->InitializeParameters();
   }
 
   /** Get the numerator degree */
@@ -91,7 +91,7 @@ public:
   void SetDenominatorDegree(unsigned int value)
   {
     this->m_DenominatorDegree = value;
-    this->InitalizeParameters();
+    this->InitializeParameters();
   }
 
   /** Get the denominator degree */
@@ -164,7 +164,7 @@ public:
   }
 
   /** Initialize Parameters size  */
-  void InitalizeParameters()
+  void InitializeParameters()
   {
     this->m_Parameters.SetSize(this->GetNumberOfParameters());
     this->m_Parameters.Fill(0);
@@ -180,7 +180,7 @@ public:
 protected:
   RationalTransform() : Superclass(16), m_NumeratorDegree(3), m_DenominatorDegree(3)
     {
-    this->InitalizeParameters();
+    this->InitializeParameters();
     }
 
 
diff --git a/Modules/Filtering/Projection/include/otbUtmMapProjection.txx b/Modules/Filtering/Projection/include/otbUtmMapProjection.txx
index 715c93e..9c76673 100644
--- a/Modules/Filtering/Projection/include/otbUtmMapProjection.txx
+++ b/Modules/Filtering/Projection/include/otbUtmMapProjection.txx
@@ -77,7 +77,7 @@ template <TransformDirection::TransformationDirection TTransform>
 char UtmMapProjection<TTransform>
 ::GetHemisphere() const
 {
-  //If this happens, we have to better control the instanciation of
+  //If this happens, we have to better control the instantiation of
   //the projection.
   assert(this->GetParameter("Hemisphere").size() > 0);
   char hemisphere = this->GetParameter("Hemisphere")[0];
diff --git a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h
index 17b2349..eba1ad9 100644
--- a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h
+++ b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h
@@ -47,7 +47,7 @@ namespace otb
   * system of the image (origin on the top left). The value need to be provided by the
   * SetInputSpacing, SetInputOrigin, SetOutputSpacing and SetOutputOrigin methods.
   *
-  * The two transforms derived from itk::Transform and will be instanciated as
+  * The two transforms derived from itk::Transform and will be instantiated as
   * otb::GenericMapProjection or otb::InverseSensorModel or otb::ForwardSensorModel
   * (according to the available information).
   *
@@ -179,7 +179,15 @@ protected:
   OutputPolygonPointerType ProcessPolygon(InputPolygonPointerType polygon) const ITK_OVERRIDE;
   OutputPolygonListPointerType ProcessPolygonList(InputPolygonListPointerType polygonList) const ITK_OVERRIDE;
 
-  virtual void InstanciateTransform(void);
+  virtual void InstantiateTransform(void);
+
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
+  void InstanciateTransform()
+  {
+    otbWarningMacro(
+      << "InstanciateTransform has been deprecated.  Please use InstanciateTransform() instead");
+    this->InstantiateTransform();
+  }
 
   void GenerateOutputInformation(void) ITK_OVERRIDE;
   void GenerateData(void) ITK_OVERRIDE;
diff --git a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.txx b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.txx
index 6bd1b23..e6d3651 100644
--- a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.txx
+++ b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.txx
@@ -262,15 +262,15 @@ VectorDataProjectionFilter<TInputVectorData, TOutputVectorData>
 }
 
 /**
- * Instanciate the transformation according to information
+ * Instantiate the transformation according to information
  */
 template <class TInputVectorData, class TOutputVectorData>
 void
 VectorDataProjectionFilter<TInputVectorData, TOutputVectorData>
-::InstanciateTransform(void)
+::InstantiateTransform(void)
 {
 
-//   otbMsgDevMacro(<< "Information to instanciate transform (VectorDataProjectionFilter): ");
+//   otbMsgDevMacro(<< "Information to instantiate transform (VectorDataProjectionFilter): ");
 //   otbMsgDevMacro(<< " * Input Origin: " << m_InputOrigin);
 //   otbMsgDevMacro(<< " * Input Spacing: " << m_InputSpacing);
 //   otbMsgDevMacro(<< " * Input keyword list: "
@@ -303,7 +303,7 @@ VectorDataProjectionFilter<TInputVectorData, TOutputVectorData>
   m_Transform->SetOutputSpacing(m_OutputSpacing);
   m_Transform->SetOutputOrigin(m_OutputOrigin);
 
-  m_Transform->InstanciateTransform();
+  m_Transform->InstantiateTransform();
   // retrieve the output projection ref
   // if it is not specified and end up being geographic,
   // only the m_Transform will know
@@ -336,8 +336,8 @@ VectorDataProjectionFilter<TInputVectorData, TOutputVectorData>
   InputVectorDataPointer  inputPtr = this->GetInput();
   OutputVectorDataPointer outputPtr = this->GetOutput();
 
-  //Instanciate the transform
-  this->InstanciateTransform();
+  //Instantiate the transform
+  this->InstantiateTransform();
 
   typedef typename OutputVectorDataType::DataTreePointerType OutputDataTreePointerType;
   OutputDataTreePointerType tree = outputPtr->GetDataTree();
diff --git a/Modules/Filtering/Projection/include/otbVectorDataTransformFilter.txx b/Modules/Filtering/Projection/include/otbVectorDataTransformFilter.txx
index 9bf0281..6fc74a7 100644
--- a/Modules/Filtering/Projection/include/otbVectorDataTransformFilter.txx
+++ b/Modules/Filtering/Projection/include/otbVectorDataTransformFilter.txx
@@ -34,7 +34,7 @@ VectorDataTransformFilter<TInputVectorData, TOutputVectorData>
 ::VectorDataTransformFilter()
 {
 //  m_Transform = GenericTransformType::New();
-  // with ITK v4 you can't instanciate a transform (virtual). We do NOT want to
+  // with ITK v4 you can't instantiate a transform (virtual). We do NOT want to
   // use the otb::Transform or we loose the capability of using all the existing
   // itk transform, so we just keep it as NULL and you have to be careful not
   // to burn yourself when using it.
diff --git a/Modules/Filtering/Projection/otb-module.cmake b/Modules/Filtering/Projection/otb-module.cmake
index 9d6f9b5..38bb1f7 100644
--- a/Modules/Filtering/Projection/otb-module.cmake
+++ b/Modules/Filtering/Projection/otb-module.cmake
@@ -6,6 +6,7 @@ generically related to this purpose. for instance, user can handle OGR data type
 solvers, re-project input vector data over input images, and so on.")
 
 otb_module(OTBProjection
+ENABLE_SHARED
   DEPENDS
     OTBBoostAdapters
     OTBCommon
diff --git a/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx b/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx
index 35d0ff4..729aa64 100644
--- a/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx
+++ b/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx
@@ -89,7 +89,7 @@ void otb::internal::ReprojectTransformationFunctor::do_transform(OGRPolygon & g)
     if (ring)
       {
       do_transform(*ring); // no need to go through the redispatch cycle
-      // how to commit the change ? Are ring modifications automatically commited ?
+      // how to commit the change ? Are ring modifications automatically committed ?
       }
     }
   OGRLinearRing * ring = g.getExteriorRing();
@@ -97,7 +97,7 @@ void otb::internal::ReprojectTransformationFunctor::do_transform(OGRPolygon & g)
   if (ring)
     {
     do_transform(*ring); // no need to go through the redispatch cycle
-    // how to commit the change ? Are ring modifications automatically commited ?
+    // how to commit the change ? Are ring modifications automatically committed ?
     }
 }
 
@@ -172,7 +172,7 @@ void otb::GeometriesProjectionFilter::GenerateOutputInformation(void)
 }
 
 /*virtual*/
-void otb::GeometriesProjectionFilter::DoFinalizeInitialisation()
+void otb::GeometriesProjectionFilter::DoFinalizeInitialization()
 {
   m_Transform = InternalTransformType::New();
 
@@ -188,9 +188,9 @@ void otb::GeometriesProjectionFilter::DoFinalizeInitialisation()
   m_Transform->SetOutputSpacing(m_OutputImageReference.GetSpacing());
   m_Transform->SetOutputOrigin(m_OutputImageReference.GetOrigin());
 
-  // As the InputProjectionRef can't be known yet, InstanciateTransform() will
+  // As the InputProjectionRef can't be known yet, InstantiateTransform() will
   // be called from DoProcessLayer
-  // m_Transform->InstanciateTransform();
+  // m_Transform->InstantiateTransform();
 
   m_TransformationFunctor->SetOnePointTransformation(m_Transform);
 
@@ -226,7 +226,7 @@ void otb::GeometriesProjectionFilter::DoProcessLayer(ogr::Layer const& source, o
   // Finish the initialization phase as somethings depends on the current layer
   // to process.
   m_Transform->SetInputProjectionRef(source.GetProjectionRef());
-  m_Transform->InstanciateTransform();
+  m_Transform->InstantiateTransform();
 
   if (source == destination)
     {
diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt
index ec86d27..a688e2f 100644
--- a/Modules/Filtering/Projection/test/CMakeLists.txt
+++ b/Modules/Filtering/Projection/test/CMakeLists.txt
@@ -52,11 +52,11 @@ otbImportGeoInformationImageFilter.cxx
 
 
 set(GEOMGCP
-"pleiades/pleiades-1" #LARGEINPUT{PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2} 
-"wv2/wv2-1"           #LARGEINPUT{WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN/09DEC10103019-P2AS-052298844010_01_P001.TIF} 
+"pleiades/pleiades-1" #LARGEINPUT{PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2}
+"wv2/wv2-1"           #LARGEINPUT{WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN/09DEC10103019-P2AS-052298844010_01_P001.TIF}
 "spot6/spot6-1"       #LARGEINPUT{SPOT6/600143101-Primary-Bundle-JP2-LOSSLESS/PROD_SPOT6_001/VOL_SPOT6_001_A/IMG_SPOT6_MS_001_A/IMG_SPOT6_MS_201212071020271_SEN_600143101_R1C1.JP2}
 "QB/qb-1"             #LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF}
-"ikonos/ikonos-1"     #LARGEINPUT{IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif} 
+"ikonos/ikonos-1"     #LARGEINPUT{IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif}
 "rapideye/rapideye-1" #LARGEINPUT{RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf}
 "sentinel1/sentinel1-1" #LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff}
 )
@@ -87,13 +87,13 @@ foreach( file ${GEOMGCP} )
   list(GET NEEDEDKW   ${GEOM_TESTNB} current_neededkw   )
   list(GET GEOTOL     ${GEOM_TESTNB} current_geotol )
   math(EXPR GEOM_TESTNB "${GEOM_TESTNB} + 1")
-  
+
   string(FIND ${current_geomgcp} "/" POS)
   math(EXPR POS "${POS} + 1")
   string(LENGTH ${current_geomgcp} LENGTH)
   math(EXPR SIZE "${LENGTH} - ${POS}")
   string(SUBSTRING ${current_geomgcp} ${POS} ${SIZE} TESTNAME)
-  
+
   otb_add_test(NAME prTvSensorModel_${TESTNAME} COMMAND otbProjectionTestDriver
     otbSensorModel
     ${INPUTDATA}/${current_geomgcp}.geom
@@ -111,9 +111,9 @@ endforeach()
 
 #Faulty sensors
 #set(GEOMGCP
-#"radarsat2/gd-radarsat2-1" #LARGEINPUT{RADARSAT2/ALTONA/Fine_Quad-Pol_Dataset/PK6621_DK406_FQ9_20080405_124900_HH_VV_HV_VH_SLC_Altona/imagery_HH.tif} 
-#"terrasarx/gd-terrasarx-1" #LARGEINPUT{TERRASARX/TORONTO/TSX1_SAR__SSC/IMAGEDATA/IMAGE_HH_SRA_spot_074.cos} 
-#"terrasarx/gd-terrasarx-1" #LARGEINPUT{TERRASARX/PANGKALANBUUN/IMAGEDATA/IMAGE_HH_SRA_stripFar_008.cos} 
+#"radarsat2/gd-radarsat2-1" #LARGEINPUT{RADARSAT2/ALTONA/Fine_Quad-Pol_Dataset/PK6621_DK406_FQ9_20080405_124900_HH_VV_HV_VH_SLC_Altona/imagery_HH.tif}
+#"terrasarx/gd-terrasarx-1" #LARGEINPUT{TERRASARX/TORONTO/TSX1_SAR__SSC/IMAGEDATA/IMAGE_HH_SRA_spot_074.cos}
+#"terrasarx/gd-terrasarx-1" #LARGEINPUT{TERRASARX/PANGKALANBUUN/IMAGEDATA/IMAGE_HH_SRA_stripFar_008.cos}
 #"palsar/gd-palsar-1" #LARGEINPUT{PALSAR/200801280007/l1data/IMG-HH-ALPSRP037120700-H1.1__A} Ne reconnaît pas l'image
 #"s1/gd-s1-A" #LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff}
 #)
@@ -131,13 +131,13 @@ set( GEOM_TESTNB 0)
 foreach( file ${GEOMGCP} )
   list(GET GEOMGCP   ${GEOM_TESTNB} current_geomgcp   )
   math(EXPR GEOM_TESTNB "${GEOM_TESTNB} + 1")
-  
+
   string(FIND ${current_geomgcp} "/" POS)
   math(EXPR POS "${POS} + 1")
   string(LENGTH ${current_geomgcp} LENGTH)
   math(EXPR SIZE "${LENGTH} - ${POS}")
   string(SUBSTRING ${current_geomgcp} ${POS} ${SIZE} TESTNAME)
-  
+
   otb_add_test(NAME prTvSensorModel_${TESTNAME} COMMAND otbProjectionTestDriver
     #BASELINE_FILES
     otbSensorModel
@@ -172,31 +172,31 @@ otb_add_test(NAME prTuVectorDataProjectionFilterFromGeoToMap COMMAND otbProjecti
 #-------------------- OrthoRectification tests --------------------------
 #------------------------------------------------------------------------
 set(IMG_TEST_ORTHO
-PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2 
+PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2
 WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN/09DEC10103019-P2AS-052298844010_01_P001.TIF
 SPOT6/600143101-Primary-Bundle-JP2-LOSSLESS/PROD_SPOT6_001/VOL_SPOT6_001_A/IMG_SPOT6_MS_001_A/IMG_SPOT6_MS_201212071020271_SEN_600143101_R1C1.JP2
 QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF
-IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif 
+IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif
 RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf
 SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff
 )
 
 set(IMG_TYPE
 "pleiades-1"
-"wv2-1" 
+"wv2-1"
 "spot6-1"
 "qb-1"
-"ikonos-1"     
+"ikonos-1"
 "rapideye-1"
 "sentinel1"
 )
 
 set(GEOMGCP
-"pleiades/pleiades-1" #LARGEINPUT{PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2} 
-"wv2/wv2-1"           #LARGEINPUT{WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN/09DEC10103019-P2AS-052298844010_01_P001.TIF} 
+"pleiades/pleiades-1" #LARGEINPUT{PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2}
+"wv2/wv2-1"           #LARGEINPUT{WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN/09DEC10103019-P2AS-052298844010_01_P001.TIF}
 "spot6/spot6-1"       #LARGEINPUT{SPOT6/600143101-Primary-Bundle-JP2-LOSSLESS/PROD_SPOT6_001/VOL_SPOT6_001_A/IMG_SPOT6_MS_001_A/IMG_SPOT6_MS_201212071020271_SEN_600143101_R1C1.JP2}
 "QB/qb-1"             #LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF}
-"ikonos/ikonos-1"     #LARGEINPUT{IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif} 
+"ikonos/ikonos-1"     #LARGEINPUT{IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif}
 "rapideye/rapideye-1" #LARGEINPUT{RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf}
 "sentinel1/sentinel1-1" #LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff}
 )
@@ -302,7 +302,7 @@ foreach(current_img ${IMG_TEST_ORTHO})
 	foreach( current_mode ${MODE} )
 	  list(GET DEMDIR   ${MODENB} current_demdir   )
 	  math(EXPR MODENB "${MODENB} + 1")
-	  
+
 	  otb_add_test(NAME prTvOrthoRectification_${current_imgtype}_${current_mode} COMMAND otbProjectionTestDriver
 		  --compare-image ${EPSILON_4}  ${BASELINE}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif
 		  ${TEMP}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif
@@ -322,7 +322,7 @@ foreach(current_img ${IMG_TEST_ORTHO})
 		  ${current_demdir}
 		  ${current_is_compex}
 		)
-			  
+
 	endforeach()
 endforeach()
 #------------------------------------------------------------------------
@@ -500,10 +500,10 @@ otb_add_test(NAME prTuImageToGenericRSOutputParametersNew COMMAND otbProjectionT
 otb_add_test(NAME prTvGeometriesProjectionFilterFromMapToGeo COMMAND otbProjectionTestDriver
   --compare-ogr ${NOTOL}
   ${BASELINE_FILES}/prTvVectorDataProjectionFilterFromMapToGeo.kml
-  ${TEMP}/prTvGeometriesProjectionFilterFromMapToGeo.kml
+  ${TEMP}/prTvGeometriesProjectionFilterFromMapToGeo.shp
   otbGeometriesProjectionFilterFromMapToGeo
   ${INPUTDATA}/ToulousePoints-examples.shp
-  ${TEMP}/prTvGeometriesProjectionFilterFromMapToGeo.kml
+  ${TEMP}/prTvGeometriesProjectionFilterFromMapToGeo.shp
   )
 
 otb_add_test(NAME leTvROIdataConversion COMMAND otbProjectionTestDriver
@@ -1155,10 +1155,10 @@ otb_add_test(NAME prTvGeometriesProjectionFilterFromMapToEPSG_UTM COMMAND otbPro
 otb_add_test(NAME prTvGeometriesProjectionFilterFromMapToEPSG_WGS84 COMMAND otbProjectionTestDriver
   --compare-ogr ${NOTOL}
   ${BASELINE_FILES}/prTvVectorDataProjectionFilterFromMapToGeo.kml
-  ${TEMP}/prTvGeometriesProjectionFilterFromMapToEPSG_WGS84.kml
+  ${TEMP}/prTvGeometriesProjectionFilterFromMapToEPSG_WGS84.shp
   otbGeometriesProjectionFilterFromMapToEPSG
   ${INPUTDATA}/ToulousePoints-examples.shp
-  ${TEMP}/prTvGeometriesProjectionFilterFromMapToEPSG_WGS84.kml
+  ${TEMP}/prTvGeometriesProjectionFilterFromMapToEPSG_WGS84.shp
   4326 )
 
 otb_add_test(NAME prTvVectorDataProjectionFilterPoints COMMAND otbProjectionTestDriver
@@ -1248,7 +1248,7 @@ set(GenericConversionChecking_INPUTS
     #)
 
   #set( VectorDataIntoImage_TESTNB 0)
-  
+
   #foreach( file ${VectorDataIntoImage_FILES} )
     #math(EXPR VectorDataIntoImage_TESTNB "${VectorDataIntoImage_TESTNB} + 1")
     #otb_add_test(NAME prTvVectorDataIntoImageProjectionFilter_${VectorDataIntoImage_TESTNB} COMMAND otbProjectionTestDriver
@@ -1258,15 +1258,15 @@ set(GenericConversionChecking_INPUTS
       #${INPUTDATA}/DEM/srtm_directory
       #3 )
   #endforeach()
-  
-  
+
+
 
   set(SENSOR_TYPES
     "QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF"
     "GEOEYE/LES_ROCHES/po_350134_bgrn_0000000.tif"
     "WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_MUL/09DEC10103019-M2AS-052298844010_01_P001.TIF"
     )
-  
+
   foreach( file ${SENSOR_TYPES})
     # Get the sensor name
     set(sharp_regexp "([0-9A-Za-z_]*)[ ]*/[ ]*(.*)")
diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
index 19bf9c3..87027df 100644
--- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
+++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
@@ -124,7 +124,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
     otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(0);
     }
 
-  grsTrasnform->InstanciateTransform();
+  grsTrasnform->InstantiateTransform();
 
   // Test
   GeoDistanceType::Pointer geoDistance = GeoDistanceType::New();
diff --git a/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx b/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx
index 2d9dce5..91a916e 100644
--- a/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx
+++ b/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx
@@ -42,7 +42,7 @@ typedef otb::ImageFileWriter<ImageType>    WriterType;
 
 int otbGenericRSResampleImageFilterNew(int itkNotUsed(argc), char * itkNotUsed(argv)[])
 {
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   ImageResamplerType::Pointer resampler = ImageResamplerType::New();
   std::cout << resampler << std::endl;
   return EXIT_SUCCESS;
@@ -51,7 +51,7 @@ int otbGenericRSResampleImageFilterNew(int itkNotUsed(argc), char * itkNotUsed(a
 int otbGenericRSResampleImageFilter(int itkNotUsed(argc), char* argv[])
 {
 
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   ImageResamplerType::Pointer resampler = ImageResamplerType::New();
 
   const char * infname = argv[1];
@@ -135,7 +135,7 @@ int otbGenericRSResampleImageFilterFromMap(int itkNotUsed(argc), char* argv[])
 {
   typedef otb::MultiChannelExtractROI<PixelType, PixelType>  ExtractROIType;
 
-  // SmartPointer instanciation
+  // SmartPointer instantiation
   ExtractROIType::Pointer extractor = ExtractROIType::New();
   ImageResamplerType::Pointer resampler = ImageResamplerType::New();
 
@@ -144,7 +144,7 @@ int otbGenericRSResampleImageFilterFromMap(int itkNotUsed(argc), char* argv[])
   double iGridSpacing    = atof(argv[2]);
   int    useInRpc        = atoi(argv[3]);
 
-  // Reader Instanciation
+  // Reader Instantiation
   ReaderType::Pointer         reader    = ReaderType::New();
   reader->SetFileName(infname);
   reader->UpdateOutputInformation();
diff --git a/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx b/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx
index fee540a..6be43e1 100644
--- a/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx
+++ b/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx
@@ -44,7 +44,7 @@ typedef otb::GeographicalDistance<Point3DType>          GeoDistance3DType;
 int otbGenericRSTransformFromImage(int itkNotUsed(argc), char* argv[])
 {
   /*
-   * This test checks if we can instanciate a GenericRSTransform from the image information
+   * This test checks if we can instantiate a GenericRSTransform from the image information
    * without throwing an exception
    */
 
@@ -59,19 +59,19 @@ int otbGenericRSTransformFromImage(int itkNotUsed(argc), char* argv[])
   char * wgsRef = ITK_NULLPTR;
   oSRS.exportToWkt(&wgsRef);
 
-  // Instanciate WGS->Image transform
+  // Instantiate WGS->Image transform
   TransformType::Pointer wgs2img = TransformType::New();
   wgs2img->SetInputProjectionRef(wgsRef);
   wgs2img->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef());
   wgs2img->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist());
-  wgs2img->InstanciateTransform();
+  wgs2img->InstantiateTransform();
 
-  // Instanciate Image->WGS transform
+  // Instantiate Image->WGS transform
   TransformType::Pointer img2wgs = TransformType::New();
   img2wgs->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef());
   img2wgs->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist());
   img2wgs->SetOutputProjectionRef(wgsRef);
-  img2wgs->InstanciateTransform();
+  img2wgs->InstantiateTransform();
 
   return EXIT_SUCCESS;
 }
@@ -120,34 +120,34 @@ int otbGenericRSTransformImageAndMNTToWGS84ConversionChecking(int itkNotUsed(arg
   demHandler->OpenGeoidFile(argv[3]);
   double heightAboveEllipsoid = demHandler->GetHeightAboveEllipsoid(refGeoPt);
 
-  // Instanciate WGS->Image transform
+  // Instantiate WGS->Image transform
   TransformType::Pointer wgs2img = TransformType::New();
   wgs2img->SetInputProjectionRef(wgsRef);
   wgs2img->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef());
   wgs2img->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist());
-  wgs2img->InstanciateTransform();
+  wgs2img->InstantiateTransform();
 
-  // Instanciate Image->WGS transform
+  // Instantiate Image->WGS transform
   TransformType::Pointer img2wgs = TransformType::New();
   img2wgs->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef());
   img2wgs->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist());
   img2wgs->SetOutputProjectionRef(wgsRef);
-  img2wgs->InstanciateTransform();
+  img2wgs->InstantiateTransform();
 
 
-// Instanciate WGS->Image transform 3D
+// Instantiate WGS->Image transform 3D
   Transform3DType::Pointer wgs2img3d = Transform3DType::New();
   wgs2img3d->SetInputProjectionRef(wgsRef);
   wgs2img3d->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef());
   wgs2img3d->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist());
-  wgs2img3d->InstanciateTransform();
+  wgs2img3d->InstantiateTransform();
 
-  // Instanciate Image->WGS transform 3D
+  // Instantiate Image->WGS transform 3D
   Transform3DType::Pointer img2wgs3d = Transform3DType::New();
   img2wgs3d->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef());
   img2wgs3d->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist());
   img2wgs3d->SetOutputProjectionRef(wgsRef);
-  img2wgs3d->InstanciateTransform();
+  img2wgs3d->InstantiateTransform();
 
 
   std::cout<< std::setprecision(8) << std::endl;
diff --git a/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx b/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx
index 1af2a5c..f5c12b4 100644
--- a/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx
+++ b/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx
@@ -166,8 +166,8 @@ int otbGenericRSTransformGenericTest(int argc, char * argv[])
     return EXIT_FAILURE;
     }
 
-  // Instanciate the transform
-  transform->InstanciateTransform();
+  // Instantiate the transform
+  transform->InstantiateTransform();
 
   // Generate the inverse transform
   TransformType::Pointer inverseTransform = TransformType::New();
diff --git a/Modules/Filtering/Projection/test/otbGeographicalDistance.cxx b/Modules/Filtering/Projection/test/otbGeographicalDistance.cxx
index 2d2206f..ffe09ee 100644
--- a/Modules/Filtering/Projection/test/otbGeographicalDistance.cxx
+++ b/Modules/Filtering/Projection/test/otbGeographicalDistance.cxx
@@ -62,25 +62,25 @@ int otbGeographicalDistance(int itkNotUsed(argc), char * argv[])
   std::cerr.precision(5);
   if(vcl_abs(distEvaluate1 - expectedDistance) > tolerance)
     {
-    std::cerr<<"Evaluate("<<a<<") with origin "<<o<<" is innacurate: expected "<< expectedDistance<<", found "<<distEvaluate1<<std::endl;
+    std::cerr<<"Evaluate("<<a<<") with origin "<<o<<" is inaccurate: expected "<< expectedDistance<<", found "<<distEvaluate1<<std::endl;
     failFlag = true;
     }
 
   if(vcl_abs(distEvaluate2 - expectedDistance) > tolerance)
     {
-    std::cerr<<"Evaluate("<<a<<", "<<b<<") is innacurate: expected "<< expectedDistance<<", found "<<distEvaluate2<<std::endl;
+    std::cerr<<"Evaluate("<<a<<", "<<b<<") is inaccurate: expected "<< expectedDistance<<", found "<<distEvaluate2<<std::endl;
     failFlag = true;
     }
 
   if(distEvaluate2Null > tolerance)
     {
-    std::cerr<<"Evaluate("<<a<<", "<<a<<") is innacurate: expected 0., found "<<distEvaluate2Null<<std::endl;
+    std::cerr<<"Evaluate("<<a<<", "<<a<<") is inaccurate: expected 0., found "<<distEvaluate2Null<<std::endl;
     failFlag = true;
     }
 
     if(distEvaluate1Null > tolerance)
     {
-    std::cerr<<"Evaluate("<<b<<") with origin "<<o<< " is innacurate: expected 0., found "<<distEvaluate2Null<<std::endl;
+    std::cerr<<"Evaluate("<<b<<") with origin "<<o<< " is inaccurate: expected 0., found "<<distEvaluate2Null<<std::endl;
     failFlag = true;
     }
 
diff --git a/Modules/Filtering/Projection/test/otbPhysicalToRPCSensorModelImageFilter.cxx b/Modules/Filtering/Projection/test/otbPhysicalToRPCSensorModelImageFilter.cxx
index 29068e0..546d88d 100644
--- a/Modules/Filtering/Projection/test/otbPhysicalToRPCSensorModelImageFilter.cxx
+++ b/Modules/Filtering/Projection/test/otbPhysicalToRPCSensorModelImageFilter.cxx
@@ -29,7 +29,7 @@ int otbPhysicalToRPCSensorModelImageFilter(int argc, char* argv[])
   typedef otb::VectorImage<PixelType, Dimension>      ImageType;
   typedef otb::PhysicalToRPCSensorModelImageFilter<ImageType> PhysicalToSensorModelType;
 
-  // Object instanciation
+  // Object instantiation
   PhysicalToSensorModelType::Pointer estimator = PhysicalToSensorModelType::New();
 
   if(argc == 4)
diff --git a/Modules/Filtering/Projection/test/otbROIdataConversion.cxx b/Modules/Filtering/Projection/test/otbROIdataConversion.cxx
index d69d1b2..d1e3d72 100644
--- a/Modules/Filtering/Projection/test/otbROIdataConversion.cxx
+++ b/Modules/Filtering/Projection/test/otbROIdataConversion.cxx
@@ -28,13 +28,13 @@ int otbROIdataConversion(int itkNotUsed(argc), char* argv[])
   const unsigned int Dimension = 2;
   typedef otb::Image<PixelType,  Dimension>                      InputImageType;
   typedef otb::Image<PixelType,  Dimension>                      ROIImageType;
-  typedef otb::ROIdataConversion<InputImageType, ROIImageType> ConvertorType;
-  typedef ConvertorType::OutputImageType                         OutputImageType;
+  typedef otb::ROIdataConversion<InputImageType, ROIImageType> ConverterType;
+  typedef ConverterType::OutputImageType                         OutputImageType;
 
   typedef otb::ImageFileReader<InputImageType>  ReaderType;
   typedef otb::ImageFileReader<ROIImageType>    ROIReaderType;
 
-  ConvertorType::Pointer convertor = ConvertorType::New();
+  ConverterType::Pointer converter = ConverterType::New();
   ReaderType::Pointer    readerIm = ReaderType::New();
   ReaderType::Pointer    readerTr = ROIReaderType::New();
 
@@ -43,14 +43,14 @@ int otbROIdataConversion(int itkNotUsed(argc), char* argv[])
   readerIm->Update();
   readerTr->Update();
 
-  convertor->SetInput(readerIm->GetOutput());
-  convertor->SetROIImage(readerTr->GetOutput());
-  convertor->Update();
+  converter->SetInput(readerIm->GetOutput());
+  converter->SetROIImage(readerTr->GetOutput());
+  converter->Update();
 
   std::ofstream file;
   file.open(argv[3]);
-  itk::ImageRegionIterator<OutputImageType> outputIter(convertor->GetOutput(),
-                                                       convertor->GetOutput()->GetLargestPossibleRegion());
+  itk::ImageRegionIterator<OutputImageType> outputIter(converter->GetOutput(),
+                                                       converter->GetOutput()->GetLargestPossibleRegion());
   outputIter.GoToBegin();
 
   while (!outputIter.IsAtEnd())
diff --git a/Modules/Filtering/Projection/test/otbROIdataConversionNew.cxx b/Modules/Filtering/Projection/test/otbROIdataConversionNew.cxx
index 05072fc..640f8cd 100644
--- a/Modules/Filtering/Projection/test/otbROIdataConversionNew.cxx
+++ b/Modules/Filtering/Projection/test/otbROIdataConversionNew.cxx
@@ -27,11 +27,11 @@ int otbROIdataConversionNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
   const unsigned int Dimension = 2;
   typedef otb::VectorImage<PixelType,  Dimension>                InputImageType;
   typedef otb::Image<PixelType,  Dimension>                      ROIImageType;
-  typedef otb::ROIdataConversion<InputImageType, ROIImageType>   ConvertorType;
+  typedef otb::ROIdataConversion<InputImageType, ROIImageType>   ConverterType;
 
-  ConvertorType::Pointer convertor = ConvertorType::New();
+  ConverterType::Pointer converter = ConverterType::New();
 
-  std::cout << convertor << std::endl;
+  std::cout << converter << std::endl;
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx
index 5c2e116..c608a47 100644
--- a/Modules/Filtering/Projection/test/otbSensorModel.cxx
+++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx
@@ -164,7 +164,7 @@ int otbSensorModel(int argc, char* argv[])
   bool checkNeededKw = atoi(argv[9]);
 
   // -------------------
-  // Some instanciations  
+  // Some instantiations  
   // -------------------
   otb::ImageKeywordlist kwlist = otb::ReadGeometryFromGEOMFile(geomfilename);
     
@@ -231,7 +231,7 @@ int otbSensorModel(int argc, char* argv[])
   img2wgs->SetInputProjectionRef("");
   img2wgs->SetOutputProjectionRef(wgsRef);
   img2wgs->SetInputKeywordList(kwlist);
-  img2wgs->InstanciateTransform();
+  img2wgs->InstantiateTransform();
 
 
   // Instantiate WGS->Image transform
@@ -244,7 +244,7 @@ int otbSensorModel(int argc, char* argv[])
   wgs2img->SetInputProjectionRef("");
   wgs2img->SetOutputProjectionRef(wgsRef);
   wgs2img->SetOutputKeywordList(kwlist);
-  wgs2img->InstanciateTransform();
+  wgs2img->InstantiateTransform();
 
   // ossim classes
   ossimKeywordlist ossimKwlist;
@@ -283,7 +283,7 @@ int otbSensorModel(int argc, char* argv[])
   GeographicalDistanceType::Pointer geoDistance = GeographicalDistanceType::New();
   
   //--------------------------	
-  // Some instanciations (end)
+  // Some instantiations (end)
   //--------------------------
 	
 	
diff --git a/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx b/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx
index f3ef381..21df663 100644
--- a/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx
+++ b/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx
@@ -73,7 +73,7 @@ int otbTileImageFilterRSTransformTest(int argc, char * argv[])
     // Set-up transform
     RSTransformType::Pointer rsTransform = RSTransformType::New();
     rsTransform->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist());
-    rsTransform->InstanciateTransform();
+    rsTransform->InstantiateTransform();
     transforms.push_back(rsTransform);
 
     tileFilter->SetInput(i,reader->GetOutput());
@@ -84,7 +84,7 @@ int otbTileImageFilterRSTransformTest(int argc, char * argv[])
   // Build RS transform for tiled image
   RSTransformType::Pointer mosaicRsTransform = RSTransformType::New();
   mosaicRsTransform->SetInputKeywordList(tileFilter->GetOutput()->GetImageKeywordlist());
-  mosaicRsTransform->InstanciateTransform();
+  mosaicRsTransform->InstantiateTransform();
 
   // Check that individual RSTransform gives the same result as tiled
   // transform
diff --git a/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx b/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx
index f10aa1b..d92a197 100644
--- a/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx
+++ b/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx
@@ -48,7 +48,7 @@ int otbVectorDataTransformFilter (int itkNotUsed(argc), char * argv[])
   typedef otb::VectorDataProjectionFilter<VectorDataType,
     VectorDataType>                                   VDProjectionFilterType;
 
-  // Instanciate the image reader
+  // Instantiate the image reader
   ReaderType::Pointer      reader = ReaderType::New();
   reader->SetFileName(argv[1]);
   reader->UpdateOutputInformation();
@@ -70,10 +70,10 @@ int otbVectorDataTransformFilter (int itkNotUsed(argc), char * argv[])
 
   // Set up the transform (Apply a translation of 8 pixels in the y direction)
   TransformType::Pointer transform = TransformType::New();
-  TranslationParamType   tranlationParam;
-  tranlationParam[0] = 0;
-  tranlationParam[1] = 8. * reader->GetOutput()->GetSpacing()[1];
-  transform->SetTranslation(tranlationParam);
+  TranslationParamType   translationParam;
+  translationParam[0] = 0;
+  translationParam[1] = 8. * reader->GetOutput()->GetSpacing()[1];
+  transform->SetTranslation(translationParam);
 
   VectorDataTransformType::Pointer transformFilter = VectorDataTransformType::New();
   transformFilter->SetInput(vdproj->GetOutput());
diff --git a/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.h b/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.h
index 7b08f2f..68826b0 100644
--- a/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.h
+++ b/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.h
@@ -333,7 +333,7 @@ public:
     return bucketIndex;
   }
 
-  /** Converts a N+1-dimensional bucket index into the 1D list index useable by
+  /** Converts a N+1-dimensional bucket index into the 1D list index usable by
    GetBucket() */
   int BucketIndexToBucketListIndex(const BucketImageIndexType & bucketIndex) const
   {
diff --git a/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx b/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx
index a881287..50d39f7 100644
--- a/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx
+++ b/Modules/Filtering/Smoothing/include/otbMeanShiftSmoothingImageFilter.txx
@@ -241,7 +241,7 @@ void MeanShiftSmoothingImageFilter<TInputImage, TOutputImage, TKernel, TOutputIt
   // m_JointImage is the input data expressed in the joint spatial-range
   // domain, i.e. spatial coordinates are concatenated to the range values.
   // Moreover, pixel components in this image are normalized by their respective
-  // (spatial or range) bandwith.
+  // (spatial or range) bandwidth.
   typedef Meanshift::SpatialRangeJointDomainTransform<InputImageType, RealVectorImageType> FunctionType;
   typedef otb::UnaryFunctorWithIndexWithOutputSizeImageFilter<InputImageType, RealVectorImageType, FunctionType>
       JointImageFunctorType;
@@ -612,7 +612,7 @@ void MeanShiftSmoothingImageFilter<TInputImage, TOutputImage, TKernel, TOutputIt
     bool hasConverged = false;
 
     // get input pixel in the joint spatial-range domain (with components
-    // normalized by bandwith)
+    // normalized by bandwidth)
     const RealVector &jointPixelVal = jointIt.Get(); // Pixel in the joint spatial-range domain
     for (unsigned int comp = 0; comp < jointDimension; comp++)
       jointPixel[comp] = jointPixelVal[comp];
diff --git a/Modules/Filtering/Statistics/include/otbListSampleToBalancedListSampleFilter.txx b/Modules/Filtering/Statistics/include/otbListSampleToBalancedListSampleFilter.txx
index 3c411ab..b924b24 100644
--- a/Modules/Filtering/Statistics/include/otbListSampleToBalancedListSampleFilter.txx
+++ b/Modules/Filtering/Statistics/include/otbListSampleToBalancedListSampleFilter.txx
@@ -218,7 +218,7 @@ ListSampleToBalancedListSampleFilter<TInputSampleList, TLabelSampleList, TOutput
      // Retrieve the current label
      LabelMeasurementVectorType currentLabelMeasurement = labelIt.GetMeasurementVector();
 
-     // Build a temporary ListSample wiht the current
+     // Build a temporary ListSample with the current
      // measurement vector to generate noised versions of this
      // measurement vector
      InputSampleListPointer tempListSample = InputSampleListType::New();
diff --git a/Modules/Filtering/Statistics/include/otbListSampleToListSampleFilter.h b/Modules/Filtering/Statistics/include/otbListSampleToListSampleFilter.h
index fc2122b..180454b 100644
--- a/Modules/Filtering/Statistics/include/otbListSampleToListSampleFilter.h
+++ b/Modules/Filtering/Statistics/include/otbListSampleToListSampleFilter.h
@@ -24,7 +24,7 @@ namespace otb {
 namespace Statistics {
 
 /** \class ListSampleToListSampleFilter
- *  \brief This class is a base class for fitlers using ListSample as
+ *  \brief This class is a base class for filters using ListSample as
  *  input and returning ListSample.
  *
  *
diff --git a/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h b/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h
index f58676f..59a6cf6 100644
--- a/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h
+++ b/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h
@@ -134,7 +134,7 @@ class ITK_EXPORT NormalizeVectorImageFilter
               typename TOutputImage::PixelType > >
 {
 public:
-  /** Standart class typedefs */
+  /** Standard class typedefs */
   typedef NormalizeVectorImageFilter Self;
   typedef UnaryFunctorVectorImageFilter< TInputImage, TOutputImage,
             Functor::NormalizeVectorImageFunctor<
diff --git a/Modules/Filtering/Statistics/include/otbPatternSampler.h b/Modules/Filtering/Statistics/include/otbPatternSampler.h
index e341f1e..418bc96 100644
--- a/Modules/Filtering/Statistics/include/otbPatternSampler.h
+++ b/Modules/Filtering/Statistics/include/otbPatternSampler.h
@@ -86,7 +86,7 @@ public:
   /**
    * Method that resets the internal state of the sampler
    */
-  virtual void Reset(void);
+  void Reset(void) ITK_OVERRIDE;
 
   /**
    * Method to call during iteration, returns true if the sample is selected,
@@ -115,7 +115,7 @@ protected:
   PatternSampler();
 
   /** Destructor */
-  virtual ~PatternSampler() {}
+  ~PatternSampler() ITK_OVERRIDE {}
 
 private:
   // Not implemented
diff --git a/Modules/Filtering/Statistics/include/otbPeriodicSampler.h b/Modules/Filtering/Statistics/include/otbPeriodicSampler.h
index 64b12e1..3940bcd 100644
--- a/Modules/Filtering/Statistics/include/otbPeriodicSampler.h
+++ b/Modules/Filtering/Statistics/include/otbPeriodicSampler.h
@@ -80,7 +80,7 @@ public:
   /**
    * Method that resets the internal state of the sampler
    */
-  virtual void Reset(void);
+  void Reset(void) ITK_OVERRIDE;
   
   /**
    * Method to call during iteration, returns true if the sample is selected,
@@ -93,7 +93,7 @@ protected:
   PeriodicSampler();
    
   /** Destructor */
-  virtual ~PeriodicSampler() {}
+  ~PeriodicSampler() ITK_OVERRIDE {}
 
 private:
   // Not implemented
diff --git a/Modules/Filtering/Statistics/include/otbRandomSampler.h b/Modules/Filtering/Statistics/include/otbRandomSampler.h
index e132c6b..66c1faf 100644
--- a/Modules/Filtering/Statistics/include/otbRandomSampler.h
+++ b/Modules/Filtering/Statistics/include/otbRandomSampler.h
@@ -77,7 +77,7 @@ public:
   /**
    * Reset internal counter (to be called before starting iteration)
    */
-  virtual void Reset(void);
+  void Reset(void) ITK_OVERRIDE;
 
   /**
    * Method to call during iteration, returns true if the sample is selected,
@@ -90,7 +90,7 @@ protected:
   RandomSampler();
    
   /** Destructor */
-  virtual ~RandomSampler() {}
+  ~RandomSampler() ITK_OVERRIDE {}
 
 private:
   // Not implemented
diff --git a/Modules/Filtering/Statistics/include/otbSamplerBase.h b/Modules/Filtering/Statistics/include/otbSamplerBase.h
index c152a86..b847853 100644
--- a/Modules/Filtering/Statistics/include/otbSamplerBase.h
+++ b/Modules/Filtering/Statistics/include/otbSamplerBase.h
@@ -75,7 +75,7 @@ protected:
   SamplerBase();
    
   /** Destructor */
-  virtual ~SamplerBase() {}
+  ~SamplerBase() ITK_OVERRIDE {}
   
   /** Current count of selected elements */
   unsigned long m_ChosenElements;
diff --git a/Modules/Filtering/Statistics/include/otbStreamingHistogramVectorImageFilter.txx b/Modules/Filtering/Statistics/include/otbStreamingHistogramVectorImageFilter.txx
index bc980f6..072854b 100644
--- a/Modules/Filtering/Statistics/include/otbStreamingHistogramVectorImageFilter.txx
+++ b/Modules/Filtering/Statistics/include/otbStreamingHistogramVectorImageFilter.txx
@@ -271,14 +271,14 @@ PersistentHistogramVectorImageFilter<TInputImage>
 
     PixelType vectorValue = it.Get();
 
-       bool skipSampleNoData=false;
-       if(m_NoDataFlag)
+    bool skipSampleNoData=false;
+    if(m_NoDataFlag)
       {
       unsigned int itComp=0;
-         while( itComp < vectorValue.GetSize() )
-           {
-           if (vectorValue[itComp]==m_NoDataValue)
-                {
+      while( itComp < vectorValue.GetSize() )
+	{
+	if (vectorValue[itComp]==m_NoDataValue)
+	  {
           skipSampleNoData=true;
           itComp++;
           }
@@ -287,7 +287,7 @@ PersistentHistogramVectorImageFilter<TInputImage>
           skipSampleNoData=false;
           break;
           }
-           }
+	}
       }
 
     if( !skipSampleNoData )
diff --git a/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx b/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx
index c327cf3..e76b876 100644
--- a/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx
+++ b/Modules/Filtering/Statistics/include/otbStreamingStatisticsVectorImageFilter.txx
@@ -563,7 +563,7 @@ PersistentStreamingStatisticsVectorImageFilter<TInputImage, TPrecision>
             {
             for (unsigned int c = 0; c < threadSecondOrder.Cols(); ++c)
               {
-              threadSecondOrder(r, c) += static_cast<PrecisionType>(vectorValue[r]) * static_cast<PrecisionType>(vectorValue[c]);
+              threadSecondOrder(r, c) += vectorValue[r] * vectorValue[c];
               }
             }
           threadSecondOrderComponent += vectorValue.GetSquaredNorm();
diff --git a/Modules/Filtering/Statistics/include/otbVectorImageToIntensityImageFilter.h b/Modules/Filtering/Statistics/include/otbVectorImageToIntensityImageFilter.h
index 98fdb20..8916be7 100644
--- a/Modules/Filtering/Statistics/include/otbVectorImageToIntensityImageFilter.h
+++ b/Modules/Filtering/Statistics/include/otbVectorImageToIntensityImageFilter.h
@@ -32,7 +32,7 @@ namespace otb
  * with \f$b\f$ being the spectral band and \f$p\f$
  * the current pixel.
  *
- * Since the spectral mean deals with multi-bands image, the InputImage pixels are suposed to
+ * Since the spectral mean deals with multi-bands image, the InputImage pixels are supposed to
  * support the [] operator, and the input image to support the GetNumberOfComponentsPerPixel() method.
  *
  * \sa VectorImage
diff --git a/Modules/Filtering/Statistics/src/otbPatternSampler.cxx b/Modules/Filtering/Statistics/src/otbPatternSampler.cxx
index f02de5f..bf6a646 100644
--- a/Modules/Filtering/Statistics/src/otbPatternSampler.cxx
+++ b/Modules/Filtering/Statistics/src/otbPatternSampler.cxx
@@ -125,11 +125,6 @@ PatternSampler::ImportPatterns(const std::string &data, ParameterType &param)
 
   // split the string on slash caracters
   size_t sep1 = data.find('/');
-  size_t sep2 = std::string::npos;
-  if (sep1 != std::string::npos)
-    {
-    sep2 = data.find('/',sep1+1);
-    }
 
   // convert string into bool sequence
   for (size_t pos=0 ; pos < data.size() ; ++pos)
@@ -157,7 +152,7 @@ PatternSampler::ImportPatterns(const std::string &data, ParameterType &param)
 
   if (sep1 != std::string::npos)
     {
-    sep2 = data.find('/',sep1+1);
+    size_t sep2 = data.find('/',sep1+1);
     for (size_t pos=(sep1+1) ; pos < data.size() ; ++pos)
       {
       if (pos == sep2)
diff --git a/Modules/Filtering/Statistics/src/otbSamplerBase.cxx b/Modules/Filtering/Statistics/src/otbSamplerBase.cxx
index 45ed4ef..8d84aca 100644
--- a/Modules/Filtering/Statistics/src/otbSamplerBase.cxx
+++ b/Modules/Filtering/Statistics/src/otbSamplerBase.cxx
@@ -18,6 +18,8 @@
 
 #include "otbSamplerBase.h"
 #include "otbMath.h"
+#include "itkMath.h"
+#include <cmath>
 
 namespace otb
 {
@@ -33,14 +35,16 @@ void
 SamplerBase::SetNumberOfElements(unsigned long needed, unsigned long total)
 {
   bool modified = false;
+  unsigned long neededChecked = needed;
   if (needed > total)
     {
-    itkExceptionMacro(<< "Needed elements (" << needed << 
-      ") greater than total elements" << total << ")." << std::endl);
+    itkWarningMacro(<< "Needed elements (" << needed <<
+      ") will be clamped to total elements (" << total << ")" << std::endl);
+    neededChecked = total;
     }
-  if (m_NeededElements != needed)
+  if (m_NeededElements != neededChecked)
     {
-    m_NeededElements = needed;
+    m_NeededElements = neededChecked;
     modified = true;
     }
   if (m_TotalElements != total)
@@ -66,9 +70,22 @@ void
 SamplerBase::SetRate(double rate, unsigned long total)
 {
   bool modified = false;
-  if (m_Rate != rate)
+  double rateChecked = rate;
+  if (rate > 1.0)
     {
-    m_Rate = rate;
+    itkWarningMacro(<< "Rate (" << rate <<
+      ") will be clamped to 1.0" << std::endl);
+    rateChecked = 1.0;
+    }
+  if (rate < 0.0)
+    {
+    itkWarningMacro(<< "Rate (" << rate <<
+      ") will be clamped to 0.0" << std::endl);
+    rateChecked = 0.0;
+    }
+  if (std::fabs(m_Rate-rateChecked) > 1e-12)
+    {
+    m_Rate = rateChecked;
     modified = true;
     }
   if (m_TotalElements != total)
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbCorrectPolygonFunctor.h b/Modules/Filtering/VectorDataManipulation/include/otbCorrectPolygonFunctor.h
index 4a00137..8334a1a 100644
--- a/Modules/Filtering/VectorDataManipulation/include/otbCorrectPolygonFunctor.h
+++ b/Modules/Filtering/VectorDataManipulation/include/otbCorrectPolygonFunctor.h
@@ -27,7 +27,7 @@ namespace otb
 /** \class CorrectPolygonFunctor
 *    \brief This filter simplify and close the input polygon, making the last point equal to the first one.
 *
-* This filter may be useful when a truely closed polygon is needed (to draw it for example)
+* This filter may be useful when a truly closed polygon is needed (to draw it for example)
 *
 * \sa UnaryFunctorObjectListFilter
 *
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.txx b/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.txx
index 6fa0c37..5980184 100644
--- a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.txx
+++ b/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.txx
@@ -145,7 +145,7 @@ typename RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCo
     ++it2;
     }
 
-  // in FEATURE_POLYGON case, first point appears twice (fisrt vertex and last vertew, thus we create a line of 1 point...)
+  // in FEATURE_POLYGON case, first point appears twice (first vertex and last vertew, thus we create a line of 1 point...)
   if (node.GetNodeType() == FEATURE_POLYGON)
     {
     splitedLineIdCentral.pop_back();
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbSimplifyPathFunctor.h b/Modules/Filtering/VectorDataManipulation/include/otbSimplifyPathFunctor.h
index c60ede2..4c73893 100644
--- a/Modules/Filtering/VectorDataManipulation/include/otbSimplifyPathFunctor.h
+++ b/Modules/Filtering/VectorDataManipulation/include/otbSimplifyPathFunctor.h
@@ -35,7 +35,7 @@ namespace otb
 *  vertices between them, the euclidean distance to this line is computed. If for one vertex, this distance
 *  is upper than the tolerance threshold, the path is considered to be inconsistent and no vertices can be removed.
 *
-*  If the path is considered consistent (which will occure at least with a 2 vertices path),
+*  If the path is considered consistent (which will occur at least with a 2 vertices path),
 * only the beginning and ending
 *  vertices are kept and a new search iteration begin at its end.
 *
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.txx b/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.txx
index 889fe99..6bb8570 100644
--- a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.txx
+++ b/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.txx
@@ -137,7 +137,7 @@ typename SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::Ou
     ++it2;
     }
 
-  // in FEATURE_POLYGON case, first point appears twice (fisrt vertex and last vertew, thus we create a line of 1 point...)
+  // in FEATURE_POLYGON case, first point appears twice (first vertex and last vertew, thus we create a line of 1 point...)
   if (node.GetNodeType() == FEATURE_POLYGON)
     {
     splitedLineIdCentral.pop_back();
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.h b/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.h
index 2312ab8..1bf607e 100644
--- a/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.h
+++ b/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.h
@@ -81,7 +81,7 @@ public:
   typedef typename PolygonType::VertexListType    VertexListType;
   typedef typename PolygonType::VertexListPointer VertexListPointer;
 
-  /** TODO : automatize the dimension of the region*/
+  /** TODO : automate the dimension of the region*/
   typedef otb::RemoteSensingRegion<typename VertexType::CoordRepType> RegionType;
   typedef typename  RegionType::IndexType                             IndexType;
   typedef typename  RegionType::SizeType                              SizeType;
@@ -135,7 +135,7 @@ private:
   void operator =(const Self&); //purposely not implemented
 
   int CounterClockWise(PointType firstPoint, PointType secondPoint, PointType thirdPoint);
-  bool IsSegementIntersectSegment(LinePointerType segmentLineAB, LinePointerType segmentLineCD);
+  bool IsSegmentIntersectSegment(LinePointerType segmentLineAB, LinePointerType segmentLineCD);
 
   bool        m_ProjectionNeeded;
   RegionType  m_ROI;
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.txx b/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.txx
index c37a0c2..3fdf32c 100644
--- a/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.txx
+++ b/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.txx
@@ -249,7 +249,7 @@ VectorDataExtractROI<TVectorData>
 {
   // Get the VertexList
   // -2 cause we don't want the last point
-  // wich is the same as the first one (closed Ring)
+  // which is the same as the first one (closed Ring)
   for (unsigned int i = 0; i<polygon->GetVertexList()->Size() - 2; ++i )
     {
     // Get the components of the polygon 2 by 2
@@ -343,7 +343,7 @@ VectorDataExtractROI<TVectorData>
 template <class TVectorData>
 bool
 VectorDataExtractROI<TVectorData>
-::IsSegementIntersectSegment(LinePointerType segmentLineAB, LinePointerType segmentLineCD)
+::IsSegmentIntersectSegment(LinePointerType segmentLineAB, LinePointerType segmentLineCD)
 {
 
   PointType vertexA, vertexB, vertexC, vertexD;
@@ -456,7 +456,7 @@ VectorDataExtractROI<TVectorData>
   genericTransform->SetOutputDictionary(inputDict);
   genericTransform->SetOutputOrigin(this->GetInput()->GetOrigin());
   genericTransform->SetOutputSpacing(this->GetInput()->GetSpacing());
-  genericTransform->InstanciateTransform();
+  genericTransform->InstantiateTransform();
 
   otbMsgDevMacro(<< genericTransform);
 
diff --git a/Modules/Filtering/VectorDataManipulation/test/otbConcatenateVectorDataFilter.cxx b/Modules/Filtering/VectorDataManipulation/test/otbConcatenateVectorDataFilter.cxx
index 5f1d93e..dc31c0d 100644
--- a/Modules/Filtering/VectorDataManipulation/test/otbConcatenateVectorDataFilter.cxx
+++ b/Modules/Filtering/VectorDataManipulation/test/otbConcatenateVectorDataFilter.cxx
@@ -52,7 +52,7 @@ int otbConcatenateVectorDataFilter (int argc, char * argv[])
   // Get number of input vectorDatas
   unsigned int nbInputs = parseResult->GetNumberOfParameters("--InputVectorDatas");
 
-  // Instanciate a concatenate filter
+  // Instantiate a concatenate filter
     // Concatenate the vector datas
   ConcatenateFilterType::Pointer concatenate = ConcatenateFilterType::New();
 
diff --git a/Modules/Filtering/VectorDataRendering/include/otbVectorDataToMapFilter.h b/Modules/Filtering/VectorDataRendering/include/otbVectorDataToMapFilter.h
index aba35b0..b735d4c 100644
--- a/Modules/Filtering/VectorDataRendering/include/otbVectorDataToMapFilter.h
+++ b/Modules/Filtering/VectorDataRendering/include/otbVectorDataToMapFilter.h
@@ -53,7 +53,7 @@ namespace otb
    * The OSM style type provides styles to render a vector data the
    * OSM way. These styles must be specified usind the method
    * "AddStyle()".
-   * The Binary style type provides automaticaly a set of styles to
+   * The Binary style type provides automatically a set of styles to
    * render a vectro data as a binary mask (foreground pixel value
    * 255, background pixel value 0).
    *
diff --git a/Modules/Filtering/VectorDataRendering/test/otbVectorDataToMapFilterWorld.cxx b/Modules/Filtering/VectorDataRendering/test/otbVectorDataToMapFilterWorld.cxx
index bc59935..58acf42 100644
--- a/Modules/Filtering/VectorDataRendering/test/otbVectorDataToMapFilterWorld.cxx
+++ b/Modules/Filtering/VectorDataRendering/test/otbVectorDataToMapFilterWorld.cxx
@@ -49,15 +49,21 @@ int otbVectorDataToMapFilterWorld(int argc, char * argv [])
   //Reproject the vector data in the proper projection
   typedef otb::VectorDataProjectionFilter<VectorDataType, VectorDataType> ProjectionFilterType;
 
+  std::string outputProjRef("GEOGCS[\"GCS_WGS_1984\", DATUM[\"D_WGS_1984\", "
+    "SPHEROID[\"WGS_1984\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0],"
+    " UNIT[\"Degree\", 0.017453292519943295]]");
+
   VectorDataFileReaderType::Pointer reader0 = VectorDataFileReaderType::New();
   reader0->SetFileName(argv[1]);
   ProjectionFilterType::Pointer projection0 = ProjectionFilterType::New();
   projection0->SetInput(reader0->GetOutput());
+  projection0->SetOutputProjectionRef(outputProjRef);
 
   VectorDataFileReaderType::Pointer reader1 = VectorDataFileReaderType::New();
   reader1->SetFileName(argv[2]);
   ProjectionFilterType::Pointer projection1 = ProjectionFilterType::New();
   projection1->SetInput(reader1->GetOutput());
+  projection1->SetOutputProjectionRef(outputProjRef);
 
   //Convert the vector data into an image
   typedef itk::RGBAPixel<unsigned char> PixelType;
diff --git a/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h b/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h
index 095afc9..9304207 100644
--- a/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h
+++ b/Modules/Filtering/Wavelet/include/otbSubsampleImageFilter.h
@@ -24,7 +24,7 @@
 #include "itkImageToImageFilter.h"
 #include "itkImage.h"
 
-//Just to get the forwad/inverse definitions
+//Just to get the forward/inverse definitions
 #include "otbWaveletOperatorBase.h"
 
 namespace otb {
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h
index 3a579fd..0089018 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h
+++ b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.h
@@ -68,7 +68,7 @@ namespace otb {
  *
  * And conversely in the inverse transformation.
  *
- * \todo: At present version, there is not consideration on meta data information that can be transmited
+ * \todo: At present version, there is not consideration on meta data information that can be transmitted
  * from the input(s) to the output(s)...
  *
  * The two choice (Wavelet::FORWARD/Wavelet::INVERSE) yield specific implementation of the templates (header redeclaration
@@ -144,7 +144,7 @@ private:
  *
  * And conversely in the inverse transformation.
  *
- * \todo: At present version, there is not consideration on meta data information that can be transmited
+ * \todo: At present version, there is not consideration on meta data information that can be transmitted
  * from the input(s) to the output(s)...
  *
  * \sa WaveletOperator
@@ -329,7 +329,7 @@ private:
  *
  * And conversely in the inverse transformation.
  *
- * \todo: At present version, there is not consideration on meta data information that can be transmited
+ * \todo: At present version, there is not consideration on meta data information that can be transmitted
  * from the input(s) to the output(s)...
  *
  * \sa WaveletOperator
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx
index c0cb161..7753842 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx
+++ b/Modules/Filtering/Wavelet/include/otbWaveletFilterBank.txx
@@ -133,6 +133,8 @@ void
 WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
 ::BeforeThreadedGenerateData()
 {
+
+  unsigned int one = 1;
   if (m_SubsampleImageFactor > 1)
     {
     // Check the dimension
@@ -157,7 +159,7 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
       for (unsigned int i = 0; i < m_InternalImages.size(); ++i)
         {
         // the size is linked to the SubsampleImageFactor that is assume to be 2!!!
-        m_InternalImages[InputImageDimension - 2 - i].resize(1 << (i + 1));
+        m_InternalImages[InputImageDimension - 2 - i].resize( one << (i + 1));
         }
 
       OutputImageRegionType intermediateRegion;
@@ -378,7 +380,7 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::FORWARD>
     {
     std::ostringstream msg;
     msg << "Output number 1<<" << dir << " = " << (1 << dir) << " not allocated\n";
-    msg << "Number of excpected outputs " << this->GetNumberOfOutputs() << "\n";
+    msg << "Number of expected outputs " << this->GetNumberOfOutputs() << "\n";
     throw itk::ExceptionObject(__FILE__, __LINE__, msg.str().c_str(), ITK_LOCATION);
     }
 
@@ -708,6 +710,7 @@ void
 WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::INVERSE>
 ::BeforeThreadedGenerateData()
 {
+  unsigned int one = 1;
   if (InputImageDimension > 1)
     {
     // Internal images will be used only if m_SubsampleImageFactor != 1
@@ -715,7 +718,7 @@ WaveletFilterBank<TInputImage, TOutputImage, TWaveletOperator, Wavelet::INVERSE>
     for (unsigned int i = 0; i < m_InternalImages.size(); ++i)
       {
       // the size is linked to the SubsampleImageFactor that is assume to be 2!!!
-      m_InternalImages[i].resize(1 << (i + 1));
+      m_InternalImages[i].resize( one << (i + 1));
       }
 
     OutputImageRegionType intermediateRegion;
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletGenerator.h b/Modules/Filtering/Wavelet/include/otbWaveletGenerator.h
index 0ff5365..5cda731 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletGenerator.h
+++ b/Modules/Filtering/Wavelet/include/otbWaveletGenerator.h
@@ -47,7 +47,7 @@ enum Wavelet {
 /** \class WaveletGenerator
  * \brief Wavelet coefficient definition
  *
- * The wavelet coefficent definitions mainly come from
+ * The wavelet coefficient definitions mainly come from
  * "Ten Lecture on Wavelets", of Ingrid Daubechies,
  * Society for Industrial and Applied Mathematics, 1992.
  *
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletOperator.h b/Modules/Filtering/Wavelet/include/otbWaveletOperator.h
index 031b8d6..749e1eb 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletOperator.h
+++ b/Modules/Filtering/Wavelet/include/otbWaveletOperator.h
@@ -70,7 +70,7 @@ public:
 
 private:
   /**
-   * This class may not be instanciated
+   * This class may not be instantiated
    * Intentionally not implemented
    */
   WaveletOperator ();
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletPacketDecompositionCosts.h b/Modules/Filtering/Wavelet/include/otbWaveletPacketDecompositionCosts.h
index 3c5e95b..4d3e8f8 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletPacketDecompositionCosts.h
+++ b/Modules/Filtering/Wavelet/include/otbWaveletPacketDecompositionCosts.h
@@ -56,7 +56,7 @@ public:
 
   typedef TImage ImageType;
 
-  /** Acces to the data */
+  /** Access to the data */
   static unsigned int NumberOfAllowedDecompositions;
 
   /** Evaluate the cost */
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.h b/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.h
index 7538040..60927d5 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.h
+++ b/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.h
@@ -40,7 +40,7 @@ namespace otb {
  *
  * It yields a list of images on the Wavelet::FORWARD decomposition. Conversely,
  * it takes an image list but yield a single list on the Wavelet::INVERSE transformation.
- * Hence, the Forward vs Inverse transformation has been splitted into two classes
+ * Hence, the Forward vs Inverse transformation has been split into two classes
  * (templated with otb::Wavelet::FORWARD and otb::Wavelet::INVERSE). The Forward class comes from
  * ImageToImageListFilter while the latter comes from a
  * ImageListToImageFilter. Thse two classes have specific declaration
@@ -94,7 +94,7 @@ private:
  *
  * It yields a list of images on the Wavelet::FORWARD decomposition. Conversely,
  * it takes an image list but yield a single list on the Wavelet::INVERSE transformation.
- * Hence, the Forward vs Inverse transformation has been splitted into two classes
+ * Hence, the Forward vs Inverse transformation has been split into two classes
  * (templated with otb::Wavelet::FORWARD and otb::Wavelet::INVERSE). The Forward class comes from
  * ImageToImageListFilter while the latter comes from a
  * ImageListToImageFilter. Thse two classes have specific declaration
@@ -226,7 +226,7 @@ private:
  *
  * It yields a list of images on the Wavelet::FORWARD decomposition. Conversely,
  * it takes an image list but yield a single list on the Wavelet::INVERSE transformation.
- * Hence, the Forward vs Inverse transformation has been splitted into two classes
+ * Hence, the Forward vs Inverse transformation has been split into two classes
  * (templated with otb::Wavelet::FORWARD and otb::Wavelet::INVERSE). The Forward class comes from
  * ImageToImageListFilter while the latter comes from a
  * ImageListToImageFilter. Thse two classes have specific declaration
@@ -234,7 +234,7 @@ private:
  *
  * This is the specific declaration of the Inverse transformation.
  *
- * In this specialization, the Cost template class is not usefull and then
+ * In this specialization, the Cost template class is not useful and then
  * declared to as FullyDecomposedWaveletPacketCost.
  *
  * \sa FullyDecomposedWaveletPacketCost
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.txx b/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.txx
index be8c8be..0fc17d0 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.txx
+++ b/Modules/Filtering/Wavelet/include/otbWaveletPacketTransform.txx
@@ -72,7 +72,7 @@ WaveletPacketTransform<TInputImage, TOutputImage, TFilter, Wavelet::FORWARD, TCo
   itk::ProgressAccumulator * progress)
 {
   // We cannot know in advance the nomber of filters in this mini-pipeline
-  // So we decrease the weigth of each filter in order to tend to 1... slowly...
+  // So we decrease the weight of each filter in order to tend to 1... slowly...
   static float accumulatorWeight = 1.;
 
   if (this->GetCost()->Evaluate(depth, outputPtr))
diff --git a/Modules/Filtering/Wavelet/src/otbWaveletGenerator.cxx b/Modules/Filtering/Wavelet/src/otbWaveletGenerator.cxx
index c2f4c74..ed3c8bd 100644
--- a/Modules/Filtering/Wavelet/src/otbWaveletGenerator.cxx
+++ b/Modules/Filtering/Wavelet/src/otbWaveletGenerator.cxx
@@ -27,7 +27,7 @@
 namespace otb {
 
 /**
- * Standart (useless) definition for unknown wavelet
+ * Standard (useless) definition for unknown wavelet
  */
 template <Wavelet::Wavelet TMotherWaveletOperator>
 const char *
diff --git a/Modules/Filtering/Wavelet/test/otbWaveletTransform.cxx b/Modules/Filtering/Wavelet/test/otbWaveletTransform.cxx
index 4774374..28f6949 100644
--- a/Modules/Filtering/Wavelet/test/otbWaveletTransform.cxx
+++ b/Modules/Filtering/Wavelet/test/otbWaveletTransform.cxx
@@ -44,6 +44,7 @@ int otbWaveletTransform_generic(int argc, char * argv[])
        itk::MultiThreader::SetGlobalDefaultNumberOfThreads(NbOfThreads);
   }
 
+
   const int Dimension = 2;
   typedef double                           PixelType;
   typedef otb::Image<PixelType, Dimension> ImageType;
diff --git a/Modules/Fusion/Fuzzy/include/otbFuzzyDescriptorsModelManager.h b/Modules/Fusion/Fuzzy/include/otbFuzzyDescriptorsModelManager.h
index 76a6950..b8ffa44 100644
--- a/Modules/Fusion/Fuzzy/include/otbFuzzyDescriptorsModelManager.h
+++ b/Modules/Fusion/Fuzzy/include/otbFuzzyDescriptorsModelManager.h
@@ -30,7 +30,7 @@ namespace otb {
  *
  * To get a specific statistic Measurement vector, use the method
  * GetStatisticVectorByName(name) which allow you to get the
- * Measurement vector for the statistic set as paramater.
+ * Measurement vector for the statistic set as parameter.
  *
  *
  *
diff --git a/Modules/Fusion/Fuzzy/src/otbFuzzyDescriptorsModelManager.cxx b/Modules/Fusion/Fuzzy/src/otbFuzzyDescriptorsModelManager.cxx
index 692e3b1..f793b49 100644
--- a/Modules/Fusion/Fuzzy/src/otbFuzzyDescriptorsModelManager.cxx
+++ b/Modules/Fusion/Fuzzy/src/otbFuzzyDescriptorsModelManager.cxx
@@ -143,7 +143,7 @@ FuzzyDescriptorsModelManager
           param.push_back(value);
         }
 
-      // Add descriptor parmaeters
+      // Add descriptor parameters
       currentDescriptor.second = param;
 
       // Add the pai to the model
diff --git a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h
index f7ce6b8..009462a 100644
--- a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h
+++ b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h
@@ -149,6 +149,10 @@ public:
   //Creates a SetKeepOriginalLabelBool method
   itkSetMacro(KeepOriginalLabelBool, bool);
 
+  //Process only isolated pixels
+  itkSetMacro(OnlyIsolatedPixels, bool);
+  itkSetMacro(IsolatedThreshold, unsigned int);
+
 
 protected:
   NeighborhoodMajorityVotingImageFilter();
@@ -166,6 +170,31 @@ protected:
 
   void GenerateOutputInformation() ITK_OVERRIDE;
 
+
+  //Type to store the useful information from the label histogram  
+  struct HistoSummary
+  {
+    unsigned int freqCenterLabel;
+    PixelType majorityLabel;
+    bool majorityUnique;
+  };
+
+  struct CompareHistoFequencies
+  {
+    typedef std::pair<PixelType, unsigned int> HistoValueType;
+    bool operator()(const HistoValueType& a, const HistoValueType& b)
+    {
+      return a.second > b.second;
+    }
+  };
+
+  //Get a histogram of frequencies of labels with the 2 highest
+  // frequencies sorted in decreasing order and return the frequency
+  // of the label of the center pixel
+  const HistoSummary ComputeNeighborhoodHistogramSummary(const NeighborhoodIteratorType &nit,
+                                                         const KernelIteratorType kernelBegin,
+                                                         const KernelIteratorType kernelEnd) const;
+
 private:
   NeighborhoodMajorityVotingImageFilter(const Self&); //purposely not implemented
   void operator=(const Self&); //purposely not implemented
@@ -177,6 +206,12 @@ private:
   PixelType m_LabelForUndecidedPixels;
   bool m_KeepOriginalLabelBool;
 
+  //Choose to filter only isolated pixels
+  bool m_OnlyIsolatedPixels;
+  //The center pixel is isolated if there are fewer neighbours than
+  //this threshold with the same label
+  unsigned int m_IsolatedThreshold;
+
 }; // end of class
 
 } // end namespace otb
diff --git a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx
index 5fab37c..9c4de26 100644
--- a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx
+++ b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx
@@ -38,87 +38,93 @@ NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage, TKernel>::Neigh
   this->SetLabelForNoDataPixels(itk::NumericTraits<PixelType>::NonpositiveMin()); //m_LabelForNoDataPixels = 0
   this->SetLabelForUndecidedPixels(itk::NumericTraits<PixelType>::NonpositiveMin()); //m_LabelForUndecidedPixels = 0
   this->SetKeepOriginalLabelBool(true); //m_KeepOriginalLabelBool = true
+  this->SetOnlyIsolatedPixels(false); //process all pixels 
+  this->SetIsolatedThreshold(1);
 }
 
 
 template<class TInputImage, class TOutputImage, class TKernel>
 typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage,
-TKernel>::PixelType NeighborhoodMajorityVotingImageFilter<TInputImage,
-TOutputImage, TKernel>::Evaluate(const NeighborhoodIteratorType &nit,
-const KernelIteratorType kernelBegin,
-const KernelIteratorType kernelEnd)
+                                               TKernel>::PixelType 
+NeighborhoodMajorityVotingImageFilter<TInputImage, 
+                                      TOutputImage, TKernel>::Evaluate(const NeighborhoodIteratorType &nit,
+                                                                       const KernelIteratorType kernelBegin,
+                                                                       const KernelIteratorType kernelEnd) 
 {
-  PixelType majorityLabel = 0; //Value of the more representative pixels in the neighborhood
-  unsigned int majorityFreq = 0; //Number of pixels with the more representative value (majorityLabel) in the neighborhood
-
-  unsigned int i;
-  KernelIteratorType kernel_it;
-
-  std::map<PixelType, unsigned int> histoNeigh;
-
-  PixelType centerPixel = nit.GetCenterPixel();
-
-  if (centerPixel != m_LabelForNoDataPixels)
-  {
-    for (i = 0, kernel_it = kernelBegin; kernel_it < kernelEnd; ++kernel_it, ++i)
+  const PixelType centerPixel = nit.GetCenterPixel();
+  if (centerPixel == m_LabelForNoDataPixels)
     {
-      // if structuring element is positive, use the pixel under that element
-      // in the image
-
-      PixelType label = nit.GetPixel(i);
-      if ((*kernel_it > itk::NumericTraits<KernelPixelType>::Zero) && (label != m_LabelForNoDataPixels))
+    return m_LabelForNoDataPixels;
+    }
+  else
+    {
+    //Get a histogram of label frequencies where the 2 highest are at the beginning and sorted
+    const HistoSummary histoSummary = 
+      this->ComputeNeighborhoodHistogramSummary(nit, kernelBegin, kernelEnd);
+    if(m_OnlyIsolatedPixels && 
+       histoSummary.freqCenterLabel > m_IsolatedThreshold)
       {
-        // note we use GetPixel() on the SmartNeighborhoodIterator to
-        // respect boundary conditions
-
-        //If the current label has already been added to the histogram histoNeigh
-        if (histoNeigh.count(label) > 0)
+      //If we want to filter only isolated pixels, keep the label if
+      //there are enough pixels with the center label to consider that
+      //it is not isolated
+      return centerPixel;
+      }
+    else
+      {
+      //If the majorityLabel is NOT unique in the neighborhood
+      if(!histoSummary.majorityUnique)
         {
-          histoNeigh[label]++;
-        }
+        if (m_KeepOriginalLabelBool == true)
+          {
+          return centerPixel;
+          }
         else
-        {
-          histoNeigh[label] = 1;
+          {
+          return m_LabelForUndecidedPixels;
+          }
         }
+      //Extraction of the more representative Label in the neighborhood (majorityLabel)
+      return histoSummary.majorityLabel;
       }
-    }
-
-    //Extraction of the more representative Label in the neighborhood (majorityLabel) and its Frequency (majorityFreq)
-    typename std::map<PixelType, unsigned int>::iterator histoIt;
-    for (histoIt = histoNeigh.begin(); histoIt != histoNeigh.end(); ++histoIt)
-    {
-      if (histoIt->second > majorityFreq)
-      {
-        majorityFreq = histoIt->second; //Frequency
-        majorityLabel = histoIt->first; //Label
-      }
-    }
+    }//END if (centerPixel != m_LabelForNoDataPixels)
+}
 
-    //If the majorityLabel is NOT unique in the neighborhood
-    for (histoIt = histoNeigh.begin(); histoIt != histoNeigh.end(); ++histoIt)
+template<class TInputImage, class TOutputImage, class TKernel>
+const typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage,
+                                                     TKernel>::HistoSummary 
+NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage, 
+                                      TKernel>::ComputeNeighborhoodHistogramSummary(const NeighborhoodIteratorType &nit,
+                                                                          const KernelIteratorType kernelBegin,
+                                                                          const KernelIteratorType kernelEnd) const
+{  
+  typedef std::map<PixelType, unsigned int> HistogramType;
+  typedef std::vector<std::pair<PixelType, unsigned int> > HistoAsVectorType;
+  HistogramType histoNeigh;
+  unsigned int i = 0; 
+  for (KernelIteratorType kernel_it = kernelBegin; 
+       kernel_it < kernelEnd; ++kernel_it, ++i)
     {
-      if ( (histoIt->second == majorityFreq) && (histoIt->first != majorityLabel) )
+    // if structuring element is positive, use the pixel under that element
+    // in the image
+    // note we use GetPixel() on the SmartNeighborhoodIterator to
+    // respect boundary conditions
+    const PixelType label = nit.GetPixel(i);
+    if ((*kernel_it > itk::NumericTraits<KernelPixelType>::Zero) && 
+        (label != m_LabelForNoDataPixels))
       {
-         if (m_KeepOriginalLabelBool == true)
-         {
-           majorityLabel = centerPixel;
-         }
-         else
-         {
-           majorityLabel = m_LabelForUndecidedPixels;
-         }
-         break;
+      histoNeigh[label] += 1;
       }
     }
-  }//END if (centerPixel != m_LabelForNoDataPixels)
-
-  //If (centerPixel == m_LabelForNoDataPixels)
-  else
-  {
-    majorityLabel = m_LabelForNoDataPixels;
-  }
-
-  return majorityLabel;
+  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);
+  return result;
 }
 
 template<class TInputImage, class TOutputImage, class TKernel>
diff --git a/Modules/Fusion/MajorityVoting/test/CMakeLists.txt b/Modules/Fusion/MajorityVoting/test/CMakeLists.txt
index a32c766..3a04d11 100644
--- a/Modules/Fusion/MajorityVoting/test/CMakeLists.txt
+++ b/Modules/Fusion/MajorityVoting/test/CMakeLists.txt
@@ -27,6 +27,11 @@ otb_add_test(NAME leTvNeighborhoodMajorityVotingImageFilterTest COMMAND otbMajor
   5 #yRadius
   10 #LabelForNoDataPixels
   7 #LabelForUndecidedPixels
+  0 #OnlyIsolatedPixels
+  )
+
+otb_add_test(NAME leTvNeighborhoodMajorityVotingIsolThresPixTest COMMAND otbMajorityVotingTestDriver
+  otbNeighborhoodMajorityVotingImageFilterIsolatedTest
   )
 
 otb_add_test(NAME leTvSVMImageClassificationFilterWithNeighborhoodMajorityVoting COMMAND otbMajorityVotingTestDriver
@@ -34,9 +39,7 @@ otb_add_test(NAME leTvSVMImageClassificationFilterWithNeighborhoodMajorityVoting
   ${BASELINE}/leSVMImageClassificationWithNMVFilterOutput.tif
   ${TEMP}/leSVMImageClassificationWithNMVFilterOutput.tif
   otbNeighborhoodMajorityVotingImageFilterTest
-  ${TEMP}/leSVMImageClassificationFilterOutput.tif
+  ${BASELINE}/leSVMImageClassificationFilterOutput.tif
   ${TEMP}/leSVMImageClassificationWithNMVFilterOutput.tif
   false
   )
-set_property(TEST leTvSVMImageClassificationFilterWithNeighborhoodMajorityVoting PROPERTY DEPENDS leTvSVMImageClassificationFilter)
-
diff --git a/Modules/Fusion/MajorityVoting/test/otbMajorityVotingTestDriver.cxx b/Modules/Fusion/MajorityVoting/test/otbMajorityVotingTestDriver.cxx
index 3a961ec..a3a3809 100644
--- a/Modules/Fusion/MajorityVoting/test/otbMajorityVotingTestDriver.cxx
+++ b/Modules/Fusion/MajorityVoting/test/otbMajorityVotingTestDriver.cxx
@@ -3,4 +3,5 @@ void RegisterTests()
 {
   REGISTER_TEST(otbNeighborhoodMajorityVotingImageFilterNew);
   REGISTER_TEST(otbNeighborhoodMajorityVotingImageFilterTest);
+  REGISTER_TEST(otbNeighborhoodMajorityVotingImageFilterIsolatedTest);
 }
diff --git a/Modules/Fusion/MajorityVoting/test/otbNeighborhoodMajorityVotingImageFilterTest.cxx b/Modules/Fusion/MajorityVoting/test/otbNeighborhoodMajorityVotingImageFilterTest.cxx
index b6a0e1e..9a9de69 100644
--- a/Modules/Fusion/MajorityVoting/test/otbNeighborhoodMajorityVotingImageFilterTest.cxx
+++ b/Modules/Fusion/MajorityVoting/test/otbNeighborhoodMajorityVotingImageFilterTest.cxx
@@ -100,6 +100,11 @@ int otbNeighborhoodMajorityVotingImageFilterTest(int argc, char* argv[])
   seBall.CreateStructuringElement();
   NeighMajVotingFilter->SetKernel(seBall);
 
+  if(argc==9)
+    {
+    NeighMajVotingFilter->SetOnlyIsolatedPixels(static_cast<bool>(atoi(argv[8])));
+    }
+
   WriterType::Pointer writer = WriterType::New();
   writer->SetFileName(outputFileName);
   writer->SetInput(NeighMajVotingFilter->GetOutput());
@@ -107,3 +112,96 @@ int otbNeighborhoodMajorityVotingImageFilterTest(int argc, char* argv[])
 
   return EXIT_SUCCESS;
 }
+
+int otbNeighborhoodMajorityVotingImageFilterIsolatedTest(int itkNotUsed(argc), char* itkNotUsed(argv)[])
+{
+  typedef unsigned char PixelType; // 8 bits
+  const unsigned int Dimension = 2;
+
+  typedef otb::Image<PixelType, Dimension> ImageType;
+
+  ImageType::Pointer image = ImageType::New();
+  ImageType::IndexType start;
+
+  start[0] =   0;
+  start[1] =   0;
+
+  ImageType::SizeType size;
+  size[0]  = 100;
+  size[1]  = 100;
+
+  ImageType::RegionType region;
+
+  region.SetSize(size);
+  region.SetIndex(start);
+  image->SetRegions(region);
+  image->Allocate();
+  image->FillBuffer(itk::NumericTraits<PixelType>::Zero);
+
+  // Neighborhood majority voting filter type
+  typedef otb::NeighborhoodMajorityVotingImageFilter<ImageType> NeighborhoodMajorityVotingFilterType;
+
+  // Binary ball Structuring Element type
+  typedef NeighborhoodMajorityVotingFilterType::KernelType StructuringType;
+  typedef StructuringType::RadiusType RadiusType;
+
+
+  // Neighborhood majority voting filter
+  NeighborhoodMajorityVotingFilterType::Pointer NeighMajVotingFilter;
+  NeighMajVotingFilter = NeighborhoodMajorityVotingFilterType::New();
+
+  NeighMajVotingFilter->SetInput(image);
+
+  StructuringType seBall;
+  RadiusType rad;
+
+
+  NeighMajVotingFilter->SetKeepOriginalLabelBool(true);
+    
+  rad[0] = 1;
+  rad[1] = 1;
+  NeighMajVotingFilter->SetLabelForNoDataPixels(10);
+  NeighMajVotingFilter->SetLabelForUndecidedPixels(7);
+  seBall.SetRadius(rad);
+  seBall.CreateStructuringElement();
+  NeighMajVotingFilter->SetKernel(seBall);
+  NeighMajVotingFilter->SetOnlyIsolatedPixels(true);
+  PixelType value = 255;
+  ImageType::IndexType coordinate;
+  coordinate[0] = 10;
+  coordinate[1] = 10;
+  image->SetPixel(coordinate, value);
+  image->Update();
+  NeighMajVotingFilter->SetIsolatedThreshold(1);
+  NeighMajVotingFilter->Update();
+  PixelType result = NeighMajVotingFilter->GetOutput()->GetPixel(coordinate);
+//Should be filtered
+  if(result == value)
+    {
+    std::cout << "one pixel\n";
+    return EXIT_FAILURE;
+    }
+  coordinate[0] = 10;
+  coordinate[1] = 11;
+  image->SetPixel(coordinate, value);
+  image->Update();
+  NeighMajVotingFilter->Modified(); //needed for the filter to be updated
+  NeighMajVotingFilter->Update();
+  result = NeighMajVotingFilter->GetOutput()->GetPixel(coordinate);
+  // Should not be filtered
+  if( result != value)
+    {
+    std::cout << "2 pixels thres = 1 result = " << int(result) << '\n';
+    return EXIT_FAILURE;
+    }
+  NeighMajVotingFilter->SetIsolatedThreshold(3);
+  NeighMajVotingFilter->Update();
+  result = NeighMajVotingFilter->GetOutput()->GetPixel(coordinate);
+//Should be filtered
+  if(result == value)
+    {
+    std::cout << "2 pixels thres = 2" << '\n';
+    return EXIT_FAILURE;
+    }
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Hyperspectral/Unmixing/include/otbISRAUnmixingImageFilter.h b/Modules/Hyperspectral/Unmixing/include/otbISRAUnmixingImageFilter.h
index b44458c..e522f06 100644
--- a/Modules/Hyperspectral/Unmixing/include/otbISRAUnmixingImageFilter.h
+++ b/Modules/Hyperspectral/Unmixing/include/otbISRAUnmixingImageFilter.h
@@ -95,7 +95,7 @@ private:
  *
  * This filter takes as input a multiband image and a matrix.
  * If the matrix is called \f$A\f$, it solves, for each pixel \f$p\f$, the system
- * \f$A \cdot x = p\f$ in the least square sense, with additionnal constraints on the solution
+ * \f$A \cdot x = p\f$ in the least square sense, with additional constraints on the solution
  * \f$\hat{x}\f$ ensuring positivity (each component is positive) and additivity (the sum of
  * all components is 1).
  *
diff --git a/Modules/Hyperspectral/Unmixing/include/otbMDMDNMFImageFilter.txx b/Modules/Hyperspectral/Unmixing/include/otbMDMDNMFImageFilter.txx
index 0bd9cd8..f1b836d 100644
--- a/Modules/Hyperspectral/Unmixing/include/otbMDMDNMFImageFilter.txx
+++ b/Modules/Hyperspectral/Unmixing/include/otbMDMDNMFImageFilter.txx
@@ -538,7 +538,7 @@ MDMDNMFImageFilter<TInputImage, TOutputImage>
 
   //---   Putting the rows of in the bands of the output vector image   ---//
   //TODO
-  // Could be impoved choosing an imageList for the abundance maps
+  // Could be improved choosing an imageList for the abundance maps
   // and a vector list for the endmember spectra (columns of A).
 
   itk::ImageRegionIterator<OutputImageType> outputIt(outputPtr, outputPtr->GetRequestedRegion());
diff --git a/Modules/Hyperspectral/Unmixing/include/otbNCLSUnmixingImageFilter.h b/Modules/Hyperspectral/Unmixing/include/otbNCLSUnmixingImageFilter.h
index 563b0ab..6712cc1 100644
--- a/Modules/Hyperspectral/Unmixing/include/otbNCLSUnmixingImageFilter.h
+++ b/Modules/Hyperspectral/Unmixing/include/otbNCLSUnmixingImageFilter.h
@@ -98,7 +98,7 @@ private:
  *
  * This filter takes as input a multiband image and a matrix.
  * If the matrix is called \f$A\f$, it solves, for each pixel \f$p\f$, the system
- * \f$A \cdot x = p\f$ in the least square sense, with additionnal constraints on the solution
+ * \f$A \cdot x = p\f$ in the least square sense, with additional constraints on the solution
  * \f$\hat{x}\f$ ensuring positivity (each component is positive) and additivity (the sum of
  * all components is 1).
  *
diff --git a/Modules/Hyperspectral/Unmixing/include/otbSparseUnmixingImageFilter.h b/Modules/Hyperspectral/Unmixing/include/otbSparseUnmixingImageFilter.h
index 64f22bd..0a7c445 100644
--- a/Modules/Hyperspectral/Unmixing/include/otbSparseUnmixingImageFilter.h
+++ b/Modules/Hyperspectral/Unmixing/include/otbSparseUnmixingImageFilter.h
@@ -38,7 +38,7 @@ namespace otb {
  * signals (Through multiscale wavelet transforms) by means of line detection
  * in the scatterplot.
  *
- * It is implemeted as a multi-filter that performs wavelet decomposition of the N
+ * It is implemented as a multi-filter that performs wavelet decomposition of the N
  * images, Sample list construction of the scatter plot sample, histogram estimation
  * of the phase and source detection...
  *
diff --git a/Modules/IO/Carto/include/otbCoordinateToName.h b/Modules/IO/Carto/include/otbCoordinateToName.h
index 952e27c..db816e5 100644
--- a/Modules/IO/Carto/include/otbCoordinateToName.h
+++ b/Modules/IO/Carto/include/otbCoordinateToName.h
@@ -21,6 +21,7 @@
 #include "itkPoint.h"
 #include "itkMultiThreader.h"
 #include "otbCurlHelperInterface.h"
+#include "OTBCartoExport.h"
 
 namespace otb
 {
@@ -36,7 +37,7 @@ namespace otb
  * \ingroup OTBCarto
  */
 
-class ITK_EXPORT CoordinateToName : public itk::Object
+class OTBCarto_EXPORT CoordinateToName : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.h b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.h
index 77665ad..e8c6713 100644
--- a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.h
+++ b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.h
@@ -37,7 +37,7 @@ namespace otb {
  * \ingroup OTBCarto
  */
 template < class TImage>
-class  ITK_EXPORT ImageToOSMVectorDataGenerator :
+class ImageToOSMVectorDataGenerator :
     public OSMDataToVectorDataGenerator
 {
 public:
diff --git a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.txx b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.txx
index b7cbbe1..df28ed4 100644
--- a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.txx
+++ b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.txx
@@ -95,7 +95,7 @@ ImageToOSMVectorDataGenerator<TImage>
   transform->SetInputKeywordList(input->GetImageKeywordlist());
   transform->SetInputProjectionRef(input->GetProjectionRef());
   transform->SetOutputProjectionRef(otb::GeoInformationConversion::ToWKT(4326));
-  transform->InstanciateTransform();
+  transform->InstantiateTransform();
 
   // Compute the 4 corners in the cartographic coordinate system
   std::vector< IndexType> vindex;
diff --git a/Modules/IO/Carto/include/otbMapFileProductWriter.h b/Modules/IO/Carto/include/otbMapFileProductWriter.h
index c180daf..9c5b4c4 100644
--- a/Modules/IO/Carto/include/otbMapFileProductWriter.h
+++ b/Modules/IO/Carto/include/otbMapFileProductWriter.h
@@ -42,14 +42,14 @@ namespace otb
 /** \class MapFileProductWriter
  * \brief This class produces Map file product ie a file .map,
  *        the tiles to draw in a mapserver, and finally
- *        a shapefile wich describe the tiles and where to find them
+ *        a shapefile which describe the tiles and where to find them
  *        on the disk.
  *
  * This filter begins by tiling the input image. An accessor
  * SetTileSize allows setting the size of each tile. For each tile
  * generated, an entry is added to the shapefile to store the location
  * where the file is saved on the disk.
- * The product generated are a mapfile wich is the configuration file
+ * The product generated are a mapfile which is the configuration file
  * for mapservers, a tile index and finally the tiles.
  * This class allow the user to specify the cgi-bin used (SetCGIPath)
  * and the directory where to store the index shapefile and the tiles
@@ -190,7 +190,7 @@ private:
   /** Add a layer to the mapfile*/
   void AddLayer();
 
-  /** Intialize vd*/
+  /** Initialize vd*/
   void InitializeVectorData();
 
   InputImagePointer    m_VectorImage;
diff --git a/Modules/IO/Carto/include/otbMapFileProductWriter.txx b/Modules/IO/Carto/include/otbMapFileProductWriter.txx
index f960e0b..07e6e05 100644
--- a/Modules/IO/Carto/include/otbMapFileProductWriter.txx
+++ b/Modules/IO/Carto/include/otbMapFileProductWriter.txx
@@ -105,7 +105,7 @@ MapFileProductWriter<TInputImage>
 
 
 /**
- * Write lauch the tiling and the mapFile generation and write on the
+ * Write launch the tiling and the mapFile generation and write on the
  * disk the indexfile as a shapefile
  */
 template <class TInputImage>
@@ -365,7 +365,7 @@ MapFileProductWriter<TInputImage>
         m_Transform  = TransformType::New();
         m_Transform->SetInputProjectionRef(m_GenericRSResampler->GetOutputProjectionRef());
         m_Transform->SetOutputProjectionRef(otb::GeoInformationConversion::ToWKT(m_SRID));
-        m_Transform->InstanciateTransform();
+        m_Transform->InstantiateTransform();
 
         InputPointType  inputPoint;
         SizeType        sizeTile;
@@ -546,7 +546,7 @@ MapFileProductWriter<TInputImage>
   m_File <<"\t\t#IMAGEURL '/ms_tmp/'" << std::endl;
 
   m_File <<"\t\t# WMS server settings" << std::endl;
-  m_File <<"\t\t# NOTE : the user must change the path to the mapserver excecutable in the "<<std::endl;
+  m_File <<"\t\t# NOTE : the user must change the path to the mapserver executable in the "<<std::endl;
   m_File <<"\t\t#  wms_onlineresource field"<<std::endl;
   m_File <<"\t\tMETADATA" << std::endl;
   m_File <<"\t\t 'wms_title'           'Level0'" << std::endl;
diff --git a/Modules/IO/Carto/include/otbOSMDataToVectorDataGenerator.h b/Modules/IO/Carto/include/otbOSMDataToVectorDataGenerator.h
index a58f0a3..34cd8b6 100644
--- a/Modules/IO/Carto/include/otbOSMDataToVectorDataGenerator.h
+++ b/Modules/IO/Carto/include/otbOSMDataToVectorDataGenerator.h
@@ -24,6 +24,7 @@
 #include <string>
 #include <fstream>
 
+#include "OTBCartoExport.h"
 #include "otbVectorData.h"
 #include "otbVectorDataSource.h"
 
@@ -71,7 +72,7 @@ namespace otb {
  *
  * \ingroup OTBCarto
  */
-class  ITK_EXPORT OSMDataToVectorDataGenerator :
+class OTBCarto_EXPORT OSMDataToVectorDataGenerator :
     public VectorDataSource< otb::VectorData<> >
 {
 public:
@@ -161,7 +162,7 @@ public:
   const VectorDataType* GetVectorDataByName(const std::string& key, const std::string& value);
 
 protected:
-  /** Generate Data method : lauch the process */
+  /** Generate Data method : launch the process */
   void GenerateData() ITK_OVERRIDE;
 
   /**
diff --git a/Modules/IO/Carto/include/otbPlaceNameToLonLat.h b/Modules/IO/Carto/include/otbPlaceNameToLonLat.h
index 1587e81..b36163b 100644
--- a/Modules/IO/Carto/include/otbPlaceNameToLonLat.h
+++ b/Modules/IO/Carto/include/otbPlaceNameToLonLat.h
@@ -19,6 +19,7 @@
 #define otbPlaceNameToLonLat_h
 
 #include "otbCurlHelperInterface.h"
+#include "OTBCartoExport.h"
 
 namespace otb
 {
@@ -31,7 +32,7 @@ namespace otb
  * \ingroup OTBCarto
  */
 
-class ITK_EXPORT PlaceNameToLonLat : public itk::Object
+class OTBCarto_EXPORT PlaceNameToLonLat : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/IO/Carto/otb-module.cmake b/Modules/IO/Carto/otb-module.cmake
index 7f8d5b1..5815106 100644
--- a/Modules/IO/Carto/otb-module.cmake
+++ b/Modules/IO/Carto/otb-module.cmake
@@ -7,6 +7,7 @@ the vector elements available. retrieve Longitude and Latitude coordinates from
 place name. And so on.")
 
 otb_module(OTBCarto
+ENABLE_SHARED
   DEPENDS
     OTBCommon
     OTBCurlAdapters
diff --git a/Modules/IO/Carto/src/otbOSMDataToVectorDataGenerator.cxx b/Modules/IO/Carto/src/otbOSMDataToVectorDataGenerator.cxx
index 3aa7df3..b051f9e 100644
--- a/Modules/IO/Carto/src/otbOSMDataToVectorDataGenerator.cxx
+++ b/Modules/IO/Carto/src/otbOSMDataToVectorDataGenerator.cxx
@@ -209,7 +209,7 @@ void OSMDataToVectorDataGenerator::ParseXmlFile()
         VectorDataElementType   vdelement;
         PointTypeList           pointList;
 
-        // put the current layer pointer to the begining
+        // put the current layer pointer to the beginning
         for( TiXmlElement* currentNode = currentLayer->FirstChildElement("nd");
              currentNode != ITK_NULLPTR;
              currentNode = currentNode->NextSiblingElement() )
@@ -293,7 +293,7 @@ OSMDataToVectorDataGenerator::ProcessVectorData(const std::string& key, const st
   // Form the vector data with the values parsed
   for(unsigned int idx = 0; idx < m_VectorDataElementList.size(); ++idx)
     {
-    // Instanciate a datanode
+    // Instantiate a datanode
     DataNodeType::Pointer currentDataNode = DataNodeType::New();
 
     // Get the current PointTypeList
@@ -359,7 +359,7 @@ OSMDataToVectorDataGenerator::GetVectorDataByName(const std::string& key)
   // KeyList
   if(!this->IsKeyPresent(key))
     {
-    // TODO leave this functionnality for AddKey ?
+    // TODO leave this functionality for AddKey ?
     m_KeyList.push_back(key);
     this->ParseXmlFile();
     }
@@ -378,7 +378,7 @@ OSMDataToVectorDataGenerator::GetVectorDataByName(const std::string& key, const
     itkExceptionMacro(<<"Requested key is empty, please set a valid one");
 
   // Add the key set as parameters in the KeyList
-  // TODO leave this functionnality for AddKey ?
+  // TODO leave this functionality for AddKey ?
   if(!this->IsKeyPresent(key))
     {
     m_KeyList.push_back(key);
diff --git a/Modules/IO/Carto/test/otbImageToOSMVectorDataGenerator.cxx b/Modules/IO/Carto/test/otbImageToOSMVectorDataGenerator.cxx
index 7d28f4f..b3cd783 100644
--- a/Modules/IO/Carto/test/otbImageToOSMVectorDataGenerator.cxx
+++ b/Modules/IO/Carto/test/otbImageToOSMVectorDataGenerator.cxx
@@ -70,12 +70,12 @@ int otbImageToOSMVectorDataGenerator(int argc, char * argv[])
   typedef std::pair<std::string, std::string>      KeyValueType;
   typedef std::vector<KeyValueType>                KeyValueListType;
 
-  // Instanciate the image reader
+  // Instantiate the image reader
   ReaderType::Pointer      reader = ReaderType::New();
   reader->SetFileName(parseResult->GetInputImage());
   reader->UpdateOutputInformation();
 
-  // VectorData generator instanciation
+  // VectorData generator instantiation
   FilterType::Pointer vdgenerator = FilterType::New();
   vdgenerator->SetInput(reader->GetOutput());
   if(parseResult->IsOptionPresent("--OSM"))
@@ -126,7 +126,7 @@ int otbImageToOSMVectorDataGenerator(int argc, char * argv[])
     writer->SetInput(vd);
     }
 
-  // trigger the excecution
+  // trigger the execution
   writer->Update();
 
   return EXIT_SUCCESS;
diff --git a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameHelper.h b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameHelper.h
index 910d106..935d868 100644
--- a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameHelper.h
+++ b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameHelper.h
@@ -46,9 +46,9 @@ public:
 
   typedef std::map< std::string, std::string > OptionMapType;
 
-  void SetExtendedFileName(const char * extFname);
-  OptionMapType GetOptionMap(void) const;
-
+  virtual void SetExtendedFileName(const char * extFname);
+  const OptionMapType & GetOptionMap(void) const;
+  
   itkGetStringMacro(ExtendedFileName);
   itkGetStringMacro(SimpleFileName);
 
diff --git a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToReaderOptions.h b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToReaderOptions.h
index 7dc33db..9deb969 100644
--- a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToReaderOptions.h
+++ b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToReaderOptions.h
@@ -38,19 +38,19 @@ namespace otb
  * \ingroup OTBExtendedFilename
  */
 
-class ITK_EXPORT ExtendedFilenameToReaderOptions : public itk::Object
+class ITK_EXPORT ExtendedFilenameToReaderOptions : public ExtendedFilenameHelper
 {
 public:
 /** Standard class typedefs. */
   typedef ExtendedFilenameToReaderOptions        Self;
   typedef itk::SmartPointer<Self>                Pointer;
   typedef itk::SmartPointer<const Self>          ConstPointer;
-  typedef itk::Object                            Superclass;
+  typedef ExtendedFilenameHelper                 Superclass;
 
-  itkTypeMacro(ExtendedFilenameToReaderOptions, itk::Object);
+  itkTypeMacro(ExtendedFilenameToReaderOptions, otb::ExtendedFilenameHelper);
   itkNewMacro(Self);
 
-  typedef ExtendedFilenameHelper                    FNameHelperType;
+  typedef Superclass                                FNameHelperType;
   typedef FNameHelperType::OptionMapType            MapType;
   typedef MapType::iterator                         MapIteratorType;
 
@@ -68,10 +68,9 @@ public:
   };
 
   /* Set Methods */
-  void SetExtendedFileName(const char * extFname);
+  void SetExtendedFileName(const char * extFname) ITK_OVERRIDE;
   /* Get Methods */
   bool SimpleFileNameIsSet () const;
-  const char* GetSimpleFileName () const;
   bool ExtGEOMFileNameIsSet () const;
   const char* GetExtGEOMFileName () const;
   bool SubDatasetIndexIsSet () const;
@@ -93,7 +92,6 @@ private:
   ExtendedFilenameToReaderOptions(const Self &);  //purposely not implemented
   void operator =(const Self&);  //purposely not implemented
 
-  FNameHelperType::Pointer m_FilenameHelper;
   OptionType               m_Options;
 
 };
diff --git a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h
index 994a9e3..3bcab73 100644
--- a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h
+++ b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h
@@ -39,19 +39,19 @@ namespace otb
  * \ingroup OTBExtendedFilename
  */
 
-class ITK_EXPORT ExtendedFilenameToWriterOptions : public itk::Object
+class ITK_EXPORT ExtendedFilenameToWriterOptions : public ExtendedFilenameHelper
 {
 public:
 /** Standard class typedefs. */
   typedef ExtendedFilenameToWriterOptions        Self;
   typedef itk::SmartPointer<Self>                Pointer;
   typedef itk::SmartPointer<const Self>          ConstPointer;
-  typedef itk::Object                            Superclass;
+  typedef ExtendedFilenameHelper                 Superclass;
 
-  itkTypeMacro(ExtendedFilenameToWriterOptions, itk::Object);
+  itkTypeMacro(ExtendedFilenameToWriterOptions, otb::ExtendedFilenameHelper);
   itkNewMacro(Self);
 
-  typedef ExtendedFilenameHelper                    FNameHelperType;
+  typedef Superclass                                FNameHelperType;
   typedef FNameHelperType::OptionMapType            MapType;
   typedef MapType::iterator                         MapIteratorType;
 
@@ -73,10 +73,9 @@ public:
   };
 
   /* Set Methods */
-  void SetExtendedFileName(const char * extFname);
+  void SetExtendedFileName(const char * extFname) ITK_OVERRIDE;
   /* Get Methods */
   bool SimpleFileNameIsSet () const;
-  const char* GetSimpleFileName () const;
   bool WriteGEOMFileIsSet () const;
   bool WriteRPCTagsIsSet() const;
   bool GetWriteGEOMFile () const;
@@ -102,7 +101,6 @@ private:
   ExtendedFilenameToWriterOptions(const Self &);  //purposely not implemented
   void operator =(const Self&);  //purposely not implemented
 
-  FNameHelperType::Pointer m_FilenameHelper;
   OptionType               m_Options;
 
 };
diff --git a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameHelper.cxx b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameHelper.cxx
index c89b2cb..5c966ca 100644
--- a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameHelper.cxx
+++ b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameHelper.cxx
@@ -66,7 +66,7 @@ ExtendedFilenameHelper
 }
 
 
-ExtendedFilenameHelper::OptionMapType
+const ExtendedFilenameHelper::OptionMapType &
 ExtendedFilenameHelper
 ::GetOptionMap(void) const
 {
diff --git a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToReaderOptions.cxx b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToReaderOptions.cxx
index aa744ee..006e2bf 100644
--- a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToReaderOptions.cxx
+++ b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToReaderOptions.cxx
@@ -22,10 +22,8 @@ namespace otb
 {
 
 ExtendedFilenameToReaderOptions
-::ExtendedFilenameToReaderOptions() : itk::Object()
+::ExtendedFilenameToReaderOptions() : ExtendedFilenameHelper()
 {
-  m_FilenameHelper = FNameHelperType::New();
-
   m_Options.simpleFileName.first  = false;
   m_Options.simpleFileName.second = "";
 
@@ -59,11 +57,11 @@ void
 ExtendedFilenameToReaderOptions
 ::SetExtendedFileName(const char *extFname)
 {
-  this->m_FilenameHelper->SetExtendedFileName(extFname);
-  MapType map = this->m_FilenameHelper->GetOptionMap();
+  Superclass::SetExtendedFileName(extFname);
+  MapType map = GetOptionMap();
 
   m_Options.simpleFileName.first  = true;
-  m_Options.simpleFileName.second = this->m_FilenameHelper->GetSimpleFileName();
+  m_Options.simpleFileName.second = this->GetSimpleFileName();
 
   if (!map["geom"].empty())
     {
@@ -144,12 +142,6 @@ ExtendedFilenameToReaderOptions
 {
   return m_Options.simpleFileName.first;
 }
-const char*
-ExtendedFilenameToReaderOptions
-::GetSimpleFileName () const
-{
-  return m_Options.simpleFileName.second.c_str();
-}
 
 bool
 ExtendedFilenameToReaderOptions
diff --git a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx
index c8f7bb5..89b6e83 100644
--- a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx
+++ b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx
@@ -24,10 +24,8 @@ namespace otb
 {
 
 ExtendedFilenameToWriterOptions
-::ExtendedFilenameToWriterOptions() : itk::Object()
+::ExtendedFilenameToWriterOptions() : ExtendedFilenameHelper()
 {
-  m_FilenameHelper = FNameHelperType::New();
-
   m_Options.simpleFileName.first  = false;
   m_Options.simpleFileName.second = "";
 
@@ -54,12 +52,12 @@ void
 ExtendedFilenameToWriterOptions
 ::SetExtendedFileName(const char *extFname)
 {
-  this->m_FilenameHelper->SetExtendedFileName(extFname);
+  this->Superclass::SetExtendedFileName(extFname);
   // TODO: Rename map to a less confusing (with std::map) name
-  MapType map = this->m_FilenameHelper->GetOptionMap();
+  MapType map = this->GetOptionMap();
 
   m_Options.simpleFileName.first  = true;
-  m_Options.simpleFileName.second = this->m_FilenameHelper->GetSimpleFileName();
+  m_Options.simpleFileName.second = this->GetSimpleFileName();
 
   MapIteratorType it;
   for ( it=map.begin(); it != map.end(); it++ )
@@ -189,12 +187,6 @@ ExtendedFilenameToWriterOptions
 {
   return m_Options.simpleFileName.first;
 }
-const char*
-ExtendedFilenameToWriterOptions
-::GetSimpleFileName () const
-{
-  return m_Options.simpleFileName.second.c_str();
-}
 
 bool
 ExtendedFilenameToWriterOptions
diff --git a/Modules/IO/IOBSQ/include/otbBSQImageIO.h b/Modules/IO/IOBSQ/include/otbBSQImageIO.h
index 548aa31..93f6e45 100644
--- a/Modules/IO/IOBSQ/include/otbBSQImageIO.h
+++ b/Modules/IO/IOBSQ/include/otbBSQImageIO.h
@@ -68,7 +68,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Reads the data from disk into the memory buffer provided. */
@@ -89,7 +89,7 @@ public:
     return true;
   }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IOBSQ/src/otbBSQImageIO.cxx b/Modules/IO/IOBSQ/src/otbBSQImageIO.cxx
index fd70394..8ccd501 100644
--- a/Modules/IO/IOBSQ/src/otbBSQImageIO.cxx
+++ b/Modules/IO/IOBSQ/src/otbBSQImageIO.cxx
@@ -303,7 +303,7 @@ bool BSQImageIO::InternalReadHeaderInformation(const std::string& file_name, std
       {
       itkExceptionMacro(
         << "BSQ : the value type '" << lStrCodePix <<
-        "' (second line) set in the header file is not reconized as correct value.");
+        "' (second line) set in the header file is not recognized as correct value.");
       }
     else
       {
@@ -397,7 +397,7 @@ bool BSQImageIO::InternalReadHeaderInformation(const std::string& file_name, std
   int lNbBitsPerPixels;
   file >> lNbBitsPerPixels;
 
-  //Read "SENSCODAGE" information (optionnal)
+  //Read "SENSCODAGE" information (optional)
   file >> lString;
   if (lString.empty() == false)
     {
@@ -420,7 +420,7 @@ bool BSQImageIO::InternalReadHeaderInformation(const std::string& file_name, std
           {
           itkExceptionMacro(
             << "BSQ : the value SENSCODAGE '" << lString <<
-            "' set in the header file is not reconized as correct value. Possible values are INTEL or IEEE");
+            "' set in the header file is not recognized as correct value. Possible values are INTEL or IEEE");
           }
         else
           {
@@ -593,7 +593,7 @@ void BSQImageIO::WriteImageInformation()
   otbSetTypeBsqMacro(DOUBLE, "R8")
   else
     {
-    itkExceptionMacro(<< "BSQ format doesn't reconized (TYPE).");
+    itkExceptionMacro(<< "BSQ format doesn't recognized (TYPE).");
     }
 
   std::string lString;
diff --git a/Modules/IO/IOGDAL/include/otbGDALImageIO.h b/Modules/IO/IOGDAL/include/otbGDALImageIO.h
index fb3585b..339d26f 100644
--- a/Modules/IO/IOGDAL/include/otbGDALImageIO.h
+++ b/Modules/IO/IOGDAL/include/otbGDALImageIO.h
@@ -25,6 +25,8 @@
 /* ITK Libraries */
 #include "otbImageIOBase.h"
 
+#include "OTBIOGDALExport.h"
+
 namespace otb
 {
 class GDALDatasetWrapper;
@@ -48,7 +50,7 @@ class GDALDataTypeWrapper;
  * \em Warning : the index coordinate system used in GDAL is attached
  * to the corner of the top left pixel, whereas in OTB, the index
  * coordinate system is attached to the centre of the top-left
- * pixel. It means that the origin coefficents read from the
+ * pixel. It means that the origin coefficients read from the
  * GDAL geotransform are the location of the top-left pixel
  * corner. This is why this location has to be shifted by
  * half a pixel to be used as an OTB origin. In a nutshell,
@@ -63,7 +65,7 @@ class GDALDataTypeWrapper;
  *
  * \ingroup OTBIOGDAL
  */
-class ITK_EXPORT GDALImageIO : public otb::ImageIOBase
+class OTBIOGDAL_EXPORT GDALImageIO : public otb::ImageIOBase
 {
 public:
 
@@ -95,7 +97,7 @@ public:
   itkSetMacro(IsVectorImage, bool);
   itkGetMacro(IsVectorImage, bool);
 
-  /** Set/get wether the driver will write RPC tags to TIFF */
+  /** Set/get whether the driver will write RPC tags to TIFF */
   itkSetMacro(WriteRPCTags,bool);
   itkGetMacro(WriteRPCTags,bool);
 
@@ -132,7 +134,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Reads the data from disk into the memory buffer provided. */
@@ -156,7 +158,7 @@ public:
   /** Determine the file type. Returns true if the ImageIO can stream write the specified file */
   bool CanStreamWrite() ITK_OVERRIDE;
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IOGDAL/include/otbGDALImageIOFactory.h b/Modules/IO/IOGDAL/include/otbGDALImageIOFactory.h
index c32302b..34cabc2 100644
--- a/Modules/IO/IOGDAL/include/otbGDALImageIOFactory.h
+++ b/Modules/IO/IOGDAL/include/otbGDALImageIOFactory.h
@@ -21,6 +21,8 @@
 
 #include "itkObjectFactoryBase.h"
 
+#include "OTBIOGDALExport.h"
+
 namespace otb
 {
 /** \class GDALImageIOFactory
@@ -28,7 +30,7 @@ namespace otb
  *
  * \ingroup OTBIOGDAL
  */
-class ITK_EXPORT GDALImageIOFactory : public itk::ObjectFactoryBase
+class OTBIOGDAL_EXPORT GDALImageIOFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/IO/IOGDAL/include/otbGDALOverviewsBuilder.h b/Modules/IO/IOGDAL/include/otbGDALOverviewsBuilder.h
index 4262a32..5b1da9b 100644
--- a/Modules/IO/IOGDAL/include/otbGDALOverviewsBuilder.h
+++ b/Modules/IO/IOGDAL/include/otbGDALOverviewsBuilder.h
@@ -26,6 +26,8 @@
 #include "otbGDALDatasetWrapper.h"
 #include "otbConfigure.h"
 
+#include "OTBIOGDALExport.h"
+
 namespace otb
 {
 
@@ -77,7 +79,7 @@ enum GDALFormat
 
 /**
  */
-class GDALOverviewsBuilder : public itk::ProcessObject
+class OTBIOGDAL_EXPORT GDALOverviewsBuilder : public itk::ProcessObject
 {
 public:
   typedef GDALOverviewsBuilder Self;
@@ -101,7 +103,10 @@ public:
    * factor^n. 
    */
   unsigned int
-  CountResolutions( unsigned int factor, unsigned int size =1 ) const;
+  CountResolutions( unsigned int factor, unsigned int size ) const;
+
+  unsigned int
+  CountResolutions( unsigned int size ) const;
 
   unsigned int
   CountResolutions() const;
diff --git a/Modules/IO/IOGDAL/include/otbOGRIOHelper.h b/Modules/IO/IOGDAL/include/otbOGRIOHelper.h
index 9f7e761..bd875ab 100644
--- a/Modules/IO/IOGDAL/include/otbOGRIOHelper.h
+++ b/Modules/IO/IOGDAL/include/otbOGRIOHelper.h
@@ -23,12 +23,16 @@
 #include "otbVectorData.h"
 #include "otbOGRVersionProxy.h"
 
+#include "OTBIOGDALExport.h"
+
+
 class GDALDataset;
 class OGRGeometryCollection;
 class OGRLayer;
 class OGRSpatialReference;
 class OGRGeometry;
 
+
 namespace otb
 {
 
@@ -38,7 +42,7 @@ namespace otb
  *
  * \ingroup OTBIOGDAL
  */
-class OGRIOHelper: public itk::Object
+class OTBIOGDAL_EXPORT OGRIOHelper: public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/IO/IOGDAL/include/otbOGRVectorDataIO.h b/Modules/IO/IOGDAL/include/otbOGRVectorDataIO.h
index d912fc3..fd87412 100644
--- a/Modules/IO/IOGDAL/include/otbOGRVectorDataIO.h
+++ b/Modules/IO/IOGDAL/include/otbOGRVectorDataIO.h
@@ -25,6 +25,8 @@
 #include "otbVectorData.h"
 #include "otbOGRVersionProxy.h"
 
+#include "OTBIOGDALExport.h"
+
 namespace otb
 {
 
@@ -39,7 +41,7 @@ namespace otb
  *
  * \ingroup OTBIOGDAL
  */
-class ITK_EXPORT OGRVectorDataIO
+class OTBIOGDAL_EXPORT OGRVectorDataIO
   : public VectorDataIOBase
 {
 public:
diff --git a/Modules/IO/IOGDAL/include/otbOGRVectorDataIOFactory.h b/Modules/IO/IOGDAL/include/otbOGRVectorDataIOFactory.h
index 3a414b6..0600612 100644
--- a/Modules/IO/IOGDAL/include/otbOGRVectorDataIOFactory.h
+++ b/Modules/IO/IOGDAL/include/otbOGRVectorDataIOFactory.h
@@ -19,6 +19,7 @@
 #define otbOGRVectorDataIOFactory_h
 
 #include "itkObjectFactoryBase.h"
+#include "OTBIOGDALExport.h"
 
 namespace otb
 {
@@ -27,7 +28,7 @@ namespace otb
  *
  * \ingroup OTBIOGDAL
  */
-class ITK_EXPORT OGRVectorDataIOFactory : public itk::ObjectFactoryBase
+class OTBIOGDAL_EXPORT OGRVectorDataIOFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/IO/IOGDAL/otb-module.cmake b/Modules/IO/IOGDAL/otb-module.cmake
index a1304de..a8ff155 100644
--- a/Modules/IO/IOGDAL/otb-module.cmake
+++ b/Modules/IO/IOGDAL/otb-module.cmake
@@ -2,6 +2,7 @@ set(DOCUMENTATION "This module contains features to read and write images with
 GDAL.")
 
 otb_module(OTBIOGDAL
+ENABLE_SHARED
   DEPENDS
     OTBVectorDataBase
     OTBGdalAdapters
diff --git a/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx b/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx
index 4039353..ecfdfcb 100644
--- a/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx
+++ b/Modules/IO/IOGDAL/src/otbGDALOverviewsBuilder.cxx
@@ -159,9 +159,17 @@ GDALOverviewsBuilder
 /***************************************************************************/
 unsigned int
 GDALOverviewsBuilder
+::CountResolutions( unsigned int minSize ) const
+{
+  return CountResolutions( m_ResolutionFactor, minSize );
+}
+
+/***************************************************************************/
+unsigned int
+GDALOverviewsBuilder
 ::CountResolutions() const
 {
-  return CountResolutions( m_ResolutionFactor );
+  return CountResolutions( 1 );
 }
 
 /***************************************************************************/
diff --git a/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx b/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx
index 212d75c..275897e 100644
--- a/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx
+++ b/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx
@@ -946,7 +946,7 @@ unsigned int OGRIOHelper
         itkExceptionMacro(<< "Problem while creating multiline.");
         }
 
-      // Instanciate a new  ogrMultiLineString feature
+      // Instantiate a new  ogrMultiLineString feature
       OGRMultiLineString* ogrMultiLineString = (OGRMultiLineString*) OGRGeometryFactory::createGeometry(
         wkbMultiLineString);
 
@@ -971,7 +971,7 @@ unsigned int OGRIOHelper
         itkExceptionMacro(<< "Problem while creating multipolygon.");
         }
 
-      // Instanciate a new multipolygon feature
+      // Instantiate a new multipolygon feature
       OGRMultiPolygon* ogrMultiPolygon = (OGRMultiPolygon*) OGRGeometryFactory::createGeometry(wkbMultiPolygon);
       OGRFeature *     ogrFeature;
 
@@ -1280,7 +1280,7 @@ std::vector<OGRLayer*> OGRIOHelper
       }
       case FEATURE_MULTILINE:
       {
-      // Instanciate a new  ogrMultiLineString feature
+      // Instantiate a new  ogrMultiLineString feature
       OGRMultiLineString* ogrMultiLineString = (OGRMultiLineString*) OGRGeometryFactory::createGeometry(
         wkbMultiLineString);
 
@@ -1299,7 +1299,7 @@ std::vector<OGRLayer*> OGRIOHelper
       }
       case FEATURE_MULTIPOLYGON:
       {
-      // Instanciate a new multipolygon feature
+      // Instantiate a new multipolygon feature
       OGRMultiPolygon* ogrMultiPolygon = (OGRMultiPolygon*) OGRGeometryFactory::createGeometry(wkbMultiPolygon);
       OGRFeature *     ogrFeature;
 
diff --git a/Modules/IO/IOGDAL/src/otbOGRVectorDataIO.cxx b/Modules/IO/IOGDAL/src/otbOGRVectorDataIO.cxx
index 7f244f9..f4a4251 100644
--- a/Modules/IO/IOGDAL/src/otbOGRVectorDataIO.cxx
+++ b/Modules/IO/IOGDAL/src/otbOGRVectorDataIO.cxx
@@ -52,7 +52,7 @@ bool
 OGRVectorDataIO::CanReadFile(const char* filename) const
 {
   otb::ogr::version_proxy::GDALDatasetType * poDS = ogr::version_proxy::Open(filename, true);
-  
+
   if (poDS == ITK_NULLPTR)
     {
     std::cerr<<"Can not read file "<<filename<<" with GDALOpen"<<std::endl;
@@ -325,7 +325,8 @@ OGRVectorDataIO::GetOGRDriverName(std::string name) const
     else if (extension == ".GML") driverOGR = "GML";
     else if (extension == ".GPX") driverOGR = "GPX";
     else if (extension == ".SQLITE") driverOGR = "SQLite";
-     else if (extension==".KML") driverOGR="KML";
+    else if (extension==".KML") driverOGR="KML";
+    else if (extension == ".GMT") driverOGR = "OGR_GMT";
     else driverOGR = "NOT-FOUND";
     }
   //std::cout << name << " " << driverOGR <<" "<<upperName<< " "<< upperName.substr(0, 3) << std::endl;
diff --git a/Modules/IO/IOGDAL/test/CMakeLists.txt b/Modules/IO/IOGDAL/test/CMakeLists.txt
index 3f5078f..f4b2ac0 100644
--- a/Modules/IO/IOGDAL/test/CMakeLists.txt
+++ b/Modules/IO/IOGDAL/test/CMakeLists.txt
@@ -135,7 +135,7 @@ otb_add_test(NAME ioTuOGRVectorDataIOCanWriteMapInfo COMMAND otbIOGDALTestDriver
 
 otb_add_test(NAME ioTuOGRVectorDataIOCanWriteGML COMMAND otbIOGDALTestDriver
   otbOGRVectorDataIOCanWrite
-  ${INPUTDATA}/adressPoint.gml)
+  ${INPUTDATA}/addressPoint.gml)
 
 otb_add_test(NAME ioTuGDALImageIOCanRead_IKONOS_RED COMMAND otbIOGDALTestDriver otbGDALImageIOTestCanRead
   LARGEINPUT{IKONOS/PARIS/po_79039_red_0000000.tif})
@@ -218,7 +218,7 @@ endif()
 
 otb_add_test(NAME ioTuOGRVectorDataIOTestCanReadGML COMMAND otbIOGDALTestDriver
   otbOGRVectorDataIOTestCanRead
-  ${INPUTDATA}/adressPoint.gml)
+  ${INPUTDATA}/addressPoint.gml)
 
 otb_add_test(NAME ioTuOGRVectorDataIOTestCanReadMapInfo COMMAND otbIOGDALTestDriver
   otbOGRVectorDataIOTestCanRead
@@ -233,6 +233,6 @@ foreach(INPUTFILE_PIXELTYPE ${INPUTFILE_PIXELTYPES_LIST})
   otb_add_test(NAME ioTvGDALReadPxlComplex${INPUTFILE_PIXELTYPE} COMMAND otbIOGDALTestDriver
     otbGDALReadPxlComplex${INPUTFILE_PIXELTYPE}
     ${INPUTDATA}/multibandComplex${INPUTFILE_PIXELTYPE}_3bands.tif
-    1 5 10 2) #old file hdr sans extesions
+    1 5 10 2) #old file hdr sans extensions
 
 endforeach()
diff --git a/Modules/IO/IOGDAL/test/otbGDALImageIOTestWriteMetadata.cxx b/Modules/IO/IOGDAL/test/otbGDALImageIOTestWriteMetadata.cxx
index 76f079c..dc305dd 100644
--- a/Modules/IO/IOGDAL/test/otbGDALImageIOTestWriteMetadata.cxx
+++ b/Modules/IO/IOGDAL/test/otbGDALImageIOTestWriteMetadata.cxx
@@ -270,7 +270,7 @@ int compareDatasetInfoGDAL(DatasetInfoGDAL *create, DatasetInfoGDAL *WR, std::os
          (create->m_GeoTransfoParam[4] == WR->m_GeoTransfoParam[4]) &&
          ( (create->m_GeoTransfoParam[5] == WR->m_GeoTransfoParam[5]) || (create->m_GeoTransfoParam[5] == -WR->m_GeoTransfoParam[5]) )  )
       {
-      os << "Same GeoTranform" <<std::endl;
+      os << "Same GeoTransform" <<std::endl;
       }
     else
       {
diff --git a/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h b/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h
index d5b19bc..7ea055f 100644
--- a/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h
+++ b/Modules/IO/IOJPEG2000/include/otbJPEG2000ImageIO.h
@@ -67,7 +67,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Get description about overviews available into the file specified */
@@ -101,7 +101,7 @@ public:
     return true;
   }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IOLUM/include/otbLUMImageIO.h b/Modules/IO/IOLUM/include/otbLUMImageIO.h
index c737370..66bd4c1 100644
--- a/Modules/IO/IOLUM/include/otbLUMImageIO.h
+++ b/Modules/IO/IOLUM/include/otbLUMImageIO.h
@@ -67,7 +67,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Reads the data from disk into the memory buffer provided. */
@@ -88,7 +88,7 @@ public:
     return true;
   }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IOMW/include/otbMWImageIO.h b/Modules/IO/IOMW/include/otbMWImageIO.h
index 8d1aafb..d47b634 100644
--- a/Modules/IO/IOMW/include/otbMWImageIO.h
+++ b/Modules/IO/IOMW/include/otbMWImageIO.h
@@ -67,7 +67,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Reads the data from disk into the memory buffer provided. */
@@ -88,7 +88,7 @@ public:
     return true;
   }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IOONERA/include/otbONERAImageIO.h b/Modules/IO/IOONERA/include/otbONERAImageIO.h
index 394b27f..620916b 100644
--- a/Modules/IO/IOONERA/include/otbONERAImageIO.h
+++ b/Modules/IO/IOONERA/include/otbONERAImageIO.h
@@ -65,7 +65,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Reads the data from disk into the memory buffer provided. */
@@ -86,7 +86,7 @@ public:
     return true;
   }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IORAD/include/otbRADImageIO.h b/Modules/IO/IORAD/include/otbRADImageIO.h
index 3f3e3cd..a0d11a9 100644
--- a/Modules/IO/IORAD/include/otbRADImageIO.h
+++ b/Modules/IO/IORAD/include/otbRADImageIO.h
@@ -67,7 +67,7 @@ public:
     return true;
   }
 
-  /** Set the spacing and dimention information for the set filename. */
+  /** Set the spacing and dimension information for the set filename. */
   void ReadImageInformation() ITK_OVERRIDE;
 
   /** Reads the data from disk into the memory buffer provided. */
@@ -88,7 +88,7 @@ public:
     return true;
   }
 
-  /** Writes the spacing and dimentions of the image.
+  /** Writes the spacing and dimensions of the image.
    * Assumes SetFileName has been called with a valid file name. */
   void WriteImageInformation() ITK_OVERRIDE;
 
diff --git a/Modules/IO/IORAD/src/otbRADImageIO.cxx b/Modules/IO/IORAD/src/otbRADImageIO.cxx
index 98fcf67..185d34c 100644
--- a/Modules/IO/IORAD/src/otbRADImageIO.cxx
+++ b/Modules/IO/IORAD/src/otbRADImageIO.cxx
@@ -113,7 +113,7 @@ bool RADImageIO::CanReadFile(const char* filename)
     }
 
   //Read header information
-  bool lResult = InternalReadHeaderInformation(lFileName, header_file, false);
+  bool lResult = InternalReadHeaderInformation(lFileName, header_file, true);
   header_file.close();
   return (lResult);
 }
@@ -408,7 +408,7 @@ bool RADImageIO::InternalReadHeaderInformation(const std::string& file_name, std
       {
       itkExceptionMacro(
         << "RAD : the value type '" << lStrCodePix <<
-        "' (second line) set in the header file is not reconized as correct value.");
+        "' (second line) set in the header file is not recognized as correct value.");
       }
     else
       {
@@ -416,7 +416,7 @@ bool RADImageIO::InternalReadHeaderInformation(const std::string& file_name, std
       }
     }
 
-  // Read "SENSCODAGE" information (optionnal)
+  // Read "SENSCODAGE" information (optional)
   file >> lString;
   if (lString.empty() == false)
     {
@@ -439,7 +439,7 @@ bool RADImageIO::InternalReadHeaderInformation(const std::string& file_name, std
           {
           itkExceptionMacro(
             << "RAD : the value SENSCODAGE '" << lString <<
-            "' set in the header file is not reconized as correct value. Possible values are INTEL or IEEE");
+            "' set in the header file is not recognized as correct value. Possible values are INTEL or IEEE");
           }
         else
           {
diff --git a/Modules/IO/IOTileMap/include/otbTileMapImageIO.h b/Modules/IO/IOTileMap/include/otbTileMapImageIO.h
index 63cace8..737075b 100644
--- a/Modules/IO/IOTileMap/include/otbTileMapImageIO.h
+++ b/Modules/IO/IOTileMap/include/otbTileMapImageIO.h
@@ -30,12 +30,14 @@
 
 #include "otbCurlHelperInterface.h"
 
+#include "OTBIOTileMapExport.h"
+
 namespace otb
 {
 
-namespace TileMapAdressingStyle
+namespace TileMapAddressingStyle
 {
-enum TileMapAdressingStyle {GM = 0, OSM = 1, NEARMAP = 2, LOCAL = 3};
+enum TileMapAddressingStyle {GM = 0, OSM = 1, NEARMAP = 2, LOCAL = 3};
 }
 
 /** \class TileMapImageIO
@@ -46,7 +48,7 @@ enum TileMapAdressingStyle {GM = 0, OSM = 1, NEARMAP = 2, LOCAL = 3};
  *
  * \ingroup OTBIOTileMap
  */
-class ITK_EXPORT TileMapImageIO : public otb::ImageIOBase
+class OTBIOTileMap_EXPORT TileMapImageIO : public otb::ImageIOBase
 {
 public:
 
@@ -213,7 +215,7 @@ private:
   std::string                                  m_CacheDirectory;
   std::string                                  m_ServerName;
   std::string                                  m_FileSuffix;
-  TileMapAdressingStyle::TileMapAdressingStyle m_AddressMode;
+  TileMapAddressingStyle::TileMapAddressingStyle m_AddressMode;
 
   bool m_FlagWriteImageInformation;
 
diff --git a/Modules/IO/IOTileMap/include/otbTileMapImageIOFactory.h b/Modules/IO/IOTileMap/include/otbTileMapImageIOFactory.h
index eb93425..464ecb4 100644
--- a/Modules/IO/IOTileMap/include/otbTileMapImageIOFactory.h
+++ b/Modules/IO/IOTileMap/include/otbTileMapImageIOFactory.h
@@ -20,6 +20,7 @@
 #define otbTileMapImageIOFactory_h
 
 #include "itkObjectFactoryBase.h"
+#include "OTBIOTileMapExport.h"
 
 namespace otb
 {
@@ -28,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBIOTileMap
  */
-class ITK_EXPORT TileMapImageIOFactory : public itk::ObjectFactoryBase
+class OTBIOTileMap_EXPORT TileMapImageIOFactory : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/IO/IOTileMap/include/otbTileMapImageIOHelper.h b/Modules/IO/IOTileMap/include/otbTileMapImageIOHelper.h
index e4f645c..bfc84e5 100644
--- a/Modules/IO/IOTileMap/include/otbTileMapImageIOHelper.h
+++ b/Modules/IO/IOTileMap/include/otbTileMapImageIOHelper.h
@@ -26,6 +26,8 @@
 #include <iostream>
 #include <sstream>
 
+#include "OTBIOTileMapExport.h"
+
 namespace otb
 {
 
@@ -36,7 +38,7 @@ namespace otb
  * \ingroup OTBIOTileMap
  */
 
-class TileMapImageIOHelper: public itk::Object
+class OTBIOTileMap_EXPORT TileMapImageIOHelper: public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -48,7 +50,7 @@ public:
   itkTypeMacro(TileMapImageIOHelper, itk::Object);
   itkNewMacro(Self);
 
-  /** Correspondance between depth and scale for the quad tree paradigm*/
+  /** Correspondence between depth and scale for the quad tree paradigm*/
   const std::string ConvertDepthToScale(const unsigned int depth) const;
 
 protected:
diff --git a/Modules/IO/IOTileMap/otb-module.cmake b/Modules/IO/IOTileMap/otb-module.cmake
index 5d61a21..f800106 100644
--- a/Modules/IO/IOTileMap/otb-module.cmake
+++ b/Modules/IO/IOTileMap/otb-module.cmake
@@ -2,6 +2,7 @@ set(DOCUMENTATION "This module contains features to read and write TileMap
 format images.")
 
 otb_module(OTBIOTileMap
+ENABLE_SHARED
   DEPENDS
     OTBITK
     OTBImageBase
diff --git a/Modules/IO/IOTileMap/src/otbTileMapImageIO.cxx b/Modules/IO/IOTileMap/src/otbTileMapImageIO.cxx
index 41d6044..ac41170 100644
--- a/Modules/IO/IOTileMap/src/otbTileMapImageIO.cxx
+++ b/Modules/IO/IOTileMap/src/otbTileMapImageIO.cxx
@@ -76,7 +76,7 @@ TileMapImageIO::TileMapImageIO()
   m_ServerName = "";
   m_CacheDirectory = ".";
   m_FileSuffix = "png";
-  m_AddressMode = TileMapAdressingStyle::OSM;
+  m_AddressMode = TileMapAddressingStyle::OSM;
 
   m_FileNameIsServerName = false;
 
@@ -246,7 +246,7 @@ void TileMapImageIO::GenerateURL(double x, double y)
   std::ostringstream urlStream;
 
   // Google Map
-  if (m_AddressMode == TileMapAdressingStyle::GM)
+  if (m_AddressMode == TileMapAddressingStyle::GM)
     {
     std::ostringstream quad;
     XYToQuadTree(x, y, quad);
@@ -255,7 +255,7 @@ void TileMapImageIO::GenerateURL(double x, double y)
     urlStream << quad.str();
     }
   // Open Street Map
-  else if (m_AddressMode == TileMapAdressingStyle::OSM)
+  else if (m_AddressMode == TileMapAddressingStyle::OSM)
     {
     urlStream << m_ServerName;
     urlStream << m_Depth;
@@ -266,7 +266,7 @@ void TileMapImageIO::GenerateURL(double x, double y)
     urlStream << "." << m_FileSuffix;
     }
   // Near Map
-  else if (m_AddressMode == TileMapAdressingStyle::NEARMAP)
+  else if (m_AddressMode == TileMapAddressingStyle::NEARMAP)
     {
     urlStream << m_ServerName;
     urlStream << "hl=en&x=";
@@ -278,7 +278,7 @@ void TileMapImageIO::GenerateURL(double x, double y)
     urlStream << "&nml=Vert&s=Ga";
     }
   // Local addressing
-  else if (m_AddressMode == TileMapAdressingStyle::LOCAL)
+  else if (m_AddressMode == TileMapAddressingStyle::LOCAL)
     {
     std::ostringstream quad, filename;
     XYToQuadTree2(x, y, quad);
@@ -449,16 +449,16 @@ void TileMapImageIO::ReadImageInformation()
     switch (atoi(mode.c_str()))
       {
       case 0:
-        m_AddressMode = TileMapAdressingStyle::GM;
+        m_AddressMode = TileMapAddressingStyle::GM;
         break;
       case 1:
-        m_AddressMode = TileMapAdressingStyle::OSM;
+        m_AddressMode = TileMapAddressingStyle::OSM;
         break;
       case 2:
-        m_AddressMode = TileMapAdressingStyle::NEARMAP;
+        m_AddressMode = TileMapAddressingStyle::NEARMAP;
         break;
       case 3:
-        m_AddressMode = TileMapAdressingStyle::LOCAL;
+        m_AddressMode = TileMapAddressingStyle::LOCAL;
         break;
       default:
         itkExceptionMacro(<< "Addressing style unknown");
@@ -480,30 +480,30 @@ void TileMapImageIO::ReadImageInformation()
     if (m_ServerName == osmServer)
       {
       m_FileSuffix = "png";
-      m_AddressMode = TileMapAdressingStyle::OSM;
+      m_AddressMode = TileMapAddressingStyle::OSM;
       }
     else if (m_ServerName == nmServer)
       {
       m_FileSuffix = "jpg";
-      m_AddressMode = TileMapAdressingStyle::NEARMAP;
+      m_AddressMode = TileMapAddressingStyle::NEARMAP;
       }
     else if (m_ServerName == otbServer1)
       {
       m_FileSuffix = "jpg";
-      m_AddressMode = TileMapAdressingStyle::LOCAL;
+      m_AddressMode = TileMapAddressingStyle::LOCAL;
       }
     else
       {
       m_FileSuffix = "jpg";
-      m_AddressMode = TileMapAdressingStyle::GM;
+      m_AddressMode = TileMapAddressingStyle::GM;
       }
 
-    // File suffix and addres mode must be set with accessors
+    // File suffix and address mode must be set with accessors
     otbMsgDevMacro(<< "File parameters: " << m_ServerName << " " << m_FileSuffix << " " << m_AddressMode);
     }
 
   // The OSM tiles are 4 bands png, while HillShade & NearMap are 3 bands jpeg
-  if (m_AddressMode == TileMapAdressingStyle::OSM)
+  if (m_AddressMode == TileMapAddressingStyle::OSM)
     this->SetNumberOfComponents(4);
   else
     this->SetNumberOfComponents(3);
diff --git a/Modules/IO/IOXML/include/otbStatisticsXMLFileReader.h b/Modules/IO/IOXML/include/otbStatisticsXMLFileReader.h
index 371b8b4..ed5111b 100644
--- a/Modules/IO/IOXML/include/otbStatisticsXMLFileReader.h
+++ b/Modules/IO/IOXML/include/otbStatisticsXMLFileReader.h
@@ -27,7 +27,7 @@ namespace otb {
  *
  * To get a specific statistic Measurement vector, use the method
  * GetStatisticVectorByName(name) which allow you to get the
- * Measurement vector for the statistic set as paramater.
+ * Measurement vector for the statistic set as parameter.
  *
  *
  *
diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.h b/Modules/IO/ImageIO/include/otbImageFileReader.h
index a7d4ab9..01461c8 100644
--- a/Modules/IO/ImageIO/include/otbImageFileReader.h
+++ b/Modules/IO/ImageIO/include/otbImageFileReader.h
@@ -73,7 +73,7 @@ public:
  * It interfaces with an ImageIO class to read in the data and
  * supports streaming (partial reading) if the source dataset does so.
  *
- * ImageFileReader supports extended filenames, which allow controling
+ * ImageFileReader supports extended filenames, which allow controlling
  * how the source dataset is read. See
  * http://wiki.orfeo-toolbox.org/index.php/ExtendedFileName for more
  * information.
@@ -172,13 +172,16 @@ private:
       ImageIO classes for actually reading the file. If the file
       doesn't exist or it is not readable, and exception with an
       appropriate message will be thrown. */
-  void TestFileExistanceAndReadability();
+  void TestFileExistenceAndReadability();
 
   /** Generate the filename (for GDALImageI for example). If filename is a directory, look if is a
     * CEOS product (file "DAT...") In this case, the GdalFileName contain the open image file.
     */
   bool GetGdalReadImageFileName(const std::string& filename, std::string& GdalFileName);
 
+  // Retrieve the real source file name if derived dataset */
+  std::string GetDerivedDatasetSourceFileName(const std::string& filename) const;
+  
   ImageFileReader(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
@@ -199,6 +202,8 @@ private:
   FNameHelperType::Pointer m_FilenameHelper;
 
   unsigned int m_AdditionalNumber;
+
+  bool m_KeywordListUpToDate;
 };
 
 } //namespace otb
diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.txx b/Modules/IO/ImageIO/include/otbImageFileReader.txx
index 8bd6e7a..141f5f7 100644
--- a/Modules/IO/ImageIO/include/otbImageFileReader.txx
+++ b/Modules/IO/ImageIO/include/otbImageFileReader.txx
@@ -24,6 +24,7 @@
 #include "otbSystem.h"
 #include <itksys/SystemTools.hxx>
 #include <fstream>
+#include <string>
 
 #include "itkImageIOFactory.h"
 #include "itkPixelTraits.h"
@@ -40,6 +41,9 @@
 namespace otb
 {
 
+static const char DerivedSubdatasetPrefix[] = "DERIVED_SUBDATASET:";
+static const size_t DerivedSubdatasetPrefixLength = sizeof(DerivedSubdatasetPrefix);
+
 template<class T>
 bool PixelIsComplex(const std::complex<T>& /*dummy*/)
 {
@@ -61,7 +65,8 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
    m_ExceptionMessage(""),
    m_ActualIORegion(),
    m_FilenameHelper(FNameHelperType::New()),
-   m_AdditionalNumber(0)
+   m_AdditionalNumber(0),
+   m_KeywordListUpToDate(false)
 {
 }
 
@@ -122,7 +127,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
 
   // Test if the file exist and if it can be open.
   // An exception will be thrown otherwise.
-  this->TestFileExistanceAndReadability();
+  this->TestFileExistenceAndReadability();
 
   // Tell the ImageIO to read the file
   OutputImagePixelType *buffer =
@@ -259,28 +264,26 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
   // Update FileName
   this->m_FileName = lFileName;
 
-  std::string lFileNameOssimKeywordlist = this->m_FileName;
-
   // Test if the file exists and if it can be opened.
   // An exception will be thrown otherwise.
   // We catch the exception because some ImageIO's may not actually
   // open a file. Still reports file error if no ImageIO is loaded.
-
+  
   try
     {
     m_ExceptionMessage = "";
-    this->TestFileExistanceAndReadability();
+    this->TestFileExistenceAndReadability();
     }
   catch (itk::ExceptionObject & err)
     {
     m_ExceptionMessage = err.GetDescription();
     }
-
+  
   if (this->m_UserSpecifiedImageIO == false)   //try creating via factory
     {
     this->m_ImageIO = ImageIOFactory::CreateImageIO(this->m_FileName.c_str(), otb::ImageIOFactory::ReadMode);
     }
-
+  
   if (this->m_ImageIO.IsNull())
     {
     //this->Print(std::cerr);
@@ -421,25 +424,30 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
   output->SetOrigin(origin);         // Set the image origin
   output->SetDirection(direction);   // Set the image direction cosines
 
-  // Update otb Keywordlist
-  ImageKeywordlist otb_kwl;
-  if (!m_FilenameHelper->ExtGEOMFileNameIsSet())
-    {
-    otb_kwl = ReadGeometryFromImage(lFileNameOssimKeywordlist,!m_FilenameHelper->GetSkipRpcTag());
-    otbMsgDevMacro(<< "Loading internal kwl");
-    }
-  else
-    {
-    otb_kwl = ReadGeometryFromGEOMFile(m_FilenameHelper->GetExtGEOMFileName());
-    otbMsgDevMacro(<< "Loading external kwl");
-    }
-
-  // Don't add an empty ossim keyword list
-  if(!otb_kwl.Empty())
+  if(!m_KeywordListUpToDate && !m_FilenameHelper->GetSkipGeom())
     {
+    
+    std::string lFileNameOssimKeywordlist = GetDerivedDatasetSourceFileName(m_FileName);
+  
+    // Update otb Keywordlist
+    ImageKeywordlist otb_kwl;
+    if (!m_FilenameHelper->ExtGEOMFileNameIsSet())
+      {
+      otb_kwl = ReadGeometryFromImage(lFileNameOssimKeywordlist,!m_FilenameHelper->GetSkipRpcTag());
+      otbMsgDevMacro(<< "Loading internal kwl");
+      }
+    else
+      {
+      otb_kwl = ReadGeometryFromGEOMFile(m_FilenameHelper->GetExtGEOMFileName());
+      otbMsgDevMacro(<< "Loading external kwl");
+      }
+    
+    // Don't add an empty ossim keyword list
+    if(!otb_kwl.Empty())
+      {
       itk::EncapsulateMetaData<ImageKeywordlist>(dict,
                                                  MetaDataKey::OSSIMKeywordlistKey, otb_kwl);
-    }
+      }
   /*else
     {
     //
@@ -480,6 +488,21 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
       }
     }*/
 
+    m_KeywordListUpToDate = true;
+    }
+  else
+    {
+    // Read back from existing dictionary
+    ImageKeywordlist otb_kwl;
+    itk::ExposeMetaData<ImageKeywordlist>(this->GetOutput()->GetMetaDataDictionary(),
+                                                 MetaDataKey::OSSIMKeywordlistKey,otb_kwl);
+    // And add to new one
+    itk::EncapsulateMetaData<ImageKeywordlist>(dict,
+                                                 MetaDataKey::OSSIMKeywordlistKey, otb_kwl);
+
+    }
+
+  
   // If Skip ProjectionRef is activated, remove ProjRef from dict
   if (m_FilenameHelper->GetSkipCarto())
     {
@@ -525,9 +548,30 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
 }
 
 template <class TOutputImage, class ConvertPixelTraits>
+std::string
+ImageFileReader<TOutputImage, ConvertPixelTraits>
+::GetDerivedDatasetSourceFileName(const std::string & filename) const
+{
+  
+  const size_t dsds_pos = filename.find(DerivedSubdatasetPrefix);
+  
+  if(dsds_pos != std::string::npos)
+      {
+      // Derived subdataset from gdal
+      const size_t alg_pos = filename.find(":",dsds_pos+DerivedSubdatasetPrefixLength);
+      if (alg_pos != std::string::npos)
+        {
+        std::string sourceFilename = filename.substr(alg_pos+1,filename.size() - alg_pos);
+        return sourceFilename;
+        }
+      }
+  return filename;
+}
+
+template <class TOutputImage, class ConvertPixelTraits>
 void
 ImageFileReader<TOutputImage, ConvertPixelTraits>
-::TestFileExistanceAndReadability()
+::TestFileExistenceAndReadability()
 {
   // Test if the file a server name : if so the test is skipped
   if (this->m_FileName.find(std::string("http://")) == 0 ||
@@ -536,13 +580,15 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
     return;
     }
 
+  std::string fileToCheck = GetDerivedDatasetSourceFileName(m_FileName);
+  
   // Test if the file exists.
-  if (!itksys::SystemTools::FileExists(this->m_FileName.c_str()))
+  if (!itksys::SystemTools::FileExists(fileToCheck.c_str()))
     {
     otb::ImageFileReaderException e(__FILE__, __LINE__);
     std::ostringstream msg;
     msg << "The file doesn't exist. "
-        << std::endl << "Filename = " << this->m_FileName
+        << std::endl << "Filename = " << fileToCheck
         << std::endl;
     e.SetDescription(msg.str().c_str());
     throw e;
@@ -551,16 +597,16 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
 
   // Test if the file can be open for reading access.
   //Only if m_FileName specify a filename (not a dirname)
-  if (itksys::SystemTools::FileExists(this->m_FileName.c_str(), true) == true)
+  if (itksys::SystemTools::FileExists(fileToCheck.c_str(), true))
     {
     std::ifstream readTester;
-    readTester.open(this->m_FileName.c_str());
+    readTester.open(fileToCheck.c_str());
     if (readTester.fail())
       {
       readTester.close();
       std::ostringstream msg;
       msg << "The file couldn't be opened for reading. "
-          << std::endl << "Filename: " << this->m_FileName
+          << std::endl << "Filename: " << fileToCheck
           << std::endl;
       otb::ImageFileReaderException e(__FILE__, __LINE__, msg.str().c_str(), ITK_LOCATION);
       throw e;
@@ -619,7 +665,6 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
       //Supprime l'extension
       GdalFileName = System::GetRootName(strFileName);
       }
-
     else
       {
       // Sinon le filename est le nom du fichier a ouvrir
@@ -627,6 +672,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
       }
     fic_trouve = true;
     }
+  
   otbMsgDevMacro(<< "lFileNameGdal : " << GdalFileName.c_str());
   otbMsgDevMacro(<< "fic_trouve : " << fic_trouve);
   return (fic_trouve);
@@ -643,13 +689,55 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
 template <class TOutputImage, class ConvertPixelTraits>
 void
 ImageFileReader<TOutputImage, ConvertPixelTraits>
-::SetFileName(const char* extendedFileName)
+::SetFileName(const char* in)
 {
-  if (extendedFileName)
+  const std::string skip_geom_key = "skipgeom";
+  const std::string geom_key = "geom";
+  
+  if (in)
     {
-    this->m_FilenameHelper->SetExtendedFileName(extendedFileName);
-    this->m_FileName = this->m_FilenameHelper->GetSimpleFileName();
-    this->Modified();
+    // First, see if the simple filename has changed
+    typename FNameHelperType::Pointer helper = FNameHelperType::New();
+    
+    helper->SetExtendedFileName(in);
+    std::string simpleFileName = helper->GetSimpleFileName();
+
+    if(simpleFileName == this->m_FileName)
+      {
+      // Then, see if the option map changed
+      const typename ExtendedFilenameHelper::OptionMapType & newMap = helper->GetOptionMap();
+      const typename ExtendedFilenameHelper::OptionMapType & oldMap = m_FilenameHelper->GetOptionMap();
+
+      // Both maps are not completely the same
+      if(oldMap.size() != newMap.size() || !std::equal(oldMap.begin(),oldMap.end(),newMap.begin()))
+        {
+        this->Modified();
+        
+        // Now check if keywordlist needs to be generated again
+        // Condition is: one of the old or new map has the skip_geom
+        // key and the other does not
+        // OR
+        // one of the old or new map has the geom key and the other
+        // does not
+        // OR
+        // both have the geom key but the geom value is different
+        if((oldMap.count(skip_geom_key) != newMap.count(skip_geom_key))
+           || (oldMap.count(geom_key) != newMap.count(geom_key))
+           || ((oldMap.count(geom_key) && newMap.count(geom_key))
+               && oldMap.find(geom_key)->second != newMap.find(geom_key)->second))
+          {
+          m_KeywordListUpToDate = false;
+          }
+        }
+      }
+    else
+      {
+      this->m_FileName = simpleFileName;
+      m_KeywordListUpToDate = false;
+      this->Modified();
+      }
+    
+    m_FilenameHelper = helper;
     }
 }
 
diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.h b/Modules/IO/ImageIO/include/otbImageFileWriter.h
index 07aedab..bbb1c4c 100644
--- a/Modules/IO/ImageIO/include/otbImageFileWriter.h
+++ b/Modules/IO/ImageIO/include/otbImageFileWriter.h
@@ -31,7 +31,7 @@ namespace otb
  *
  * ImageFileWriter writes its input data to a single output file.
  * ImageFileWriter interfaces with an ImageIO class to write out the
- * data whith streaming process.
+ * data with streaming process.
  *
  * ImageFileWriter will divide the output into several pieces
  * (controlled by SetNumberOfDivisionsStrippedStreaming, SetNumberOfLinesStrippedStreaming,
@@ -43,7 +43,7 @@ namespace otb
  * ImageFileWriter will write directly the streaming buffer in the image file, so
  * that the output image never needs to be completely allocated
  *
- * ImageFileWriter supports extended filenames, which allow controling
+ * ImageFileWriter supports extended filenames, which allow controlling
  * some properties of the output file. See
  * http://wiki.orfeo-toolbox.org/index.php/ExtendedFileName for more
  * information.
diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.txx b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
index 0798c41..43912fa 100644
--- a/Modules/IO/ImageIO/include/otbImageFileWriter.txx
+++ b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
@@ -44,6 +44,8 @@
 
 #include "otb_boost_tokenizer_header.h"
 
+#include "otbStringUtils.h"
+
 namespace otb
 {
 
@@ -492,22 +494,17 @@ ImageFileWriter<TInputImage>
   /** Parse region size modes */
   if(m_FilenameHelper->BoxIsSet())
     {
-    typedef boost::tokenizer<boost::char_separator<char> > Tokenizer;
-
-    boost::char_separator<char> sep(":");
-    Tokenizer tokens(m_FilenameHelper->GetBox(), sep);
-
-    Tokenizer::iterator it = tokens.begin();
-    typename InputImageRegionType::IndexType start;
+ 	std::vector<int> boxVector;
+ 	Utils::ConvertStringToVector( 
+ 	m_FilenameHelper->GetBox(), boxVector, "ExtendedFileName:box", ":");
+ 	
+ 	typename InputImageRegionType::IndexType start;
     typename InputImageRegionType::SizeType  size;
 
-    start[0] = atoi(it->c_str());  // first index on X
-    ++it;
-    start[1] = atoi(it->c_str());  // first index on Y
-    ++it;
-    size[0]  = atoi(it->c_str());  // size along X
-    ++it;
-    size[1]  = atoi(it->c_str());  // size along Y
+    start[0] = boxVector[0];  // first index on X
+    start[1] = boxVector[1];  // first index on Y
+    size[0]  = boxVector[2];  // size along X
+    size[1]  = boxVector[3];  // size along Y
 
     inputRegion.SetSize(size);
 
@@ -734,7 +731,7 @@ ImageFileWriter<TInputImage>
     Convert(m_ImageIO->GetIORegion(), ioRegion, m_ShiftOutputIndex);
   InputImageRegionType bufferedRegion = input->GetBufferedRegion();
 
-  // before this test, bad stuff would happend when they don't match
+  // before this test, bad stuff would happened when they don't match
   if (bufferedRegion != ioRegion)
     {
     if ( m_NumberOfDivisions > 1 || m_UserSpecifiedIORegion)
diff --git a/Modules/IO/ImageIO/include/otbImageSeriesFileReader.h b/Modules/IO/ImageIO/include/otbImageSeriesFileReader.h
index b9ce01a..2f30893 100644
--- a/Modules/IO/ImageIO/include/otbImageSeriesFileReader.h
+++ b/Modules/IO/ImageIO/include/otbImageSeriesFileReader.h
@@ -49,7 +49,7 @@ class ITK_EXPORT ImageSeriesFileReader
   : public ImageSeriesFileReaderBase<TImage, TInternalImage>
 {
 public:
-  /** Standart typedefs */
+  /** Standard typedefs */
   typedef ImageSeriesFileReader                             Self;
   typedef ImageSeriesFileReaderBase<TImage, TInternalImage> Superclass;
   typedef itk::SmartPointer<Self>                           Pointer;
@@ -124,7 +124,7 @@ protected:
   /** AllocateListOfComponents
    * Once MetaFile is read, allocation of lists are performed in SetFileName.
    * This allows specific (or global) initialization in the GenerateData methods,
-   * that the user may invoke throught GenerateOutput() or GenerateOutput( idx ).
+   * that the user may invoke through GenerateOutput() or GenerateOutput( idx ).
    */
   virtual void AllocateListOfComponents(void);
 
@@ -162,7 +162,7 @@ class ITK_EXPORT ImageSeriesFileReader<Image<TPixel, 2>, Image<TInternalPixel, 2
   : public ImageSeriesFileReaderBase<Image<TPixel, 2>, Image<TInternalPixel, 2> >
 {
 public:
-  /** Standart typedefs */
+  /** Standard typedefs */
   typedef ImageSeriesFileReader                                                  Self;
   typedef ImageSeriesFileReaderBase<Image<TPixel, 2>, Image<TInternalPixel, 2> > Superclass;
   typedef itk::SmartPointer<Self>                                                Pointer;
@@ -231,7 +231,7 @@ protected:
   /**
    * Once MetaFile is read, allocation of lists are performed in SetFileName.
    * This allows specific (or global) initialization in the GenerateData methods,
-   * that the user may invoke throught GenerateOutput() or GenerateOutput( idx ).
+   * that the user may invoke through GenerateOutput() or GenerateOutput( idx ).
    */
   virtual void AllocateListOfComponents(void);
 
@@ -268,7 +268,7 @@ class ITK_EXPORT ImageSeriesFileReader<Image<TPixel, 2>, VectorImage<TInternalPi
   : public ImageSeriesFileReaderBase<Image<TPixel, 2>, VectorImage<TInternalPixel, 2> >
 {
 public:
-  /** Standart typedefs */
+  /** Standard typedefs */
   typedef ImageSeriesFileReader                                                        Self;
   typedef ImageSeriesFileReaderBase<Image<TPixel, 2>, VectorImage<TInternalPixel, 2> > Superclass;
   typedef itk::SmartPointer<Self>                                                      Pointer;
@@ -337,7 +337,7 @@ protected:
   /**
    * Once MetaFile is read, allocation of lists are performed in SetFileName.
    * This allows specific (or global) initialization in the GenerateData methods,
-   * that the user may invoke throught GenerateOutput() or GenerateOutput( idx ).
+   * that the user may invoke through GenerateOutput() or GenerateOutput( idx ).
    */
   virtual void AllocateListOfComponents(void);
 
@@ -375,7 +375,7 @@ class ITK_EXPORT ImageSeriesFileReader<VectorImage<TPixel, 2>, VectorImage<TInte
   : public ImageSeriesFileReaderBase<VectorImage<TPixel, 2>, VectorImage<TInternalPixel, 2> >
 {
 public:
-  /** Standart typedefs */
+  /** Standard typedefs */
   typedef ImageSeriesFileReader                                                              Self;
   typedef ImageSeriesFileReaderBase<VectorImage<TPixel, 2>, VectorImage<TInternalPixel, 2> > Superclass;
   typedef itk::SmartPointer<Self>                                                            Pointer;
@@ -445,7 +445,7 @@ protected:
   /**
    * Once MetaFile is read, allocation of lists are performed in SetFileName.
    * This allows specific (or global) initialization in the GenerateData methods,
-   * that the user may invoke throught GenerateOutput() or GenerateOutput( idx ).
+   * that the user may invoke through GenerateOutput() or GenerateOutput( idx ).
    */
   void AllocateListOfComponents(void) ITK_OVERRIDE;
 
diff --git a/Modules/IO/ImageIO/include/otbImageSeriesFileReader.txx b/Modules/IO/ImageIO/include/otbImageSeriesFileReader.txx
index 4ecc611..127c445 100644
--- a/Modules/IO/ImageIO/include/otbImageSeriesFileReader.txx
+++ b/Modules/IO/ImageIO/include/otbImageSeriesFileReader.txx
@@ -57,7 +57,7 @@ ImageSeriesFileReader<TImage, TInternalImage>
 }
 
 /* **********************************************************
- * Methods that are specific to instanciation with Image type
+ * Methods that are specific to instantiation with Image type
  * **********************************************************
  */
 
@@ -141,7 +141,7 @@ ImageSeriesFileReader<Image<TPixel, 2>, Image<TInternalPixel, 2> >
 }
 
 /* *********************************************************************
- * Methods that are specific to instanciation with Image type for TImage
+ * Methods that are specific to instantiation with Image type for TImage
  * and VectorImage as TInternalImage
  * *********************************************************************
  */
@@ -223,7 +223,7 @@ ImageSeriesFileReader<Image<TPixel, 2>, VectorImage<TInternalPixel, 2> >
 }
 
 /* ******************************************************************
- * Methods that are specific to instanciation with VectorImage types
+ * Methods that are specific to instantiation with VectorImage types
  * ******************************************************************
  */
 
diff --git a/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.h b/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.h
index 50c579f..c40659b 100644
--- a/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.h
+++ b/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.h
@@ -63,7 +63,7 @@ class ITK_EXPORT ImageSeriesFileReaderBase
   : public ImageListSource<TImage>
 {
 public:
-  /** Standart typedefs */
+  /** Standard typedefs */
   typedef ImageSeriesFileReaderBase     Self;
   typedef ImageListSource<TImage>       Superclass;
   typedef itk::SmartPointer<Self>       Pointer;
@@ -154,7 +154,7 @@ protected:
    * If the filename to test is an imageFileName, the file name may be modified in
    * order to add the appropriated path
    */
-  virtual void TestFileExistanceAndReadability(std::string& file, FileType fileType);
+  virtual void TestFileExistenceAndReadability(std::string& file, FileType fileType);
   virtual void TestBandSelection(std::vector<unsigned int>& itkNotUsed(bands)) {}
 
   void GenerateData(void) ITK_OVERRIDE;
@@ -174,7 +174,7 @@ protected:
   /**
    * Once MetaFile is read, allocation of lists are performed in SetFileName.
    * This allows specific (or global) initialization in the GenerateData methods,
-   * that the user may invoke throught GenerateOutput() or GenerateOutput( idx ).
+   * that the user may invoke through GenerateOutput() or GenerateOutput( idx ).
    */
   virtual void AllocateListOfComponents(void);
 
diff --git a/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.txx b/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.txx
index 4ca00ae..ce0ac4f 100644
--- a/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.txx
+++ b/Modules/IO/ImageIO/include/otbImageSeriesFileReaderBase.txx
@@ -105,7 +105,7 @@ ImageSeriesFileReaderBase<TImage, TInternalImage>
   m_ListOfBandSelection.clear();
   m_ListOfRegionSelection.clear();
 
-  this->TestFileExistanceAndReadability(m_FileName, kFileName);
+  this->TestFileExistenceAndReadability(m_FileName, kFileName);
 
   std::string aLine;
   std::ifstream inputFile(m_FileName.c_str(), std::ios_base::in);
@@ -184,7 +184,7 @@ ImageSeriesFileReaderBase<TImage, TInternalImage>
     // Get the Image fileName
     // The test may modify image file name to add the path
     // Or throw an exception when not found nor readable
-    TestFileExistanceAndReadability(aLine, kImageFileName);
+    TestFileExistenceAndReadability(aLine, kImageFileName);
     m_ListOfFileNames.push_back(aLine);
     std::string imageFileName = aLine;
 
@@ -409,7 +409,7 @@ ImageSeriesFileReaderBase<TImage, TInternalImage>
 template <class TImage, class TInternalImage>
 void
 ImageSeriesFileReaderBase<TImage, TInternalImage>
-::TestFileExistanceAndReadability(std::string& file, FileType fileType)
+::TestFileExistenceAndReadability(std::string& file, FileType fileType)
 {
   // Test if the file exists.
   if (!itksys::SystemTools::FileExists(file.c_str()))
diff --git a/Modules/IO/ImageIO/test/CMakeLists.txt b/Modules/IO/ImageIO/test/CMakeLists.txt
index ecd67c8..1c35758 100644
--- a/Modules/IO/ImageIO/test/CMakeLists.txt
+++ b/Modules/IO/ImageIO/test/CMakeLists.txt
@@ -502,10 +502,11 @@ otb_add_test(NAME ioTvImageFileReaderServerNameOTBTest COMMAND otbImageIOTestDri
   ${OTB_DATA_ROOT}/Examples/osmfile.otb)
 set_property(TEST ioTvImageFileReaderServerNameOTBTest PROPERTY RESOURCE_LOCK web_access)
 
-otb_add_test(NAME ioTvImageFileReaderServerNameHTTPTest COMMAND otbImageIOTestDriver
-  otbImageFileReaderServerName
-  http://tile.openstreetmap.org/)
-set_property(TEST ioTvImageFileReaderServerNameHTTPTest PROPERTY RESOURCE_LOCK web_access)
+#dashboard_hell
+# otb_add_test(NAME ioTvImageFileReaderServerNameHTTPTest COMMAND otbImageIOTestDriver
+#   otbImageFileReaderServerName
+#   http://tile.openstreetmap.org/)
+# set_property(TEST ioTvImageFileReaderServerNameHTTPTest PROPERTY RESOURCE_LOCK web_access)
 
 otb_add_test(NAME ioTvPipelineMetadataHandlingTest COMMAND otbImageIOTestDriver
   --compare-metadata ${EPSILON_9}
@@ -1296,9 +1297,8 @@ otb_add_test(NAME  ioTvImageFileReaderIntHDR2LUM COMMAND otbImageIOTestDriver
 set_tests_properties(ioTvImageFileReaderIntHDR2LUM PROPERTIES DEPENDS ioTvImageFileReaderIntLUM2HDR)
 
 otb_add_test(NAME  ioTvImageFileReaderPNG2ENVI COMMAND otbImageIOTestDriver
-  --compare-image ${EPSILON_9}        ${TEMP}/ioImageFileReaderPNG2BSQ.hd
+  --compare-image ${EPSILON_9}        ${BASELINE}/ioImageFileReaderPNG2ENVI.hdr
                                 ${TEMP}/ioImageFileReaderPNG2ENVI.hdr
         otbImageFileReaderTest
         ${INPUTDATA}/cthead1.png
         ${TEMP}/ioImageFileReaderPNG2ENVI.hdr )
-set_tests_properties(ioTvImageFileReaderPNG2ENVI PROPERTIES DEPENDS ioTvImageFileReaderPNG2BSQ)
diff --git a/Modules/IO/ImageIO/test/otbVectorImageFileWriterTestWithoutInput.cxx b/Modules/IO/ImageIO/test/otbVectorImageFileWriterTestWithoutInput.cxx
index d0da342..802f41e 100644
--- a/Modules/IO/ImageIO/test/otbVectorImageFileWriterTestWithoutInput.cxx
+++ b/Modules/IO/ImageIO/test/otbVectorImageFileWriterTestWithoutInput.cxx
@@ -54,7 +54,7 @@ int otbVectorImageFileWriterScalarTestWithoutInputGeneric(int argc, char* argv[]
   typedef itk::ImageRegionIterator<ImageType> IteratorType;
   typedef otb::ImageFileWriter<ImageType>     WriterType;
 
-  // INSTANCIATIONS
+  // INSTANTIATIONS
   typename WriterType::Pointer writer = WriterType::New();
   typename ImageType::Pointer image = ImageType::New();
 
@@ -157,7 +157,7 @@ int otbVectorImageFileWriterComplexTestWithoutInputGeneric(int argc, char* argv[
   typedef itk::ImageRegionIterator<ImageType> IteratorType;
   typedef otb::ImageFileWriter<ImageType>     WriterType;
 
-  // INSTANCIATIONS
+  // INSTANTIATIONS
   typename WriterType::Pointer writer = WriterType::New();
   typename ImageType::Pointer image = ImageType::New();
 
diff --git a/Modules/IO/ImageIO/test/otbVectorImageStreamingFileWriterTestWithoutInput.cxx b/Modules/IO/ImageIO/test/otbVectorImageStreamingFileWriterTestWithoutInput.cxx
index 0811559..9fecb4b 100644
--- a/Modules/IO/ImageIO/test/otbVectorImageStreamingFileWriterTestWithoutInput.cxx
+++ b/Modules/IO/ImageIO/test/otbVectorImageStreamingFileWriterTestWithoutInput.cxx
@@ -54,7 +54,7 @@ int otbVectorImageStreamingFileWriterScalarTestWithoutInputGeneric(int argc, cha
   typedef itk::ImageRegionIterator<ImageType>          IteratorType;
   typedef otb::ImageFileWriter<ImageType>     WriterType;
 
-  // INSTANCIATIONS
+  // INSTANTIATIONS
   typename WriterType::Pointer writer = WriterType::New();
   typename ImageType::Pointer image = ImageType::New();
 
@@ -157,7 +157,7 @@ int otbVectorImageStreamingFileWriterComplexTestWithoutInputGeneric(int argc, ch
   typedef itk::ImageRegionIterator<ImageType>          IteratorType;
   typedef otb::ImageFileWriter<ImageType>     WriterType;
 
-  // INSTANCIATIONS
+  // INSTANTIATIONS
   typename WriterType::Pointer writer = WriterType::New();
   typename ImageType::Pointer image = ImageType::New();
 
diff --git a/Modules/IO/KMZWriter/include/otbKmzProductWriter.h b/Modules/IO/KMZWriter/include/otbKmzProductWriter.h
index 26f26ad..c34a217 100644
--- a/Modules/IO/KMZWriter/include/otbKmzProductWriter.h
+++ b/Modules/IO/KMZWriter/include/otbKmzProductWriter.h
@@ -34,7 +34,7 @@
 #include "otbStreamingShrinkImageFilter.h"
 #include "itkCastImageFilter.h"
 
-// Possiblity to includes vectordatas necessary includes
+// Possibility to includes vectordatas necessary includes
 #include "otbVectorData.h"
 #include "otbVectorDataFileWriter.h"
 
diff --git a/Modules/IO/KMZWriter/include/otbKmzProductWriter.txx b/Modules/IO/KMZWriter/include/otbKmzProductWriter.txx
index be28759..fa899ad 100644
--- a/Modules/IO/KMZWriter/include/otbKmzProductWriter.txx
+++ b/Modules/IO/KMZWriter/include/otbKmzProductWriter.txx
@@ -446,7 +446,7 @@ KmzProductWriter<TInputImage>
         m_Transform->SetInputKeywordList(m_ResampleVectorImage->GetImageKeywordlist());
         m_Transform->SetInputProjectionRef(m_VectorImage->GetProjectionRef());
         m_Transform->SetOutputProjectionRef(wgsRef);
-        m_Transform->InstanciateTransform();
+        m_Transform->InstantiateTransform();
 
         InputPointType  inputPoint;
         OutputPointType outputPoint;
@@ -586,7 +586,7 @@ KmzProductWriter<TInputImage>
         this->AddFileToKMZ(jpg_absolute_path, jpg_in_kmz);
         this->AddFileToKMZ(kml_absolute_path, kml_in_kmz);
 
-        // Remove the unecessary files with stdio method :remove
+        // Remove the unnecessary files with stdio method :remove
         if (remove(kml_absolute_path.str().c_str())  ||  remove(jpg_absolute_path.str().c_str()))
           {
           itkExceptionMacro(
diff --git a/Modules/IO/KMZWriter/test/otbKmzProductWriter.cxx b/Modules/IO/KMZWriter/test/otbKmzProductWriter.cxx
index 867350a..f030319 100644
--- a/Modules/IO/KMZWriter/test/otbKmzProductWriter.cxx
+++ b/Modules/IO/KMZWriter/test/otbKmzProductWriter.cxx
@@ -58,7 +58,7 @@ int otbKmzProductWriter(int argc, char* argv[])
   const char * demPath       = argv[2];
   const char * kmzFileName   = argv[3];
 
-  // Instanciate reader
+  // Instantiate reader
   ReaderType::Pointer reader = ReaderType::New();
   reader->SetFileName(infname);
 
@@ -150,7 +150,7 @@ int otbKmzProductWriterWithLogoAndLegend(int argc, char* argv[])
     return EXIT_FAILURE;
     }
 
-  // Instanciate reader
+  // Instantiate reader
   ReaderType::Pointer reader = ReaderType::New();
   reader->SetFileName(parseResult->GetInputImage());
 
diff --git a/Modules/IO/TestKernel/include/otbTestHelper.h b/Modules/IO/TestKernel/include/otbTestHelper.h
index f7efa67..898d5e1 100644
--- a/Modules/IO/TestKernel/include/otbTestHelper.h
+++ b/Modules/IO/TestKernel/include/otbTestHelper.h
@@ -26,6 +26,7 @@
 #include <vector>
 #include "itkObject.h"
 #include "itkObjectFactory.h"
+#include "otbStringUtils.h"
 
 #include "otbMetaDataKey.h"
 
@@ -64,7 +65,10 @@ public:
     m_ReportErrors(false),
     m_IgnoreLineOrder(false),
     m_MaxArea(1024*1024)
-  {}
+  {
+    m_SpecialTokens.push_back(std::pair<std::string,std::string>(
+      std::string("Integer"),std::string("Integer64")));
+  }
 
   ~TestHelper() ITK_OVERRIDE{}
 
@@ -78,6 +82,10 @@ public:
                              const StringList& testFilenamesAscii,
                              const StringList& ignoredLines);
 
+  int RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
+                             const StringList& testFilenamesAscii,
+                             const StringList& ignoredLines);
+
   int RegressionTestAllBinary(const StringList& baselineFilenamesBinary,
                               const StringList& testFilenamesBinary);
 
@@ -113,6 +121,11 @@ private:
                               const double epsilon,
                               std::vector<std::string> ignoredLines) const;
 
+  int RegressionTestDiffFile(const char * testAsciiFileName,
+                              const char * baselineAsciiFileName,
+                              const double epsilon,
+                              std::vector<std::string> ignoredLines) const;
+
   int RegressionTestMetaData(const char *testImageFilename,
                              const char *baselineImageFilename,
                              const double toleranceDiffPixelImage) const;
@@ -121,11 +134,19 @@ private:
   bool isHexaNumber(int i) const;
   bool isPoint(int i) const;
   bool isMinusSign(int i) const;
+  bool isAlphaNum(int i) const;
   bool isNumeric(const std::string& str) const;
   bool isScientificNumeric(const std::string& str) const;
   bool isHexaPointerAddress(const std::string& str) const;
+  bool isHexaPointerAddress(const std::string& str, size_t pos, size_t size) const;
   bool isToBeIgnoredForAnyComparison(const std::string& str) const;
   std::string VectorToString(const otb::MetaDataKey::VectorType& vector) const;
+  int TokenizeLine(const std::string &line, StringList &tokens) const;
+
+  static bool IsTokenEmpty(boost::iterator_range<std::string::const_iterator> &token);
+
+  // TODO : maybe merge this function with isToBeIgnoredForAnyComparison
+  bool IsLineValid(const std::string& str, const StringList &ignoredLines) const;
   //FIXME parameters have to be cleaned up later (this is the first step of refactoring)
   bool CompareLines(const std::string& strfileref,
                     const std::string& strfiletest,
@@ -152,6 +173,8 @@ private:
   const unsigned int m_MaxArea;
 
   void AddWhiteSpace(const std::string& strIn, std::string &strOut) const;
+
+  std::vector<std::pair<std::string, std::string> > m_SpecialTokens;
 };
 }
 
diff --git a/Modules/IO/TestKernel/include/otbTestMain.h b/Modules/IO/TestKernel/include/otbTestMain.h
index 3dd3dbf..42f7e89 100644
--- a/Modules/IO/TestKernel/include/otbTestMain.h
+++ b/Modules/IO/TestKernel/include/otbTestMain.h
@@ -380,7 +380,8 @@ int main(int ac, char* av[])
       // Non regression test for ascii files
       if ((baselineFilenamesAscii.size() > 0) && (testFilenamesAscii.size() > 0))
         {
-        result += testHelper->RegressionTestAllAscii(baselineFilenamesAscii, testFilenamesAscii, ignoredLines);
+        //result += testHelper->RegressionTestAllAscii(baselineFilenamesAscii, testFilenamesAscii, ignoredLines);
+        result += testHelper->RegressionTestAllDiff(baselineFilenamesAscii, testFilenamesAscii, ignoredLines);
         }
       /******************************************************************************/
       // Non regression test for binary files
diff --git a/Modules/IO/TestKernel/src/otbTestHelper.cxx b/Modules/IO/TestKernel/src/otbTestHelper.cxx
index 6dae89b..1d35bcb 100644
--- a/Modules/IO/TestKernel/src/otbTestHelper.cxx
+++ b/Modules/IO/TestKernel/src/otbTestHelper.cxx
@@ -21,6 +21,7 @@
 
 #include "otbTestHelper.h"
 #include "otbMacro.h"
+#include "otbStringUtils.h"
 #include <iostream>
 #include <fstream>
 #include <cctype>
@@ -244,6 +245,69 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
   return result;
 }
 
+int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
+                                       const StringList& testFilenamesAscii,
+                                       const StringList& ignoredLines)
+{
+  int result = 0;
+  // Creates iterators on baseline filenames vector and test filenames vector
+  StringListIt itbaselineFilenames = baselineFilenamesAscii.begin();
+  StringListIt itTestFilenames = testFilenamesAscii.begin();
+  StringListIt itIgnoredLines = ignoredLines.begin();
+
+  // Warning message
+  if (ignoredLines.size() > 0)
+    {
+    std::cout << "The lines containing the expressions ";
+    for (; itIgnoredLines != ignoredLines.end(); ++itIgnoredLines)
+      {
+      std::cout << (*itIgnoredLines) << " ";
+      }
+    std::cout << "are not considered" << std::endl;
+    }
+
+  // For each couple of baseline and test file, do the comparison
+  for (; (itbaselineFilenames != baselineFilenamesAscii.end())
+         && (itTestFilenames != testFilenamesAscii.end());
+       ++itbaselineFilenames, ++itTestFilenames)
+    {
+    std::string baselineFilenameAscii = (*itbaselineFilenames);
+    std::string testFilenameAscii = (*itTestFilenames);
+
+    std::map<std::string,
+             int> baselines =
+      this->RegressionTestBaselines(const_cast<char*>(baselineFilenameAscii.c_str()));
+    std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin();
+    int multiResult = 1;
+    std::cout << "Number of baseline files: " << baselines.size() << std::endl;
+    while (baseline != baselines.rend() && (multiResult != 0))
+      {
+      std::cout << "Testing non-regression on file: " << (baseline->first).c_str() << std::endl;
+      this->ReportErrorsOff();
+      baseline->second = this->RegressionTestDiffFile(testFilenameAscii.c_str(),
+                                                            (baseline->first).c_str(),
+                                                            m_Epsilon,
+                                                            ignoredLines);
+
+      multiResult = baseline->second;
+      ++baseline;
+      }
+    if (multiResult != 0)
+      {
+      baseline = baselines.rbegin();
+      this->ReportErrorsOn();
+      baseline->second
+        = this->RegressionTestDiffFile(testFilenameAscii.c_str(),
+                                             (baseline->first).c_str(),
+                                             m_Epsilon,
+                                             ignoredLines);
+      }
+    result += multiResult;
+    }
+
+  return result;
+}
+
 int TestHelper::RegressionTestAllBinary(const StringList& baselineFilenamesBinary,
                                         const StringList& testFilenamesBinary)
 {
@@ -566,6 +630,592 @@ int TestHelper::RegressionTestAsciiFile(const char * testAsciiFileName, const ch
   return (nbdiff != 0) ? 1 : 0;
 }
 
+int TestHelper::RegressionTestDiffFile(const char * testAsciiFileName, const char * baselineAsciiFileName,
+                                        const double epsilon, StringList ignoredLines) const
+{
+  typedef std::vector<boost::iterator_range<std::string::const_iterator> > TokenListType;
+  
+  std::ifstream fluxfiletest(testAsciiFileName);
+  std::ifstream fluxfileref(baselineAsciiFileName);
+
+  std::string diffAsciiFileName(testAsciiFileName);
+  diffAsciiFileName += ".diff.txt";
+  std::ofstream fluxfilediff;
+  if (m_ReportErrors)
+    {
+    fluxfilediff.open(diffAsciiFileName.c_str());
+    }
+
+  std::string strfiletest;
+  std::string strfileref;
+
+  int nbdiff(0);
+  if (!fluxfiletest)
+    {
+    itkGenericExceptionMacro(<< "Impossible to open the test ASCII file <" << testAsciiFileName << ">.");
+    }
+  if (!fluxfileref)
+    {
+    itkGenericExceptionMacro(<< "Impossible to open the baseline ASCII file <" << baselineAsciiFileName << ">.");
+    }
+
+  //fill up a vector of string, in which each element is one line of the file
+  StringList listLineFileRef;
+  StringList listLineFileTest;
+  while (std::getline(fluxfileref, strfileref))
+    {
+    listLineFileRef.push_back(strfileref);
+    }
+  fluxfileref.close();
+
+  while (std::getline(fluxfiletest, strfiletest))
+    {
+    listLineFileTest.push_back(strfiletest);
+    }
+  fluxfiletest.close();
+
+  if (m_IgnoreLineOrder)
+    {
+    std::sort(listLineFileRef.begin(), listLineFileRef.end());
+    std::sort(listLineFileTest.begin(), listLineFileTest.end());
+    }
+
+  //These are to save up the differences
+  StringList listStrDiffLineFile;
+
+  // filter ignored lines
+  // TODO
+  // filter lines with hexa address (isHexaPointerAddress)
+  // use  isToBeIgnoredForAnyComparison()
+
+  // Iterate over the baseline lines
+  unsigned int posTest = 0;
+  unsigned int posRef = 0;
+  unsigned int curPosTest;
+  TokenListType tokenRef;
+  TokenListType tokenTest;
+  TokenListType tokenTestSelected;
+  std::string separators(" \t,;:=[]{}()<>");
+  std::string emptyStr("");
+  unsigned int nbTokenRef = 0;
+  unsigned int nbTokenTest = 0;
+  unsigned int nbTokenTestSelected = 0;
+  bool isFirstMissingRefLine = true;
+
+  for (posRef=0 ; posRef<listLineFileRef.size() ; posRef++)
+    {
+    std::string &curLineRef = listLineFileRef[posRef];
+    if (!IsLineValid(curLineRef,ignoredLines))
+      {
+      continue;
+      }
+    boost::split(tokenRef, curLineRef, boost::is_any_of(separators));
+    // remove empty tokens
+    TokenListType::iterator refEndFiltered = std::remove_if(tokenRef.begin(), tokenRef.end(), IsTokenEmpty);
+    tokenRef.resize(refEndFiltered-tokenRef.begin());
+    nbTokenRef = tokenRef.size();
+    if (nbTokenRef == 0)
+      {
+      // ignore lines without tokens
+      continue;
+      }
+    unsigned int bestLinePos = posTest;
+    int bestCommonTokens = -1;
+    std::vector<unsigned int> validTestLines;
+    std::vector<unsigned int> skippedTestLines;
+    std::vector<unsigned int> differencesPosSelected;
+    for (curPosTest = posTest ; curPosTest < listLineFileTest.size() ; curPosTest++)
+      {
+      // stop searching after 30 lines tested
+      if (curPosTest > posTest + 30)
+        {
+        break;
+        }
+      std::string &curLineTest = listLineFileTest[curPosTest];
+      if (!IsLineValid(curLineTest,ignoredLines))
+        {
+        continue;
+        }
+      boost::split(tokenTest, curLineTest, boost::is_any_of(separators));
+      // remove empty tokens
+      TokenListType::iterator testEndFiltered = std::remove_if(tokenTest.begin(), tokenTest.end(), IsTokenEmpty);
+      tokenTest.resize(testEndFiltered-tokenTest.begin());
+      nbTokenTest = tokenTest.size();
+      if (nbTokenTest == 0)
+        {
+        // ignore lines without tokens
+        continue;
+        }
+      //if (curPosTest == posTest)
+      //  {
+      //  tokenTestSelected = tokenTest;
+      //  }
+
+      // from this point : the test line is considered valid
+      validTestLines.push_back(curPosTest);
+
+      // get number of equivalent separators and tokens to find the best match
+      int commonTokens = 0;
+      int firstCommonTokens = 0;
+      int firstNumericToken = -1;
+      unsigned int commonSeparators = 0;
+      std::vector<unsigned int> differencesPos;
+      for (unsigned int i = 0 ; i < std::min(nbTokenRef,nbTokenTest) ; i++)
+        {
+        //------ comparing previous separator ------
+        std::string sepRef("");
+        std::string sepTest("");
+        unsigned int endSepRef;
+        unsigned int endSepTest;
+        unsigned int startSepRef;
+        unsigned int startSepTest;
+        if (i)
+          {
+          startSepRef  = tokenRef[i-1].end() - curLineRef.begin();
+          startSepTest = tokenTest[i-1].end() - curLineTest.begin();
+          endSepRef  = tokenRef[i].begin() - curLineRef.begin();
+          endSepTest = tokenTest[i].begin() - curLineTest.begin();
+          }
+        else
+          {
+          startSepRef  = 0;
+          startSepTest = 0;
+          endSepRef  = tokenRef[0].begin() - curLineRef.begin();
+          endSepTest = tokenTest[0].begin() - curLineTest.begin();
+          }
+        for (unsigned int iRef=startSepRef ; iRef < endSepRef ; iRef++ )
+          {
+          if (curLineRef[iRef] != ' ' && curLineRef[iRef] != '\t')
+            sepRef += curLineRef[iRef];
+          }
+        for (unsigned int iTest=startSepTest ; iTest < endSepTest ; iTest++ )
+          {
+          if (curLineTest[iTest] != ' ' && curLineTest[iTest] != '\t')
+            sepTest += curLineTest[iTest];
+          }
+        if (sepRef.compare(sepTest) == 0)
+          {
+          commonSeparators++;
+          }
+        else
+          {
+          break;
+          }
+        // ----------- comparing current token --------------------
+        bool areTokensEquivalent = false;
+        // first : try direct string comparison
+        if (curLineRef.compare(
+              tokenRef[i].begin() - curLineRef.begin(),
+              tokenRef[i].size(),
+              curLineTest,
+              tokenTest[i].begin() - curLineTest.begin(),
+              tokenTest[i].size()) == 0)
+          {
+          areTokensEquivalent = true;
+          }
+        else
+          {
+          // examine other cases :
+          // test if hexadecimal address
+          bool isRefTokenHexa = isHexaPointerAddress(
+                                  curLineRef,
+                                  tokenRef[i].begin()-curLineRef.begin(),
+                                  tokenRef[i].size());
+          bool isTestTokenHexa = isHexaPointerAddress(
+                                  curLineTest,
+                                  tokenTest[i].begin()-curLineTest.begin(),
+                                  tokenTest[i].size());
+          if (isRefTokenHexa && isTestTokenHexa)
+            {
+            // these tokens are equivalent (we don't compare pointer address)
+            areTokensEquivalent = true;
+            }
+          else
+            {
+            double vTest=0.;
+            double vRef=0.;
+            double vNorm=0.;
+            // cast ref token
+            bool isRefTokenNum = true;
+            try
+              {
+              vRef = boost::lexical_cast<double>(tokenRef[i]);
+              // record the first numeric token position
+              if (firstNumericToken<0)
+                {
+                firstNumericToken = static_cast<int>(i);
+                }
+              }
+            catch (boost::bad_lexical_cast &)
+              {
+              isRefTokenNum = false;
+              }
+            // cast test token
+            bool isTestTokenNum = true;
+            try
+              {
+              vTest = boost::lexical_cast<double>(tokenTest[i]);
+              }
+            catch (boost::bad_lexical_cast &)
+              {
+              isTestTokenNum = false;
+              }
+            if (isRefTokenNum && isTestTokenNum)
+              {
+              // test difference against epsilon
+              vNorm = (vcl_abs(vRef) + vcl_abs(vTest)) * 0.5;
+              if ((vNorm <= m_EpsilonBoundaryChecking) //make sure that either the test of the ref are non 0
+                || (vcl_abs(vRef-vTest) <= epsilon * vNorm)) //epsilon as relative error
+                {
+                // these tokens are equivalent
+                areTokensEquivalent = true;
+                }
+              }
+            else
+              {
+              // test for special tokens
+              for (unsigned int j=0 ; j<m_SpecialTokens.size() ; j++)
+                {
+                if (curLineRef.compare(
+                      tokenRef[i].begin() - curLineRef.begin(),
+                      tokenRef[i].size(),
+                      m_SpecialTokens[j].first) == 0 &&
+                    curLineTest.compare(
+                      tokenTest[i].begin() - curLineTest.begin(),
+                      tokenTest[i].size(),
+                      m_SpecialTokens[j].second) == 0)
+                  {
+                  areTokensEquivalent = true;
+                  break;
+                  }
+                }
+              }
+            }
+          }
+        if (areTokensEquivalent)
+          {
+          commonTokens++;
+          if (differencesPos.empty())
+            {
+            firstCommonTokens++;
+            }
+          }
+        else
+          {
+          differencesPos.push_back(i);
+          }
+        }
+      // finish iteration of all tokens from reference line to detect first numeric token
+      for (unsigned int i = std::min(nbTokenRef,nbTokenTest) ; i < nbTokenRef ; i++)
+        {
+        try
+          {
+          boost::lexical_cast<double>(tokenRef[i]);
+          // record the first numeric token position
+          if (firstNumericToken<0)
+            {
+            firstNumericToken = static_cast<int>(i);
+            }
+          }
+        catch (boost::bad_lexical_cast &)
+          {
+          }
+        }
+
+      if (commonSeparators < std::min(nbTokenRef,nbTokenTest))
+        {
+        // All the separators are not equivalent : reject line
+        continue;
+        }
+      if (firstNumericToken > firstCommonTokens)
+        {
+        // if there are non-numeric tokens before a numeric one, all non-numeric
+        // tokens must match (we make sure to compare the same field name)
+        continue;
+        }
+      if (firstCommonTokens > bestCommonTokens)
+        {
+        bestCommonTokens = firstCommonTokens;
+        bestLinePos = curPosTest;
+        tokenTestSelected = tokenTest;
+        nbTokenTestSelected = nbTokenTest;
+        differencesPosSelected = differencesPos;
+        skippedTestLines.clear();
+        unsigned int k=0;
+        while (validTestLines[k] < curPosTest)
+          {
+          skippedTestLines.push_back(validTestLines[k]);
+          k++;
+          }
+        }
+      // test if lines are identic
+      if (static_cast<unsigned int>(firstCommonTokens) == std::max(nbTokenRef,nbTokenTest))
+        {
+        break;
+        }
+      }
+
+    // depending on the best number of common tokens ...
+    if (bestCommonTokens <= 0)
+      {
+      // line not found in test
+      if (isFirstMissingRefLine)
+        {
+        listStrDiffLineFile.push_back("   -------------------------------");
+        isFirstMissingRefLine = false;
+        }
+      listStrDiffLineFile.push_back(std::string("   Base << ")+curLineRef);
+      if (m_ReportErrors)
+        {
+        fluxfilediff << "In baseline l."<<posRef+1<<" : "<<curLineRef<< std::endl;
+        }
+      nbdiff++;
+      }
+    else
+      {
+      // record skipped lines in test file
+      for (unsigned int k=0 ; k < skippedTestLines.size() ; k++)
+        {
+        isFirstMissingRefLine = true;
+        if (k== 0)
+          listStrDiffLineFile.push_back("   -------------------------------");
+        listStrDiffLineFile.push_back(std::string("   Test >> ")+listLineFileTest[skippedTestLines[k]]);
+        if (m_ReportErrors)
+          {
+          fluxfilediff << "In test     l."<<skippedTestLines[k]+1<<" : "<<listLineFileTest[skippedTestLines[k]] << std::endl;
+          }
+        nbdiff++;
+        }
+
+      if (bestCommonTokens < static_cast<int>(std::max(nbTokenRef,nbTokenTestSelected)))
+        {
+        nbdiff++;
+        std::string &lineTestSelected = listLineFileTest[bestLinePos];
+        // record the diff
+        std::ostringstream ossBase;
+        std::ostringstream ossTest;
+        for (unsigned int k=0 ; k < std::min(nbTokenRef,nbTokenTestSelected) ; k++)
+          {
+          // record the separator
+          unsigned int sizeSepRef;
+          unsigned int startSepRef;
+          if (k)
+            {
+            startSepRef = tokenRef[k-1].end()-curLineRef.begin();
+            sizeSepRef = tokenRef[k].begin()-tokenRef[k-1].end();
+            }
+          else
+            {
+            startSepRef = 0;
+            sizeSepRef = tokenRef[0].begin()-curLineRef.begin();
+            }
+          ossBase << curLineRef.substr(startSepRef, sizeSepRef);
+          for (unsigned int j=0 ; j<sizeSepRef ; j++)
+            {
+            if (curLineRef[startSepRef+j] == '\t')
+              {
+              ossTest << "\t";
+              }
+            else
+              {
+              ossTest << " ";
+              }
+            }
+          // record the token
+          bool isTokenEquivalent = true;
+          for (unsigned int t=0 ; t < differencesPosSelected.size() ; t++)
+            {
+            if (k == differencesPosSelected[t])
+              {
+              isTokenEquivalent = false;
+              break;
+              }
+            }
+          if (isTokenEquivalent)
+            {
+            ossBase << curLineRef.substr(tokenRef[k].begin()-curLineRef.begin(),
+                                         tokenRef[k].size());
+            ossTest << std::string(tokenRef[k].size(), '_');
+            }
+          else
+            {
+            unsigned int maxTokenSize = std::max(tokenRef[k].size(),tokenTestSelected[k].size());
+            ossBase << curLineRef.substr(tokenRef[k].begin()-curLineRef.begin(),
+                                         tokenRef[k].size())
+                    << std::string(maxTokenSize - tokenRef[k].size(), ' ');
+            ossTest << lineTestSelected.substr(tokenTestSelected[k].begin()-lineTestSelected.begin(),
+                                               tokenTestSelected[k].size())
+                    << std::string(maxTokenSize - tokenTestSelected[k].size(), ' ');
+            }
+          }
+        // process token in excess on any side
+        if (nbTokenRef >= nbTokenTestSelected)
+          {
+          ossBase << curLineRef.substr(tokenRef[nbTokenTestSelected-1].end()-curLineRef.begin());
+          if (nbTokenRef > nbTokenTestSelected)
+            ossTest << "|";
+          }
+        else if (nbTokenRef < nbTokenTestSelected)
+          {
+          ossBase << "|";
+          ossTest << lineTestSelected.substr(tokenTestSelected[nbTokenRef-1].end()-lineTestSelected.begin());
+          }
+        listStrDiffLineFile.push_back("   -------------------------------");
+        listStrDiffLineFile.push_back(std::string("   Base << ")+ossBase.str());
+        listStrDiffLineFile.push_back(std::string("   Test >> ")+ossTest.str());
+        if (m_ReportErrors)
+          {
+          fluxfilediff << "In baseline l."<< posRef+1 <<" : "<< ossBase.str() << std::endl;
+          fluxfilediff << "In test     l."<< bestLinePos+1 << " : "<<ossTest.str() << std::endl;
+          }
+        isFirstMissingRefLine = true;
+        }
+
+      // update posTest
+      posTest = bestLinePos + 1;
+      }
+    }
+
+  // process remaining lines in test file
+  for (curPosTest = posTest ; curPosTest < listLineFileTest.size() ; curPosTest++)
+    {
+    std::string &curLineTest = listLineFileTest[curPosTest];
+    if (!IsLineValid(curLineTest,ignoredLines))
+      {
+      continue;
+      }
+    boost::split(tokenTest, curLineTest, boost::is_any_of(separators));
+    // remove empty tokens
+    TokenListType::iterator testEndFiltered = std::remove_if(tokenTest.begin(), tokenTest.end(), IsTokenEmpty);
+    tokenTest.resize(testEndFiltered-tokenTest.begin());
+    nbTokenTest = tokenTest.size();
+    if (nbTokenTest == 0)
+      {
+      // ignore lines without tokens
+      continue;
+      }
+    // this test line is valid
+    //listStrDiffLineFile.push_back("   -------------------------------");
+    listStrDiffLineFile.push_back(std::string("   Test >> ")+curLineTest);
+    if (m_ReportErrors)
+      {
+      fluxfilediff << "In test     l."<<curPosTest+1<<" : "<<curLineTest << std::endl;
+      }
+    nbdiff++;
+    }
+  
+  if (m_ReportErrors)
+    {
+    fluxfilediff.close();
+    }
+
+  if (nbdiff != 0 && m_ReportErrors)
+    {
+    std::cout << "<DartMeasurement name=\"ASCIIFileError\" type=\"numeric/int\">";
+    std::cout << nbdiff;
+    std::cout << "</DartMeasurement>" << std::endl;
+    std::cout << "================================================================" << std::endl;
+    std::cout << "baseline ASCII File : " << baselineAsciiFileName << std::endl;
+    std::cout << "Test ASCII File     : " << testAsciiFileName << std::endl;
+    std::cout << "Diff ASCII File     : " << diffAsciiFileName << std::endl;
+    std::cout << "Tolerance value     : " << epsilon << std::endl;
+    std::cout << "Tolerance max check : " << m_EpsilonBoundaryChecking << std::endl;
+    std::cout << "Nb lines different : " << nbdiff << std::endl;
+    
+    for (unsigned int i=0 ; i<listStrDiffLineFile.size() ; i++)
+      {
+      std::cout << listStrDiffLineFile[i] << std::endl;
+      }
+    }
+  
+  return (nbdiff != 0) ? 1 : 0;
+}
+
+bool TestHelper::IsTokenEmpty(boost::iterator_range<std::string::const_iterator> &token)
+{
+  return token.empty();
+}
+
+int TestHelper::TokenizeLine(const std::string &line, StringList &tokens) const
+{
+  std::string::size_type pos;
+  tokens.clear();
+  std::string::size_type counter = 0;
+  bool isSeparator;
+  bool isToken = false;
+  int curChar;
+  for (pos = 0 ; pos < line.size() ; pos++)
+    {
+    isSeparator = true;
+    curChar = (int)(line[pos]);
+    // test if alphanumeric or '.' or '-' or '^' or '_' or '/'
+    if (isAlphaNum(curChar) || isPoint(curChar) || isMinusSign(curChar) ||
+        curChar == 94 || curChar == 95 || curChar == 47)
+      {
+      isSeparator = false;
+      }
+
+    if (isToken)
+      {
+      // already in a token
+      if (isSeparator)
+        {
+        // end of the token : record it
+        tokens.push_back(line.substr(pos-counter, counter));
+        isToken = false;
+        counter = 0;tokens.push_back(line.substr(pos-counter, counter));
+        }
+      else
+        {
+        // still in a token
+        counter++;
+        }
+      }
+    else
+      {
+      // not in a token
+      if (isSeparator)
+        {
+        // do nothing
+        }
+      else
+        {
+        // start of a token
+        isToken = true;
+        counter++;
+        }
+      }
+    }
+  // handle final token
+  if (isToken)
+    {
+    tokens.push_back(line.substr(line.size()-counter, counter));
+    }
+
+  return tokens.size();
+}
+
+bool TestHelper::IsLineValid(const std::string& str, const StringList &ignoredLines) const
+{
+  bool ret = true;
+  if (isToBeIgnoredForAnyComparison(str))
+    {
+    ret = false;
+    }
+  else
+    {
+    for (unsigned int i=0 ; i<ignoredLines.size() ; i++)
+      {
+      if (str.find(ignoredLines[i]) != std::string::npos)
+        {
+        ret = false;
+        break;
+        }
+      }
+    }
+  return ret;
+}
+
 /******************************************/
 /******************************************/
 /******************************************/
@@ -868,7 +1518,7 @@ int TestHelper::RegressionTestMetaData(const char *testImageFilename, const char
   ImageType::Pointer blImPtr = baselineReader->GetOutput();
   ImageType::Pointer testImPtr = testReader->GetOutput();
 
-  // test orgin
+  // test origin
   if (blImPtr->GetOrigin() != testImPtr->GetOrigin())
     {
     std::cerr << "The origin of the baseline image and Test image do not match!" << std::endl;
@@ -1243,7 +1893,7 @@ int TestHelper::RegressionTestOgrFile(const char *testOgrFilename, const char *b
         OGRFeature::DestroyFeature( test_poFeature );
         fclose(test_f);
 
-        //Check ASCII comparaison
+        //Check ASCII comparison
         std::vector<std::string> ignoredLines;
         ignoredLines.clear();
         nbdiff = RegressionTestAsciiFile(test_filename.c_str(), ref_filename.c_str(), toleranceDiffValue,
@@ -1418,7 +2068,9 @@ bool TestHelper::isNumber(int i) const
 
 bool TestHelper::isHexaNumber(int i) const
 {
-  return (((i > 47) && (i < 58)) || ((i > 96) && (i < 103)));
+  return (((i > 47) && (i < 58)) ||
+          ((i > 96) && (i < 103)) ||
+          ((i > 64) && (i < 71)));
 }
 
 bool TestHelper::isPoint(int i) const
@@ -1431,6 +2083,11 @@ bool TestHelper::isMinusSign(int i) const
   return (i == 45);
 }
 
+bool TestHelper::isAlphaNum(int i) const
+{
+  return isNumber(i) || ((i > 64) && (i < 91)) || ((i > 96) && (i < 123));
+}
+
 bool TestHelper::isNumeric(const std::string& str) const
 {
   int          nbOfPoints = 0;
@@ -1556,6 +2213,40 @@ bool TestHelper::isHexaPointerAddress(const std::string& str) const
   return result;
 }
 
+bool TestHelper::isHexaPointerAddress(const std::string& str, size_t pos, size_t size) const
+{
+  if (size < 3)
+    {
+    return false;
+    }
+
+  // pointer address has to begin with '0x'
+  // it may also start with '00' with a size of 16 (64bit address)
+  // or start with '0' with a size of 8 (32bit address)
+  // Note: the last pattern seems a bit weak but cases like '00B5FA18' or
+  // '01C46D80' both are valid hexadecimal addresses on windows
+  if (str[pos] != 48)
+    {
+    return false;
+    }
+  if (!(str[pos+1] == 120 ||
+        (str[pos+1] == 48 && size == 16) ||
+        (size == 8)))
+    {
+    return false;
+    }
+
+  // check all other characters are in [A-Fa-f0-9]
+  for (unsigned int i=2 ; i<size ; i++)
+    {
+    if (!isHexaNumber(str[pos+i]))
+      {
+      return false;
+      }
+    }
+  return true;
+}
+
 void TestHelper::AddWhiteSpace(const std::string& strIn, std::string &strOut) const
 {
   std::string strLine = strIn;
diff --git a/Modules/IO/TestKernel/test/CMakeLists.txt b/Modules/IO/TestKernel/test/CMakeLists.txt
index 343470c..42197d1 100644
--- a/Modules/IO/TestKernel/test/CMakeLists.txt
+++ b/Modules/IO/TestKernel/test/CMakeLists.txt
@@ -4,6 +4,7 @@ set(OTBTestKernelTests
   otbCompareAsciiTests3.cxx
   otbCompareAsciiTests4.cxx
   otbCompareAsciiTests5.cxx
+  otbCompareAsciiTests6.cxx
   otbCompareAsciiTestScientificNotation.cxx
   otbCompareAsciiTests.cxx
   otbCompareAsciiTestsEpsilon3_WhiteSpace.cxx
@@ -114,3 +115,11 @@ otb_add_test(NAME tsTvCompareAsciiepsilon3_WhiteSpaceKO COMMAND otbTestKernelTes
   ${TEMP}/tsTvCompareAsciiEpsilon3_TestKO.txt
   )
 set_property(TEST tsTvCompareAsciiepsilon3_WhiteSpaceKO PROPERTY WILL_FAIL true)
+otb_add_test(NAME tsTvCompareAscii6 COMMAND otbTestKernelTestDriver
+  --compare-ascii ${EPSILON_3}
+  ${TEMP}/tsTvCompareAscii6_ref.txt
+  ${TEMP}/tsTvCompareAscii6_test.txt
+  otbCompareAsciiTests6
+  ${TEMP}/tsTvCompareAscii6_ref.txt
+  ${TEMP}/tsTvCompareAscii6_test.txt
+  )
diff --git a/Modules/IO/TestKernel/test/otbCompareAsciiTests6.cxx b/Modules/IO/TestKernel/test/otbCompareAsciiTests6.cxx
new file mode 100644
index 0000000..7897c29
--- /dev/null
+++ b/Modules/IO/TestKernel/test/otbCompareAsciiTests6.cxx
@@ -0,0 +1,48 @@
+/*=========================================================================
+
+  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 <iostream>
+#include <fstream>
+
+
+#include "otbMacro.h"
+
+int otbCompareAsciiTests6(int argc, char * argv[])
+{
+  if (argc != 3)
+    {
+    std::cerr << "Usage: " << argv[0];
+    std::cerr << " referenceFile testFile" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  std::ofstream fileRef;
+  fileRef.open(argv[1]);
+  fileRef << "ImageRegion (0x7fff1639a860)\n";
+  fileRef << "0x7fff1639a860\n";
+  fileRef << "0.142355\t:230\n";
+  fileRef.close();
+
+  std::ofstream fileTest;
+  fileTest.open(argv[2]);
+  fileTest << "ImageRegion (00C3F798)\n";
+  fileTest << "000000001AF56D20\n";
+  fileTest << "0.142356\t:230\n";
+  fileTest.close();
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/IO/TestKernel/test/otbTestKernelTestDriver.cxx b/Modules/IO/TestKernel/test/otbTestKernelTestDriver.cxx
index ad2f41f..96b3215 100644
--- a/Modules/IO/TestKernel/test/otbTestKernelTestDriver.cxx
+++ b/Modules/IO/TestKernel/test/otbTestKernelTestDriver.cxx
@@ -5,6 +5,7 @@ void RegisterTests()
   REGISTER_TEST(otbCompareAsciiTests3);
   REGISTER_TEST(otbCompareAsciiTests4);
   REGISTER_TEST(otbCompareAsciiTests5);
+  REGISTER_TEST(otbCompareAsciiTests6);
   REGISTER_TEST(otbCompareAsciiTestScientificNotation);
   REGISTER_TEST(otbCompareAsciiTests);
   REGISTER_TEST(otbCompareAsciiTestsEpsilon3_WhiteSpace);
diff --git a/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.h b/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.h
index 930ad72..db72d03 100644
--- a/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.h
+++ b/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.h
@@ -141,7 +141,7 @@ private:
   /** Test whether the given filename exist and it is readable.
       If the file doesn't exist or it is not readable, and exception with an
       appropriate message will be thrown. */
-  void TestFileExistanceAndReadability();
+  void TestFileExistenceAndReadability();
 
 };
 
diff --git a/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.txx b/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.txx
index 88b9250..bb82449 100644
--- a/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.txx
+++ b/Modules/IO/VectorDataIO/include/otbVectorDataFileReader.txx
@@ -56,11 +56,11 @@ VectorDataFileReader<TOutputVectorData>
      this is intended to be called before attempting to use
      VectorDataIO classes for actually reading the file. If the file
      doesn't exist or it is not readable, and exception with an
-     approriate message will be thrown. */
+     appropriate message will be thrown. */
 template <class TOutputVectorData>
 void
 VectorDataFileReader<TOutputVectorData>
-::TestFileExistanceAndReadability()
+::TestFileExistenceAndReadability()
 {
   // Test if the file exists.
   if (!itksys::SystemTools::FileExists(this->m_FileName.c_str()))
@@ -135,7 +135,7 @@ VectorDataFileReader<TOutputVectorData>
   try
     {
     m_ExceptionMessage = "";
-    this->TestFileExistanceAndReadability();
+    this->TestFileExistenceAndReadability();
     }
   catch (itk::ExceptionObject & err)
     {
@@ -198,7 +198,7 @@ VectorDataFileReader<TOutputVectorData>
   try
     {
     m_ExceptionMessage = "";
-    this->TestFileExistanceAndReadability();
+    this->TestFileExistenceAndReadability();
     }
   catch (itk::ExceptionObject & err)
     {
diff --git a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h b/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h
index 715f334..99789c0 100644
--- a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h
+++ b/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h
@@ -53,11 +53,11 @@ namespace otb
   * Fe(i), Fe(j) and Fe(k) being descriptors.
   *
   * The criterion can be set through SetCriterionFormula() as a
-  * string refering to "Belief" and "Plausibility" from the
+  * string referring to "Belief" and "Plausibility" from the
   * Dempster-Shafer theory. By default the criterion is:
   * "((Belief + Plausibility)/2) >= 0.5"
   *
-  * The concidered features will be the intersection between
+  * The considered features will be the intersection between
   * the features embedded in this filter and the features embedded
   * in the input vector data. For now, the filter uses "NONDVI" and
   * "ROADSA" features.
diff --git a/Modules/Learning/DempsterShafer/test/otbJointMassOfBeliefFilter.cxx b/Modules/Learning/DempsterShafer/test/otbJointMassOfBeliefFilter.cxx
index a26802c..0ed8295 100644
--- a/Modules/Learning/DempsterShafer/test/otbJointMassOfBeliefFilter.cxx
+++ b/Modules/Learning/DempsterShafer/test/otbJointMassOfBeliefFilter.cxx
@@ -120,7 +120,7 @@ int otbJointMassOfBeliefFilterLimit(int itkNotUsed(argc), char* itkNotUsed(argv)
   MassOfBeliefFunctionType::Pointer mass2 = MassOfBeliefFunctionType::New();
   JointMassOfBeliefFilterType::Pointer jointMassFilter = JointMassOfBeliefFilterType::New();
 
-  // Exemple from
+  // Example from
   // http://www.sandia.gov/epistemic/Reports/SAND2002-0835.pdf
   // page 27
 
diff --git a/Modules/Learning/LearningBase/include/otbSEMClassifier.h b/Modules/Learning/LearningBase/include/otbSEMClassifier.h
index 43c5daa..1d067f7 100644
--- a/Modules/Learning/LearningBase/include/otbSEMClassifier.h
+++ b/Modules/Learning/LearningBase/include/otbSEMClassifier.h
@@ -91,7 +91,7 @@ public:
   typedef itk::Statistics::MembershipSample<SampleType> OutputType;
 
   /** Type of the mixture model component base class.
-   * Due to the stochastic purpose, the inital list of sample (from TInputImage)
+   * Due to the stochastic purpose, the initial list of sample (from TInputImage)
    * is duplicated as many times as the number of classes (into SampleLists). */
   typedef otb::Statistics::ModelComponentBase<ClassSampleType> ComponentType;
   typedef typename ComponentType::Pointer                      ComponentPointerType;
diff --git a/Modules/Learning/LearningBase/include/otbSEMClassifier.txx b/Modules/Learning/LearningBase/include/otbSEMClassifier.txx
index 28ae59d..25318fd 100644
--- a/Modules/Learning/LearningBase/include/otbSEMClassifier.txx
+++ b/Modules/Learning/LearningBase/include/otbSEMClassifier.txx
@@ -159,7 +159,7 @@ void
 SEMClassifier<TInputImage, TOutputImage>
 ::SetClassLabels(TOutputImage * imgLabels)
 {
-  otbMsgDebugMacro(<< "Initalizing segmentation from an external image");
+  otbMsgDebugMacro(<< "Initializing segmentation from an external image");
 
   typename TInputImage::SizeType size = imgLabels->GetBufferedRegion().GetSize();
   int                            theSize = (int) size[0] * size[1];
@@ -362,7 +362,7 @@ SEMClassifier<TInputImage, TOutputImage>
       }
     else
       {
-      // Be sure, the sum of intial proportion remains to 1
+      // Be sure, the sum of initial proportion remains to 1
       double                                  sumProportion = 0.0;
       typename ProportionVectorType::iterator iterProportion = m_InitialProportions.begin();
       do
diff --git a/Modules/Learning/Markov/include/otbMarkovRandomFieldFilter.h b/Modules/Learning/Markov/include/otbMarkovRandomFieldFilter.h
index 1b7d205..fd94a51 100644
--- a/Modules/Learning/Markov/include/otbMarkovRandomFieldFilter.h
+++ b/Modules/Learning/Markov/include/otbMarkovRandomFieldFilter.h
@@ -72,7 +72,7 @@ namespace otb
  * \example  Markov/MarkovClassification1Example.cxx
  * \example  Markov/MarkovClassification2Example.cxx
  * \example  Markov/MarkovRegularizationExample.cxx
- * \example  Markov/MarkovRestaurationExample.cxx
+ * \example  Markov/MarkovRestorationExample.cxx
  *
  *
  * \ingroup OTBMarkov
@@ -174,7 +174,7 @@ public:
   typedef typename InputImageFaceListType::iterator
   InputImageFaceListIterator;
 
-  /** Labelled image neighborhood interator typedef */
+  /** Labelled image neighborhood iterator typedef */
   typedef itk::NeighborhoodIterator<TClassifiedImage>
   LabelledImageNeighborhoodIterator;
 
diff --git a/Modules/Learning/Markov/test/otbMRFSamplerMAP.cxx b/Modules/Learning/Markov/test/otbMRFSamplerMAP.cxx
index 0cf14a9..1148999 100644
--- a/Modules/Learning/Markov/test/otbMRFSamplerMAP.cxx
+++ b/Modules/Learning/Markov/test/otbMRFSamplerMAP.cxx
@@ -84,7 +84,7 @@ int otbMRFSamplerMAP(int itkNotUsed(argc), char * argv[])
                                                                                                              iterLab)
        << std::endl;
 
-  // All values (exept m_Value) are null : SingleValue return 0...
+  // All values (except m_Value) are null : SingleValue return 0...
   file << "m_EnergyBefore: " << object->GetEnergyBefore() << std::endl;
   file << "m_EnergyAfter : " << object->GetEnergyAfter() << std::endl;
   file << "m_Value       : " << object->GetValue() << std::endl;
diff --git a/Modules/Learning/Markov/test/otbMRFSamplerRandom.cxx b/Modules/Learning/Markov/test/otbMRFSamplerRandom.cxx
index f9995bd..dfba466 100644
--- a/Modules/Learning/Markov/test/otbMRFSamplerRandom.cxx
+++ b/Modules/Learning/Markov/test/otbMRFSamplerRandom.cxx
@@ -85,7 +85,7 @@ int otbMRFSamplerRandom(int itkNotUsed(argc), char * argv[])
                                                                                                              iterLab)
        << std::endl;
 
-  // All values (exept m_Value) are null : SingleValue return 0...
+  // All values (except m_Value) are null : SingleValue return 0...
   file << "m_EnergyBefore: " << object->GetEnergyBefore() << std::endl;
   file << "m_EnergyAfter : " << object->GetEnergyAfter() << std::endl;
   file << "m_Value       : " << object->GetValue() << std::endl;
diff --git a/Modules/Learning/Markov/test/otbMRFSamplerRandomMAP.cxx b/Modules/Learning/Markov/test/otbMRFSamplerRandomMAP.cxx
index 714c1fb..1537726 100644
--- a/Modules/Learning/Markov/test/otbMRFSamplerRandomMAP.cxx
+++ b/Modules/Learning/Markov/test/otbMRFSamplerRandomMAP.cxx
@@ -87,7 +87,7 @@ int otbMRFSamplerRandomMAP(int itkNotUsed(argc), char * argv[])
   file << "Compute( Compute( const InputImageNeighborhoodIterator, const LabelledImageNeighborhoodIterator) " <<
   object->Compute(iterIn, iterLab) << std::endl;
 
-  // All values (exept m_Value) are null : SingleValue return 0...
+  // All values (except m_Value) are null : SingleValue return 0...
   file << "m_EnergyBefore: " << object->GetEnergyBefore() << std::endl;
   file << "m_EnergyAfter: " << object->GetEnergyAfter() << std::endl;
   file << "m_Value: " << object->GetValue() << std::endl;
diff --git a/Modules/Learning/SOM/include/otbCzihoSOMLearningBehaviorFunctor.h b/Modules/Learning/SOM/include/otbCzihoSOMLearningBehaviorFunctor.h
index 2b8161a..16a9339 100644
--- a/Modules/Learning/SOM/include/otbCzihoSOMLearningBehaviorFunctor.h
+++ b/Modules/Learning/SOM/include/otbCzihoSOMLearningBehaviorFunctor.h
@@ -53,7 +53,7 @@ namespace Functor
 *  (surprisingly) required for the IterationThreshold.
 *
 *  The functor function uses \code NumberOfIterations \endcode, \code BetaInit \endcode, \code BetaEnd \endcode parameters, that is
-*  why it is necessary to call a specific method for \code IterationThreshold \endcode intialization.
+*  why it is necessary to call a specific method for \code IterationThreshold \endcode initialization.
 *
 *  \sa SOM
  *
diff --git a/Modules/Learning/SOM/include/otbPeriodicSOM.h b/Modules/Learning/SOM/include/otbPeriodicSOM.h
index c2c9a27..1d5face 100644
--- a/Modules/Learning/SOM/include/otbPeriodicSOM.h
+++ b/Modules/Learning/SOM/include/otbPeriodicSOM.h
@@ -45,7 +45,7 @@ namespace otb
  * which parameter is the current iteration. It returns a beta value of type \code double \endcode.
  *
  * The SOMMap produced as output can be either initialized with a constant custom value or randomly
- * generated following a normal law. The seed for the random intialization can be modified.
+ * generated following a normal law. The seed for the random initialization can be modified.
  *
  * \sa SOMMap
  * \sa SOMActivationBuilder
diff --git a/Modules/Learning/SOM/include/otbSOM.h b/Modules/Learning/SOM/include/otbSOM.h
index ea7cf7c..b5e9137 100644
--- a/Modules/Learning/SOM/include/otbSOM.h
+++ b/Modules/Learning/SOM/include/otbSOM.h
@@ -44,7 +44,7 @@ namespace otb
  * which parameter is the current iteration. It returns a beta value of type double.
  *
  * The SOMMap produced as output can be either initialized with a constant custom value or randomly
- * generated following a normal law. The seed for the random intialization can be modified.
+ * generated following a normal law. The seed for the random initialization can be modified.
  *
  * \sa SOMMap
  * \sa SOMActivationBuilder
@@ -157,9 +157,9 @@ private:
   double m_BetaEnd;
   /** Initial neighborhood size */
   SizeType m_NeighborhoodSizeInit;
-  /** Minimum intial neuron weights */
+  /** Minimum initial neuron weights */
   ValueType m_MinWeight;
-  /** Maximum intial neuron weights */
+  /** Maximum initial neuron weights */
   ValueType m_MaxWeight;
   /** Random initialization bool */
   bool m_RandomInit;
diff --git a/Modules/Learning/SOM/include/otbSOMLearningBehaviorFunctor.h b/Modules/Learning/SOM/include/otbSOMLearningBehaviorFunctor.h
index 0ebe5ef..7f571e9 100644
--- a/Modules/Learning/SOM/include/otbSOMLearningBehaviorFunctor.h
+++ b/Modules/Learning/SOM/include/otbSOMLearningBehaviorFunctor.h
@@ -30,7 +30,7 @@ namespace Functor
 /** \class SOMLearningBehaviorFunctor
 * \brief Classical Beta behavior over SOM training phase
 *
-*  This class implements an standart evolution of the \f$ \beta \f$ weightening
+*  This class implements an standard evolution of the \f$ \beta \f$ weightening
 *  coefficient over the SOM training.
 *
 *  \f[
diff --git a/Modules/Learning/SVMLearning/include/otbSVMModel.txx b/Modules/Learning/SVMLearning/include/otbSVMModel.txx
index a0b5abb..c5af716 100644
--- a/Modules/Learning/SVMLearning/include/otbSVMModel.txx
+++ b/Modules/Learning/SVMLearning/include/otbSVMModel.txx
@@ -81,7 +81,7 @@ SVMModel<TValue, TLabel>::Initialize()
     } */
   m_ModelUpToDate = false;
 
-  // Intialize problem
+  // Initialize problem
   m_Problem.l = 0;
   m_Problem.y = ITK_NULLPTR;
   m_Problem.x = ITK_NULLPTR;
@@ -202,7 +202,7 @@ SVMModel<TValue, TLabel>::BuildProblem()
     m_Problem.y[i] = 0;
     m_Problem.x[i] = new struct svm_node[elements];
 
-    // Intialize elements (value = 0; index = -1)
+    // Initialize elements (value = 0; index = -1)
     for (unsigned int j = 0; j < static_cast<unsigned int>(elements); ++j)
       {
       m_Problem.x[i][j].index = -1;
@@ -442,7 +442,7 @@ SVMModel<TValue, TLabel>::EvaluateHyperplanesDistances(const MeasurementType& me
   x[measure.size()].index = -1;
   x[measure.size()].value = 0;
 
-  // Intialize distances vector
+  // Initialize distances vector
   DistancesVectorType distances(m_Model->nr_class*(m_Model->nr_class - 1) / 2);
 
   // predict distances vector
diff --git a/Modules/Learning/SVMLearning/test/CMakeLists.txt b/Modules/Learning/SVMLearning/test/CMakeLists.txt
index 0e054df..b71cb46 100644
--- a/Modules/Learning/SVMLearning/test/CMakeLists.txt
+++ b/Modules/Learning/SVMLearning/test/CMakeLists.txt
@@ -50,7 +50,7 @@ otb_add_test(NAME leTvSVMImageClassificationWithRuleFilter COMMAND otbSVMLearnin
 
 otb_add_test(NAME obTuLabelMapSVMClassifierNew COMMAND otbSVMLearningTestDriver
   otbLabelMapSVMClassifierNew)
-  
+
 otb_add_test(NAME leTvSVMPointSetModelEstimatorTrain COMMAND otbSVMLearningTestDriver
   --compare-ascii ${EPSILON_3}  ${BASELINE_FILES}/leTvsvm_model_pointset
   ${TEMP}/leTvsvm_model_pointset
@@ -119,9 +119,18 @@ otb_add_test(NAME leTvSVMImageModelEstimatorTrain COMMAND otbSVMLearningTestDriv
   ${TEMP}/leTvsvm_model_image
   0 )
 
+# RK: 09/2016. LibSVM has serious issues in the code. Fixing this third party code is the right fix
+# which requires some time and communication with upstream developer. But in the mean-time this failing test
+# cannot be attributed to way OTB or OTB dashboard. For this reason, I am skipping 'baseline' comparison of output
+# results. From this day onwards test results are not validated and can have bad results.
+# If and When libsvm code is fixed, we put back test validation. Until then, we are extremely sorry for this action.
+# Twisting the test to check only some parameters while skipping always problematic ones does not seems a right choice.
+# After all,  test has problem which is clear, a fix is needed for sure and that fix must be applied upstream
+
+# --compare-ascii ${EPSILON_3}  ${BASELINE_FILES}/leTvsvm_model_image_opt
+#  ${TEMP}/leTvsvm_model_image_opt
+
 otb_add_test(NAME leTvSVMImageModelEstimatorTrainWithOptimization COMMAND otbSVMLearningTestDriver
-  --compare-ascii ${EPSILON_3}  ${BASELINE_FILES}/leTvsvm_model_image_opt
-  ${TEMP}/leTvsvm_model_image_opt
   otbSVMImageModelEstimatorTrain
   ${INPUTDATA}/ROI_QB_MUL_4.tif
   ${INPUTDATA}/ROI_QB_MUL_4_train.c1.hdr
@@ -200,4 +209,3 @@ otb_add_test(NAME leTvExhaustiveExponentialOptimizerTest COMMAND otbSVMLearningT
   ${TEMP}/leTvExhaustiveExponentialOptimizerTestOutput.txt
   otbExhaustiveExponentialOptimizerTest
   ${TEMP}/leTvExhaustiveExponentialOptimizerTestOutput.txt)
-
diff --git a/Modules/Learning/SVMLearning/test/otbLabelMapSVMClassifier.cxx b/Modules/Learning/SVMLearning/test/otbLabelMapSVMClassifier.cxx
index 00b6278..c8ee16b 100644
--- a/Modules/Learning/SVMLearning/test/otbLabelMapSVMClassifier.cxx
+++ b/Modules/Learning/SVMLearning/test/otbLabelMapSVMClassifier.cxx
@@ -87,7 +87,7 @@ int otbLabelMapSVMClassifier(int itkNotUsed(argc), char * argv[])
   const char * lfname   = argv[2];
   const char * outfname = argv[3];
 
-  // Filters instanciation
+  // Filters instantiation
   ReaderType::Pointer                reader              = ReaderType::New();
   LabeledReaderType::Pointer         labeledReader       = LabeledReaderType::New();
   LabelMapFilterType::Pointer        filter              = LabelMapFilterType::New();
diff --git a/Modules/Learning/SVMLearning/test/otbObjectDetectionClassifier.cxx b/Modules/Learning/SVMLearning/test/otbObjectDetectionClassifier.cxx
index 7ce85c6..543362c 100644
--- a/Modules/Learning/SVMLearning/test/otbObjectDetectionClassifier.cxx
+++ b/Modules/Learning/SVMLearning/test/otbObjectDetectionClassifier.cxx
@@ -49,14 +49,14 @@ typedef otb::ObjectDetectionClassifier
              CoordRepType > ObjectDetectionClassifierType;
 
 typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType>   FunctionType;
-typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType>  AdapatedFunctionType;
+typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType>  AdaptedFunctionType;
 
 typedef otb::ImageFileReader<ImageType>           ImageReaderType;
 
 typedef ObjectDetectionClassifierType::SVMModelType SVMModelType;
 typedef ObjectDetectionClassifierType::SVMModelPointerType SVMModelPointerType;
 
-typedef otb::StatisticsXMLFileReader<AdapatedFunctionType::OutputType> StatisticsXMLFileReaderType;
+typedef otb::StatisticsXMLFileReader<AdaptedFunctionType::OutputType> StatisticsXMLFileReaderType;
 
 
 struct ComparePoint
@@ -117,7 +117,7 @@ int otbObjectDetectionClassifier(int argc, char* argv[])
   SVMModelPointerType svmModel = SVMModelType::New();
   svmModel->LoadModel(inputSVMModel);
 
-  AdapatedFunctionType::Pointer descriptorsFunction = AdapatedFunctionType::New();
+  AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New();
   descriptorsFunction->SetInputImage(imageReader->GetOutput());
   descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(neighborhood);
 
diff --git a/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.h b/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.h
index b561c78..ed224e5 100644
--- a/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.h
+++ b/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.h
@@ -69,11 +69,11 @@ public:
 
   /** Get the output samples OGR container */
   ogr::DataSource* GetOutputSamples();
-  
-  virtual void Synthetize(void);
+
+  void Synthetize(void) ITK_OVERRIDE{}
 
   /** Reset method called before starting the streaming*/
-  virtual void Reset(void);
+  void Reset(void) ITK_OVERRIDE;
   
   itkSetMacro(SampleFieldPrefix, std::string);
   itkGetMacro(SampleFieldPrefix, std::string);
@@ -88,14 +88,14 @@ protected:
   /** Constructor */
   PersistentImageSampleExtractorFilter();
   /** Destructor */
-  virtual ~PersistentImageSampleExtractorFilter() {}
+  ~PersistentImageSampleExtractorFilter() ITK_OVERRIDE {}
 
-  virtual void GenerateOutputInformation();
+  void GenerateOutputInformation() ITK_OVERRIDE;
 
-  virtual void GenerateInputRequestedRegion();
+  void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** process only points */
-  virtual void ThreadedGenerateData(const RegionType&, itk::ThreadIdType threadid);
+  void ThreadedGenerateVectorData(const ogr::Layer& layerForThread, itk::ThreadIdType threadid) ITK_OVERRIDE;
 
 private:
   PersistentImageSampleExtractorFilter(const Self &); //purposely not implemented
@@ -175,7 +175,7 @@ protected:
   /** Constructor */
   ImageSampleExtractorFilter() {}
   /** Destructor */
-  virtual ~ImageSampleExtractorFilter() {}
+  ~ImageSampleExtractorFilter() ITK_OVERRIDE {}
 
 private:
   ImageSampleExtractorFilter(const Self &); //purposely not implemented
diff --git a/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.txx b/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.txx
index cf26b14..341098e 100644
--- a/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.txx
+++ b/Modules/Learning/Sampling/include/otbImageSampleExtractorFilter.txx
@@ -58,15 +58,6 @@ PersistentImageSampleExtractorFilter<TInputImage>
 template<class TInputImage>
 void
 PersistentImageSampleExtractorFilter<TInputImage>
-::Synthetize(void)
-{
-  // clear temporary outputs
-  this->m_InMemoryOutputs.clear();
-}
-
-template<class TInputImage>
-void
-PersistentImageSampleExtractorFilter<TInputImage>
 ::Reset(void)
 {
   // Check output field names
@@ -165,20 +156,15 @@ PersistentImageSampleExtractorFilter<TInputImage>
 template<class TInputImage>
 void
 PersistentImageSampleExtractorFilter<TInputImage>
-::ThreadedGenerateData(const RegionType&, itk::ThreadIdType threadid)
+::ThreadedGenerateVectorData(const ogr::Layer& layerForThread, itk::ThreadIdType threadid)
 {
   // Retrieve inputs
   TInputImage* inputImage = const_cast<TInputImage*>(this->GetInput());
   unsigned int nbBand = inputImage->GetNumberOfComponentsPerPixel();
 
-  ogr::Layer layer = this->m_InMemoryInputs[threadid]->GetLayerChecked(0);
-  if (! layer)
-    {
-    return;
-    }
-  ogr::Layer outputLayer = this->m_InMemoryOutputs[threadid][0]->GetLayerChecked(0);
+  ogr::Layer outputLayer = this->GetInMemoryOutput(threadid);
 
-  itk::ProgressReporter progress( this, threadid, layer.GetFeatureCount(true) );
+  itk::ProgressReporter progress( this, threadid, layerForThread.GetFeatureCount(true) );
 
   // Loop across the features in the layer (filtered by requested region in BeforeTGD already)
   OGRGeometry *geom;
@@ -186,8 +172,8 @@ PersistentImageSampleExtractorFilter<TInputImage>
   IndexType imgIndex;
   PixelType imgPixel;
   double imgComp;
-  ogr::Layer::const_iterator featIt = layer.begin();
-  for(; featIt!=layer.end(); ++featIt)
+  ogr::Layer::const_iterator featIt = layerForThread.begin();
+  for(; featIt!=layerForThread.end(); ++featIt)
     {
     geom = featIt->ogr().GetGeometryRef();
     switch (geom->getGeometryType())
@@ -212,7 +198,7 @@ PersistentImageSampleExtractorFilter<TInputImage>
         for (unsigned int i=0 ; i<nbBand ; ++i)
           {
           imgComp = static_cast<double>(itk::DefaultConvertPixelTraits<PixelType>::GetNthComponent(i,imgPixel));
-          // Fill the ouptut OGRDataSource
+          // Fill the output OGRDataSource
           dstFeature[m_SampleFieldNames[i]].SetValue(imgComp);
           }
         outputLayer.CreateFeature( dstFeature );
diff --git a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h
index 10e23d1..a654b79 100644
--- a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h
+++ b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.h
@@ -85,11 +85,10 @@ public:
   /** Runtime information support. */
   itkTypeMacro(PersistentOGRDataToSamplePositionFilter, PersistentSamplingFilterBase);
 
-  /** Synthetize the persistent filter*/
-  virtual void Synthetize(void);
+  void Synthetize(void) ITK_OVERRIDE{}
 
   /** Reset method called before starting the streaming*/
-  virtual void Reset(void);
+  void Reset(void) ITK_OVERRIDE;
 
   /** Get a reference to the internal samplers at a given level */
   SamplerMapType& GetSamplers(unsigned int level);
@@ -113,7 +112,7 @@ public:
 
   /** Make a DataObject of the correct type to be used as the specified
    * output. */
-  virtual itk::DataObject::Pointer MakeOutput(DataObjectPointerArraySizeType idx);
+  itk::DataObject::Pointer MakeOutput(DataObjectPointerArraySizeType idx) ITK_OVERRIDE;
   using Superclass::MakeOutput;
 
   /** Get/Set of the field name storing the original FID of each sample */
@@ -124,18 +123,18 @@ protected:
   /** Constructor */
   PersistentOGRDataToSamplePositionFilter();
   /** Destructor */
-  virtual ~PersistentOGRDataToSamplePositionFilter() {}
+  ~PersistentOGRDataToSamplePositionFilter() ITK_OVERRIDE {}
 
   /** Call samplers on a current position, for a given class */
-  virtual void ProcessSample(const ogr::Feature& feature,
+  void ProcessSample(const ogr::Feature& feature,
                              typename TInputImage::IndexType& imgIndex,
                              typename TInputImage::PointType& imgPoint,
-                             itk::ThreadIdType& threadid);
+                             itk::ThreadIdType& threadid) ITK_OVERRIDE;
 
   /** Method to split the input OGRDataSource
    *  according to the class partition
    */
-  virtual void DispatchInputVectors(ogr::Layer &inLayer, std::vector<ogr::Layer> &tmpLayers);
+  void DispatchInputVectors(void) ITK_OVERRIDE;
 
 private:
   PersistentOGRDataToSamplePositionFilter(const Self &); //purposely not implemented
@@ -250,7 +249,7 @@ protected:
   /** Constructor */
   OGRDataToSamplePositionFilter() {}
   /** Destructor */
-  virtual ~OGRDataToSamplePositionFilter() {}
+  ~OGRDataToSamplePositionFilter() ITK_OVERRIDE {}
 
 private:
   OGRDataToSamplePositionFilter(const Self &); //purposely not implemented
diff --git a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx
index f932ca0..d2e6847 100644
--- a/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx
+++ b/Modules/Learning/Sampling/include/otbOGRDataToSamplePositionFilter.txx
@@ -36,15 +36,6 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
 template<class TInputImage, class TMaskImage, class TSampler>
 void
 PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
-::Synthetize(void)
-{
-  // clear temporary outputs
-  this->m_InMemoryOutputs.clear();
-}
-
-template<class TInputImage, class TMaskImage, class TSampler>
-void
-PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
 ::Reset(void)
 {
   // Reset samplers
@@ -99,7 +90,7 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
 {
   // set the output dataset
   this->SetNthOutput(1+level,data);
-  // instanciate the corresponding samplers
+  // instantiate the corresponding samplers
   if (m_Samplers.size() < (level + 1))
     {
     m_Samplers.resize(level + 1);
@@ -185,7 +176,7 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
       ogrTmpPoint.setX(imgPoint[0]);
       ogrTmpPoint.setY(imgPoint[1]);
 
-      ogr::Layer outputLayer = this->m_InMemoryOutputs[threadid][i]->GetLayerChecked(0);
+      ogr::Layer outputLayer = this->GetInMemoryOutput(threadid,i);
       ogr::Feature feat(outputLayer.GetLayerDefn());
       feat.SetFrom(feature);
       feat[this->GetOriginFieldName()].SetValue(static_cast<int>(feature.GetFID()));
@@ -199,8 +190,43 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
 template<class TInputImage, class TMaskImage, class TSampler>
 void
 PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
-::DispatchInputVectors(ogr::Layer &inLayer, std::vector<ogr::Layer> &tmpLayers)
+::DispatchInputVectors()
 {
+  TInputImage* outputImage = this->GetOutput();
+  ogr::DataSource* vectors = const_cast<ogr::DataSource*>(this->GetOGRData());
+  ogr::Layer inLayer = vectors->GetLayer(this->GetLayerIndex());
+
+  const RegionType& requestedRegion = outputImage->GetRequestedRegion();
+  itk::ContinuousIndex<double> startIndex(requestedRegion.GetIndex());
+  itk::ContinuousIndex<double> endIndex(requestedRegion.GetUpperIndex());
+  startIndex[0] += -0.5;
+  startIndex[1] += -0.5;
+  endIndex[0] += 0.5;
+  endIndex[1] += 0.5;
+  itk::Point<double, 2> startPoint;
+  itk::Point<double, 2> endPoint;
+  outputImage->TransformContinuousIndexToPhysicalPoint(startIndex, startPoint);
+  outputImage->TransformContinuousIndexToPhysicalPoint(endIndex, endPoint);
+
+  // create geometric extent
+  OGRPolygon tmpPolygon;
+  OGRLinearRing ring;
+  ring.addPoint(startPoint[0],startPoint[1],0.0);
+  ring.addPoint(startPoint[0],endPoint[1]  ,0.0);
+  ring.addPoint(endPoint[0]  ,endPoint[1]  ,0.0);
+  ring.addPoint(endPoint[0]  ,startPoint[1],0.0);
+  ring.addPoint(startPoint[0],startPoint[1],0.0);
+  tmpPolygon.addRing(&ring);
+
+  inLayer.SetSpatialFilter(&tmpPolygon);
+
+  unsigned int numberOfThreads = this->GetNumberOfThreads();
+  std::vector<ogr::Layer> tmpLayers;
+  for (unsigned int i=0 ; i<numberOfThreads ; i++)
+    {
+    tmpLayers.push_back(this->GetInMemoryInput(i));
+    }
+
   OGRFeatureDefn &layerDefn = inLayer.GetLayerDefn();
   ogr::Layer::const_iterator featIt = inLayer.begin();
   std::string className;
@@ -212,6 +238,8 @@ PersistentOGRDataToSamplePositionFilter<TInputImage,TMaskImage,TSampler>
     className = featIt->ogr().GetFieldAsString(this->GetFieldIndex());
     tmpLayers[m_ClassPartition[className]].CreateFeature( dstFeature );
     }
+
+  inLayer.SetSpatialFilter(ITK_NULLPTR);
 }
 
 template<class TInputImage, class TMaskImage, class TSampler>
diff --git a/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.h b/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.h
index 498dfe5..8d2c1a2 100644
--- a/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.h
+++ b/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.h
@@ -94,25 +94,24 @@ protected:
   /** Constructor */
   PersistentSamplingFilterBase();
   /** Destructor */
-  virtual ~PersistentSamplingFilterBase() {}
+  ~PersistentSamplingFilterBase() ITK_OVERRIDE {}
 
   /** Use the same output information as input image, check the field index
    *  and the mask footprint */
-  virtual void GenerateOutputInformation();
+  void GenerateOutputInformation() ITK_OVERRIDE;
 
   /** Use an empty region to input image (pixel values not needed) and set
    *  the requested region for the mask */
-  virtual void GenerateInputRequestedRegion();
+  void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
-  /** Prepare temporary input and output OGR data sources */
-  virtual void BeforeThreadedGenerateData(void);
+  /** Generate data should thread over */
+  void GenerateData(void) ITK_OVERRIDE;
 
-  /** Gather data from multiple threads and
-   *  write to output OGRDataSource (if any) */
-  virtual void AfterThreadedGenerateData(void);
+  /** Allocate in-memory layers for input and outputs */
+  void AllocateOutputs(void) ITK_OVERRIDE;
 
   /** Start of main processing loop */
-  virtual void ThreadedGenerateData(const RegionType&, itk::ThreadIdType threadid);
+  virtual void ThreadedGenerateVectorData(const ogr::Layer& layerForThread, itk::ThreadIdType threadid);
 
   /** Process a geometry, recursive method when the geometry is a collection */
   void ExploreGeometry(const ogr::Feature& feature,
@@ -155,28 +154,17 @@ protected:
   /** Get the region bounding a set of features */
   RegionType FeatureBoundingRegion(const TInputImage* image, otb::ogr::Layer::const_iterator& featIt) const;
 
-  /** Prepares in-memory layers for each thread,
-   *  then calls DispatchInputVectors() for the actual dispatch */
-  virtual void PrepareInputVectors();
-
   /** Method to split the input OGRDataSource between several containers
    *  for each thread. Default is to put the same number of features for
    *  each thread.*/
-  virtual void DispatchInputVectors(ogr::Layer &inLayer, std::vector<ogr::Layer> &tmpLayers);
+  virtual void DispatchInputVectors(void);
 
-  /** Prepare output feature containers for each thread and each output
-   *  OGRDataSource*/
-  virtual void PrepareOutputVectors();
+  /** Gather the content of in-memory output layer into the filter outputs */
+  virtual void GatherOutputVectors(void);
 
   /** Utility method to add new fields on an output layer */
   virtual void InitializeOutputDataSource(ogr::DataSource* inputDS, ogr::DataSource* outputDS);
 
-  /** In-memory containers storing input geometries for each thread*/
-  std::vector<OGRDataPointer> m_InMemoryInputs;
-
-  /** In-memory containers storing position during iteration loop*/
-  std::vector<std::vector<OGRDataPointer> > m_InMemoryOutputs;
-
   typedef struct {
     std::string Name;
     OGRFieldType Type;
@@ -196,6 +184,21 @@ protected:
   /** Get a reference over the additional fields */
   const std::vector<SimpleFieldDefn>& GetAdditionalFields();
 
+  /** Callback function to launch VectorThreadedGenerateData in each thread */
+  static ITK_THREAD_RETURN_TYPE VectorThreaderCallback(void *arg);
+
+  /** basically the same struct as itk::ImageSource::ThreadStruct */
+  struct VectorThreadStruct
+    {
+      Pointer Filter;
+    };
+
+  /** Give access to in-memory input layers */
+  ogr::Layer GetInMemoryInput(unsigned int threadId);
+
+  /** Give access to in-memory output layers */
+  ogr::Layer GetInMemoryOutput(unsigned int threadId, unsigned int index=0);
+
 private:
   PersistentSamplingFilterBase(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
@@ -218,6 +221,12 @@ private:
   /** Additional field definitions to add in output data sources */
   std::vector<SimpleFieldDefn> m_AdditionalFields;
 
+  /** In-memory containers storing input geometries for each thread*/
+  std::vector<OGRDataPointer> m_InMemoryInputs;
+
+  /** In-memory containers storing position during iteration loop*/
+  std::vector<std::vector<OGRDataPointer> > m_InMemoryOutputs;
+
 };
 } // End namespace otb
 
diff --git a/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx b/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx
index 12e0f22..e76567c 100644
--- a/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx
+++ b/Modules/Learning/Sampling/include/otbPersistentSamplingFilterBase.txx
@@ -33,8 +33,11 @@ template<class TInputImage, class TMaskImage>
 PersistentSamplingFilterBase<TInputImage,TMaskImage>
 ::PersistentSamplingFilterBase()
   : m_FieldName(std::string("class"))
+  , m_FieldIndex(0)  
   , m_LayerIndex(0)
   , m_OutLayerName(std::string("output"))
+  , m_OGRLayerCreationOptions()
+  , m_AdditionalFields()
 {
   this->SetNthOutput(0,TInputImage::New());
 }
@@ -155,34 +158,119 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
     }
 }
 
-
 template <class TInputImage, class TMaskImage>
 void
 PersistentSamplingFilterBase<TInputImage,TMaskImage>
-::BeforeThreadedGenerateData(void)
+::GenerateData(void)
 {
-  this->PrepareInputVectors();
+  this->AllocateOutputs();
+  this->BeforeThreadedGenerateData();
+
+  // Split the data into in-memory layers
+  this->DispatchInputVectors();
+
+  // struct to store filter pointer
+  VectorThreadStruct str;
+  str.Filter = this;
+
+  // Get the output pointer
+  //const InputImageType *outputPtr = this->GetOutput();
+
+  this->GetMultiThreader()->SetNumberOfThreads( this->GetNumberOfThreads() );
+  this->GetMultiThreader()->SetSingleMethod(this->VectorThreaderCallback, &str);
+
+  // multithread the execution
+  this->GetMultiThreader()->SingleMethodExecute();
 
-  this->PrepareOutputVectors();
+  // gather the data from in-memory output layers
+  this->GatherOutputVectors();
+
+  this->AfterThreadedGenerateData();
 }
 
 template <class TInputImage, class TMaskImage>
 void
 PersistentSamplingFilterBase<TInputImage,TMaskImage>
-::AfterThreadedGenerateData(void)
+::AllocateOutputs(void)
 {
-  // clean temporary inputs
-  this->m_InMemoryInputs.clear();
+  Superclass::AllocateOutputs();
+
+  ogr::DataSource* vectors = const_cast<ogr::DataSource*>(this->GetOGRData());
+  ogr::Layer inLayer = vectors->GetLayer(m_LayerIndex);
 
   unsigned int numberOfThreads = this->GetNumberOfThreads();
-  
-  unsigned int actualNumberOfThreads = numberOfThreads;
-  
-  if(numberOfThreads > this->GetOutput()->GetRequestedRegion().GetSize()[1])
+
+  // Prepare temporary input
+  this->m_InMemoryInputs.clear();
+  this->m_InMemoryInputs.reserve(numberOfThreads);
+  std::string tmpLayerName("thread");
+  OGRSpatialReference * oSRS = ITK_NULLPTR;
+  if (inLayer.GetSpatialRef())
+    {
+    oSRS = inLayer.GetSpatialRef()->Clone();
+    }
+  OGRFeatureDefn &layerDefn = inLayer.GetLayerDefn();
+  //std::vector<ogr::Layer> tmpLayers;
+  for (unsigned int i=0 ; i < numberOfThreads ; i++)
     {
-    actualNumberOfThreads = this->GetOutput()->GetRequestedRegion().GetSize()[1];
+    ogr::DataSource::Pointer tmpOgrDS = ogr::DataSource::New();
+    ogr::Layer tmpLayer = tmpOgrDS->CreateLayer(
+      tmpLayerName,
+      oSRS,
+      inLayer.GetGeomType());
+    // add field definitions
+    for (int k=0 ; k < layerDefn.GetFieldCount() ; k++)
+      {
+      OGRFieldDefn originDefn(layerDefn.GetFieldDefn(k));
+      ogr::FieldDefn fieldDefn(originDefn);
+      tmpLayer.CreateField(fieldDefn);
+      }
+    this->m_InMemoryInputs.push_back(tmpOgrDS);
+    }
+
+  // Prepare in-memory outputs
+  this->m_InMemoryOutputs.clear();
+  this->m_InMemoryOutputs.reserve(numberOfThreads);
+  tmpLayerName = std::string("threadOut");
+  for (unsigned int i=0 ; i < numberOfThreads ; i++)
+    {
+    std::vector<OGRDataPointer> tmpContainer;
+    // iterate over outputs, only process ogr::DataSource
+    for (unsigned int k=0 ; k < this->GetNumberOfOutputs() ; k++)
+      {
+      ogr::DataSource* realOutput = dynamic_cast<ogr::DataSource *>(
+        this->itk::ProcessObject::GetOutput(k));
+      if (realOutput)
+        {
+        ogr::Layer realLayer = realOutput->GetLayersCount() == 1
+                               ? realOutput->GetLayer(0)
+                               : realOutput->GetLayer(m_OutLayerName);
+        OGRFeatureDefn &outLayerDefn = realLayer.GetLayerDefn();
+        ogr::DataSource::Pointer tmpOutput = ogr::DataSource::New();
+        ogr::Layer tmpLayer = tmpOutput->CreateLayer(
+          tmpLayerName, oSRS,  realLayer.GetGeomType());
+        // add field definitions
+        for (int f=0 ; f < outLayerDefn.GetFieldCount() ; f++)
+          {
+          OGRFieldDefn originDefn(outLayerDefn.GetFieldDefn(f));
+          tmpLayer.CreateField(originDefn);
+          }
+        tmpContainer.push_back(tmpOutput);
+        }
+      }
+    this->m_InMemoryOutputs.push_back(tmpContainer);
     }
+}
+
+template <class TInputImage, class TMaskImage>
+void
+PersistentSamplingFilterBase<TInputImage,TMaskImage>
+::GatherOutputVectors(void)
+{
+  // clean temporary inputs
+  this->m_InMemoryInputs.clear();
 
+  unsigned int numberOfThreads = this->GetNumberOfThreads();
   
   // gather temporary outputs and write to output
   const otb::ogr::DataSource* vectors = this->GetOGRData();
@@ -205,7 +293,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
         itkExceptionMacro(<< "Unable to start transaction for OGR layer " << outLayer.ogr().GetName() << ".");
         }
   
-      for (unsigned int thread=0 ; thread < actualNumberOfThreads ; thread++)
+      for (unsigned int thread=0 ; thread < numberOfThreads ; thread++)
         {
         ogr::Layer inLayer = this->m_InMemoryOutputs[thread][count]->GetLayerChecked(0);
         if (!inLayer)
@@ -245,29 +333,24 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
     }
   chrono.Stop();
   otbMsgDebugMacro(<< "write ogr points took " << chrono.GetTotal() << " sec");
+  this->m_InMemoryOutputs.clear();
 }
 
 template <class TInputImage, class TMaskImage>
 void
 PersistentSamplingFilterBase<TInputImage,TMaskImage>
-::ThreadedGenerateData(const RegionType&, itk::ThreadIdType threadid)
+::ThreadedGenerateVectorData(const ogr::Layer& layerForThread, itk::ThreadIdType threadid)
 {
   // Retrieve inputs
   TInputImage* inputImage = const_cast<TInputImage*>(this->GetInput());
   TInputImage* outputImage = this->GetOutput();
   RegionType requestedRegion = outputImage->GetRequestedRegion();
 
-  ogr::Layer layer = this->m_InMemoryInputs.at(threadid)->GetLayerChecked(0);
-  if (! layer)
-    {
-    return;
-    }
-
-  itk::ProgressReporter progress( this, threadid, layer.GetFeatureCount(true) );
+  itk::ProgressReporter progress( this, threadid, layerForThread.GetFeatureCount(true) );
 
   // Loop across the features in the layer (filtered by requested region in BeforeTGD already)
-  ogr::Layer::const_iterator featIt = layer.begin();
-  for(; featIt!=layer.end(); ++featIt)
+  ogr::Layer::const_iterator featIt = layerForThread.begin();
+  for(; featIt!=layerForThread.end(); ++featIt)
     {
     // Compute the intersection of thread region and polygon bounding region, called "considered region"
     // This need not be done in ThreadedGenerateData and could be pre-processed and cached before filter execution if needed
@@ -292,18 +375,21 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
 {
   typename TInputImage::PointType imgPoint;
   typename TInputImage::IndexType imgIndex;
+  
   switch (geom->getGeometryType())
     {
     case wkbPoint:
     case wkbPoint25D:
       {
       OGRPoint* castPoint = dynamic_cast<OGRPoint*>(geom);
+      if (castPoint == ITK_NULLPTR) break;
+      
       imgPoint[0] = castPoint->getX();
       imgPoint[1] = castPoint->getY();
       const TInputImage* img = this->GetInput();
       const TMaskImage* mask = this->GetMask(); 
       img->TransformPhysicalPointToIndex(imgPoint,imgIndex);
-      if ((mask == NULL) || mask->GetPixel(imgIndex))
+      if ((mask == ITK_NULLPTR) || mask->GetPixel(imgIndex))
         {
         this->ProcessSample(feature, imgIndex, imgPoint, threadid);
         }
@@ -313,7 +399,8 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
     case wkbLineString25D:
       {
       OGRLineString* castLineString = dynamic_cast<OGRLineString*>(geom);
-      if (castLineString == NULL) break;
+
+      if (castLineString == ITK_NULLPTR) break;
       this->ProcessLine(feature,castLineString,region,threadid);
       break;
       }
@@ -321,7 +408,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
     case wkbPolygon25D:
       {
       OGRPolygon* castPolygon = dynamic_cast<OGRPolygon*>(geom);
-      if (castPolygon == NULL) break;
+      if (castPolygon == ITK_NULLPTR) break;
       this->ProcessPolygon(feature,castPolygon,region,threadid);
       break;
       }
@@ -596,7 +683,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
 template<class TInputImage, class TMaskImage>
 void
 PersistentSamplingFilterBase<TInputImage,TMaskImage>
-::PrepareInputVectors()
+::DispatchInputVectors()
 {
   TInputImage* outputImage = this->GetOutput();
   ogr::DataSource* vectors = const_cast<ogr::DataSource*>(this->GetOGRData());
@@ -627,52 +714,13 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
   inLayer.SetSpatialFilter(&tmpPolygon);
 
   unsigned int numberOfThreads = this->GetNumberOfThreads();
-
-  unsigned int actualNumberOfThreads = numberOfThreads;
-
-  if(numberOfThreads > this->GetOutput()->GetRequestedRegion().GetSize()[1])
-    {
-    actualNumberOfThreads = this->GetOutput()->GetRequestedRegion().GetSize()[1];
-    }
-  
-  // prepare temporary input : split input features between available threads
-  this->m_InMemoryInputs.clear();
-  std::string tmpLayerName("thread");
-  OGRSpatialReference * oSRS = NULL;
-  if (inLayer.GetSpatialRef())
-    {
-    oSRS = inLayer.GetSpatialRef()->Clone();
-    }
-  OGRFeatureDefn &layerDefn = inLayer.GetLayerDefn();
   std::vector<ogr::Layer> tmpLayers;
-  for (unsigned int i=0 ; i < actualNumberOfThreads ; i++)
+  tmpLayers.reserve(numberOfThreads);
+  for (unsigned int i=0 ; i<numberOfThreads ; i++)
     {
-    ogr::DataSource::Pointer tmpOgrDS = ogr::DataSource::New();
-    ogr::Layer tmpLayer = tmpOgrDS->CreateLayer(
-      tmpLayerName,
-      oSRS,
-      inLayer.GetGeomType());
-    // add field definitions
-    for (int k=0 ; k < layerDefn.GetFieldCount() ; k++)
-      {
-      OGRFieldDefn originDefn(layerDefn.GetFieldDefn(k));
-      ogr::FieldDefn fieldDefn(originDefn);
-      tmpLayer.CreateField(fieldDefn);
-      }
-    this->m_InMemoryInputs.push_back(tmpOgrDS);
-    tmpLayers.push_back(tmpLayer);
+    tmpLayers.push_back(this->GetInMemoryInput(i));
     }
-
-  this->DispatchInputVectors(inLayer,tmpLayers);
-
-  inLayer.SetSpatialFilter(NULL);
-}
-
-template<class TInputImage, class TMaskImage>
-void
-PersistentSamplingFilterBase<TInputImage,TMaskImage>
-::DispatchInputVectors(ogr::Layer &inLayer, std::vector<ogr::Layer> &tmpLayers)
-{
+  
   OGRFeatureDefn &layerDefn = inLayer.GetLayerDefn();
   ogr::Layer::const_iterator featIt = inLayer.begin();
   unsigned int counter=0;
@@ -686,58 +734,8 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
     if (counter >= tmpLayers.size())
       counter = 0;
     }
-}
 
-template<class TInputImage, class TMaskImage>
-void
-PersistentSamplingFilterBase<TInputImage,TMaskImage>
-::PrepareOutputVectors()
-{
-  // Prepare in-memory outputs
-  unsigned int numberOfThreads = this->GetNumberOfThreads();
-
-  unsigned int actualNumberOfThreads = numberOfThreads;
-
-  if(numberOfThreads > this->GetOutput()->GetRequestedRegion().GetSize()[1])
-    {
-    actualNumberOfThreads = this->GetOutput()->GetRequestedRegion().GetSize()[1];
-    }
-  
-  this->m_InMemoryOutputs.clear();
-  std::string tmpLayerName("threadOut");
-  for (unsigned int i=0 ; i < actualNumberOfThreads ; i++)
-    {
-    std::vector<OGRDataPointer> tmpContainer;
-    // iterate over outputs, only process ogr::DataSource
-    for (unsigned int k=0 ; k < this->GetNumberOfOutputs() ; k++)
-      {
-      ogr::DataSource* realOutput = dynamic_cast<ogr::DataSource *>(
-        this->itk::ProcessObject::GetOutput(k));
-      if (realOutput)
-        {
-        ogr::Layer realLayer = realOutput->GetLayersCount() == 1
-                               ? realOutput->GetLayer(0)
-                               : realOutput->GetLayer(m_OutLayerName);
-        OGRSpatialReference * oSRS = NULL;
-        if (realLayer.GetSpatialRef())
-          {
-          oSRS = realLayer.GetSpatialRef()->Clone();
-          }
-        OGRFeatureDefn &layerDefn = realLayer.GetLayerDefn();
-        ogr::DataSource::Pointer tmpOutput = ogr::DataSource::New();
-        ogr::Layer tmpLayer = tmpOutput->CreateLayer(
-          tmpLayerName, oSRS,  realLayer.GetGeomType());
-        // add field definitions
-        for (int f=0 ; f < layerDefn.GetFieldCount() ; f++)
-          {
-          OGRFieldDefn originDefn(layerDefn.GetFieldDefn(f));
-          tmpLayer.CreateField(originDefn);
-          }
-        tmpContainer.push_back(tmpOutput);
-        }
-      }
-    this->m_InMemoryOutputs.push_back(tmpContainer);
-    }
+  inLayer.SetSpatialFilter(ITK_NULLPTR);
 }
 
 template<class TInputImage, class TMaskImage>
@@ -773,7 +771,7 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
     {
     std::string projectionRefWkt = this->GetInput()->GetProjectionRef();
     bool projectionInformationAvailable = !projectionRefWkt.empty();
-    OGRSpatialReference * oSRS = NULL;
+    OGRSpatialReference * oSRS = ITK_NULLPTR;
     if(projectionInformationAvailable)
       {
       oSRS = static_cast<OGRSpatialReference *>(OSRNewSpatialReference(projectionRefWkt.c_str()));
@@ -850,6 +848,53 @@ PersistentSamplingFilterBase<TInputImage,TMaskImage>
   return this->m_AdditionalFields;
 }
 
+template<class TInputImage, class TMaskImage>
+ITK_THREAD_RETURN_TYPE
+PersistentSamplingFilterBase<TInputImage,TMaskImage>
+::VectorThreaderCallback(void *arg)
+{
+  VectorThreadStruct *str = (VectorThreadStruct*)(((itk::MultiThreader::ThreadInfoStruct *)(arg))->UserData);
+
+  int threadId = ((itk::MultiThreader::ThreadInfoStruct *)(arg))->ThreadID;
+  int threadCount = ((itk::MultiThreader::ThreadInfoStruct *)(arg))->NumberOfThreads;
+
+  ogr::Layer layer = str->Filter->GetInMemoryInput(threadId);
+
+  if (threadId < threadCount)
+    {
+    str->Filter->ThreadedGenerateVectorData(layer,threadId);
+    }
+
+  return ITK_THREAD_RETURN_VALUE;
+}
+
+template<class TInputImage, class TMaskImage>
+ogr::Layer
+PersistentSamplingFilterBase<TInputImage,TMaskImage>
+::GetInMemoryInput(unsigned int threadId)
+{
+  if (threadId >= m_InMemoryInputs.size())
+    {
+    itkExceptionMacro(<< "Requested in-memory input layer not available " << threadId << " (total size : "<< m_InMemoryInputs.size() <<").");
+    }
+  return m_InMemoryInputs[threadId]->GetLayerChecked(0);
+}
+
+template<class TInputImage, class TMaskImage>
+ogr::Layer
+PersistentSamplingFilterBase<TInputImage,TMaskImage>
+::GetInMemoryOutput(unsigned int threadId, unsigned int index)
+{
+  if (threadId >= m_InMemoryOutputs.size())
+    {
+    itkExceptionMacro(<< "Requested in-memory output layer not available " << threadId << " (total size : "<< m_InMemoryOutputs.size() <<").");
+    }
+  if (index >= m_InMemoryOutputs[threadId].size())
+    {
+    itkExceptionMacro(<< "Requested output dataset not available " << index << " (available : "<< m_InMemoryOutputs[threadId].size() <<").");
+    }
+  return m_InMemoryOutputs[threadId][index]->GetLayerChecked(0);
+}
 
 } // end namespace otb
 
diff --git a/Modules/Learning/Sampling/include/otbSamplingRateCalculator.h b/Modules/Learning/Sampling/include/otbSamplingRateCalculator.h
index bb66f69..2c8dcc6 100644
--- a/Modules/Learning/Sampling/include/otbSamplingRateCalculator.h
+++ b/Modules/Learning/Sampling/include/otbSamplingRateCalculator.h
@@ -38,7 +38,7 @@ class ITK_EXPORT SamplingRateCalculator
 {
 public:
   /** Standard typedefs */
-  typedef SamplingRateCalculator                     Self;
+  typedef SamplingRateCalculator        Self;
   typedef itk::Object                   Superclass;
   typedef itk::SmartPointer<Self>       Pointer;
   typedef itk::SmartPointer<const Self> ConstPointer;
@@ -68,6 +68,12 @@ public:
   /** Method to set the same number of required samples in each class */
   void SetNbOfSamplesAllClasses(unsigned long);
 
+  /** Method to set a percentage of samples for each class */
+  void SetPercentageOfSamples(double percent);
+
+  /** Method to set the total number of samples to generate */
+  void SetTotalNumberOfSamples(unsigned long value);  
+  
   /** Method to choose a sampling strategy based on the smallest class.
    * The number of samples in each class is set to this minimum size*/
   void SetMinimumNbOfSamplesByClass(void);
@@ -94,15 +100,17 @@ public:
   /** Clear internal data */
   void ClearRates(void);
 
+  static ClassCountMapType ReadRequiredSamples(const std::string& filename);
+
 protected:
   /** Constructor */
   SamplingRateCalculator();
 
   /** Destructor */
-  virtual ~SamplingRateCalculator() {}
+  ~SamplingRateCalculator() ITK_OVERRIDE {}
 
   /**PrintSelf method */
-  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
 private:
   SamplingRateCalculator(const Self &);    //purposely not implemented
diff --git a/Modules/Learning/Sampling/include/otbSamplingRateCalculatorList.h b/Modules/Learning/Sampling/include/otbSamplingRateCalculatorList.h
new file mode 100644
index 0000000..97107f7
--- /dev/null
+++ b/Modules/Learning/Sampling/include/otbSamplingRateCalculatorList.h
@@ -0,0 +1,111 @@
+/*=========================================================================
+
+  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 otbSamplingRateCalculatorList_h
+#define otbSamplingRateCalculatorList_h
+
+#include "otbSamplingRateCalculator.h"
+#include "otbObjectList.h"
+
+namespace otb
+{
+/** \class SamplingRateCalculatorList
+ *  \brief This class is a list of sampling rate calculators.
+ *
+ * It computes sampling rates for each image and each class, given input
+ * statistics on available samples, and a sampling strategy. The sampling
+ * strategies are made from the combination of :
+ *   - the sampling strategies of otb::SamplingRateCalculator  (mono-image)
+ *   - a multi-image behaviour : proportional / constant / custom
+ *
+ * \ingroup OTBSampling
+ */
+class ITK_EXPORT SamplingRateCalculatorList
+  : public ObjectList<SamplingRateCalculator>
+{
+public:
+  /** Standard typedefs */
+  typedef SamplingRateCalculatorList          Self;
+  typedef ObjectList<SamplingRateCalculator>  Superclass;
+  typedef itk::SmartPointer<Self>             Pointer;
+  typedef itk::SmartPointer<const Self>       ConstPointer;
+
+  typedef SamplingRateCalculator::ClassCountMapType   ClassCountMapType;
+  typedef SamplingRateCalculator::MapRateType         MapRateType;
+
+  enum PartitionType
+    {
+    PROPORTIONAL,
+    EQUAL,
+    CUSTOM
+    };
+
+  /** Type macro */
+  itkNewMacro(Self);
+
+  /** Creation through object factory macro */
+  itkTypeMacro(SamplingRateCalculatorList, ObjectList);
+
+  /** Set the class counts for input 'index' */
+  void SetNthClassCount(unsigned int index,const ClassCountMapType &map);
+
+  /** Get the sampling rates computed for input 'index' */
+  const MapRateType & GetRatesByClass(unsigned int index);
+
+  /** Clear internal data */
+  void ClearRates(void);
+
+  /** Method to select all available samples */
+  void SetAllSamples(PartitionType t);
+
+  /** Method to choose a sampling strategy based on the smallest class.
+   * The number of samples in each class is set to this minimum size*/
+  void SetMinimumNbOfSamplesByClass(PartitionType t);
+
+  /** Method to set the same number of required samples in each class */
+  void SetNbOfSamplesAllClasses(std::vector<unsigned long> &nb, PartitionType t);
+
+  /** Method to manually set the number of samples required in each class */
+  void SetNbOfSamplesByClass(const std::vector<ClassCountMapType> &required, PartitionType t);
+
+  /** Method to use a percentage of the samples available in each
+    * class */
+  void SetPercentageOfSamples(std::vector<double> &p, PartitionType t);
+
+  /** Method to set the total number of samples and use classes proportions 
+   */
+  void SetTotalNumberOfSamples(std::vector<unsigned long> &tot, PartitionType t);
+  
+protected:
+  /** Constructor */
+  SamplingRateCalculatorList(){}
+
+  /** Destructor */
+  ~SamplingRateCalculatorList() ITK_OVERRIDE {}
+
+private:
+  SamplingRateCalculatorList(const Self &);    //purposely not implemented
+  void operator =(const Self&);    //purposely not implemented
+
+  void UpdateGlobalCounts();
+
+  ClassCountMapType m_GlobalCountMap;
+
+};
+} // end namespace otb
+
+#endif
diff --git a/Modules/Learning/Sampling/src/CMakeLists.txt b/Modules/Learning/Sampling/src/CMakeLists.txt
index 90087a2..2ffa8f9 100644
--- a/Modules/Learning/Sampling/src/CMakeLists.txt
+++ b/Modules/Learning/Sampling/src/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(OTBSampling_SRC
   otbSamplingRateCalculator.cxx
+  otbSamplingRateCalculatorList.cxx
 )
 
 add_library(OTBSampling ${OTBSampling_SRC})
diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
index 2378ff1..f61ba32 100644
--- a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
+++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
@@ -90,8 +90,8 @@ SamplingRateCalculator
     else
       {
       TripletType triplet;
-      triplet.Tot = it->second;
-      triplet.Required = 0UL;
+      triplet.Tot = 0UL;
+      triplet.Required = it->second;
       triplet.Rate = 0.0;
       m_RatesByClass[it->first] = triplet;
       }
@@ -110,6 +110,40 @@ SamplingRateCalculator
     }
 }
 
+
+void SamplingRateCalculator
+::SetPercentageOfSamples(double percent)
+{
+  MapRateType::iterator it = m_RatesByClass.begin();
+  for (; it != m_RatesByClass.end() ; ++it)
+    {
+    it->second.Required = static_cast<unsigned long>(vcl_floor(0.5+percent * it->second.Tot));
+    it->second.Rate = percent;
+    }
+}
+
+void SamplingRateCalculator
+::SetTotalNumberOfSamples(unsigned long value)
+{
+  // First, get total number of samples
+  unsigned long totalNumberOfSamplesAvailable = 0;
+
+  MapRateType::iterator it = m_RatesByClass.begin();
+  for (; it != m_RatesByClass.end() ; ++it)
+    {
+    totalNumberOfSamplesAvailable+=it->second.Tot;
+    }
+
+  // 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);
+
+    it->second.Required = static_cast<unsigned long>(0.5+ratio*value);
+    this->UpdateRate(it->first);
+    }
+}
+
 void 
 SamplingRateCalculator
 ::Write(std::string filename)
@@ -134,56 +168,65 @@ SamplingRateCalculator
 {
   std::ifstream ifs(filename.c_str());
 
+  typedef std::vector<boost::iterator_range<std::string::const_iterator> > ListType;
+
   if (ifs)
     {
     this->ClearRates();
     std::string line;
     TripletType tpt;
     std::string sep("");
-    while(!ifs.eof())
+    ListType parts;
+    while(std::getline(ifs,line))
       {
-      std::getline(ifs,line);
       if (line.empty()) continue;
       std::string::size_type pos = line.find_first_not_of(" \t");
       if (pos != std::string::npos && line[pos] == '#') continue;
 
-      if (sep.size() == 0)
+      if (sep.empty())
         {
         // Try to detect the separator
-        std::string separators("\t;,");
+        std::vector<std::string> separators(4);
+        separators[0] = "\t";
+        separators[1] = ";";
+        separators[2] = ",";
+        separators[3] = " ";
+        ListType words;
         for (unsigned int k=0 ; k<separators.size() ; k++)
           {
-          std::vector<itksys::String> words = itksys::SystemTools::SplitString(line,separators[k]);
+          boost::split(words, line, boost::is_any_of(separators[k]));
           if (words.size() == 4)
             {
-            sep.push_back(separators[k]);
+            sep = separators[k];
             break;
             }
           }
-        if (sep.size() == 0) continue;
+        if (sep.empty()) continue;
         }
       // parse the line
-      std::vector<itksys::String> parts = itksys::SystemTools::SplitString(line,sep[0]);
+      boost::split(parts, line, boost::is_any_of(sep));
       if (parts.size() == 4)
         {
-        std::string::size_type pos1 = parts[0].find_first_not_of(" \t");
-        std::string::size_type pos2 = parts[0].find_last_not_of(" \t");
-        std::string::size_type pos3 = parts[1].find_first_not_of(" \t");
-        std::string::size_type pos4 = parts[1].find_last_not_of(" \t");
-        std::string::size_type pos5 = parts[2].find_first_not_of(" \t");
-        std::string::size_type pos6 = parts[2].find_last_not_of(" \t");
-        std::string::size_type pos7 = parts[3].find_first_not_of(" \t");
-        std::string::size_type pos8 = parts[3].find_last_not_of(" \t");
-        if (pos1 != std::string::npos && pos3 != std::string::npos &&
-            pos5 != std::string::npos && pos7 != std::string::npos)
+        std::string::size_type pos1 = line.find_first_not_of(" \t", parts[0].begin() - line.begin());
+        std::string::size_type pos2 = line.find_last_not_of(" \t", parts[0].end() - line.begin() -1);
+        std::string::size_type pos3 = line.find_first_not_of(" \t", parts[1].begin() - line.begin());
+        std::string::size_type pos4 = line.find_last_not_of(" \t", parts[1].end() - line.begin() -1);
+        std::string::size_type pos5 = line.find_first_not_of(" \t", parts[2].begin() - line.begin());
+        std::string::size_type pos6 = line.find_last_not_of(" \t", parts[2].end() - line.begin() -1);
+        std::string::size_type pos7 = line.find_first_not_of(" \t", parts[3].begin() - line.begin());
+        std::string::size_type pos8 = line.find_last_not_of(" \t", parts[3].end() - line.begin() -1);
+        if (pos2 != std::string::npos && pos1 <= pos2 &&
+            pos4 != std::string::npos && pos3 <= pos4 &&
+            pos6 != std::string::npos && pos5 <= pos6 &&
+            pos8 != std::string::npos && pos7 <= pos8)
           {
-          std::string name = parts[0].substr(pos1, pos2 - pos1 + 1);
-          std::string val1 = parts[1].substr(pos3, pos4 - pos3 + 1);
-          std::string val2 = parts[2].substr(pos5, pos6 - pos5 + 1);
-          std::string val3 = parts[3].substr(pos7, pos8 - pos7 + 1);
-          tpt.Required = boost::lexical_cast<unsigned long>(val1);
-          tpt.Tot = boost::lexical_cast<unsigned long>(val2);
-          tpt.Rate = boost::lexical_cast<double>(val3);
+          std::string name = line.substr(pos1, pos2 - pos1 + 1);
+          std::string val1 = line.substr(pos3, pos4 - pos3 + 1);
+          std::string val2 = line.substr(pos5, pos6 - pos5 + 1);
+          std::string val3 = line.substr(pos7, pos8 - pos7 + 1);
+          tpt.Required = Utils::LexicalCast<unsigned long>(val1, "number of samples");
+          tpt.Tot = Utils::LexicalCast<unsigned long>(val2, "number of samples");
+          tpt.Rate = Utils::LexicalCast<double>(val3, "rate");
           m_RatesByClass[name] = tpt;
           }
         }
@@ -226,6 +269,73 @@ SamplingRateCalculator
   m_RatesByClass.clear();
 }
 
+SamplingRateCalculator::ClassCountMapType
+SamplingRateCalculator
+::ReadRequiredSamples(const std::string& filename)
+{
+  ClassCountMapType output;
+  std::ifstream ifs(filename.c_str());
+
+  typedef std::vector<boost::iterator_range<std::string::const_iterator> > ListType;
+
+  if (ifs)
+    {
+    std::string line;
+    std::string sep("");
+    ListType parts;
+
+    while(std::getline(ifs,line))
+      {
+      if (line.empty()) continue;
+      std::string::size_type pos = line.find_first_not_of(" \t");
+      if (pos != std::string::npos && line[pos] == '#') continue;
+
+      if (sep.empty())
+        {
+        // Try to detect the separator
+        std::vector<std::string> separators(4);
+        separators[0] = "\t";
+        separators[1] = ";";
+        separators[2] = ",";
+        separators[3] = " ";
+        ListType words;
+        for (unsigned int k=0 ; k<separators.size() ; k++)
+          {
+          boost::split(words, line, boost::is_any_of(separators[k]));
+          if (words.size() >= 2)
+            {
+            sep = separators[k];
+            break;
+            }
+          }
+        if (sep.empty()) continue;
+        }
+      // parse the line
+      boost::split(parts, line, boost::is_any_of(sep));
+      if (parts.size() >= 2)
+        {
+        std::string::size_type pos1 = line.find_first_not_of(" \t", parts[0].begin() - line.begin());
+        std::string::size_type pos2 = line.find_last_not_of(" \t", parts[0].end() - line.begin() -1);
+        std::string::size_type pos3 = line.find_first_not_of(" \t", parts[1].begin() - line.begin());
+        std::string::size_type pos4 = line.find_last_not_of(" \t", parts[1].end() - line.begin() -1);
+        if (pos2 != std::string::npos && pos1 <= pos2 &&
+            pos4 != std::string::npos && pos3 <= pos4)
+          {
+          std::string name = line.substr(pos1, pos2 - pos1 + 1);
+          std::string value = line.substr(pos3, pos4 - pos3 + 1);
+          output[name] = Utils::LexicalCast<unsigned long>(value, "number of samples");
+          }
+        }
+      }
+    ifs.close();
+    }
+  else
+    {
+    itkGenericExceptionMacro(<< " Couldn't open " << filename);
+    }
+  return output;
+}
+
 void
 SamplingRateCalculator
 ::UpdateRate(const std::string &name)
diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx
new file mode 100644
index 0000000..1ffe03a
--- /dev/null
+++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculatorList.cxx
@@ -0,0 +1,431 @@
+/*=========================================================================
+
+  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 "otbSamplingRateCalculatorList.h"
+#include "otbMacro.h"
+
+namespace otb
+{
+
+void
+SamplingRateCalculatorList
+::SetNthClassCount(unsigned int index,const ClassCountMapType &map)
+{
+  if (index >= this->Size())
+    {
+    unsigned int currentSize = this->Size();
+    for (unsigned int i = currentSize ; i < (index+1) ; i++ )
+      {
+      this->PushBack(SamplingRateCalculator::New());
+      }
+    }
+  this->GetNthElement(index)->SetClassCount(map);
+}
+
+const SamplingRateCalculatorList::MapRateType &
+SamplingRateCalculatorList
+::GetRatesByClass(unsigned int index)
+{
+  if (index >= this->Size())
+    {
+    itkGenericExceptionMacro("Requesting an index ("<<index<<") larger than list size ("<<this->Size()<<")");
+    }
+  return this->GetNthElement(index)->GetRatesByClass();
+}
+
+void
+SamplingRateCalculatorList
+::ClearRates(void)
+{
+  for (unsigned int i=0 ; i<this->Size() ; i++)
+    {
+    this->GetNthElement(i)->ClearRates();
+    }
+}
+
+void
+SamplingRateCalculatorList
+::SetAllSamples(PartitionType t)
+{
+  this->UpdateGlobalCounts();
+  switch (t)
+    {
+    case PROPORTIONAL:
+    case EQUAL:
+    case CUSTOM:
+      {
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetAllSamples();
+        }
+      break;
+      }
+    default:
+      itkGenericExceptionMacro("Unknown partition mode");
+      break;  
+    }
+}
+
+void
+SamplingRateCalculatorList
+::SetMinimumNbOfSamplesByClass(PartitionType t)
+{
+  this->UpdateGlobalCounts();
+  switch (t)
+    {
+    case PROPORTIONAL:
+    case EQUAL:
+      {
+      // Use the smallest class globally to derive the constant needed 
+      unsigned long smallest = itk::NumericTraits<unsigned long>::max();
+      ClassCountMapType::iterator it = m_GlobalCountMap.begin();
+      for (; it != m_GlobalCountMap.end() ; ++it)
+        {
+        if (smallest > it->second && it->second > 0UL)
+          {
+          smallest = it->second;
+          }
+        }
+      if (smallest == itk::NumericTraits<unsigned long>::max())
+        {
+        otbWarningMacro("All classes are empty !");
+        smallest = 0UL;
+        }
+      std::vector<unsigned long> needed;
+      needed.push_back(smallest);
+      this->SetNbOfSamplesAllClasses(needed,t);
+      break;
+      }
+    case CUSTOM:
+      {
+      // Use the smallest class in each input
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetMinimumNbOfSamplesByClass();
+        }
+      break;
+      }
+    default:
+      itkGenericExceptionMacro("Unknown partition mode");
+      break;  
+    }
+}
+
+void
+SamplingRateCalculatorList
+::SetNbOfSamplesAllClasses(std::vector<unsigned long> &nb, PartitionType t)
+{
+  if (nb.empty())
+    {
+    itkGenericExceptionMacro("No number of samples given");
+    }
+  this->UpdateGlobalCounts();
+  ClassCountMapType::const_iterator it;
+  ClassCountMapType needed;
+  switch (t)
+    {
+    case PROPORTIONAL:
+      {
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        needed.clear();
+        for (it = m_GlobalCountMap.begin(); it != m_GlobalCountMap.end() ; ++it)
+          {
+          const MapRateType& rates = this->GetNthElement(i)->GetRatesByClass();
+          MapRateType::const_iterator curIt = rates.find(it->first);
+          if (curIt != rates.end() &&
+              it->second > 0UL)
+            {
+            unsigned long curTotal = (curIt->second).Tot;
+            needed[it->first] = static_cast<unsigned long>(vcl_floor(
+              static_cast<double>(nb[0]) *
+              static_cast<double>(curTotal) /
+              static_cast<double>(it->second)));
+            }
+          else
+            {
+            needed[it->first] = 0UL;
+            }
+          }
+        this->GetNthElement(i)->SetNbOfSamplesByClass(needed);
+        }
+      break;
+      }
+    case EQUAL:
+      {
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetNbOfSamplesAllClasses(
+          static_cast<unsigned long>(vcl_floor(
+            (double)nb[0] / (double)this->Size())));
+        }
+      break;
+      }
+    case CUSTOM:
+      {
+      if (nb.size() < this->Size())
+        {
+        itkGenericExceptionMacro("Not enough values present to set custom requested numbers in all inputs");
+        }
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetNbOfSamplesAllClasses(nb[i]);
+        }
+      break;
+      }
+    default:
+      itkGenericExceptionMacro("Unknown partition mode");
+      break;  
+    }
+}
+
+void
+SamplingRateCalculatorList
+::SetNbOfSamplesByClass(const std::vector<ClassCountMapType> &required, PartitionType t)
+{
+  if (required.empty())
+    {
+    itkGenericExceptionMacro("No number of samples given");
+    }
+  this->UpdateGlobalCounts();
+  ClassCountMapType::const_iterator it;
+  ClassCountMapType::const_iterator inputIt;
+  ClassCountMapType needed;
+  switch (t)
+    {
+    case PROPORTIONAL:
+      {
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        needed.clear();
+        for (it = m_GlobalCountMap.begin(); it != m_GlobalCountMap.end() ; ++it)
+          {
+          const MapRateType &rates = this->GetNthElement(i)->GetRatesByClass();
+          MapRateType::const_iterator curIt = rates.find(it->first);
+          inputIt = required[0].find(it->first);
+          if (curIt != rates.end() &&
+              inputIt != required[0].end() &&
+              it->second > 0UL)
+            {
+            unsigned long curTotal = (curIt->second).Tot;
+            needed[it->first] = static_cast<unsigned long>(vcl_floor(
+              static_cast<double>(inputIt->second) *
+              static_cast<double>(curTotal) /
+              static_cast<double>(it->second)));
+            }
+          else
+            {
+            needed[it->first] = 0UL;
+            }
+          }
+        this->GetNthElement(i)->SetNbOfSamplesByClass(needed);
+        }
+      break;
+      }
+    case EQUAL:
+      {
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        needed.clear();
+        for (it = m_GlobalCountMap.begin(); it != m_GlobalCountMap.end() ; ++it)
+          {
+          const MapRateType &rates = this->GetNthElement(i)->GetRatesByClass();
+          MapRateType::const_iterator curIt = rates.find(it->first);
+          inputIt = required[0].find(it->first);
+          if (curIt != rates.end() &&
+              inputIt != required[0].end() &&
+              it->second > 0UL)
+            {
+            unsigned long curTotal = (curIt->second).Tot;
+            unsigned long curNeeded = static_cast<unsigned long>(vcl_floor(
+              static_cast<double>(inputIt->second) /
+              static_cast<double>(this->Size())));
+            needed[it->first] = std::min(curTotal,curNeeded);
+            }
+          else
+            {
+            needed[it->first] = 0UL;
+            }
+          }
+        this->GetNthElement(i)->SetNbOfSamplesByClass(needed);
+        }
+      break;
+      }
+    case CUSTOM:
+      {
+      if (required.size() < this->Size())
+        {
+        itkGenericExceptionMacro("Not enough values present to set custom requested numbers in all inputs");
+        }
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetNbOfSamplesByClass(required[i]);
+        }
+      break;
+      }
+    default:
+      itkGenericExceptionMacro("Unknown partition mode");
+      break;  
+    }
+}
+
+void
+SamplingRateCalculatorList
+::SetPercentageOfSamples(std::vector<double> &p, PartitionType t)
+{
+  if (p.empty())
+    {
+    itkGenericExceptionMacro("No percentage given");
+    }
+  
+  this->UpdateGlobalCounts();
+  
+  ClassCountMapType::const_iterator it;
+  ClassCountMapType needed;
+  switch (t)
+    {
+    case PROPORTIONAL:
+      {
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetPercentageOfSamples(p[0]);
+        }
+      break;
+      }
+    case EQUAL:
+      {
+      needed.clear();
+      for (it = m_GlobalCountMap.begin(); it != m_GlobalCountMap.end() ; ++it)
+        {
+        needed[it->first]=static_cast<unsigned long>(vcl_floor(0.5 + it->second * p[0] / (double)this->Size()));
+        }
+
+      
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetNbOfSamplesByClass(needed);
+        }        
+      break;
+      }
+    case CUSTOM:
+      {
+      if (p.size() < this->Size())
+        {
+        itkGenericExceptionMacro("Not enough values present to set custom percents in all inputs");
+        }
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetPercentageOfSamples(p[i]);
+        }
+      break;
+      }
+    default:
+      itkGenericExceptionMacro("Unknown partition mode");
+      break;  
+    }
+}
+
+void
+SamplingRateCalculatorList
+::SetTotalNumberOfSamples(std::vector<unsigned long> &tot, PartitionType t)
+{
+  if (tot.empty())
+    {
+    itkGenericExceptionMacro("No percentage given");
+    }
+  
+  this->UpdateGlobalCounts();
+  
+  ClassCountMapType needed;
+  switch (t)
+    {
+    case PROPORTIONAL:
+      {
+      unsigned long total_nb_samples = 0UL;
+
+      std::vector<unsigned long> nb_samples(this->Size(),0UL);
+      
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        // Compute the total number of samples for image i
+        const MapRateType & rates = this->GetNthElement(i)->GetRatesByClass();
+      
+        for(MapRateType::const_iterator it = rates.begin();it!=rates.end();++it)
+          {
+          nb_samples[i]+=it->second.Tot;
+          }
+
+        total_nb_samples+=nb_samples[i];
+        }
+        
+        for (unsigned int i=0 ; i<this->Size() ; i++)
+          {        
+            this->GetNthElement(i)->SetTotalNumberOfSamples(vcl_floor(0.5+tot[0]*nb_samples[i]/static_cast<double>(total_nb_samples)));
+        }
+      break;
+      }
+    case EQUAL:
+      {
+
+      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++)
+        {
+        this->GetNthElement(i)->SetTotalNumberOfSamples(total_by_image);
+        }        
+      break;
+      }
+    case CUSTOM:
+      {
+      if (tot.size() < this->Size())
+        {
+        itkGenericExceptionMacro("Not enough values present to set total samples in all inputs");
+        }
+      for (unsigned int i=0 ; i<this->Size() ; i++)
+        {
+        this->GetNthElement(i)->SetTotalNumberOfSamples(tot[i]);
+        }
+      break;
+      }
+    default:
+      itkGenericExceptionMacro("Unknown partition mode");
+      break;  
+    }
+  
+
+}
+
+
+void
+SamplingRateCalculatorList
+::UpdateGlobalCounts()
+{
+  m_GlobalCountMap.clear();
+  for (unsigned int i=0 ; i<this->Size() ; i++)
+    {
+    const MapRateType &rates = this->GetNthElement(i)->GetRatesByClass();
+    MapRateType::const_iterator it = rates.begin();
+    for (; it != rates.end() ; ++it)
+      {
+      m_GlobalCountMap[it->first] += it->second.Tot;
+      }
+    }
+}
+
+} // end of namespace otb
+
diff --git a/Modules/Learning/Sampling/test/CMakeLists.txt b/Modules/Learning/Sampling/test/CMakeLists.txt
index 7c7fd77..e3273ee 100644
--- a/Modules/Learning/Sampling/test/CMakeLists.txt
+++ b/Modules/Learning/Sampling/test/CMakeLists.txt
@@ -6,6 +6,7 @@ otbOGRDataToSamplePositionFilterTest.cxx
 otbSamplingRateCalculatorTest.cxx
 otbOGRDataToClassStatisticsFilterTest.cxx
 otbImageSampleExtractorFilterTest.cxx
+otbSamplingRateCalculatorListTest.cxx
 )
 
 add_executable(otbSamplingTestDriver ${OTBSamplingTests})
@@ -92,3 +93,16 @@ otb_add_test(NAME leTvImageSampleExtractorFilterUpdate COMMAND otbSamplingTestDr
   otbImageSampleExtractorFilterUpdate
   ${INPUTDATA}/variousVectors.sqlite
   ${TEMP}/leTvImageSampleExtractorFilterUpdateTest.shp)
+
+# ---------------- SamplingRateCalculatorList ---------------------------------
+otb_add_test(NAME leTuSamplingRateCalculatorListNew COMMAND otbSamplingTestDriver
+            otbSamplingRateCalculatorListNew 
+  
+  )
+
+otb_add_test(NAME leTvSamplingRateCalculatorList COMMAND otbSamplingTestDriver
+  --compare-ascii ${NOTOL}
+  ${BASELINE_FILES}/leTvSamplingRateCalculatorList.txt
+  ${TEMP}/leTvSamplingRateCalculatorList.txt
+  otbSamplingRateCalculatorList
+  ${TEMP}/leTvSamplingRateCalculatorList.txt)
diff --git a/Modules/Learning/Sampling/test/otbOGRDataToSamplePositionFilterTest.cxx b/Modules/Learning/Sampling/test/otbOGRDataToSamplePositionFilterTest.cxx
index 2e4338f..afca840 100644
--- a/Modules/Learning/Sampling/test/otbOGRDataToSamplePositionFilterTest.cxx
+++ b/Modules/Learning/Sampling/test/otbOGRDataToSamplePositionFilterTest.cxx
@@ -304,6 +304,9 @@ int otbOGRDataToSamplePositionFilterPattern(int argc, char* argv[])
 
   otb::PatternSampler::ParameterType param1, param2, param3;
   param1.Seed = 0UL;
+  param1.MaxPatternSize=0UL;
+  param1.Pattern1 = std::vector<bool>();
+  param1.Pattern2 = std::vector<bool>();
   param2 = param1;
   param3 = param1;
   otb::PatternSampler::ImportPatterns(patternClass1,param1);
diff --git a/Modules/Learning/Sampling/test/otbSamplingRateCalculatorListTest.cxx b/Modules/Learning/Sampling/test/otbSamplingRateCalculatorListTest.cxx
new file mode 100644
index 0000000..388f920
--- /dev/null
+++ b/Modules/Learning/Sampling/test/otbSamplingRateCalculatorListTest.cxx
@@ -0,0 +1,226 @@
+/*=========================================================================
+
+  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 "otbSamplingRateCalculatorList.h"
+
+#include "otbStatisticsXMLFileReader.h"
+#include "itkVariableLengthVector.h"
+#include <fstream>
+
+int otbSamplingRateCalculatorListNew(int itkNotUsed(argc), char* itkNotUsed(argv) [])
+{
+  typedef otb::SamplingRateCalculatorList RateCalculatorListType;
+  
+  RateCalculatorListType::Pointer rateCalculator = RateCalculatorListType::New();
+  std::cout << rateCalculator << std::endl;
+  return EXIT_SUCCESS;
+}
+
+int otbSamplingRateCalculatorList(int itkNotUsed(argc), char* argv[])
+{
+  std::ofstream file(argv[1], std::ios::out | std::ios::trunc);
+
+  if (!file)
+    {
+    std::cout << " Couldn't open " << argv[1];
+    return EXIT_FAILURE;
+    }
+
+  itk::Indent indent_1(1);
+
+  typedef otb::SamplingRateCalculatorList::ClassCountMapType  ClassCountMapType;
+  typedef otb::SamplingRateCalculatorList::PartitionType      PartitionType;
+
+  PartitionType typeProportional = otb::SamplingRateCalculatorList::PROPORTIONAL;
+  PartitionType typeEqual = otb::SamplingRateCalculatorList::EQUAL;
+  PartitionType typeCustom = otb::SamplingRateCalculatorList::CUSTOM;
+
+  std::string c1("1");
+  std::string c2("2");
+  std::string c3("3");
+  std::string c4("4");
+
+  ClassCountMapType classCount1, classCount2, classCount3;
+  // input 1
+  classCount1[c1] = 104;
+  classCount1[c2] = 160;
+  classCount1[c3] = 211;
+  // input 2
+  classCount2[c1] = 98;
+  classCount2[c2] = 190;
+  classCount2[c3] = 178;
+  // input 3
+  classCount3[c1] = 130;
+  classCount3[c2] = 144;
+  classCount3[c4] = 250;
+
+  std::vector<unsigned long> nbSamplesCst;
+  nbSamplesCst.push_back(151);
+
+  std::vector<double> percent;
+  percent.push_back(0.33);
+
+  std::vector<unsigned long> total;
+  total.push_back(300);
+
+  std::vector<unsigned long> nbSamplesCstCustom;
+  nbSamplesCstCustom.push_back(70);
+  nbSamplesCstCustom.push_back(80);
+  nbSamplesCstCustom.push_back(90);
+
+  ClassCountMapType needed1;
+  needed1[c1] = 140;
+  needed1[c2] = 130;
+  needed1[c3] = 124;
+
+  std::vector<ClassCountMapType> nbByClass;
+  nbByClass.push_back(needed1);
+
+  ClassCountMapType needed2;
+  needed2[c1] = 67;
+  needed2[c2] = 55;
+  needed2[c3] = 72;
+
+  ClassCountMapType needed3;
+  needed3[c1] = 77;
+  needed3[c2] = 69;
+  needed3[c3] = 34;
+
+  ClassCountMapType needed4;
+  needed4[c1] = 86;
+  needed4[c2] = 43;
+  needed4[c4] = 98;
+
+  std::vector<ClassCountMapType> nbByClassCustom;
+  nbByClassCustom.push_back(needed2);
+  nbByClassCustom.push_back(needed3);
+  nbByClassCustom.push_back(needed4);
+
+  typedef otb::SamplingRateCalculatorList RateCalculatorListType;
+  RateCalculatorListType::Pointer rateCalcList = RateCalculatorListType::New();
+  rateCalcList->SetNthClassCount(0,classCount1);
+  rateCalcList->SetNthClassCount(2,classCount3);
+  rateCalcList->SetNthClassCount(1,classCount2);
+
+  file << "# Test the strategy : smallest - equal" << std::endl;
+  rateCalcList->SetMinimumNbOfSamplesByClass(typeEqual);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : smallest - custom" << std::endl;
+  rateCalcList->SetMinimumNbOfSamplesByClass(typeCustom);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : constant - proportional" << std::endl;
+  rateCalcList->SetNbOfSamplesAllClasses(nbSamplesCst,typeProportional);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : constant - equal" << std::endl;
+  rateCalcList->SetNbOfSamplesAllClasses(nbSamplesCst,typeEqual);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : constant - custom" << std::endl;
+  rateCalcList->SetNbOfSamplesAllClasses(nbSamplesCstCustom,typeCustom);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : byClass - proportional" << std::endl;
+  rateCalcList->SetNbOfSamplesByClass(nbByClass,typeProportional);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : byClass - equal" << std::endl;
+  rateCalcList->SetNbOfSamplesByClass(nbByClass,typeEqual);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : byClass - custom" << std::endl;
+  rateCalcList->SetNbOfSamplesByClass(nbByClassCustom,typeCustom);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file << "# Test the strategy : all - equal" << std::endl;
+  rateCalcList->SetAllSamples(typeEqual);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file <<"#Test the strategy : percent - proportional"<<std::endl;
+  rateCalcList->SetPercentageOfSamples(percent,typeProportional);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+  
+  file <<"#Test the strategy : percent - equal"<<std::endl;
+  rateCalcList->SetPercentageOfSamples(percent,typeEqual);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+
+  file <<"#Test the strategy : total - proportional"<<std::endl;
+  rateCalcList->SetTotalNumberOfSamples(total,typeProportional);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+  
+  file <<"#Test the strategy : total - equal"<<std::endl;
+  rateCalcList->SetTotalNumberOfSamples(total,typeEqual);
+  for (unsigned int i=0 ; i<rateCalcList->Size() ; i++)
+    {
+    file << "# Input "<< i << std::endl;
+    rateCalcList->GetNthElement(i)->Print(file, indent_1);
+    }
+  
+  file.close();
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Learning/Sampling/test/otbSamplingTestDriver.cxx b/Modules/Learning/Sampling/test/otbSamplingTestDriver.cxx
index 20a48dc..c051e9a 100644
--- a/Modules/Learning/Sampling/test/otbSamplingTestDriver.cxx
+++ b/Modules/Learning/Sampling/test/otbSamplingTestDriver.cxx
@@ -11,4 +11,6 @@ void RegisterTests()
   REGISTER_TEST(otbImageSampleExtractorFilterNew);
   REGISTER_TEST(otbImageSampleExtractorFilter);
   REGISTER_TEST(otbImageSampleExtractorFilterUpdate);
+  REGISTER_TEST(otbSamplingRateCalculatorListNew);
+  REGISTER_TEST(otbSamplingRateCalculatorList);
 }
diff --git a/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.h b/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.h
index ba95eea..d09e219 100644
--- a/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.h
@@ -94,8 +94,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -119,6 +117,10 @@ protected:
   /** Destructor */
   ~BoostMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.txx
index 8d20ca5..5f7745a 100644
--- a/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbBoostMachineLearningModel.txx
@@ -77,7 +77,7 @@ template <class TInputValue, class TOutputValue>
 typename BoostMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 BoostMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbCvRTreesWrapper.h b/Modules/Learning/Supervised/include/otbCvRTreesWrapper.h
index 3494a4e..674eb8c 100644
--- a/Modules/Learning/Supervised/include/otbCvRTreesWrapper.h
+++ b/Modules/Learning/Supervised/include/otbCvRTreesWrapper.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * \ingroup OTBSupervised
  */
-class CV_EXPORTS_W CvRTreesWrapper : public CvRTrees
+class OTBSupervised_EXPORT CvRTreesWrapper : public CvRTrees
 {
 public:
   typedef std::vector<unsigned int> VotesVectorType;
@@ -37,25 +37,25 @@ public:
   ~CvRTreesWrapper() ITK_OVERRIDE;
 
   /** Compute the number of votes for each class. */
-  void get_votes(const cv::Mat& sample, 
+  void get_votes(const cv::Mat& sample,
                  const cv::Mat& missing,
                  VotesVectorType& vote_count) const;
-  
+
   /** Predict the confidence of the classifcation by computing the proportion
       of trees which voted for the majority class.
   */
-  float predict_confidence(const cv::Mat& sample, 
-                           const cv::Mat& missing = 
+  float predict_confidence(const cv::Mat& sample,
+                           const cv::Mat& missing =
                            cv::Mat()) const;
 
-  /** Predict the confidence margin of the classifcation by computing the 
+  /** Predict the confidence margin of the classifcation by computing the
       difference in votes between the first and second most voted classes.
       This measure is preferred to the proportion of votes of the majority
       class, since it provides information about the conflict between the
       most likely classes.
   */
-  float predict_margin(const cv::Mat& sample, 
-                          const cv::Mat& missing = 
+  float predict_margin(const cv::Mat& sample,
+                          const cv::Mat& missing =
                           cv::Mat()) const;
 };
 
diff --git a/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.h b/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.h
index 571bbd5..a34417e 100644
--- a/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.h
@@ -149,8 +149,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -174,6 +172,9 @@ protected:
   /** Destructor */
   ~DecisionTreeMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.txx
index 07ce3a1..ebcc7bf 100644
--- a/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbDecisionTreeMachineLearningModel.txx
@@ -83,7 +83,7 @@ template <class TInputValue, class TOutputValue>
 typename DecisionTreeMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 DecisionTreeMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.h b/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.h
index 4221da6..92f9e04 100644
--- a/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.h
@@ -102,8 +102,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -127,6 +125,10 @@ protected:
   /** Destructor */
   ~GradientBoostedTreeMachineLearningModel() ITK_OVERRIDE;
 
+    /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.txx
index 53e6931..3ab84ac 100644
--- a/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbGradientBoostedTreeMachineLearningModel.txx
@@ -79,7 +79,7 @@ template <class TInputValue, class TOutputValue>
 typename GradientBoostedTreeMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 GradientBoostedTreeMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbImageClassificationFilter.h b/Modules/Learning/Supervised/include/otbImageClassificationFilter.h
index e8ee652..7d4cf8a 100644
--- a/Modules/Learning/Supervised/include/otbImageClassificationFilter.h
+++ b/Modules/Learning/Supervised/include/otbImageClassificationFilter.h
@@ -67,7 +67,7 @@ public:
   typedef typename OutputImageType::PixelType  LabelType;
 
   typedef MachineLearningModel<ValueType, LabelType> ModelType;
-  typedef typename ModelType::Pointer    ModelPointerType;
+  typedef typename ModelType::Pointer                ModelPointerType;
 
   typedef otb::Image<double>                    ConfidenceImageType;
   typedef typename ConfidenceImageType::Pointer ConfidenceImagePointerType;
@@ -84,6 +84,10 @@ public:
   itkSetMacro(UseConfidenceMap, bool);
   itkGetMacro(UseConfidenceMap, bool);
 
+  itkSetMacro(BatchMode, bool);
+  itkGetMacro(BatchMode, bool);
+  itkBooleanMacro(BatchMode);
+  
   /**
    * If set, only pixels within the mask will be classified.
    * All pixels with a value greater than 0 in the mask, will be classified.
@@ -110,6 +114,8 @@ protected:
 
   /** Threaded generate data */
   void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId) ITK_OVERRIDE;
+  void ClassicThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId);
+  void BatchThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId);
   /** Before threaded generate data */
   void BeforeThreadedGenerateData() ITK_OVERRIDE;
   /**PrintSelf method */
@@ -125,6 +131,7 @@ private:
   LabelType m_DefaultLabel;
   /** Flag to produce the confidence map (if the model supports it) */
   bool m_UseConfidenceMap;
+  bool m_BatchMode;
 };
 } // End namespace otb
 #ifndef OTB_MANUAL_INSTANTIATION
diff --git a/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx b/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx
index 7261486..899a5a2 100644
--- a/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx
+++ b/Modules/Learning/Supervised/include/otbImageClassificationFilter.txx
@@ -39,6 +39,7 @@ ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
   this->SetNthOutput(0,TOutputImage::New());
   this->SetNthOutput(1,ConfidenceImageType::New());
   m_UseConfidenceMap = false;
+  m_BatchMode = true;
 }
 
 template <class TInputImage, class TOutputImage, class TMaskImage>
@@ -84,12 +85,19 @@ ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
     {
     itkGenericExceptionMacro(<< "No model for classification");
     }
+  if(m_BatchMode)
+    {
+    #ifdef _OPENMP
+    // OpenMP will take care of threading
+    this->SetNumberOfThreads(1);
+    #endif
+    }
 }
 
 template <class TInputImage, class TOutputImage, class TMaskImage>
 void
 ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
-::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
+::ClassicThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
 {
   // Get the input pointers
   InputImageConstPointerType inputPtr     = this->GetInput();
@@ -166,6 +174,140 @@ ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
     }
 
 }
+
+template <class TInputImage, class TOutputImage, class TMaskImage>
+void
+ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
+::BatchThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
+{
+  bool computeConfidenceMap(m_UseConfidenceMap && m_Model->HasConfidenceIndex() 
+                            && !m_Model->GetRegressionMode());
+  // Get the input pointers
+  InputImageConstPointerType inputPtr     = this->GetInput();
+  MaskImageConstPointerType  inputMaskPtr  = this->GetInputMask();
+  OutputImagePointerType     outputPtr    = this->GetOutput();
+  ConfidenceImagePointerType confidencePtr = this->GetOutputConfidence();
+    
+  // Progress reporting
+  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
+
+  // Define iterators
+  typedef itk::ImageRegionConstIterator<InputImageType> InputIteratorType;
+  typedef itk::ImageRegionConstIterator<MaskImageType>  MaskIteratorType;
+  typedef itk::ImageRegionIterator<OutputImageType>     OutputIteratorType;
+  typedef itk::ImageRegionIterator<ConfidenceImageType> ConfidenceMapIteratorType;
+
+  InputIteratorType inIt(inputPtr, outputRegionForThread);
+  OutputIteratorType outIt(outputPtr, outputRegionForThread);
+
+  MaskIteratorType maskIt;
+  if (inputMaskPtr)
+    {
+    maskIt = MaskIteratorType(inputMaskPtr, outputRegionForThread);
+    maskIt.GoToBegin();
+    }
+
+  // typedef typename ModelType::InputValueType       InputValueType;
+  typedef typename ModelType::InputSampleType      InputSampleType;
+  typedef typename ModelType::InputListSampleType  InputListSampleType;
+  typedef typename ModelType::TargetValueType      TargetValueType;
+  // typedef typename ModelType::TargetSampleType     TargetSampleType;
+  typedef typename ModelType::TargetListSampleType TargetListSampleType;
+  // typedef typename ModelType::ConfidenceValueType      ConfidenceValueType;
+  // typedef typename ModelType::ConfidenceSampleType     ConfidenceSampleType;
+  typedef typename ModelType::ConfidenceListSampleType ConfidenceListSampleType;
+
+  typename InputListSampleType::Pointer samples = InputListSampleType::New();
+  unsigned int num_features = inputPtr->GetNumberOfComponentsPerPixel();
+  samples->SetMeasurementVectorSize(num_features);
+  InputSampleType sample(num_features);
+  // Fill the samples
+  bool validPoint = true;
+  for (inIt.GoToBegin(); !inIt.IsAtEnd(); ++inIt)
+    {
+    // Check pixel validity
+    if (inputMaskPtr)
+      {
+      validPoint = maskIt.Get() > 0;
+      ++maskIt;
+      }
+    if(validPoint)
+      {
+      typename InputImageType::PixelType pix = inIt.Get();
+      for(size_t feat=0; feat<num_features; ++feat)
+        {
+        sample[feat]=pix[feat];
+        }
+      samples->PushBack(sample);
+      }
+    }
+  //Make the batch prediction
+  typename TargetListSampleType::Pointer labels;
+  typename ConfidenceListSampleType::Pointer confidences;
+  if(computeConfidenceMap)
+    confidences = ConfidenceListSampleType::New();
+
+  // This call is threadsafe
+  labels = m_Model->PredictBatch(samples,confidences);
+
+  // Set the output values
+  ConfidenceMapIteratorType confidenceIt;
+  if (computeConfidenceMap)
+    {
+    confidenceIt = ConfidenceMapIteratorType(confidencePtr,outputRegionForThread);
+    confidenceIt.GoToBegin();
+    }
+
+  typename TargetListSampleType::ConstIterator labIt = labels->Begin();
+  maskIt.GoToBegin();
+  for (outIt.GoToBegin(); labIt!=labels->End() && !outIt.IsAtEnd(); 
+       ++outIt)
+    {
+    double confidenceIndex = 0.0;
+    TargetValueType labelValue(m_DefaultLabel);
+    if (inputMaskPtr)
+      {
+      validPoint = maskIt.Get() > 0;
+      ++maskIt;
+      }
+    if (validPoint)
+      {
+      labelValue = labIt.GetMeasurementVector()[0];
+
+       if(computeConfidenceMap)
+        {
+        confidenceIndex = confidences->GetMeasurementVector(labIt.GetInstanceIdentifier())[0];
+        }
+       
+      ++labIt;    
+      }
+    
+    outIt.Set(labelValue);
+
+    if(computeConfidenceMap)
+      {
+      confidenceIt.Set(confidenceIndex);
+      ++confidenceIt;
+      }
+    
+    progress.CompletedPixel();
+    }
+}
+template <class TInputImage, class TOutputImage, class TMaskImage>
+void
+ImageClassificationFilter<TInputImage, TOutputImage, TMaskImage>
+::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
+{
+  if(m_BatchMode)
+    {
+    this->BatchThreadedGenerateData(outputRegionForThread, threadId);
+    }
+  else
+    {
+    this->ClassicThreadedGenerateData(outputRegionForThread, threadId);
+    }
+
+}
 /**
  * PrintSelf Method
  */
diff --git a/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.h b/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.h
index bc5e586..857fa37 100644
--- a/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.h
@@ -60,7 +60,7 @@ public:
 
   /** Decision rule once the KNN are found :
    *  [for classification]
-   *   - KNN_VOTING : output value with maximum occurences (for classification)
+   *   - KNN_VOTING : output value with maximum occurrences (for classification)
    *  [for regression]
    *   - KNN_MEAN : output mean value of neighbors
    *   - KNN_MEDIAN : output median value of neighbors
@@ -73,8 +73,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -98,6 +96,10 @@ protected:
   /** Destructor */
   ~KNearestNeighborsMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.txx
index 2a6705d..040a0ea 100644
--- a/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbKNearestNeighborsMachineLearningModel.txx
@@ -85,7 +85,7 @@ template <class TInputValue, class TTargetValue>
 typename KNearestNeighborsMachineLearningModel<TInputValue,TTargetValue>
 ::TargetSampleType
 KNearestNeighborsMachineLearningModel<TInputValue,TTargetValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.h b/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.h
index b398f7d..2fb0329 100644
--- a/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.h
@@ -61,8 +61,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string &filename, const std::string & name="") ITK_OVERRIDE;
@@ -122,6 +120,9 @@ protected:
   /** Destructor */
   ~LibSVMMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.txx
index 70da67e..bc35ad6 100644
--- a/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbLibSVMMachineLearningModel.txx
@@ -71,7 +71,7 @@ template <class TInputValue, class TOutputValue>
 typename LibSVMMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 LibSVMMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   TargetSampleType target;
 
diff --git a/Modules/Learning/Supervised/include/otbMachineLearningModel.h b/Modules/Learning/Supervised/include/otbMachineLearningModel.h
index 3bc693c..2cf4850 100644
--- a/Modules/Learning/Supervised/include/otbMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbMachineLearningModel.h
@@ -34,7 +34,8 @@ namespace otb
  * Neural Network, ...) in the generic supervised classification framework of the OTB.
  * The main generic virtual methods specifically implemented in each classifier
  * derived from the MachineLearningModel class are two learning-related methods:
- * Train() and Save(), and two classification-related methods: Load() and Predict().
+ * Train() and Save(), and three classification-related methods: Load(),
+ * DoPredict() and optionnaly DoPredictBatch().
  *
  * Thus, each classifier derived from the MachineLearningModel class
  * computes its corresponding model with Train() and exports it with
@@ -55,6 +56,7 @@ namespace otb
  * \sa GradientBoostedTreeMachineLearningModel
  * \sa NormalBayesMachineLearningModel
  * \sa NeuralNetworkMachineLearningModel
+ * \sa SharkRandomForestsMachineLearningModel
  * \sa ImageClassificationFilter
  *
  *
@@ -89,6 +91,8 @@ public:
 
   /**\name Confidence value typedef */
   typedef TConfidenceValue                              ConfidenceValueType;
+  typedef itk::FixedArray<ConfidenceValueType,1>            ConfidenceSampleType;
+  typedef itk::Statistics::ListSample<ConfidenceSampleType> ConfidenceListSampleType;
 
   /**\name Standard macros */
   //@{
@@ -99,10 +103,27 @@ public:
   /** Train the machine learning model */
   virtual void Train() =0;
 
-  /** Predict values using the model */
-  virtual TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality = ITK_NULLPTR) const = 0;
-
-  /** Classify all samples in InputListSample and fill TargetListSample with the associated label */
+  /** Predict a single sample
+    * \param input The sample
+    * \param quality A pointer to the quality variable were to store
+    * quality value, or NULL
+    * \return The predicted label
+     */
+  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality = ITK_NULLPTR) const;
+
+
+
+  /** Predict a batch of samples (InputListSampleType)
+    * \param input The batch of sample to predict
+    * \param quality A pointer to the list were to store
+    * quality value, or NULL
+    * \return The predicted labels
+    * Note that this method will be multi-threaded if OTB is built
+    * with OpenMP.
+     */
+  typename TargetListSampleType::Pointer PredictBatch(const InputListSampleType * input, ConfidenceListSampleType * quality = ITK_NULLPTR) const;
+  
+  /** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
   void PredictAll();
 
   /**\name Classification model file manipulation */
@@ -130,6 +151,7 @@ public:
   //@{
   itkSetObjectMacro(InputListSample,InputListSampleType);
   itkGetObjectMacro(InputListSample,InputListSampleType);
+  itkGetConstObjectMacro(InputListSample,InputListSampleType);
   //@}
 
   /**\name Classification output accessors */
@@ -140,6 +162,8 @@ public:
   itkGetObjectMacro(TargetListSample,TargetListSampleType);
   //@}
 
+  itkGetObjectMacro(ConfidenceListSample,ConfidenceListSampleType);
+  
   /**\name Use model in regression mode */
   //@{
   itkGetMacro(RegressionMode,bool);
@@ -152,7 +176,7 @@ protected:
 
   /** Destructor */
   ~MachineLearningModel() ITK_OVERRIDE;
-
+ 
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
@@ -162,6 +186,8 @@ protected:
   /** Target list sample */
   typename TargetListSampleType::Pointer m_TargetListSample;
 
+  typename ConfidenceListSampleType::Pointer m_ConfidenceListSample;
+  
   /** flag to choose between classification and regression modes */
   bool m_RegressionMode;
   
@@ -172,7 +198,36 @@ protected:
 
   /** flag that tells if the model support confidence index output */
   bool m_ConfidenceIndex;
+
+  /** Is DoPredictBatch multi-threaded ? */
+  bool m_IsDoPredictBatchMultiThreaded;
+
 private:
+  /**  Actual implementation of BatchPredicition
+    *  Default implementation will call DoPredict iteratively 
+    *  \param input The input batch
+    *  \param startIndex Index of the first sample to predict
+    *  \param size Number of samples to predict
+    *  \param target Pointer to the list of produced labels
+    *  \param quality Pointer to the list of produced confidence
+    *  values, or NULL
+    * 
+    * Override me if internal implementation allows for batch
+    * prediction.
+    * 
+    * Also set m_IsDoPredictBatchMultiThreaded to true if internal
+    * implementation allows for parallel batch prediction.
+    */
+  virtual void DoPredictBatch(const InputListSampleType * input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * target, ConfidenceListSampleType * quality = ITK_NULLPTR) const;
+
+  /** Actual implementation of single sample prediction
+   *  \param input sample to predict
+   *  \param quality Pointer to a variable to store confidence value,
+   *  or NULL
+   *  \return The predicted label
+   */ 
+  virtual TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType * quality= ITK_NULLPTR) const = 0;  
+ 
   MachineLearningModel(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 };
diff --git a/Modules/Learning/Supervised/include/otbMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbMachineLearningModel.txx
index c395407..3d67a0a 100644
--- a/Modules/Learning/Supervised/include/otbMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbMachineLearningModel.txx
@@ -18,8 +18,14 @@
 #ifndef otbMachineLearningModel_txx
 #define otbMachineLearningModel_txx
 
+#ifdef _OPENMP
+ # include <omp.h>
+#endif
+
 #include "otbMachineLearningModel.h"
 
+#include "itkMultiThreader.h"
+
 namespace otb
 {
 
@@ -28,7 +34,8 @@ MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
 ::MachineLearningModel() :
   m_RegressionMode(false),
   m_IsRegressionSupported(false),
-  m_ConfidenceIndex(false)
+  m_ConfidenceIndex(false),
+  m_IsDoPredictBatchMultiThreaded(false)
 {}
 
 
@@ -58,13 +65,117 @@ void
 MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
 ::PredictAll()
 {
-  TargetListSampleType * targets = this->GetTargetListSample();
+  itkWarningMacro("MachineLearningModel::PredictAll() has been DEPRECATED. Use MachineLearningModel::PredictBatch() instead.");
+  
+  typename TargetListSampleType::Pointer targets = this->GetTargetListSample();
   targets->Clear();
+  
+  typename TargetListSampleType::Pointer tmpTargets = this->PredictBatch(this->GetInputListSample());
+  
+  targets->Graft(tmpTargets);
+}
+
+template <class TInputValue, class TOutputValue, class TConfidenceValue>
+typename MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
+::TargetSampleType
+MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
+::Predict(const InputSampleType& input, ConfidenceValueType *quality) const
+{
+  // Call protected specialization entry point
+  return this->DoPredict(input,quality);
+}
 
-  for(typename InputListSampleType::ConstIterator sIt = this->GetInputListSample()->Begin();
-      sIt!=this->GetInputListSample()->End(); ++sIt)
+
+template <class TInputValue, class TOutputValue, class TConfidenceValue>
+typename MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
+::TargetListSampleType::Pointer
+MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
+::PredictBatch(const InputListSampleType * input, ConfidenceListSampleType * quality) const
+{
+  typename TargetListSampleType::Pointer targets = TargetListSampleType::New();
+  targets->Resize(input->Size());
+  
+  if(quality!=ITK_NULLPTR)
+    {
+    quality->Clear();
+    quality->Resize(input->Size());
+    }
+  
+  if(m_IsDoPredictBatchMultiThreaded)
+    {
+    // Simply calls DoPredictBatch
+    this->DoPredictBatch(input,0,input->Size(),targets,quality);
+    return targets;
+    }
+  else
+    {
+    
+    #ifdef _OPENMP
+    // OpenMP threading here
+    unsigned int nb_threads(0), threadId(0), nb_batches(0);
+    
+    #pragma omp parallel shared(nb_threads,nb_batches) private(threadId)
+    {
+    // Get number of threads configured with ITK
+    omp_set_num_threads(itk::MultiThreader::GetGlobalDefaultNumberOfThreads());
+    nb_threads = omp_get_num_threads();
+    threadId = omp_get_thread_num();
+    nb_batches = std::min(nb_threads,(unsigned int)input->Size());
+    // Ensure that we do not spawn unncessary threads
+    if(threadId<nb_batches)
+      {
+      unsigned int batch_size = ((unsigned int)input->Size()/nb_batches);
+      unsigned int batch_start = threadId*batch_size;
+      if(threadId == nb_threads-1)
+        {
+        batch_size+=input->Size()%nb_batches;
+        }
+    
+      this->DoPredictBatch(input,batch_start,batch_size,targets,quality);
+      }
+    }
+    #else
+    this->DoPredictBatch(input,0,input->Size(),targets,quality);
+    #endif
+    return targets;
+    }
+}
+
+
+
+template <class TInputValue, class TOutputValue, class TConfidenceValue>
+void
+MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
+::DoPredictBatch(const InputListSampleType * input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets, ConfidenceListSampleType * quality) const
+{
+  assert(input != ITK_NULLPTR);
+  assert(targets != ITK_NULLPTR);
+  
+  assert(input->Size()==targets->Size()&&"Input sample list and target label list do not have the same size.");
+  assert(((quality==ITK_NULLPTR)||(quality->Size()==input->Size()))&&"Quality samples list is not null and does not have the same size as input samples list");
+
+  if(startIndex+size>input->Size())
+    {
+    itkExceptionMacro(<<"requested range ["<<startIndex<<", "<<startIndex+size<<"[ partially outside input sample list range.[0,"<<input->Size()<<"[");
+    }
+
+  if(quality != ITK_NULLPTR)
+    {
+    for(unsigned int id = startIndex;id<startIndex+size;++id)
+      {
+      ConfidenceValueType confidence = 0;
+      const TargetSampleType target = this->DoPredict(input->GetMeasurementVector(id),&confidence);
+      quality->SetMeasurementVector(id,confidence);
+      targets->SetMeasurementVector(id,target);
+      }
+    }
+  else
     {
-    targets->PushBack(this->Predict(sIt.GetMeasurementVector()));
+    for(unsigned int id = startIndex;id<startIndex+size;++id)
+      {
+      const TargetSampleType target = this->DoPredict(input->GetMeasurementVector(id));
+      targets->SetMeasurementVector(id,target);
+      }
     }
 }
 
diff --git a/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.h b/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.h
index 8941bc4..d492ca1 100644
--- a/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.h
+++ b/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.h
@@ -29,7 +29,7 @@ namespace otb
  * \ingroup OTBSupervised
  */
 template <class TInputValue, class TOutputValue>
-class ITK_EXPORT MachineLearningModelFactory : public MachineLearningModelFactoryBase
+class MachineLearningModelFactory : public MachineLearningModelFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.txx b/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.txx
index c5c5cea..a99aa0f 100644
--- a/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.txx
+++ b/Modules/Learning/Supervised/include/otbMachineLearningModelFactory.txx
@@ -35,6 +35,10 @@
 #include "otbLibSVMMachineLearningModelFactory.h"
 #endif
 
+#ifdef OTB_USE_SHARK
+#include "otbSharkRandomForestsMachineLearningModelFactory.h"
+#endif
+
 #include "itkMutexLockHolder.h"
 
 
@@ -98,6 +102,10 @@ MachineLearningModelFactory<TInputValue,TOutputValue>
   RegisterFactory(LibSVMMachineLearningModelFactory<TInputValue,TOutputValue>::New());
 #endif
 
+#ifdef OTB_USE_SHARK
+  RegisterFactory(SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue>::New());
+#endif
+  
 #ifdef OTB_USE_OPENCV
   RegisterFactory(RandomForestsMachineLearningModelFactory<TInputValue,TOutputValue>::New());
   RegisterFactory(SVMMachineLearningModelFactory<TInputValue,TOutputValue>::New());
@@ -107,8 +115,7 @@ MachineLearningModelFactory<TInputValue,TOutputValue>
   RegisterFactory(DecisionTreeMachineLearningModelFactory<TInputValue,TOutputValue>::New());
   RegisterFactory(GradientBoostedTreeMachineLearningModelFactory<TInputValue,TOutputValue>::New());
   RegisterFactory(KNearestNeighborsMachineLearningModelFactory<TInputValue,TOutputValue>::New());
-#endif
-
+#endif  
 }
 
 template <class TInputValue, class TOutputValue>
@@ -144,6 +151,17 @@ MachineLearningModelFactory<TInputValue,TOutputValue>
       continue;
       }
 #endif
+
+#ifdef OTB_USE_SHARK
+    SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue> *sharkRFFactory =
+      dynamic_cast<SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue> *>(*itFac);
+    if (sharkRFFactory)
+      {
+      itk::ObjectFactoryBase::UnRegisterFactory(sharkRFFactory);
+      continue;
+      }
+#endif
+
 #ifdef OTB_USE_OPENCV
     // RandomForest
     RandomForestsMachineLearningModelFactory<TInputValue,TOutputValue> *rfFactory =
@@ -209,7 +227,7 @@ MachineLearningModelFactory<TInputValue,TOutputValue>
       itk::ObjectFactoryBase::UnRegisterFactory(knnFactory);
       continue;
       }
-#endif
+#endif   
     }
 
 }
diff --git a/Modules/Learning/Supervised/include/otbMachineLearningModelFactoryBase.h b/Modules/Learning/Supervised/include/otbMachineLearningModelFactoryBase.h
index 0c02236..6ac9b27 100644
--- a/Modules/Learning/Supervised/include/otbMachineLearningModelFactoryBase.h
+++ b/Modules/Learning/Supervised/include/otbMachineLearningModelFactoryBase.h
@@ -19,6 +19,7 @@
 #define otbMachineLearningModelFactoryBase_h
 
 #include "itkMutexLock.h"
+#include "OTBSupervisedExport.h"
 
 namespace otb
 {
@@ -31,7 +32,7 @@ namespace otb
  *
  * \ingroup OTBSupervised
  */
-class ITK_EXPORT MachineLearningModelFactoryBase : public itk::Object
+class OTBSupervised_EXPORT MachineLearningModelFactoryBase : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.h b/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.h
index dd132b9..629f078 100644
--- a/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.h
@@ -170,8 +170,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -195,6 +193,9 @@ protected:
   /** Destructor */
   ~NeuralNetworkMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+  
   void LabelsToMat(const TargetListSampleType * listSample, cv::Mat & output);
 
   /** PrintSelf method */
diff --git a/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.txx
index 9e1e6bb..5166555 100644
--- a/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbNeuralNetworkMachineLearningModel.txx
@@ -200,7 +200,7 @@ void NeuralNetworkMachineLearningModel<TInputValue, TOutputValue>::Train()
 
 template<class TInputValue, class TOutputValue>
 typename NeuralNetworkMachineLearningModel<TInputValue, TOutputValue>::TargetSampleType NeuralNetworkMachineLearningModel<
-  TInputValue, TOutputValue>::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+  TInputValue, TOutputValue>::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.h b/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.h
index f9362e9..eb07312 100644
--- a/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.h
@@ -54,8 +54,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -79,6 +77,10 @@ protected:
   /** Destructor */
   ~NormalBayesMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.txx
index b4ef2c2..26b3f35 100644
--- a/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbNormalBayesMachineLearningModel.txx
@@ -61,7 +61,7 @@ template <class TInputValue, class TOutputValue>
 typename NormalBayesMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 NormalBayesMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbOpenCVUtils.h b/Modules/Learning/Supervised/include/otbOpenCVUtils.h
index 01ee23f..6cb923a 100644
--- a/Modules/Learning/Supervised/include/otbOpenCVUtils.h
+++ b/Modules/Learning/Supervised/include/otbOpenCVUtils.h
@@ -38,7 +38,7 @@
 #include <opencv2/ml/ml.hpp>
 #endif
 
-
+#include "OTBSupervisedExport.h"
 
 #include "itkListSample.h"
 
diff --git a/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.h b/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.h
index bc2a51a..6ce9bf6 100644
--- a/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.h
@@ -62,8 +62,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -136,6 +134,10 @@ protected:
   /** Destructor */
   ~RandomForestsMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
@@ -209,7 +211,7 @@ private:
   float m_ForestAccuracy;
   /** The type of the termination criteria */
   int m_TerminationCriteria;
-  /** Wether to compute margin (difference in probability between the
+  /** Whether to compute margin (difference in probability between the
    * 2 most voted classes) instead of confidence (probability of the most
    * voted class) in prediction*/
   bool m_ComputeMargin;
diff --git a/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.txx
index cb95be8..9804200 100644
--- a/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModel.txx
@@ -111,7 +111,7 @@ template <class TInputValue, class TOutputValue>
 typename RandomForestsMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 RandomForestsMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & value, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & value, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
@@ -204,9 +204,9 @@ RandomForestsMachineLearningModel<TInputValue,TOutputValue>
 {
   cv::Mat cvMat = m_RFModel->getVarImportance();
   VariableImportanceMatrixType itkMat(cvMat.rows,cvMat.cols);
-  for(unsigned int i =0; i<cvMat.rows; i++)
+  for(int i =0; i<cvMat.rows; i++)
     {
-    for(unsigned int j =0; j<cvMat.cols; j++)
+    for(int j =0; j<cvMat.cols; j++)
       {
       itkMat(i,j)=cvMat.at<float>(i,j);
       }
diff --git a/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModelFactory.h b/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModelFactory.h
index 02c97ef..7af7240 100644
--- a/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModelFactory.h
+++ b/Modules/Learning/Supervised/include/otbRandomForestsMachineLearningModelFactory.h
@@ -26,7 +26,7 @@
 namespace otb
 {
 /** \class RandomForestsMachineLearningModelFactory
- * \brief Creation d'un instance d'un objet RandomForestsMachineLearningModel utilisant les object factory.
+ * \brief Creation of an instance of a RandomForestsMachineLearningModel object using the object factory
  *
  * \ingroup OTBSupervised
  */
diff --git a/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.h b/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.h
index 06131fe..5eee69c 100644
--- a/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.h
+++ b/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.h
@@ -61,8 +61,6 @@ public:
 
   /** Train the machine learning model */
   void Train() ITK_OVERRIDE;
-  /** Predict values using the model */
-  TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality=NULL) const ITK_OVERRIDE;
 
   /** Save the model to file */
   void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
@@ -136,6 +134,10 @@ protected:
   /** Destructor */
   ~SVMMachineLearningModel() ITK_OVERRIDE;
 
+  /** Predict values using the model */
+  TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
   /** PrintSelf method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
diff --git a/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.txx
index 57006ce..48960bd 100644
--- a/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.txx
+++ b/Modules/Learning/Supervised/include/otbSVMMachineLearningModel.txx
@@ -118,7 +118,7 @@ template <class TInputValue, class TOutputValue>
 typename SVMMachineLearningModel<TInputValue,TOutputValue>
 ::TargetSampleType
 SVMMachineLearningModel<TInputValue,TOutputValue>
-::Predict(const InputSampleType & input, ConfidenceValueType *quality) const
+::DoPredict(const InputSampleType & input, ConfidenceValueType *quality) const
 {
   //convert listsample to Mat
   cv::Mat sample;
diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h
new file mode 100644
index 0000000..458342b
--- /dev/null
+++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.h
@@ -0,0 +1,172 @@
+/*=========================================================================
+
+  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 otbSharkRandomForestsMachineLearningModel_h
+#define otbSharkRandomForestsMachineLearningModel_h
+
+#include "otb_shark.h"
+
+#include "itkLightObject.h"
+#include "otbMachineLearningModel.h"
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Woverloaded-virtual"
+#pragma GCC diagnostic ignored "-Wignored-qualifiers"
+#endif
+#include "shark/Algorithms/Trainers/RFTrainer.h"
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
+
+
+/** \class SharkRandomForestsMachineLearningModel
+ *  \brief Shark version of Random Forests algorithm
+ *
+ *  This is a specialization of MachineLearningModel class allowing to
+ *  use Shark implementation of the Random Forests algorithm.
+ *
+ *  It is noteworthy that training step is parallel.
+ * 
+ *  For more information, see
+ *  http://image.diku.dk/shark/doxygen_pages/html/classshark_1_1_r_f_trainer.html
+ * 
+ *  \ingroup OTBSupervised
+ */
+
+namespace otb
+{
+template <class TInputValue, class TTargetValue>
+class ITK_EXPORT SharkRandomForestsMachineLearningModel
+  : public MachineLearningModel <TInputValue, TTargetValue>
+{
+public:
+  /** Standard class typedefs. */
+  typedef SharkRandomForestsMachineLearningModel               Self;
+  typedef MachineLearningModel<TInputValue, TTargetValue> Superclass;
+  typedef itk::SmartPointer<Self>                         Pointer;
+  typedef itk::SmartPointer<const Self>                   ConstPointer;
+
+  typedef typename Superclass::InputValueType             InputValueType;
+  typedef typename Superclass::InputSampleType            InputSampleType;
+  typedef typename Superclass::InputListSampleType        InputListSampleType;
+  typedef typename Superclass::TargetValueType            TargetValueType;
+  typedef typename Superclass::TargetSampleType           TargetSampleType;
+  typedef typename Superclass::TargetListSampleType       TargetListSampleType;
+  typedef typename Superclass::ConfidenceValueType        ConfidenceValueType;
+  typedef typename Superclass::ConfidenceSampleType       ConfidenceSampleType;
+  typedef typename Superclass::ConfidenceListSampleType   ConfidenceListSampleType;
+  
+  /** Run-time type information (and related methods). */
+  itkNewMacro(Self);
+  itkTypeMacro(SharkRandomForestsMachineLearningModel, MachineLearningModel);
+
+  /** Train the machine learning model */
+  virtual void Train() ITK_OVERRIDE;
+
+  /** Save the model to file */
+  virtual void Save(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
+
+  /** Load the model from file */
+  virtual void Load(const std::string & filename, const std::string & name="") ITK_OVERRIDE;
+
+  /**\name Classification model file compatibility tests */
+  //@{
+  /** Is the input model file readable and compatible with the corresponding classifier ? */
+  virtual bool CanReadFile(const std::string &) ITK_OVERRIDE;
+
+  /** Is the input model file writable and compatible with the corresponding classifier ? */
+  virtual bool CanWriteFile(const std::string &) ITK_OVERRIDE;
+  //@}
+
+  /** From Shark doc: Get the number of trees to grow.*/
+  itkGetMacro(NumberOfTrees,unsigned int);
+  /** From Shark doc: Set the number of trees to grow.*/
+  itkSetMacro(NumberOfTrees,unsigned int);
+
+  /** From Shark doc: Get the number of random attributes to investigate at each node.*/
+  itkGetMacro(MTry, unsigned int);
+  /** From Shark doc: Set the number of random attributes to investigate at each node.*/
+  itkSetMacro(MTry, unsigned int);
+
+  /** From Shark doc: Controls when a node is considered pure. If set
+* to 1, a node is pure when it only consists of a single node.
+*/
+  itkGetMacro(NodeSize, unsigned int);
+    /** From Shark doc: Controls when a node is considered pure. If
+* set to 1, a node is pure when it only consists of a single node.
+ */
+  itkSetMacro(NodeSize, unsigned int);
+
+  /** From Shark doc: Get the fraction of the original training
+* dataset to use as the out of bag sample. The default value is
+* 0.66.*/
+  itkGetMacro(OobRatio, float);
+
+  /** From Shark doc: Set the fraction of the original training
+* dataset to use as the out of bag sample. The default value is 0.66.
+*/
+  itkSetMacro(OobRatio, float);
+
+  /** If true, margin confidence value will be computed */
+  itkGetMacro(ComputeMargin, bool);
+  /** If true, margin confidence value will be computed */
+  itkSetMacro(ComputeMargin, bool);
+
+protected:
+  /** Constructor */
+  SharkRandomForestsMachineLearningModel();
+
+  /** Destructor */
+  virtual ~SharkRandomForestsMachineLearningModel();
+
+  /** Predict values using the model */
+  virtual TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
+
+  
+  virtual void DoPredictBatch(const InputListSampleType *, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType *, ConfidenceListSampleType * = ITK_NULLPTR) const ITK_OVERRIDE;
+  
+  /** PrintSelf method */
+  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  SharkRandomForestsMachineLearningModel(const Self &); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+
+  shark::RFClassifier m_RFModel;
+  shark::RFTrainer m_RFTrainer;
+
+  unsigned int m_NumberOfTrees;
+  unsigned int m_MTry;
+  unsigned int m_NodeSize;
+  float m_OobRatio;
+  bool m_ComputeMargin;
+
+  /** Confidence list sample */
+  ConfidenceValueType ComputeConfidence(shark::RealVector & probas, 
+                                        bool computeMargin) const;
+
+};
+} // end namespace otb
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbSharkRandomForestsMachineLearningModel.txx"
+#endif
+
+#endif
diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.txx b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.txx
new file mode 100644
index 0000000..0e0b08f
--- /dev/null
+++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.txx
@@ -0,0 +1,248 @@
+/*=========================================================================
+
+  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 otbSharkRandomForestsMachineLearningModel_txx
+#define otbSharkRandomForestsMachineLearningModel_txx
+
+#include <fstream>
+#include "itkMacro.h"
+#include "otbSharkRandomForestsMachineLearningModel.h"
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Woverloaded-virtual"
+#pragma GCC diagnostic ignored "-Wignored-qualifiers"
+#endif
+#include <shark/Models/Converter.h>
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
+
+
+
+#include "otbSharkUtils.h"
+#include <algorithm>
+
+namespace otb
+{
+
+template <class TInputValue, class TOutputValue>
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::SharkRandomForestsMachineLearningModel()
+{
+  this->m_ConfidenceIndex = true;
+  this->m_IsRegressionSupported = false;
+  this->m_IsDoPredictBatchMultiThreaded = true;
+}
+
+
+template <class TInputValue, class TOutputValue>
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::~SharkRandomForestsMachineLearningModel()
+{
+}
+
+/** Train the machine learning model */
+template <class TInputValue, class TOutputValue>
+void
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::Train()
+{
+#ifdef _OPENMP
+  omp_set_num_threads(itk::MultiThreader::GetGlobalDefaultNumberOfThreads());
+#endif
+  
+  std::vector<shark::RealVector> features;
+  std::vector<unsigned int> class_labels;
+
+  Shark::ListSampleToSharkVector(this->GetInputListSample(), features);
+  Shark::ListSampleToSharkVector(this->GetTargetListSample(), class_labels);
+  shark::ClassificationDataset TrainSamples = shark::createLabeledDataFromRange(features,class_labels);
+
+  //Set parameters
+  m_RFTrainer.setMTry(m_MTry);
+  m_RFTrainer.setNTrees(m_NumberOfTrees);
+  m_RFTrainer.setNodeSize(m_NodeSize);
+  m_RFTrainer.setOOBratio(m_OobRatio);
+  m_RFTrainer.train(m_RFModel, TrainSamples);
+
+}
+
+template <class TInputValue, class TOutputValue>
+typename SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::ConfidenceValueType
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::ComputeConfidence(shark::RealVector & probas, bool computeMargin) const
+{
+  assert(!probas.empty()&&"probas vector is empty");
+  assert((!computeMargin||probas.size()>1)&&"probas size should be at least 2 if computeMargin is true");
+  
+  ConfidenceValueType conf{0};
+  if(computeMargin)
+    {
+    std::nth_element(probas.begin(), probas.begin()+1, 
+                     probas.end(), std::greater<double>());
+    conf = static_cast<ConfidenceValueType>(probas[0]-probas[1]);
+    }
+  else
+    {
+    auto max_proba = *(std::max_element(probas.begin(), 
+                                        probas.end()));
+    conf = static_cast<ConfidenceValueType>(max_proba);
+    }
+  return conf;
+}
+
+template <class TInputValue, class TOutputValue>
+typename SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::TargetSampleType
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::DoPredict(const InputSampleType & value, ConfidenceValueType *quality) const
+{
+  shark::RealVector samples(value.Size());
+  for(size_t i = 0; i < value.Size();i++)
+    {
+    samples.push_back(value[i]);
+    }
+  if (quality != ITK_NULLPTR)
+    {
+    shark::RealVector probas = m_RFModel(samples);
+    (*quality) = ComputeConfidence(probas, m_ComputeMargin);
+    }
+  shark::ArgMaxConverter<shark::RFClassifier> amc;
+  amc.decisionFunction() = m_RFModel;
+  unsigned int res;
+  amc.eval(samples, res);
+  TargetSampleType target;
+  target[0] = static_cast<TOutputValue>(res);
+  return target;
+}
+
+template <class TInputValue, class TOutputValue>
+void
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets, ConfidenceListSampleType * quality) const
+{
+  assert(input != ITK_NULLPTR);
+  assert(targets != ITK_NULLPTR);
+
+  assert(input->Size()==targets->Size()&&"Input sample list and target label list do not have the same size.");
+  assert(((quality==ITK_NULLPTR)||(quality->Size()==input->Size()))&&"Quality samples list is not null and does not have the same size as input samples list");
+  
+  if(startIndex+size>input->Size())
+    {
+    itkExceptionMacro(<<"requested range ["<<startIndex<<", "<<startIndex+size<<"[ partially outside input sample list range.[0,"<<input->Size()<<"[");
+    }
+  
+  std::vector<shark::RealVector> features;
+  Shark::ListSampleRangeToSharkVector(input, features,startIndex,size);
+  shark::Data<shark::RealVector> inputSamples = shark::createDataFromRange(features);
+
+  #ifdef _OPENMP
+  omp_set_num_threads(itk::MultiThreader::GetGlobalDefaultNumberOfThreads());
+  #endif
+  
+  if(quality != ITK_NULLPTR)
+    {
+    shark::Data<shark::RealVector> probas = m_RFModel(inputSamples);
+    unsigned int id = startIndex;
+    for(shark::RealVector && p : probas.elements())
+      {
+      ConfidenceSampleType confidence;
+      auto conf = ComputeConfidence(p, m_ComputeMargin);
+      confidence[0] = static_cast<ConfidenceValueType>(conf);
+      quality->SetMeasurementVector(id,confidence);
+      ++id;
+      }
+    }
+    
+  shark::ArgMaxConverter<shark::RFClassifier> amc;
+  amc.decisionFunction() = m_RFModel;
+  auto prediction = amc(inputSamples);
+  unsigned int id = startIndex;
+  for(const auto& p : prediction.elements())
+    {
+    TargetSampleType target;
+    target[0] = static_cast<TOutputValue>(p);
+    targets->SetMeasurementVector(id,target);
+    ++id;
+    }
+}
+
+template <class TInputValue, class TOutputValue>
+void
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::Save(const std::string & filename, const std::string & itkNotUsed(name))
+{
+  std::ofstream ofs(filename.c_str());
+  if(!ofs)
+    {
+    itkExceptionMacro(<< "Error opening " << filename.c_str() );
+    }
+  shark::TextOutArchive oa(ofs);
+  m_RFModel.save(oa,0);
+}
+
+template <class TInputValue, class TOutputValue>
+void
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::Load(const std::string & filename, const std::string & itkNotUsed(name))
+{
+  std::ifstream ifs(filename.c_str());
+  shark::TextInArchive ia(ifs);
+  m_RFModel.load(ia,0);
+}
+
+template <class TInputValue, class TOutputValue>
+bool
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::CanReadFile(const std::string & file)
+{
+  try
+    {
+    this->Load(file);
+    m_RFModel.name();
+    }
+  catch(...)
+    {
+    return false;
+    }
+  return true;
+}
+
+template <class TInputValue, class TOutputValue>
+bool
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::CanWriteFile(const std::string & itkNotUsed(file))
+{
+  return true;
+}
+
+template <class TInputValue, class TOutputValue>
+void
+SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  // Call superclass implementation
+  Superclass::PrintSelf(os,indent);
+}
+
+} //end namespace otb
+
+#endif
diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModelFactory.h b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModelFactory.h
new file mode 100644
index 0000000..242eeb7
--- /dev/null
+++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModelFactory.h
@@ -0,0 +1,74 @@
+/*=========================================================================
+
+  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 otbSharkRandomForestsMachineLearningModelFactory_h
+#define otbSharkRandomForestsMachineLearningModelFactory_h
+
+#include "itkObjectFactoryBase.h"
+#include "itkImageIOBase.h"
+
+namespace otb
+{
+/** \class SharkRandomForestsMachineLearningModelFactory
+ * \brief Creation of an instance of a SharkRandomForestsMachineLearningModel object using the object factory
+ *
+ * \ingroup OTBSupervised
+ */
+template <class TInputValue, class TTargetValue>
+class ITK_EXPORT SharkRandomForestsMachineLearningModelFactory : public itk::ObjectFactoryBase
+{
+public:
+  /** Standard class typedefs. */
+  typedef SharkRandomForestsMachineLearningModelFactory             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. */
+  virtual const char* GetITKSourceVersion(void) const;
+  virtual const char* GetDescription(void) const;
+
+  /** Method for class instantiation. */
+  itkFactorylessNewMacro(Self);
+
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(SharkRandomForestsMachineLearningModelFactory, itk::ObjectFactoryBase);
+
+  /** Register one factory of this type  */
+  static void RegisterOneFactory(void)
+  {
+    Pointer RFFactory = SharkRandomForestsMachineLearningModelFactory::New();
+    itk::ObjectFactoryBase::RegisterFactory(RFFactory);
+  }
+
+protected:
+  SharkRandomForestsMachineLearningModelFactory();
+  virtual ~SharkRandomForestsMachineLearningModelFactory();
+
+private:
+  SharkRandomForestsMachineLearningModelFactory(const Self &); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+
+};
+
+} // end namespace otb
+
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbSharkRandomForestsMachineLearningModelFactory.txx"
+#endif
+
+#endif
diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModelFactory.txx b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModelFactory.txx
new file mode 100644
index 0000000..9bd3c52
--- /dev/null
+++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModelFactory.txx
@@ -0,0 +1,70 @@
+/*=========================================================================
+
+  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 otbSharkRandomForestsMachineLearningModelFactory_txx
+#define otbSharkRandomForestsMachineLearningModelFactory_txx
+
+
+#include "otbSharkRandomForestsMachineLearningModelFactory.h"
+
+#include "itkCreateObjectFunction.h"
+#include "otbSharkRandomForestsMachineLearningModel.h"
+#include "itkVersion.h"
+
+namespace otb
+{
+
+template <class TInputValue, class TOutputValue>
+SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue>
+::SharkRandomForestsMachineLearningModelFactory()
+{
+
+  std::string classOverride = std::string("otbMachineLearningModel");
+  std::string subclass = std::string("otbSharkRandomForestsMachineLearningModel");
+
+  this->RegisterOverride(classOverride.c_str(),
+                         subclass.c_str(),
+                         "Shark RF ML Model",
+                         1,
+                         itk::CreateObjectFunction<SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue> >::New());
+}
+
+template <class TInputValue, class TOutputValue>
+SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue>
+::~SharkRandomForestsMachineLearningModelFactory()
+{
+}
+
+template <class TInputValue, class TOutputValue>
+const char*
+SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue>
+::GetITKSourceVersion(void) const
+{
+  return ITK_SOURCE_VERSION;
+}
+
+template <class TInputValue, class TOutputValue>
+const char*
+SharkRandomForestsMachineLearningModelFactory<TInputValue,TOutputValue>
+::GetDescription() const
+{
+  return "Shark Random Forest machine learning model factory";
+}
+
+} // end namespace otb
+
+#endif
diff --git a/Modules/Learning/Supervised/include/otbSharkUtils.h b/Modules/Learning/Supervised/include/otbSharkUtils.h
new file mode 100644
index 0000000..6990bf7
--- /dev/null
+++ b/Modules/Learning/Supervised/include/otbSharkUtils.h
@@ -0,0 +1,124 @@
+/*=========================================================================
+
+  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 otbSharkUtils_h
+#define otbSharkUtils_h
+
+#include "otb_shark.h"
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#endif
+#include <shark/Data/Dataset.h>
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
+
+namespace otb
+{
+namespace Shark
+{
+template <class T> void ListSampleRangeToSharkVector(const T * listSample, std::vector<shark::RealVector> & output, unsigned int start, unsigned int size)
+{
+  assert(listSample != ITK_NULLPTR);
+
+  if(start+size>listSample->Size())
+    {
+    itkGenericExceptionMacro(<<"Requested range ["<<start<<", "<<start+size<<"[ is out of bound for input list sample (range [0, "<<listSample->Size()<<"[");
+    }
+  
+  output.clear();
+      
+  // Sample index
+  unsigned int sampleIdx = start;
+    
+  //Check for valid listSample
+  if(listSample->Size()>0)
+    {
+    // Retrieve samples size alike
+    const unsigned int sampleSize = listSample->GetMeasurementVectorSize();
+
+    // Fill the output vector
+
+    for (auto const endOfRange = start+size ; sampleIdx < endOfRange ; ++sampleIdx)
+      {
+      // Retrieve sample
+      typename T::MeasurementVectorType const & sample = listSample->GetMeasurementVector(sampleIdx);
+	   
+      // // Define a shark::RealVector
+      // shark::RealVector rv(sampleSize);
+      // // Loop on sample size
+      // for(unsigned int i = 0; i < sampleSize; ++i)
+      //   {
+      //   rv[i] = sample[i];
+      //   }
+      // using std::move;
+      // output.emplace_back(move(rv));
+
+      output.emplace_back(&sample[0], &sample[0]+sampleSize);
+      }
+    }
+}
+
+template <class T> void ListSampleRangeToSharkVector(const T * listSample, std::vector<unsigned int> & output, unsigned int start, unsigned int size)
+{
+  assert(listSample != ITK_NULLPTR);
+
+  if(start+size>listSample->Size())
+    {
+    itkGenericExceptionMacro(<<"Requested range ["<<start<<", "<<start+size<<"[ is out of bound for input list sample (range [0, "<<listSample->Size()<<"[");
+    }
+
+  output.clear();
+  
+  // Sample index
+  unsigned int sampleIdx = start;
+    
+  //Check for valid listSample
+  if(listSample->Size()>0)
+    {
+    // Fill the output vector
+    while(sampleIdx<start+size)
+      {
+      // Retrieve sample
+      typename T::MeasurementVectorType const & sample = listSample->GetMeasurementVector(sampleIdx);
+	   
+      // Define a shark::RealVector
+      output.push_back(sample[0]);
+      ++sampleIdx;
+      }
+    } 
+}
+
+template <class T> void ListSampleToSharkVector(const T * listSample, std::vector<shark::RealVector> & output)
+{
+  assert(listSample != ITK_NULLPTR);
+  ListSampleRangeToSharkVector(listSample,output,0U,static_cast<unsigned int>(listSample->Size()));
+}
+
+template <class T> void ListSampleToSharkVector(const T * listSample, std::vector<unsigned int> & output)
+{
+  assert(listSample != ITK_NULLPTR);
+  ListSampleRangeToSharkVector(listSample,output,0, static_cast<unsigned int>(listSample->Size()));
+}
+  
+}
+}
+
+#endif
+
diff --git a/Modules/Learning/Supervised/otb-module.cmake b/Modules/Learning/Supervised/otb-module.cmake
index a3f8f47..ebce0f3 100644
--- a/Modules/Learning/Supervised/otb-module.cmake
+++ b/Modules/Learning/Supervised/otb-module.cmake
@@ -3,6 +3,7 @@ classification and regression framework, currently based on
 OpenCV and/or libSVM")
 
 otb_module(OTBSupervised
+ENABLE_SHARED
   DEPENDS
     OTBBoost
     OTBCommon
@@ -12,7 +13,8 @@ otb_module(OTBSupervised
   OPTIONAL_DEPENDS
     OTBOpenCV
     OTBSVMLearning
-
+    OTBShark
+    
   TEST_DEPENDS
     OTBTestKernel
     OTBImageIO
diff --git a/Modules/Learning/Supervised/src/CMakeLists.txt b/Modules/Learning/Supervised/src/CMakeLists.txt
index b99187d..7b1c6aa 100644
--- a/Modules/Learning/Supervised/src/CMakeLists.txt
+++ b/Modules/Learning/Supervised/src/CMakeLists.txt
@@ -11,6 +11,7 @@ target_link_libraries(OTBSupervised
   ${OTBCommon_LIBRARIES}
   ${OTBSVMLearning_LIBRARIES}
   ${OTBOpenCV_LIBRARIES}
+  ${OTBShark_LIBRARIES}
   )
 
 otb_module_target(OTBSupervised)
diff --git a/Modules/Learning/Supervised/src/otbCvRTreesWrapper.cxx b/Modules/Learning/Supervised/src/otbCvRTreesWrapper.cxx
index e4ac2d9..669e863 100644
--- a/Modules/Learning/Supervised/src/otbCvRTreesWrapper.cxx
+++ b/Modules/Learning/Supervised/src/otbCvRTreesWrapper.cxx
@@ -17,7 +17,7 @@
 =========================================================================*/
 #include "otbCvRTreesWrapper.h"
 #include <algorithm>
-
+#include <functional>
 
 namespace otb
 {
diff --git a/Modules/Learning/Supervised/test/CMakeLists.txt b/Modules/Learning/Supervised/test/CMakeLists.txt
index abca168..d682424 100644
--- a/Modules/Learning/Supervised/test/CMakeLists.txt
+++ b/Modules/Learning/Supervised/test/CMakeLists.txt
@@ -1,5 +1,4 @@
 otb_module_test()
-
 set(OTBSupervisedTests
 otbSupervisedTestDriver.cxx
 otbConfusionMatrixCalculatorTest.cxx
@@ -10,6 +9,10 @@ otbImageClassificationFilter.cxx
 otbMachineLearningRegressionTests.cxx
 )
 
+if(OTB_USE_SHARK)
+set(OTBSupervisedTests ${OTBSupervisedTests} otbSharkImageClassificationFilter.cxx)
+endif()
+
 add_executable(otbSupervisedTestDriver ${OTBSupervisedTests})
 target_link_libraries(otbSupervisedTestDriver ${OTBSupervised-Test_LIBRARIES})
 otb_module_target_label(otbSupervisedTestDriver)
@@ -54,3 +57,7 @@ endif()
 if(OTB_USE_OPENCV)
   include(tests-opencv.cmake)
 endif()
+
+if(OTB_USE_SHARK)
+  include(tests-shark.cmake)
+endif()
diff --git a/Modules/Learning/Supervised/test/otbConfusionMatrixCalculatorTest.cxx b/Modules/Learning/Supervised/test/otbConfusionMatrixCalculatorTest.cxx
index b2d6697..4bdf760 100644
--- a/Modules/Learning/Supervised/test/otbConfusionMatrixCalculatorTest.cxx
+++ b/Modules/Learning/Supervised/test/otbConfusionMatrixCalculatorTest.cxx
@@ -57,7 +57,7 @@ int otbConfusionMatrixCalculatorSetListSamples(int argc, char* argv[])
   RListLabelType::Pointer refLabels = RListLabelType::New();
   PListLabelType::Pointer prodLabels = PListLabelType::New();
 
-  // Set the measurement vector size for the list sample lables
+  // Set the measurement vector size for the list sample labels
   refLabels->SetMeasurementVectorSize(1);
   prodLabels->SetMeasurementVectorSize(1);
 
@@ -108,7 +108,7 @@ int otbConfusionMatrixCalculatorWrongSize(int argc, char* argv[])
   RListLabelType::Pointer refLabels = RListLabelType::New();
   PListLabelType::Pointer prodLabels = PListLabelType::New();
 
-  // Set the measurement vector size for the list sample lables
+  // Set the measurement vector size for the list sample labels
   refLabels->SetMeasurementVectorSize(1);
   prodLabels->SetMeasurementVectorSize(1);
 
@@ -167,7 +167,7 @@ int otbConfusionMatrixCalculatorCompute(int argc, char* argv[])
   RListLabelType::Pointer refLabels = RListLabelType::New();
   PListLabelType::Pointer prodLabels = PListLabelType::New();
 
-  // Set the measurement vector size for the list sample lables
+  // Set the measurement vector size for the list sample labels
   refLabels->SetMeasurementVectorSize(1);
   prodLabels->SetMeasurementVectorSize(1);
 
diff --git a/Modules/Learning/Supervised/test/otbImageClassificationFilter.cxx b/Modules/Learning/Supervised/test/otbImageClassificationFilter.cxx
index 760a4fd..c233766 100644
--- a/Modules/Learning/Supervised/test/otbImageClassificationFilter.cxx
+++ b/Modules/Learning/Supervised/test/otbImageClassificationFilter.cxx
@@ -42,6 +42,32 @@ int otbImageClassificationFilterNew(int itkNotUsed(argc), char * itkNotUsed(argv
   return EXIT_SUCCESS;
 }
 
+int otbImageClassificationFilterLoadModel(int itkNotUsed(argc), char * argv[])
+{
+  const char * infname = argv[1];
+  const char * modelfname = argv[2];
+
+  // Instantiating object
+  ClassificationFilterType::Pointer filter = ClassificationFilterType::New();
+
+  ReaderType::Pointer reader = ReaderType::New();
+  reader->SetFileName(infname);
+
+  ModelType::Pointer model;
+
+  model = MachineLearningModelFactoryType::CreateMachineLearningModel(modelfname,
+                                                                      MachineLearningModelFactoryType::ReadMode);
+
+  if (model.IsNull())
+    {
+    std::cerr << "Unable to create a model from " << modelfname << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  model->Load(modelfname);
+  return EXIT_SUCCESS;
+}
+
 int otbImageClassificationFilter(int itkNotUsed(argc), char * argv[])
 {
   const char * infname = argv[1];
diff --git a/Modules/Learning/Supervised/test/otbMachineLearningModelCanRead.cxx b/Modules/Learning/Supervised/test/otbMachineLearningModelCanRead.cxx
index 4749acf..b302542 100644
--- a/Modules/Learning/Supervised/test/otbMachineLearningModelCanRead.cxx
+++ b/Modules/Learning/Supervised/test/otbMachineLearningModelCanRead.cxx
@@ -18,22 +18,9 @@
 
 #include <iostream>
 
+#include <otbConfigure.h>
 #include <otbMachineLearningModel.h>
 
-#ifdef OTB_USE_LIBSVM
-#include "otbLibSVMMachineLearningModel.h"
-#endif
-#ifdef OTB_USE_OPENCV
-#include "otbSVMMachineLearningModel.h"
-#include "otbRandomForestsMachineLearningModel.h"
-#include "otbBoostMachineLearningModel.h"
-#include "otbNeuralNetworkMachineLearningModel.h"
-#include "otbNormalBayesMachineLearningModel.h"
-#include "otbDecisionTreeMachineLearningModel.h"
-#include "otbGradientBoostedTreeMachineLearningModel.h"
-#include "otbKNearestNeighborsMachineLearningModel.h"
-#endif
-
 typedef otb::MachineLearningModel<float,short>         MachineLearningModelType;
 typedef MachineLearningModelType::InputValueType       InputValueType;
 typedef MachineLearningModelType::InputSampleType      InputSampleType;
@@ -42,6 +29,10 @@ typedef MachineLearningModelType::TargetValueType      TargetValueType;
 typedef MachineLearningModelType::TargetSampleType     TargetSampleType;
 typedef MachineLearningModelType::TargetListSampleType TargetListSampleType;
 
+
+#ifdef OTB_USE_LIBSVM
+#include "otbLibSVMMachineLearningModel.h"
+
 int otbLibSVMMachineLearningModelCanRead(int argc, char* argv[])
 {
   if (argc != 2)
@@ -57,7 +48,6 @@ int otbLibSVMMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_LIBSVM
   typedef otb::LibSVMMachineLearningModel<InputValueType, TargetValueType> SVMType;
   SVMType::Pointer classifier = SVMType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -66,10 +56,21 @@ int otbLibSVMMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::LibSVMMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
-
+  
   return EXIT_SUCCESS;
 }
+#endif
+
+
+#ifdef OTB_USE_OPENCV
+#include "otbSVMMachineLearningModel.h"
+#include "otbRandomForestsMachineLearningModel.h"
+#include "otbBoostMachineLearningModel.h"
+#include "otbNeuralNetworkMachineLearningModel.h"
+#include "otbNormalBayesMachineLearningModel.h"
+#include "otbDecisionTreeMachineLearningModel.h"
+#include "otbGradientBoostedTreeMachineLearningModel.h"
+#include "otbKNearestNeighborsMachineLearningModel.h"
 
 int otbSVMMachineLearningModelCanRead(int argc, char* argv[])
 {
@@ -86,7 +87,6 @@ int otbSVMMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::SVMMachineLearningModel<InputValueType, TargetValueType> SVMType;
   SVMType::Pointer classifier = SVMType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -95,7 +95,6 @@ int otbSVMMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::SVMMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -115,7 +114,6 @@ int otbRandomForestsMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::RandomForestsMachineLearningModel<InputValueType, TargetValueType> RFType;
   RFType::Pointer classifier = RFType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -124,7 +122,6 @@ int otbRandomForestsMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::RandomForestsMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -144,7 +141,6 @@ int otbBoostMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::BoostMachineLearningModel<InputValueType, TargetValueType> BoostType;
   BoostType::Pointer classifier = BoostType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -153,7 +149,6 @@ int otbBoostMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::BoostMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -173,7 +168,6 @@ int otbNeuralNetworkMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::NeuralNetworkMachineLearningModel<InputValueType, TargetValueType> ANNType;
   ANNType::Pointer classifier = ANNType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -182,7 +176,6 @@ int otbNeuralNetworkMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::NeuralNetworkMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -202,7 +195,6 @@ int otbNormalBayesMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::NormalBayesMachineLearningModel<InputValueType, TargetValueType> NormalBayesType;
   NormalBayesType::Pointer classifier = NormalBayesType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -211,7 +203,6 @@ int otbNormalBayesMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::NormalBayesMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -231,7 +222,6 @@ int otbDecisionTreeMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::DecisionTreeMachineLearningModel<InputValueType, TargetValueType> DecisionTreeType;
   DecisionTreeType::Pointer classifier = DecisionTreeType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -240,7 +230,6 @@ int otbDecisionTreeMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::DecisionTreeMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -260,7 +249,6 @@ int otbGradientBoostedTreeMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::GradientBoostedTreeMachineLearningModel<InputValueType, TargetValueType> GBTreeType;
   GBTreeType::Pointer classifier = GBTreeType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -269,7 +257,6 @@ int otbGradientBoostedTreeMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::GradientBoostedTreeMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
@@ -289,7 +276,6 @@ int otbKNNMachineLearningModelCanRead(int argc, char* argv[])
     }
   std::string filename(argv[1]);
   
-  #ifdef OTB_USE_OPENCV
   typedef otb::KNearestNeighborsMachineLearningModel<InputValueType, TargetValueType> KNNType;
   KNNType::Pointer classifier = KNNType::New();
   bool lCanRead = classifier->CanReadFile(filename);
@@ -298,8 +284,39 @@ int otbKNNMachineLearningModelCanRead(int argc, char* argv[])
     std::cerr << "Erreur otb::KNearestNeighborsMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
     return EXIT_FAILURE;
     }
-  #endif
 
   return EXIT_SUCCESS;
 }
+#endif
+
 
+#ifdef OTB_USE_SHARK
+#include "otbSharkRandomForestsMachineLearningModel.h"
+
+int otbSharkRFMachineLearningModelCanRead(int argc, char* argv[])
+{
+  if (argc != 2)
+    {
+    std::cerr << "Usage: " << argv[0]
+              << "<model>" << std::endl;
+    std::cerr << "Called here with " << argc << " arguments\n";
+    for (int i = 1; i < argc; ++i)
+      {
+      std::cerr << " - " << argv[i] << "\n";
+      }
+    return EXIT_FAILURE;
+    }
+  std::string filename(argv[1]);
+  typedef otb::SharkRandomForestsMachineLearningModel<InputValueType, TargetValueType> RFType;
+  RFType::Pointer classifier = RFType::New();
+  bool lCanRead = classifier->CanReadFile(filename);
+  if (lCanRead == false)
+    {
+    std::cerr << "Error otb::SharkRandomForestsMachineLearningModel : impossible to open the file " << filename << "." << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
+
+#endif
diff --git a/Modules/Learning/Supervised/test/otbMachineLearningRegressionTests.cxx b/Modules/Learning/Supervised/test/otbMachineLearningRegressionTests.cxx
index 2b0554d..efb46f3 100644
--- a/Modules/Learning/Supervised/test/otbMachineLearningRegressionTests.cxx
+++ b/Modules/Learning/Supervised/test/otbMachineLearningRegressionTests.cxx
@@ -24,6 +24,8 @@
 const double otb_epsilon_01 = 0.1;
 #endif
 
+#include "otbMachineLearningModel.h"
+
 #ifdef OTB_USE_OPENCV
 #include "otbNeuralNetworkMachineLearningModel.h"
 #include "otbSVMMachineLearningModel.h"
diff --git a/Modules/Learning/Supervised/test/otbSharkImageClassificationFilter.cxx b/Modules/Learning/Supervised/test/otbSharkImageClassificationFilter.cxx
new file mode 100644
index 0000000..6553f29
--- /dev/null
+++ b/Modules/Learning/Supervised/test/otbSharkImageClassificationFilter.cxx
@@ -0,0 +1,162 @@
+/*=========================================================================
+
+ 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 "otbImageClassificationFilter.h"
+#include "otbVectorImage.h"
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbSharkRandomForestsMachineLearningModelFactory.h"
+#include <random>
+#include <chrono>
+
+const unsigned int Dimension = 2;
+typedef float PixelType;
+typedef unsigned short LabeledPixelType;
+
+typedef otb::VectorImage<PixelType, Dimension> ImageType;
+typedef otb::Image<LabeledPixelType, Dimension> LabeledImageType;
+typedef otb::ImageClassificationFilter<ImageType, LabeledImageType> ClassificationFilterType;
+typedef ClassificationFilterType::ModelType ModelType;
+typedef ClassificationFilterType::ValueType ValueType;
+typedef ClassificationFilterType::LabelType LabelType;
+typedef otb::SharkRandomForestsMachineLearningModelFactory<ValueType, LabelType> MachineLearningModelFactoryType;
+typedef otb::ImageFileReader<ImageType> ReaderType;
+typedef otb::ImageFileReader<LabeledImageType> MaskReaderType;
+typedef otb::ImageFileWriter<LabeledImageType> WriterType;
+
+typedef otb::SharkRandomForestsMachineLearningModel<PixelType,short unsigned int>         MachineLearningModelType;
+typedef MachineLearningModelType::InputValueType       LocalInputValueType;
+typedef MachineLearningModelType::InputSampleType      LocalInputSampleType;
+typedef MachineLearningModelType::InputListSampleType  LocalInputListSampleType;
+typedef MachineLearningModelType::TargetValueType      LocalTargetValueType;
+typedef MachineLearningModelType::TargetSampleType     LocalTargetSampleType;
+typedef MachineLearningModelType::TargetListSampleType LocalTargetListSampleType;
+
+void generateSamples(unsigned int num_classes, unsigned int num_samples,
+                     unsigned int num_features,
+                     LocalInputListSampleType * samples, 
+                     LocalTargetListSampleType * labels)
+{
+  std::default_random_engine generator;
+  std::uniform_int_distribution<int> label_distribution(1,num_classes);
+  std::uniform_int_distribution<int> feat_distribution(0,256);
+  for(size_t scount=0; scount<num_samples; ++scount)
+    {
+    LabeledPixelType label = label_distribution(generator);
+    LocalInputSampleType sample(num_features);
+    for(unsigned int i=0; i<num_features; ++i)
+      sample[i]= feat_distribution(generator);
+    samples->SetMeasurementVectorSize(num_features);
+    samples->PushBack(sample); 
+    labels->PushBack(label);
+    }
+}
+
+void buildModel(unsigned int num_classes, unsigned int num_samples,
+                unsigned int num_features, std::string modelfname)
+{
+  LocalInputListSampleType::Pointer samples = LocalInputListSampleType::New();
+  LocalTargetListSampleType::Pointer labels = LocalTargetListSampleType::New();
+
+  std::cout << "Sample generation\n";
+  generateSamples(num_classes, num_samples, num_features, samples, labels);
+
+  MachineLearningModelType::Pointer classifier = MachineLearningModelType::New();
+  classifier->SetInputListSample(samples);
+  classifier->SetTargetListSample(labels);
+  classifier->SetRegressionMode(false);
+  classifier->SetNumberOfTrees(100);
+  classifier->SetMTry(0);
+  classifier->SetNodeSize(25);
+  classifier->SetOobRatio(0.3);
+  std::cout << "Training\n";
+  using TimeT = std::chrono::milliseconds;
+  auto start = std::chrono::system_clock::now();
+  classifier->Train();
+  auto duration = std::chrono::duration_cast< TimeT> 
+    (std::chrono::system_clock::now() - start);
+  auto elapsed = duration.count();
+  std::cout << "Training took " << elapsed << " ms\n";
+  classifier->Save(modelfname);
+}
+
+int otbSharkImageClassificationFilter(int argc, char * argv[])
+{
+  if(argc<5 || argc>7)
+    {
+    std::cout << "Usage: input_image output_image output_confidence batchmode [in_model_name] [mask_name]\n";
+    }
+  std::string imfname = argv[1];
+  std::string outfname = argv[2];
+  std::string conffname = argv[3]; 
+  bool batch = (std::string(argv[4])=="1");
+  std::string modelfname = "/tmp/rf_model.txt";
+  std::string maskfname{};
+
+  MaskReaderType::Pointer mask_reader = MaskReaderType::New();
+  ReaderType::Pointer reader = ReaderType::New();
+  reader->SetFileName(imfname);
+  reader->UpdateOutputInformation();
+
+  auto num_features = reader->GetOutput()->GetNumberOfComponentsPerPixel();
+
+  std::cout << "Image has " << num_features << " bands\n";
+    
+  if(argc>5)
+    {
+    modelfname = argv[5];
+    }
+  else
+    {
+    buildModel(3, 1000, num_features, modelfname);
+    }
+
+  ClassificationFilterType::Pointer filter = ClassificationFilterType::New();
+
+  MachineLearningModelType::Pointer model = MachineLearningModelType::New();
+  model->Load(modelfname);
+  filter->SetModel(model);
+  filter->SetInput(reader->GetOutput());
+  if(argc==7)
+    {
+    maskfname = argv[6];
+    mask_reader->SetFileName(maskfname);
+    filter->SetInputMask(mask_reader->GetOutput());
+    }
+
+  WriterType::Pointer writer = WriterType::New();
+  writer->SetInput(filter->GetOutput());
+  writer->SetFileName(outfname);
+  std::cout << "Classification\n";
+  filter->SetBatchMode(batch);
+  filter->SetUseConfidenceMap(true);
+  using TimeT = std::chrono::milliseconds;
+  auto start = std::chrono::system_clock::now();
+  writer->Update();
+  auto duration = std::chrono::duration_cast< TimeT> 
+    (std::chrono::system_clock::now() - start);
+  auto elapsed = duration.count();
+  std::cout << "Classification took " << elapsed << " ms\n";
+
+  auto confWriter = otb::ImageFileWriter<ClassificationFilterType::ConfidenceImageType>::New();
+  confWriter->SetInput(filter->GetOutputConfidence());
+  confWriter->SetFileName(conffname);
+  confWriter->Update();
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Learning/Supervised/test/otbSupervisedTestDriver.cxx b/Modules/Learning/Supervised/test/otbSupervisedTestDriver.cxx
index 2bf373c..9bc337b 100644
--- a/Modules/Learning/Supervised/test/otbSupervisedTestDriver.cxx
+++ b/Modules/Learning/Supervised/test/otbSupervisedTestDriver.cxx
@@ -55,8 +55,15 @@ void RegisterTests()
   REGISTER_TEST(otbGradientBoostedTreeRegressionTests);
   REGISTER_TEST(otbKNearestNeighborsRegressionTests);
   REGISTER_TEST(otbRandomForestsRegressionTests);
+#endif  
+
+#ifdef OTB_USE_SHARK
+  REGISTER_TEST(otbSharkRFMachineLearningModelNew);
+  REGISTER_TEST(otbSharkRFMachineLearningModel);
+  REGISTER_TEST(otbSharkRFMachineLearningModelCanRead);
+  REGISTER_TEST(otbSharkImageClassificationFilter);
 #endif
   
-    REGISTER_TEST(otbImageClassificationFilterNew);
+  REGISTER_TEST(otbImageClassificationFilterNew);
   REGISTER_TEST(otbImageClassificationFilter);
 }
diff --git a/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx b/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx
index cb71eba..518a301 100644
--- a/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx
+++ b/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx
@@ -1035,3 +1035,255 @@ int otbGradientBoostedTreeMachineLearningModel(int argc, char * argv[])
     }
 }
 #endif
+
+#ifdef OTB_USE_SHARK
+#include <chrono> // If shark is on, then we are using c++11
+
+bool SharkReadDataFile(const std::string & infname, InputListSampleType * samples, TargetListSampleType * labels)
+{
+  std::ifstream ifs(infname.c_str());
+
+  if(!ifs)
+    {
+    std::cout<<"Could not read file "<<infname<<std::endl;
+    return false;
+    }
+
+  unsigned int nbfeatures = 0;
+
+  std::string line;
+  while (std::getline(ifs, line))
+    {
+    boost::algorithm::trim(line);
+
+    if(nbfeatures == 0)
+      {
+      nbfeatures = std::count(line.begin(),line.end(),' ');
+      }
+
+    if(line.size()>1)
+      {
+      InputSampleType sample(nbfeatures);
+      sample.Fill(0);
+
+      std::string::size_type pos = line.find_first_of(" ", 0);
+
+      // Parse label
+      TargetSampleType label;
+      label[0] = std::stoi(line.substr(0, pos).c_str());
+
+      bool endOfLine = false;
+      unsigned int id = 0;
+
+      while(!endOfLine)
+        {
+        std::string::size_type nextpos = line.find_first_of(" ", pos+1);
+
+        if(pos == std::string::npos)
+          {
+          endOfLine = true;
+          nextpos = line.size()-1;
+          }
+        else
+          {
+          std::string feature = line.substr(pos,nextpos-pos);
+          std::string::size_type semicolonpos = feature.find_first_of(":");
+          id = std::stoi(feature.substr(0,semicolonpos).c_str());
+          sample[id - 1] = atof(feature.substr(semicolonpos+1,feature.size()-semicolonpos).c_str());
+          pos = nextpos;
+          }
+
+        }
+      samples->SetMeasurementVectorSize(itk::NumericTraits<InputSampleType>::GetLength(sample));
+      samples->PushBack(sample);
+      labels->PushBack(label);
+      }
+    }
+
+  //std::cout<<"Retrieved "<<samples->Size()<<" samples"<<std::endl;
+  ifs.close();
+  return true;
+}
+
+bool SharkReadDataRegressionFile(const std::string & infname, InputListSampleRegressionType * samples, TargetListSampleRegressionType * labels)
+{
+  std::ifstream ifs(infname.c_str());
+  if(!ifs)
+    {
+    std::cout<<"Could not read file "<<infname<<std::endl;
+    return false;
+    }
+
+  unsigned int nbfeatures = 0;
+
+  while (!ifs.eof())
+    {
+    std::string line;
+    std::getline(ifs, line);
+
+    if(nbfeatures == 0)
+      {
+      nbfeatures = std::count(line.begin(),line.end(),' ')-1;
+      //std::cout<<"Found "<<nbfeatures<<" features per samples"<<std::endl;
+      }
+
+    if(line.size()>1)
+      {
+      InputSampleRegressionType sample(nbfeatures);
+      sample.Fill(0);
+
+      std::string::size_type pos = line.find_first_of(" ", 0);
+
+      // Parse label
+      TargetSampleRegressionType label;
+      label[0] = atof(line.substr(0, pos).c_str());
+
+      bool endOfLine = false;
+      unsigned int id = 0;
+
+      while(!endOfLine)
+        {
+        std::string::size_type nextpos = line.find_first_of(" ", pos+1);
+
+        if(nextpos == std::string::npos)
+          {
+          endOfLine = true;
+          nextpos = line.size()-1;
+          }
+        else
+          {
+          std::string feature = line.substr(pos,nextpos-pos);
+          std::string::size_type semicolonpos = feature.find_first_of(":");
+          id = std::stoi(feature.substr(0,semicolonpos).c_str());
+          sample[id - 1] = atof(feature.substr(semicolonpos+1,feature.size()-semicolonpos).c_str());
+          pos = nextpos;
+          }
+
+        }
+      samples->SetMeasurementVectorSize(itk::NumericTraits<InputSampleRegressionType>::GetLength(sample));
+      samples->PushBack(sample);
+      labels->PushBack(label);
+      }
+    }
+
+  //std::cout<<"Retrieved "<<samples->Size()<<" samples"<<std::endl;
+  ifs.close();
+  return true;
+}
+
+
+#include "otbSharkRandomForestsMachineLearningModel.h"
+int otbSharkRFMachineLearningModelNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
+{
+  typedef otb::SharkRandomForestsMachineLearningModel<InputValueType,TargetValueType> SharkRFType;
+  SharkRFType::Pointer classifier = SharkRFType::New();
+  return EXIT_SUCCESS;
+}
+
+int otbSharkRFMachineLearningModel(int argc, char * argv[])
+{
+  if (argc != 3 )
+    {
+    std::cout<<"Wrong number of arguments "<<std::endl;
+    std::cout<<"Usage : sample file, output file "<<std::endl;
+    return EXIT_FAILURE;
+    }
+
+  typedef otb::SharkRandomForestsMachineLearningModel<InputValueType,TargetValueType> RandomForestType;
+  InputListSampleType::Pointer samples = InputListSampleType::New();
+  TargetListSampleType::Pointer labels = TargetListSampleType::New();
+  TargetListSampleType::Pointer predicted = TargetListSampleType::New();
+
+  if(!SharkReadDataFile(argv[1],samples,labels))
+    {
+    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
+    return EXIT_FAILURE;
+    }
+
+
+  RandomForestType::Pointer classifier = RandomForestType::New();
+  classifier->SetInputListSample(samples);
+  classifier->SetTargetListSample(labels);
+  classifier->SetRegressionMode(false);
+  classifier->SetNumberOfTrees(100);
+  classifier->SetMTry(0);
+  classifier->SetNodeSize(25);
+  classifier->SetOobRatio(0.3);
+  std::cout << "Train\n";
+  classifier->Train();
+  std::cout << "Save\n";
+  classifier->Save(argv[2]); 
+  
+  std::cout << "Predict\n";
+  classifier->SetTargetListSample(predicted);
+  classifier->PredictAll();
+
+  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
+
+  cmCalculator->SetProducedLabels(predicted);
+  cmCalculator->SetReferenceLabels(labels);
+  cmCalculator->Compute();
+
+  std::cout<<"Confusion matrix: "<<std::endl;
+  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
+  const float kappaIdx = cmCalculator->GetKappaIndex();
+  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
+  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
+  
+  // //Predict single samples. Written for benchmarking purposes, but
+  // too long for regression testing
+  // std::cout << "Predict single samples\n";
+  // auto sIt = samples->Begin();
+  // auto lIt = labels->Begin();
+  // auto start = std::chrono::system_clock::now();
+  // for(; sIt != samples->End(); ++sIt, ++lIt)
+  //   {
+  //   classifier->Predict(sIt.GetMeasurementVector())[0];
+  //   }
+  // auto duration = std::chrono::duration_cast< TimeT> 
+  //   (std::chrono::system_clock::now() - start);
+  // auto elapsed = duration.count();
+  // std::cout << "Predict took " << elapsed << " ms\n";
+  //  std::cout << "Single sample OA = " << oa << '\n';
+//Load Model to new RF
+  TargetListSampleType::Pointer predictedLoad = TargetListSampleType::New();
+  RandomForestType::Pointer classifierLoad = RandomForestType::New();
+
+  std::cout << "Load\n";
+  classifierLoad->Load(argv[2]);
+  auto start = std::chrono::system_clock::now();
+  classifierLoad->SetInputListSample(samples);
+  classifierLoad->SetTargetListSample(predictedLoad);
+  std::cout << "Predict loaded\n";
+  classifierLoad->PredictAll();
+  using TimeT = std::chrono::milliseconds;
+  auto duration = std::chrono::duration_cast< TimeT> 
+    (std::chrono::system_clock::now() - start);
+  auto elapsed = duration.count();
+  std::cout << "PredictAll took " << elapsed << " ms\n";
+  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
+
+   cmCalculatorLoad->SetProducedLabels(predictedLoad);
+   cmCalculatorLoad->SetReferenceLabels(labels);
+   cmCalculatorLoad->Compute();
+
+   std::cout<<"Confusion matrix: "<<std::endl;
+   std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
+   const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
+   std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
+   std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
+
+
+   if ( vcl_abs(kappaIdxLoad - kappaIdx) < 0.00000001)
+     {
+     return EXIT_SUCCESS;
+     }
+   else
+     {
+     return EXIT_FAILURE;
+     }
+  
+   return EXIT_SUCCESS;
+}
+
+#endif
diff --git a/Modules/Learning/Supervised/test/tests-libsvm.cmake b/Modules/Learning/Supervised/test/tests-libsvm.cmake
index 30dc7ee..10f5a77 100644
--- a/Modules/Learning/Supervised/test/tests-libsvm.cmake
+++ b/Modules/Learning/Supervised/test/tests-libsvm.cmake
@@ -6,7 +6,6 @@ otb_add_test(NAME leTvLibSVMMachineLearningModel COMMAND otbSupervisedTestDriver
 otb_add_test(NAME leTuLibSVMMachineLearningModelNew COMMAND otbSupervisedTestDriver
   otbLibSVMMachineLearningModelNew)
 
-
 otb_add_test(NAME leTvImageClassificationFilterLibSVM COMMAND otbSupervisedTestDriver
   --compare-image ${NOTOL}
   ${BASELINE}/leSVMImageClassificationFilterOutput.tif
@@ -17,11 +16,11 @@ otb_add_test(NAME leTvImageClassificationFilterLibSVM COMMAND otbSupervisedTestD
   ${TEMP}/leImageClassificationFilterLibSVMOutput.tif
   )
 
-otb_add_test(NAME leTuLibSVMMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvLibSVMMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbLibSVMMachineLearningModelCanRead
   ${TEMP}/libsvm_model.txt
   )
-set_property(TEST leTuLibSVMMachineLearningModelCanRead PROPERTY DEPENDS leTvLibSVMMachineLearningModel)
+set_property(TEST leTvLibSVMMachineLearningModelCanRead PROPERTY DEPENDS leTvLibSVMMachineLearningModel)
 
 otb_add_test(NAME leTvLibSVMMachineLearningModelReg COMMAND otbSupervisedTestDriver
   otbLibSVMRegressionTests
diff --git a/Modules/Learning/Supervised/test/tests-opencv.cmake b/Modules/Learning/Supervised/test/tests-opencv.cmake
index 3be269f..d0263af 100644
--- a/Modules/Learning/Supervised/test/tests-opencv.cmake
+++ b/Modules/Learning/Supervised/test/tests-opencv.cmake
@@ -115,50 +115,50 @@ otb_add_test(NAME leTvImageClassificationFilterSVM COMMAND otbSupervisedTestDriv
   ${TEMP}/leImageClassificationFilterSVMOutput.tif
   )
 
-otb_add_test(NAME leTuDecisionTreeMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvDecisionTreeMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbDecisionTreeMachineLearningModelCanRead
   ${TEMP}/decisiontree_model.txt
   )
-set_property(TEST leTuDecisionTreeMachineLearningModelCanRead APPEND PROPERTY DEPENDS leTvDecisionTreeMachineLearningModel)
+set_property(TEST leTvDecisionTreeMachineLearningModelCanRead APPEND PROPERTY DEPENDS leTvDecisionTreeMachineLearningModel)
 
-otb_add_test(NAME leTuGradientBoostedTreeMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvGradientBoostedTreeMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbGradientBoostedTreeMachineLearningModelCanRead
   ${TEMP}/gbt_model.txt
   )
-set_property(TEST leTuGradientBoostedTreeMachineLearningModelCanRead PROPERTY DEPENDS leTvGradientBoostedTreeMachineLearningModel)
+set_property(TEST leTvGradientBoostedTreeMachineLearningModelCanRead PROPERTY DEPENDS leTvGradientBoostedTreeMachineLearningModel)
 
-otb_add_test(NAME leTuNormalBayesMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvNormalBayesMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbNormalBayesMachineLearningModelCanRead
   ${TEMP}/normalbayes_model.txt
   )
-set_property(TEST leTuNormalBayesMachineLearningModelCanRead PROPERTY DEPENDS leTvNormalBayesMachineLearningModel)
+set_property(TEST leTvNormalBayesMachineLearningModelCanRead PROPERTY DEPENDS leTvNormalBayesMachineLearningModel)
 
-otb_add_test(NAME leTuANNMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvANNMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbNeuralNetworkMachineLearningModelCanRead
   ${TEMP}/ann_model.txt
   )
-set_property(TEST leTuANNMachineLearningModelCanRead PROPERTY DEPENDS leTvANNMachineLearningModel)
+set_property(TEST leTvANNMachineLearningModelCanRead PROPERTY DEPENDS leTvANNMachineLearningModel)
 
-otb_add_test(NAME leTuSVMMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvSVMMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbSVMMachineLearningModelCanRead
   ${TEMP}/svm_model.txt
   )
-set_property(TEST leTuSVMMachineLearningModelCanRead PROPERTY DEPENDS leTvSVMMachineLearningModel)
+set_property(TEST leTvSVMMachineLearningModelCanRead PROPERTY DEPENDS leTvSVMMachineLearningModel)
 
-otb_add_test(NAME leTuBoostMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvBoostMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbBoostMachineLearningModelCanRead
   ${TEMP}/boost_model.txt
   )
-set_property(TEST leTuBoostMachineLearningModelCanRead PROPERTY DEPENDS leTvBoostMachineLearningModel)
+set_property(TEST leTvBoostMachineLearningModelCanRead PROPERTY DEPENDS leTvBoostMachineLearningModel)
 
-otb_add_test(NAME leTuRandomForestsMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvRandomForestsMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbRandomForestsMachineLearningModelCanRead
   ${TEMP}/rf_model.txt
   )
-set_property(TEST leTuRandomForestsMachineLearningModelCanRead PROPERTY DEPENDS leTvRandomForestsMachineLearningModel)
+set_property(TEST leTvRandomForestsMachineLearningModelCanRead PROPERTY DEPENDS leTvRandomForestsMachineLearningModel)
 
-otb_add_test(NAME leTuKNNMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+otb_add_test(NAME leTvKNNMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
   otbKNNMachineLearningModelCanRead
   ${TEMP}/knn_model.txt
   )
-set_property(TEST leTuKNNMachineLearningModelCanRead PROPERTY DEPENDS leTvKNearestNeighborsMachineLearningModel)
+set_property(TEST leTvKNNMachineLearningModelCanRead PROPERTY DEPENDS leTvKNearestNeighborsMachineLearningModel)
diff --git a/Modules/Learning/Supervised/test/tests-shark.cmake b/Modules/Learning/Supervised/test/tests-shark.cmake
new file mode 100644
index 0000000..265fe84
--- /dev/null
+++ b/Modules/Learning/Supervised/test/tests-shark.cmake
@@ -0,0 +1,61 @@
+otb_add_test(NAME leTuSharkRFMachineLearningModelNew COMMAND otbSupervisedTestDriver
+  otbSharkRFMachineLearningModelNew)
+
+otb_add_test(NAME leTvSharkRFMachineLearningModel COMMAND otbSupervisedTestDriver
+  otbSharkRFMachineLearningModel
+  ${INPUTDATA}/letter.scale
+  ${TEMP}/shark_rf_model.txt
+  )
+
+otb_add_test(NAME leTvSharkRFMachineLearningModelCanRead COMMAND otbSupervisedTestDriver
+  otbSharkRFMachineLearningModelCanRead
+  ${INPUTDATA}/Classification/otbSharkImageClassificationFilter_RFmodel.txt
+  )
+
+otb_add_test(NAME leTvSharkRFMachineLearningModelCanReadFail COMMAND otbSupervisedTestDriver
+  otbSharkRFMachineLearningModelCanRead
+  ${INPUTDATA}/ROI_QB_MUL_4_svmModel.txt
+  )
+set_property(TEST leTvSharkRFMachineLearningModelCanReadFail PROPERTY WILL_FAIL true)
+
+
+otb_add_test(NAME leTvImageClassificationFilterSharkFast COMMAND  otbSupervisedTestDriver
+  --compare-n-images ${NOTOL} 2 
+  ${BASELINE}/leSharkImageClassificationFilterOutput.tif
+  ${TEMP}/leSharkImageClassificationFilterOutput.tif
+  ${BASELINE}/leSharkImageClassificationFilterConfidence.tif
+  ${TEMP}/leSharkImageClassificationFilterConfidence.tif   
+  otbSharkImageClassificationFilter
+  ${INPUTDATA}/Classification/QB_1_ortho.tif
+  ${TEMP}/leSharkImageClassificationFilterOutput.tif
+  ${TEMP}/leSharkImageClassificationFilterConfidence.tif
+  1
+  ${INPUTDATA}/Classification/otbSharkImageClassificationFilter_RFmodel.txt
+  )
+
+# This test has been added for benchmarking purposes. However, it is
+# far too long to be part of regression testing
+
+# otb_add_test(NAME leTvImageClassificationFilterSharkClassic COMMAND  otbSupervisedTestDriver
+#   otbSharkImageClassificationFilter
+#   ${INPUTDATA}/Classification/QB_1_ortho.tif
+#   ${TEMP}/leSharkImageClassificationFilterOutput.tif
+#   ${TEMP}/leSharkImageClassificationFilterConfidence.tif
+#   0
+#   ${INPUTDATA}/Classification/otbSharkImageClassificationFilter_RFmodel.txt
+#   )
+
+otb_add_test(NAME leTvImageClassificationFilterSharkFastMask COMMAND  otbSupervisedTestDriver
+  --compare-n-images ${NOTOL} 2 
+  ${BASELINE}/leSharkImageClassificationFilterWithMaskOutput.tif
+  ${TEMP}/leSharkImageClassificationFilterWithMaskOutput.tif
+  ${BASELINE}/leSharkImageClassificationFilterWithMaskConfidence.tif
+  ${TEMP}/leSharkImageClassificationFilterWithMaskConfidence.tif   
+  otbSharkImageClassificationFilter
+  ${INPUTDATA}/Classification/QB_1_ortho.tif
+  ${TEMP}/leSharkImageClassificationFilterWithMaskOutput.tif
+  ${TEMP}/leSharkImageClassificationFilterWithMaskConfidence.tif
+  1
+  ${INPUTDATA}/Classification/otbSharkImageClassificationFilter_RFmodel.txt
+  ${INPUTDATA}/Classification/QB_1_ortho_mask.tif
+  )
diff --git a/Modules/MPI/MPIConfig/include/otbMPIConfig.h b/Modules/MPI/MPIConfig/include/otbMPIConfig.h
index 8f1f4c6..3b53299 100644
--- a/Modules/MPI/MPIConfig/include/otbMPIConfig.h
+++ b/Modules/MPI/MPIConfig/include/otbMPIConfig.h
@@ -25,7 +25,7 @@
 namespace otb {
 
 /** \class MPI config
-  *  \brief Manage MPI ressources
+  *  \brief Manage MPI resources
   * TODO
   *
   *
diff --git a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h
index 92b4e7a..2f6c6f4 100644
--- a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h
+++ b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.h
@@ -78,7 +78,7 @@ namespace otb
  *
  * SimpleParallelTiffWriter writes its input data to a single output file.
  * SimpleParallelTiffWriter interfaces with an MPI-IO based class to write out the
- * data whith streaming process and mutliple processing nodes.
+ * data with streaming process and multiple processing nodes.
  *
  * SimpleParallelTiffWriter will divide the output into several pieces
  * (controlled by SetNumberOfDivisionsStrippedStreaming, SetNumberOfLinesStrippedStreaming,
diff --git a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx
index b9bd8dd..fbfc4d3 100644
--- a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx
+++ b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx
@@ -753,7 +753,7 @@ SimpleParallelTiffWriter<TInputImage>
     }
 
   /*
-   * Writting the geom (only master process)
+   * Writing the geom (only master process)
    */
   if ( otb::MPIConfig::Instance()->GetMyRank() == 0 &&
       (m_WriteGeomFile || m_FilenameHelper->GetWriteGEOMFile()) )
diff --git a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h
index 62e2448..7e0e732 100644
--- a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h
+++ b/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h
@@ -61,7 +61,7 @@ public:
   typedef typename OutputGraphType::RCC8ValueType     RCC8ValueType;
   /** InputImage dimension constant */
   itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Overiding the SetInput() and GetInput() methods */
+  /** Overriding the SetInput() and GetInput() methods */
   using Superclass::SetInput;
   virtual void SetInput(const InputImageListType * imageList);
   virtual InputImageListType * GetInput(void);
diff --git a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h
index 344ee2d..8636885 100644
--- a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h
+++ b/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h
@@ -66,7 +66,7 @@ public:
   itkSetMacro(Optimisation, bool);
 
   /**
-   * Get the number of occurences of the given value
+   * Get the number of occurrences of the given value
    * \return The value.
    */
   unsigned int GetRelationsCount(RCC8ValueType val);
diff --git a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.txx b/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.txx
index c0dc617..8592536 100644
--- a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.txx
+++ b/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.txx
@@ -235,15 +235,15 @@ ImageToImageRCC8Calculator<TInputImage>
   structElement2.CreateStructuringElement();
   dilateFilter1->SetKernel(structElement1);
   dilateFilter2->SetKernel(structElement2);
-  /// The erosion is performed to get the surounding edge of this
-  /// region by substraction to the original image
+  /// The erosion is performed to get the surrounding edge of this
+  /// region by subtraction to the original image
   dilateFilter1->SetInput(m_BoolImage1);
   dilateFilter1->Update();
   subtractFilter1->SetInput2(m_BoolImage1);
   subtractFilter1->SetInput1(dilateFilter1->GetOutput());
   subtractFilter1->Update();
-  /// The erosion is performed to get the surounding edge of this
-  /// region by substraction to the original image
+  /// The erosion is performed to get the surrounding edge of this
+  /// region by subtraction to the original image
   dilateFilter2->SetInput(m_BoolImage2);
   dilateFilter2->Update();
   subtractFilter2->SetInput2(m_BoolImage2);
diff --git a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h
index 86f23b8..9ea9a6e 100644
--- a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h
+++ b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h
@@ -99,7 +99,7 @@ public:
   }
 
   /**
-   * Get the number of occurences of the given value
+   * Get the number of occurrences of the given value
    * \return The value.
    */
   unsigned int GetRelationsCount(RCC8ValueType val);
@@ -130,7 +130,7 @@ protected:
 
   virtual void AfterThreadedGenerateData();
 
-  /** startIndex and stopIndex represent the indeces of the vertex to
+  /** startIndex and stopIndex represent the indices of the vertex to
   examine in thread threadId */
   virtual void ThreadedGenerateData(unsigned int startIndex, unsigned int stopIndex, itk::ThreadIdType threadId);
 
diff --git a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.txx b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.txx
index 0a23937..549473e 100644
--- a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.txx
+++ b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.txx
@@ -438,7 +438,7 @@ PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
     }
   // else
   //   {
-  //   otherwise don't use this thread. Sometimes the threads dont
+  //   otherwise don't use this thread. Sometimes the threads don't
   //   break up very well and it is just as efficient to leave a
   //   few threads idle.
   //   }
diff --git a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h
index e54f0c4..1fcfcac 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h
+++ b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h
@@ -71,7 +71,7 @@ public:
   VertexPointerType GetTargetVertex(void);
   /**
    * Return the source vertex index of the current edge.
-   * \return The souce vertex index.
+   * \return The source vertex index.
    */
   VertexDescriptorType GetSourceIndex(void);
   /**
diff --git a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.txx b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.txx
index cc2c0c7..225e929 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.txx
+++ b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.txx
@@ -89,7 +89,7 @@ RCC8EdgeIterator<TGraph>
 }
 /**
  * Return the source vertex index of the current edge.
- * \return The souce vertex index.
+ * \return The source vertex index.
  */
 template <class TGraph>
 typename RCC8EdgeIterator<TGraph>
diff --git a/Modules/OBIA/RCC8/include/otbRCC8Graph.h b/Modules/OBIA/RCC8/include/otbRCC8Graph.h
index ae50520..c7258a1 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8Graph.h
+++ b/Modules/OBIA/RCC8/include/otbRCC8Graph.h
@@ -39,7 +39,7 @@ namespace otb
  * computed from a pyramidal segmentation.
  *
  * A batch of boost operation has been embedded in order to provide
- * basic functionnality such as adding a new edge, or retrieving the
+ * basic functionality such as adding a new edge, or retrieving the
  * number of vertices. A method is also provided to retrieve the boost
  * graph object, in case more advanced processing is required. One
  * should remember that if a peculiar operation is needed for some
@@ -129,7 +129,7 @@ protected:
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
   /**
    * Initialize a range of vertex.
-   * \param num The index of the last vertices to intialize.
+   * \param num The index of the last vertices to initialize.
    */
   void InitializeGraph(unsigned int num);
 
diff --git a/Modules/OBIA/RCC8/include/otbRCC8Graph.txx b/Modules/OBIA/RCC8/include/otbRCC8Graph.txx
index ad98bec..24279f1 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8Graph.txx
+++ b/Modules/OBIA/RCC8/include/otbRCC8Graph.txx
@@ -45,7 +45,7 @@ RCC8Graph<TVertex>
 }
 /**
  * Initialize a range of vertex.
- * \param num The index of the last vertices to intialize.
+ * \param num The index of the last vertices to initialize.
  */
 template <class TVertex>
 void
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h b/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h
index 4c47c70..0cee77b 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h
+++ b/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h
@@ -47,7 +47,7 @@ public:
   /** Template parameter typedef*/
   typedef TOutputGraph                      OutputGraphType;
   typedef typename OutputGraphType::Pointer OutputGraphPointerType;
-  /** Overiding of the GetOutput() method */
+  /** Overriding of the GetOutput() method */
   virtual OutputGraphType * GetOutput(void);
 
 protected:
diff --git a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h
index a14e165..75d642b 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h
+++ b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h
@@ -66,7 +66,7 @@ public:
   VertexPointerType GetSourceVertex(void);
   /**
    * Return the source vertex index of the current edge.
-   * \return The souce vertex index.
+   * \return The source vertex index.
    */
   VertexDescriptorType GetSourceIndex(void);
   /**
diff --git a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.txx b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.txx
index 680f33a..8f433b6 100644
--- a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.txx
+++ b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.txx
@@ -79,7 +79,7 @@ RCC8InEdgeIterator<TGraph>
 }
 /**
  * Return the source vertex index of the current edge.
- * \return The souce vertex index.
+ * \return The source vertex index.
  */
 template <class TGraph>
 typename RCC8InEdgeIterator<TGraph>
diff --git a/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h b/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h
index cf2f469..cf7e9b0 100644
--- a/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h
+++ b/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h
@@ -656,7 +656,7 @@ public:
  *  and ETM+ Images", IEEE Trans. on Geoscience and Remote Sensing,
  *  vol 44, no 9.
  *
- *  NDBSI > -0.2 is a strong (necesary, but not sufficient)
+ *  NDBSI > -0.2 is a strong (necessary, but not sufficient)
  *  indication of the presence of bare soil areas.
  *
  * \ingroup Functor
@@ -802,7 +802,7 @@ public:
  *  automatic cloud cover assessment (ACCA)", Poc. of SPIE, vol 4049,
  *  pp. 348-355, 2000.
  *
- *  NDSIVis > 0.5 is a strong (necesary, but not sufficient)
+ *  NDSIVis > 0.5 is a strong (necessary, but not sufficient)
  *  indication of the presence of snow areas.
  *
  * \ingroup Functor
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbAeronetData.h b/Modules/Radiometry/OpticalCalibration/include/otbAeronetData.h
index 6136f8c..1287723 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbAeronetData.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbAeronetData.h
@@ -21,6 +21,7 @@
 #include "itkDataObject.h"
 #include "itkObjectFactory.h"
 #include "itkMacro.h"
+#include "OTBOpticalCalibrationExport.h"
 
 namespace otb
 {
@@ -33,7 +34,7 @@ namespace otb
  *
  * \ingroup OTBOpticalCalibration
  */
-class ITK_EXPORT AeronetData :  public itk::DataObject
+class OTBOpticalCalibration_EXPORT AeronetData :  public itk::DataObject
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbAeronetFileReader.h b/Modules/Radiometry/OpticalCalibration/include/otbAeronetFileReader.h
index 75e75ff..4da8a42 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbAeronetFileReader.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbAeronetFileReader.h
@@ -21,6 +21,8 @@
 #include <string>
 #include <vector>
 
+#include "OTBOpticalCalibrationExport.h"
+
 #include "itkProcessObject.h"
 
 namespace otb
@@ -33,7 +35,7 @@ class AeronetData;
  *
  * \ingroup OTBOpticalCalibration
  */
-class ITK_EXPORT AeronetFileReaderException
+class OTBOpticalCalibration_EXPORT AeronetFileReaderException
   : public itk::ExceptionObject
 {
 public:
@@ -72,7 +74,7 @@ public:
  *
  * \ingroup OTBOpticalCalibration
  */
-class ITK_EXPORT AeronetFileReader : public itk::ProcessObject
+class OTBOpticalCalibration_EXPORT AeronetFileReader : public itk::ProcessObject
 {
 public:
   /** Standards typedef */
@@ -85,7 +87,7 @@ public:
   /** Runtime type information */
   itkTypeMacro(AeronetFileReader, itk::ProcessObject);
 
-  /** Overiding of the GetOutput() method */
+  /** Overriding of the GetOutput() method */
   virtual AeronetData * GetOutput(void);
 
   /** Set the filename  */
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericCorrectionParameters.h b/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericCorrectionParameters.h
index 4b3d591..c09f7c8 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericCorrectionParameters.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericCorrectionParameters.h
@@ -18,6 +18,7 @@
 #ifndef otbAtmosphericCorrectionParameters_h
 #define otbAtmosphericCorrectionParameters_h
 
+#include "OTBOpticalCalibrationExport.h"
 #include "itkObject.h"
 #include "itkVariableSizeMatrix.h"
 #include "itkVariableLengthVector.h"
@@ -39,7 +40,7 @@ namespace otb
  * \ingroup OTBOpticalCalibration
  */
 
-class ITK_EXPORT AtmosphericCorrectionParameters : public itk::DataObject
+class OTBOpticalCalibration_EXPORT AtmosphericCorrectionParameters : public itk::DataObject
 {
 public:
   /** Standard typedefs */
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericRadiativeTerms.h b/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericRadiativeTerms.h
index c719ca9..cb4c458 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericRadiativeTerms.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbAtmosphericRadiativeTerms.h
@@ -18,6 +18,7 @@
 #ifndef otbAtmosphericRadiativeTerms_h
 #define otbAtmosphericRadiativeTerms_h
 
+#include "OTBOpticalCalibrationExport.h"
 #include "itkDataObject.h"
 #include "itkObjectFactory.h"
 #include "itkMacro.h"
@@ -37,7 +38,7 @@ namespace otb
  * \ingroup OTBOpticalCalibration
  */
 
-class ITK_EXPORT AtmosphericRadiativeTermsSingleChannel : public itk::DataObject
+class OTBOpticalCalibration_EXPORT AtmosphericRadiativeTermsSingleChannel : public itk::DataObject
 {
 public:
   /** Standard typedefs */
@@ -164,7 +165,7 @@ private:
  * \ingroup OTBOpticalCalibration
  */
 
-class ITK_EXPORT AtmosphericRadiativeTerms : public itk::DataObject
+class OTBOpticalCalibration_EXPORT AtmosphericRadiativeTerms : public itk::DataObject
 {
 public:
   /** Standard typedefs */
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbImageMetadataCorrectionParameters.h b/Modules/Radiometry/OpticalCalibration/include/otbImageMetadataCorrectionParameters.h
index 8d15966..e6febb0 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbImageMetadataCorrectionParameters.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbImageMetadataCorrectionParameters.h
@@ -18,6 +18,7 @@
 #ifndef otbImageMetadataCorrectionParameters_h
 #define otbImageMetadataCorrectionParameters_h
 
+#include "OTBOpticalCalibrationExport.h"
 #include "itkObject.h"
 #include "itkVariableSizeMatrix.h"
 #include "itkVariableLengthVector.h"
@@ -39,7 +40,7 @@ namespace otb
  * \ingroup OTBOpticalCalibration
  */
 
-class ITK_EXPORT ImageMetadataCorrectionParameters : public itk::DataObject
+class OTBOpticalCalibration_EXPORT ImageMetadataCorrectionParameters : public itk::DataObject
 {
 public:
   /** Standard typedefs */
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbImageToReflectanceImageFilter.h b/Modules/Radiometry/OpticalCalibration/include/otbImageToReflectanceImageFilter.h
index 2040c40..7522c9b 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbImageToReflectanceImageFilter.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbImageToReflectanceImageFilter.h
@@ -116,7 +116,7 @@ private:
  *
  *  Transform a classical image into the reflectance image. For this it uses the functor ImageToReflectanceFunctor calling for each component of each pixel.
  *  The flux normalization coefficient (that is the ratio solar distance over mean solar distance) can be directly set or the user can
- *  give the day and the mounth of the observation and the class will used a coefficient given by a 6S routine that will give the corresponding coefficient.
+ *  give the day and the month of the observation and the class will used a coefficient given by a 6S routine that will give the corresponding coefficient.
  *  To note that in the case, 6S gives the square of the distances ratio.
  *
  *
@@ -230,9 +230,9 @@ public:
   itkSetClampMacro(Day, int, 1, 31);
   /** Get the acquisition day. */
   itkGetConstReferenceMacro(Day, int);
-  /** Set the acquisition mounth. */
+  /** Set the acquisition month. */
   itkSetClampMacro(Month, int, 1, 12);
-  /** Set the  acquisition mounth. */
+  /** Set the  acquisition month. */
   itkGetConstReferenceMacro(Month, int);
 
 protected:
@@ -320,7 +320,7 @@ protected:
           }
         else
           {
-          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month beetween 1 and 12.");
+          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month between 1 and 12.");
           }
         }
       else
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToImageImageFilter.h b/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToImageImageFilter.h
index 8f53ee7..95fbf67 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToImageImageFilter.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToImageImageFilter.h
@@ -36,7 +36,7 @@ namespace Functor
 {
 /**
    * \class LuminanceToImageImageFunctor
-   * \brief Substract beta to the Input and multiply by alpha.
+   * \brief Subtract beta to the Input and multiply by alpha.
    *
    * \sa LuminanceToImageImageFilter
    * \ingroup Functor
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToReflectanceImageFilter.h b/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToReflectanceImageFilter.h
index 8c28238..721265a 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToReflectanceImageFilter.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbLuminanceToReflectanceImageFilter.h
@@ -208,9 +208,9 @@ public:
   /** Give the day. */
   itkGetConstReferenceMacro(Day, int);
 
-  /** Set the mounth. */
+  /** Set the month. */
   itkSetClampMacro(Month, int, 1, 12);
-  /** Give the mounth. */
+  /** Give the month. */
   itkGetConstReferenceMacro(Month, int);
 
   /** Set the flux normalization coefficient. */
@@ -301,7 +301,7 @@ protected:
           }
         else
           {
-          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month beetween 1 and 12.");
+          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month between 1 and 12.");
           }
         }
       else
@@ -326,7 +326,7 @@ private:
   double m_FluxNormalizationCoefficient;
   /** Acquisition day. */
   int m_Day;
-  /** Acquisition mounth. */
+  /** Acquisition month. */
   int m_Month;
   /** Solar illumination value. */
   VectorType m_SolarIllumination;
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h b/Modules/Radiometry/OpticalCalibration/include/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h
index dc58456..387ccf4 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbRadiometryCorrectionParametersToAtmosphericRadiativeTerms.h
@@ -35,7 +35,7 @@ namespace otb
  *
  * \ingroup OTBOpticalCalibration
  */
-  class ITK_EXPORT RadiometryCorrectionParametersToAtmosphericRadiativeTerms
+  class RadiometryCorrectionParametersToAtmosphericRadiativeTerms
   {
   public:
 
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToImageImageFilter.h b/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToImageImageFilter.h
index 107f07e..e69a0d3 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToImageImageFilter.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToImageImageFilter.h
@@ -108,7 +108,7 @@ private:
  *
  *  Transform a reflectance image into a classical image image. For this it uses the functor ReflectanceToImageFunctor calling for each component of each pixel.
  *  The flux normalization coefficient (that is the ratio solar distance over mean solar distance) can be directly set or the user can
- *  give the day and the mounth of the observation and the class will used a coefficient given by a 6S routine that will give the corresponding coefficient.
+ *  give the day and the month of the observation and the class will used a coefficient given by a 6S routine that will give the corresponding coefficient.
  *  To note that in the case, 6S gives the square of the distances ratio.
  *
  *
@@ -217,9 +217,9 @@ public:
   itkSetClampMacro(Day, int, 1, 31);
   /** Get the acquisition day. */
   itkGetConstReferenceMacro(Day, int);
-  /** Set the acquisition mounth. */
+  /** Set the acquisition month. */
   itkSetClampMacro(Month, int, 1, 12);
-  /** Set the  acquisition mounth. */
+  /** Set the  acquisition month. */
   itkGetConstReferenceMacro(Month, int);
 
 protected:
@@ -305,7 +305,7 @@ protected:
           }
         else
           {
-          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month beetween 1 and 12.");
+          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month between 1 and 12.");
           }
         }
       else
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToLuminanceImageFilter.h b/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToLuminanceImageFilter.h
index ceeac8e..ed392f6 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToLuminanceImageFilter.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbReflectanceToLuminanceImageFilter.h
@@ -193,9 +193,9 @@ public:
   /** Give the day. */
   itkGetConstReferenceMacro(Day, int);
 
-  /** Set the mounth. */
+  /** Set the month. */
   itkSetClampMacro(Month, int, 1, 12);
-  /** Give the mounth. */
+  /** Give the month. */
   itkGetConstReferenceMacro(Month, int);
 
   /** Set the flux normalization coefficient. */
@@ -284,7 +284,7 @@ protected:
           }
         else
           {
-          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month beetween 1 and 12.");
+          itkExceptionMacro(<< "Day has to be included between 1 and 31, Month between 1 and 12.");
           }
         }
       else
@@ -308,7 +308,7 @@ private:
   double m_FluxNormalizationCoefficient;
   /** Acquisition day. */
   int m_Day;
-  /** Acquisition mounth. */
+  /** Acquisition month. */
   int m_Month;
   /** Solar illumination value. */
   VectorType m_SolarIllumination;
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbSIXSTraits.h b/Modules/Radiometry/OpticalCalibration/include/otbSIXSTraits.h
index 6fc9b45..153e617 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbSIXSTraits.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbSIXSTraits.h
@@ -18,6 +18,7 @@
 #ifndef otbSIXSTraits_h
 #define otbSIXSTraits_h
 
+#include "OTBOpticalCalibrationExport.h"
 #include "otbAtmosphericCorrectionParameters.h"
 
 namespace otb
@@ -34,7 +35,7 @@ namespace otb
  *
  * \ingroup OTBOpticalCalibration
  */
-class ITK_EXPORT SIXSTraits
+class OTBOpticalCalibration_EXPORT SIXSTraits
 {
 public:
 
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbSpectralSensitivityReader.h b/Modules/Radiometry/OpticalCalibration/include/otbSpectralSensitivityReader.h
index 213fa0c..da9917e 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbSpectralSensitivityReader.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbSpectralSensitivityReader.h
@@ -22,6 +22,7 @@
 #include "itkImageBase.h"
 #include "otbObjectList.h"
 #include "otbFilterFunctionValues.h"
+#include "OTBOpticalCalibrationExport.h"
 
 namespace otb
 {
@@ -36,7 +37,7 @@ namespace otb
  * \ingroup OTBOpticalCalibration
  */
 
-class ITK_EXPORT SpectralSensitivityReader : public itk::ProcessObject
+class OTBOpticalCalibration_EXPORT SpectralSensitivityReader : public itk::ProcessObject
 {
 public:
   /** Standard class typedefs */
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.h b/Modules/Radiometry/OpticalCalibration/include/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.h
index c896492..181f451 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.h
@@ -129,7 +129,7 @@ private:
  *  \brief Correct the scheme taking care of the surrounding pixels.
  *
  *   The SurfaceAdjacencyEffectCorrectionSchemeFilter class allows introducing a neighbor correction to the
- *   reflectance estimation. The satelite signal is considered as to be a combinaison of the signal coming from
+ *   reflectance estimation. The satellite signal is considered as to be a combinaison of the signal coming from
  *   the target pixel and a weighting of the siganls coming from the neighbor pixels.
  *
  * \ingroup Radiometry
diff --git a/Modules/Radiometry/OpticalCalibration/include/otbWavelengthSpectralBands.h b/Modules/Radiometry/OpticalCalibration/include/otbWavelengthSpectralBands.h
index 72c8b8b..402c397 100644
--- a/Modules/Radiometry/OpticalCalibration/include/otbWavelengthSpectralBands.h
+++ b/Modules/Radiometry/OpticalCalibration/include/otbWavelengthSpectralBands.h
@@ -20,6 +20,7 @@
 
 #include "otbObjectList.h"
 #include "otbFilterFunctionValues.h"
+#include "OTBOpticalCalibrationExport.h"
 
 namespace otb
 {
@@ -30,7 +31,7 @@ namespace otb
  *
  * \ingroup OTBOpticalCalibration
  */
-class ITK_EXPORT WavelengthSpectralBands : public itk::DataObject
+class OTBOpticalCalibration_EXPORT WavelengthSpectralBands : public itk::DataObject
 {
 public:
   /** Standard typedefs */
diff --git a/Modules/Radiometry/OpticalCalibration/otb-module.cmake b/Modules/Radiometry/OpticalCalibration/otb-module.cmake
index d8bdb1b..508b7f6 100644
--- a/Modules/Radiometry/OpticalCalibration/otb-module.cmake
+++ b/Modules/Radiometry/OpticalCalibration/otb-module.cmake
@@ -4,6 +4,7 @@ refletance image conversion. atmospheric correction for TOA (top of atmosphere)
 into account the neighborhood contribution.")
 
 otb_module(OTBOpticalCalibration
+ENABLE_SHARED
   DEPENDS
     OTB6S
     OTBBoostAdapters
diff --git a/Modules/Radiometry/OpticalCalibration/src/otbSIXSTraits.cxx b/Modules/Radiometry/OpticalCalibration/src/otbSIXSTraits.cxx
index 44cbd60..e022f24 100644
--- a/Modules/Radiometry/OpticalCalibration/src/otbSIXSTraits.cxx
+++ b/Modules/Radiometry/OpticalCalibration/src/otbSIXSTraits.cxx
@@ -98,9 +98,7 @@ SIXSTraits::ComputeAtmosphericParameters(
     otb_6s_integer iinf =
       static_cast<otb_6s_integer>((wlinf - (float) .25) / SIXSStepOfWavelengthSpectralBandValues + (float) 1.5);
     otb_6s_integer      cpt = iinf - 1;
-    otb_6s_doublereal * s(ITK_NULLPTR);
-    s = new otb_6s_doublereal[S_6S_SIZE];
-    memset(s, 0, S_6S_SIZE * sizeof(otb_6s_doublereal));
+    otb_6s_doublereal s[S_6S_SIZE];
     const ValuesVectorType& FilterFunctionValues6S = WavelengthSpectralBand->GetFilterFunctionValues6S();
     // Set the values of FilterFunctionValues6S in s between [iinf-1; isup]
     for (unsigned int i = 0; i < FilterFunctionValues6S.size() && cpt < S_6S_SIZE; ++i)
@@ -127,8 +125,6 @@ SIXSTraits::ComputeAtmosphericParameters(
                                     &tdif_up_ray,
                                     &tdif_up_aer);
     otbMsgDevMacro(<< "Done call 6S main function!");
-    delete[] s;
-    s = ITK_NULLPTR;
     }
   catch (std::bad_alloc& err)
     {
@@ -178,7 +174,7 @@ SIXSTraits::ComputeWavelengthSpectralBandValuesFor6S(
       " < (" << L_max << "+" << epsilon << ") is not respected !" << "val1 " << L_min + static_cast<double>(FilterFunctionValues.size() - 1) * L_userStep << " val2 " << L_max - epsilon);
     }
 
-  // Generate WavelengthSpectralBand if the step is not the offical 6S step value
+  // Generate WavelengthSpectralBand if the step is not the official 6S step value
   if (vcl_abs(L_userStep - SIXSStepOfWavelengthSpectralBandValues) > epsilon)
     {
     ValuesVectorType values(1, FilterFunctionValues[0]); //vector size 1 with the value vect[0]
diff --git a/Modules/Radiometry/OpticalCalibration/test/CMakeLists.txt b/Modules/Radiometry/OpticalCalibration/test/CMakeLists.txt
index 9b8d1e4..ed2ab9c 100644
--- a/Modules/Radiometry/OpticalCalibration/test/CMakeLists.txt
+++ b/Modules/Radiometry/OpticalCalibration/test/CMakeLists.txt
@@ -42,9 +42,9 @@ otbImageToLuminanceImageFilter.cxx
 add_executable(otbOpticalCalibrationTestDriver ${OTBOpticalCalibrationTests})
 target_link_libraries(otbOpticalCalibrationTestDriver ${OTBOpticalCalibration-Test_LIBRARIES})
 otb_module_target_label(otbOpticalCalibrationTestDriver)
+set_linker_stack_size_flag(otbOpticalCalibrationTestDriver 10000000)
 
 # Tests Declaration
-
 otb_add_test(NAME raTuSpectralSensitivityReaderNew COMMAND otbOpticalCalibrationTestDriver
   otbSpectralSensitivityReaderNew
   )
@@ -82,12 +82,12 @@ otb_add_test(NAME raTvSpectralSensitivityReaderTest COMMAND otbOpticalCalibratio
   ${TEMP}/rcTuSpectralSensitivityReaderTest.txt
   )
 
-otb_add_test(NAME raTvReflectanceToImageImageFilterDayMounth COMMAND otbOpticalCalibrationTestDriver
+otb_add_test(NAME raTvReflectanceToImageImageFilterDayMonth COMMAND otbOpticalCalibrationTestDriver
   --compare-image ${EPSILON_12}  ${INPUTDATA}/verySmallFSATSW.tif
-  ${TEMP}/raTvReflectanceToImageImageFilterDayMounth.tif
+  ${TEMP}/raTvReflectanceToImageImageFilterDayMonth.tif
   otbReflectanceToImageImageFilter
   ${BASELINE}/raTvImageToReflectanceImageFilter.tif
-  ${TEMP}/raTvReflectanceToImageImageFilterDayMounth.tif
+  ${TEMP}/raTvReflectanceToImageImageFilterDayMonth.tif
   0.2 #radius
   1   #channel 1 alpha
   2   #channel 2 alpha
@@ -102,7 +102,7 @@ otb_add_test(NAME raTvReflectanceToImageImageFilterDayMounth COMMAND otbOpticalC
   30  #channel 3 illumination
   40  #channel 4 illumination
   3   #day
-  5   #mounth
+  5   #month
   )
 
 otb_add_test(NAME raTvReflectanceToImageImageFilter COMMAND otbOpticalCalibrationTestDriver
@@ -235,10 +235,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${TOULOUSEQBDIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${TOULOUSEQBDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoQuickbirdPAN.tif ${TOULOUSEQBDIR}/02APR01105228-P1BS-000000128955_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${TOULOUSEQBDIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoQuickbirdPAN.tif ${TOULOUSEQBDIR}/02APR01105228-P1BS-000000128955_01_P001.TIF)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoQuickbirdPAN COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${TOULOUSEQBDIR}/raTvSMALLTOULOUSELuminanceToImageImageFilterAutoQuickbirdPAN.tif
@@ -255,10 +253,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${TOULOUSEQBDIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/QUICKBIRD/TOULOUSE/000000128955_01_P001_MUL)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${TOULOUSEQBDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoQuickbirdXS.tif ${TOULOUSEQBDIR}/02APR01105228-M1BS-000000128955_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${TOULOUSEQBDIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoQuickbirdXS.tif ${TOULOUSEQBDIR}/02APR01105228-M1BS-000000128955_01_P001.TIF)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoQuickbirdXS COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${TOULOUSEQBDIR}/raTvSMALLTOULOUSELuminanceToImageImageFilterAutoQuickbirdXS.tif
@@ -274,10 +270,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${ROMEWV2DIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_MUL)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${ROMEWV2DIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoWV2Multi.tif ${ROMEWV2DIR}/09DEC10103019-M2AS-052298844010_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${ROMEWV2DIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoWV2Multi.tif ${ROMEWV2DIR}/09DEC10103019-M2AS-052298844010_01_P001.TIF)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoWV2MULTI COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${ROMEWV2DIR}/raTvSMALLROMELuminanceToImageImageFilterAutoWV2Multi.tif
@@ -292,10 +286,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   set(BLOSSEVILLEIKONOSDIR ${TEMP}/OpticalCalibLumToImIkonos)
   file(MAKE_DIRECTORY ${BLOSSEVILLEIKONOSDIR})
   file(GLOB MTDATA ${OTB_DATA_LARGEINPUT_ROOT}/IKONOS/BLOSSEVILLE/*metadata.txt ${OTB_DATA_LARGEINPUT_ROOT}/IKONOS/BLOSSEVILLE/*pan*)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${BLOSSEVILLEIKONOSDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoIkonos.tif ${BLOSSEVILLEIKONOSDIR}/po_2619900_pan_0000000.tif COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${BLOSSEVILLEIKONOSDIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoIkonos.tif ${BLOSSEVILLEIKONOSDIR}/po_2619900_pan_0000000.tif)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoIkonos COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BLOSSEVILLEIKONOSDIR}/raTvSMALLBLOSSEVILLELuminanceToImageImageFilterAutoIkonos.tif
@@ -310,10 +302,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   set(TEHERANSPOT5DIR ${TEMP}/OpticalCalibLumToImSPOT5)
   file(MAKE_DIRECTORY ${TEHERANSPOT5DIR})
   file(GLOB MTDATA ${OTB_DATA_LARGEINPUT_ROOT}/SPOT5/TEHERAN/*.DIM)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${TEHERANSPOT5DIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoSpot5.tif ${TEHERANSPOT5DIR}/IMAGERY.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${TEHERANSPOT5DIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoSpot5.tif ${TEHERANSPOT5DIR}/IMAGERY.TIF)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoSpot5 COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${TEHERANSPOT5DIR}/raTvSMALLTEHERANLuminanceToImageImageFilterAutoSpot5.img
@@ -329,10 +319,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${ROMEWV2DIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${ROMEWV2DIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoWV2PAN.tif ${ROMEWV2DIR}/09DEC10103019-P2AS-052298844010_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${ROMEWV2DIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoWV2PAN.tif ${ROMEWV2DIR}/09DEC10103019-P2AS-052298844010_01_P001.TIF)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoWV2PAN COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${ROMEWV2DIR}/raTvSMALLROMELuminanceToImageImageFilterAutoWV2PAN.tif
@@ -348,10 +336,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${SUDOUESTFORMOSATDIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/FORMOSAT/Sudouest_20071013_MS_fmsat)
   file(GLOB MTDATA ${MTDATADIR}/*.DIM)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${SUDOUESTFORMOSATDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvImageToLuminanceImageFilterAutoFormosat.tif ${SUDOUESTFORMOSATDIR}/IMAGERY.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${SUDOUESTFORMOSATDIR})
+  otb_copy_rename(${BASELINE}/raTvImageToLuminanceImageFilterAutoFormosat.tif ${SUDOUESTFORMOSATDIR}/IMAGERY.TIF)
 
   otb_add_test(NAME raTvLuminanceToImageImageFilterAutoFORMOSAT COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${SUDOUESTFORMOSATDIR}/raTvSMALLSOLuminanceToImageImageFilterAutoFormosat.img
@@ -367,10 +353,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${TOULOUSEQBDIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${TOULOUSEQBDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoQuickbirdPAN.tif ${TOULOUSEQBDIR}/02APR01105228-P1BS-000000128955_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${TOULOUSEQBDIR})
+  otb_copy_rename(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoQuickbirdPAN.tif ${TOULOUSEQBDIR}/02APR01105228-P1BS-000000128955_01_P001.TIF)
 
   otb_add_test(NAME raTvReflectanceToLuminanceImageFilterAutoQuickbirdPAN COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToLuminanceImageFilterAutoQuickbirdPAN.tif
@@ -384,10 +368,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${ROMEWV2DIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_PAN)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${ROMEWV2DIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoWV2PAN.tif ${ROMEWV2DIR}/09DEC10103019-P2AS-052298844010_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${ROMEWV2DIR})
+  otb_copy_rename(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoWV2PAN.tif ${ROMEWV2DIR}/09DEC10103019-P2AS-052298844010_01_P001.TIF)
 
   otb_add_test(NAME raTvReflectanceToLuminanceImageFilterAutoWV2PAN COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToLuminanceImageFilterAutoWV2PAN.tif
@@ -400,10 +382,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   set(TEHERANSPOT5DIR ${TEMP}/OpticalCalibRefToLumSPOT5)
   file(MAKE_DIRECTORY ${TEHERANSPOT5DIR})
   file(GLOB MTDATA ${OTB_DATA_LARGEINPUT_ROOT}/SPOT5/TEHERAN/*.DIM)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${TEHERANSPOT5DIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoSpot5.tif ${TEHERANSPOT5DIR}/IMAGERY.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${TEHERANSPOT5DIR})
+  otb_copy_rename(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoSpot5.tif ${TEHERANSPOT5DIR}/IMAGERY.TIF)
 
   otb_add_test(NAME raTvReflectanceToLuminanceImageFilterAutoSpot5 COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToLuminanceImageFilterAutoSpot5.tif
@@ -416,10 +396,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   set(BLOSSEVILLEIKONOSDIR ${TEMP}/OpticalCalibRefToLumIkonos)
   file(MAKE_DIRECTORY ${BLOSSEVILLEIKONOSDIR})
   file(GLOB MTDATA ${OTB_DATA_LARGEINPUT_ROOT}/IKONOS/BLOSSEVILLE/*metadata.txt ${OTB_DATA_LARGEINPUT_ROOT}/IKONOS/BLOSSEVILLE/*pan*)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${BLOSSEVILLEIKONOSDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoIkonos.tif ${BLOSSEVILLEIKONOSDIR}/po_2619900_pan_0000000.tif COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${BLOSSEVILLEIKONOSDIR})
+  otb_copy_rename(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoIkonos.tif ${BLOSSEVILLEIKONOSDIR}/po_2619900_pan_0000000.tif)
 
   otb_add_test(NAME raTvReflectanceToLuminanceImageFilterAutoIkonos COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToLuminanceImageFilterAutoIkonos.tif
@@ -433,10 +411,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${TOULOUSEQBDIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/QUICKBIRD/TOULOUSE/000000128955_01_P001_MUL)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${TOULOUSEQBDIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoQuickbirdXS.tif ${TOULOUSEQBDIR}/02APR01105228-M1BS-000000128955_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${TOULOUSEQBDIR})
+  otb_copy_rename(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoQuickbirdXS.tif ${TOULOUSEQBDIR}/02APR01105228-M1BS-000000128955_01_P001.TIF)
 
   otb_add_test(NAME raTvReflectanceToLuminanceImageFilterAutoQuickbirdXS COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToLuminanceImageFilterAutoQuickbirdXS.tif
@@ -450,10 +426,8 @@ if(OTB_DATA_USE_LARGEINPUT)
   file(MAKE_DIRECTORY ${ROMEWV2DIR})
   set(MTDATADIR ${OTB_DATA_LARGEINPUT_ROOT}/WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_MUL)
   file(GLOB MTDATA ${MTDATADIR}/*TIL ${MTDATADIR}/*RPB ${MTDATADIR}/*XML ${MTDATADIR}/*IMD)
-  foreach(f ${MTDATA})
-    configure_file(${f} ${ROMEWV2DIR} COPYONLY)
-  endforeach(f)
-  configure_file(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoWV2Multi.tif ${ROMEWV2DIR}/09DEC10103019-M2AS-052298844010_01_P001.TIF COPYONLY)
+  file(COPY ${MTDATA} DESTINATION ${ROMEWV2DIR})
+  otb_copy_rename(${BASELINE}/raTvLuminanceToReflectanceImageFilterAutoWV2Multi.tif ${ROMEWV2DIR}/09DEC10103019-M2AS-052298844010_01_P001.TIF)
 
   otb_add_test(NAME raTvReflectanceToLuminanceImageFilterAutoWV2MULTI COMMAND otbOpticalCalibrationTestDriver
     --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToLuminanceImageFilterAutoWV2Multi.tif
@@ -559,12 +533,12 @@ otb_add_test(NAME raTuAtmosphericRadiativeTermsSingleChannelNew COMMAND otbOptic
   otbAtmosphericRadiativeTermsSingleChannelNew
   )
 
-otb_add_test(NAME raTvImageToReflectanceImageFilterDayMounth COMMAND otbOpticalCalibrationTestDriver
+otb_add_test(NAME raTvImageToReflectanceImageFilterDayMonth COMMAND otbOpticalCalibrationTestDriver
   --compare-image ${EPSILON_12}  ${BASELINE}/raTvImageToReflectanceImageFilter.tif
-  ${TEMP}/raTvImageToReflectanceImageFilterDayMounth.tif
+  ${TEMP}/raTvImageToReflectanceImageFilterDayMonth.tif
   otbImageToReflectanceImageFilter
   ${INPUTDATA}/verySmallFSATSW.tif
-  ${TEMP}/raTvImageToReflectanceImageFilterDayMounth.tif
+  ${TEMP}/raTvImageToReflectanceImageFilterDayMonth.tif
   0.2 #radius
   1   #channel 1 alpha
   2   #channel 2 alpha
@@ -579,7 +553,7 @@ otb_add_test(NAME raTvImageToReflectanceImageFilterDayMounth COMMAND otbOpticalC
   30  #channel 3 illumination
   40  #channel 4 illumination
   3   #day
-  5   #mounth
+  5   #month
   )
 
 otb_add_test(NAME raTvImageToReflectanceImageFilter COMMAND otbOpticalCalibrationTestDriver
@@ -629,17 +603,17 @@ otb_add_test(NAME raTvRomaniaImageToReflectance COMMAND otbOpticalCalibrationTes
 
 otb_add_test(NAME raTvLuminanceToReflectanceImageFilterDayMonth COMMAND otbOpticalCalibrationTestDriver
   --compare-image ${EPSILON_12}  ${BASELINE}/raTvLuminanceToReflectanceImageFilter.tif
-  ${TEMP}/raTvLuminanceToReflectanceImageFilterDayMounth.tif
+  ${TEMP}/raTvLuminanceToReflectanceImageFilterDayMonth.tif
   otbLuminanceToReflectanceImageFilter
   ${INPUTDATA}/verySmallFSATSW.tif
-  ${TEMP}/raTvLuminanceToReflectanceImageFilterDayMounth.tif
+  ${TEMP}/raTvLuminanceToReflectanceImageFilterDayMonth.tif
   0.2 #radius
   10  #channel 1 illumination
   20  #channel 2 illumination
   30  #channel 3 illumination
   40  #channel 4 illumination
   3   #day
-  5   #mounth
+  5   #month
   )
 
 otb_add_test(NAME raTvLuminanceToReflectanceImageFilter COMMAND otbOpticalCalibrationTestDriver
@@ -898,17 +872,17 @@ otb_add_test(NAME raTvReflectanceToLuminanceImageFilter COMMAND otbOpticalCalibr
 
 otb_add_test(NAME raTvReflectanceToLuminanceImageFilterDayMonth COMMAND otbOpticalCalibrationTestDriver
   --compare-image ${EPSILON_12}  ${INPUTDATA}/verySmallFSATSW.tif
-  ${TEMP}/raTvverySmallFSATSWImageFilterDayMounth.tif
+  ${TEMP}/raTvverySmallFSATSWImageFilterDayMonth.tif
   otbReflectanceToLuminanceImageFilter
   ${BASELINE}/raTvLuminanceToReflectanceImageFilter.tif
-  ${TEMP}/raTvverySmallFSATSWImageFilterDayMounth.tif
+  ${TEMP}/raTvverySmallFSATSWImageFilterDayMonth.tif
   0.2 #radius
   10  #channel 1 illumination
   20  #channel 2 illumination
   30  #channel 3 illumination
   40  #channel 4 illumination
   3   #day
-  5   #mounth
+  5   #month
   )
 
 otb_add_test(NAME raTvImageToLuminanceImageFilter COMMAND otbOpticalCalibrationTestDriver
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarBrightnessFunction.txx b/Modules/Radiometry/SARCalibration/include/otbSarBrightnessFunction.txx
index 531bc38..8bce4e2 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarBrightnessFunction.txx
+++ b/Modules/Radiometry/SARCalibration/include/otbSarBrightnessFunction.txx
@@ -70,6 +70,26 @@ SarBrightnessFunction<TInputImage, TCoordRep>
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   this->Superclass::PrintSelf(os, indent);
+  if (m_Noise)
+    {
+    os << indent << "Noise:\n";
+    m_Noise->Print(os, indent.GetNextIndent());
+    }
+  if (m_AntennaPatternNewGain)
+    {
+    os << indent << "AntennaPatternNewGain:\n";
+    m_AntennaPatternNewGain->Print(os, indent.GetNextIndent());
+    }
+  if (m_AntennaPatternOldGain)
+    {
+    os << indent << "AntennaPatternOldGain:\n";
+    m_AntennaPatternOldGain->Print(os, indent.GetNextIndent());
+    }
+  if (m_RangeSpreadLoss)
+    {
+    os << indent << "RangeSpreadLoss:\n";
+    m_RangeSpreadLoss->Print(os, indent.GetNextIndent());
+    }
 }
 
 /**
@@ -118,7 +138,9 @@ SarBrightnessFunction<TInputImage, TCoordRep>
   functor.SetAntennaPatternOldGain(antennaPatternOldGain);
   functor.SetRangeSpreadLoss(rangeSpreadLoss);
 
-  const RealType value = static_cast<RealType>(vcl_abs(this->GetInputImage()->GetPixel(index)));
+	const std::complex<float> pVal = this->GetInputImage()->GetPixel(index);
+	const RealType value = std::sqrt((pVal.real() * pVal.real()) + (pVal.imag()* pVal.imag()));
+
   result = functor(value);
 
   return static_cast<OutputType>(result);
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.h b/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.h
index 25c85da..c25c699 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.h
+++ b/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.h
@@ -87,6 +87,8 @@ protected:
 
   /** Update the function list and input parameters*/
   void BeforeThreadedGenerateData() ITK_OVERRIDE;
+
+  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 private:
   SarBrightnessToImageFilter(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.txx b/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.txx
index 2184f44..1c6b939 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.txx
+++ b/Modules/Radiometry/SARCalibration/include/otbSarBrightnessToImageFilter.txx
@@ -52,30 +52,43 @@ SarBrightnessToImageFilter<TInputImage, TOutputImage>
 
   function->SetScale(imageMetadataInterface->GetRadiometricCalibrationScale());
 
-  ParametricFunctionPointer   noise;
-  ParametricFunctionPointer   antennaPatternNewGain;
-  ParametricFunctionPointer   antennaPatternOldGain;
-  ParametricFunctionPointer   rangeSpreadLoss;
-
-  noise = function->GetNoise();
+  ParametricFunctionPointer   noise = function->GetNoise();
   noise->SetPointSet(imageMetadataInterface->GetRadiometricCalibrationNoise());
   noise->SetPolynomalSize(imageMetadataInterface->GetRadiometricCalibrationNoisePolynomialDegree());
   noise->EvaluateParametricCoefficient();
 
-  antennaPatternNewGain = function->GetAntennaPatternNewGain();
+  ParametricFunctionPointer   antennaPatternNewGain = function->GetAntennaPatternNewGain();
   antennaPatternNewGain->SetPointSet(imageMetadataInterface->GetRadiometricCalibrationAntennaPatternNewGain());
   antennaPatternNewGain->SetPolynomalSize(imageMetadataInterface->GetRadiometricCalibrationAntennaPatternNewGainPolynomialDegree());
   antennaPatternNewGain->EvaluateParametricCoefficient();
 
-  antennaPatternOldGain = function->GetAntennaPatternOldGain();
+  ParametricFunctionPointer   antennaPatternOldGain = function->GetAntennaPatternOldGain();
   antennaPatternOldGain->SetPointSet(imageMetadataInterface->GetRadiometricCalibrationAntennaPatternOldGain());
   antennaPatternOldGain->SetPolynomalSize(imageMetadataInterface->GetRadiometricCalibrationAntennaPatternOldGainPolynomialDegree());
   antennaPatternOldGain->EvaluateParametricCoefficient();
 
-  rangeSpreadLoss = function->GetRangeSpreadLoss();
+  ParametricFunctionPointer   rangeSpreadLoss = function->GetRangeSpreadLoss();
   rangeSpreadLoss->SetPointSet(imageMetadataInterface->GetRadiometricCalibrationRangeSpreadLoss());
   rangeSpreadLoss->SetPolynomalSize(imageMetadataInterface->GetRadiometricCalibrationRangeSpreadLossPolynomialDegree());
   rangeSpreadLoss->EvaluateParametricCoefficient();
+
+#if 0
+  this->Print(std::cout, id);
+#endif
+}
+
+template<class TInputImage, class TOutputImage>
+void
+SarBrightnessToImageFilter<TInputImage, TOutputImage>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+
+  if (this->GetFunction())
+    {
+    os << indent << "Function:\n";
+    this->GetFunction()->Print(os, indent.GetNextIndent());
+    }
 }
 
 
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarParametricMapFunction.h b/Modules/Radiometry/SARCalibration/include/otbSarParametricMapFunction.h
index 526bcc5..bda7869 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarParametricMapFunction.h
+++ b/Modules/Radiometry/SARCalibration/include/otbSarParametricMapFunction.h
@@ -116,7 +116,7 @@ public:
   /** Get/Set the PolynomalSize pointer*/
   void SetPolynomalSize(const IndexType PolynomalSize);
 
-  /** Evaluate parametric coefficent from pointset */
+  /** Evaluate parametric coefficient from pointset */
   void EvaluateParametricCoefficient();
 
   /** Set constante value for evaluation*/
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.h b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.h
index 704d90b..ef007d0 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.h
+++ b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.h
@@ -174,7 +174,7 @@ protected:
   /** print method */
   void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
 
-  /** Flags to indiciate if these values needs to be applied in calibration*/
+  /** Flags to indicate if these values needs to be applied in calibration*/
 
 private:
   SarRadiometricCalibrationFunction(const Self &);  //purposely not implemented
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.txx b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.txx
index 2dc5a26..365f726 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.txx
+++ b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationFunction.txx
@@ -40,14 +40,14 @@ SarRadiometricCalibrationFunction<TInputImage, TCoordRep>
 , m_ApplyRescalingFactor(false)
 
 {
-  /* intialize parametric functions */
+  /* initialize parametric functions */
   m_Noise = ParametricFunctionType::New();
   m_AntennaPatternNewGain = ParametricFunctionType::New();
   m_AntennaPatternOldGain = ParametricFunctionType::New();
   m_IncidenceAngle = ParametricFunctionType::New();
   m_RangeSpreadLoss = ParametricFunctionType::New();
 
-  /* intialize default values in paramerticFunction instances  */
+  /* initialize default values in paramerticFunction instances  */
   m_Noise->SetConstantValue(0.0);
   m_AntennaPatternNewGain->SetConstantValue(1.0);
   m_AntennaPatternOldGain->SetConstantValue(1.0);
@@ -117,10 +117,12 @@ SarRadiometricCalibrationFunction<TInputImage, TCoordRep>
     * non-complex pixel types, vcl_abs() simply returns absolute value.
     */
 
-  RealType digitalNumber = static_cast<RealType>(vcl_abs(this->GetInputImage()->GetPixel(index)));
+	const std::complex<float> pVal = this->GetInputImage()->GetPixel(index);
+	const RealType digitalNumber = std::sqrt((pVal.real() * pVal.real()) + (pVal.imag()* pVal.imag()));
+
   RealType sigma = m_Scale * digitalNumber * digitalNumber;
 
-  /** substract noise if enabled. */
+  /** subtract noise if enabled. */
   if (m_EnableNoise)
     {
     sigma  -= static_cast<RealType>(m_Noise->Evaluate(point));
@@ -159,7 +161,6 @@ SarRadiometricCalibrationFunction<TInputImage, TCoordRep>
     sigma /= m_RescalingFactor;
     }
 
-
   if(sigma < 0.0)
     {
     sigma = 0.0;
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.h b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.h
index 34486aa..bda7518 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.h
+++ b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.h
@@ -34,7 +34,7 @@ namespace otb
  * are thus detected  automatically from this. The filter then reads necessary
  * parameters required to perform SarCalibration in a generic way.
  *
- * BeforeThreadedGenerateData() instanciate a SarRadiometricCalibrationFunction
+ * BeforeThreadedGenerateData() instantiate a SarRadiometricCalibrationFunction
  * and pass the values taken from SarImageMetadataInterface instance to it. This
  * is where the actual computation of sigma (backscatter) occurs.
  *
@@ -48,7 +48,7 @@ namespace otb
  *
  * \see \c otb::SarParametricFunction
  * \see \c otb::SarCalibrationLookupBase
- * References (Retreived on 08-Sept-2015)
+ * References (Retrieved on 08-Sept-2015)
  * Sentinel1 - https://sentinel.esa.int/web/sentinel/sentinel-1-sar-wiki/-/wiki/Sentinel%20One/Application+of+Radiometric+Calibration+LUT
  * Radarsat2 - http://gs.mdacorporation.com/products/sensor/radarsat2/RS2_Product_Description.pdf
  *
diff --git a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.txx b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.txx
index 50b4ad8..992e8a1 100644
--- a/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.txx
+++ b/Modules/Radiometry/SARCalibration/include/otbSarRadiometricCalibrationToImageFilter.txx
@@ -91,9 +91,9 @@ SarRadiometricCalibrationToImageFilter<TInputImage, TOutputImage>
   /* Below lines will toggle the necessary flags which can help skip some
    * computation. For example, if there is lookup value and ofcourse antenna
    * pattern gain is not required. Even if we try to compute the value with
-   * SarParametricFuntion we  get 1. This is the safe side. But as we are so sure
+   * SarParametricFunction we  get 1. This is the safe side. But as we are so sure
    * we skip all those calls to EvaluateParametricCoefficient and also the
-   * Evalute(). For the function the value is 1 by default.
+   * Evaluate(). For the function the value is 1 by default.
    */
   function->SetApplyAntennaPatternGain(!apply);
   function->SetApplyIncidenceAngleCorrection(!apply);
diff --git a/Modules/Radiometry/Simulation/include/otbAtmosphericEffects.txx b/Modules/Radiometry/Simulation/include/otbAtmosphericEffects.txx
index 6bd373b..ad2b61b 100644
--- a/Modules/Radiometry/Simulation/include/otbAtmosphericEffects.txx
+++ b/Modules/Radiometry/Simulation/include/otbAtmosphericEffects.txx
@@ -84,7 +84,7 @@ AtmosphericEffects<TSpectralResponse , TRSR>
     functionValues->SetMinSpectralValue(inter.first);
     functionValues->SetMaxSpectralValue(inter.second - step);
 
-  //TODO Is it the effecient method Problem in 6STraits
+  //TODO Is it the efficient method Problem in 6STraits
     functionValues->SetUserStep( step );
 
     m_DataAtmosphericCorrectionParameters->SetWavelengthSpectralBandWithIndex(i, functionValues);
diff --git a/Modules/Radiometry/Simulation/include/otbImageSimulationMethod.txx b/Modules/Radiometry/Simulation/include/otbImageSimulationMethod.txx
index 5af2708..bbffbfe 100644
--- a/Modules/Radiometry/Simulation/include/otbImageSimulationMethod.txx
+++ b/Modules/Radiometry/Simulation/include/otbImageSimulationMethod.txx
@@ -27,7 +27,7 @@ template <class TInputVectorData, class TSpatialisation, class TSimulationStep1,
 ImageSimulationMethod< TInputVectorData, TSpatialisation, TSimulationStep1, TSimulationStep2, TFTM, TOutputImage>
 ::ImageSimulationMethod()
 {
-  //instanciation
+  //instantiation
   m_Spatialisation = SpatialisationType::New();
   m_LabelMapToSimulatedImageFilter = LabelMapToSimulatedImageFilterType::New();
   m_LabelMapToLabelImageFilter = LabelMapToLabelImageFilterType::New();
diff --git a/Modules/Radiometry/Simulation/include/otbLeafParameters.h b/Modules/Radiometry/Simulation/include/otbLeafParameters.h
index 51fb59d..b6c2e5f 100644
--- a/Modules/Radiometry/Simulation/include/otbLeafParameters.h
+++ b/Modules/Radiometry/Simulation/include/otbLeafParameters.h
@@ -22,7 +22,7 @@
 #include "itkDataObject.h"
 #include "itkMacro.h"
 #include "itkObjectFactory.h"
-
+#include "OTBSimulationExport.h"
 
 namespace otb
 {
@@ -34,7 +34,7 @@ namespace otb
  * \ingroup OTBSimulation
  */
 
-class ITK_EXPORT LeafParameters : public itk::DataObject
+class OTBSimulation_EXPORT LeafParameters : public itk::DataObject
 {
    public:
       /** Standard class typedefs */
diff --git a/Modules/Radiometry/Simulation/include/otbProspectModel.h b/Modules/Radiometry/Simulation/include/otbProspectModel.h
index 6816577..357bbb1 100644
--- a/Modules/Radiometry/Simulation/include/otbProspectModel.h
+++ b/Modules/Radiometry/Simulation/include/otbProspectModel.h
@@ -18,7 +18,7 @@
 #ifndef otbProspectModel_h
 #define otbProspectModel_h
 
-
+#include "OTBSimulationExport.h"
 #include "otbLeafParameters.h"
 
 #include "otbDataSpecP5B.h"
@@ -37,7 +37,7 @@ namespace otb
  * \ingroup OTBSimulation
  */
 
-class ITK_EXPORT ProspectModel : public SimulationStep1Base
+class OTBSimulation_EXPORT ProspectModel : public SimulationStep1Base
 {
    public:
       /** Standard class typedefs */
diff --git a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponse.txx b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponse.txx
index 3105b75..efb9d5a 100644
--- a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponse.txx
+++ b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponse.txx
@@ -165,9 +165,9 @@ ReduceSpectralResponse<TSpectralResponse , TRSR>
    m_InputSpectralResponse->Load(spectralResponseFile, coefNormSpectre);
 
    m_InputSatRSR=InputRSRType::New();
-   /** Set the satelite number of bands */
+   /** Set the satellite number of bands */
    m_InputSatRSR->SetNbBands(nbRSRBands);
-   /** Load the satelite response file*/
+   /** Load the satellite response file*/
    m_InputSatRSR->Load(RSRFile, coefNormRSR);
 }
 
diff --git a/Modules/Radiometry/Simulation/include/otbSailModel.h b/Modules/Radiometry/Simulation/include/otbSailModel.h
index 5aec526..2c32d0f 100644
--- a/Modules/Radiometry/Simulation/include/otbSailModel.h
+++ b/Modules/Radiometry/Simulation/include/otbSailModel.h
@@ -18,7 +18,7 @@
 #ifndef otbSailModel_h
 #define otbSailModel_h
 
-
+#include "OTBSimulationExport.h"
 #include "otbSpectralResponse.h"
 #include "otbDataSpecP5B.h"
 #include "otbSimulationStep2Base.h"
@@ -37,7 +37,7 @@ namespace otb
  */
 
 
-class ITK_EXPORT SailModel : public SimulationStep2Base
+class OTBSimulation_EXPORT SailModel : public SimulationStep2Base
 {
    public:
       /** Standard class typedefs */
diff --git a/Modules/Radiometry/Simulation/otb-module.cmake b/Modules/Radiometry/Simulation/otb-module.cmake
index 0c5d1cc..11f8d40 100644
--- a/Modules/Radiometry/Simulation/otb-module.cmake
+++ b/Modules/Radiometry/Simulation/otb-module.cmake
@@ -5,6 +5,7 @@ PROSPECT (leaf optical properties) and SAIL (canopy bidirectional reflectance)
 models, as well as PROSAIL, which is the combination of the two previous ones.")
 
 otb_module(OTBSimulation
+ENABLE_SHARED
   DEPENDS
     OTBStatistics
     OTBITK
diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx
index 1ee3e7f..0c4f3b0 100644
--- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx
+++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx
@@ -49,13 +49,13 @@ int otbReduceSpectralResponse(int argc, char * argv[])
   /** Load the spectral response file*/
   mySpectralResponse->Load(spectreFile, 100.0);
   SatRSRPointerType myRSR = SatRSRType::New();
-  /** Set the satelite number of bands */
+  /** Set the satellite number of bands */
   myRSR->SetNbBands(nbBand);
-  /** Load the satelite response file*/
+  /** Load the satellite response file*/
   myRSR->Load(RSRfile);
   //Instantiation
   ReduceResponseTypePointerType myReduceResponse = ReduceResponseType::New();
-  /** Load the satelite response in the simulator */
+  /** Load the satellite response in the simulator */
   myReduceResponse->SetInputSatRSR(myRSR);
   /** Load the spectral response of the object in the simulator*/
   myReduceResponse->SetInputSpectralResponse(mySpectralResponse);
diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx
index a5677b1..9b35c7e 100644
--- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx
+++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx
@@ -26,7 +26,7 @@ int otbReduceSpectralResponseClassifierRAndNIR(int argc, char * argv[])
 {
   if ( argc!=6 )
   {
-    std::cout << argv[0] << std::endl << "\t" << "<Spectral_response_filename>"<< "\t" << "<RSR_filename>"<< "\t" << "<Nb total satelite band>" << "\t" << "<Red index>"<< "\t" << "<NIR index>"<< std::endl;
+    std::cout << argv[0] << std::endl << "\t" << "<Spectral_response_filename>"<< "\t" << "<RSR_filename>"<< "\t" << "<Nb total satellite band>" << "\t" << "<Red index>"<< "\t" << "<NIR index>"<< std::endl;
 
     //bin/otbReduceSpectralResponseFunctor ~/manuel/Datas_Geos/Simulateur_Spectres/usgs_datas/JHU/becknic/vegetation/txt/grass.txt  ~/manuel/Datas_Geos/Rsr/SPOT3/HRV1/rep6S.dat 3 1 > a.out
 //     bin/otbReduceSpectralResponseClassifierRAndNIR  ~/manuel/Datas_Geos/Simulateur_Spectres/usgs_datas/JHU/becknic/vegetation/txt/decidous.txt ~/manuel/Datas_Geos/Rsr/SPOT5/VEGETATION/rep6S.dat 4 1 2
@@ -56,7 +56,7 @@ int otbReduceSpectralResponseClassifierRAndNIR(int argc, char * argv[])
   ReduceResponseTypePointerType  myReduceResponse=ReduceResponseType::New();
   //Instantiation
   //ResponsePointerType  myResponse=ResponseType::New();
-  /** Load the spectral response of the object and the satelite response in the simulator */
+  /** Load the spectral response of the object and the satellite response in the simulator */
   myReduceResponse->LoadInputsFromFiles(spectreFile, RSRfile, nbBand, 100.0, 1.0);
 
   //Instantiation
diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx
index 5b7fd0e..a41201c 100644
--- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx
+++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx
@@ -73,9 +73,9 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
   float percentage = atof(argv[8]);
 
   SatRSRPointerType satRSR = SatRSRType::New();
-  /** Set the satelite number of bands */
+  /** Set the satellite number of bands */
   satRSR->SetNbBands(nbBand);
-  /** Load the satelite response file*/
+  /** Load the satellite response file*/
   satRSR->Load(fileSatG);
 
   //divide into training and testing files
@@ -146,7 +146,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
 
     //Compute Reduce Spectral Response
     ReduceResponseTypePointerType reduceResponse = ReduceResponseType::New();
-    /** Load the satelite response in the simulator */
+    /** Load the satellite response in the simulator */
     reduceResponse->SetInputSatRSR(satRSR);
     /** Load the spectral response of the object in the simulator*/
     reduceResponse->SetInputSpectralResponse(spectralResponse);
@@ -196,7 +196,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
 
     //Compute Reduce Spectral Response
     ReduceResponseTypePointerType reduceResponse = ReduceResponseType::New();
-    /** Load the satelite response in the simulator */
+    /** Load the satellite response in the simulator */
     reduceResponse->SetInputSatRSR(satRSR);
     /** Load the spectral response of the object in the simulator*/
     reduceResponse->SetInputSpectralResponse(spectralResponse);
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapEstimationMethod.h b/Modules/Registration/DisparityMap/include/otbDisparityMapEstimationMethod.h
index 3bbe520..31383f3 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityMapEstimationMethod.h
+++ b/Modules/Registration/DisparityMap/include/otbDisparityMapEstimationMethod.h
@@ -118,7 +118,7 @@ public:
   itkSetObjectMacro(Metric, MetricType);
   itkGetObjectMacro(Metric, MetricType);
 
-  /** Set/Get the Transfrom. */
+  /** Set/Get the Transform. */
   itkSetObjectMacro(Transform, TransformType);
   itkGetObjectMacro(Transform, TransformType);
 
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapMedianFilter.txx b/Modules/Registration/DisparityMap/include/otbDisparityMapMedianFilter.txx
index d924888..349c590 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityMapMedianFilter.txx
+++ b/Modules/Registration/DisparityMap/include/otbDisparityMapMedianFilter.txx
@@ -316,7 +316,7 @@ DisparityMapMedianFilter< TInputImage, TOutputImage, TMask>
     }
 
   //Remove incoherences between disparity and median//
-  // creation of the auxilliary image that store positions of incoherences between the median and the input disparity map
+  // creation of the auxiliary image that store positions of incoherences between the median and the input disparity map
   MaskImagePointerType image_aux = MaskImageType::New();
   image_aux->SetRegions(input->GetRequestedRegion());
   image_aux->Allocate();
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.h b/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.h
index 77adb6b..c864b8b 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.h
@@ -64,7 +64,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(DisparityMapTo3DFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TDisparityImage         DisparityMapType;
   typedef TOutputImage            OutputImageType;
   typedef TEpipolarGridImage      GridImageType;
@@ -146,7 +146,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Before threaded generate data */
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.txx b/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.txx
index 1278d5c..0ee310c 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.txx
+++ b/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.txx
@@ -226,7 +226,7 @@ DisparityMapTo3DFilter<TDisparityImage,TOutputImage,TEpipolarGridImage,TMaskImag
   // Check that the keywordlists are not empty
   if (m_LeftKeywordList.GetSize() == 0 || m_RightKeywordList.GetSize() == 0)
     {
-    itkExceptionMacro(<<"At least one of the image keywordlist is empty : can't instanciate corresponding projection");
+    itkExceptionMacro(<<"At least one of the image keywordlist is empty : can't instantiate corresponding projection");
     }
 }
 
@@ -236,15 +236,15 @@ void
 DisparityMapTo3DFilter<TDisparityImage,TOutputImage,TEpipolarGridImage,TMaskImage>
 ::BeforeThreadedGenerateData()
 {
-  // Instanciate transforms
+  // Instantiate transforms
   m_LeftToGroundTransform = RSTransformType::New();
   m_RightToGroundTransform = RSTransformType::New();
 
   m_LeftToGroundTransform->SetInputKeywordList(m_LeftKeywordList);
   m_RightToGroundTransform->SetInputKeywordList(m_RightKeywordList);
 
-  m_LeftToGroundTransform->InstanciateTransform();
-  m_RightToGroundTransform->InstanciateTransform();
+  m_LeftToGroundTransform->InstantiateTransform();
+  m_RightToGroundTransform->InstantiateTransform();
 }
 
 template <class TDisparityImage, class TOutputImage,
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.h b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.h
index 4a21701..19cab94 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.h
@@ -75,7 +75,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(DisparityMapToDEMFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TDisparityImage         DisparityMapType;
   typedef TInputImage             SensorImageType;
   typedef TOutputDEMImage         DEMImageType;
@@ -151,7 +151,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Before threaded generate data */
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.txx b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.txx
index 900addc..dcafe4b 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.txx
+++ b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.txx
@@ -255,11 +255,11 @@ DisparityMapToDEMFilter<TDisparityImage,TInputImage,TOutputDEMImage,TEpipolarGri
   typedef otb::GenericRSTransform<> RSTransform2DType;
   RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New();
   leftToGroundTransform->SetInputKeywordList(leftImgPtr->GetImageKeywordlist());
-  leftToGroundTransform->InstanciateTransform();
+  leftToGroundTransform->InstantiateTransform();
 
   RSTransform2DType::Pointer rightToGroundTransform = RSTransform2DType::New();
   rightToGroundTransform->SetInputKeywordList(rightImgPtr->GetImageKeywordlist());
-  rightToGroundTransform->InstanciateTransform();
+  rightToGroundTransform->InstantiateTransform();
 
   // left image
   typename SensorImageType::SizeType inputSize = leftImgPtr->GetLargestPossibleRegion().GetSize();
@@ -382,7 +382,7 @@ DisparityMapToDEMFilter<TDisparityImage,TInputImage,TOutputDEMImage,TEpipolarGri
 
   RSTransformType::Pointer groundToLeftTransform = RSTransformType::New();
   groundToLeftTransform->SetOutputKeywordList(leftSensor->GetImageKeywordlist());
-  groundToLeftTransform->InstanciateTransform();
+  groundToLeftTransform->InstantiateTransform();
 
   // For the disparity maps and mask
   // Iterate over OutputRequestedRegion corners for elevation min and max
@@ -638,8 +638,8 @@ DisparityMapToDEMFilter<TDisparityImage,TInputImage,TOutputDEMImage,TEpipolarGri
   m_LeftToGroundTransform->SetInputKeywordList(leftSensor->GetImageKeywordlist());
   m_RightToGroundTransform->SetInputKeywordList(rightSensor->GetImageKeywordlist());
 
-  m_LeftToGroundTransform->InstanciateTransform();
-  m_RightToGroundTransform->InstanciateTransform();
+  m_LeftToGroundTransform->InstantiateTransform();
+  m_RightToGroundTransform->InstantiateTransform();
 
   // ensure empty regions are not processed
   if (requestedRegion.GetSize(0) == 0 && requestedRegion.GetSize(1) == 0)
diff --git a/Modules/Registration/DisparityMap/include/otbDisparityTranslateFilter.h b/Modules/Registration/DisparityMap/include/otbDisparityTranslateFilter.h
index 74585ba..61333dc 100644
--- a/Modules/Registration/DisparityMap/include/otbDisparityTranslateFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbDisparityTranslateFilter.h
@@ -59,7 +59,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(DisparityTranslateFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TDisparityImage  DispMapType;
   typedef TGridImage       GridType;
   typedef TMaskImage       MaskType;
@@ -121,7 +121,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Threaded generate data */
diff --git a/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.h b/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.h
index e964838..8aa20aa 100644
--- a/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.h
@@ -39,8 +39,8 @@ namespace otb
  * deriving from the itk::ImageToImageMetric. The MinimizeOn()/MinimizeOff() flag allows searching for
  * minimum or maximum depending on the metric (default is On).
  *
- * Once a coarse (pixel wise) offset has been found, this match is further refined using dichotomic search
- * until sub-pixel accuracy given by the SetSubPixelAccuracy() is reached.
+ * Once a coarse (pixel wise) offset has been found, this match is further refined using golden section search search
+ * until convergence accuracy (given by the SetConvergenceAccuracy()) is reached, or when the max number of iteration () is reached.
  *
  * The filter proposes two outputs: GetOutput() return the image of the metric optimum at each location, and
  * the GetOutputDisplacementField() method returns the corresponding offset.
@@ -132,9 +132,17 @@ public:
   itkSetMacro(SearchRadius, SizeType);
   itkGetMacro(SearchRadius, SizeType);
 
+  /** Set/Get convergence accuracy */
+  itkSetMacro(ConvergenceAccuracy, double);
+  itkGetMacro(ConvergenceAccuracy, double);
+  
   /** Set/Get subpixel accuracy */
   itkSetMacro(SubPixelAccuracy, double);
   itkGetMacro(SubPixelAccuracy, double);
+  
+  /** Set/Get max number of iterations */
+  itkSetMacro(MaxIter, int);
+  itkGetMacro(MaxIter, int);
 
   /** True if metric should be minimized. False otherwise */
   itkSetMacro(Minimize, bool);
@@ -192,6 +200,13 @@ protected:
 private:
   FineRegistrationImageFilter(const Self&); //purposely not implemented
   void operator=(const Self&); //purposely not implemented
+  
+  inline double callMetric(double val1,double val2,double &oldRes,bool &flag);
+  inline void updateOptParams(double potBestVal,double parx,double pary,                             //inputs
+                              double &bestVal, typename TranslationType::ParametersType& optParams); //outputs
+  inline void updatePoints(double& gn, double& in1, double& in2, double &in3,      //inputs
+                           double& out1, double& out2, double& out3, double& out4); //outputs
+  inline void updateMinimize(double& a, double& b);
 
   /** The radius for correlation */
   SizeType                      m_Radius;
@@ -206,7 +221,11 @@ private:
   bool                          m_UseSpacing;
 
   /** Search step */
+  double                        m_ConvergenceAccuracy;
   double                        m_SubPixelAccuracy;
+  
+  /** Max number of iterations */
+  int                           m_MaxIter;
 
   /** The interpolator */
   InterpolatorPointerType       m_Interpolator;
diff --git a/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.txx b/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.txx
index 1eb1d44..41c1719 100644
--- a/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.txx
+++ b/Modules/Registration/DisparityMap/include/otbFineRegistrationImageFilter.txx
@@ -45,6 +45,10 @@ FineRegistrationImageFilter<TInputImage, T0utputCorrelation, TOutputDisplacement
 
   // Default sub-pixel precision
   m_SubPixelAccuracy = 0.1;
+  m_ConvergenceAccuracy = 0.01;
+  
+  // Max number of iterations
+  m_MaxIter = 100;
 
   // Flags
   m_UseSpacing = true;
@@ -282,6 +286,72 @@ FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacement
     }
   return;
  }
+ 
+template <class TInputImage, class TOutputCorrelation, class TOutputDisplacementField>
+double
+FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacementField>
+::callMetric(double val1,double val2,double &oldRes,bool &flag)
+{
+   typename TranslationType::ParametersType paramsgn(2);
+   paramsgn[0]=val1;
+   paramsgn[1]=val2;
+   
+   double res=oldRes;
+   flag=false;
+   
+   try
+   {
+      res=m_Metric->GetValue(paramsgn);
+   }
+   catch(itk::ExceptionObject& err)
+   {
+      flag=true;
+      itkWarningMacro(<< err.GetDescription());
+   }
+        
+   return res;
+} 
+
+template <class TInputImage, class TOutputCorrelation, class TOutputDisplacementField>
+void
+FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacementField>
+::updateOptParams(double potBestVal,double parx,double pary,double &bestVal, typename TranslationType::ParametersType& optParams)
+{
+    if (bestVal>potBestVal)
+    {
+        bestVal=potBestVal;
+        optParams[0]=parx;
+        optParams[1]=pary;
+    }
+}
+
+
+template <class TInputImage, class TOutputCorrelation, class TOutputDisplacementField>
+void
+FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacementField>
+::updatePoints(double& gn, double& in1, double& in2, double &in3,  
+               double& out1, double& out2, double& out3, double& out4)
+{
+    out1=out2;
+    out2=in3;
+    out3=in1+gn*(in2-in1);
+    out4=in2-gn*(in2-in1);
+    
+} 
+
+
+template <class TInputImage, class TOutputCorrelation, class TOutputDisplacementField>
+void
+FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacementField>
+::updateMinimize(double& a, double& b)
+{
+    if(!m_Minimize)
+    {
+        a = -a;
+        b = -b;
+    }
+}
+
 
 template <class TInputImage, class TOutputCorrelation, class TOutputDisplacementField>
 void
@@ -322,7 +392,7 @@ FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacement
   double currentMetric, optMetric;
 
   // Optimal translation parameters
-  typename TranslationType::ParametersType params(2), optParams(2), tmpOptParams(2);
+  typename TranslationType::ParametersType params(2), optParams(2);
 
   // Final displacement value
   DisplacementValueType displacementValue;
@@ -335,6 +405,7 @@ FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacement
   // Get fixed image spacing
   SpacingType fixedSpacing = fixedPtr->GetSpacing();
 
+
   // Walk the images
   while (!outputIt.IsAtEnd() && !outputDfIt.IsAtEnd() )
     {
@@ -367,6 +438,7 @@ FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacement
     m_Metric->SetFixedImageRegion(currentMetricRegion);
     m_Metric->Initialize();
 
+
     // Compute the local offset if required (and the transform was specified)
     if (m_Transform.IsNotNull())
       {
@@ -408,45 +480,90 @@ FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacement
         }
         }
       }
+  
+    
 
-    // Dichotomic sub-pixel
+    //golden section search
+    typename TranslationType::ParametersType paramsgn(2);
+    double gn=(sqrt(5.0)-1.0)/2.0;
     SpacingType subPixelSpacing = fixedSpacing;
-    while(subPixelSpacing[0] > m_SubPixelAccuracy || subPixelSpacing[1] > m_SubPixelAccuracy)
-      {
-      // Perform 1 step of dichotomic search
-      subPixelSpacing /= 2.;
-
-      // Store last opt params
-      tmpOptParams = optParams;
-
-      for(int i = -1; i <= 1; i+=2)
+    double ax=optParams[0]-static_cast<double>(subPixelSpacing[0]);
+    double ay=optParams[1]-static_cast<double>(subPixelSpacing[1]);
+    double bx=optParams[0]+static_cast<double>(subPixelSpacing[0]);
+    double by=optParams[1]+static_cast<double>(subPixelSpacing[1]);
+
+    
+    double cx=bx-gn*(bx-ax);
+    double cy=optParams[1];//by-gn*(by-ay);
+    double dx=ax+gn*(bx-ax);
+    double dy=optParams[1];//ay+gn*(by-ay);
+    double fc=0,fd=0;
+    bool exitWhile=false;
+    int nbIter=0;
+    double bestvalold=itk::NumericTraits<double>::max(),bestval=optMetric;
+    double diff=itk::NumericTraits<double>::max();
+    double diffx=itk::NumericTraits<double>::max();
+    double diffy=itk::NumericTraits<double>::max();
+    
+    //init
+    fc=callMetric(cx,cy,fc,exitWhile);
+    fd=callMetric(dx,dy,fd,exitWhile);
+    updateMinimize(fc,fd);
+
+    //loop
+    while (  (diffx > m_SubPixelAccuracy || diffy > m_SubPixelAccuracy) 
+             && (diff>m_ConvergenceAccuracy) 
+             && (!exitWhile) 
+             && (nbIter<=m_MaxIter)) 
+    {
+        nbIter++;
+    
+        // x direction
+        if (fc<fd)
         {
-        for(int j = -1; j <= 1; j+=2)
-          {
-          params = tmpOptParams;
-          params[0] += static_cast<double>(i*subPixelSpacing[0]);
-          params[1] += static_cast<double>(j*subPixelSpacing[1]);
-
-          try
-          {
-            // compute currentMetric
-            currentMetric = m_Metric->GetValue(params);
-
-            // Check for maximum
-            if((m_Minimize && (currentMetric < optMetric)) || (!m_Minimize && (currentMetric > optMetric)))
-              {
-              optMetric = currentMetric;
-              optParams = params;
-              }
-          }
-          catch(itk::ExceptionObject& err)
-          {
-            itkWarningMacro(<<err.GetDescription());
-
-          }
-          }
+            updateOptParams(fc,cx,cy,bestval,optParams);   
+            updatePoints(gn,ay,by,cx,bx,dx,dy,cy);
+            fc=callMetric(cx,cy,fc,exitWhile);
+            fd=callMetric(dx,dy,fd,exitWhile);
         }
-      }
+        else
+        {
+            updateOptParams(fd,dx,dy,bestval,optParams);
+            updatePoints(gn,by,ay,dx,ax,cx,cy,dy);
+            fc=callMetric(cx,cy,fc,exitWhile);
+            fd=callMetric(dx,dy,fd,exitWhile);
+        }
+        updateMinimize(fc,fd);
+        
+        // y direction
+        if (fc<fd)
+        {
+            updateOptParams(fc,cx,cy,bestval,optParams);
+            updatePoints(gn,ax,bx,cy,by,dy,dx,cx);
+            fc=callMetric(cx,cy,fc,exitWhile);
+            fd=callMetric(dx,dy,fd,exitWhile);
+        }
+        else
+        {
+            updateOptParams(fd,dx,dy,bestval,optParams);
+            updatePoints(gn,bx,ax,dy,ay,cy,cx,dx);
+            fc=callMetric(cx,cy,fc,exitWhile);
+            fd=callMetric(dx,dy,fd,exitWhile);
+        }
+        updateMinimize(fc,fd);
+        
+        // Before eventual exit, take benefit from the last evaluations of fd and fc
+        updateOptParams(fd,dx,dy,bestval,optParams);
+        updateOptParams(fc,cx,cy,bestval,optParams);
+        
+        if(!m_Minimize)
+            bestval=-bestval;
+            
+        diff= fabs(bestval-bestvalold);
+        bestvalold=bestval;
+        diffx=fabs(bx-ax);
+        diffy=fabs(by-ay);
+	}
 
     // Store the offset and the correlation value
     outputIt.Set(optMetric);
@@ -461,6 +578,8 @@ FineRegistrationImageFilter<TInputImage, TOutputCorrelation, TOutputDisplacement
       displacementValue[1] = optParams[1]/fixedSpacing[1];
       }
     outputDfIt.Set(displacementValue);
+    
+    
     // Update iterators
     ++outputIt;
     ++outputDfIt;
diff --git a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h
index 4dd2e19..40698b7 100644
--- a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h
@@ -71,7 +71,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(MultiDisparityMapTo3DFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TDisparityImage         DisparityMapType;
   typedef TOutputImage            OutputImageType;
   typedef TMaskImage              MaskImageType;
@@ -159,7 +159,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Before threaded generate data */
diff --git a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.txx b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.txx
index b41b604..bf3608c 100644
--- a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.txx
+++ b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.txx
@@ -323,17 +323,17 @@ void
 MultiDisparityMapTo3DFilter<TDisparityImage,TOutputImage,TMaskImage,TResidueImage>
 ::BeforeThreadedGenerateData()
 {
-  // Instanciate all transforms
+  // Instantiate all transforms
   this->m_ReferenceToGroundTransform = RSTransformType::New();
   this->m_ReferenceToGroundTransform->SetInputKeywordList(this->m_ReferenceKeywordList);
-  this->m_ReferenceToGroundTransform->InstanciateTransform();
+  this->m_ReferenceToGroundTransform->InstantiateTransform();
 
   this->m_MovingToGroundTransform.clear();
   for (unsigned int k=0; k<this->m_MovingKeywordLists.size(); ++k)
     {
     RSTransformType::Pointer transfo = RSTransformType::New();
     transfo->SetInputKeywordList(this->m_MovingKeywordLists[k]);
-    transfo->InstanciateTransform();
+    transfo->InstantiateTransform();
     this->m_MovingToGroundTransform.push_back(transfo);
     }
 }
diff --git a/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.h b/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.h
index db2ee9e..f851177 100644
--- a/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.h
@@ -311,7 +311,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(PixelWiseBlockMatchingImageFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TInputImage                                       InputImageType;
   typedef TOutputMetricImage                                OutputMetricImageType;
   typedef TOutputDisparityImage                             OutputDisparityImageType;
@@ -449,7 +449,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Before threaded generate data */
diff --git a/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.txx b/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.txx
index 5199a2c..eefbed8 100644
--- a/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.txx
+++ b/Modules/Registration/DisparityMap/include/otbPixelWiseBlockMatchingImageFilter.txx
@@ -554,7 +554,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
   itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels()*(m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity + 1)*(m_MaximumVerticalDisparity - m_MinimumVerticalDisparity + 1),100);
 
 
-  // Handle initialisation properly
+  // Handle initialization properly
   typename InputMaskImageType::Pointer initMaskPtr = InputMaskImageType::New();
   initMaskPtr->SetRegions(outputRegionForThread);
   initMaskPtr->Allocate();
@@ -710,7 +710,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
             double metric = m_Functor(leftIt,rightIt);
 
               // If we are at first loop, fill both outputs
-              // We adapt the disparity value to keep consistant with disparity map index space
+              // We adapt the disparity value to keep consistent with disparity map index space
             if(initIt.Get()==0)
                 {
                 outHDispIt.Set(static_cast<DisparityPixelType>(hdisparity) * stepDisparityInv);
diff --git a/Modules/Registration/DisparityMap/include/otbSubPixelDisparityImageFilter.h b/Modules/Registration/DisparityMap/include/otbSubPixelDisparityImageFilter.h
index ca042aa..7ee2466 100644
--- a/Modules/Registration/DisparityMap/include/otbSubPixelDisparityImageFilter.h
+++ b/Modules/Registration/DisparityMap/include/otbSubPixelDisparityImageFilter.h
@@ -79,7 +79,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(SubPixelDisparityImageFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TInputImage                                       InputImageType;
   typedef TOutputMetricImage                                OutputMetricImageType;
   typedef TDisparityImage                                   OutputDisparityImageType;
@@ -219,7 +219,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Before threaded generate data */
diff --git a/Modules/Registration/DisparityMap/test/CMakeLists.txt b/Modules/Registration/DisparityMap/test/CMakeLists.txt
index 99dc3c9..26d170d 100644
--- a/Modules/Registration/DisparityMap/test/CMakeLists.txt
+++ b/Modules/Registration/DisparityMap/test/CMakeLists.txt
@@ -104,8 +104,8 @@ otb_add_test(NAME dmTvSubPixelDisparityImageFilterNCC COMMAND otbDisparityMapTes
   1 # NCC
   1 # Parabolic
   2 # radius
-  -3 +3 # hdisp treshold
-  -2 2 # vdisp treshold
+  -3 +3 # hdisp threshold
+  -2 2 # vdisp threshold
   )
 
 otb_add_test(NAME dmTuSubPixelDisparityImageFilterNew COMMAND otbDisparityMapTestDriver
@@ -168,7 +168,7 @@ otb_add_test(NAME dmTvFineRegistrationImageFilterTestWithMeanSquare COMMAND otbD
   ${TEMP}/feTvFineRegistrationImageFilterTestWithMeanSquareField.tif  # output fieldFileName
   3 # radius
   2 # sradius
-  0.1 # precision
+  0.01 # precision
   2 # Mean square
   1 # Grid step
   0 # Initial offset x
@@ -188,7 +188,7 @@ otb_add_test(NAME dmTvFineRegistrationImageFilterTestWithMeanReciprocalDifferenc
   ${TEMP}/feTvFineRegistrationImageFilterTestWithMeanReciprocalDifferenceField.tif  # output fieldFileName
   3 # radius
   2 # sradius
-  0.1 # precision
+  0.01 # precision
   3 # Mean reciprocal difference
   1 # Grid step
   0 # Initial offset x
@@ -208,7 +208,7 @@ otb_add_test(NAME dmTvFineRegistrationImageFilterTestWithNormalizedCorrelation C
   ${TEMP}/feTvFineRegistrationImageFilterTestWithNormalizedCorrelationField.tif  # output fieldFileName
   3 # radius
   2 # sradius
-  0.1 # precision
+  0.01 # precision
   1 # Normalized Correlation
   1 # Grid step
   0 # Initial offset x
@@ -228,7 +228,7 @@ otb_add_test(NAME dmTvFineRegistrationImageFilterTestWithCorrelation COMMAND otb
   ${TEMP}/feTvFineRegistrationImageFilterTestWithCorrelationField.tif  # output fieldFileName
   3 # radius
   2 # sradius
-  0.1 # precision
+  0.01 # precision
   0 # Correlation
   1 # Grid step
   0 # Initial offset x
diff --git a/Modules/Registration/DisparityMap/test/otbFineRegistrationImageFilterTest.cxx b/Modules/Registration/DisparityMap/test/otbFineRegistrationImageFilterTest.cxx
index 9f0fb19..bf849a5 100644
--- a/Modules/Registration/DisparityMap/test/otbFineRegistrationImageFilterTest.cxx
+++ b/Modules/Registration/DisparityMap/test/otbFineRegistrationImageFilterTest.cxx
@@ -94,7 +94,7 @@ int otbFineRegistrationImageFilterTest( int argc, char * argv[] )
   registration->SetMovingInput(/*mreader*/mextract->GetOutput());
   registration->SetRadius(radius);
   registration->SetSearchRadius(sradius);
-  registration->SetSubPixelAccuracy(precision);
+  registration->SetConvergenceAccuracy(precision);
   registration->SetGridStep(gridStep);
 
   RegistrationFilterType::SpacingType offset;
diff --git a/Modules/Registration/DisparityMap/test/otbPixelWiseBlockMatchingImageFilter.cxx b/Modules/Registration/DisparityMap/test/otbPixelWiseBlockMatchingImageFilter.cxx
index b3dfa47..bf1cbb6 100644
--- a/Modules/Registration/DisparityMap/test/otbPixelWiseBlockMatchingImageFilter.cxx
+++ b/Modules/Registration/DisparityMap/test/otbPixelWiseBlockMatchingImageFilter.cxx
@@ -34,7 +34,7 @@ typedef otb::PixelWiseBlockMatchingImageFilter<ImageType,FloatImageType,FloatIma
 
 int otbPixelWiseBlockMatchingImageFilterNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
 {
-  // Instanciation
+  // Instantiation
   PixelWiseBlockMatchingImageFilterType::Pointer bmFilter = PixelWiseBlockMatchingImageFilterType::New();
 
   return EXIT_SUCCESS;
diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h
index abf0562..bb88787 100644
--- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h
+++ b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h
@@ -112,7 +112,7 @@ protected:
   void GenerateOutputInformation() ITK_OVERRIDE;
 
   /**
-   * Test wether a parameter is angular or not.
+   * Test whether a parameter is angular or not.
    * \param index The index of the parameter to test.
    */
   bool IsAngular(unsigned int index);
diff --git a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h
index 2d1ae6a..a529cb9 100644
--- a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h
+++ b/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h
@@ -73,7 +73,7 @@ public:
   typedef typename TransformType::Pointer        TransformPointerType;
   typedef typename TransformType::ParametersType ParametersType;
 
-  /** Set/Get the Transfrom. */
+  /** Set/Get the Transform. */
   itkSetObjectMacro(Transform, TransformType);
   itkGetObjectMacro(Transform, TransformType);
 
diff --git a/Modules/Registration/Stereo/include/otbAdhesionCorrectionFilter.txx b/Modules/Registration/Stereo/include/otbAdhesionCorrectionFilter.txx
index 9a06a33..c0d63f5 100644
--- a/Modules/Registration/Stereo/include/otbAdhesionCorrectionFilter.txx
+++ b/Modules/Registration/Stereo/include/otbAdhesionCorrectionFilter.txx
@@ -424,7 +424,7 @@ AdhesionCorrectionFilter<TImage, TMask>
   new_maskIt.GoToBegin();
   new_disparityIt.GoToBegin();
 
-  /** INITIALISATION */
+  /** INITIALIZATION */
   while (!new_maskIt.IsAtEnd() && !new_disparityIt.IsAtEnd())
     {
     old_maskIt.SetIndex(new_maskIt.GetIndex());
diff --git a/Modules/Registration/Stereo/include/otbBijectionCoherencyFilter.h b/Modules/Registration/Stereo/include/otbBijectionCoherencyFilter.h
index d24bf6f..431a3e7 100644
--- a/Modules/Registration/Stereo/include/otbBijectionCoherencyFilter.h
+++ b/Modules/Registration/Stereo/include/otbBijectionCoherencyFilter.h
@@ -60,7 +60,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(BijectionCoherencyFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TDisparityImage  DispMapType;
   typedef TOutputImage     MaskType;
 
@@ -116,7 +116,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Threaded generate data */
diff --git a/Modules/Registration/Stereo/include/otbLineOfSightOptimizer.h b/Modules/Registration/Stereo/include/otbLineOfSightOptimizer.h
index e507716..104afda 100644
--- a/Modules/Registration/Stereo/include/otbLineOfSightOptimizer.h
+++ b/Modules/Registration/Stereo/include/otbLineOfSightOptimizer.h
@@ -52,7 +52,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(LineOfSightOptimizer, itk::Object);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef TPrecision  PrecisionType;
   typedef TLabel      LabelType;
   typedef itk::DefaultStaticMeshTraits<TLabel,3,3,TPrecision> MeshType;
diff --git a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.h b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.h
index 440b234..46cc890 100644
--- a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.h
+++ b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.h
@@ -93,7 +93,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(Multi3DMapToDEMFilter, ImageToImageFilter);
 
-  /** Usefull typedefs */
+  /** Useful typedefs */
   typedef T3DImage                InputMapType;
   typedef TOutputDEMImage         OutputImageType;
   typedef TMaskImage              MaskImageType;
@@ -234,7 +234,7 @@ protected:
   /** Generate output information */
   void GenerateOutputInformation() ITK_OVERRIDE;
 
-  /** Generate input requrested region */
+  /** Generate input requested region */
   void GenerateInputRequestedRegion() ITK_OVERRIDE;
 
   /** Before threaded generate data */
diff --git a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.txx b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.txx
index 262c74d..0c49a9e 100644
--- a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.txx
+++ b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.txx
@@ -187,7 +187,7 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::SetOutputPara
      {
      mapToGroundTransform->SetOutputProjectionRef(m_ProjectionRef);
      }*/
-    mapToGroundTransform->InstanciateTransform();
+    mapToGroundTransform->InstantiateTransform();
 
     typename InputMapType::SizeType inputSize = imgPtr->GetLargestPossibleRegion().GetSize();
 
@@ -405,33 +405,49 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::GenerateInput
     groundToSensorTransform->SetOutputKeywordList(imgPtr->GetImageKeywordlist());
     groundToSensorTransform->SetOutputOrigin(imgPtr->GetOrigin());
     groundToSensorTransform->SetOutputSpacing(imgPtr->GetSpacing());
-    groundToSensorTransform->InstanciateTransform();
+    groundToSensorTransform->InstantiateTransform();
 
     typename T3DImage::RegionType mapRegion = imgPtr->GetLargestPossibleRegion();
 
     itk::ContinuousIndex<double, 2> mapContiIndex;
-    IndexType maxMapIndex;
-    IndexType minMapIndex;
+    long int maxMapIndex[2] = { 0, 0 };
+    long int minMapIndex[2] = { 0, 0 };
     maxMapIndex[0] = static_cast<long int> (mapRegion.GetIndex(0) + mapRegion.GetSize(0));
     maxMapIndex[1] = static_cast<long int> (mapRegion.GetIndex(1) + mapRegion.GetSize(1));
     minMapIndex[0] = static_cast<long int> (mapRegion.GetIndex(0));
     minMapIndex[1] = static_cast<long int> (mapRegion.GetIndex(1));
 
-    IndexType minMapRequestedIndex;
+    long int minMapRequestedIndex[2] = { 0, 0 };
     minMapRequestedIndex[0]= maxMapIndex[0]+1;
     minMapRequestedIndex[1]= maxMapIndex[1]+1;
-    IndexType maxMapRequestedIndex;
+
+    long int maxMapRequestedIndex[2] = { 0, 0 };
     maxMapRequestedIndex[0]= 0;
     maxMapRequestedIndex[1]= 0;
 
     for (unsigned int i = 0; i < 8; i++)
       {
-      TDPointType tmpSensor = groundToSensorTransform->TransformPoint(corners[i]);
+      TDPointType tmpSensor = groundToSensorTransform->TransformPoint( corners[i] );
+
+      minMapRequestedIndex[0] = std::min(
+        minMapRequestedIndex[0],
+        static_cast<long int> ( tmpSensor[0] - m_Margin[0] )
+        );
+
+      minMapRequestedIndex[1] = std::min(
+        minMapRequestedIndex[1],
+        static_cast<long int> ( tmpSensor[1] - m_Margin[1] )
+        );
+
+      maxMapRequestedIndex[0] = std::max(
+        maxMapRequestedIndex[0],
+        static_cast<long int> ( tmpSensor[0] + m_Margin[0] )
+        );
 
-      minMapRequestedIndex[0] = std::min(minMapRequestedIndex[0], static_cast<long int> (tmpSensor[0] - m_Margin[0]));
-      minMapRequestedIndex[1] = std::min(minMapRequestedIndex[1], static_cast<long int> (tmpSensor[1] - m_Margin[1]));
-      maxMapRequestedIndex[0] = std::max(maxMapRequestedIndex[0], static_cast<long int> (tmpSensor[0] + m_Margin[0]));
-      maxMapRequestedIndex[1] = std::max(maxMapRequestedIndex[1], static_cast<long int> (tmpSensor[1] + m_Margin[1]));
+      maxMapRequestedIndex[1] = std::max(
+        maxMapRequestedIndex[1],
+        static_cast<long int> ( tmpSensor[1] + m_Margin[1] )
+        );
 
       minMapRequestedIndex[0] = std::max(minMapRequestedIndex[0], minMapIndex[0]);
       minMapRequestedIndex[1] = std::max(minMapRequestedIndex[1], minMapIndex[1]);
@@ -459,6 +475,7 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::GenerateInput
       }
 
     imgPtr->SetRequestedRegion(requestedRegion);
+    
     TMaskImage *mskPtr = const_cast<TMaskImage *> (this->GetMaskInput(k));
     if (mskPtr)
       {
@@ -478,7 +495,7 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::BeforeThreade
   const TOutputDEMImage * outputDEM = this->GetDEMOutput();
 
   //create splits
-  // for each map we check if the input region can be splitted into threadNb
+  // for each map we check if the input region can be split into threadNb
   m_NumberOfSplit.resize(this->GetNumberOf3DMaps());
 
   unsigned int maximumRegionsNumber = 1;
@@ -498,7 +515,7 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::BeforeThreade
                                                                                         this->GetNumberOfThreads());
       }
     m_NumberOfSplit[k] = regionsNumber;
-    otbMsgDevMacro( "map " << k << " will be splitted into " << regionsNumber << " regions" );
+    otbMsgDevMacro( "map " << k << " will be split into " << regionsNumber << " regions" );
     if (maximumRegionsNumber < regionsNumber) maximumRegionsNumber = regionsNumber;
 
     }
@@ -532,7 +549,7 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::BeforeThreade
     m_GroundTransform = RSTransform2DType::New();
     m_GroundTransform->SetInputProjectionRef(static_cast<std::string> (otb::GeoInformationConversion::ToWKT(4326)));
     m_GroundTransform->SetOutputProjectionRef(m_ProjectionRef);
-    m_GroundTransform->InstanciateTransform();
+    m_GroundTransform->InstantiateTransform();
     }
 
 }
@@ -726,7 +743,7 @@ void Multi3DMapToDEMFilter<T3DImage, TMaskImage, TOutputDEMImage>::ThreadedGener
       else
         {
         splitRegion = requestedRegion;
-        otbMsgDevMacro( "map " << k << " will not be splitted " );
+        otbMsgDevMacro( "map " << k << " will not be split " );
         }
       }
     }
diff --git a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.h b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.h
index 805ea3d..78514d4 100644
--- a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.h
+++ b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.h
@@ -55,13 +55,13 @@ namespace otb
  *
  * Correlation parameters are as follows :
  * - The radius allows tuning patches size (default is 3),
- * - The CorrelationThreshold allows setting a threshold bellow which
+ * - The CorrelationThreshold allows setting a threshold below which
  *   correlation is considered to fail. If the correlation maxima is
- *   bellow this threshold, the estimated elevation is
+ *   below this threshold, the estimated elevation is
  *   discarded (default is 0.7).
  * - The VarianceThreshold allows discarding master patches for which
- *   variance is too small to yeld reliable correlation. If the
- *   variance of the current master patch lies bellow this threshold, no
+ *   variance is too small to yield reliable correlation. If the
+ *   variance of the current master patch lies below this threshold, no
  *   elevation exploration is performed at this location (default is 4).
  *
  *   This filter supports multi-threading and streaming. It can
diff --git a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.txx b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.txx
index 581783a..c6ca80e 100644
--- a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.txx
+++ b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.txx
@@ -161,7 +161,7 @@ void StereoSensorModelToElevationFilter<TInputImage, TOutputHeight>
   transform->SetInputKeywordList(masterPtr->GetImageKeywordlist());
   transform->SetOutputKeywordList(slavePtr->GetImageKeywordlist());
 
-  transform->InstanciateTransform();
+  transform->InstantiateTransform();
 
   typename GenericRSTransformType::ParametersType params(1);
 
@@ -282,7 +282,7 @@ StereoSensorModelToElevationFilter<TInputImage, TOutputHeight>
 
   typename GenericRSTransformType::Pointer rsTransform = GenericRSTransformType::New();
   rsTransform->SetInputKeywordList(outputPtr->GetImageKeywordlist());
-  rsTransform->InstanciateTransform();
+  rsTransform->InstantiateTransform();
 
   // Fill output
   itk::ImageRegionIteratorWithIndex<OutputImageType> outputIt(outputPtr, outputPtr->GetBufferedRegion());
@@ -305,7 +305,7 @@ StereoSensorModelToElevationFilter<TInputImage, TOutputHeight>
   m_MasterToSlave = GenericRSTransform3DType::New();
   m_MasterToSlave->SetInputKeywordList(masterPtr->GetImageKeywordlist());
   m_MasterToSlave->SetOutputKeywordList(slavePtr->GetImageKeywordlist());
-  m_MasterToSlave->InstanciateTransform();
+  m_MasterToSlave->InstantiateTransform();
 
 }
 
@@ -337,7 +337,7 @@ StereoSensorModelToElevationFilter<TInputImage, TOutputHeight>
 
   //   typename GenericRSTransformType::Pointer gcpTransform = GenericRSTransformType::New();
   //   gcpTransform->SetInputProjectionRef(this->GetInput()->GetGCPProjection());
-  //   gcpTransform->InstanciateTransform();
+  //   gcpTransform->InstantiateTransform();
 
   //   groundPointWGS84 = gcpTransform->TransformPoint(groundPoint);
 
@@ -357,7 +357,7 @@ StereoSensorModelToElevationFilter<TInputImage, TOutputHeight>
 
   //   typename GenericRSTransformType::Pointer gcpTransform = GenericRSTransformType::New();
   //   gcpTransform->SetInputProjectionRef(this->GetInput()->GetGCPProjection());
-  //   gcpTransform->InstanciateTransform();
+  //   gcpTransform->InstantiateTransform();
 
   //   groundPointWGS84 = gcpTransform->TransformPoint(groundPoint);
 
@@ -402,7 +402,7 @@ StereoSensorModelToElevationFilter<TInputImage, TOutputHeight>
     typename GenericRSTransform3DType::InputPointType in3DPoint, out3DPoint;
     typename InputImageType::IndexType index;
 
-    // Retrieve intial height
+    // Retrieve initial height
     double initHeight = outputIt.Get();
     double optimalHeight = initHeight;
     double optimalCorrelation = 0;
diff --git a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.h b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.h
index 0698b5a..7643712 100644
--- a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.h
+++ b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.h
@@ -76,7 +76,7 @@ namespace otb
  *  resampling grid. Please keep in mind that the whole grid is loaded
  *  into memory, and that the epipolar lines direction may only vary
  *  smoothly. When working with large images, a coarse grid-step will
- *  generally be accurate enough and will preserve the memory ressources.
+ *  generally be accurate enough and will preserve the memory resources.
  *
  *  \sa StreamingWarpImageFilter
  *  \sa StereoSensorModelToElevationMapFilter
diff --git a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.txx b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.txx
index f5f210a..20e3499 100644
--- a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.txx
+++ b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.txx
@@ -134,7 +134,7 @@ StereorectificationDisplacementFieldSource<TInputImage, TOutputImage>
   RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New();
   leftToGroundTransform->SetInputKeywordList(m_LeftImage->GetImageKeywordlist());
 
-  leftToGroundTransform->InstanciateTransform();
+  leftToGroundTransform->InstantiateTransform();
 
   // Retrieve the deformation field pointers
   OutputImageType * leftDFPtr = this->GetLeftDisplacementFieldOutput();
@@ -143,11 +143,11 @@ StereorectificationDisplacementFieldSource<TInputImage, TOutputImage>
   // Set up  the RS transforms
   m_LeftToRightTransform->SetInputKeywordList(m_LeftImage->GetImageKeywordlist());
   m_LeftToRightTransform->SetOutputKeywordList(m_RightImage->GetImageKeywordlist());
-  m_LeftToRightTransform->InstanciateTransform();
+  m_LeftToRightTransform->InstantiateTransform();
 
   m_RightToLeftTransform->SetInputKeywordList(m_RightImage->GetImageKeywordlist());
   m_RightToLeftTransform->SetOutputKeywordList(m_LeftImage->GetImageKeywordlist());
-  m_RightToLeftTransform->InstanciateTransform();
+  m_RightToLeftTransform->InstantiateTransform();
 
   // Now, we must determine the optimized size, spacing and origin of the
   // stereo-rectified images, as well as the position of the origin in
@@ -185,7 +185,7 @@ StereorectificationDisplacementFieldSource<TInputImage, TOutputImage>
   // average elevation
   rightEpiPoint = m_LeftToRightTransform->TransformPoint(leftInputOrigin);
 
-  // The begining of the epipolar line in the left image is the image
+  // The beginning of the epipolar line in the left image is the image
   // of rightEpiPoint at a lower elevation (using the offset)
   rightEpiPoint[2] = localElevation - m_ElevationOffset;
   leftEpiLineStart = m_RightToLeftTransform->TransformPoint(rightEpiPoint);
@@ -317,7 +317,7 @@ StereorectificationDisplacementFieldSource<TInputImage, TOutputImage>
 
   leftToGroundTransform->SetInputKeywordList(m_LeftImage->GetImageKeywordlist());
 
-  leftToGroundTransform->InstanciateTransform();
+  leftToGroundTransform->InstantiateTransform();
 
   // Retrieve the output pointers
   OutputImageType * leftDFPtr = this->GetLeftDisplacementFieldOutput();
@@ -406,7 +406,7 @@ StereorectificationDisplacementFieldSource<TInputImage, TOutputImage>
     // average elevation
     epiPoint2 = m_LeftToRightTransform->TransformPoint(currentPoint1);
 
-    // The begining of the epipolar line in the left image is the image
+    // The beginning of the epipolar line in the left image is the image
     // of epiPoint2 at a lower elevation (using the offset)
     epiPoint2[2] = localElevation - m_ElevationOffset;
     startLine1 = m_RightToLeftTransform->TransformPoint(epiPoint2);
diff --git a/Modules/Remote/Mosaic.remote.cmake b/Modules/Remote/Mosaic.remote.cmake
index 1a27a6c..1989f99 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 279687c24f00fc75a009341f5cfe7cc691d657f6
+  GIT_TAG 9a8cdd63ed3bba500bb4ea3867abc38bce8be562
 )
diff --git a/Modules/Remote/SertitObject.remote.cmake b/Modules/Remote/SertitObject.remote.cmake
index e933f05..a859a3d 100644
--- a/Modules/Remote/SertitObject.remote.cmake
+++ b/Modules/Remote/SertitObject.remote.cmake
@@ -22,9 +22,9 @@ This application computes radiometric and shape attributes on a vector dataset,
 using an image. The results are stored in the attribute table. Shape attributes
 are : number of pixels, flatness, roundness, elongation, perimeter. Radiometric
 attributes are for each band of the input image : mean, standard-deviation,
-median, variance, kurtosis, skewness. The result could be use to perform futher
+median, variance, kurtosis, skewness. The result could be use to perform further
 object-oriented image analysis.
 "
   GIT_REPOSITORY https://github.com/sertit/SertitObject.git
-  GIT_TAG 90c369e9a197b3f83cb18e1d7bc594313fef63d5
+  GIT_TAG d228e0d65de58496e2410ae8944e715b3970760a
 )
diff --git a/Modules/Remote/otb-bv.remote.cmake b/Modules/Remote/otb-bv.remote.cmake
new file mode 100644
index 0000000..f699009
--- /dev/null
+++ b/Modules/Remote/otb-bv.remote.cmake
@@ -0,0 +1,9 @@
+#Contact: Jordi Inglada  <jordi.inglada at cesbio.eu>
+otb_fetch_module(OTBBioVars
+  "Biophysical variable estimation from remote sensing imagery.
+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
+)
diff --git a/Modules/Remote/otbFFSforGMM.remote.cmake b/Modules/Remote/otbFFSforGMM.remote.cmake
new file mode 100644
index 0000000..74c3752
--- /dev/null
+++ b/Modules/Remote/otbFFSforGMM.remote.cmake
@@ -0,0 +1,9 @@
+#Contact: Adrien Lagrange <adrien.lagrange at irit.fr>
+otb_fetch_module(OTBFastFeaturesSelection
+  "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
+  )
diff --git a/Modules/Remote/phenotb.remote.cmake b/Modules/Remote/phenotb.remote.cmake
new file mode 100644
index 0000000..3640ef3
--- /dev/null
+++ b/Modules/Remote/phenotb.remote.cmake
@@ -0,0 +1,11 @@
+#Contact: Jordi Inglada  <jordi.inglada at cesbio.eu>
+otb_fetch_module(OTBPhenology
+  "This module implements several algorithms allowing to extract phenological
+  information from time profiles. These time profiles should represent
+  vegetation status as for instance NDVI, LAI, etc.
+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
+)
diff --git a/Modules/Remote/temporal-gapfilling.remote.cmake b/Modules/Remote/temporal-gapfilling.remote.cmake
new file mode 100644
index 0000000..b135cb2
--- /dev/null
+++ b/Modules/Remote/temporal-gapfilling.remote.cmake
@@ -0,0 +1,10 @@
+#Contact: Jordi Inglada  <jordi.inglada at cesbio.eu>
+otb_fetch_module(OTBTemporalGapFilling
+  "Gapfilling for time series replaces invalid pixels (as designated by a mask)
+  by an interpolation using the valid dates of the series.
+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
+)
diff --git a/Modules/Segmentation/CCOBIA/include/otbStreamingConnectedComponentSegmentationOBIAToVectorDataFilter.txx b/Modules/Segmentation/CCOBIA/include/otbStreamingConnectedComponentSegmentationOBIAToVectorDataFilter.txx
index 4090a9c..04f0206 100644
--- a/Modules/Segmentation/CCOBIA/include/otbStreamingConnectedComponentSegmentationOBIAToVectorDataFilter.txx
+++ b/Modules/Segmentation/CCOBIA/include/otbStreamingConnectedComponentSegmentationOBIAToVectorDataFilter.txx
@@ -56,7 +56,7 @@ PersistentConnectedComponentSegmentationOBIAToVectorDataFilter<TVImage, TLabelIm
   typename ExtractImageFilterType::Pointer extract = ExtractImageFilterType::New();
   extract->SetInput( this->GetInput() );
   extract->SetExtractionRegion( this->GetOutput()->GetRequestedRegion() );
-  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionnary
+  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionary
 
   typename MaskImageType::Pointer mask;
   if (!m_MaskExpression.empty())
diff --git a/Modules/Segmentation/Conversion/include/otbLabelImageToOGRDataSourceFilter.txx b/Modules/Segmentation/Conversion/include/otbLabelImageToOGRDataSourceFilter.txx
index 3a8c9be..9521f10 100644
--- a/Modules/Segmentation/Conversion/include/otbLabelImageToOGRDataSourceFilter.txx
+++ b/Modules/Segmentation/Conversion/include/otbLabelImageToOGRDataSourceFilter.txx
@@ -155,8 +155,8 @@ LabelImageToOGRDataSourceFilter<TInputImage>
     nbBands = this->GetInput()->GetNumberOfComponentsPerPixel();
     bytePerPixel = sizeof(InputPixelType);
 
-    // buffer casted in unsigned long cause under Win32 the adress
-    // don't begin with 0x, the adress in not interpreted as
+    // buffer casted in unsigned long cause under Win32 the address
+    // don't begin with 0x, the address in not interpreted as
     // hexadecimal but alpha numeric value, then the conversion to
     // integer make us pointing to an non allowed memory block => Crash.
     std::ostringstream stream;
@@ -227,8 +227,8 @@ LabelImageToOGRDataSourceFilter<TInputImage>
       size = this->GetInputMask()->GetLargestPossibleRegion().GetSize();
       nbBands = this->GetInputMask()->GetNumberOfComponentsPerPixel();
       bytePerPixel = sizeof(InputPixelType);
-      // buffer casted in unsigned long cause under Win32 the adress
-      // don't begin with 0x, the adress in not interpreted as
+      // buffer casted in unsigned long cause under Win32 the address
+      // don't begin with 0x, the address in not interpreted as
       // hexadecimal but alpha numeric value, then the conversion to
       // integer make us pointing to an non allowed memory block => Crash.
       std::ostringstream maskstream;
diff --git a/Modules/Segmentation/Conversion/include/otbLabelImageToVectorDataFilter.txx b/Modules/Segmentation/Conversion/include/otbLabelImageToVectorDataFilter.txx
index d27f065..9d20416 100644
--- a/Modules/Segmentation/Conversion/include/otbLabelImageToVectorDataFilter.txx
+++ b/Modules/Segmentation/Conversion/include/otbLabelImageToVectorDataFilter.txx
@@ -135,8 +135,8 @@ LabelImageToVectorDataFilter<TInputImage, TPrecision>
     unsigned int bytePerPixel = sizeof(InputPixelType);
 
     /** Convert Input image into a OGRLayer using GDALPolygonize */
-    // buffer casted in unsigned long cause under Win32 the adress
-    // don't begin with 0x, the adress in not interpreted as
+    // buffer casted in unsigned long cause under Win32 the address
+    // don't begin with 0x, the address in not interpreted as
     // hexadecimal but alpha numeric value, then the conversion to
     // integer make us pointing to an non allowed memory block => Crash.
     std::ostringstream stream;
@@ -207,8 +207,8 @@ LabelImageToVectorDataFilter<TInputImage, TPrecision>
       size = this->GetInputMask()->GetLargestPossibleRegion().GetSize();
       nbBands = this->GetInputMask()->GetNumberOfComponentsPerPixel();
       bytePerPixel = sizeof(InputPixelType);
-      // buffer casted in unsigned long cause under Win32 the adress
-      // don't begin with 0x, the adress in not interpreted as
+      // buffer casted in unsigned long cause under Win32 the address
+      // don't begin with 0x, the address in not interpreted as
       // hexadecimal but alpha numeric value, then the conversion to
       // integer make us pointing to an non allowed memory block => Crash.
       std::ostringstream maskstream;
diff --git a/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.h b/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.h
index f1e0913..d4a955e 100644
--- a/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.h
+++ b/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.h
@@ -97,14 +97,14 @@ public:
   const InputLabelMapType * GetInput(void);
   const InputLabelMapType * GetInput(unsigned int idx);
 
-  /* Set the functor used to provide additionnal OGR fields */
+  /* Set the functor used to provide additional OGR fields */
   void SetFieldsFunctor(const FieldsFunctorType& functor)
   {
     m_FieldsFunctor = functor;
     this->Modified();
   }
 
-  /* Get the functor used to provide additionnal OGR fields */
+  /* Get the functor used to provide additional OGR fields */
   FieldsFunctorType& GetFieldsFunctor()
   {
     return m_FieldsFunctor;
diff --git a/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.txx b/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.txx
index 358d3c5..5cf2209 100644
--- a/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.txx
+++ b/Modules/Segmentation/Conversion/include/otbLabelMapToVectorDataFilter.txx
@@ -116,7 +116,7 @@ LabelMapToVectorDataFilter<TLabelMap, TVectorData, TFieldsFunctor>
     //TODO hole in the polygon are not handle yet by the functor
     node->SetPolygonExteriorRing(correctPolygon);
 
-    /** Store additionnal fields given by functor */
+    /** Store additional fields given by functor */
     std::map<std::string, std::string> fields = m_FieldsFunctor(const_cast <LabelObjectType *> (labelObject));
     std::map<std::string, std::string>::const_iterator it2;
     for ( it2 = fields.begin(); it2 != fields.end(); ++it2 )
diff --git a/Modules/Segmentation/Conversion/include/otbVectorDataToLabelMapWithAttributesFilter.h b/Modules/Segmentation/Conversion/include/otbVectorDataToLabelMapWithAttributesFilter.h
index 2286de7..abded3c 100644
--- a/Modules/Segmentation/Conversion/include/otbVectorDataToLabelMapWithAttributesFilter.h
+++ b/Modules/Segmentation/Conversion/include/otbVectorDataToLabelMapWithAttributesFilter.h
@@ -221,7 +221,7 @@ private:
   /** Set to 0 by default.*/
   LabelType m_InitialLabel;
 
-  //TODO dont need this attributes now compute with VectorDataProperties
+  //TODO don't need this attributes now compute with VectorDataProperties
 
   SpacingType   m_Spacing;
   OriginType    m_Origin;
diff --git a/Modules/Segmentation/Conversion/test/otbPolygonizationRasterizationTest.cxx b/Modules/Segmentation/Conversion/test/otbPolygonizationRasterizationTest.cxx
index abb2562..e3bb09a 100644
--- a/Modules/Segmentation/Conversion/test/otbPolygonizationRasterizationTest.cxx
+++ b/Modules/Segmentation/Conversion/test/otbPolygonizationRasterizationTest.cxx
@@ -43,7 +43,7 @@ int otbPolygonizationRasterizationTest(int itkNotUsed(argc), char * argv[])
   ReaderType::Pointer reader = ReaderType::New();
   reader->SetFileName(argv[1]);
 
-  // Instanciate  a LabelImageToVectorData filter
+  // Instantiate  a LabelImageToVectorData filter
   LabelImageToVDFilterType::Pointer polygonize = LabelImageToVDFilterType::New();
   polygonize->SetInput(reader->GetOutput());
   polygonize->Update();
diff --git a/Modules/Segmentation/Labelling/include/otbLabelizeConfidenceConnectedImageFilter.h b/Modules/Segmentation/Labelling/include/otbLabelizeConfidenceConnectedImageFilter.h
index df0f077..e525fc0 100644
--- a/Modules/Segmentation/Labelling/include/otbLabelizeConfidenceConnectedImageFilter.h
+++ b/Modules/Segmentation/Labelling/include/otbLabelizeConfidenceConnectedImageFilter.h
@@ -92,13 +92,13 @@ public:
   /** Set replace value */
   itkSetMacro(ReplaceValue, OutputPixelType);
 
-  /** Set initial neigborhood radius */
+  /** Set initial neighborhood radius */
   const unsigned int& GetInitialNeighborhoodRadius()
   {
     return this->m_RegionGrowingFilter->GetInitialNeighborhoodRadius();
   }
 
-  /** Set initial neigborhood radius */
+  /** Set initial neighborhood radius */
   void SetInitialNeighborhoodRadius(const unsigned int initial)
   {
     this->m_RegionGrowingFilter->SetInitialNeighborhoodRadius(initial);
@@ -116,7 +116,7 @@ private:
   LabelizeConfidenceConnectedImageFilter(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
-  /** Intial replace value*/
+  /** Initial replace value*/
   OutputPixelType m_ReplaceValue;
 
 }; // end class LabelizeconnectedThresholdImageFilter
diff --git a/Modules/Segmentation/Labelling/include/otbLabelizeConnectedThresholdImageFilter.h b/Modules/Segmentation/Labelling/include/otbLabelizeConnectedThresholdImageFilter.h
index ddab2da..7dce5c0 100644
--- a/Modules/Segmentation/Labelling/include/otbLabelizeConnectedThresholdImageFilter.h
+++ b/Modules/Segmentation/Labelling/include/otbLabelizeConnectedThresholdImageFilter.h
@@ -95,7 +95,7 @@ private:
   /** Delta - threshold for growing region */
   InputPixelType m_LowerThresholdDelta;
 
-  /** Intial replace value*/
+  /** Initial replace value*/
   OutputPixelType m_ReplaceValue;
 
 }; // end class LabelizeconnectedThresholdImageFilter
diff --git a/Modules/Segmentation/Labelling/include/otbLabelizeNeighborhoodConnectedImageFilter.h b/Modules/Segmentation/Labelling/include/otbLabelizeNeighborhoodConnectedImageFilter.h
index 2eb07b8..b6209a5 100644
--- a/Modules/Segmentation/Labelling/include/otbLabelizeNeighborhoodConnectedImageFilter.h
+++ b/Modules/Segmentation/Labelling/include/otbLabelizeNeighborhoodConnectedImageFilter.h
@@ -30,7 +30,7 @@ namespace otb
  *
  *  This class implements base class otb::LabelizeImageFilterBase
  *
- *  First seeds are obtained with a theshold filter
+ *  First seeds are obtained with a threshold filter
  *  For each seed, itk::NeighborhoodConnectedImageFilter labels pixel
  *  Finally, filter produce a regions map
  *
@@ -117,7 +117,7 @@ private:
   /** Delta - threshold for growing region */
   InputPixelType m_LowerThresholdDelta;
 
-  /** Intial replace value*/
+  /** Initial replace value*/
   OutputPixelType m_ReplaceValue;
 
 }; // end class LabelizeconnectedThresholdImageFilter
diff --git a/Modules/Segmentation/MeanShift/include/otbMeanShiftConnectedComponentSegmentationFilter.txx b/Modules/Segmentation/MeanShift/include/otbMeanShiftConnectedComponentSegmentationFilter.txx
index d8f2218..dff0257 100644
--- a/Modules/Segmentation/MeanShift/include/otbMeanShiftConnectedComponentSegmentationFilter.txx
+++ b/Modules/Segmentation/MeanShift/include/otbMeanShiftConnectedComponentSegmentationFilter.txx
@@ -56,7 +56,7 @@ MeanShiftConnectedComponentSegmentationFilter<TVImage,TMaskImage,  TLabelImage>
   typename ExtractImageFilterType::Pointer extract = ExtractImageFilterType::New();
   extract->SetInput(this->GetInput());
   extract->SetExtractionRegion(this->GetOutput()->GetRequestedRegion());
-  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionnary
+  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionary
 
   // meanshift filtering
 
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyIterativeDecompositionImageFilter.txx b/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyIterativeDecompositionImageFilter.txx
index 7300212..e88d11f 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyIterativeDecompositionImageFilter.txx
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbGeodesicMorphologyIterativeDecompositionImageFilter.txx
@@ -214,7 +214,7 @@ GeodesicMorphologyIterativeDecompositionImageFilter<TImage, TStructuringElement>
 {
   Superclass::PrintSelf(os, indent);
   os << indent << "NumberOfIterations: " << m_NumberOfIterations << std::endl;
-  os << indent << "IntialValue: " << m_InitialValue << std::endl;
+  os << indent << "InitialValue: " << m_InitialValue << std::endl;
   os << indent << "Step: " << m_Step << std::endl;
 }
 } // End namespace otb
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbImageToProfileFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbImageToProfileFilter.h
index f8d61df..8b99a02 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbImageToProfileFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbImageToProfileFilter.h
@@ -31,7 +31,7 @@ namespace otb
  *  \Pi_{\phi}(f)= \{\phi_{n}(f), n \in \{n_{1},\ldots, n_{N}\} \}
  *  \f]
  *
- * with \f$ \{n_{1},\ldots, n_{N}\} \f$ beeing a range of parameter. This class is a base class templated
+ * with \f$ \{n_{1},\ldots, n_{N}\} \f$ being a range of parameter. This class is a base class templated
  * by the type of the filter \f$ \phi \f$. The SetProfileParameter() is a virtual method meant to be
  * rewritten so that the filter can be correctly set up in sub-classes.
  *
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalClosingProfileFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalClosingProfileFilter.h
index b290c52..ca2951d 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalClosingProfileFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalClosingProfileFilter.h
@@ -35,7 +35,7 @@ namespace otb
  * NO. 2, February 2001, p. 309-320.
  * \par
  *
- * The opening profile is a set of images beeing the result of a geodesic morphological
+ * The opening profile is a set of images being the result of a geodesic morphological
  * closing by reconstruction with an increasing range of structuring element sizes.
  *
  * For more information on profiles please refer to the documentation of the otb::ImageToProfileFilter
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalOpeningProfileFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalOpeningProfileFilter.h
index 6caac39..127c4f8 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalOpeningProfileFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbMorphologicalOpeningProfileFilter.h
@@ -35,7 +35,7 @@ namespace otb
  * NO. 2, February 2001, p. 309-320.
  * \par
  *
- * The opening profile is a set of images beeing the result of a geodesic morphological
+ * The opening profile is a set of images being the result of a geodesic morphological
  * opening by reconstruction with an increasing range of structuring element sizes.
  *
  * For more information on profiles please refer to the documentation of the otb::ImageToProfileFilter
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h
index 32d0899..b40923a 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbMultiScaleConvexOrConcaveClassificationFilter.h
@@ -132,7 +132,7 @@ public:
 private:
   /** Sigma (tolerance) parameter */
   double m_Sigma;
-  /** Seperate between convex and concave labels */
+  /** Separate between convex and concave labels */
   TLabeled m_LabelSeparator;
 
 };
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbProfileDerivativeToMultiScaleCharacteristicsFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbProfileDerivativeToMultiScaleCharacteristicsFilter.h
index b842d74..d4a9cb4 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbProfileDerivativeToMultiScaleCharacteristicsFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbProfileDerivativeToMultiScaleCharacteristicsFilter.h
@@ -29,7 +29,7 @@ namespace otb
  *  as the parameter (called characteristic) for which this maxima occurs.
  *
  *  The maxima can be retrieved by the GetOutput() image, while the characteristics
- *  can be retreived by the GetOutputCharacteristics().
+ *  can be retrieved by the GetOutputCharacteristics().
  *
  *  Please note that this characteristics can be scaled using the InitialValue and Step
  *  parameter corresponding to the input profile.
diff --git a/Modules/Segmentation/OGRProcessing/include/otbStreamingImageToOGRLayerSegmentationFilter.txx b/Modules/Segmentation/OGRProcessing/include/otbStreamingImageToOGRLayerSegmentationFilter.txx
index bf952c9..25eb554 100644
--- a/Modules/Segmentation/OGRProcessing/include/otbStreamingImageToOGRLayerSegmentationFilter.txx
+++ b/Modules/Segmentation/OGRProcessing/include/otbStreamingImageToOGRLayerSegmentationFilter.txx
@@ -85,7 +85,7 @@ PersistentImageToOGRLayerSegmentationFilter<TImageType, TSegmentationFilter>
   extract->SetExtractionRegion( this->GetInput()->GetRequestedRegion() );
   extract->Update();
 
-  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionnary
+  // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionary
   extract->GetOutput()->SetMetaDataDictionary(this->GetInput()->GetMetaDataDictionary());
 
   const unsigned int labelImageIndex = LabeledOutputAccessor<SegmentationFilterType>::LabeledOutputIndex;
@@ -112,7 +112,7 @@ PersistentImageToOGRLayerSegmentationFilter<TImageType, TSegmentationFilter>
      maskExtract->SetInput( this->GetInputMask() );
      maskExtract->SetExtractionRegion( this->GetInput()->GetRequestedRegion() );
      maskExtract->Update();
-     // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionnary
+     // WARNING: itk::ExtractImageFilter does not copy the MetadataDictionary
      maskExtract->GetOutput()->SetMetaDataDictionary(this->GetInputMask()->GetMetaDataDictionary());
 
      labelImageToOGRDataFilter->SetInputMask(maskExtract->GetOutput());
diff --git a/Modules/Segmentation/Watersheds/include/otbWatershedSegmentationFilter.txx b/Modules/Segmentation/Watersheds/include/otbWatershedSegmentationFilter.txx
index 6fb1c50..155aa8c 100644
--- a/Modules/Segmentation/Watersheds/include/otbWatershedSegmentationFilter.txx
+++ b/Modules/Segmentation/Watersheds/include/otbWatershedSegmentationFilter.txx
@@ -49,7 +49,7 @@ WatershedSegmentationFilter<TInputImage, TOutputLabelImage>
   this->GraftOutput(m_CastFilter->GetOutput());
 
   // Since WatershedFilterType outputs an itk::Image,
-  // we loose the additionnal metadata of OTB like ProjectionRef.
+  // we loose the additional metadata of OTB like ProjectionRef.
   // Import them before exiting
   this->GetOutput()->CopyInformation( this->GetInput() );
 }
diff --git a/Modules/ThirdParty/Boost/CMakeLists.txt b/Modules/ThirdParty/Boost/CMakeLists.txt
index be133cf..3bacc78 100644
--- a/Modules/ThirdParty/Boost/CMakeLists.txt
+++ b/Modules/ThirdParty/Boost/CMakeLists.txt
@@ -3,9 +3,14 @@ project(OTBBoost)
 set(OTBBoost_SYSTEM_INCLUDE_DIRS ${Boost_INCLUDE_DIRS})
 set(OTBBoost_INCLUDE_DIRS ${OTBBoost_SOURCE_DIR}/src)
 
-if(Boost_LIBRARIES)
-  set(OTBBoost_LIBRARIES "${Boost_LIBRARIES}")
-endif()
+# Do not include boost libraries into full list of OTB_LIBRARIES
+# That will drag them in linking all otb modules and executables which is bad.
+# OTB uses only header only libraries of boost. A non-header only library
+# named 'unit_testing_framework' is used in two tests.
+# why drag a semi-standard c++ library for use in two tests?.
+# if(Boost_LIBRARIES)
+#   set(OTBBoost_LIBRARIES "${Boost_LIBRARIES}")
+# endif()
 
 set(Boost_VERSION_STRING "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}" CACHE INTERNAL "" FORCE)
 
diff --git a/Modules/ThirdParty/Boost/otb-module-init.cmake b/Modules/ThirdParty/Boost/otb-module-init.cmake
index 6efec08..116081f 100644
--- a/Modules/ThirdParty/Boost/otb-module-init.cmake
+++ b/Modules/ThirdParty/Boost/otb-module-init.cmake
@@ -1,8 +1,11 @@
-find_package (Boost 1.35.0 REQUIRED)
 
+set(Boost_USE_STATIC_LIBS OFF CACHE BOOL "use static libraries from boost")
+
+set(Boost_USE_MULTITHREADED ON CACHE BOOL "use multi-threaded libraries from boost")
+
+find_package (Boost 1.35.0 REQUIRED)
 if (BUILD_TESTING)
-  find_package (Boost 1.35.0 QUIET
-    COMPONENTS unit_test_framework)
+  find_package (Boost 1.35.0 QUIET COMPONENTS unit_test_framework)
   if (NOT Boost_UNIT_TEST_FRAMEWORK_FOUND)
     message(STATUS "Boost unit_test_framework not found. Hence otbOGRTests will be skipped")
   else()
diff --git a/Modules/ThirdParty/GDAL/otb-module-init.cmake b/Modules/ThirdParty/GDAL/otb-module-init.cmake
index 4d8c8e3..1ed1ca6 100644
--- a/Modules/ThirdParty/GDAL/otb-module-init.cmake
+++ b/Modules/ThirdParty/GDAL/otb-module-init.cmake
@@ -26,6 +26,7 @@ endif()
 
 #------------------- Helper Macro ---------------------
 macro(gdal_try_run msg_type var source_file)
+message(STATUS "Performing Test ${var}")
 set(${var})
 try_run(RUN_${var} COMPILE_${var} ${CMAKE_CURRENT_BINARY_DIR}
 ${CMAKE_SOURCE_DIR}/Modules/ThirdParty/GDAL/${source_file}
@@ -133,6 +134,13 @@ endif()
 gdal_try_run(STATUS GDAL_HAS_HDF5 gdalFormatsTest.c HDF5)
 gdal_try_run(STATUS GDAL_HAS_HDF4 gdalFormatsTest.c HDF4)
 
+#check some vector formats
+#TODO: fix gdalFormatsTest.c to work with gdal 1.x and 2.x
+# gdal_try_run(FATAL_ERROR GDAL_HAS_SQLite gdalFormatsTest.c SQLite)
+# gdal_try_run(FATAL_ERROR GDAL_HAS_VRT gdalFormatsTest.c VRT)
+# gdal_try_run(FATAL_ERROR GDAL_HAS_KML gdalFormatsTest.c KML)
+# gdal_try_run(STATUS GDAL_HAS_LIBKML gdalFormatsTest.c LIBKML)
+
 #------------------- TESTS (END)---------------------
 
 #FOR UNIX SYSTEMS ONLY
diff --git a/Modules/ThirdParty/GLFW/otb-module-init.cmake b/Modules/ThirdParty/GLFW/otb-module-init.cmake
index 1c7a5e0..fb2519d 100644
--- a/Modules/ThirdParty/GLFW/otb-module-init.cmake
+++ b/Modules/ThirdParty/GLFW/otb-module-init.cmake
@@ -2,7 +2,3 @@ find_package(GLFW REQUIRED)
 
 mark_as_advanced(GLFW_INCLUDE_DIR)
 mark_as_advanced(GLFW_LIBRARY)
-
-if(NOT GLFW_FOUND)
- message(FATAL_ERROR "Cannot find GLFW. Set GLFW_INCLUDE_DIR and GLFW_LIBRARY")
-endif()
diff --git a/Modules/ThirdParty/Glew/CMakeLists.txt b/Modules/ThirdParty/Glew/CMakeLists.txt
index 958ed6b..ad32279 100644
--- a/Modules/ThirdParty/Glew/CMakeLists.txt
+++ b/Modules/ThirdParty/Glew/CMakeLists.txt
@@ -1,7 +1,7 @@
 project(OTBGlew)
 set(OTBGlew_THIRD_PARTY 1)
 
-set(OTBGlew_SYSTEM_INCLUDE_DIRS ${GLEW_INCLUDE_PATH})
+set(OTBGlew_SYSTEM_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
 set(OTBGlew_LIBRARIES ${GLEW_LIBRARY})
 
 otb_module_impl()
diff --git a/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.h b/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.h
index 84e405c..232f296 100644
--- a/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.h
+++ b/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.h
@@ -90,7 +90,7 @@ public:
   /** Region typedef support.   */
   typedef ImageRegion< VImageDimension > RegionType;
 
-  /** How many pieces can the specifed region be split? A given region
+  /** How many pieces can the specified region be split? A given region
    * cannot always be divided into the requested number of pieces.  For
    * instance, if the numberOfPieces exceeds the number of pixels along
    * a certain dimensions, then some splits will not be possible. This
diff --git a/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.hxx b/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.hxx
index f101fa9..da0738a 100644
--- a/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.hxx
+++ b/Modules/ThirdParty/ITK/include/itkImageRegionMultidimensionalSplitter.hxx
@@ -66,11 +66,11 @@ ImageRegionMultidimensionalSplitter< VImageDimension >
                        << this->ComputeSplits(numberOfPieces, region, splits) );
     }
 
-  unsigned int splittedRegionIndex[VImageDimension]; // index into splitted
+  unsigned int splitRegionIndex[VImageDimension]; // index into split
                                                      // regions
   unsigned int i;
 
-  // determine which splitted region we are in
+  // determine which split region we are in
   unsigned int offset = splitI;
   for ( i = VImageDimension - 1; i > 0; i-- )
     {
@@ -80,18 +80,18 @@ ImageRegionMultidimensionalSplitter< VImageDimension >
       dimensionOffset *= splits[j];
       }
 
-    splittedRegionIndex[i] = offset / dimensionOffset;
-    offset -= ( splittedRegionIndex[i] * dimensionOffset );
+    splitRegionIndex[i] = offset / dimensionOffset;
+    offset -= ( splitRegionIndex[i] * dimensionOffset );
     }
-  splittedRegionIndex[0] = offset;
+  splitRegionIndex[0] = offset;
 
   // compute the region size and index
   for ( i = 0; i < VImageDimension; i++ )
     {
-    splitIndex[i] += Math::Floor<IndexValueType>( ( splittedRegionIndex[i] ) * ( regionSize[i] / double(splits[i]) ) );
-    if ( splittedRegionIndex[i] < splits[i] - 1 )
+    splitIndex[i] += Math::Floor<IndexValueType>( ( splitRegionIndex[i] ) * ( regionSize[i] / double(splits[i]) ) );
+    if ( splitRegionIndex[i] < splits[i] - 1 )
       {
-      splitSize[i] = Math::Floor<SizeValueType>( ( splittedRegionIndex[i] + 1 ) * ( regionSize[i] / double(splits[i]) ) )
+      splitSize[i] = Math::Floor<SizeValueType>( ( splitRegionIndex[i] + 1 ) * ( regionSize[i] / double(splits[i]) ) )
                      - splitIndex[i];
       }
     else
@@ -123,8 +123,8 @@ ImageRegionMultidimensionalSplitter< VImageDimension >
 
 /**
  * given the requestedNumber of regions to split the "region" argument
- * into, it retures the number of splitted regions in each dimension
- * as "splits" and returns the total number of splitted regions
+ * into, it retures the number of split regions in each dimension
+ * as "splits" and returns the total number of split regions
  */
 template< unsigned int VImageDimension >
 unsigned int
diff --git a/Modules/ThirdParty/ITK/include/itkImageRegionSplitter.h b/Modules/ThirdParty/ITK/include/itkImageRegionSplitter.h
index 0ab08e8..f9304f5 100644
--- a/Modules/ThirdParty/ITK/include/itkImageRegionSplitter.h
+++ b/Modules/ThirdParty/ITK/include/itkImageRegionSplitter.h
@@ -103,7 +103,7 @@ public:
   /** Region typedef support.   */
   typedef ImageRegion< VImageDimension > RegionType;
 
-  /** How many pieces can the specifed region be split? A given region
+  /** How many pieces can the specified region be split? A given region
    * cannot always be divided into the requested number of pieces.  For
    * instance, if the numberOfPieces exceeds the number of pixels along
    * a certain dimensions, then some splits will not be possible. This
diff --git a/Modules/ThirdParty/ITK/include/otbWarpImageFilter.h b/Modules/ThirdParty/ITK/include/otbWarpImageFilter.h
index eabdfd9..8a807ee 100644
--- a/Modules/ThirdParty/ITK/include/otbWarpImageFilter.h
+++ b/Modules/ThirdParty/ITK/include/otbWarpImageFilter.h
@@ -197,7 +197,7 @@ public:
 
   /** WarpImageFilter produces an image which is a different
    * size than its input image. As such, it needs to provide an
-   * implemenation for GenerateOutputInformation() which set
+   * implementation for GenerateOutputInformation() which set
    * the output information according the OutputSpacing, OutputOrigin
    * and the deformation field's LargestPossibleRegion. */
   void GenerateOutputInformation() ITK_OVERRIDE;
diff --git a/Modules/ThirdParty/MuParserX/CMakeLists.txt b/Modules/ThirdParty/MuParserX/CMakeLists.txt
index 5152616..7aa22a8 100644
--- a/Modules/ThirdParty/MuParserX/CMakeLists.txt
+++ b/Modules/ThirdParty/MuParserX/CMakeLists.txt
@@ -4,25 +4,6 @@ set(OTBMuParserX_SYSTEM_INCLUDE_DIRS ${MUPARSERX_INCLUDE_DIRS})
 set(OTBMuParserX_LIBRARIES "${MUPARSERX_LIBRARIES}")
 set(OTBMuParserX_INCLUDE_DIRS ${OTBMuParserX_BINARY_DIR}/src)
 
-# as advised by Ingo Berg : avoid using those #define with MSVC
-if(OTB_IS_UNIQUE_PTR_DEFINED OR MSVC)
-  set(OTB_MUPARSERX_HIDE_UNIQUE_PTR 0)
-else()
-  set(OTB_MUPARSERX_HIDE_UNIQUE_PTR 1)
-endif()
-
-if(OTB_IS_OVERRIDE_DEFINED OR MSVC)
-  set(OTB_MUPARSERX_HIDE_OVERRIDE 0)
-else()
-  set(OTB_MUPARSERX_HIDE_OVERRIDE 1)
-endif()
-
-if(OTB_IS_NULLPTR_DEFINED OR MSVC)
-  set(OTB_MUPARSERX_HIDE_NULLPTR 0)
-else()
-  set(OTB_MUPARSERX_HIDE_NULLPTR 1)
-endif()
-
 configure_file( src/mpCompat.h.in src/mpCompat.h )
 
 otb_module_impl()
diff --git a/Modules/ThirdParty/MuParserX/src/mpCompat.h.in b/Modules/ThirdParty/MuParserX/src/mpCompat.h.in
index 2d32538..7ac031c 100644
--- a/Modules/ThirdParty/MuParserX/src/mpCompat.h.in
+++ b/Modules/ThirdParty/MuParserX/src/mpCompat.h.in
@@ -18,16 +18,29 @@
 #ifndef MUP_COMPAT_H
 #define MUP_COMPAT_H
 
-#if @OTB_MUPARSERX_HIDE_OVERRIDE@
-#define override
-#endif
+/* defined if OTB_CXX_HAS_UNIQUE_PTR cmake check is OK. */
+/* See CMake/OTBCheckCpp11Keywords.cmake for more details */
+#cmakedefine OTB_CXX_HAS_UNIQUE_PTR
 
-#if @OTB_MUPARSERX_HIDE_UNIQUE_PTR@
+#ifndef OTB_CXX_HAS_UNIQUE_PTR
 #define unique_ptr auto_ptr
 #endif
 
-#if @OTB_MUPARSERX_HIDE_NULLPTR@
-#define nullptr NULL
+/* 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/OpenCV/CMakeLists.txt b/Modules/ThirdParty/OpenCV/CMakeLists.txt
index 3104bbe..b9efdd1 100644
--- a/Modules/ThirdParty/OpenCV/CMakeLists.txt
+++ b/Modules/ThirdParty/OpenCV/CMakeLists.txt
@@ -1,8 +1,8 @@
 project(OTBOpenCV)
 
-set(OTBOpenCV_SYSTEM_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS})
-set(OTBOpenCV_LIBRARIES "${OpenCV_LIBS}")
-set(OTBOpenCV_EXPORT_CODE_BUILD "find_package(OpenCV REQUIRED HINTS ${OpenCV_DIR})")
+set(OTBOpenCV_SYSTEM_INCLUDE_DIRS ${OPENCV_INCLUDE_DIRS})
+set(OTBOpenCV_LIBRARIES "${OPENCV_LIBRARIES}")
+set(OTBOpenCV_EXPORT_CODE_BUILD "find_package(OpenCV REQUIRED)")
 set(OTBOpenCV_EXPORT_CODE_INSTALL ${OTBOpenCV_EXPORT_CODE_BUILD})
 
 otb_module_impl()
diff --git a/Modules/ThirdParty/OssimPlugins/src/CMakeLists.txt b/Modules/ThirdParty/OssimPlugins/src/CMakeLists.txt
index 48ff467..59014cf 100644
--- a/Modules/ThirdParty/OssimPlugins/src/CMakeLists.txt
+++ b/Modules/ThirdParty/OssimPlugins/src/CMakeLists.txt
@@ -29,28 +29,6 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ossim/ossimplugins-config.h.in
     ${CMAKE_CURRENT_BINARY_DIR}/ossim/ossimplugins-config.h)
 include_directories(${CMAKE_CURRENT_BINARY_DIR}/ossim)
 
-# include_directories(${CMAKE_CURRENT_SOURCE_DIR}
-#   ${CMAKE_CURRENT_SOURCE_DIR}/ossim
-# #  ${OTB_SOURCE_DIR}/Utilities/otbossim/include
-# #  ${OTB_BINARY_DIR}/Utilities/otbossim/include
-# )
-#if(OTB_USE_EXTERNAL_OSSIM)
-#  include_directories(${OSSIM_INCLUDE_DIR})
-
-  # When using External ossim, compile ossimplugin as a DLL
-  # even if we compile OTB as a static lib
-  set(ossimplugins_LIBTYPE SHARED)
-  if(WIN32)
-    add_definitions(-DOSSIMPLUGINSMAKINGDLL)
-  endif()
-
-#else()
-#  include_directories(${OTB_SOURCE_DIR}/Utilities/otbossim/include)
-#  include_directories(${OTB_BINARY_DIR}/Utilities/otbossim/include)
-#endif()
-
-#include_directories(AFTER ${GEOTIFF_INCLUDE_DIRS} ${TIFF_INCLUDE_DIRS})
-
 include_directories(${CMAKE_CURRENT_SOURCE_DIR})
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/gdal)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ossim)
@@ -58,12 +36,19 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ossim)
 file(GLOB_RECURSE ossimplugins_gdal_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/gdal/*.cpp")
 file(GLOB_RECURSE ossimplugins_ossim_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/ossim/*.cpp")
 
+if(NOT WIN32)
+  list(REMOVE_ITEM
+    ossimplugins_ossim_SRCS
+    "${CMAKE_CURRENT_SOURCE_DIR}/ossim/ossimWin32FindFileHandle.cpp"
+    )
+endif()
+
 set(ossimplugins_SOURCES
   ${ossimplugins_gdal_SRCS}
   ${ossimplugins_ossim_SRCS}
 )
 
-add_library(otbossimplugins ${ossimplugins_LIBTYPE} ${ossimplugins_SOURCES})
+add_library(otbossimplugins SHARED ${ossimplugins_SOURCES})
 target_link_libraries(otbossimplugins
   ${OTBBoost_LIBRARIES}
   ${OTBGDAL_LIBRARIES}
@@ -76,6 +61,12 @@ if(OTB_LIBRARY_PROPERTIES)
   set_target_properties(otbossimplugins PROPERTIES ${OTB_LIBRARY_PROPERTIES})
 endif(OTB_LIBRARY_PROPERTIES)
 
+if(MSVC)
+  set_target_properties(otbossimplugins PROPERTIES COMPILE_FLAGS "/DOSSIMPLUGINSMAKINGDLL")
+elseif(MINGW)
+  set_target_properties(otbossimplugins PROPERTIES COMPILE_FLAGS "-DOSSIMPLUGINSMAKINGDLL")
+endif()
+
 install(TARGETS otbossimplugins
   EXPORT ${OTB3P_INSTALL_EXPORT_NAME}
   RUNTIME DESTINATION ${OTB3P_INSTALL_RUNTIME_DIR} COMPONENT RuntimeLibraries
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarData.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarData.cpp
index 9743e90..3d1a8d1 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarData.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarData.cpp
@@ -159,7 +159,7 @@ bool AlosPalsarData::saveState(ossimKeywordlist& kwl,
   if (datafiledesc != NULL)
   {
     kwl.add(prefix, "pulse_repetition_frequency", signalData->get_pulse_repetition_frequency(), true);
-    // slant range to 1st data sample in metres
+    // slant range to 1st data sample in meters
     kwl.add(prefix, "slant_range_to_1st_data_sample", signalData->get_slant_range_to_1st_data_sample(), true);
   }
   else
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataFileDescriptor.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataFileDescriptor.h
index 9129389..abdab0f 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataFileDescriptor.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataFileDescriptor.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarDataFileDescriptor();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataSetSummary.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataSetSummary.h
index b06907e..ed806f7 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataSetSummary.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarDataSetSummary.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarDataSetSummary();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFacilityData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFacilityData.h
index 3f6ae18..fdc447b 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFacilityData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFacilityData.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarFacilityData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFileDescriptor.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFileDescriptor.h
index 8827dda..40f4a8b 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFileDescriptor.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarFileDescriptor.h
@@ -62,7 +62,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarFileDescriptor();
   };
@@ -165,7 +165,7 @@ public:
     return _seq_loc;
   };
   /**
-   * @brief Sequence number lenght
+   * @brief Sequence number length
    */
   int   get_seq_len() const
   {
@@ -200,7 +200,7 @@ public:
     return _rec_len;
   };
   /**
-   * @brief Record lenght location
+   * @brief Record length location
    */
   int get_rlen_loc() const
   {
@@ -623,7 +623,7 @@ protected:
    */
   int   _seq_loc;
   /**
-   * @brief Sequence number lenght
+   * @brief Sequence number length
    */
   int   _seq_len;
   /**
@@ -643,7 +643,7 @@ protected:
    */
   std::string _rec_len;
   /**
-   * @brief Record lenght location
+   * @brief Record length location
    */
   int _rlen_loc;
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarLeader.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarLeader.cpp
index 34ea4fa..5d8a3d6 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarLeader.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarLeader.cpp
@@ -73,7 +73,7 @@ std::istream& operator>>(std::istream& is, AlosPalsarLeader& data)
     }
     else
     {
-      AlosPalsarRecord* record = factory.Instanciate(header.get_rec_seq());
+      AlosPalsarRecord* record = factory.Instantiate(header.get_rec_seq());
       if (record != NULL)
       {
         record->Read(is);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarMapProjectionData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarMapProjectionData.h
index 1849373..0ea7d87 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarMapProjectionData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarMapProjectionData.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarMapProjectionData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarPlatformPositionData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarPlatformPositionData.h
index 17cd841..d003179 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarPlatformPositionData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarPlatformPositionData.h
@@ -62,7 +62,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarPlatformPositionData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRadiometricData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRadiometricData.h
index 2e4192c..3047642 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRadiometricData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRadiometricData.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarRadiometricData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecord.h
index fd40a02..c263ec5 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecord.h
@@ -45,7 +45,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  virtual AlosPalsarRecord* Instanciate() = 0;
+  virtual AlosPalsarRecord* Instantiate() = 0;
 
   /**
    * @brief This function is able to create a new instance of the class initialised with the data of the calling instance
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.cpp
index 4123dc4..5ad9cac 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.cpp
@@ -27,7 +27,7 @@ AlosPalsarRecordFactory::~AlosPalsarRecordFactory()
 {
 }
 
-AlosPalsarRecord* AlosPalsarRecordFactory::Instanciate(int id)
+AlosPalsarRecord* AlosPalsarRecordFactory::Instantiate(int id)
 {
   if (traceDebug())
   {
@@ -40,7 +40,7 @@ AlosPalsarRecord* AlosPalsarRecordFactory::Instanciate(int id)
   }
   else
   {
-    return record->Instanciate();
+    return record->Instantiate();
   }
 }
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.h
index 0e4818e..a38605c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarRecordFactory.h
@@ -45,10 +45,10 @@ public:
   void RegisterRecord(int id, AlosPalsarRecord * record);
 
   /**
-   * @brief Instanciate a new Record
-   * @param id Id of the Record we want to instanciate
+   * @brief Instantiate a new Record
+   * @param id Id of the Record we want to instantiate
    */
-  AlosPalsarRecord* Instanciate(int id) ;
+  AlosPalsarRecord* Instantiate(int id) ;
 protected:
 
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarSignalData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarSignalData.h
index 5b56043..39040ec 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarSignalData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/AlosPalsar/AlosPalsarSignalData.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  AlosPalsarRecord* Instanciate()
+  AlosPalsarRecord* Instantiate()
   {
     return new AlosPalsarSignalData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/AntennaElevationPatterns.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/AntennaElevationPatterns.h
index 36ac4fe..0599002 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/AntennaElevationPatterns.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/AntennaElevationPatterns.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new AntennaElevationPatterns();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/ChirpParameters.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/ChirpParameters.h
index ec8ac89..1fdad2b 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/ChirpParameters.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/ChirpParameters.h
@@ -57,7 +57,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new ChirpParameters();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/DopplerCentroidParameters.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/DopplerCentroidParameters.h
index 78053b3..10e045a 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/DopplerCentroidParameters.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/DopplerCentroidParameters.h
@@ -57,7 +57,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new DopplerCentroidParameters();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarData.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarData.cpp
index 1c466b3..4729062 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarData.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarData.cpp
@@ -57,12 +57,12 @@ std::istream& operator>>(std::istream& is, EnvisatAsarData& data)
 	data.ClearRecords();
 
 	// read the first record (MPH)
-	EnvisatAsarRecord* mph_record = factory.Instanciate("MPH");
+	EnvisatAsarRecord* mph_record = factory.Instantiate("MPH");
 	mph_record->Read(is);
 	data._records.push_back(mph_record);
 
 	// read the second record (sph) and update it with the mph (number of dsd)
-	EnvisatAsarRecord* sph_record = factory.Instanciate("SPH");
+	EnvisatAsarRecord* sph_record = factory.Instantiate("SPH");
 	((sph*)sph_record)->update_sph_from_mph(*((mph *)mph_record));
 	sph_record->Read(is);
 	data._records.push_back(sph_record);
@@ -70,7 +70,7 @@ std::istream& operator>>(std::istream& is, EnvisatAsarData& data)
 	std::vector<dsd> dsd_vector = ((sph*)sph_record)->get_dsd_vector();
 
 	// For each dsd, check if present in the file and in the record factory.
-	// If true, instanciate it and add to the EnvisatAsarRecord list.
+	// If true, instantiate it and add to the EnvisatAsarRecord list.
 	std::vector<dsd>::iterator it = dsd_vector.begin();
 	while(it != dsd_vector.end())
 	{
@@ -80,7 +80,7 @@ std::istream& operator>>(std::istream& is, EnvisatAsarData& data)
 		{
 			for (int i = 0; i<(it->get_num_dsr()); i++)
 			{
-				EnvisatAsarRecord* record = factory.Instanciate(str);
+				EnvisatAsarRecord* record = factory.Instantiate(str);
 				if (record != NULL)
 				{
 					is.seekg((std::streampos)(it->get_ds_offset())+ (std::streampos)(i*(it->get_dsr_size())));
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecord.h
index 5edc646..d945f0c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecord.h
@@ -48,7 +48,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  virtual EnvisatAsarRecord* Instanciate() =0;
+  virtual EnvisatAsarRecord* Instantiate() =0;
 
   /**
    * @brief This function is able to create a new instance of the class initialised with the data of the calling instance
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.cpp
index f4d0bce..7789136 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.cpp
@@ -21,7 +21,7 @@ EnvisatAsarRecordFactory::~EnvisatAsarRecordFactory()
 {
 }
 
-EnvisatAsarRecord* EnvisatAsarRecordFactory::Instanciate(std::string id)
+EnvisatAsarRecord* EnvisatAsarRecordFactory::Instantiate(std::string id)
 {
 	EnvisatAsarRecord* record = _availableRecords[id];
 	if(record == NULL)
@@ -30,7 +30,7 @@ EnvisatAsarRecord* EnvisatAsarRecordFactory::Instanciate(std::string id)
 	}
 	else
 	{
-		return record->Instanciate();
+		return record->Instantiate();
 	}
 }
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.h
index be93dc9..8b2b21c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/EnvisatAsarRecordFactory.h
@@ -44,9 +44,9 @@ public:
 
   /**
    * @brief Instanciatse a new Record
-   * @param id Id of the Record we want to instanciate
+   * @param id Id of the Record we want to instantiate
    */
-  EnvisatAsarRecord* Instanciate(std::string id);
+  EnvisatAsarRecord* Instantiate(std::string id);
 
 protected:
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/GeolocationGrid.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/GeolocationGrid.h
index cfa4099..cc99ba4 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/GeolocationGrid.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/GeolocationGrid.h
@@ -57,7 +57,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new GeolocationGrid();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/MainProcessingParameters.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/MainProcessingParameters.h
index 493eb09..fcc6dfc 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/MainProcessingParameters.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/MainProcessingParameters.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new MainProcessingParameters();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SQ_ADSR.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SQ_ADSR.h
index 5b449c9..12251b7 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SQ_ADSR.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SQ_ADSR.h
@@ -57,7 +57,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new SQ_ADSR();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SRGRConversionParameters.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SRGRConversionParameters.h
index f507cd6..dd9501a 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SRGRConversionParameters.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/SRGRConversionParameters.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new SRGRConversionParameters();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/dsd.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/dsd.h
index 3ad04a1..1b6fe0e 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/dsd.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/dsd.h
@@ -57,7 +57,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new dsd();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.cpp
index 2d2da14..885b29a 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.cpp
@@ -225,8 +225,9 @@ namespace ossimplugins
       buf3[3] = '\0';
       char buf2[3];
       buf2[2] = '\0';
-      char buf1[1];
+      char buf1[2];
       buf1[0] = '\0';
+      buf1[1] = '\0';
 
       is.read(buf8,8);
       data._product_name = buf8;
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.h
index fd021e3..a3806d9 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/mph.h
@@ -21,6 +21,7 @@ namespace ossimplugins
 /**
  * @ingroup mphRecord
  * @brief This class is able to read the ASAR mph record of the leader file
+ * \todo Use the default generated copy- and move-constructors and assignment-operators
  */
 class mph : public EnvisatAsarRecord
 {
@@ -58,7 +59,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new mph();
   };
@@ -90,567 +91,567 @@ public:
   /**
   * @brief product_name
   */
-  std::string   get_product_name()
+  std::string const& get_product_name() const
   {
     return _product_name;
   };
   /**
   * @brief product
   */
-  std::string   get_product()
+  std::string const& get_product() const
   {
     return _product;
   };
   /**
   * @brief proc_stage_title
   */
-  std::string   get_proc_stage_title()
+  std::string const& get_proc_stage_title() const
   {
     return _proc_stage_title;
   };
   /**
   * @brief proc_stage
   */
-  std::string   get_proc_stage()
+  std::string const& get_proc_stage() const
   {
     return _proc_stage;
   };
   /**
   * @brief ref_doc_title
   */
-  std::string   get_ref_doc_title()
+  std::string const& get_ref_doc_title() const
   {
     return _ref_doc_title;
   };
   /**
   * @brief ref_doc
   */
-  std::string   get_ref_doc()
+  std::string const& get_ref_doc() const
   {
     return _ref_doc;
   };
   /**
   * @brief acq_stat_id_title
   */
-  std::string   get_acq_stat_id_title()
+  std::string const& get_acq_stat_id_title() const
   {
     return _acq_stat_id_title;
   };
   /**
   * @brief acq_station
   */
-  std::string   get_acq_station()
+  std::string const& get_acq_station() const
   {
     return _acq_station;
   };
   /**
   * @brief proc_center_title
   */
-  std::string   get_proc_center_title()
+  std::string const& get_proc_center_title() const
   {
     return _proc_center_title;
   };
   /**
   * @brief proc_center
   */
-  std::string   get_proc_center()
+  std::string const& get_proc_center() const
   {
     return _proc_center;
   };
   /**
   * @brief proc_time_title
   */
-  std::string   get_proc_time_title()
+  std::string const& get_proc_time_title() const
   {
     return _proc_time_title;
   };
   /**
   * @brief proc_time
   */
-  std::string   get_proc_time()
+  std::string const& get_proc_time() const
   {
     return _proc_time;
   };
   /**
   * @brief soft_version_title
   */
-  std::string   get_soft_version_title()
+  std::string const& get_soft_version_title() const
   {
     return _soft_version_title;
   };
   /**
   * @brief soft_version
   */
-  std::string   get_soft_version()
+  std::string const& get_soft_version() const
   {
     return _soft_version;
   };
   /**
   * @brief sensing_start_title
   */
-  std::string   get_sensing_start_title()
+  std::string const& get_sensing_start_title() const
   {
     return _sensing_start_title;
   };
   /**
   * @brief sensing_start
   */
-  std::string   get_sensing_start()
+  std::string const& get_sensing_start() const
   {
     return _sensing_start;
   };
   /**
   * @brief sensing_stop_title
   */
-  std::string   get_sensing_stop_title()
+  std::string const& get_sensing_stop_title() const
   {
     return _sensing_stop_title;
   };
   /**
   * @brief sensing_stop
   */
-  std::string   get_sensing_stop()
+  std::string const& get_sensing_stop() const
   {
     return _sensing_stop;
   };
   /**
   * @brief phase_title
   */
-  std::string   get_phase_title()
+  std::string const& get_phase_title() const
   {
     return _phase_title;
   };
   /**
   * @brief phase
   */
-  std::string   get_phase()
+  std::string const& get_phase() const
   {
     return _phase;
   };
   /**
   * @brief cycle_title
   */
-  std::string   get_cycle_title()
+  std::string const& get_cycle_title() const
   {
     return _cycle_title;
   };
   /**
   * @brief cycle
   */
-  std::string   get_cycle()
+  std::string const& get_cycle() const
   {
     return _cycle;
   };
   /**
   * @brief relative_orbit_title
   */
-  std::string   get_relative_orbit_title()
+  std::string const& get_relative_orbit_title() const
   {
     return _relative_orbit_title;
   };
   /**
   * @brief rel_orbit
   */
-  std::string   get_rel_orbit()
+  std::string const& get_rel_orbit() const
   {
     return _rel_orbit;
   };
   /**
   * @brief absolute_orbit_title
   */
-  std::string   get_absolute_orbit_title()
+  std::string const& get_absolute_orbit_title() const
   {
     return _absolute_orbit_title;
   };
   /**
   * @brief abs_orbit
   */
-  std::string   get_abs_orbit()
+  std::string const& get_abs_orbit() const
   {
     return _abs_orbit;
   };
   /**
   * @brief state_vector_time_title
   */
-  std::string   get_state_vector_time_title()
+  std::string const& get_state_vector_time_title() const
   {
     return _state_vector_time_title;
   };
   /**
   * @brief state_vector_time
   */
-  std::string   get_state_vector_time()
+  std::string const& get_state_vector_time() const
   {
     return _state_vector_time;
   };
   /**
   * @brief delta_ut1_title
   */
-  std::string   get_delta_ut1_title()
+  std::string const& get_delta_ut1_title() const
   {
     return _delta_ut1_title;
   };
   /**
   * @brief delta_ut1
   */
-  std::string   get_delta_ut1()
+  std::string const& get_delta_ut1() const
   {
     return _delta_ut1;
   };
   /**
   * @brief delta_ut1_units
   */
-  std::string   get_delta_ut1_units()
+  std::string const& get_delta_ut1_units() const
   {
     return _delta_ut1_units;
   };
   /**
   * @brief x_position_title
   */
-  std::string   get_x_position_title()
+  std::string const& get_x_position_title() const
   {
     return _x_position_title;
   };
   /**
   * @brief x_position
   */
-  std::string   get_x_position()
+  std::string const& get_x_position() const
   {
     return _x_position;
   };
   /**
   * @brief x_position_units
   */
-  std::string   get_x_position_units()
+  std::string const& get_x_position_units() const
   {
     return _x_position_units;
   };
   /**
   * @brief y_position_title
   */
-  std::string   get_y_position_title()
+  std::string const& get_y_position_title() const
   {
     return _y_position_title;
   };
   /**
   * @brief y_position
   */
-  std::string   get_y_position()
+  std::string const& get_y_position() const
   {
     return _y_position;
   };
   /**
   * @brief y_position_units
   */
-  std::string   get_y_position_units()
+  std::string const& get_y_position_units() const
   {
     return _y_position_units;
   };
   /**
   * @brief z_position_title
   */
-  std::string   get_z_position_title()
+  std::string const& get_z_position_title() const
   {
     return _z_position_title;
   };
   /**
   * @brief z_position
   */
-  std::string   get_z_position()
+  std::string const& get_z_position() const
   {
     return _z_position;
   };
   /**
   * @brief z_position_units
   */
-  std::string   get_z_position_units()
+  std::string const& get_z_position_units() const
   {
     return _z_position_units;
   };
   /**
   * @brief x_velocity_title
   */
-  std::string   get_x_velocity_title()
+  std::string const& get_x_velocity_title() const
   {
     return _x_velocity_title;
   };
   /**
   * @brief x_velocity
   */
-  std::string   get_x_velocity()
+  std::string const& get_x_velocity() const
   {
     return _x_velocity;
   };
   /**
   * @brief x_velocity_units
   */
-  std::string   get_x_velocity_units()
+  std::string const& get_x_velocity_units() const
   {
     return _x_velocity_units;
   };
   /**
   * @brief y_velocity_title
   */
-  std::string   get_y_velocity_title()
+  std::string const& get_y_velocity_title() const
   {
     return _y_velocity_title;
   };
   /**
   * @brief y_velocity
   */
-  std::string   get_y_velocity()
+  std::string const& get_y_velocity() const
   {
     return _y_velocity;
   };
   /**
   * @brief y_velocity_units
   */
-  std::string   get_y_velocity_units()
+  std::string const& get_y_velocity_units() const
   {
     return _y_velocity_units;
   };
   /**
   * @brief z_velocity_title
   */
-  std::string   get_z_velocity_title()
+  std::string const& get_z_velocity_title() const
   {
     return _z_velocity_title;
   };
   /**
   * @brief z_velocity
   */
-  std::string   get_z_velocity()
+  std::string const& get_z_velocity() const
   {
     return _z_velocity;
   };
   /**
   * @brief z_velocity_units
   */
-  std::string   get_z_velocity_units()
+  std::string const& get_z_velocity_units() const
   {
     return _z_velocity_units;
   };
   /**
   * @brief vector_source_title
   */
-  std::string   get_vector_source_title()
+  std::string const& get_vector_source_title() const
   {
     return _vector_source_title;
   };
   /**
   * @brief vector_source
   */
-  std::string   get_vector_source()
+  std::string const& get_vector_source() const
   {
     return _vector_source;
   };
   /**
   * @brief spare_4
   */
-  std::string   get_spare_4()
+  std::string const& get_spare_4() const
   {
     return _spare_4;
   };
   /**
   * @brief utc_sbt_time_title
   */
-  std::string   get_utc_sbt_time_title()
+  std::string const& get_utc_sbt_time_title() const
   {
     return _utc_sbt_time_title;
   };
   /**
   * @brief utc_sbt_time
   */
-  std::string   get_utc_sbt_time()
+  std::string const& get_utc_sbt_time() const
   {
     return _utc_sbt_time;
   };
   /**
   * @brief sat_binary_time_title
   */
-  std::string   get_sat_binary_time_title()
+  std::string const& get_sat_binary_time_title() const
   {
     return _sat_binary_time_title;
   };
   /**
   * @brief sat_binary_time
   */
-  std::string   get_sat_binary_time()
+  std::string const& get_sat_binary_time() const
   {
     return _sat_binary_time;
   };
   /**
   * @brief clock_step_title
   */
-  std::string   get_clock_step_title()
+  std::string const& get_clock_step_title() const
   {
     return _clock_step_title;
   };
   /**
   * @brief clock_step
   */
-  std::string   get_clock_step()
+  std::string const& get_clock_step() const
   {
     return _clock_step;
   };
   /**
   * @brief clock_step_units
   */
-  std::string   get_clock_step_units()
+  std::string const& get_clock_step_units() const
   {
     return _clock_step_units;
   };
   /**
   * @brief leap_utc_title
   */
-  std::string   get_leap_utc_title()
+  std::string const& get_leap_utc_title() const
   {
     return _leap_utc_title;
   };
   /**
   * @brief leap_utc
   */
-  std::string   get_leap_utc()
+  std::string const& get_leap_utc() const
   {
     return _leap_utc;
   };
   /**
   * @brief leap_sign_title
   */
-  std::string   get_leap_sign_title()
+  std::string const& get_leap_sign_title() const
   {
     return _leap_sign_title;
   };
   /**
   * @brief leap_sign
   */
-  std::string   get_leap_sign()
+  std::string const& get_leap_sign() const
   {
     return _leap_sign;
   };
   /**
   * @brief leap_err_title
   */
-  std::string   get_leap_err_title()
+  std::string const& get_leap_err_title() const
   {
     return _leap_err_title;
   };
   /**
   * @brief leap_err
   */
-  std::string   get_leap_err()
+  std::string const& get_leap_err() const
   {
     return _leap_err;
   };
   /**
   * @brief product_err_title
   */
-  std::string   get_product_err_title()
+  std::string const& get_product_err_title() const
   {
     return _product_err_title;
   };
   /**
   * @brief product_err
   */
-  std::string   get_product_err()
+  std::string const& get_product_err() const
   {
     return _product_err;
   };
   /**
   * @brief total_size_title
   */
-  std::string   get_total_size_title()
+  std::string const& get_total_size_title() const
   {
     return _total_size_title;
   };
   /**
   * @brief tot_size
   */
-  std::string   get_tot_size()
+  std::string const& get_tot_size() const
   {
     return _tot_size;
   };
   /**
   * @brief total_size_units
   */
-  std::string   get_total_size_units()
+  std::string const& get_total_size_units() const
   {
     return _total_size_units;
   };
   /**
   * @brief sph_size_title
   */
-  std::string   get_sph_size_title()
+  std::string const& get_sph_size_title() const
   {
     return _sph_size_title;
   };
   /**
   * @brief sph_size
   */
-  std::string   get_sph_size()
+  std::string const& get_sph_size() const
   {
     return _sph_size;
   };
   /**
   * @brief sph_size_units
   */
-  std::string   get_sph_size_units()
+  std::string const& get_sph_size_units() const
   {
     return _sph_size_units;
   };
   /**
   * @brief number_of_dsd_title
   */
-  std::string   get_number_of_dsd_title()
+  std::string const& get_number_of_dsd_title() const
   {
     return _number_of_dsd_title;
   };
   /**
   * @brief num_dsd
   */
-  int   get_num_dsd()
+  int   get_num_dsd() const
   {
     return _num_dsd;
   };
   /**
   * @brief size_of_dsd_title
   */
-  std::string   get_size_of_dsd_title()
+  std::string const& get_size_of_dsd_title() const
   {
     return _size_of_dsd_title;
   };
   /**
   * @brief dsd_size
   */
-  int   get_dsd_size()
+  int   get_dsd_size() const
   {
     return _dsd_size;
   };
   /**
   * @brief size_of_dsd_units
   */
-  std::string   get_size_of_dsd_units()
+  std::string const& get_size_of_dsd_units() const
   {
     return _size_of_dsd_units;
   };
   /**
   * @brief number_of_ds_att_title
   */
-  std::string   get_number_of_ds_att_title()
+  std::string const& get_number_of_ds_att_title() const
   {
     return _number_of_ds_att_title;
   };
   /**
   * @brief num_data_sets
   */
-  int   get_num_data_sets()
+  int   get_num_data_sets() const
   {
     return _num_data_sets;
   };
   /**
   * @brief Check mph validity
   */
-  bool is_valid()
+  bool is_valid() const
   {
     if ((_product_name.compare("PRODUCT=") == 0) && (_number_of_dsd_title.compare("NUM_DSD=") == 0))
     {
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/sph.h b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/sph.h
index 66a621a..c2102ed 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/sph.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/EnvisatAsar/sph.h
@@ -64,7 +64,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  EnvisatAsarRecord* Instanciate()
+  EnvisatAsarRecord* Instantiate()
   {
     return new sph();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/AttitudeData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/AttitudeData.h
index 483f65e..0f9e32e 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/AttitudeData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/AttitudeData.h
@@ -60,7 +60,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new AttitudeData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataHistogramSignalData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataHistogramSignalData.h
index d57cbf4..f81d0c7 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataHistogramSignalData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataHistogramSignalData.h
@@ -59,7 +59,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new DataHistogramSignalData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataQuality.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataQuality.h
index a1575a7..b46c622 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataQuality.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataQuality.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new DataQuality();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataSetSummary.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataSetSummary.h
index 9d1f186..f74d340 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataSetSummary.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/DataSetSummary.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new DataSetSummary();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/FileDescriptor.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/FileDescriptor.h
index 90f123a..f465bcd 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/FileDescriptor.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/FileDescriptor.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new FileDescriptor();
   };
@@ -152,7 +152,7 @@ public:
     return _seq_loc;
   };
   /**
-   * @brief Sequence number lenght
+   * @brief Sequence number length
    */
   int   get_seq_len()
   {
@@ -187,7 +187,7 @@ public:
     return _rec_len;
   };
   /**
-   * @brief Record lenght location
+   * @brief Record length location
    */
   int get_rlen_loc()
   {
@@ -464,7 +464,7 @@ protected:
    */
   int   _seq_loc;
   /**
-   * @brief Sequence number lenght
+   * @brief Sequence number length
    */
   int   _seq_len;
   /**
@@ -484,7 +484,7 @@ protected:
    */
   std::string _rec_len;
   /**
-   * @brief Record lenght location
+   * @brief Record length location
    */
   int _rlen_loc;
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/ProcessingParameters.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/ProcessingParameters.h
index fea93d9..2b25b64 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/ProcessingParameters.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/ProcessingParameters.h
@@ -63,7 +63,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new ProcessingParameters();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricCompensationData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricCompensationData.h
index bab5650..3994ba0 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricCompensationData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricCompensationData.h
@@ -60,7 +60,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new RadiometricCompensationData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricData.h
index af3b46e..b8263a4 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/CommonRecord/RadiometricData.h
@@ -57,7 +57,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new RadiometricData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/Data.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/Data.cpp
index 32abbf5..04f9c05 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/Data.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/Data.cpp
@@ -76,7 +76,7 @@ std::istream& operator>>(std::istream& is, Data& data)
 		  {
 			if (header.get_rec_seq() == 1)
 			  { // ImageOptionsFileDescriptor
-			  RadarSatRecord* record = factory.Instanciate(header.get_rec_seq());
+			  RadarSatRecord* record = factory.Instantiate(header.get_rec_seq());
 			  if (record != NULL)
 				  {
 			    record->Read(is);
@@ -98,7 +98,7 @@ std::istream& operator>>(std::istream& is, Data& data)
 			else if ((header.get_rec_seq() == 2))
 			  { // First line ProcessedDataRecord
 				lineLength = header.get_length() ;
-				RadarSatRecord* record = factory.Instanciate(2);
+				RadarSatRecord* record = factory.Instantiate(2);
 				if (record != NULL)
 			  	{
 				  record->Read(is);
@@ -117,7 +117,7 @@ std::istream& operator>>(std::istream& is, Data& data)
 			  }
 			else if ((header.get_rec_seq() == (1+nbLin)))
 			  { // Last line ProcessedDataRecord
-			  RadarSatRecord* record = factory.Instanciate(2);
+			  RadarSatRecord* record = factory.Instantiate(2);
 				if (record != NULL)
 				  {
 				  record->Read(is);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ImageOptionsFileDescriptor.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ImageOptionsFileDescriptor.h
index 8b66907..42c4c6c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ImageOptionsFileDescriptor.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ImageOptionsFileDescriptor.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new ImageOptionsFileDescriptor();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ProcessedDataRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ProcessedDataRecord.h
index 0ac120e..3352e7c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ProcessedDataRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Data/ProcessedDataRecord.h
@@ -59,7 +59,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new ProcessedDataRecord();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/DataHistogramProcessedData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/DataHistogramProcessedData.h
index d4cd629..2703282 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/DataHistogramProcessedData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/DataHistogramProcessedData.h
@@ -62,7 +62,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new DataHistogramProcessedData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/Leader.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/Leader.cpp
index fab3149..ebf350c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/Leader.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/Leader.cpp
@@ -81,7 +81,7 @@ std::istream& operator>>(std::istream& is, Leader& data)
 		  RadarSatRecord* record;
 		  if ( (header.get_rec_seq() == 2) && (header.get_length() == 8960) )
 		    {
-		    record = factory.Instanciate(header.get_rec_seq() + 5); // case of SCN, SCW
+		    record = factory.Instantiate(header.get_rec_seq() + 5); // case of SCN, SCW
         if (record != NULL)
           {
           record->Read(is);
@@ -96,7 +96,7 @@ std::istream& operator>>(std::istream& is, Leader& data)
 		    }
 		  else
 		    {
-        record = factory.Instanciate(header.get_rec_seq());
+        record = factory.Instantiate(header.get_rec_seq());
         if (record != NULL)
           {
           record->Read(is);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/PlatformPositionData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/PlatformPositionData.h
index d78dd4e..58bcb2b 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/PlatformPositionData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Leader/PlatformPositionData.h
@@ -59,7 +59,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new PlatformPositionData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecord.h
index 1a31e01..b7723e3 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecord.h
@@ -44,7 +44,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  virtual RadarSatRecord* Instanciate() =0;
+  virtual RadarSatRecord* Instantiate() =0;
 
   /**
    * @brief This function is able to create a new instance of the class initialised with the data of the calling instance
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.cpp
index 887372b..7165896 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.cpp
@@ -21,7 +21,7 @@ RadarSatRecordFactory::~RadarSatRecordFactory()
 {
 }
 
-RadarSatRecord* RadarSatRecordFactory::Instanciate(int id)
+RadarSatRecord* RadarSatRecordFactory::Instantiate(int id)
 {
 	RadarSatRecord* record = _availableRecords[id];
 	if(record == NULL)
@@ -30,7 +30,7 @@ RadarSatRecord* RadarSatRecordFactory::Instanciate(int id)
 	}
 	else
 	{
-		return record->Instanciate();
+		return record->Instantiate();
 	}
 }
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.h
index 0be89d4..b19e04b 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/RadarSatRecordFactory.h
@@ -43,10 +43,10 @@ public:
   void RegisterRecord(int id, RadarSatRecord * record);
 
   /**
-   * @brief Instanciates a new Record
-   * @param id Id of the Record we want to instanciate
+   * @brief Instantiates a new Record
+   * @param id Id of the Record we want to instantiate
    */
-  RadarSatRecord* Instanciate(int id) ;
+  RadarSatRecord* Instantiate(int id) ;
 protected:
 
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Trailer/Trailer.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Trailer/Trailer.cpp
index 6d4b25e..d891ad5 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Trailer/Trailer.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/Trailer/Trailer.cpp
@@ -73,7 +73,7 @@ std::istream& operator>>(std::istream& is, Trailer& data)
     }
     else
     {
-      RadarSatRecord* record = factory.Instanciate(header.get_rec_seq());
+      RadarSatRecord* record = factory.Instantiate(header.get_rec_seq());
       if (record != NULL)
       {
         record->Read(is);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/FilePointerRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/FilePointerRecord.h
index 915f2be..0b9233d 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/FilePointerRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/FilePointerRecord.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new FilePointerRecord();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/TextRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/TextRecord.h
index 2403def..50ca20d 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/TextRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/TextRecord.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new TextRecord();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDescriptorRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDescriptorRecord.h
index eb12ebf..ec0e74d 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDescriptorRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDescriptorRecord.h
@@ -58,7 +58,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  RadarSatRecord* Instanciate()
+  RadarSatRecord* Instantiate()
   {
     return new VolumeDescriptorRecord();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDir.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDir.cpp
index 8c5e993..ea3de12 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDir.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/RadarSat/VolumeDir/VolumeDir.cpp
@@ -60,7 +60,7 @@ std::istream& operator>>(std::istream& is, VolumeDir& data)
     }
     else
     {
-      RadarSatRecord* record = factory.Instanciate(header.get_rec_seq());
+      RadarSatRecord* record = factory.Instantiate(header.get_rec_seq());
       if (record != NULL)
       {
         record->Read(is);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarDataSetSummary.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarDataSetSummary.h
index c72d691..6318d49 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarDataSetSummary.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarDataSetSummary.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  ErsSarRecord* Instanciate()
+  ErsSarRecord* Instantiate()
   {
     return new ErsSarDataSetSummary();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFacilityData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFacilityData.h
index 32ab4a9..6f8ddff 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFacilityData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFacilityData.h
@@ -61,7 +61,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  ErsSarRecord* Instanciate()
+  ErsSarRecord* Instantiate()
   {
     return new ErsSarFacilityData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFileDescriptor.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFileDescriptor.h
index ac937fa..70df143 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFileDescriptor.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarFileDescriptor.h
@@ -62,7 +62,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  ErsSarRecord* Instanciate()
+  ErsSarRecord* Instantiate()
   {
     return new ErsSarFileDescriptor();
   };
@@ -156,7 +156,7 @@ public:
     return _seq_loc;
   };
   /**
-   * @brief Sequence number lenght
+   * @brief Sequence number length
    */
   int   get_seq_len() const
   {
@@ -191,7 +191,7 @@ public:
     return _rec_len;
   };
   /**
-   * @brief Record lenght location
+   * @brief Record length location
    */
   int get_rlen_loc() const
   {
@@ -468,7 +468,7 @@ protected:
    */
   int   _seq_loc;
   /**
-   * @brief Sequence number lenght
+   * @brief Sequence number length
    */
   int   _seq_len;
   /**
@@ -488,7 +488,7 @@ protected:
    */
   std::string _rec_len;
   /**
-   * @brief Record lenght location
+   * @brief Record length location
    */
   int _rlen_loc;
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarLeader.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarLeader.cpp
index 3035bb6..e7062f6 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarLeader.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarLeader.cpp
@@ -74,7 +74,7 @@ std::istream& operator>>(std::istream& is, ErsSarLeader& data)
     }
     else
     {
-      ErsSarRecord* record = factory.Instanciate(header.get_rec_seq());
+      ErsSarRecord* record = factory.Instantiate(header.get_rec_seq());
       if (record != NULL)
       {
         record->Read(is);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarMapProjectionData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarMapProjectionData.h
index 3f1b695..fc95404 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarMapProjectionData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarMapProjectionData.h
@@ -62,7 +62,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  ErsSarRecord* Instanciate()
+  ErsSarRecord* Instantiate()
   {
     return new ErsSarMapProjectionData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarPlatformPositionData.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarPlatformPositionData.h
index af45563..b9fcd8a 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarPlatformPositionData.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarPlatformPositionData.h
@@ -62,7 +62,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  ErsSarRecord* Instanciate()
+  ErsSarRecord* Instantiate()
   {
     return new ErsSarPlatformPositionData();
   };
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecord.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecord.h
index ae5cf48..7efc7c4 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecord.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecord.h
@@ -45,7 +45,7 @@ public:
   /**
    * @brief This function is able to create a new instance of the class
    */
-  virtual ErsSarRecord* Instanciate() = 0;
+  virtual ErsSarRecord* Instantiate() = 0;
 
   /**
    * @brief This function is able to create a new instance of the class initialised with the data of the calling instance
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.cpp
index 9c77ddb..230ae1b 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.cpp
@@ -22,7 +22,7 @@ ErsSarRecordFactory::~ErsSarRecordFactory()
 {
 }
 
-ErsSarRecord* ErsSarRecordFactory::Instanciate(int id)
+ErsSarRecord* ErsSarRecordFactory::Instantiate(int id)
 {
   ErsSarRecord* record = _availableRecords[id];
   if (record == NULL)
@@ -31,7 +31,7 @@ ErsSarRecord* ErsSarRecordFactory::Instanciate(int id)
   }
   else
   {
-    return record->Instanciate();
+    return record->Instantiate();
   }
 }
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.h b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.h
index 2bdfb6c..0a1229c 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/erssar/ErsSarRecordFactory.h
@@ -48,10 +48,10 @@ public:
   void RegisterRecord(int id, ErsSarRecord * record);
 
   /**
-   * @brief Instanciate a new Record
-   * @param id Id of the Record we want to instanciate
+   * @brief Instantiate a new Record
+   * @param id Id of the Record we want to instantiate
    */
-  ErsSarRecord* Instanciate(int id) ;
+  ErsSarRecord* Instantiate(int id) ;
 protected:
 
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimEnvisatAsarModel.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimEnvisatAsarModel.cpp
index 0abfa4d..cf72110 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimEnvisatAsarModel.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimEnvisatAsarModel.cpp
@@ -120,10 +120,9 @@ namespace ossimplugins
       else
       {
          mph mph_rec;
-         dataFile >> mph_rec;
 
          // test if it is an ENVISAT Data file
-         if (mph_rec.is_valid())
+         if (dataFile >> mph_rec && mph_rec.is_valid())
          {
             if (traceDebug())
             {
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp
index eed6955..1fc67df 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp
@@ -44,6 +44,11 @@ static ossimTrace traceDebug = ossimTrace("ossimPluginProjectionFactory:debug");
 #include <ossimFormosatModel.h>
 #include <ossimFormosatDimapSupportData.h>
 
+#ifndef _WIN32
+#include <limits.h> //PATH_MAX
+#include <stdlib.h> //realpath
+ #include <errno.h>
+#endif
 namespace ossimplugins
 {
    bool ossimPluginProjectionFactory::initialized_;
@@ -115,24 +120,47 @@ namespace ossimplugins
       }
 
 ossimProjection* ossimPluginProjectionFactory::createProjection(
-   const ossimFilename& filename, ossim_uint32 /*entryIdx*/)const
+   const ossimFilename& file_name, ossim_uint32 /*entryIdx*/)const
 {
    static const char MODULE[] = "ossimPluginProjectionFactory::createProjection(ossimFilename& filename)";
    ossimRefPtr<ossimProjection> projection = 0;
    //traceDebug.setTraceFlag(true);
 
+#ifndef _WIN32
+   char real_path[PATH_MAX + 1];
+   char *ret_path = NULL;
+   ret_path = realpath(file_name, real_path);
+   if( ret_path == NULL)
+   {
+      if(traceExec())
+      {
+         ossimNotify(ossimNotifyLevel_FATAL)
+            << MODULE
+            << " error calling realpath(" << file_name << "). errno "
+            << strerror(errno) << std::endl;
+      }
+
+      return NULL;
+   }
+   const ossimFilename abs_file_name( real_path );
+#else
+   //GetFullPathName function is not thread safe. better use absolute path on windows
+   //https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963%28v=vs.85%29.aspx
+   const ossimFilename abs_file_name( file_name );
+#endif
+
    // TODO: use a type-list to simplify this chain factory.
 
    // Sentinel1
    if ( !projection )
    {
-      projection = doBuildProjection<ossimSentinel1Model>(filename);
+      projection = doBuildProjection<ossimSentinel1Model>(abs_file_name);
    }
 
    if ( !projection )
    {
 #if 1
-      projection = doBuildProjection<ossimRadarSat2Model>(filename);
+      projection = doBuildProjection<ossimRadarSat2Model>(abs_file_name);
 #else
       if(traceDebug())
       {
@@ -141,7 +169,7 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
       }
 
       ossimRefPtr<ossimRadarSat2Model> model = new ossimRadarSat2Model();
-      if ( model->open(filename) )
+      if ( model->open(abs_file_name) )
       {
          // Check if a coarse grid was generated, and use it instead:
          projection = model->getReplacementOcgModel().get();
@@ -160,7 +188,7 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
    // Pleiades
    if ( !projection )
    {
-      projection = doBuildProjection<ossimPleiadesModel>(filename);
+      projection = doBuildProjection<ossimPleiadesModel>(abs_file_name);
    }
 
    if ( !projection )
@@ -174,7 +202,7 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
 
       ossimRefPtr<ossimTerraSarModel> model = new ossimTerraSarModel();
 
-      if ( model->open(filename) )
+      if ( model->open(abs_file_name) )
       {
          // Check if a coarse grid was generated, and use it instead:
          projection = model->getReplacementOcgModel().get();
@@ -188,29 +216,29 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
          model = 0;
       }
 #else
-      projection = doBuildProjection<ossimTerraSarModel>(filename);
+      projection = doBuildProjection<ossimTerraSarModel>(abs_file_name);
 #endif
    }
 
    // ErsSar
    if ( !projection )
    {
-      projection = doBuildProjection<ossimErsSarModel>(filename);
+      projection = doBuildProjection<ossimErsSarModel>(abs_file_name);
    }
 
    if (!projection)
    {
-      projection = doBuildProjection<ossimEnvisatAsarModel>(filename);
+      projection = doBuildProjection<ossimEnvisatAsarModel>(abs_file_name);
    }
 
    if (!projection)
    {
-      projection = doBuildProjection<ossimRadarSatModel>(filename);
+      projection = doBuildProjection<ossimRadarSatModel>(abs_file_name);
    }
 
    if (!projection)
    {
-      projection = doBuildProjection<ossimAlosPalsarModel>(filename);
+      projection = doBuildProjection<ossimAlosPalsarModel>(abs_file_name);
    }
 
    if (!projection)
@@ -221,15 +249,15 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
             << MODULE << " DEBUG: testing ossimFormosatModel" << std::endl;
       }
 
-      ossimFilename formosatTest = filename;
+      ossimFilename formosatTest = abs_file_name;
       formosatTest = formosatTest.setExtension("geom");
       if(!formosatTest.exists())
       {
-         formosatTest = filename.path();
+         formosatTest = abs_file_name.path();
          formosatTest = formosatTest.dirCat(ossimFilename("METADATA.DIM"));
          if (formosatTest.exists() == false)
          {
-            formosatTest = filename.path();
+            formosatTest = abs_file_name.path();
             formosatTest = formosatTest.dirCat(ossimFilename("metadata.dim"));
          }
       }
@@ -251,13 +279,13 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
 
    if (!projection)
    {
-      projection = doBuildProjection<ossimTileMapModel>(filename);
+      projection = doBuildProjection<ossimTileMapModel>(abs_file_name);
    }
 
    // Spot6
    if ( !projection )
    {
-      projection = doBuildProjection<ossimSpot6Model>(filename);
+      projection = doBuildProjection<ossimSpot6Model>(abs_file_name);
    }
 
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimRadarSatModel.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimRadarSatModel.cpp
index dd9e2de..f5da490 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimRadarSatModel.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimRadarSatModel.cpp
@@ -224,7 +224,7 @@ bool ossimRadarSatModel::open(const ossimFilename& file)
       ossimNotify(ossimNotifyLevel_DEBUG) << "Begin reading VDF file" << std::endl;
       }
 
-    RadarSatRecord* recordVDF = factoryVDF.Instanciate(headerVDF.get_rec_seq());
+    RadarSatRecord* recordVDF = factoryVDF.Instantiate(headerVDF.get_rec_seq());
     if (recordVDF != NULL && headerVDF.get_rec_seq() == 1)
       {
       recordVDF->Read(volumeDirFile);
@@ -280,7 +280,7 @@ bool ossimRadarSatModel::open(const ossimFilename& file)
             ossimNotify(ossimNotifyLevel_DEBUG)<< "Begin reading DAT file" << std::endl;
             }
 
-          RadarSatRecord* recordDAT = factoryDAT.Instanciate(headerDAT.get_rec_seq());
+          RadarSatRecord* recordDAT = factoryDAT.Instantiate(headerDAT.get_rec_seq());
           if (recordDAT != NULL && headerDAT.get_rec_seq() == 1)
             {
             recordDAT->Read(dataFile);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp
index d904961..e59b428 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp
@@ -500,7 +500,7 @@ namespace ossimplugins
 
    bool ossimSarSensorModel::zeroDopplerLookup(const ossimEcefPoint & inputPt, TimeType & interpAzimuthTime, ossimEcefPoint & interpSensorPos, ossimEcefVector & interpSensorVel) const
    {
-      assert(!theOrbitRecords.size()<2&&"Orbit records vector contains less than 2 elements");
+      assert((theOrbitRecords.size()>=2) && "Orbit records vector contains less than 2 elements");
 
       std::vector<OrbitRecordType>::const_iterator it = theOrbitRecords.begin();
 
@@ -686,6 +686,7 @@ namespace ossimplugins
 
    bool ossimSarSensorModel::projToSurface(const GCPRecordType & initGcp, const ossimDpt & target, const ossimHgtRef & hgtRef, ossimEcefPoint & ellPt) const
    {
+     
       // Initialize current estimation
       ossimEcefPoint currentEstimation(initGcp.worldPt);
 
@@ -731,7 +732,7 @@ namespace ossimplugins
          ossimEcefVector p_fx, p_fy, p_fh,dx(d,0,0),dy(0,d,0),dz(0,0,d);
          ossimDpt tmpImPt;
 
-         ossim_float64 rdx,rdy,rdz, fdx,fdy,fdz;
+         ossim_float64 rdx(0.0),rdy(0.0),rdz(0.0), fdx(0.0),fdy(0.0),fdz(0.0);
 
          ossimGpt currentEstimationWorld(currentEstimation);
          ossimGpt tmpGpt = ossimGpt(currentEstimation+dx);
@@ -766,13 +767,13 @@ namespace ossimplugins
          // Invert system
          try {
             dR = B.i() * F;
-#if !(defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER) || defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__))
          } catch (NEWMAT::SingularException const& e) {
-            // NEWMATH exception
-            throw std::runtime_error(e.what());
-#endif
-         } catch (...) {
-            throw std::runtime_error("Cannot invert 3x3 matrix in projToSurface");
+         ellPt = currentEstimation;
+         
+         ossimNotify(ossimNotifyLevel_WARN) <<"ossim::SarSensorModel::projToSurface(): singular matrix can not be inverted. Returning best estimation so far ("<<ellPt<<") for output point ("<<target<<")\n";
+         std::clog << "initGCP: " << initGcp.imPt <<", "<<initGcp.worldPt<< "\n";
+         
+         return true;
          }
 
          // Update estimate
@@ -952,7 +953,7 @@ namespace ossimplugins
          }
       }
 
-      theAzimuthTimeOffset = cumulAzimuthTime /= count;
+      theAzimuthTimeOffset = count > 0 ? cumulAzimuthTime / count : DurationType(0);
 
       // Then, fix the range time
       count=0;
@@ -973,7 +974,7 @@ namespace ossimplugins
          }
       }
 
-      theRangeTimeOffset = cumulRangeTime/=count;
+      theRangeTimeOffset = count > 0 ? cumulRangeTime/count : 0;
    }
 
    void get(
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.h
index 9aa84b3..2c113c8 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.h
@@ -224,7 +224,7 @@ public:
     * \param[in] worldPoint World point to geocode
     * \param[out] azimuthTime Estimated zero-doppler azimuth time
     * \param[out] rangeTime Estimated range time
-    * \return True if sucess, false otherwise. In this case,
+    * \return True if success, false otherwise. In this case,
     * azimuthTime and rangeTime will not be modified.
     */
    /*virtual*/ bool worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeType & azimuthTime, double & rangeTime) const;
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
index 7c56839..acfecf8 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
@@ -20,6 +20,10 @@
 #include <iostream>
 #include <cassert>
 
+#if defined(_MSC_VER)
+#include "ossimWin32FindFileHandle.h"
+#endif
+
 #if defined(USE_BOOST_TIME)
             using boost::posix_time::microseconds;
             using boost::posix_time::seconds;
@@ -158,11 +162,18 @@ namespace ossimplugins
 
    ossimFilename ossimSentinel1Model::searchManifestFile(const ossimFilename& file) const
    {
+
+      #ifndef _WIN32
       const ossimFilename manifestFile = ossimFilename(file.path().path() + "/manifest.safe");
+      #else
+      const ossimFilename manifestFile = ossimFilename(file.path().path() + "\\manifest.safe");
+      #endif
 
       if(!manifestFile.exists())
       {
-         ossimNotify(ossimNotifyLevel_WARN) << "manifest.safe " << manifestFile << " doesn't exist...\n";
+         if (traceDebug()) {
+            ossimNotify(ossimNotifyLevel_DEBUG) << " manifest.safe " << manifestFile << " doesn't exist...\n";
+         }
          return "";
       }
       return manifestFile;
@@ -181,88 +192,121 @@ namespace ossimplugins
       {
          return false;
       }
-      else
+
+      theGSD.makeNan();
+
+      // -----[ Read manifest file
+      const ossimFilename safeFile = searchManifestFile(file);
+
+      if ( !safeFile.empty() )
       {
-         theGSD.makeNan();
 
-         // -----[ Read manifest file
-         const ossimFilename safeFile = searchManifestFile(file);
          theManifestDirectory = safeFile.path();
-         if (!safeFile.empty())
-         {
-            if ( !this->isSentinel1(safeFile))
-            {
-               ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Not a Sentinel 1 manifest file " << safeFile << "\n";
-               return false;
-            }
-            ossimXmlDocument manifestDoc;
-            if (!manifestDoc.openFile(safeFile))
-            {
-               ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Invalid Manifest file " << safeFile << "\n";
-               return false;
-            }
-            ossimNotify(ossimNotifyLevel_DEBUG) << MODULE << "Manifest file " << safeFile << " opened\n";
-
-            theImageID = getImageId(manifestDoc);
-            if (theImageID.empty()) {
-               ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Image ID not found in manifest file " << safeFile << "\n";
-               return false;
-            }
 
-            if (! standAloneProductInformation(manifestDoc))  {
-               ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Cannot load product information from " << safeFile << "\n";
-               return false;
-            }
+         if ( !this->isSentinel1(safeFile)) {
+            ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Not a Sentinel 1 manifest file " << safeFile << "\n";
+            return false;
+         }
 
-            theSensorID = initSensorID(manifestDoc);
-            if (theSensorID.empty()) {
-               ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Cannot load sensor ID from " << safeFile << "\n";
-               return false;
-            }
+         ossimXmlDocument manifestDoc;
+         if (!manifestDoc.openFile(safeFile)) {
+            ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Invalid Manifest file " << safeFile << "\n";
+            return false;
          }
 
-         // -----[ Read product file
-         ossimFilename xmlFileName = file;
+         if (traceDebug()) {
+            ossimNotify(ossimNotifyLevel_DEBUG) << MODULE << "Manifest file " << safeFile << " opened\n";
+         }
 
-         // If this is tiff file, look for corresponding annotation file
-         if(ext != "xml")
-           {
-           const ossimFilename fileNameWihtoutExtension = file.fileNoExtension();
-           const ossimFilename path = file.path().path();
-           xmlFileName = ossimFilename(path+"/annotation/"+fileNameWihtoutExtension+".xml");
-           }
+         theImageID = getImageId(manifestDoc);
+         if (theImageID.empty()) {
+            ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Image ID not found in manifest file " << safeFile << "\n";
+            return false;
+         }
 
-         if ( !xmlFileName.exists() || !this->readProduct(xmlFileName) )
-         {
-            ossimNotify(ossimNotifyLevel_FATAL) << MODULE << " this->readProduct( safeFile )\n";
+         if (! standAloneProductInformation(manifestDoc))  {
+            ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Cannot load product information from " << safeFile << "\n";
             return false;
          }
 
-         if ( !this->initImageSize( theImageSize ) )
-         {
-           ossimNotify(ossimNotifyLevel_FATAL) << MODULE << " this->initImageSize( theImageSize ) fails\n";
-           return false;
+         theSensorID = initSensorID(manifestDoc);
+         if (theSensorID.empty()) {
+            ossimNotify(ossimNotifyLevel_FATAL) << MODULE << "Cannot load sensor ID from " << safeFile << "\n";
+            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;
+
+      // If this is tiff file, look for corresponding annotation file
+      if(ext != "xml")
+      {
+         const ossimFilename fileNameWihtoutExtension = file.fileNoExtension();
+         const ossimFilename path = file.path().path();
+         xmlFileName = ossimFilename(path+"/annotation/"+fileNameWihtoutExtension+".xml");
+      }
+
+      if ( !xmlFileName.exists() || !this->readProduct(xmlFileName) )
+      {
+
+         /* Must be a FATAL error. Because when you reach here there are three possibilities.
+         1. manifest.safe file exists, but annotation xml does not
+         2. manifest.safe and annotation xmlexists, readProduct() returns false.
+         3. manifest.safe does not exists and annotation file is not a valid S1
+            dataset. (case when loading a different product xml file (eg: terrasarx).
 
-         theImageClipRect = ossimDrect( 0, 0, theImageSize.x-1, theImageSize.y-1 );
-         theSubImageOffset.x = 0.0;
-         theSubImageOffset.y = 0.0;
+         All these cases should not go slient on error message. It must be FATAL errors.
 
-         // automatically loaded/saved into ossimSensorModel
-         theMeanGSD = (theGSD.x + theGSD.y)/2.0;
+         */
+
+         ossimNotify(ossimNotifyLevel_FATAL)
+            << MODULE
+            << " !xmlFileName.exists() || !this->readProduct(xmlFileName) fails \n";
+         return false;
+      }
+
+      if ( !this->initImageSize( theImageSize ) )
+      {
+         ossimNotify(ossimNotifyLevel_FATAL)
+            << MODULE
+            << " this->initImageSize( theImageSize ) fails \n";
+         return false;
+      }
+
+      theImageClipRect = ossimDrect( 0, 0, theImageSize.x-1, theImageSize.y-1 );
+      theSubImageOffset.x = 0.0;
+      theSubImageOffset.y = 0.0;
+
+      // automatically loaded/saved into ossimSensorModel
+      theMeanGSD = (theGSD.x + theGSD.y)/2.0;
 
 #if 0
-         if ( !this->initSRGR( ) )
-         {
+      if ( !this->initSRGR( ) )
+      {
          ossimNotify(ossimNotifyLevel_FATAL) << MODULE << " this->initSRGR( )\n";
          return false;
-         }
+      }
 #endif
 
-         // Commit the operation
-         theProductXmlFile = file;
-         return true;
-      }
+      // Commit the operation
+      theProductXmlFile = file;
+      return true;
+
    }
 
    ossimString const& ossimSentinel1Model::getImageId(ossimXmlDocument const& manifestDoc) const
@@ -285,6 +329,7 @@ namespace ossimplugins
                true);
          return familyName + instrumentId;
       }
+      throw std::runtime_error("Cannot obtain Sensor ID");
    }
 
 #if 0
@@ -504,21 +549,39 @@ namespace ossimplugins
 
    bool ossimSentinel1Model::checkDirectory(const ossimFilename& file, const char* d, const char* ext) const
    {
-      //check dir is valid first
-      ossimDirectory dir(file.path() + '/' + d + '/');
-      std::vector<ossimFilename> result;
-      dir.findAllFilesThatMatch(result, ext);
-      if ( result.empty() )
-      {
-         if (traceExec())
-         {
+    std::stringstream strm;
+    std::vector<ossimFilename> result;
+
+	#if defined(_WIN32)
+		const char pathsep = '\\';
+	#else
+		const char pathsep = '/';
+	#endif
+
+	#if defined(_MSC_VER)
+	strm << file.path() << pathsep << d << pathsep << "*" << ext;
+	ossimWin32FindFileHandle handle(strm.str());
+	if (handle.is_valid()) {
+	  do {
+		result.push_back(handle.crt_filename());
+	  } while (handle.next());
+	}
+	#else
+	strm << file.path() << pathsep << d << pathsep;
+    ossimDirectory dir( strm.str() );
+    dir.findAllFilesThatMatch(result, ext);
+	#endif
+
+    if ( result.empty() )
+    {
+		if (traceExec())
+        {
             ossimNotify(ossimNotifyLevel_FATAL)
-               << " DEBUG:" << " checkDirectory failed for: " << file.path()   << "/" << d << " with ext ="<< ext << "\n";
-         }
-         return false;
-      }
-
-      return true;
+            << " DEBUG:" << " checkDirectory failed for: " << strm.str() << " with ext ="<< ext << "\n";
+        }
+        return false;
+    }
+    return true;
    }
 
    bool ossimSentinel1Model::readProduct(const ossimFilename &productXmlFile)
@@ -556,6 +619,25 @@ namespace ossimplugins
       assert(productRoot.get());
 
       const ossimXmlNode & adsHeader = getExpectedFirstNode(*productRoot,attAdsHeader);
+      const ossimString missionId = getTextFromFirstNode(adsHeader, "missionId");
+
+      if( (missionId == "S1A" ) ||
+          (missionId == "S1B" ) ||
+          (missionId == "ASA" ) )
+      {
+         if (traceDebug())
+            ossimNotify(ossimNotifyLevel_DEBUG)
+               << "missionId from annotationXml is: '" << missionId << "'\n" ;
+      }
+      else
+      {
+         ossimNotify(ossimNotifyLevel_FATAL)
+            << "Not a valid sentinel1 annotation xml. missionId is: '"
+            << missionId << "'\n" ;
+         return false;
+         }
+
+
       const ossimString & polarisation = getTextFromFirstNode(adsHeader, "polarisation");
       const ossimString & productType  = getTextFromFirstNode(adsHeader, "productType");
       theProductType = ProductType(productType);
@@ -690,7 +772,7 @@ namespace ossimplugins
         }
       std::vector<ossimFilename>::const_iterator it = files.begin();
 
-      ossimNotify(ossimNotifyLevel_INFO) << files.size() << " calibration files found in " << theManifestDirectory << "\n";
+      ossimNotify(ossimNotifyLevel_DEBUG) << files.size() << " calibration files found in " << theManifestDirectory << "\n";
       std::stringstream strm;
       for (; it != files.end(); ++it)
       {
@@ -807,7 +889,7 @@ namespace ossimplugins
       productRoot.findChildNodes("swathTiming/burstList/burst",xnodes);
       if (xnodes.empty())
       {
-         // Appart from TopSAR products, there won't be any burst
+         // Apart from TopSAR products, there won't be any burst
          //records, so this warning is unnecessary
          //ossimNotify(ossimNotifyLevel_DEBUG) << "No burst records available in metadata!!\n";
          add(theProductKwl, BURST_NUMBER_KEY,                       ossimString("1"));
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSpot6DimapSupportData.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSpot6DimapSupportData.cpp
index d730421..997232d 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSpot6DimapSupportData.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSpot6DimapSupportData.cpp
@@ -1693,7 +1693,10 @@ namespace ossimplugins
       ossimString metadataProfile;
       if (  (nodeValue != "S6_SENSOR") 
             && (nodeValue != "S6_ORTHO") 
-            && (nodeValue != "S6_MOSAIC") ) 
+            && (nodeValue != "S6_MOSAIC")
+            && (nodeValue != "S7_SENSOR")
+            && (nodeValue != "S7_ORTHO")
+            && (nodeValue != "S7_MOSAIC") )
       {
          if (traceDebug())
          {
@@ -1717,7 +1720,7 @@ namespace ossimplugins
 
       if ((nodeValue == "PRODUCT")) 
          theMetadataSubProfile = OSSIM_Spot6_METADATA_SUBPROFILE_PRODUCT;
-      else if ( (nodeValue == "RPC") && (metadataProfile == "S6_SENSOR") ) 
+      else if ( (nodeValue == "RPC") && ((metadataProfile == "S6_SENSOR") || (metadataProfile == "S7_SENSOR")) )
          theMetadataSubProfile = OSSIM_Spot6_METADATA_SUBPROFILE_RPC;
       else
       {
@@ -2156,7 +2159,9 @@ namespace ossimplugins
       }
 
       if (nodeValue == "6")        
-         theSensorID = "SPOT 6";    
+         theSensorID = "SPOT 6";
+      else if (nodeValue == "7")
+         theSensorID = "SPOT 7";
       else
       {
          setErrorStatus();
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimStringUtilities.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimStringUtilities.h
index 457489b..d5021d9 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimStringUtilities.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimStringUtilities.h
@@ -111,19 +111,19 @@ public:
    // typedef std::reverse_iterator<char_iterator> reverse_iterator;
    typedef std::reverse_iterator<char_iterator> const_reverse_iterator;
 
-   /** Construtor from a standard string.
+   /** Constructor from a standard string.
     *@post `data()[size()] == '\0'`
     */
    string_view(std::string const& s)
       : m_size(s.size()), m_first(s.c_str())
       {}
-   /** Construtor from an ossim string.
+   /** Constructor from an ossim string.
     *@post `data()[size()] == '\0'`
     */
    string_view(ossimString const& s)
        : m_size(s.size()), m_first(s.c_str())
        {}
-   /** Construtor from an array of characters.
+   /** Constructor from an array of characters.
     * @post `data()[size()] == '\0'` <= the array is built with this kind of
     * syntax: `char const a[]="foobar";`
     */
@@ -131,7 +131,7 @@ public:
    string_view(char const (&array)[N])
       : m_size(N), m_first(&array[0])
       {}
-   /** Construtor from a pointer to a 0-terminated raw string.
+   /** Constructor from a pointer to a 0-terminated raw string.
     * @post `data()[size()] == '\0'`
     */
    string_view(char const* ptr)
@@ -144,7 +144,7 @@ public:
          assert(first <= last);
       }
 #endif
-   /** Construtor from an input iterator and a size.
+   /** Constructor from an input iterator and a size.
     * @post there is no guarantee `data()[size()] == '\0'`.
     */
    template <typename II>
@@ -152,7 +152,7 @@ public:
       : m_size(size_), m_first(first)
       {}
 
-   /** Construtor from a pair of input interators.
+   /** Constructor from a pair of input iterators.
     * @post there is no guarantee `data()[size()] == '\0'`.
     */
    template <typename II>
@@ -182,7 +182,7 @@ public:
    }
    template <typename String>
    bool belongs_to(String const& s) const{
-      return belongs_to(&*s.begin(), &*s.end());
+      return belongs_to(s.data(), s.data() + s.size());
    }
 
    size_type               size   () const { return m_size; }
@@ -496,7 +496,7 @@ part_range<splitter_on_delim> split_on(String const& str, char delim) {
  * \note For efficiency reasons, the function has been specialized for integral
  * floating point, and string types.
  * \note That alternative to `ossimString::toXxxx()` function has been defined
- * to support generic programing in `get()` and `add()` helper functions for
+ * to support generic programming in `get()` and `add()` helper functions for
  * keyword list.
  * \see `to_with_default()` for the version that never fails, but returns a
  * default value otherwise (being `T()` by default).
@@ -528,7 +528,7 @@ T to(string_view const& v, string_view const& context)
  * \note For efficiency reasons, the function has been specialized for integral
  * floating point, and string types.
  * \note That alternative to `ossimString::toXxxx()` function has been defined
- * to support generic programing in `get()` and `add()` helper functions for
+ * to support generic programming in `get()` and `add()` helper functions for
  * keyword list.
  * \see `to()` for the version that fails by throwing exceptions.
  */
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimTimeUtilities.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimTimeUtilities.h
index 715ed3a..f177bae 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimTimeUtilities.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimTimeUtilities.h
@@ -40,7 +40,7 @@ namespace ossimplugins { namespace time {
          /**@name Construction/destruction
          */
          //@{
-         /** Initialisation constructor.
+         /** Initialization constructor.
          */
          explicit DayFrac() {} // = default;
          explicit DayFrac(double day_frac) : m_day_frac(day_frac) {}
@@ -121,7 +121,7 @@ namespace ossimplugins { namespace time {
          /**@name Construction/destruction
          */
          //@{
-         /** Initialisation constructor.
+         /** Initialization constructor.
          */
          Duration() {} // = default;
          explicit Duration(double day_frac)
@@ -164,7 +164,7 @@ namespace ossimplugins { namespace time {
          /**@name Construction/destruction
          */
          //@{
-         /** Initialisation constructor.
+         /** Initialization constructor.
          */
          ModifiedJulianDate() {} // = default;
          explicit ModifiedJulianDate(double day_frac)
@@ -222,7 +222,7 @@ namespace boost { namespace posix_time {
          /**@name Construction/destruction
          */
          //@{
-         /** Initialisation constructor.
+         /** Initialization constructor.
          */
          precise_duration() {} // = default;
          explicit precise_duration(double usec_frac)
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimWin32FindFileHandle.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimWin32FindFileHandle.cpp
new file mode 100644
index 0000000..cc1209a
--- /dev/null
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimWin32FindFileHandle.cpp
@@ -0,0 +1,48 @@
+
+#include <cassert>
+#include "ossimStringUtilities.h"
+#include "ossimWin32FindFileHandle.h"
+
+namespace ossimplugins {
+
+ossimWin32FindFileHandle::ossimWin32FindFileHandle(std::string const& path)  
+{
+	memset(&m_search_data, 0, sizeof(WIN32_FIND_DATA));
+    m_h = FindFirstFile(path.c_str(), &m_search_data);
+    if (!is_valid() && (GetLastError() != ERROR_FILE_NOT_FOUND)) 
+	{
+		char err_msg[1024];
+    
+    s_printf(
+       err_msg,
+       "ossimSentinel1Model: cannot list files in directory '%s' : '%d'",
+       path.c_str(),
+       GetLastError()
+      );
+		throw std::runtime_error( err_msg );
+	}
+}
+
+bool ossimWin32FindFileHandle::is_valid() const 
+{ 
+	return m_h != INVALID_HANDLE_VALUE; 
+}
+
+ossimWin32FindFileHandle::~ossimWin32FindFileHandle() 
+{ 
+	if (is_valid())	
+		FindClose(m_h);  
+}
+
+bool ossimWin32FindFileHandle::next() 
+{
+	assert(is_valid());
+    return (FindNextFile(m_h, &m_search_data) == true);
+}
+
+std::string ossimWin32FindFileHandle::crt_filename() const 
+{ 
+return m_search_data.cFileName; 
+}
+
+}
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimWin32FindFileHandle.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimWin32FindFileHandle.h
new file mode 100644
index 0000000..62c5495
--- /dev/null
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimWin32FindFileHandle.h
@@ -0,0 +1,26 @@
+#ifndef ossimWin32FindFileHandle_HEADER
+#define ossimWin32FindFileHandle_HEADER
+
+#include <windows.h>
+#include <string>
+
+namespace ossimplugins {
+
+struct ossimWin32FindFileHandle {
+	explicit ossimWin32FindFileHandle(std::string const& path); 
+
+	bool is_valid() const;
+
+    ~ossimWin32FindFileHandle();
+
+    bool next();
+
+    std::string crt_filename() const;
+private:
+
+    HANDLE m_h;
+    WIN32_FIND_DATA m_search_data;
+};
+
+}
+#endif
\ No newline at end of file
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/CivilDateTime.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/CivilDateTime.h
index ed6ace0..2d55755 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/CivilDateTime.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/CivilDateTime.h
@@ -37,12 +37,12 @@ public:
    CivilDateTime();
 
    /**
-    * @brief Constructor with date and time initialisation
+    * @brief Constructor with date and time initialization
     */
    CivilDateTime(int year, int month, int day, int second, double decimal);
 
    /**
-    * @brief Constructor with date and time initialisation using an utc string
+    * @brief Constructor with date and time initialization using an utc string
     */
    CivilDateTime(char* Utc);
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/Equation.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/Equation.cpp
index f0bf02c..030e892 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/Equation.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/Equation.cpp
@@ -105,11 +105,11 @@ void Equation::Normalisation()
    */
   for (int i = 0 ; i < _trueDegree ; i++)
   {
-    float rr = abs(_coefficients[i]) ;
+    double rr = std::abs(_coefficients[i]) ;
     if (rr >= Epsilon)
     {
       rr = log10(rr) ;
-      e = ((int)rr) / ((int)(_trueDegree - i)) ;
+      e = static_cast<int>(rr) / static_cast<int>(_trueDegree - i) ;
       if (e > eMax)
         eMax = e ;
       if (e < eMin)
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/GMSTDateTime.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/GMSTDateTime.h
index ed813cc..ece8763 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/GMSTDateTime.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/GMSTDateTime.h
@@ -46,12 +46,12 @@ public:
   GMSTDateTime(const GMSTDateTime& rhs);
 
   /**
-   * @brief Constructor with date initialisation
+   * @brief Constructor with date initialization
    */
   GMSTDateTime(double tsm, Ori_TSM_Green origine);
 
   /**
-   * @brief Constructor with date initialisation using a CivilDateTime
+   * @brief Constructor with date initialization using a CivilDateTime
    */
   GMSTDateTime(CivilDateTime& rhs);
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.cpp
index a9894f8..f3fa192 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.cpp
@@ -65,7 +65,7 @@ JSDDateTime::JSDDateTime(MJDDateTime& rhs)
 {
   CivilDateTime referenceCiv;
 
-  /* Initialisation of the MJD reference day (01/01/2000, 0h00) */
+  /* Initialization of the MJD reference day (01/01/2000, 0h00) */
   referenceCiv.set_year(2000);
   referenceCiv.set_month(01);
   referenceCiv.set_day(01);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.h
index 2ab6645..6320c3d 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JSDDateTime.h
@@ -44,22 +44,22 @@ public:
    JSDDateTime(const JSDDateTime& rhs);
 
    /**
-    * @brief Constructor with date initialisation
+    * @brief Constructor with date initialization
     */
    JSDDateTime(JulianDate day0hTU, double second, double decimal);
 
    /**
-    * @brief Constructor with date initialisation using a CivilDateTime
+    * @brief Constructor with date initialization using a CivilDateTime
     */
    JSDDateTime(CivilDateTime& rhs);
 
    /**
-    * @brief Constructor with date initialisation using a CivilDateTime
+    * @brief Constructor with date initialization using a CivilDateTime
     */
    JSDDateTime(JulianDate& rhs);
 
    /**
-    * @brief Constructor with date initialisation using a MJDDateTime (Modified Julian Date - Used for ENVISAT)
+    * @brief Constructor with date initialization using a MJDDateTime (Modified Julian Date - Used for ENVISAT)
     */
    JSDDateTime(MJDDateTime& rhs);
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JulianDate.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JulianDate.h
index 8abdfb9..233e7b6 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JulianDate.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/JulianDate.h
@@ -41,16 +41,16 @@ public:
   JulianDate(const JulianDate& rhs);
 
   /**
-   * @brief Constructor with date initialisation using a CivilDateTime
+   * @brief Constructor with date initialization using a CivilDateTime
    */
   JulianDate(CivilDateTime& rhs);
 
   /**
-   * @brief Constructor with date initialisation using a JSDDateTime
+   * @brief Constructor with date initialization using a JSDDateTime
    */
   JulianDate(JSDDateTime& rhs);
   /**
-   * @brief Constructor with date initialisation
+   * @brief Constructor with date initialization
    */
   JulianDate(double julianDate);
   /**
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/MJDDateTime.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/MJDDateTime.h
index caa8def..379cc15 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/MJDDateTime.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/MJDDateTime.h
@@ -39,7 +39,7 @@ public:
   MJDDateTime(const MJDDateTime& rhs);
 
   /**
-   * @brief Constructor with date initialisation
+   * @brief Constructor with date initialization
    */
   MJDDateTime(long day, unsigned long  second, unsigned long  microsecond);
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.cpp
index 40fa1d6..9eb6597 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.cpp
@@ -1,275 +1,275 @@
-//----------------------------------------------------------------------------
-//
-// "Copyright Centre National d'Etudes Spatiales"
-//
-// License:  LGPL
-//
-// See LICENSE.txt file in the top level directory for more details.
-//
-//----------------------------------------------------------------------------
-// $Id$
-
-#include <iostream>
-#include <string>
-#include <cmath>
-#include <iomanip>
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#include <iostream>
+#include <string>
+#include <cmath>
+#include <iomanip>
 #include <vector>
-
-#include <otb/PlatformPosition.h>
-#include <otb/Ephemeris.h>
-#include <otb/HermiteInterpolator.h>
-#include <ossim/base/ossimKeywordlist.h>
-
-namespace ossimplugins
-{
-
-static const char NUMBER_PLATFORM_POSITIONS_KW[] = "platform_positions_count";
-
-PlatformPosition::PlatformPosition():
-   _nbrData(0),
-   _data(NULL),
-   _t(NULL),
-   _p(NULL),
-   _dp(NULL),
-   _interpolator(NULL)
-{
-}
-
-PlatformPosition::~PlatformPosition()
-{
-   Clear();
-      }
-
-void PlatformPosition::Clear()
-{
-   if(_data != NULL)
-   {
-      for (int i=0;i<_nbrData;i++)
-      {
-         delete _data[i];
-            }
-         delete [] _data;
-            }
-      _data = NULL;
-         _nbrData = 0;
-            
-            delete[] _t;
-               if ((_p != NULL) && (_dp != NULL)) {
-                  for (int j=0; j<3; ++j) {
-                     delete[] _p[j];
-                        delete[] _dp[j];
-                           delete _interpolator[j];
-                              }
-                     }
-                  delete[] _p;
-                     delete[] _dp;
-                        
-                        delete[] _interpolator;
-                           }
-
-PlatformPosition::PlatformPosition(const PlatformPosition& rhs)
-{
-   InitData(rhs._data, rhs._nbrData);
-      }
-
-PlatformPosition& PlatformPosition::operator=(const PlatformPosition& rhs)
-{
-   Clear();
-      InitData(rhs._data, rhs._nbrData);
-         return *this;
-            }
-
-PlatformPosition::PlatformPosition(Ephemeris** data, int nbrData)
-{
-   InitData(data, nbrData);
-      }
-
-void PlatformPosition::InitData(Ephemeris** data, int nbrData)
-{
-   _nbrData = nbrData;
-      _data = new Ephemeris*[_nbrData];
-         for (int i=0; i<_nbrData; i++)
-         {
-            _data[i] = data[i]->Clone();
-               }
-            InitAuxiliaryData();
-               }
-
-void PlatformPosition::InitAuxiliaryData()
-{
-   const double JOURCIVIL_LENGTH = 86400.0;
-      _t = new double[_nbrData];
-         _p = new double*[3];
-            _dp = new double*[3];
-               _interpolator = new HermiteInterpolator*[3];
-                  for (int j=0; j<3; ++j) {
-                     _p[j] = new double[_nbrData];
-                        _dp[j] = new double[_nbrData];
-                           }
-                     
-                     _t[0] = 0.0;
-                        for (int i = 1; i < _nbrData; i++)
-                        {
-                           _t[i] =   (_data[i]->get_date().get_day0hTU().get_julianDate() - _data[0]->get_date().get_day0hTU().get_julianDate())
-                              * JOURCIVIL_LENGTH
-                              + _data[i]->get_date().get_second() - _data[0]->get_date().get_second()
-                              + _data[i]->get_date().get_decimal() - _data[0]->get_date().get_decimal();
-                              }
-                           
-                           for (int j = 0; j < 3; j++)
-                           {
-                              for (int i = 0; i < _nbrData; i++)
-                              {
-                                 _p[j][i] = _data[i]->get_position()[j];
-                                    _dp[j][i] = _data[i]->get_speed()[j];
-                                       }
-                                 _interpolator[j] = new HermiteInterpolator(_nbrData, _t, _p[j], _dp[j]);
-                                    }
-                              
-                              }
-
-Ephemeris* PlatformPosition::Interpolate(JSDDateTime date) const
-{
-   const double JOURCIVIL_LENGTH = 86400.0;
-      Ephemeris* ephem = NULL;
-         if (_nbrData <= 1)
-         {
-            return NULL;
-               }
-            /*
-             * The first element of the list is cloned to ensure that the
-             * output ephemeris is expressed in the same coordinate system as
-             * input ones
-             */
-            ephem = _data[0]->Clone();
-               
-               /* NORMAL CASE */
-               /*------------*/
-               double dt = 0.0;
-                  
-                  if (ephem != NULL)
-                  {
-                     ephem->set_date(date);
-                        
-                        dt =  (date.get_day0hTU().get_julianDate()
-                               - _data[0]->get_date().get_day0hTU().get_julianDate())
-                           * JOURCIVIL_LENGTH
-                           + date.get_second() - _data[0]->get_date().get_second()
-                           + date.get_decimal() - _data[0]->get_date().get_decimal();
-                           
-                           /* Computation by Everett  */
-                           /*---------------------*/
-                           double pos[3];
-                              double speed[3];
-                                 for (int j = 0; j < 3; j++)
-                                 {
-                                    _interpolator[j]->Interpolate(dt, pos[j], speed[j]);
-                                       }
-                                    ephem->set_position(pos);
-                                       ephem->set_speed(speed);
-                                          }
-                     return ephem;
-                        }
-
-bool PlatformPosition::getPlatformPositionAtTime(JSDDateTime time, std::vector<double>& position, std::vector<double>& speed)
+
+#include <otb/PlatformPosition.h>
+#include <otb/Ephemeris.h>
+#include <otb/HermiteInterpolator.h>
+#include <ossim/base/ossimKeywordlist.h>
+
+namespace ossimplugins
 {
-   Ephemeris* ephemeris = this->Interpolate(time);
-   double* position_ptr = ephemeris->get_position();
-   double* speed_ptr = ephemeris->get_speed();
-   if (position.size() != 3) position.resize(3);
-   if (speed.size() != 3) speed.resize(3);
-   position[0] = position_ptr[0];
-   position[1] = position_ptr[1];
-   position[2] = position_ptr[2];
-   speed[0] = speed_ptr[0];
-   speed[1] = speed_ptr[1];
-   speed[2] = speed_ptr[2];
-   return true;
+
+   static const char NUMBER_PLATFORM_POSITIONS_KW[] = "platform_positions_count";
+
+   PlatformPosition::PlatformPosition():
+      _nbrData(0),
+      _data(NULL),
+      _t(NULL),
+      _p(NULL),
+      _dp(NULL),
+      _interpolator(NULL)
+   {
+   }
+
+   PlatformPosition::~PlatformPosition()
+   {
+      Clear();
+   }
+
+   void PlatformPosition::Clear()
+   {
+      if(_data != NULL)
+      {
+         for (int i=0;i<_nbrData;i++)
+         {
+            delete _data[i];
+         }
+         delete [] _data;
+      }
+      _data = NULL;
+      _nbrData = 0;
+            
+      delete[] _t;
+      if ((_p != NULL) && (_dp != NULL)) {
+         for (int j=0; j<3; ++j) {
+            delete[] _p[j];
+            delete[] _dp[j];
+            delete _interpolator[j];
+         }
+      }
+      delete[] _p;
+      delete[] _dp;
+                        
+      delete[] _interpolator;
+   }
+
+   PlatformPosition::PlatformPosition(const PlatformPosition& rhs)
+   {
+      InitData(rhs._data, rhs._nbrData);
+   }
+
+   PlatformPosition& PlatformPosition::operator=(const PlatformPosition& rhs)
+   {
+      Clear();
+      InitData(rhs._data, rhs._nbrData);
+      return *this;
+   }
+
+   PlatformPosition::PlatformPosition(Ephemeris** data, int nbrData)
+   {
+      InitData(data, nbrData);
+   }
+
+   void PlatformPosition::InitData(Ephemeris** data, int nbrData)
+   {
+      _nbrData = nbrData;
+      _data = new Ephemeris*[_nbrData];
+      for (int i=0; i<_nbrData; i++)
+      {
+         _data[i] = data[i]->Clone();
+      }
+      InitAuxiliaryData();
+   }
+
+   void PlatformPosition::InitAuxiliaryData()
+   {
+      const double JOURCIVIL_LENGTH = 86400.0;
+      _t = new double[_nbrData];
+      _p = new double*[3];
+      _dp = new double*[3];
+      _interpolator = new HermiteInterpolator*[3];
+      for (int j=0; j<3; ++j) {
+         _p[j] = new double[_nbrData];
+         _dp[j] = new double[_nbrData];
+      }
+                     
+      _t[0] = 0.0;
+      for (int i = 1; i < _nbrData; i++)
+      {
+         _t[i] =   (_data[i]->get_date().get_day0hTU().get_julianDate() - _data[0]->get_date().get_day0hTU().get_julianDate())
+            * JOURCIVIL_LENGTH
+            + _data[i]->get_date().get_second() - _data[0]->get_date().get_second()
+            + _data[i]->get_date().get_decimal() - _data[0]->get_date().get_decimal();
+      }
+                           
+      for (int j = 0; j < 3; j++)
+      {
+         for (int i = 0; i < _nbrData; i++)
+         {
+            _p[j][i] = _data[i]->get_position()[j];
+            _dp[j][i] = _data[i]->get_speed()[j];
+         }
+         _interpolator[j] = new HermiteInterpolator(_nbrData, _t, _p[j], _dp[j]);
+      }
+                              
+   }
+
+   Ephemeris* PlatformPosition::Interpolate(JSDDateTime date) const
+   {
+      const double JOURCIVIL_LENGTH = 86400.0;
+      Ephemeris* ephem = NULL;
+      if (_nbrData <= 1)
+      {
+         return NULL;
+      }
+      /*
+       * The first element of the list is cloned to ensure that the
+       * output ephemeris is expressed in the same coordinate system as
+       * input ones
+       */
+      ephem = _data[0]->Clone();
+               
+      /* NORMAL CASE */
+      /*------------*/
+      double dt = 0.0;
+                  
+      if (ephem != NULL)
+      {
+         ephem->set_date(date);
+                        
+         dt =  (date.get_day0hTU().get_julianDate()
+                - _data[0]->get_date().get_day0hTU().get_julianDate())
+            * JOURCIVIL_LENGTH
+            + date.get_second() - _data[0]->get_date().get_second()
+            + date.get_decimal() - _data[0]->get_date().get_decimal();
+                           
+         /* Computation by Everett  */
+         /*---------------------*/
+         double pos[3];
+         double speed[3];
+         for (int j = 0; j < 3; j++)
+         {
+            _interpolator[j]->Interpolate(dt, pos[j], speed[j]);
+         }
+         ephem->set_position(pos);
+         ephem->set_speed(speed);
+      }
+      return ephem;
+   }
+
+   bool PlatformPosition::getPlatformPositionAtTime(JSDDateTime time, std::vector<double>& position, std::vector<double>& speed)
+   {
+      Ephemeris* ephemeris = this->Interpolate(time);
+      double* position_ptr = ephemeris->get_position();
+      double* speed_ptr = ephemeris->get_speed();
+      if (position.size() != 3) position.resize(3);
+      if (speed.size() != 3) speed.resize(3);
+      position[0] = position_ptr[0];
+      position[1] = position_ptr[1];
+      position[2] = position_ptr[2];
+      speed[0] = speed_ptr[0];
+      speed[1] = speed_ptr[1];
+      speed[2] = speed_ptr[2];
+      return true;
+   }
+   
+
+   void PlatformPosition::setData(Ephemeris** data, int nbrData)
+   {
+      Clear();
+      InitData(data, nbrData);
+   }
+
+   Ephemeris* PlatformPosition::getData(int noData) const
+   {
+      if(noData >=0 && noData < _nbrData)
+      {
+         return _data[noData];
+      }
+      return NULL;
+   }
+
+   int PlatformPosition::getNbrData() const
+   {
+      return _nbrData;
+   }
+
+
+   bool PlatformPosition::saveState(ossimKeywordlist& kwl,
+                                    const char* prefix) const
+   {
+      kwl.add(prefix, NUMBER_PLATFORM_POSITIONS_KW, _nbrData);
+      
+      std::string s1;
+      if (prefix)
+      {
+         s1 = prefix;
+      }
+            
+      for (int i = 0; i < _nbrData; ++i)
+      {
+         std::string s2 = s1;
+         s2 += "platform_position[";
+         s2 += ossimString::toString(i).chars();
+         s2+= "]";
+         _data[i]->saveState(kwl, s2.c_str());
+      }
+               
+      return true;
+   }
+
+
+   bool PlatformPosition::loadState(const ossimKeywordlist& kwl,
+                                    const char* prefix)
+   {
+      bool result = true;
+      
+      Clear();
+         
+      const char* lookup = 0;
+      lookup = kwl.find(prefix, NUMBER_PLATFORM_POSITIONS_KW);
+      if (!lookup)
+      {
+         return false;
+      }
+      ossimString s = lookup;
+      _nbrData = s.toInt();
+                        
+      if (_nbrData)
+      {
+         std::string s1;
+         if (prefix)
+         {
+            s1 = prefix;
+         }
+                                 
+         _data = new  Ephemeris*[_nbrData];
+         for (int i = 0; i < _nbrData; ++i)
+         {
+            std::string s2 = s1;
+            s2 += "platform_position[";
+            s2 += ossimString::toString(i).chars();
+            s2+= "]";
+                                                   
+            _data[i] = new Ephemeris();
+            _data[i]->loadState(kwl, s2.c_str());
+         }
+      }
+      InitAuxiliaryData();
+      return result;
+   }
 }
-   
-
-void PlatformPosition::setData(Ephemeris** data, int nbrData)
-{
-   Clear();
-      InitData(data, nbrData);
-         }
-
-Ephemeris* PlatformPosition::getData(int noData) const
-{
-   if(noData >=0 && noData < _nbrData)
-   {
-      return _data[noData];
-         }
-      return NULL;
-         }
-
-int PlatformPosition::getNbrData() const
-{
-   return _nbrData;
-      }
-
-
-bool PlatformPosition::saveState(ossimKeywordlist& kwl,
-                                 const char* prefix) const
-{
-   kwl.add(prefix, NUMBER_PLATFORM_POSITIONS_KW, _nbrData);
-      
-      std::string s1;
-         if (prefix)
-         {
-            s1 = prefix;
-               }
-            
-            for (int i = 0; i < _nbrData; ++i)
-            {
-               std::string s2 = s1;
-                  s2 += "platform_position[";
-                     s2 += ossimString::toString(i).chars();
-                        s2+= "]";
-                           _data[i]->saveState(kwl, s2.c_str());
-                              }
-               
-               return true;
-                  }
-
-
-bool PlatformPosition::loadState(const ossimKeywordlist& kwl,
-                                 const char* prefix)
-{
-   bool result = true;
-      
-      Clear();
-         
-         const char* lookup = 0;
-            lookup = kwl.find(prefix, NUMBER_PLATFORM_POSITIONS_KW);
-               if (!lookup)
-               {
-                  return false;
-                     }
-                  ossimString s = lookup;
-                     _nbrData = s.toInt();
-                        
-                        if (_nbrData)
-                        {
-                           std::string s1;
-                              if (prefix)
-                              {
-                                 s1 = prefix;
-                                    }
-                                 
-                                 _data = new  Ephemeris*[_nbrData];
-                                    for (int i = 0; i < _nbrData; ++i)
-                                    {
-                                       std::string s2 = s1;
-                                          s2 += "platform_position[";
-                                             s2 += ossimString::toString(i).chars();
-                                                s2+= "]";
-                                                   
-                                                   _data[i] = new Ephemeris();
-                                                      _data[i]->loadState(kwl, s2.c_str());
-                                                         }
-                                       }
-                           InitAuxiliaryData();
-                              return result;
-                                 }
-}
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.h
index b43d436..11e6f66 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/PlatformPosition.h
@@ -47,7 +47,7 @@ namespace ossimplugins
       PlatformPosition(const PlatformPosition& rhs);
 
       /**
-       * @brief Constructor with initialisation
+       * @brief Constructor with initialization
        * @param data Ephemeris
        * @param nbrData Number of Ephemeris in data
        * @remarks All the ephemeris have to be in the same coordinates system
@@ -63,7 +63,7 @@ namespace ossimplugins
 
       /**
        * @brief This function interpolates its ephemeris to create a new ephemeris at the given date and time
-       * @param date Date and time at wich the interpolation have to be done
+       * @param date Date and time at which the interpolation have to be done
        * @return The ephemeris at the given date, or NULL if an error occurs
        */
       Ephemeris* Interpolate(JSDDateTime date) const;
@@ -71,7 +71,7 @@ namespace ossimplugins
 
       /**
        * @brief This function interpolates its ephemeris to create and extract platform's position and speed
-       * @param date Date and time at wich the interpolation have to be done
+       * @param date Date and time at which the interpolation have to be done
        * @return true, or false if an error occurs
        */
       bool getPlatformPositionAtTime(JSDDateTime time, std::vector<double>& position, std::vector<double>& speed);
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/RefPoint.h b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/RefPoint.h
index cfddad4..c476299 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/otb/RefPoint.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/otb/RefPoint.h
@@ -30,7 +30,7 @@ class OSSIM_PLUGINS_DLL RefPoint
 {
 public:
    /**
-    * @brief Constuctor
+    * @brief Constructor
     */
    RefPoint();
    /**
diff --git a/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt b/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt
index 9b9e2d4..f567480 100644
--- a/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt
+++ b/Modules/ThirdParty/OssimPlugins/test/CMakeLists.txt
@@ -5,12 +5,15 @@ otb_module_test()
 #include_directories(${PROJECT_SOURCE_DIR}/Modules/ThirdParty/OssimPlugins/src/ossim ${OSSIM_INCLUDE_DIR})
 #==== UT for utilities
 if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
-  add_executable(ossimStringUtilitiesTest ossimStringUtilitiesTest.cpp)
-  target_link_libraries(ossimStringUtilitiesTest
-    otbossimplugins
-    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
-  otb_module_target_label(ossimStringUtilitiesTest)
-  otb_add_test(NAME ossimStringUtilitiesTest COMMAND ossimStringUtilitiesTest )
+  #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
+     otbossimplugins
+     ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+   otb_module_target_label(ossimStringUtilitiesTest)
+   otb_add_test(NAME ossimStringUtilitiesTest COMMAND ossimStringUtilitiesTest )
+ endif()
 
   add_executable(ossimTimeUtilitiesTest ossimTimeUtilitiesTest.cpp)
   target_link_libraries(ossimTimeUtilitiesTest
diff --git a/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesBench.cpp b/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesBench.cpp
index 0b78218..b588e16 100644
--- a/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesBench.cpp
+++ b/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesBench.cpp
@@ -106,7 +106,7 @@ getModifiedJulianDate(ossimString const& utcTimeString)
    }
 
    /* Below method could replace all above split and convert. But there is a lot of
-      checks done in  ossimLocalTm::setIso8601( ) which slows us down. And I dont
+      checks done in  ossimLocalTm::setIso8601( ) which slows us down. And I don't
       want that. */
    /*
       ossimLocalTm otm;
diff --git a/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesTest.cpp b/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesTest.cpp
index 6e96512..fb0d820 100644
--- a/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesTest.cpp
+++ b/Modules/ThirdParty/OssimPlugins/test/ossimTimeUtilitiesTest.cpp
@@ -32,8 +32,6 @@
 #pragma GCC diagnostic pop
 #endif
 
-using namespace ossimplugins;
-
 double
 getModifiedJulianDate(ossimString const& utcTimeString)
 {
@@ -98,7 +96,7 @@ getModifiedJulianDate(ossimString const& utcTimeString)
    }
 
    /* Below method could replace all above split and convert. But there is a lot of
-      checks done in  ossimLocalTm::setIso8601( ) which slows us down. And I dont
+      checks done in  ossimLocalTm::setIso8601( ) which slows us down. And I don't
       want that. */
    /*
       ossimLocalTm otm;
@@ -121,7 +119,7 @@ void check_time(char const* format, char const* sDate,
       int hour, int min, int sec, double fsec)
 {
    // std::cout << "Test " << sDate << " against " << format << std::endl;
-   const ossimDate d = time::details::strptime(format, sDate);
+   const ossimDate d = ossimplugins::time::details::strptime(format, sDate);
    BOOST_CHECK_EQUAL(d.getYear(), year);
    BOOST_CHECK_EQUAL(d.getMonth(), month);
    BOOST_CHECK_EQUAL(d.getDay(), day);
@@ -151,7 +149,7 @@ void check_time(char const* format, char const* sDate,
    // Check string conversion
    // Yes, this is likelly to fail du to double imprecisions
    // - official ossimDate string conversion
-   time::ModifiedJulianDate mjd = time::toModifiedJulianDate(sDate);
+   ossimplugins::time::ModifiedJulianDate mjd = ossimplugins::time::toModifiedJulianDate(sDate);
    // std::cout << "MJD("<<sDate<<"): " << mjd.as_day_frac() << std::endl;
    BOOST_CHECK_CLOSE_FRACTION(d.getModifiedJulian(), mjd.as_day_frac(), 1e-12);
    std::ostringstream oss;
@@ -168,7 +166,7 @@ void check_time(char const* format, char const* sDate,
 
    // We know this test will fail because of float rounding => just display
    std::cout.precision(16);
-   std::cout << mjd << " as a simple string (" << time::to_simple_string(mjd)
+   std::cout << mjd << " as a simple string (" << ossimplugins::time::to_simple_string(mjd)
       << ") is expected to differ from " << sDate << "\n";
    // BOOST_CHECK_EQUAL(to_simple_string(mjd), sDate);
 }
diff --git a/Modules/ThirdParty/Qt4/CMakeLists.txt b/Modules/ThirdParty/Qt4/CMakeLists.txt
index 20dc99b..f8203b9 100644
--- a/Modules/ThirdParty/Qt4/CMakeLists.txt
+++ b/Modules/ThirdParty/Qt4/CMakeLists.txt
@@ -1,6 +1,7 @@
-project(OTBQt4)
+project( OTBQt4 )
+
+set( OTBQt4_SYSTEM_INCLUDE_DIRS ${QT_INCLUDE_DIRS} )
+set( OTBQt4_LIBRARIES "${QT_LIBRARIES}" )
+set( QT_VERSION "${QTVERSION}" CACHE INTERNAL "" FORCE )
 
-set(OTBQt4_SYSTEM_INCLUDE_DIRS ${QT_INCLUDE_DIRS})
-set(OTBQt4_LIBRARIES "${QT_LIBRARIES}")
-set(QT_VERSION "${QTVERSION}" CACHE INTERNAL "" FORCE)
 otb_module_impl()
diff --git a/Modules/ThirdParty/Qt4/otb-module-init.cmake b/Modules/ThirdParty/Qt4/otb-module-init.cmake
index 370b894..59ad08c 100644
--- a/Modules/ThirdParty/Qt4/otb-module-init.cmake
+++ b/Modules/ThirdParty/Qt4/otb-module-init.cmake
@@ -1,4 +1,4 @@
-find_package(Qt4 REQUIRED)
-mark_as_advanced(QT_QMAKE_EXECUTABLE)
-set(QT_USE_QTXML 1)
-include(${QT_USE_FILE})
+find_package( Qt4 REQUIRED QtCore QtGui QtOpenGL QtXml )
+mark_as_advanced( QT_QMAKE_EXECUTABLE )
+set( QT_USE_QTXML 1 )
+include( ${QT_USE_FILE} )
diff --git a/Modules/ThirdParty/Qwt/CMakeLists.txt b/Modules/ThirdParty/Qwt/CMakeLists.txt
new file mode 100644
index 0000000..4737e85
--- /dev/null
+++ b/Modules/ThirdParty/Qwt/CMakeLists.txt
@@ -0,0 +1,6 @@
+project(OTBQwt)
+
+set(OTBQwt_SYSTEM_INCLUDE_DIRS ${QWT_INCLUDE_DIRS})
+set(OTBQwt_LIBRARIES "${QWT_LIBRARIES}")
+
+otb_module_impl()
diff --git a/Modules/ThirdParty/Qwt/otb-module-init.cmake b/Modules/ThirdParty/Qwt/otb-module-init.cmake
new file mode 100644
index 0000000..7183af1
--- /dev/null
+++ b/Modules/ThirdParty/Qwt/otb-module-init.cmake
@@ -0,0 +1,9 @@
+find_package(Qwt REQUIRED)
+
+if(NOT QWT_MAJOR_VERSION EQUAL 5)
+  message(FATAL_ERROR "Only Qwt 5 is supported. Found version ${QWT_VERSION_STRING}")
+endif()
+
+if(WIN32)
+  add_definitions(-DQWT_DLL)
+endif(WIN32)
diff --git a/Modules/ThirdParty/Qwt/otb-module.cmake b/Modules/ThirdParty/Qwt/otb-module.cmake
new file mode 100644
index 0000000..9fd20bf
--- /dev/null
+++ b/Modules/ThirdParty/Qwt/otb-module.cmake
@@ -0,0 +1,13 @@
+set(DOCUMENTATION "This module imports Qwt to the build system")
+
+otb_module(OTBQwt
+  DEPENDS
+    OTBQt4
+    
+  TEST_DEPENDS
+    
+  DESCRIPTION
+    "${DOCUMENTATION}"
+  )
+
+otb_module_activation_option("Enable Qwt dependent modules" OFF)
diff --git a/Modules/ThirdParty/Shark/CMakeLists.txt b/Modules/ThirdParty/Shark/CMakeLists.txt
new file mode 100644
index 0000000..e26e6f7
--- /dev/null
+++ b/Modules/ThirdParty/Shark/CMakeLists.txt
@@ -0,0 +1,16 @@
+project(OTBShark)
+
+configure_file( src/otb_shark.h.in src/otb_shark.h )
+
+set(OTBShark_SYSTEM_INCLUDE_DIRS ${SHARK_INCLUDE_DIRS})
+set(OTBShark_LIBRARIES "${SHARK_LIBRARIES}")
+set(OTBShark_INCLUDE_DIRS
+  ${OTBShark_BINARY_DIR}/src
+  )
+
+otb_module_impl()
+
+install(FILES ${OTBShark_BINARY_DIR}/src/otb_shark.h
+  DESTINATION ${OTBShark_INSTALL_INCLUDE_DIR}
+  COMPONENT Development
+  )
diff --git a/Modules/ThirdParty/Shark/otb-module-init.cmake b/Modules/ThirdParty/Shark/otb-module-init.cmake
new file mode 100644
index 0000000..ae75820
--- /dev/null
+++ b/Modules/ThirdParty/Shark/otb-module-init.cmake
@@ -0,0 +1,3 @@
+find_package ( Shark REQUIRED )
+
+mark_as_advanced( Shark_DIR )
diff --git a/Modules/ThirdParty/Shark/otb-module.cmake b/Modules/ThirdParty/Shark/otb-module.cmake
new file mode 100644
index 0000000..f637d4d
--- /dev/null
+++ b/Modules/ThirdParty/Shark/otb-module.cmake
@@ -0,0 +1,15 @@
+set(DOCUMENTATION "This module imports SHARK to the build system")
+
+otb_module(OTBShark
+  DEPENDS
+    
+  TEST_DEPENDS
+    
+  DESCRIPTION
+    "${DOCUMENTATION}"
+  )
+
+otb_module_activation_option("Enable SHARK dependent modules" OFF)
+
+otb_module_requires_cxx11()
+
diff --git a/Modules/ThirdParty/Shark/src/otb_shark.h.in b/Modules/ThirdParty/Shark/src/otb_shark.h.in
new file mode 100755
index 0000000..3b5ea09
--- /dev/null
+++ b/Modules/ThirdParty/Shark/src/otb_shark.h.in
@@ -0,0 +1,71 @@
+/*=========================================================================
+
+  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_shark_h
+#define otb_shark_h
+
+#include "otbConfigure.h"
+
+#ifndef OTB_USE_SHARK
+#  error "You need to enable Shark to compile this file"
+#endif
+
+
+/* These defines are taken from shark CMakeLists.txt.
+ * I am not sure they are required when linking shark which 
+ * link with boost. But the fact that they are not optional 
+ * in shark puts them here.
+ */
+#define BOOST_PARAMETER_MAX_ARITY 15
+#define BOOST_FILESYSTEM_VERSION 3
+ 
+/* without having a compile defintion 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.
+ *
+ * Below is an error message if you don't have define
+ * LINK : fatal error LNK1104: cannot open file 'libboost_serialization-vc140-mt-1_60.lib'
+ * and in the install directory there is no libboost_serialization-vc140-mt-1_60.lib
+ * but only boost_serialization-vc140-mt-1_60.lib and this is the cause of boost's
+ * auto-linking.
+ */
+
+
+#cmakedefine Boost_USE_STATIC_LIBS
+
+#if !defined(Boost_USE_STATIC_LIBS) && !defined(BOOST_ALL_DYN_LINK)
+  #define BOOST_ALL_DYN_LINK
+#endif
+
+/* disable autolinking in boost on windows */
+#if defined(_WIN32) && !defined(BOOST_ALL_NO_LIB)
+  #define BOOST_ALL_NO_LIB
+#endif
+
+
+/* see which libraries are being linked in case of auto-linking,
+ * BOOST_LIB_DIAGNOSTIC will emit a #pragma message each time 
+ * a library is selected for linking.
+ *
+ * #if defined(_MSC_VER) && defined(OTB_DEBUG) && !defined(BOOST_LIB_DIAGNOSTIC)
+ * #define BOOST_LIB_DIAGNOSTIC
+ * #endif
+ *
+ */
+
+#endif /* otb_shark_h */
diff --git a/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp b/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp
index 8d68e47..631ab4e 100644
--- a/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp
+++ b/Modules/ThirdParty/SiftFast/src/libsiftfast.cpp
@@ -57,7 +57,8 @@
 #endif
 #endif
 
-using namespace std;
+//using namespace std;
+#include <algorithm>
 
 #define PI 3.141592654f
 #define SQRT2 1.4142136f
@@ -106,7 +107,7 @@ int Scales = 3;
 float InitSigma = 1.6f;
 float PeakThresh;
 
-static list<Keypoint> s_listKeypoints;
+static std::list<Keypoint> s_listKeypoints;
 
 typedef unsigned short u16;
 typedef unsigned int u32;
@@ -212,7 +213,7 @@ void FreeKeypoints(Keypoint keypt);
 void DestroyAllResources();
 }
 
-static list<Image> s_listImages;
+static std::list<Image> s_listImages;
 Image CreateImage(int rows, int cols)
 {
     Image im;
@@ -235,7 +236,7 @@ Image CreateImage(int rows, int cols)
 
 void DestroyAllImages()
 {
-    for(list<Image>::iterator it = s_listImages.begin(); it != s_listImages.end(); ++it) {
+    for(std::list<Image>::iterator it = s_listImages.begin(); it != s_listImages.end(); ++it) {
         sift_aligned_free((*it)->pixels);
         sift_aligned_free(*it);
     }
@@ -272,8 +273,8 @@ Image CreateImageFromMatlabData(double* pdata, int rows, int cols)
         }
 
         for(int j = (cols&~3); j < cols; j++) {
-            pixels[j] = pdata[i+j*rows];
-            pixels[j+stride] = pdata[i+j*rows+1];
+            pixels[j] = (float) pdata[i+j*rows];
+            pixels[j+stride] = (float) pdata[i+j*rows+1];
         }
     }
 
@@ -474,7 +475,7 @@ void SubtractImage(Image imgdst, Image img0, Image img1)
 #endif
 }
 
-static map<float, float* > s_mapkernel; // assumes GaussTruncate doesn't change!, if freeing second, subtract 4 bytes
+static std::map<float, float* > s_mapkernel; // assumes GaussTruncate doesn't change!, if freeing second, subtract 4 bytes
 
 void GaussianBlur(Image imgdst, Image image, float fblur)
 {
@@ -489,7 +490,7 @@ void GaussianBlur(Image imgdst, Image image, float fblur)
     ksize += !(ksize&1); // make it odd
 
     float* kernel = NULL;
-    for( map<float, float* >::iterator it = s_mapkernel.begin(); it != s_mapkernel.end(); ++it) {
+    for( std::map<float, float* >::iterator it = s_mapkernel.begin(); it != s_mapkernel.end(); ++it) {
         if( fabsf(fblur-it->first) < 0.001f ) {
             kernel = it->second;
             break;
@@ -533,7 +534,7 @@ void ConvHorizontal(Image imgdst, Image image, float* kernel, int ksize)
 {
     DVSTARTPROFILE();
 
-    static vector<float> _buf; //TODO, make 16 byte aligned
+    static std::vector<float> _buf; //TODO, make 16 byte aligned
     _buf.resize(image->cols + ksize);
     float* buf = &_buf[0];
     int rows = image->rows, cols = image->cols, stride = image->stride;
@@ -558,7 +559,7 @@ void ConvVertical(Image image, float* kernel, int ksize)
 {
     DVSTARTPROFILE();
 
-    static vector<float> _buf; //TODO, make 16 byte aligned
+    static std::vector<float> _buf; //TODO, make 16 byte aligned
     _buf.resize(image->rows + ksize);
     float* buf = &_buf[0];
     int rows = image->rows, cols = image->cols, stride = image->stride;
@@ -591,7 +592,7 @@ void ConvBuffer(float* buf, float* kernel, int bufsize, int ksize)
 
 #ifdef __SSE__
 
-typedef vector<float*> LISTBUF;
+typedef std::vector<float*> LISTBUF;
 static LISTBUF  s_listconvbuf; //TODO, make 16 byte aligned
 static int s_convbufsize = 0; // the size of all the buffers in s_listconvbuf
 static int SIFT_ALIGNED16(s_convmask[4]) = {static_cast<int>(0xffffffff),static_cast<int>(0xffffffff),static_cast<int>(0xffffffff),0};
@@ -612,7 +613,7 @@ void ConvHorizontalFast(Image imgdst, Image image, float* kernel, int ksize)
     int width = (ksize >= 0 ? ksize : ksize-1)>>1;
     float* _pixels = image->pixels, *_pdst = imgdst->pixels;
 
-    int convsize = max(100000,4*(cols + ksize)+36);
+    int convsize = (std::max)(100000,4*(cols + ksize)+36);
 
     if( s_listconvbuf.size() == 0 || s_convbufsize < convsize ) {
         for(LISTBUF::iterator it = s_listconvbuf.begin(); it != s_listconvbuf.end(); ++it)
@@ -761,7 +762,7 @@ void ConvVerticalFast(Image image, float* kernel, int ksize)
 
     DVSTARTPROFILE();
 
-    int convsize = max(100000,32*(image->rows + ksize+4));
+    int convsize = (std::max)(100000,32*(image->rows + ksize+4));
 
     if( s_listconvbuf.size() == 0 || s_convbufsize < convsize ) {
         for(LISTBUF::iterator it = s_listconvbuf.begin(); it != s_listconvbuf.end(); ++it)
@@ -1264,8 +1265,8 @@ void SolveLinearSystem(float* Y, float* H, int dim)
 
         if( bestj != i ) {
             for(int j = 0; j < dim; ++j)
-                swap(H[bestj*dim+j], H[i*dim+j]);
-            swap(Y[bestj],Y[i]);
+                std::swap(H[bestj*dim+j], H[i*dim+j]);
+            std::swap(Y[bestj],Y[i]);
         }
 
         for(int j = i+1; j < dim; ++j) {
@@ -1689,7 +1690,7 @@ void FreeKeypoints(Keypoint keypt)
 void DestroyAllResources()
 {
     DestroyAllImages();
-    for( map<float, float* >::iterator it = s_mapkernel.begin(); it != s_mapkernel.end(); ++it)
+    for( std::map<float, float* >::iterator it = s_mapkernel.begin(); it != s_mapkernel.end(); ++it)
         sift_aligned_free(it->second-1);
     s_mapkernel.clear();
 #ifdef __SSE__
@@ -1698,7 +1699,7 @@ void DestroyAllResources()
     s_listconvbuf.clear();
     s_convbufsize = 0;
 #endif
-    for(list<Keypoint>::iterator it = s_listKeypoints.begin(); it != s_listKeypoints.end(); ++it)
+    for(std::list<Keypoint>::iterator it = s_listKeypoints.begin(); it != s_listKeypoints.end(); ++it)
         sift_aligned_free(*it);
     s_listKeypoints.clear();
 }
diff --git a/Modules/Visualization/Ice/include/otbFragmentShader.h b/Modules/Visualization/Ice/include/otbFragmentShader.h
index 2be27f0..816a2a4 100644
--- a/Modules/Visualization/Ice/include/otbFragmentShader.h
+++ b/Modules/Visualization/Ice/include/otbFragmentShader.h
@@ -18,13 +18,15 @@
 #ifndef otb_FragmentShader_h
 #define otb_FragmentShader_h
 
-#include "itkObject.h"
-#include "itkPoint.h"
+#include "OTBIceExport.h"
+
+#include <itkObject.h>
+#include <itkPoint.h>
 
 namespace otb
 {
 
-class FragmentShader 
+class OTBIce_EXPORT FragmentShader
   : public itk::Object
 {
 public:
diff --git a/Modules/Visualization/Ice/include/otbGeoInterface.h b/Modules/Visualization/Ice/include/otbGeoInterface.h
index 9c09630..292ee6d 100644
--- a/Modules/Visualization/Ice/include/otbGeoInterface.h
+++ b/Modules/Visualization/Ice/include/otbGeoInterface.h
@@ -18,10 +18,10 @@
 #ifndef otb_GeoInterface_h
 #define otb_GeoInterface_h
 
+#include <itkFloatTypes.h>
+#include <itkPoint.h>
 
-#include "itkFloatTypes.h"
-#include "itkPoint.h"
-
+#include "OTBIceExport.h"
 
 namespace otb
 {
@@ -44,7 +44,7 @@ class ImageKeywordlist;
  * otb::GeoInterface::Point2d. Derived otb::GlActor classes must
  * implement double-prevision methods.
  */
-class GeoInterface
+class OTBIce_EXPORT GeoInterface
 {
 public:
   /**
diff --git a/Modules/Visualization/Ice/include/otbGlActor.h b/Modules/Visualization/Ice/include/otbGlActor.h
index 797ed99..98fcf79 100644
--- a/Modules/Visualization/Ice/include/otbGlActor.h
+++ b/Modules/Visualization/Ice/include/otbGlActor.h
@@ -18,16 +18,15 @@
 #ifndef otb_GlActor_h
 #define otb_GlActor_h
 
+#include <itkObject.h>
 
 #include "otbViewSettings.h"
-
-#include "itkObject.h"
-
+#include "OTBIceExport.h"
 
 namespace otb
 {
 
-class GlActor 
+class OTBIce_EXPORT GlActor 
   : public itk::Object
 {
 public:
diff --git a/Modules/Visualization/Ice/include/otbGlImageActor.h b/Modules/Visualization/Ice/include/otbGlImageActor.h
index 618185d..15bfcf5 100644
--- a/Modules/Visualization/Ice/include/otbGlImageActor.h
+++ b/Modules/Visualization/Ice/include/otbGlImageActor.h
@@ -37,7 +37,7 @@
 namespace otb
 {
 
-class GlImageActor 
+class OTBIce_EXPORT GlImageActor 
   : public GlActor, public GeoInterface
 {
 public:
@@ -263,7 +263,7 @@ private:
   // Unload tile from GPU
   void UnloadTile(Tile& tile);
 
-  // Clean the loaded tiles, getting rid of unecessary ones
+  // Clean the loaded tiles, getting rid of unnecessary ones
   void CleanLoadedTiles();
 
   // Clear all loaded tiles
diff --git a/Modules/Visualization/Ice/include/otbGlROIActor.h b/Modules/Visualization/Ice/include/otbGlROIActor.h
index 469a092..5f028fb 100644
--- a/Modules/Visualization/Ice/include/otbGlROIActor.h
+++ b/Modules/Visualization/Ice/include/otbGlROIActor.h
@@ -29,7 +29,7 @@
 namespace otb
 {
 
-class GlROIActor 
+class OTBIce_EXPORT GlROIActor 
   : public GlActor
 {
 public:
diff --git a/Modules/Visualization/Ice/include/otbGlVectorActor.h b/Modules/Visualization/Ice/include/otbGlVectorActor.h
index f36e99d..dffa765 100644
--- a/Modules/Visualization/Ice/include/otbGlVectorActor.h
+++ b/Modules/Visualization/Ice/include/otbGlVectorActor.h
@@ -36,7 +36,7 @@ class GLUtesselator;
 namespace otb
 {
 
-class GlVectorActor 
+class OTBIce_EXPORT GlVectorActor 
   : public GlActor, public GeoInterface
 {
 public:
diff --git a/Modules/Visualization/Ice/include/otbGlVersionChecker.h b/Modules/Visualization/Ice/include/otbGlVersionChecker.h
index b004a7c..6ec7c53 100644
--- a/Modules/Visualization/Ice/include/otbGlVersionChecker.h
+++ b/Modules/Visualization/Ice/include/otbGlVersionChecker.h
@@ -18,10 +18,12 @@
 #ifndef otb_GlVersionChecker_h
 #define otb_GlVersionChecker_h
 
+#include "OTBIceExport.h"
+
 namespace otb
 {
 
-class GlVersionChecker
+class OTBIce_EXPORT GlVersionChecker
 {
 public:
 
@@ -44,7 +46,7 @@ public:
    * than GL_NO_ERROR.
    */
   static const char * GLVersion();
-  
+
   /**
    * \return The OpenGL Shading-Language version used at runtime. The
    * call to this method requires a valid OpenGL rendering context. An
@@ -57,7 +59,7 @@ public:
   static const char * GLSLVersion();
 
   /**
-   * \brief Check that OpenGL required capabilites have been reached.
+   * \brief Check that OpenGL required capabilities have been reached.
    *
    * \param glVersion The returned OpenGL version or <code>NULL</code>
    * if its query has failed.
@@ -109,7 +111,7 @@ private:
   static bool SplitVersion( const char * version,
                             int& major,
                             int& minor,
-                            int& release );  
+                            int& release );
 };
 
 } // End namespace otb
diff --git a/Modules/Visualization/Ice/include/otbGlView.h b/Modules/Visualization/Ice/include/otbGlView.h
index 1383e6a..a1aa852 100644
--- a/Modules/Visualization/Ice/include/otbGlView.h
+++ b/Modules/Visualization/Ice/include/otbGlView.h
@@ -75,7 +75,7 @@ assert_NaN( T val )
  * All parameters related to scene description (origin, spacing, angle
  * ...) are stored and managed by the ViewSettings class.
  */
-class GlView 
+class OTBIce_EXPORT GlView 
   : public itk::Object
 {
 public:
@@ -96,7 +96,7 @@ public:
   itkNewMacro(Self);
 
   /**
-   * The Intialize method will reset the OpenGl viewport to the given
+   * The Initialize method will reset the OpenGl viewport to the given
    * size, clear view settings and remove any existing actor.
    * \param sx Width of the viewport
    * \param sy Height of the viewport
@@ -141,7 +141,7 @@ public:
   ActorType::Pointer GetActor(const std::string & key) const;
 
   /**
-   * Tells wether an otb::GlActor is contained given its storage key.
+   * Tells whether an otb::GlActor is contained given its storage key.
    *
    * @param key otb::GlActor storage key.
    *
@@ -668,7 +668,7 @@ GlView
 
   // Apply extent vector length to view spacing.
   //
-  // MANTIS-1178: Lenght of vector e must be divided by native
+  // MANTIS-1178: Length of vector e must be divided by native
   // spacing.
   //
   // MANTIS-1203: absolute value of native spacing should be
@@ -692,7 +692,7 @@ GlView
 
   // Apply extent vector length to view spacing.
   //
-  // MANTIS-1178: Lenght of vector e must be divided by native
+  // MANTIS-1178: Length of vector e must be divided by native
   // spacing.
   //
   // MANTIS-1203: absolute value of native spacing should be
diff --git a/Modules/Visualization/Ice/include/otbNonOptGlImageActor.h b/Modules/Visualization/Ice/include/otbNonOptGlImageActor.h
index df63729..a2efee5 100644
--- a/Modules/Visualization/Ice/include/otbNonOptGlImageActor.h
+++ b/Modules/Visualization/Ice/include/otbNonOptGlImageActor.h
@@ -1,19 +1,18 @@
 #ifndef otb_NonOptGlImageActor_h
 #define otb_NonOptGlImageActor_h
 
-#include "otbGlActor.h"
-
 #include "otbVectorImage.h"
 #include "otbMultiChannelExtractROI.h"
 #include "otbVectorRescaleIntensityImageFilter.h"
 #include "otbImageFileReader.h"
 #include "otbGenericRSTransform.h"
 
+#include "otbGlActor.h"
 
 namespace otb
 {
 
-class NonOptGlImageActor 
+class OTBIce_EXPORT NonOptGlImageActor
   : public GlActor
 {
 public:
@@ -52,7 +51,7 @@ public:
   const SpacingType & GetSpacing() const;
 
   std::string GetWkt() const;
-  
+
   ImageKeywordlistType GetKwl() const;
 
   itkSetMacro(UseShader,bool);
@@ -71,7 +70,7 @@ public:
   itkSetMacro(MaxBlue,double);
   itkGetMacro(MaxRed,double);
   itkGetMacro(MaxGreen,double);
-  itkGetMacro(MaxBlue,double);  
+  itkGetMacro(MaxBlue,double);
 
   itkSetMacro(RedIdx,unsigned int);
   itkGetMacro(RedIdx,unsigned int);
@@ -84,7 +83,7 @@ public:
 
 protected:
   NonOptGlImageActor();
-  
+
   virtual ~NonOptGlImageActor();
 
   typedef ImageFileReader<VectorImageType>                                        ReaderType;
@@ -143,8 +142,8 @@ protected:
     double m_MaxBlue;
   };
 
-  typedef std::vector<Tile>                                                       TileVectorType;    
-  
+  typedef std::vector<Tile>                                                       TileVectorType;
+
 private:
   // prevent implementation
   NonOptGlImageActor(const Self&);
@@ -152,11 +151,11 @@ private:
 
   // Load tile to GPU
   void LoadTile(Tile& tile);
-  
+
   // Unload tile from GPU
   void UnloadTile(Tile& tile);
 
-  // Clean the loaded tiles, getting rid of unecessary ones
+  // Clean the loaded tiles, getting rid of unnecessary ones
   void CleanLoadedTiles();
 
   // Clear all loaded tiles
@@ -176,11 +175,11 @@ private:
   void UpdateTransforms();
 
   static void InitShaders();
- 
+
    unsigned int m_TileSize;
 
   std::string m_FileName;
-  
+
   ReaderType::Pointer m_FileReader;
 
   TileVectorType m_LoadedTiles;
@@ -208,7 +207,7 @@ private:
   unsigned int m_NumberOfComponents;
 
   bool m_UseShader;
-  
+
   static unsigned int m_StandardShader;
   static unsigned int m_StandardShaderProgram;
   static bool m_ShaderInitialized;
diff --git a/Modules/Visualization/Ice/include/otbStandardShader.h b/Modules/Visualization/Ice/include/otbStandardShader.h
index 551264e..6077c36 100644
--- a/Modules/Visualization/Ice/include/otbStandardShader.h
+++ b/Modules/Visualization/Ice/include/otbStandardShader.h
@@ -18,9 +18,7 @@
 #ifndef otb_StandardShader_h
 #define otb_StandardShader_h
 
-
-#include "itkObjectFactory.h"
-
+#include <itkObjectFactory.h>
 #include "otbFragmentShader.h"
 #include "otbImageSettings.h"
 
@@ -39,7 +37,7 @@ typedef enum
 } ShaderType;
 
 
-class StandardShader 
+class OTBIce_EXPORT StandardShader
   : public FragmentShader
 {
 public:
@@ -68,10 +66,10 @@ public:
 
   itkSetMacro(ChessboardSize,double);
   itkGetConstReferenceMacro(ChessboardSize,double);
-  
+
   itkSetMacro(SliderPosition,double);
   itkGetConstReferenceMacro(SliderPosition,double);
-  
+
   itkSetMacro(VerticalSlider,bool);
   itkGetMacro(VerticalSlider,bool);
 
diff --git a/Modules/Visualization/Ice/include/otbViewSettings.h b/Modules/Visualization/Ice/include/otbViewSettings.h
index 2cb16e0..c5d96b2 100644
--- a/Modules/Visualization/Ice/include/otbViewSettings.h
+++ b/Modules/Visualization/Ice/include/otbViewSettings.h
@@ -23,12 +23,14 @@
 #include "itkPoint.h"
 #include "itkVector.h"
 #include "itkSize.h"
+
 #include "otbImageKeywordlist.h"
+#include "OTBIceExport.h"
 
 namespace otb
 {
 
-class ViewSettings 
+class OTBIce_EXPORT ViewSettings 
   : public itk::Object
 {
 public:
@@ -150,15 +152,15 @@ private:
   ViewSettings(const Self&);
   void operator=(const Self&);
 
-  PointType   m_Origin;
+  PointType m_Origin;
   SpacingType m_Spacing;
-  SizeType    m_ViewportSize;
+  SizeType m_ViewportSize;
   std::string m_Wkt;
   KeywordListType m_KeywordList;
-  bool m_UseProjection;
-  bool m_GeometryChanged;
-  PointType   m_RotationCenter;
-  double      m_RotationAngle;
+  PointType m_RotationCenter;
+  double m_RotationAngle;
+  bool m_UseProjection : 1;
+  bool m_GeometryChanged : 1;
 
 }; // End class ViewSettings
 
diff --git a/Modules/Visualization/Ice/otb-module.cmake b/Modules/Visualization/Ice/otb-module.cmake
index 5dda8c6..6d57f07 100644
--- a/Modules/Visualization/Ice/otb-module.cmake
+++ b/Modules/Visualization/Ice/otb-module.cmake
@@ -1,6 +1,7 @@
 set(DOCUMENTATION "This module provides Ice, a ligthweight efficient visualization framework for remote sensing images.")
 
 otb_module(OTBIce
+ENABLE_SHARED
   DEPENDS
     OTBCommon
     OTBStatistics
diff --git a/Modules/Visualization/Ice/src/otbGeoInterface.cxx b/Modules/Visualization/Ice/src/otbGeoInterface.cxx
index 6c585c3..e61947d 100644
--- a/Modules/Visualization/Ice/src/otbGeoInterface.cxx
+++ b/Modules/Visualization/Ice/src/otbGeoInterface.cxx
@@ -129,7 +129,7 @@ GeoInterface
   // By default, spacing is (1, 1) if sub-class has no scale-related
   // spacing.
   //
-  // This method is especially usefull in otb::GlView::ZoomToFull() in
+  // This method is especially useful in otb::GlView::ZoomToFull() in
   // order to correct transformed zooming factors.
 
   return INITIALIZER.GetSpacing();
diff --git a/Modules/Visualization/Ice/src/otbGlImageActor.cxx b/Modules/Visualization/Ice/src/otbGlImageActor.cxx
index efc7985..f95da42 100644
--- a/Modules/Visualization/Ice/src/otbGlImageActor.cxx
+++ b/Modules/Visualization/Ice/src/otbGlImageActor.cxx
@@ -139,7 +139,7 @@ void GlImageActor::Initialize(const std::string & filename)
 
   m_FileReader = ReaderType::New();
   m_FileReader->SetFileName(m_FileName);
-  m_FileReader->UpdateOutputInformation();
+  m_FileReader->GetOutput()->UpdateOutputInformation();
 
   m_LargestRegion = m_FileReader->GetOutput()->GetLargestPossibleRegion();
 
@@ -543,7 +543,7 @@ void GlImageActor::LoadTile(Tile& tile)
 
     glGenTextures( 1, &tile.m_TextureId );
 
-    // Following assert is somtimes false on some OpenGL systems for
+    // Following assert is sometimes false on some OpenGL systems for
     // some unknown reason even though the glGenTexture() call has
     // succeeded.
     // assert( glGetError()==GL_NO_ERROR );
@@ -983,7 +983,7 @@ void GlImageActor::UpdateResolution()
 
   // Arbitrary higher than any distance we will compute here
   double minDist = 50000.;
-  m_CurrentResolution = 0;
+  unsigned int newResolution = 0;
 
   // OTB always include full resolution level in available resolutions.
   assert( !m_AvailableResolutions.empty() );
@@ -1015,9 +1015,9 @@ void GlImageActor::UpdateResolution()
 	isFound = true;
 
 	minDist = vcl_abs(diff);
-	m_CurrentResolution = std::distance(m_AvailableResolutions.begin(),it);
+	newResolution = std::distance(m_AvailableResolutions.begin(),it);
 
-	// std::cout << "found: " << m_CurrentResolution << std::endl;
+	// std::cout << "found: " << newResolution << std::endl;
 	}
       }
 
@@ -1026,23 +1026,29 @@ void GlImageActor::UpdateResolution()
       {
       assert( m_AvailableResolutions.size() > 0 );
 
-      m_CurrentResolution = m_AvailableResolutions.size() - 1;
+      newResolution = m_AvailableResolutions.size() - 1;
 
       // std::cout << "not found: " << m_CurrentResolution << std::endl;
       }
     }
 
-  std::ostringstream extFilename;
-  extFilename<<m_FileName<<"?&resol="<<m_CurrentResolution;
-
-  // ReaderType::New() is forced because of warning message
-  // 'Duplicated option detected: <option>. Using value <value>.'
-  // output by otb::ExtendedFilenameHelper.
-  m_FileReader = ReaderType::New();
-  m_FileReader->SetFileName(extFilename.str());
-  m_FileReader->UpdateOutputInformation();
+  if(newResolution != m_CurrentResolution)
+    {
+    m_CurrentResolution = newResolution;
+    
+    std::ostringstream extFilename;
+    extFilename<<m_FileName;
+    if ( m_FileName.find('?') == std::string::npos )
+      {
+      extFilename << '?';
+      }
+    extFilename<<"&resol="<<m_CurrentResolution;
 
-  // std::cout << "Switched to resolution: " << m_CurrentResolution << std::endl;
+    m_FileReader->SetFileName(extFilename.str());
+    m_FileReader->GetOutput()->UpdateOutputInformation();
+  // std::cout << "Switched to resolution: " << m_CurrentResolution <<
+  // std::endl;
+    }
 }
 
 void GlImageActor::UpdateTransforms()
@@ -1120,10 +1126,10 @@ void GlImageActor::UpdateTransforms()
 
   if( hasChanged )
     {
-    // std::cout << std::hex << this << " -> InstanciateTransform()" << std::endl;
+    // std::cout << std::hex << this << " -> InstantiateTransform()" << std::endl;
 
-    m_ViewportToImageTransform->InstanciateTransform();
-    m_ImageToViewportTransform->InstanciateTransform();
+    m_ViewportToImageTransform->InstantiateTransform();
+    m_ImageToViewportTransform->InstantiateTransform();
     }
 
   // std::cout << "}" << std::endl;
@@ -1179,7 +1185,12 @@ void GlImageActor::AutoColorAdjustment( double & minRed, double & maxRed,
       resol = m_AvailableResolutions.size()-1;
       }
 
-    extFilename<<m_FileName<<"?&resol="<<m_AvailableResolutions[resol];
+    extFilename<<m_FileName;
+    if ( m_FileName.find('?') == std::string::npos )
+      {
+      extFilename << '?';
+      }
+    extFilename<<"&resol="<<m_AvailableResolutions[resol];
     reader->SetFileName(extFilename.str());
 
     ExtractROIFilterType::Pointer extract = ExtractROIFilterType::New();
diff --git a/Modules/Visualization/Ice/src/otbGlROIActor.cxx b/Modules/Visualization/Ice/src/otbGlROIActor.cxx
index 5511861..9021fc7 100644
--- a/Modules/Visualization/Ice/src/otbGlROIActor.cxx
+++ b/Modules/Visualization/Ice/src/otbGlROIActor.cxx
@@ -187,8 +187,8 @@ void GlROIActor::UpdateTransforms()
       m_ImageToViewportTransform->SetOutputProjectionRef( settings->GetWkt() );
       m_ImageToViewportTransform->SetOutputKeywordList( settings->GetKeywordList() );
 
-      m_ViewportToImageTransform->InstanciateTransform();
-      m_ImageToViewportTransform->InstanciateTransform();
+      m_ViewportToImageTransform->InstantiateTransform();
+      m_ImageToViewportTransform->InstantiateTransform();
       }
     }
   else
@@ -204,8 +204,8 @@ void GlROIActor::UpdateTransforms()
       m_ImageToViewportTransform = RSTransformType::New();
       m_ViewportToImageTransform = RSTransformType::New();
 
-      m_ImageToViewportTransform->InstanciateTransform();
-      m_ViewportToImageTransform->InstanciateTransform();
+      m_ImageToViewportTransform->InstantiateTransform();
+      m_ViewportToImageTransform->InstantiateTransform();
       }
     }
 }
diff --git a/Modules/Visualization/Ice/src/otbGlVectorActor.cxx b/Modules/Visualization/Ice/src/otbGlVectorActor.cxx
index d707d63..7672d60 100644
--- a/Modules/Visualization/Ice/src/otbGlVectorActor.cxx
+++ b/Modules/Visualization/Ice/src/otbGlVectorActor.cxx
@@ -24,7 +24,7 @@
 #include <GL/glew.h>
 
 /*
-#ifdef __APPLE__
+#ifdef APPLE__
 #include <OpenGL/glu.h>
 #else
 #include <GL/glu.h>
@@ -653,8 +653,8 @@ void GlVectorActor::UpdateTransforms()
     m_VectorToViewportTransform->SetOutputKeywordList(settings->GetKeywordList());
     m_VectorToViewportTransform->SetInputProjectionRef((m_OGRDataSource->GetLayerChecked(m_CurrentLayer).GetProjectionRef()));
     }
-  m_ViewportToVectorTransform->InstanciateTransform();
-  m_VectorToViewportTransform->InstanciateTransform();
+  m_ViewportToVectorTransform->InstantiateTransform();
+  m_VectorToViewportTransform->InstantiateTransform();
 }
 
 
diff --git a/Modules/Visualization/Ice/src/otbGlVersionChecker.cxx b/Modules/Visualization/Ice/src/otbGlVersionChecker.cxx
index e881c80..1bcfc0d 100644
--- a/Modules/Visualization/Ice/src/otbGlVersionChecker.cxx
+++ b/Modules/Visualization/Ice/src/otbGlVersionChecker.cxx
@@ -194,7 +194,7 @@ GlVersionChecker
     throw std::runtime_error( required );
 
   //
-  // Compare splitted versions.
+  // Compare split versions.
 
   if( verMaj<reqMaj )
     return -1;
diff --git a/Modules/Visualization/Ice/src/otbImageSettings.cxx b/Modules/Visualization/Ice/src/otbImageSettings.cxx
index 6bc100a..ec4ba13 100644
--- a/Modules/Visualization/Ice/src/otbImageSettings.cxx
+++ b/Modules/Visualization/Ice/src/otbImageSettings.cxx
@@ -30,7 +30,7 @@ ImageSettings::ImageSettings()
     m_MaxGreen( 255 ),
     m_MinBlue( 0 ),
     m_MaxBlue( 255 ),
-    m_UseNoData( true ),
+    m_UseNoData( false ),
     m_NoData( 0 ),
     m_Gamma( 1. ),
     m_Alpha( 1. ),
diff --git a/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx b/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx
index 2f68de8..633c956 100644
--- a/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx
+++ b/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx
@@ -679,7 +679,12 @@ void NonOptGlImageActor::UpdateResolution()
   m_CurrentResolution = closest;
 
   std::ostringstream extFilename;
-  extFilename<<m_FileName<<"?&resol="<<m_CurrentResolution;
+  extFilename<<m_FileName;
+  if ( m_FileName.find('?') == std::string::npos )
+    {
+    extFilename << '?';
+    }
+  extFilename<<"&resol="<<m_CurrentResolution;
 
   // std::cout<<"Extfname = "<<extFilename.str()<<std::endl;
 
@@ -713,8 +718,8 @@ void NonOptGlImageActor::UpdateTransforms()
     m_ImageToViewportTransform->SetInputProjectionRef(m_FileReader->GetOutput()->GetProjectionRef());
     m_ImageToViewportTransform->SetInputKeywordList(m_FileReader->GetOutput()->GetImageKeywordlist());
     }
-  m_ViewportToImageTransform->InstanciateTransform();
-  m_ImageToViewportTransform->InstanciateTransform();
+  m_ViewportToImageTransform->InstantiateTransform();
+  m_ImageToViewportTransform->InstantiateTransform();
 }
 
 
diff --git a/Modules/Visualization/Ice/src/otbViewSettings.cxx b/Modules/Visualization/Ice/src/otbViewSettings.cxx
index ee8820b..7fb6125 100644
--- a/Modules/Visualization/Ice/src/otbViewSettings.cxx
+++ b/Modules/Visualization/Ice/src/otbViewSettings.cxx
@@ -22,16 +22,16 @@
 
 namespace otb
 {
-ViewSettings::ViewSettings()
+ViewSettings::ViewSettings() :
+  m_Wkt( "" ),
+  m_RotationAngle( 0.0 ),
+  m_UseProjection( true ),
+  m_GeometryChanged( false )
 {
-  m_Origin.Fill(0);
-  m_Spacing.Fill(1);
-  m_ViewportSize.Fill(0);
-  m_Wkt="";
-  m_UseProjection = true;
-  m_GeometryChanged = false;
-  m_RotationCenter.Fill(0);
-  m_RotationAngle = 0;
+  m_Origin.Fill( 0 );
+  m_Spacing.Fill( 1 );
+  m_ViewportSize.Fill( 0 );
+  m_RotationCenter.Fill( 0 );
 }
 
 ViewSettings::~ViewSettings()
@@ -129,12 +129,12 @@ void ViewSettings::SetPersepectiveAngle()
   RSTransformType::Pointer forwardTransform = RSTransformType::New();
   forwardTransform->SetInputKeywordList(m_KeywordList);
   forwardTransform->SetInputProjectionRef(m_Wkt);
-  forwardTransform->InstanciateTransform();
+  forwardTransform->InstantiateTransform();
 
   RSTransformType::Pointer inverseTransform = RSTransformType::New();
   inverseTransform->SetOutputProjectionRef(m_Wkt);
   inverseTransform->SetOutputKeywordList(m_KeywordList);
-  inverseTransform->InstanciateTransform();
+  inverseTransform->InstantiateTransform();
 
   PointType centerPoint = GetViewportCenter();
 
@@ -163,12 +163,12 @@ void ViewSettings::SetNorthUpAngle()
   RSTransformType::Pointer forwardTransform = RSTransformType::New();
   forwardTransform->SetInputKeywordList(m_KeywordList);
   forwardTransform->SetInputProjectionRef(m_Wkt);
-  forwardTransform->InstanciateTransform();
+  forwardTransform->InstantiateTransform();
 
   RSTransformType::Pointer inverseTransform = RSTransformType::New();
   inverseTransform->SetOutputProjectionRef(m_Wkt);
   inverseTransform->SetOutputKeywordList(m_KeywordList);
-  inverseTransform->InstanciateTransform();
+  inverseTransform->InstantiateTransform();
   
   PointType centerPoint = GetViewportCenter();
   
diff --git a/Modules/Visualization/IceViewer/include/otbIceViewer.h b/Modules/Visualization/IceViewer/include/otbIceViewer.h
index c4fb0b4..9440711 100644
--- a/Modules/Visualization/IceViewer/include/otbIceViewer.h
+++ b/Modules/Visualization/IceViewer/include/otbIceViewer.h
@@ -35,12 +35,12 @@
 #include "otbDEMHandler.h"
 #include "otbStandardShader.h"
 #include <GL/freeglut.h>
-
+#include  "OTBIceViewerExport.h"
 
 namespace otb
 {
 
-class IceViewer 
+class OTBIceViewer_EXPORT IceViewer 
   : public itk::Object
 {
 public:
diff --git a/Modules/Visualization/IceViewer/otb-module.cmake b/Modules/Visualization/IceViewer/otb-module.cmake
index 94a5cfb..cb4d960 100644
--- a/Modules/Visualization/IceViewer/otb-module.cmake
+++ b/Modules/Visualization/IceViewer/otb-module.cmake
@@ -1,6 +1,7 @@
 set(DOCUMENTATION "This module provides IceViewer, the ligthweight GLFW viewer based on Ice.")
 
 otb_module(OTBIceViewer
+ENABLE_SHARED
   DEPENDS
     OTBIce
     OTBMetadata
diff --git a/Modules/Visualization/IceViewer/src/otbIceViewer.cxx b/Modules/Visualization/IceViewer/src/otbIceViewer.cxx
index 7f38e90..873317b 100644
--- a/Modules/Visualization/IceViewer/src/otbIceViewer.cxx
+++ b/Modules/Visualization/IceViewer/src/otbIceViewer.cxx
@@ -220,7 +220,7 @@ void IceViewer::Initialize(unsigned int w, unsigned int h, const std::string & n
   // Initialize glfw
   if(!glfwInit())
     {
-    itkExceptionMacro(<<"Could not initalize glfw!");
+    itkExceptionMacro(<<"Could not initialize glfw!");
     }
 
   // Initialize glut (ugly workaround)
@@ -602,7 +602,7 @@ void IceViewer::DrawHelp()
   oss<<"- Highlight selected image by holding backspace"<<std::endl;
   oss<<"- Zoom to full extent of selected dataset with W"<<std::endl;
   oss<<"- Zoom to full resolution fo selected images with Q (images only, as full resolution has no meaning for vectors)"<<std::endl;
-  oss<<"- Set rotation angle to perspective view with Y to accomodate heavy off-nadir viewing angle images"<<std::endl;
+  oss<<"- Set rotation angle to perspective view with Y to accommodate heavy off-nadir viewing angle images"<<std::endl;
   oss<<"- Set rotation angle to north up view with J"<<std::endl;
   oss<<"- Reset rotation angle with I"<<std::endl;
   oss<<"- Note that all images are reprojected in the first loaded dataset geometry (highligthed with * *). To change reference geometry to selected dataset, press P key."<<std::endl;
@@ -631,7 +631,7 @@ void IceViewer::DrawHelp()
   oss<<"Vector controls:"<<std::endl;
   oss<<"- Enable/disable fill polygon mode with F key"<<std::endl;
   oss<<"- Enable/disable solid border mode with S key"<<std::endl;
-  oss<<"- Tune alpha (transparancy) value with LEFT CTRL + mouse wheel"<<std::endl;
+  oss<<"- Tune alpha (transparency) value with LEFT CTRL + mouse wheel"<<std::endl;
   oss<<"- Tune line width with RIGHT SHIFT + mouse wheel"<<std::endl;
   oss<<"- Rotate vector color with LEFT ALT + mouse wheel"<<std::endl;
   oss<<"- Enable/disable optimized rendering for large vector (simplification of geometries, geometries smaller than 100 * viewport pixel sizes are not rendered)."<<std::endl<<"  Optimized rendering is only active if there are more feature to render than pixels in in the viewport."<<std::endl;
diff --git a/Modules/Visualization/Mapla/CMakeLists.txt b/Modules/Visualization/Mapla/CMakeLists.txt
new file mode 100644
index 0000000..2a15be3
--- /dev/null
+++ b/Modules/Visualization/Mapla/CMakeLists.txt
@@ -0,0 +1,10 @@
+project( OTBMapla )
+
+set(OTBMapla_LIBRARIES OTBMapla)
+
+# folder where ui headers are generated
+set( OTBMapla_INCLUDE_DIRS
+  ${OTBMapla_BINARY_DIR}/src
+  )
+
+otb_module_impl()
diff --git a/Modules/Visualization/Mapla/include/mvdMaplaApplication.h b/Modules/Visualization/Mapla/include/mvdMaplaApplication.h
new file mode 100644
index 0000000..0ebb64e
--- /dev/null
+++ b/Modules/Visualization/Mapla/include/mvdMaplaApplication.h
@@ -0,0 +1,191 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMaplaApplication_h
+#define mvdMaplaApplication_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdI18nApplication.h"
+
+#include "OTBMaplaExport.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+class OTBApplicationsModel;
+
+//
+// Class declaration.
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class MaplaApplication
+ *
+ * \ingroup OTBMapla
+ *
+ */
+class OTBMapla_EXPORT MaplaApplication
+  : public I18nApplication
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public constants/types.
+public:
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param qtApp The parent Qt application (\see I18nApplication).
+   */
+  MaplaApplication( QApplication* qtApp );
+
+  /** \brief Destructor. */
+  ~MaplaApplication() ITK_OVERRIDE;
+
+  //
+  // STATIC METHODS.
+
+  /**
+   * \brief Access the const instance of application singleton.
+   * \return The const instance to the singleton MaplaApplication.
+   */
+  inline
+    static const MaplaApplication* ConstInstance();
+
+  /**
+   * \brief Access the non-const instance of application singleton.
+   * \return The non-const instance to the singleton MaplaApplication.
+   */
+  inline
+    static MaplaApplication* Instance();
+
+  /**
+   */
+  void Foo();
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  void virtual_InitializeCore() ITK_OVERRIDE;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const MaplaApplication*
+MaplaApplication
+::ConstInstance()
+{
+  return I18nCoreApplication::ConstInstance< MaplaApplication >();
+}
+
+/*****************************************************************************/
+inline
+MaplaApplication*
+MaplaApplication
+::Instance()
+{
+  return I18nCoreApplication::Instance< MaplaApplication >();
+}
+
+} // end namespace 'mvd'
+
+#endif // maplaApplication_h
diff --git a/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h b/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h
new file mode 100644
index 0000000..ac1f5e6
--- /dev/null
+++ b/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h
@@ -0,0 +1,236 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMaplaMainWindow_h
+#define mvdMaplaMainWindow_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+//
+#include "mvdI18nMainWindow.h"
+
+#include "OTBMaplaExport.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External class pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal class pre-declaration.
+// Core
+// Gui
+class ApplicationsToolBoxController;
+
+namespace Ui
+{
+class MaplaMainWindow;
+}
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class MaplaMainWindow
+ *
+ * \ingroup OTBMapla
+ *
+ * \brief The application main-widow widget.
+ */
+class OTBMapla_EXPORT MaplaMainWindow
+  : public I18nMainWindow
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+  /** \brief Constructor. */
+  MaplaMainWindow( QWidget* Parent =0, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~MaplaMainWindow() ITK_OVERRIDE;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // QMainWindow methods.
+
+  void closeEvent( QCloseEvent* event ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PROTECTED SLOTS SECTION ]---------------------------------------------*/
+
+//
+// Protected slots.
+protected slots:
+
+  /**
+   */
+  void OnAboutToChangeModel( const AbstractModel* ) ITK_OVERRIDE;
+
+  /**
+   */
+  void OnModelChanged( AbstractModel* ) ITK_OVERRIDE;
+
+  /**
+   */
+  void OnApplicationToLaunchSelected( const QString & name,
+                                      const QString & doc );
+
+  /**
+   */
+#if 0
+  void OnOTBApplicationOutputImageChanged( const QString & name,
+                                           const QString & filename);
+#endif
+  /**
+   */
+  void OnExecutionDone( int status );
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  void InitializeDockWidgets();
+
+  /**
+   */
+  void InitializeCentralWidget();
+
+  //
+  // I18nMainWindow methods.
+
+  void virtual_SetupUI() ITK_OVERRIDE;
+
+  void virtual_ConnectUI() ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::MaplaMainWindow* m_UI;
+
+#ifdef OTB_USE_QT4
+  /**
+   *  \brief OTB-applications tool-box controller.
+   */
+  ApplicationsToolBoxController * m_ApplicationsToolBoxController;
+#endif
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Private slots.
+private slots:
+  /**
+   * \brief Qt auto-connected slot which is called when
+   * 'File/Preferences' menu action is trigerred.
+   */
+  void on_action_Preferences_triggered();
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdImageViewWidget.h"
+
+//
+// Some constants.
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // maplaMainWindow_h
diff --git a/Modules/Visualization/Mapla/otb-module.cmake b/Modules/Visualization/Mapla/otb-module.cmake
new file mode 100644
index 0000000..e9a3d54
--- /dev/null
+++ b/Modules/Visualization/Mapla/otb-module.cmake
@@ -0,0 +1,16 @@
+set(DOCUMENTATION
+  "This module provides the Monteverdi Application Launcher (Mapla)  program."
+  )
+
+otb_module( OTBMapla
+  ENABLE_SHARED
+  DEPENDS
+    OTBMonteverdiCore
+    OTBMonteverdiGUI
+    OTBQt4
+
+  OPTIONAL_DEPENDS
+
+  DESCRIPTION
+  "${DOCUMENTATION}"
+  )
diff --git a/Modules/Visualization/Mapla/src/CMakeLists.txt b/Modules/Visualization/Mapla/src/CMakeLists.txt
new file mode 100644
index 0000000..70f9cf4
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/CMakeLists.txt
@@ -0,0 +1,76 @@
+#############################################################################
+set( OTBMapla_SRCS
+  mvdMaplaApplication.cxx
+  mvdMaplaMainWindow.cxx
+  )
+
+#############################################################################
+set( OTBMapla_HEADERS_MOC
+       ../include/mvdMaplaApplication.h
+       ../include/mvdMaplaMainWindow.h
+       # mvdPreferencesDialog.h
+)
+
+#############################################################################
+set( OTBMapla_FORMS
+       mvdMaplaMainWindow.ui
+       # mvdPreferencesDialog.ui
+)
+
+#############################################################################
+set( OTBMapla_RESOURCES
+       mvdMaplaMainWindow.qrc
+)
+
+if (WIN32)
+  # Windows Resource file need to have the full path to icon
+  # if the .ico is not in the current dir
+  set( Mapla_App_WIN32_ICON ${OTB_SOURCE_DIR}/Utilities/Data/Icons/monteverdi.ico)
+  configure_file(
+    mvdMaplaWin32.rc.in
+    mvdMaplaWin32.rc
+    @ONLY
+    )
+
+  if (MINGW)
+    set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
+  endif()
+
+  # The RC file to be added to source list
+  set( Mapla_App_WIN32_RC_FILE ${CMAKE_CURRENT_BINARY_DIR}/mvdMaplaWin32.rc )
+endif()
+
+#############################################################################
+qt4_wrap_cpp( OTBMapla_SRC_MOC ${OTBMapla_HEADERS_MOC} )
+qt4_wrap_ui( OTBMapla_FORMS_HEADERS ${OTBMapla_FORMS}  )
+qt4_add_resources( OTBMapla_RESOURCES_RCC ${OTBMapla_RESOURCES} )
+
+#############################################################################
+add_to_qt4_i18n_sources( ${OTBMapla_SRCS} )
+add_to_qt4_i18n_headers( "../include" ${OTBMapla_SRCS} )
+add_to_qt4_i18n_forms( ${OTBMapla_FORMS} )
+
+##########################[Mapla library]####################################
+add_library( OTBMapla
+  STATIC
+  ${OTBMapla_SRCS}
+  ${OTBMapla_FORMS_HEADERS}
+  ${OTBMapla_SRC_MOC}
+  )
+target_link_libraries( OTBMapla
+  ${OTBMonteverdiCore_LIBRARIES}
+  ${OTBMonteverdiGUI_LIBRARIES}
+  ${OTBQt4_LIBRARIES}
+  )
+otb_module_target( OTBMapla )
+
+############################[Mapla executable]###############################
+add_executable( mapla
+  main.cxx
+  ${Mapla_App_WIN32_RC_FILE}
+  ${OTBMapla_RESOURCES_RCC}
+  )
+target_link_libraries( mapla
+  OTBMapla
+  )
+otb_module_target( mapla )
diff --git a/Modules/Visualization/Mapla/src/main.cxx b/Modules/Visualization/Mapla/src/main.cxx
new file mode 100644
index 0000000..6e206b8
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/main.cxx
@@ -0,0 +1,173 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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.
+
+=========================================================================*/
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QPixmap>
+#include <QSplashScreen>
+
+//
+// System includes (sorted by alphabetic order)
+#include <exception>
+
+//
+// ITK includes (sorted by alphabetic order)
+#include "itksys/SystemTools.hxx"
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdMaplaApplication.h"
+#include "mvdMaplaMainWindow.h"
+
+enum ERROR_CODE
+{
+  ERROR_CODE_I18N = -1,
+  ERROR_CODE_CACHE_DIR = -2,
+  ERROR_CODE_DATABASE = -3,
+  ERROR_CODE_GL_VERSION = -4,
+};
+
+/*****************************************************************************/
+/* FUNCTIONS DECLARATION                                                     */
+
+
+/*****************************************************************************/
+/* MAIN                                                                      */
+
+int
+main( int argc, char* argv[] )
+{
+  QApplication qtApp( argc, argv );
+
+  //
+  // 0. Splash-screen.
+#if !defined( OTB_DEBUG )
+  QPixmap pixmap(QLatin1String( ":/images/application_splash" ));
+  QSplashScreen splash(pixmap);
+  splash.show();
+  qtApp.processEvents();//This is used to accept a click on the screen so that user can cancel the screen
+#endif
+
+  //
+  // 1. Initialize application and sync settings.
+  //
+  // Coverity-14835
+  // {
+  mvd::MaplaApplication * application = NULL;
+
+  try
+    {
+    application = new mvd::MaplaApplication( &qtApp );
+    assert( application!=NULL );
+
+    application->Initialize();
+    }
+  catch( std::exception & exc )
+    {
+    QMessageBox::StandardButton button =
+      QMessageBox::question(
+	NULL,
+	QCoreApplication::translate(
+	  "Mapla",
+	  "Question!"
+	),
+	QCoreApplication::translate(
+	  "Mapla",
+	  "The following exception has been caught while initializing the software:\n\n"
+	  "%1\n\n"
+	  "The application may not function as expected. Do you want to continue?"
+	)
+	.arg( exc.what() ),
+	QMessageBox::Yes | QMessageBox::No,
+	QMessageBox::Yes
+      );
+
+    if( button==QMessageBox::No )
+      return ERROR_CODE_I18N;
+    }
+  // }
+  // Coverity-14835
+
+  //
+  // 2. Initialize main-window (UI).
+  mvd::MaplaMainWindow mainWindow;
+  mainWindow.Initialize();
+
+  application->Foo();
+
+  //
+  // 3. Initialize cache directory.
+  //
+  // N/A
+
+  //
+  // 4. Initialize database.
+  //
+  // N.A.
+
+  //
+  // 5. Show window.
+#if defined( OTB_DEBUG )
+#else // OTB_DEBUG
+  splash.finish(&mainWindow);
+#endif // OTB_DEBUG
+
+  // Useful when developping/debugging to avoid overlapping other windows.
+  mainWindow.show();
+
+  //
+  // 6. Check OpenGL capabilities
+  /*
+  if( !mainWindow.CheckGLCapabilities() )
+    return ERROR_CODE_GL_VERSION;
+  */
+
+  //
+  // 7. Let's go: run the application and return exit code.
+  int result = QCoreApplication::instance()->exec();
+
+  // application->CloseDatabase();
+
+  // Coverity-14835
+  // {
+  delete application;
+  application = NULL;
+  // }
+  // Coverity-14835
+
+  return result;
+}
+
+
+/*****************************************************************************/
+/* FUNCTIONS IMPLEMENTATION                                                  */
+/*****************************************************************************/
diff --git a/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx b/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx
new file mode 100644
index 0000000..4a1a871
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/mvdMaplaApplication.cxx
@@ -0,0 +1,107 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdMaplaApplication.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+//
+#ifdef OTB_USE_QT4
+#include "mvdOTBApplicationsModel.h"
+#endif
+
+//
+// Class implementation.
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::MaplaApplication
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+MaplaApplication
+::MaplaApplication( QApplication* qtApp ) :
+  I18nApplication( qtApp )
+{
+}
+
+/*******************************************************************************/
+MaplaApplication
+::~MaplaApplication()
+{
+}
+
+/*******************************************************************************/
+void
+MaplaApplication
+::virtual_InitializeCore()
+{
+  I18nApplication::virtual_InitializeCore();
+
+  setObjectName( "MaplaApplication" );
+
+  InitializeCore(
+    "Monteverdi Application Launcher",
+    QString( "OTB %1" ).arg( OTB_VERSION_STRING ),
+    "OrfeoToolBox",
+    "orfeo-toolbox.org"
+  );
+}
+
+/*******************************************************************************/
+void
+MaplaApplication
+::Foo()
+{
+  SetModel( new OTBApplicationsModel( this ) );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx
new file mode 100644
index 0000000..549b34d
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx
@@ -0,0 +1,253 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  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 "mvdMaplaMainWindow.h"
+#include "ui_mvdMaplaMainWindow.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifdef OTB_USE_QT4
+# include "mvdApplicationLauncher.h"
+# include "mvdApplicationsToolBoxController.h"
+# include "mvdOTBApplicationsModel.h"
+# if 1
+#   include "mvdQtWidgetView.h"
+# else
+#   include "otbWrappperQtWidgetView.h"
+# endif
+#endif
+//
+#include "mvdApplicationsToolBox.h"
+//
+#include "mvdMaplaApplication.h"
+// #include "mvdPreferencesDialog.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::MaplaMainWindow
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+MaplaMainWindow
+::MaplaMainWindow( QWidget * p, Qt::WindowFlags flags ) :
+  I18nMainWindow( p, flags ),
+  m_UI( new mvd::Ui::MaplaMainWindow() )
+#ifdef OTB_USE_QT4
+  ,
+  m_ApplicationsToolBoxController( NULL )
+#endif
+{
+  m_UI->setupUi( this );
+}
+
+/*****************************************************************************/
+MaplaMainWindow
+::~MaplaMainWindow()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::virtual_SetupUI()
+{
+  setObjectName( "Mapla" );
+  setWindowTitle( PROJECT_NAME " Application Launcher" );
+
+#ifdef OTB_USE_QT4
+
+  assert( m_ApplicationsToolBoxController==NULL );
+
+  m_ApplicationsToolBoxController =
+    new ApplicationsToolBoxController(
+      new ApplicationsToolBox( this ),
+      this
+    );
+
+  assert( MaplaApplication::Instance() );
+
+  setCentralWidget( m_ApplicationsToolBoxController->GetWidget() );
+
+#else // OTB_USE_QT4
+
+  setCentralWidget(
+    new QLabel(
+      tr( "Enable OTB_USE_QT4 preprocessor definition at compile time!" ),
+      this
+    )
+  );
+
+#endif // OTB_USE_QT4
+
+  if( !RestoreLayout( Monteverdi_UI_VERSION ) )
+    {
+    qWarning() << "Failed to restore window layout!";
+    }
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::virtual_ConnectUI()
+{
+  //
+  // OTB application support.
+#ifdef OTB_USE_QT4
+
+  QObject::connect(
+    m_ApplicationsToolBoxController->GetWidget(),
+    SIGNAL( ApplicationToLaunchSelected( const QString &, const QString & ) ),
+    // to:
+    this,
+    SLOT( OnApplicationToLaunchSelected(const QString &, const QString & ) )
+  );
+
+#endif
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::closeEvent( QCloseEvent* e )
+{
+  assert( MaplaApplication::Instance() );
+  assert(
+    MaplaApplication::Instance()->GetModel()==
+    MaplaApplication::Instance()->GetModel< OTBApplicationsModel >()
+  );
+
+  SaveLayout( Monteverdi_UI_VERSION );
+
+  I18nMainWindow::closeEvent( e );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+MaplaMainWindow
+::on_action_Preferences_triggered()
+{
+#if 0
+  PreferencesDialog prefDialog( this );
+
+  prefDialog.exec();
+#endif
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::OnAboutToChangeModel( const AbstractModel * )
+{
+  // qDebug() << this << "::OnAboutToChangeModel(" << model << ")";
+
+  m_ApplicationsToolBoxController->SetModel( NULL );
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::OnModelChanged( AbstractModel* model )
+{
+  // qDebug() << this << "::OnModelChanged(" << model << ")";
+
+  m_ApplicationsToolBoxController->SetModel( model );
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::OnApplicationToLaunchSelected( const QString & appName,
+				 const QString & )
+{
+#ifdef OTB_USE_QT4
+
+  assert( MaplaApplication::ConstInstance()!=NULL );
+  assert( MaplaApplication::ConstInstance()->GetModel()!=NULL );
+  assert(
+    MaplaApplication::ConstInstance()->GetModel()==
+    MaplaApplication::ConstInstance()->GetModel< OTBApplicationsModel >()
+  );
+  assert(
+    MaplaApplication::ConstInstance()
+    ->GetModel< OTBApplicationsModel >()
+    ->GetLauncher()!=NULL
+  );
+
+  QWidget * appWindow =
+    MaplaApplication::ConstInstance()
+    ->GetModel< OTBApplicationsModel >()
+    ->GetLauncher()
+    ->NewOtbApplicationWindow( appName, true, this );
+
+  assert( appWindow!=NULL );
+
+  appWindow->show();
+
+#endif // OTB_USE_QT4
+}
+
+/*****************************************************************************/
+void
+MaplaMainWindow
+::OnExecutionDone( int status )
+{
+  if( status<0 )
+    return;
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.qrc b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.qrc
new file mode 100644
index 0000000..8344829
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.qrc
@@ -0,0 +1,20 @@
+<RCC>
+  <qresource prefix="/icons">
+    <file>../../../../Utilities/Data/Icons/zoom-1to1.png</file>
+    <file alias="otb">../../../../Utilities/Data/Icons/monteverdi-32x32.png</file>
+    <file alias="process">../../../../Utilities/Data/Icons/alg.png</file>
+    <file>../../../../Utilities/Data/Icons/execute.png</file>
+    <file>../../../../Utilities/Data/Icons/locked.png</file>
+    <file>../../../../Utilities/Data/Icons/unlocked.png</file>
+    <file alias="forbidden">../../../../Utilities/Data/Icons/forbidden-128x128.png</file>
+    <file alias="action_ZoomIn_Icon">../../../../Utilities/Data/Icons/action-zoomin_24x24.png</file>
+    <file alias="action_ZoomExtent_Icon">../../../../Utilities/Data/Icons/action-zoomfullextent_24x24.png</file>
+    <file alias="action_ZoomOut_Icon">../../../../Utilities/Data/Icons/action-zoomout_24x24.png</file>
+    <file alias="action_ZoomFull_Icon">../../../../Utilities/Data/Icons/action-zoomtolayer_24x24.png</file>
+    <file alias="action_Open_Icon">../../../../Utilities/Data/Icons/document-open_32x32.png</file>
+  </qresource>
+  <qresource prefix="/images">
+    <file alias="application_icon">../../../../Utilities/Data/Icons/monteverdi-128x128.png</file>
+    <file alias="application_splash">../../../../Utilities/Data/Icons/monteverdi-splash.png</file>
+  </qresource>
+</RCC>
diff --git a/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.ui b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.ui
new file mode 100644
index 0000000..d238ae4
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.ui
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::MaplaMainWindow</class>
+ <widget class="QMainWindow" name="mvd::MaplaMainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Main window</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <widget class="QWidget" name="m_CentralWidget"/>
+  <widget class="QMenuBar" name="m_MenuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>400</width>
+     <height>27</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menu_File">
+    <property name="title">
+     <string>&File</string>
+    </property>
+    <addaction name="separator"/>
+    <addaction name="action_Quit"/>
+   </widget>
+   <widget class="QMenu" name="menu_Help">
+    <property name="title">
+     <string>&Help</string>
+    </property>
+    <addaction name="action_About"/>
+   </widget>
+   <widget class="QMenu" name="menu_Edit">
+    <property name="title">
+     <string>&Edit</string>
+    </property>
+    <addaction name="action_Preferences"/>
+   </widget>
+   <addaction name="menu_File"/>
+   <addaction name="menu_Edit"/>
+   <addaction name="menu_Help"/>
+  </widget>
+  <action name="action_Quit">
+   <property name="text">
+    <string>&Quit</string>
+   </property>
+   <property name="toolTip">
+    <string>Quit application.</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Q</string>
+   </property>
+  </action>
+  <action name="action_ImportImage">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMaplaMainWindow.qrc">
+     <normaloff>:/icons/action_Open_Icon</normaloff>:/icons/action_Open_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>&Import image...</string>
+   </property>
+   <property name="iconText">
+    <string>Import image...</string>
+   </property>
+   <property name="toolTip">
+    <string>Import image-file.</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+O</string>
+   </property>
+  </action>
+  <action name="action_About">
+   <property name="text">
+    <string>&About...</string>
+   </property>
+   <property name="iconText">
+    <string>About...</string>
+   </property>
+   <property name="toolTip">
+    <string>About...</string>
+   </property>
+  </action>
+  <action name="action_Preferences">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="text">
+    <string>Prefere&nces</string>
+   </property>
+  </action>
+ </widget>
+ <resources>
+  <include location="mvdMaplaMainWindow.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/Mapla/src/mvdMaplaWin32.rc.in b/Modules/Visualization/Mapla/src/mvdMaplaWin32.rc.in
new file mode 100644
index 0000000..59c1507
--- /dev/null
+++ b/Modules/Visualization/Mapla/src/mvdMaplaWin32.rc.in
@@ -0,0 +1,32 @@
+#include "winver.h"
+
+IDI_ICON1               ICON    DISCARDABLE     "@Mapla_App_WIN32_ICON@"
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @Monteverdi_VERSION_MAJOR@, at Monteverdi_VERSION_MINOR@, at Monteverdi_VERSION_PATCH@,0
+ PRODUCTVERSION @Monteverdi_VERSION_MAJOR@, at Monteverdi_VERSION_MINOR@, at Monteverdi_VERSION_PATCH@,0
+ FILEFLAGS 0x0L
+ FILEFLAGSMASK 0x3fL
+ FILEOS 0x00040004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "000004b0"
+        BEGIN
+            VALUE "CompanyName", "OrfeoToolbox"
+            VALUE "FileDescription", "Monteverdi 2"
+            VALUE "FileVersion", "@Monteverdi_VERSION_MAJOR at .@Monteverdi_VERSION_MINOR at .@Monteverdi_VERSION_PATCH at .0"
+            VALUE "LegalCopyright", "Copyright (c) 2012-2013 Centre National d'Etudes Spatiales. All rights reserved."
+            VALUE "InternalName", "mapla"
+            VALUE "OriginalFilename", "mapla.exe"
+            VALUE "ProductName", "Mapla"
+            VALUE "ProductVersion", "@Monteverdi_VERSION_MAJOR at .@Monteverdi_VERSION_MINOR at .@Monteverdi_VERSION_PATCH at .0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0, 1200
+    END
+END
diff --git a/Modules/Visualization/Monteverdi/CMakeLists.txt b/Modules/Visualization/Monteverdi/CMakeLists.txt
new file mode 100644
index 0000000..8d2b82c
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/CMakeLists.txt
@@ -0,0 +1,10 @@
+project( OTBMonteverdi )
+
+set( OTBMonteverdi_LIBRARIES OTBMonteverdi )
+
+# folder where ui headers are generated
+set( OTBMonteverdi_INCLUDE_DIRS
+  ${OTBMonteverdi_BINARY_DIR}/src
+  )
+
+otb_module_impl()
diff --git a/Modules/Visualization/Monteverdi/README.txt b/Modules/Visualization/Monteverdi/README.txt
new file mode 100644
index 0000000..9fa3eae
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/README.txt
@@ -0,0 +1,44 @@
+Monteverdi was developed 4 years ago in order to provide an integrated
+application for capacity building activities (teaching, simple image
+manipulation, etc.). Its success went far beyond this initial scope since it
+opened the OTB world to a wide range of users who needed a ready to use
+graphical tool more than a library of components to write their own processing
+chain. With this 4 years of lifetime, we have a lot of feedbacks regarding how
+useful the tool was, but also regarding what should be improved to move toward
+greater usability and operationnality. 
+We therefore decided to rework the Monteverdi concept into a brand new software,
+enlightened by this experience.
+
+Here are suggested steps for the Monteverdi beginner.
+
+1) Get the software.
+
+            http://orfeo-toolbox.org/otb/download.html
+
+2) The software is compiled using CMake http://www.cmake.org. CMake
+   generates Makefiles on Unix platforms, and Windows workspaces (or
+   appropriate) build files according to your compiler, operating
+   system, and other system variables.
+
+   Create a binary directory, and then run cmake. Provide to CMake
+   the source directory of Monteverdi and the binary directory that you
+   just created.
+
+   Monteverdi depends on OTB. You have to fill up the OTB_DIR variable with the
+   location of the compiled OTB. If you use ccmake or cmake-gui, you have an
+   interface to enter the value.
+
+
+Please submit bug reports using the OTB bug tracker at:
+            http://bugs.orfeo-toolbox.org
+
+You can get support :
+
+1. Using the OTB community site at http://orfeo-toolbox.org/
+2. Joining the otb-users mailing list at http://groups.google.com/group/otb-users
+
+Monteverdi source code is available at http://hg.orfeo-toolbox.org/Monteverdi
+
+There is many ways to join us in the OTB adventure and the more people
+contribute, the better the library is for everybody! See at
+http://www.orfeo-toolbox.org/otb/contribute.html
diff --git a/Modules/Visualization/Monteverdi/RELEASE_NOTES_MVD.txt b/Modules/Visualization/Monteverdi/RELEASE_NOTES_MVD.txt
new file mode 100644
index 0000000..c39cd5b
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/RELEASE_NOTES_MVD.txt
@@ -0,0 +1,236 @@
+=========================
+ Monteverdi Release Note
+=========================
+
+Monteverdi 3.4.0 - Changes since version 3.2.0 (July 28th, 2016)
+=================================================================
+
+* Bug fixes:
+  * MANTIS-1256: elete-All button not disabled after layer-stack has been cleared
+  * MANTIS-1250: Main-window always show maximized
+  * MANTIS-1245: Monteverdi: no projection mode display problem
+  * MANTIS-1244: Emptying layer stack does not reset viewport state
+  * MANTIS-1235: Monteverdi is not able to open S1 product (SLC SM product)
+  * MANTIS-1232: Layer stack disappear after opening an image (gnome 3)
+  * MANTIS-1231: Monteverdi: shader effect does not follow the mouse cursor when moving
+  * MANTIS-1221: Error build Monteverdi2 3.2.0 in Arch Linux
+  * MANTIS-1205: Gamma slider effect inverted between full and quicklook view
+  * MANTIS-1204: Zoom to full extent and zoom to layer extent does not preserve aspect ratio
+
+* RFC:
+  * Request for Changes-44: Improve OTB-applications display & search in Monteverd & Mapla 
+
+Monteverdi 3.2.0 - Changes since version 3.0.0 (March 30th, 2016)
+=================================================================
+
+* Bug fixes:
+  * MANTIS-1203: Clicking on 1:1 button several time result in strange cycling behaviour
+  * MANTIS-1202: Wrong aspect ratio at loading
+  * MANTIS-1197: Clicking on minimap to navigate result in monteverdi crashing
+  * MANTIS-1196: OTB-application Quit button closes widget but not window when using Mapla
+  * MANTIS-1179: Using the Upper Bound mode for resolution lookup in preferences result in wrong resolution used
+  * MANTIS-1178: Zoom to full resolution does not zoom to 1 image pixel = 1 screen pixel for georeferenced data
+  * MANTIS-1159: TrainImageClassifier sample.vtr parameter is sometime ignored
+  * MANTIS-1157: Monteverdi crashes when trying to move the view without any images
+  * MANTIS-1156: Linux standalone package doesn't work on Fedora 22
+  * MANTIS-1154: Exception raised when opening LUM or LUM+HDR
+  * MANTIS-1153: Superimpose app in PHR mode reports wrong origin/spacing/keywordlist
+  * MANTIS-1152: Maximum number of class in KMean application limited to 255
+  * MANTIS-1148: OTB-applications not loaded
+  * MANTIS-1147: With Monteverdi develop branch of today : opening large images with overview file leads to eating all available memory
+  * MANTIS-1144: Unable to keep unconstrained dynamic mode
+  * MANTIS-1140: Lost pixel position information in layer stack
+  * MANTIS-1138: Numeric value editing hell
+  * MANTIS-1136: Unable to open sensor products (with RPC) in Monteverdi
+  * MANTIS-1131: Non projected visualization mode seems slow
+  * MANTIS-1125: Use OTB_APPLICATION_PATH in startup files
+  * MANTIS-1122: Black screen after Zoom-to-extent (MinGW)
+  * MANTIS-1120: Unwanted zoom-to-extent when loading second image
+  * MANTIS-1118: Crash when restoring UI layout if quicklook view is visible at startup.
+  * MANTIS-1111: Geoid-file <arning message needs restart displayed when not needed.
+  * MANTIS-1105: Quicklook and ROI badly displayed when opening no-proj image
+  * MANTIS-1096: The quicklook is often lost
+  * MANTIS-0827: Import of image with 0 as value on the whole area is impossible
+
+
+* RFC:
+  * Request for Changes-20: Take screenshot
+  * Request for Changes-21: Support CDS import
+  * Request for Changes-23: Ice as an Orfeo ToolBox module
+  * Request for Changes-25: Disable Ice shaders if OpenGL version is lower than 2.0 (especially when using via remote-desktop service).
+  * Request for Changes-24: MVD/OTB GDAL overviews multi-resolution pyramid configuration
+
+Monteverdi 3.0.0 - Changes since version 0.8.1 (December 22nd, 2015)
+====================================================================
+
+* Versioning
+  - Monteverdi2 discontinued and becomes Monteverdi 3.0.0
+  - MApLa (Monteverdi Application Launcher) has been created.
+
+* Repository data
+  - The cache directory and persitent database has been abandoned: Monteverdi 3 works more like a viewer than a catalogue.
+
+* OTB-application features
+  - OTB-applications are now loaded on demand via the File/Load OTB-applications menu item.
+  - The OTB-applications browser dock-widget is now floating by default but can still be docked.
+  - OTB-applications pannels are now opened as pop-up dialogs (same as in OTB) instead of being tabbed.
+
+* GUI features
+
+  - Internationalization:
+    + Updated French translation.
+
+  - Color dynamics:
+    + Added alpha (translucency) control.
+
+  - Multi-image management:
+    + Several images can be loaded and viewed simultaneously.
+    + Added layer-stack dock-widget to manage layers (order, delete, drop from file manager etc.) and display some information (sensor-mode, mutli-resolution pyramid level, effect, index undex cursor, pixel intensities for RGB bands, physical position under cursor).
+
+  - Rendering/Image navigation:
+    + Dynamic reprojection of all images in projection of selected image.
+    + Added per-layer dynamic mouse-cursor effects (chessboard, gradient, local contrast, local translucency, spectral angle, swipe).
+    + Improved zooming functions (zoom to overall extent, zoom to layer extent, zoom to 1:1 scale).
+    + Added keyboard & mouse shortcuts to improve interactive navigation & edit per-layer effects (see Help/Keymap... menu item).
+
+  - Miscellaneous UI features:
+    + Added rendering preferences (level of multi-resolution pyramid algorithm, image tile-size).
+    + Added Help/Keymap... documentation.
+    + Added save/restore window layout.
+
+* Mapla features
+  - Standalone program
+  - Consists of a main-window containing the OTB-application browser
+  - Ability to launch several OTB-application pannels as pop-up dialogs.
+
+* Bugfixes:
+  - MANTIS-1104: Crash as soon as I open an image
+    (http://bugs.orfeo-toolbox.org/view.php?id=1104)
+  - MANTIS-1100: Crash when trying to Apply same parameters (dynamic, effects, color map...) on images with different number of bands
+    (http://bugs.orfeo-toolbox.org/view.php?id=1100)
+  - MANTIS-1072: I18nCoreApplication::ElevationSetup() exceptions not displayed
+    (http://bugs.orfeo-toolbox.org/view.php?id=1072)
+  - MANTIS-1070: otb::DEMHandler not updated properly when resetting DEM-directory and/or Geoid-file
+    (http://bugs.orfeo-toolbox.org/view.php?id=1070)
+  - MANTIS-1064: Exception thrown () when moving image in layer-stack by drag-n-dropping
+    (http://bugs.orfeo-toolbox.org/view.php?id=1064)
+  - MANTIS-1015: libxml-dev dependency missing for libotb-dev
+    (http://bugs.orfeo-toolbox.org/view.php?id=1015)
+  - MANTIS-902: Report missing otbIce headers when building Monteverdi2
+    (http://bugs.orfeo-toolbox.org/view.php?id=902)
+  - MANTIS-894: Monteverdi 2 does not support LUM image format, contrary to Monteverdi 1
+    (http://bugs.orfeo-toolbox.org/view.php?id=894)
+  - MANTIS-1017: Missing gdal-bin dependency in package libotb-dev
+    (http://bugs.orfeo-toolbox.org/view.php?id=1017)
+  - MANTIS-1033: Crash when updating no data value in mv2
+    (http://bugs.orfeo-toolbox.org/view.php?id=1033)
+  - MANTIS-897: Most of OTB applications crash with JP2 image as input
+    (http://bugs.orfeo-toolbox.org/view.php?id=897)
+  - MANTIS-634: Steps of Quantiles spin-box are to coarse
+    (http://bugs.orfeo-toolbox.org/view.php?id=634)
+  - MANTIS-639: Using keyboard arrows with Monteverdi2 maximized grabs all keyboards events
+    (http://bugs.orfeo-toolbox.org/view.php?id=639)
+  - MANTIS-633: Can not edit spinner fields in Video Color Dynamics widget
+    (http://bugs.orfeo-toolbox.org/view.php?id=633)
+  - MANTIS-637: Displacements associated with vertical keyboard arrows are inverted with respect to Monteverdi 1.x
+    (http://bugs.orfeo-toolbox.org/view.php?id=637)
+  - MANTIS-636: Displacement related to keyboard arrows is to small
+    (http://bugs.orfeo-toolbox.org/view.php?id=636)
+  - MANTIS-645:  Viewport goes black or diminish when maximising or resizing the window after opening image
+    (http://bugs.orfeo-toolbox.org/view.php?id=645)
+  - MANTIS-646: Viewport is black or diminish when maximising or resizing the window before opening image
+    (http://bugs.orfeo-toolbox.org/view.php?id=646)
+  - MANTIS-654: When minimzing the window, all widgets are closed
+    (http://bugs.orfeo-toolbox.org/view.php?id=654)
+
+Monteverdi2-0.8.0 - Changes since version 0.6.0 (September 4th, 2014)
+=====================================================================
+
+* Repository data
+  - Updated Monteverdi2_DATA_VERSION to 1.0.0.
+  - Data version is now independent from program version.
+  - Previous repository data is not supported (user needs to delete its $(HOME)/mvd2 cache directory before starting Monteverdi2).
+
+* OTB-application features:
+  - Removed duplicate Qt OTB-application wrappers to re-use OTB ones.
+  - Removed message-box informing user that the OTB-application has succeeded.
+  - Displayed different drop messages for file and image parameters.
+
+* GUI features:
+
+  - Internationalization:
+    + Updated French translation.
+
+  - Color-dynamics:
+    + Support of gamma-corection.
+    + Changed quantile spinner step to 0.1.
+
+  - Database-browser:
+    + Add/Rename/Delete/Move user groups where to store datasets.
+    + Move dataset between groups.
+    + Imported datasets are stored in Database/Temporary group.
+    + Import dataset by drag-n-dropping file from system's file-explorer into database-browser.
+    + Added option to also delete source image, .ovr and .geom files when deleting dataset.
+    + Disabled 'Renamed dataset' item from contextual menu when dataset is also disabled.
+    + Fixed crash when deleting inconsistent dataset.
+
+  - Rendering/Image navigation:
+    + Switched to OTB-Ice rendering engine based on OpenGL shaders.
+    + Right-click to use dynamic local-contrast tool.
+    + Fast image navigation mode.
+    + Checked against OpenGL and OpenGL Shading-Language version and rendering capabilities at startup.
+
+* Core features:
+  - Fixed support of No-data value of otb::StreamingHistogramVectorImageFilter.
+  - Added SQLite database into cache directory to manage repository.
+  - Support of user groups where to store datasets in.
+  - Cleaned OTB duplicate classes.
+  - SQLite database, XML descriptor files and histogram files version checking.
+
+* Bugfixes:
+  - MANTIS-964: Wrong update of Gamme cursor position
+    (http://bugs.orfeo-toolbox.org/view.php?id=964)
+  - MANTIS-960: Drop from file explorer doest not work.
+    (http://bugs.orfeo-toolbox.org/view.php?id=960)
+  - [WORKAROUND] MANTIS-947: Droping dataset to the last subgroup of the data tree crash the application
+    (http://bugs.orfeo-toolbox.org/view.php?id=947)
+  - [WORKAROUND] MANTIS-934: Crash when importing second image into repository.
+    (http://bugs.orfeo-toolbox.org/view.php?id=934)
+  - MANTIS-933: Drag a dataset from temporary in the dataset manager outside the tree leads to a crash
+    (http://bugs.orfeo-toolbox.org/view.php?id=933)
+  - MANTIS-929: Drag and Drop in otb application a dataset leads to the disappearance of the dataset into the widget
+    (http://bugs.orfeo-toolbox.org/view.php?id=929)
+  - MANTIS-928: Output results of applications are not selected in the dataset manager
+    (http://bugs.orfeo-toolbox.org/view.php?id=928)
+  - MANTIS-921: Application freezes at the end of image import.
+    (http://bugs.orfeo-toolbox.org/view.php?id=921)
+  - MANTIS-920: Wide unzoom aborts application
+    (http://bugs.orfeo-toolbox.org/view.php?id=920)
+  - MANTIS-918: Image-view shift on click
+    (http://bugs.orfeo-toolbox.org/view.php?id=918)
+  - MANTIS-915:  In mvd2 applications wrappers InputImageList parameters, only the first item of the list is dropable
+    (http://bugs.orfeo-toolbox.org/view.php?id=915)
+  - MANTIS-909: Color-setup on PANCHRO images.
+    (http://bugs.orfeo-toolbox.org/view.php?id=909)
+  - MANTIS-908: Vector-image model settings serialization persistence (gamma)
+    (http://bugs.orfeo-toolbox.org/view.php?id=908)
+  - MANTIS-907: Serialization/persistence of viewport settings
+    (http://bugs.orfeo-toolbox.org/view.php?id=907)
+  - MANTIS-876: Monteveri2 crashes on startup
+    (http://bugs.orfeo-toolbox.org/view.php?id=876)
+  - MANTIS-854: Exception aborts Monteverdi2 when running with an old-version '.../mvd2' repository
+    (http://bugs.orfeo-toolbox.org/view.php?id=854)
+  - MANTIS-822: Parameter values in scientific notation are not always parsed
+    (http://bugs.orfeo-toolbox.org/view.php?id=822)
+
+* Qt4:
+  - Added QtSql to link stage.
+  - Using qsqlite4 driver plugin at runtime.
+
+* OTB:
+  - Upgraded source code to compile using OTB-ITKv4 API.
+  - Monteverdi2-0.8.0 is built on OTB-4.2.
+
+* Build:
+  - MinGW compilation support.
+  - Enabled use of shared libraries when compiling with MinGW.
diff --git a/Modules/Visualization/Monteverdi/include/mvdApplication.h b/Modules/Visualization/Monteverdi/include/mvdApplication.h
new file mode 100644
index 0000000..2ab8ed2
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/include/mvdApplication.h
@@ -0,0 +1,234 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdApplication_h
+#define mvdApplication_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+#include "OTBMonteverdiExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdI18nApplication.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+class OTBApplicationsModel;
+
+//
+// Class declaration.
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class Application
+ *
+ * \ingroup OTBMonteverdi
+ *
+ */
+class OTBMonteverdi_EXPORT Application
+  : public I18nApplication
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public constants/types.
+public:
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param qtApp The parent Qt application (\see I18nApplication).
+   */
+  Application( QApplication* qtApp );
+
+  /** \brief Destructor. */
+  ~Application() ITK_OVERRIDE;
+
+  /**
+   * \return The number of outdated dataset-models present in the
+   * cache-directory.
+   */
+  // CountType OpenDatabase();
+
+  /**
+   */
+  // void CloseDatabase();
+
+  /**
+   * \brief Get the OTB application model.
+   */
+  inline
+    const OTBApplicationsModel* GetOTBApplicationsModel() const;
+
+  /**
+   * \brief Get the OTB application model.
+   */
+  inline
+    OTBApplicationsModel* GetOTBApplicationsModel();
+
+  //
+  // STATIC METHODS.
+
+  /**
+   * \brief Access the const instance of application singleton.
+   * \return The const instance to the singleton Application.
+   */
+  inline
+    static const Application* ConstInstance();
+
+  /**
+   * \brief Access the non-const instance of application singleton.
+   * \return The non-const instance to the singleton Application.
+   */
+  inline
+    static Application* Instance();
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  void virtual_InitializeCore() ITK_OVERRIDE;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  void OpenApplicationsBrowser();
+
+//
+// Private attributes.
+private:
+
+  /**
+   */
+  OTBApplicationsModel* m_OTBApplicationsModel;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const Application*
+Application
+::ConstInstance()
+{
+  return I18nCoreApplication::ConstInstance< Application >();
+}
+
+/*****************************************************************************/
+inline
+Application*
+Application
+::Instance()
+{
+  return I18nCoreApplication::Instance< Application >();
+}
+
+/*****************************************************************************/
+inline
+const OTBApplicationsModel*
+Application
+::GetOTBApplicationsModel() const
+{
+  return m_OTBApplicationsModel;
+}
+
+/*****************************************************************************/
+inline
+OTBApplicationsModel*
+Application
+::GetOTBApplicationsModel()
+{
+  return m_OTBApplicationsModel;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdApplication_h
diff --git a/Modules/Visualization/Monteverdi/include/mvdMainWindow.h b/Modules/Visualization/Monteverdi/include/mvdMainWindow.h
new file mode 100644
index 0000000..80fa424
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/include/mvdMainWindow.h
@@ -0,0 +1,555 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMainWindow_h
+#define mvdMainWindow_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+#define USE_TABBED_VIEW 0
+#define USE_PIXEL_DESCRIPTION ( ( defined( OTB_DEBUG ) && 0 ) || 0 )
+
+#define RENDER_IMAGE_VIEW_DISABLED 0
+#define RENDER_QUICKLOOK_VIEW_DISABLED 0
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+
+#ifndef USE_OTB_APPS
+#  define USE_OTB_APPS ( ( defined( OTB_DEBUG ) && 0 ) || 1 )
+#endif
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtOpenGL>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+#include "mvdStackedLayerModel.h"
+//
+#include "mvdI18nMainWindow.h"
+
+#include "OTBMonteverdiExport.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External class pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal class pre-declaration.
+// Core
+class AbstractLayerModel;
+// Gui
+class FilenameDragAndDropEventFilter;
+class ImageViewWidget;
+class KeymapDialog;
+class LayerStackWidget;
+class ShaderWidget;
+class StatusBarWidget;
+
+namespace Ui
+{
+class MainWindow;
+}
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class MainWindow
+ *
+ * \ingroup OTBMonteverdi
+ *
+ * \brief The application main-widow widget.
+ */
+class OTBMonteverdi_EXPORT MainWindow
+  : public I18nMainWindow
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+  /** \brief Constructor. */
+  MainWindow( QWidget* p =0, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~MainWindow() ITK_OVERRIDE;
+
+  /**
+   */
+  bool CheckGLCapabilities();
+
+  /**
+   */
+#if USE_OTB_APPS
+  void SetupOTBApplications();
+#endif // USE_OTB_APPS
+
+  /*-[ PROTECTED SLOTS SECTION ]---------------------------------------------*/
+
+//
+// Public slots.
+public slots:
+
+  /**
+   */
+  CountType ImportImage( const QString & filename,
+			 StackedLayerModel::SizeType index );
+
+  /**
+   */
+  void ImportImages( const QStringList & filenames );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  void UserCoordinatesEditingFinished(const QString&);
+
+  void UserScaleEditingFinished(const QString &);
+
+  void UserZoomIn();
+
+  void UserZoomOut();
+
+  void UserZoomExtent();
+
+  void UserZoomFull();
+
+  void UserZoomLayer();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  using I18nMainWindow::ImportImage;
+
+  //
+  // QMainWindow methods.
+
+  void closeEvent( QCloseEvent* event ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PROTECTED SLOTS SECTION ]---------------------------------------------*/
+
+//
+// Protected slots.
+protected slots:
+
+  /**
+   */
+  void OnAboutToChangeModel( const AbstractModel * ) ITK_OVERRIDE;
+
+  /**
+   */
+  void OnModelChanged( AbstractModel * ) ITK_OVERRIDE;
+
+  /**
+   */
+  // void OnAboutToChangeSelectedDatasetModel( const DatasetModel* );
+
+  /**
+   */
+  // void OnSelectedDatasetModelChanged( DatasetModel* );
+
+  /**
+   */
+  void OnAboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & );
+
+  /**
+   */
+  void OnSelectedLayerModelChanged( const StackedLayerModel::KeyType & );
+
+  /**
+   */
+#if defined( OTB_USE_QT4 ) && USE_OTB_APPS
+  void OnApplicationToLaunchSelected( const QString & appName, const QString & docName );
+#endif // defined( OTB_USE_QT4 ) && USE_OTB_APPS
+
+  /**
+   */
+#if USE_TABBED_VIEW
+  void OnTabCloseRequested( int index );
+#endif
+
+  /**
+   */
+#if USE_TABBED_VIEW
+  void OnTabCloseRequested();
+#endif
+
+  /** */
+  void OnOTBApplicationOutputImageChanged( const QString & appName,
+                                           const QString & outfname);
+
+  /**
+   */
+  void OnExecutionDone( int status );
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  ImageViewWidget* CreateImageViewWidget( QGLWidget* sharedGlWidget =NULL );
+
+  /**
+   */
+  ImageViewWidget* CreateQuicklookViewWidget( QGLWidget* sharedGlWidget =NULL );
+
+  /**
+   */
+  void InitializeDockWidgets();
+
+  /**
+   */
+  void InitializeCentralWidget();
+
+  /**
+   */
+  void InitializeRenderToolBar();
+
+  /**
+   */
+  void InitializeShaderToolBar();
+
+  /**
+   */
+  void InitializeStatusBarWidgets();
+
+  /**
+   */
+  inline
+    const ImageViewWidget* GetQuicklookView() const;
+  /**
+   */
+  inline
+    ImageViewWidget* GetQuicklookView();
+
+  /**
+   */
+  void ConnectImageViews();
+
+  /**
+   */
+  void ConnectViewMenu();
+
+  /**
+   */
+  void ConnectReferenceLayerComboBox( StackedLayerModel * );
+
+  /**
+   */
+  void DisconnectReferenceLayerComboBox( StackedLayerModel * );
+
+  /**
+   */
+  void SetupReferenceLayerComboBox( StackedLayerModel * );
+
+  /**
+   */
+  void ConnectStatusBar();
+
+#if USE_PIXEL_DESCRIPTION
+
+  /**
+   */
+  void ConnectPixelDescriptionWidget( AbstractLayerModel * model);
+
+  /**
+   */
+  void DisconnectPixelDescriptionWidget( const AbstractLayerModel * model );
+
+#endif // USE_PIXEL_DESCRIPTION
+
+  //
+  // I18nMainWindow methods.
+
+  void virtual_SetupUI() ITK_OVERRIDE;
+
+  void virtual_ConnectUI() ITK_OVERRIDE;
+
+  void virtual_InitializeUI() ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::MainWindow* m_UI;
+
+  /**
+   * \brief Color dynamicsk-view dock-widget.
+   */
+  QDockWidget* m_ColorDynamicsDock;
+
+  /**
+   * \brief Color setup dock-widget.
+   */
+  QDockWidget* m_ColorSetupDock;
+
+  /**
+   * \brief Database-browser dock-widget.
+   */
+  // QDockWidget* m_DatabaseBrowserDock;
+
+  /**
+   * \brief Dataset-properties dock-widget.
+   */
+  // QDockWidget* m_DatasetPropertiesDock;
+
+  /**
+   * \brief Layer-stack dock-widget.
+   */
+  QDockWidget * m_LayerStackDock;
+
+  /**
+   * \brief Current Pixel Description dock-widget.
+   */
+#if USE_PIXEL_DESCRIPTION
+  QDockWidget* m_PixelDescriptionDock;
+#endif // USE_PIXEL_DESCRIPTION
+
+  /**
+   * \brief Histogram dock-widget.
+   */
+  QDockWidget* m_HistogramDock;
+
+
+#ifdef OTB_USE_QT4
+  /**
+   *  \brief OTB-applications browser dock-widget.
+   */
+  QDockWidget* m_OtbApplicationsBrowserDock;
+#endif
+
+  /**
+   * \brief Image-view page.
+   */
+  ImageViewWidget* m_ImageView;
+
+  /**
+   * \brief Quicklook-view dock.
+   */
+  QDockWidget* m_QuicklookViewDock;
+
+  /**
+   */
+#if USE_TABBED_VIEW
+  QTabWidget* m_CentralTabWidget;
+#endif // USE_TABBED_VIEW
+
+  /**
+   */
+  StatusBarWidget* m_StatusBarWidget;
+
+  /**
+   */
+  ShaderWidget * m_ShaderWidget;
+
+  /**
+   */
+  FilenameDragAndDropEventFilter* m_FilenameDragAndDropEventFilter;
+
+  /**
+   */
+  KeymapDialog * m_KeymapDialog;
+
+  /**
+   */
+  int m_GLSL140;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Private slots.
+private slots:
+
+  /**
+   * \brief Qt auto-connected slot which is called when Help/About
+   * menu action is activated.
+   */
+  void on_action_Keymap_triggered();
+
+  /**
+   */
+  void on_action_LoadOTBApplications_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when 'File/Open
+   * image' menu action is triggered.
+   */
+  void on_action_OpenImage_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when
+   * 'File/Preferences' menu action is trigerred.
+   */
+  void on_action_Preferences_triggered();
+
+  /**
+   */
+  void on_action_SaveScreenshot_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when zoom-in button
+   * is pressed.
+   */
+  void on_action_ZoomIn_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when zoom-out button
+   * is pressed.
+   */
+  void on_action_ZoomOut_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when zoom-extent button
+   * is pressed.
+   */
+  void on_action_ZoomExtent_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when zoom-full button
+   * is pressed.
+   */
+  void on_action_ZoomFull_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when zoom-layer button
+   * is pressed.
+   */
+  void on_action_ZoomLayer_triggered();
+
+  /**
+   */
+  void OnReferenceLayerCurrentIndexChanged( int );
+
+  /**
+   */
+  void OnReferenceLayerChanged( size_t );
+
+  /**
+   */
+  void OnSettingsUpdated();
+
+  /**
+   */
+  void RefreshReferenceLayerComboBox();
+
+  /**
+   */
+  void OnPixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & );
+
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdImageViewWidget.h"
+
+//
+// Some constants.
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const ImageViewWidget*
+MainWindow
+::GetQuicklookView() const
+{
+  return qobject_cast< const ImageViewWidget* >( m_QuicklookViewDock->widget() );
+}
+
+/*****************************************************************************/
+inline
+ImageViewWidget*
+MainWindow
+::GetQuicklookView()
+{
+  return qobject_cast< ImageViewWidget* >( m_QuicklookViewDock->widget() );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdMainWindow_h
diff --git a/Modules/Visualization/Monteverdi/include/mvdPreferencesDialog.h b/Modules/Visualization/Monteverdi/include/mvdPreferencesDialog.h
new file mode 100644
index 0000000..da8752d
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/include/mvdPreferencesDialog.h
@@ -0,0 +1,163 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdPreferencesDialog_h
+#define mvdPreferencesDialog_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+#include "OTBMonteverdiExport.h"
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class PreferencesDialog;
+}
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class PreferencesDialog
+ *
+ * \ingroup OTBMonteverdi
+ *
+ */
+class OTBMonteverdi_EXPORT PreferencesDialog :
+    public QDialog
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** Constructor */
+  PreferencesDialog( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** Destructor */
+  ~PreferencesDialog() ITK_OVERRIDE;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  Ui::PreferencesDialog* m_UI;
+
+  bool m_ResultsDirModified: 1;
+  bool m_GeoidFileModified: 1;
+  bool m_SrtmDirModified: 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+
+  /**
+   * \brief Qt auto-connected slot which is called when datasetPathButton menu
+   * action is pushed.
+   */
+  void on_buttonBox_accepted();
+
+
+  void on_srtmCheckbox_toggled( bool );
+  void on_geoidCheckbox_toggled( bool );
+
+  void on_srtmButton_clicked();
+  void on_geoidButton_clicked();
+
+  void on_srtmLineEdit_textChanged( const QString & );
+  void on_geoidLineEdit_textChanged( const QString & );
+
+  void on_resultDirButton_clicked();
+};
+
+} // end namespace 'mvd'
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdAboutDialog_h
diff --git a/Modules/Visualization/Monteverdi/otb-module.cmake b/Modules/Visualization/Monteverdi/otb-module.cmake
new file mode 100644
index 0000000..1938fdb
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/otb-module.cmake
@@ -0,0 +1,20 @@
+set( DOCUMENTATION
+  "This module provides the Monteverdi program."
+  )
+
+otb_module( OTBMonteverdi
+  ENABLE_SHARED
+  DEPENDS
+    OTBMonteverdiCore
+    OTBMonteverdiGUI
+    OTBQt4
+    OTBQtAdapters
+
+  OPTIONAL_DEPENDS
+
+  TEST_DEPENDS
+    OTBTestKernel
+
+  DESCRIPTION
+  "${DOCUMENTATION}"
+  )
diff --git a/Modules/Visualization/Monteverdi/src/CMakeLists.txt b/Modules/Visualization/Monteverdi/src/CMakeLists.txt
new file mode 100644
index 0000000..85e016f
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/CMakeLists.txt
@@ -0,0 +1,78 @@
+set( OTBMonteverdi_SRCS
+  mvdApplication.cxx
+  mvdMainWindow.cxx
+  mvdPreferencesDialog.cxx
+  )
+
+#############################################################################
+set( OTBMonteverdi_HEADERS_MOC
+  ../include/mvdApplication.h
+  ../include/mvdMainWindow.h
+  ../include/mvdPreferencesDialog.h
+  )
+
+#############################################################################
+# Qt designer UI files
+set( OTBMonteverdi_FORMS
+  mvdMainWindow.ui
+  mvdPreferencesDialog.ui
+  )
+
+#############################################################################
+set( OTBMonteverdi_RESOURCES
+  mvdMainWindow.qrc
+  )
+
+#############################################################################
+qt4_wrap_cpp( OTBMonteverdi_SRC_MOC ${OTBMonteverdi_HEADERS_MOC} )
+qt4_wrap_ui( OTBMonteverdi_FORMS_HEADERS ${OTBMonteverdi_FORMS}  )
+qt4_add_resources( OTBMonteverdi_RESOURCES_RCC ${OTBMonteverdi_RESOURCES} )
+
+#############################################################################
+add_to_qt4_i18n_sources( ${OTBMonteverdi_SRCS} )
+add_to_qt4_i18n_headers( "../include" ${OTBMonteverdi_SRCS} )
+add_to_qt4_i18n_forms( ${OTBMonteverdi_FORMS} )
+
+#############################################################################
+add_library( OTBMonteverdi
+  STATIC
+  ${OTBMonteverdi_SRCS}
+  ${OTBMonteverdi_FORMS_HEADERS}
+  ${OTBMonteverdi_SRC_MOC}
+  )
+target_link_libraries( OTBMonteverdi
+  ${OTBMonteverdiCore_LIBRARIES}
+  ${OTBMonteverdiGUI_LIBRARIES}
+  ${OTBQt4_LIBRARIES}
+  ${OTBQtAdapters_LIBRARIES}
+  )
+otb_module_target( OTBMonteverdi )
+
+#######################[ Monteverdi executable ]#############################
+if (WIN32)
+  # Windows Resource file need to have the full path to icon
+  # if the .ico is not in the current dir
+  set( Monteverdi_App_WIN32_ICON ${OTB_SOURCE_DIR}/Utilities/Data/Icons/monteverdi.ico)
+  configure_file(
+    mvdWin32.rc.in
+    mvdWin32.rc
+    @ONLY
+    )
+
+  if (MINGW)
+    set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
+  endif()
+
+  # The RC file to be added to source list
+  set( Monteverdi_App_WIN32_RC_FILE ${CMAKE_CURRENT_BINARY_DIR}/mvdWin32.rc )
+endif()
+
+add_executable( monteverdi
+  main.cxx
+  ${Monteverdi_App_WIN32_RC_FILE}
+  ${OTBMonteverdi_RESOURCES_RCC}
+  )
+target_link_libraries( monteverdi
+  OTBMonteverdi
+  )
+otb_module_target( monteverdi )
diff --git a/Modules/Visualization/Monteverdi/src/main.cxx b/Modules/Visualization/Monteverdi/src/main.cxx
new file mode 100644
index 0000000..170090b
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/main.cxx
@@ -0,0 +1,221 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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.
+
+=========================================================================*/
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QPixmap>
+#include <QSplashScreen>
+
+#define USE_SPLASH_SCREEN ( ( !defined( OTB_DEBUG ) && 0 ) || 0 )
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+// #include "itksys/SystemTools.hxx"
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdApplication.h"
+#include "mvdMainWindow.h"
+
+enum ERROR_CODE
+{
+  ERROR_CODE_I18N = -1,
+  ERROR_CODE_CACHE_DIR = -2,
+  ERROR_CODE_DATABASE = -3,
+  ERROR_CODE_GL_VERSION = -4,
+  ERROR_CODE_USAGE = -5,
+};
+
+/*****************************************************************************/
+/* FUNCTIONS DECLARATION                                                     */
+
+
+/*****************************************************************************/
+/* MAIN                                                                      */
+
+int
+main( int argc, char* argv[] )
+{
+  QApplication qtApp( argc, argv );
+
+  //
+  // 0. Splash-screen.
+#if USE_SPLASH_SCREEN
+  QPixmap pixmap(QLatin1String( ":/images/application_splash" ));
+  QSplashScreen splash(pixmap);
+  splash.show();
+  qtApp.processEvents();//This is used to accept a click on the screen so that user can cancel the screen
+#endif
+
+  //
+  // 0bis. Parse pre-initialization command-line arguments.
+  QStringList args( qtApp.arguments() );
+  {
+  for( QStringList::iterator it( args.begin() );
+       it!=args.end(); )
+    if( it->compare( "-h" )==0 ||
+	it->compare( "--help" )==0 )
+      {
+      std::cout
+	<< mvd::ToLocalStdString(
+	  QCoreApplication::translate(
+	    PROJECT_NAME,
+	    "Usage: %1 [-h|--help] [-a|--applications] [<filename>...]\n"
+	    "  -h, --help         display this help message.\n"
+	    "  -a, --applications load OTB-applications from OTB_APPLICATIONS_PATH."
+	  )
+	  .arg( QFileInfo( argv[ 0 ] ).baseName() )
+	)
+	<< std::endl;
+
+      return ERROR_CODE_USAGE;
+      }
+    else
+      {
+      ++ it;
+      }
+  }
+
+  //
+  // 1. Initialize application and sync settings.
+  //
+  // Coverity-14835
+  // {
+  mvd::Application * application = NULL;
+
+  try
+    {
+    application = new mvd::Application( &qtApp );
+    assert( application!=NULL );
+
+    application->Initialize();
+    }
+  catch( std::exception & exc )
+    {
+    QMessageBox::StandardButton button =
+      QMessageBox::question(
+	NULL,
+	QCoreApplication::translate(
+	  PROJECT_NAME,
+	  "Question!"
+	),
+	QCoreApplication::translate(
+	  PROJECT_NAME,
+	  "The following exception has been caught while initializing the software:\n\n"
+	  "%1\n\n"
+	  "The application may not function as expected. Do you want to continue?"
+	)
+	.arg( exc.what() ),
+	QMessageBox::Yes | QMessageBox::No,
+	QMessageBox::Yes
+      );
+
+    if( button==QMessageBox::No )
+      return ERROR_CODE_I18N;
+    }
+  // }
+  // Coverity-14835
+
+  //
+  // 2. Initialize main-window (UI).
+  mvd::MainWindow mainWindow;
+  mainWindow.Initialize();
+
+  //
+  // 3. Show window.
+  mainWindow.show();
+
+#if USE_SPLASH_SCREEN
+  splash.finish( &mainWindow );
+#endif // USE_SPLASH_SCREEN
+
+  //
+  // 4. Check OpenGL capabilities
+  if( !mainWindow.CheckGLCapabilities() )
+    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 )
+	{
+#if USE_OTB_APPS
+	mainWindow.SetupOTBApplications();
+#else // USE_OTB_APPS
+	qWarning() << "OTB-applications support is not included in this build.";
+#endif // USE_OTB_APPS
+
+	it = args.erase( it );
+	}
+      }
+    else
+      {
+      ++ it;
+      }
+  }
+
+  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;
+  application = NULL;
+  // }
+  // Coverity-14835
+
+  return result;
+}
+
+
+/*****************************************************************************/
+/* FUNCTIONS IMPLEMENTATION                                                  */
+/*****************************************************************************/
diff --git a/Modules/Visualization/Monteverdi/src/mvdApplication.cxx b/Modules/Visualization/Monteverdi/src/mvdApplication.cxx
new file mode 100644
index 0000000..e42c38f
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdApplication.cxx
@@ -0,0 +1,143 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdApplication.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdStackedLayerModel.h"
+
+//
+#ifdef OTB_USE_QT4
+#  include "mvdOTBApplicationsModel.h"
+#endif
+
+//
+// Class implementation.
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::Application
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+Application
+::Application( QApplication* qtApp ) :
+  I18nApplication( qtApp ),
+  m_OTBApplicationsModel( NULL )
+{
+}
+
+/*******************************************************************************/
+Application
+::~Application()
+{
+}
+
+/*******************************************************************************/
+/*
+CountType
+Application
+::OpenDatabase()
+{
+  DatabaseModel* databaseModel = new DatabaseModel( this );
+
+  DatabaseModel::BuildContext context;
+  databaseModel->BuildModel( &context );
+
+  SetModel( databaseModel );
+
+  return context.m_NbOutdatedDatasetModels;
+}
+*/
+
+/*******************************************************************************/
+/*
+void
+Application
+::CloseDatabase()
+{
+  // Delete model and release resources.
+  SetModel( NULL );
+}
+*/
+
+/*******************************************************************************/
+void
+Application
+::OpenApplicationsBrowser()
+{
+#ifdef OTB_USE_QT4
+  m_OTBApplicationsModel = new OTBApplicationsModel( this );
+
+  m_OTBApplicationsModel->BuildModel();
+#endif
+}
+
+/*******************************************************************************/
+void
+Application
+::virtual_InitializeCore()
+{
+  I18nApplication::virtual_InitializeCore();
+
+  setObjectName( "Application" );
+
+  InitializeCore(
+    PROJECT_NAME, QString( "OTB %1" ).arg(  OTB_VERSION_STRING ),
+    "OrfeoToolBox", "orfeo-toolbox.org"
+  );
+
+  //
+  // Create the OTBApplications model
+  OpenApplicationsBrowser();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
new file mode 100644
index 0000000..5a93be0
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
@@ -0,0 +1,2444 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  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 "mvdMainWindow.h"
+#include "ui_mvdMainWindow.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include <otbQtAdapters.h>
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#if defined( OTB_USE_QT4 ) && USE_OTB_APPS
+# include "mvdApplicationLauncher.h"
+# include "mvdApplicationsToolBoxController.h"
+# include "mvdOTBApplicationsModel.h"
+# include "mvdQtWidgetView.h"
+#endif
+//
+// #include "mvdDatabaseModel.h"
+// #include "mvdDatasetModel.h"
+#include "mvdQuicklookModel.h"
+#include "mvdVectorImageModel.h"
+//
+#include "mvdApplicationsToolBox.h"
+#include "mvdColorSetupController.h"
+#include "mvdColorSetupWidget.h"
+#include "mvdColorDynamicsController.h"
+#include "mvdColorDynamicsWidget.h"
+// #include "mvdDatabaseBrowserController.h"
+#if ENABLE_TREE_WIDGET_TEST
+// #include "mvdDatabaseBrowserWidgetTest.h"
+#else // ENABLE_TREE_WIDGET_TEST
+// #include "mvdDatabaseBrowserWidget.h"
+#endif // ENABLE_TREE_WIDGET_TEST
+// #include "mvdDatasetPropertiesController.h"
+// #include "mvdDatasetPropertiesWidget.h"
+#include "mvdFilenameDragAndDropEventFilter.h"
+#include "mvdHistogramController.h"
+#include "mvdHistogramWidget.h"
+#include "mvdImageViewManipulator.h"
+#include "mvdImageViewRenderer.h"
+#include "mvdImageViewWidget.h"
+#include "mvdImportSubDatasetDialog.h"
+#include "mvdKeymapDialog.h"
+#include "mvdLayerStackController.h"
+#include "mvdLayerStackWidget.h"
+#if USE_PIXEL_DESCRIPTION
+#  include "mvdPixelDescriptionWidget.h"
+#endif // USE_PIXEL_DESCRIPTION
+#include "mvdQuicklookViewManipulator.h"
+#include "mvdQuicklookViewRenderer.h"
+#include "mvdShaderWidget.h"
+#include "mvdStatusBarWidget.h"
+//
+#include "mvdApplication.h"
+#include "mvdPreferencesDialog.h"
+
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::MainWindow
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+#define REFERENCE_LAYER_COMBOBOX_NAME "referenceLayerComboBox"
+
+#define FORCE_NO_GLSL ( ( defined( OTB_DEBUG ) && 0 ) || 0 )
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+MainWindow
+::MainWindow( QWidget* p, Qt::WindowFlags flags ) :
+  I18nMainWindow( p, flags ),
+  m_UI( new mvd::Ui::MainWindow() ),
+  m_ColorDynamicsDock( NULL ),
+  m_ColorSetupDock( NULL ),
+  // m_DatabaseBrowserDock( NULL ),
+  // m_DatasetPropertiesDock(NULL),
+  m_LayerStackDock( NULL ),
+#if USE_PIXEL_DESCRIPTION
+  m_PixelDescriptionDock(NULL),
+#endif // USE_PIXEL_DESCRIPTION
+  m_HistogramDock( NULL ),
+#if defined( OTB_USE_QT4 ) && USE_OTB_APPS
+  m_OtbApplicationsBrowserDock(NULL),
+#endif
+  m_ImageView( NULL ),
+  m_QuicklookViewDock( NULL ),
+#if USE_TABBED_VIEW
+  m_CentralTabWidget( NULL ),
+#endif // USE_TABBED_VIEW
+  m_StatusBarWidget( NULL ),
+  m_ShaderWidget( NULL ),
+  m_FilenameDragAndDropEventFilter( NULL ),
+  m_KeymapDialog( NULL ),
+  m_GLSL140( -2 )
+{
+  m_UI->setupUi( this );
+
+  //
+  //
+  m_KeymapDialog = new KeymapDialog( this );
+
+  //
+  // Event filters.
+  m_FilenameDragAndDropEventFilter = new FilenameDragAndDropEventFilter( this );
+
+  QObject::connect(
+    m_FilenameDragAndDropEventFilter,
+    SIGNAL( FilenamesDropped( const QStringList & ) ),
+    // to:
+    this,
+    SLOT( ImportImages( const QStringList & ) )
+  );
+}
+
+/*****************************************************************************/
+MainWindow
+::~MainWindow()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+bool
+MainWindow
+::CheckGLCapabilities()
+{
+  assert( m_ImageView!=NULL );
+  assert( m_ImageView->GetRenderer()!=NULL );
+
+  // Coverity-19845
+  //
+  // if( m_ImageView==NULL ||
+  //     m_ImageView->GetRenderer()==NULL )
+  //   return false;
+
+  bool isGLSL = m_ImageView->GetRenderer()->CheckGLCapabilities( &m_GLSL140 );
+
+#if FORCE_NO_GLSL
+  m_ImageView->GetRenderer()->SetGLSLEnabled( false );
+
+  isGLSL = false;
+#endif // FORCE_NO_GLSL
+
+  // MANTIS-1204
+  // {
+  //
+  // Forward GLSL state to quicklook view.
+  assert( GetQuicklookView()!=NULL );
+  assert( GetQuicklookView()->GetRenderer()!=NULL );
+
+  GetQuicklookView()->GetRenderer()->SetGLSLEnabled( isGLSL );
+  // }
+
+  assert( m_ShaderWidget!=NULL );
+
+  m_ShaderWidget->SetGLSLEnabled( isGLSL );
+  m_ShaderWidget->SetGLSL140Enabled( m_GLSL140>=0 );
+
+  assert( m_StatusBarWidget!=NULL );
+
+  m_StatusBarWidget->SetGLSLEnabled( isGLSL );
+
+
+  return true;
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::virtual_SetupUI()
+{
+  assert( m_UI!=NULL );
+
+  setObjectName( PROJECT_NAME );
+
+#ifdef OTB_DEBUG
+  setWindowTitle( PROJECT_NAME " (Debug)" );
+#else // OTB_DEBUG
+  setWindowTitle( PROJECT_NAME );
+#endif // OTB_DEBUG
+
+  InitializeCentralWidget();
+
+  InitializeDockWidgets();
+
+  InitializeStatusBarWidgets();
+
+  InitializeRenderToolBar();
+  InitializeShaderToolBar();
+
+  if( !RestoreLayout( Monteverdi_UI_VERSION ) )
+    {
+    qWarning() << "Failed to restore window layout!";
+    }
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::virtual_ConnectUI()
+{
+  ConnectViewMenu();
+
+  //
+  // CHAIN CONTROLLERS.
+  // Forward model update signals of color-setup controller...
+  QObject::connect(
+    m_ColorSetupDock->findChild< AbstractModelController* >(),
+    SIGNAL( RgbChannelIndexChanged( RgbwChannel, int ) ),
+    // to: ...color-dynamics controller model update signal.
+    m_ColorDynamicsDock->findChild< AbstractModelController* >(),
+    SLOT( OnRgbChannelIndexChanged( RgbwChannel, int ) )
+  );
+  QObject::connect(
+    m_ColorSetupDock->findChild< AbstractModelController* >(),
+    SIGNAL( GrayChannelIndexChanged( int ) ),
+    // to: ...color-dynamics controller model update signal.
+    m_ColorDynamicsDock->findChild< AbstractModelController* >(),
+    SLOT( OnGrayChannelIndexChanged( int ) )
+  );
+  QObject::connect(
+    m_ColorSetupDock->findChild< AbstractModelController* >(),
+    SIGNAL( GrayscaleActivated( bool ) ),
+    // to: ...color-dynamics controller model update signal.
+    m_ColorDynamicsDock->findChild< AbstractModelController* >(),
+    SLOT( OnGrayscaleActivated( bool ) )
+  );
+
+  QObject::connect(
+    m_ColorSetupDock->findChild< AbstractModelController* >(),
+    SIGNAL( RgbChannelIndexChanged( RgbwChannel, int ) ),
+    // to: ...color-dynamics controller model update signal.
+    m_HistogramDock->findChild< AbstractModelController* >(),
+    SLOT( OnRgbChannelIndexChanged( RgbwChannel, int ) )
+  );
+  QObject::connect(
+    m_ColorSetupDock->findChild< AbstractModelController* >(),
+    SIGNAL( GrayChannelIndexChanged( int ) ),
+    // to: ...color-dynamics controller model update signal.
+    m_HistogramDock->findChild< AbstractModelController* >(),
+    SLOT( OnGrayChannelIndexChanged( int ) )
+  );
+  QObject::connect(
+    m_ColorSetupDock->findChild< AbstractModelController* >(),
+    SIGNAL( GrayscaleActivated( bool ) ),
+    // to: ...color-dynamics controller model update signal.
+    m_HistogramDock->findChild< AbstractModelController* >(),
+    SLOT( OnGrayscaleActivated( bool ) )
+  );
+
+  QObject::connect(
+    m_ColorDynamicsDock->findChild< AbstractModelController* >(),
+    SIGNAL( LowIntensityChanged( RgbwChannel, double, bool ) ),
+    // to: ...histogram controller model update signal.
+    m_HistogramDock->findChild< AbstractModelController* >(),
+    SLOT( OnLowIntensityChanged( RgbwChannel, double, bool ) )
+  );
+  QObject::connect(
+    m_ColorDynamicsDock->findChild< AbstractModelController* >(),
+    SIGNAL( HighIntensityChanged( RgbwChannel, double, bool ) ),
+    // to: ...histogram controller model update signal.
+    m_HistogramDock->findChild< AbstractModelController* >(),
+    SLOT( OnHighIntensityChanged( RgbwChannel, double, bool ) )
+  );
+  QObject::connect(
+    m_ColorDynamicsDock->findChild< AbstractModelController* >(),
+    SIGNAL( HistogramRefreshed() ),
+    // to: ...histogram controller model update signal.
+    m_HistogramDock->findChild< AbstractModelController* >(),
+    SLOT( OnHistogramRefreshed() )
+  );
+
+  //
+  // close tabs handling
+#if USE_TABBED_VIEW
+  QObject::connect(
+    m_CentralTabWidget,
+    SIGNAL( tabCloseRequested( int ) ),
+    this,
+    SLOT( OnTabCloseRequested( int ) )
+  );
+#endif // USE_TABBED_VIEW
+
+  //
+  // Other connections.
+
+  ConnectImageViews();
+
+  ConnectStatusBar();
+
+  //
+  // When everything is connected, install event-filter.
+  assert( m_ImageView!=NULL );
+  m_ImageView->installEventFilter( m_FilenameDragAndDropEventFilter );
+
+  {
+  assert( GetController( m_LayerStackDock )!=NULL );
+
+  LayerStackWidget * layerStackWidget =
+    GetController( m_LayerStackDock )->GetWidget< LayerStackWidget >();
+
+  assert( layerStackWidget!=NULL );
+
+  layerStackWidget->InstallEventFilter( m_FilenameDragAndDropEventFilter );
+  }
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::ConnectImageViews()
+{
+  assert( m_ImageView!=NULL );
+
+  QObject::connect(
+    this,
+    SIGNAL( UserZoomIn() ),
+    // to:
+    m_ImageView,
+    SLOT( ZoomIn() )
+  );
+
+  QObject::connect(
+    this,
+    SIGNAL( UserZoomOut() ),
+    // to:
+    m_ImageView,
+    SLOT( ZoomOut() )
+  );
+
+  QObject::connect(
+    this,
+    SIGNAL( UserZoomExtent() ),
+    m_ImageView,
+    SLOT( ZoomToExtent() )
+  );
+
+  QObject::connect(
+    this,
+    SIGNAL( UserZoomFull() ),
+    m_ImageView,
+    SLOT( ZoomToFullResolution() )
+  );
+
+  QObject::connect(
+    this,
+    SIGNAL( UserZoomLayer() ),
+    m_ImageView,
+    SLOT( ZoomToLayerExtent() )
+  );
+
+  //
+  // Connect image-views for ROI-changed events.
+
+  const AbstractImageViewManipulator* imageViewManipulator =
+    m_ImageView->GetManipulator();
+
+  assert( imageViewManipulator!=NULL );
+
+
+  ImageViewWidget* quicklookView = GetQuicklookView();
+  assert( quicklookView!=NULL );
+
+  const AbstractImageViewManipulator* quicklookManipulator =
+    quicklookView->GetManipulator();
+
+  assert( quicklookManipulator!=NULL );
+
+
+  QObject::connect(
+    m_ImageView,
+    SIGNAL( RoiChanged(
+        const PointType &, const SizeType &, const SpacingType &, const PointType & )
+    ),
+    // to:
+    quicklookManipulator,
+    SLOT( OnRoiChanged(
+        const PointType &, const SizeType &, const SpacingType &, const PointType & )
+    )
+  );
+
+  QObject::connect(
+    quicklookView,
+    SIGNAL( CenterRoiRequested( const PointType& ) ),
+    // to:
+    imageViewManipulator,
+    SLOT( CenterOn( const PointType& ) )
+  );
+
+  // Not needed anymore becaure already done in ImageViewWidget.
+  // QObject::connect(
+  //   quicklookManipulator,
+  //   SIGNAL( RefreshViewRequested() ),
+  //   // to:
+  //   m_ImageView,
+  //   SLOT( updateGL() )
+  // );
+
+  //
+  // Connect controllers to image-views.
+  //
+
+  {
+  assert( m_LayerStackDock!=NULL );
+
+  AbstractModelController * controller = GetController( m_LayerStackDock );
+  assert( controller!=NULL );
+
+  QObject::connect(
+    controller,
+    SIGNAL( ApplyAllRequested() ),
+    // to:
+    m_ImageView,
+    SLOT( OnApplyAllRequested() )
+  );
+
+  QObject::connect(
+    controller,
+    SIGNAL( ApplyAllRequested() ),
+    // to:
+    quicklookView,
+    SLOT( OnApplyAllRequested() )
+  );
+  }
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::ConnectViewMenu()
+{
+  m_UI->menu_View->addAction( m_UI->m_ToolBar->toggleViewAction() );
+  m_UI->menu_View->addAction( m_UI->m_RenderToolBar->toggleViewAction() );
+  m_UI->menu_View->addAction( m_UI->m_ShaderToolBar->toggleViewAction() );
+
+  m_UI->menu_View->addSeparator();
+
+  m_UI->menu_View->addAction( m_ColorSetupDock->toggleViewAction() );
+  m_UI->menu_View->addAction( m_ColorDynamicsDock->toggleViewAction() );
+  m_UI->menu_View->addAction( m_HistogramDock->toggleViewAction() );
+  m_UI->menu_View->addAction( m_LayerStackDock->toggleViewAction() );
+  m_UI->menu_View->addAction( m_QuicklookViewDock->toggleViewAction() );
+
+  m_UI->menu_View->addSeparator();
+
+  m_UI->menu_View->addAction( m_UI->action_LoadOTBApplications );
+
+#if USE_PIXEL_DESCRIPTION
+  m_UI->menu_View->addAction( m_PixelDescriptionDock->toggleViewAction() );
+#endif // USE_PIXEL_DESCRIPTION
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::ConnectStatusBar()
+{
+  assert( m_StatusBarWidget!=NULL );
+  assert( m_ImageView!=NULL );
+
+  QObject::connect(
+    m_ImageView,
+    SIGNAL( ScaleChanged( double, double ) ),
+    // to:
+    m_StatusBarWidget,
+    SLOT( SetScale( double, double ) )
+  );
+
+  QObject::connect(
+    m_StatusBarWidget,
+    SIGNAL( ScaleChanged( double ) ),
+    // to:
+    m_ImageView->GetManipulator(),
+    SLOT( ZoomTo( double ) )
+  );
+
+  QObject::connect(
+    m_StatusBarWidget,
+    SIGNAL( PixelIndexChanged( const IndexType& ) ),
+    // to:
+    m_ImageView,
+    SLOT( CenterOnSelected( const IndexType& ) )
+  );
+
+  QObject::connect(
+    m_ImageView,
+    SIGNAL( PixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & ) ),
+    // to:
+    this,
+    SLOT( OnPixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & ) )
+  );
+}
+
+/*****************************************************************************/
+#if USE_PIXEL_DESCRIPTION
+
+void
+MainWindow
+::ConnectPixelDescriptionWidget( AbstractLayerModel * model )
+{
+  if( model==NULL ||
+      !model->inherits( VectorImageModel::staticMetaObject.className() ) )
+    return;
+
+  // Access vector-image model.
+  VectorImageModel * vectorImageModel =
+    qobject_cast< VectorImageModel * >( model );
+
+  assert( vectorImageModel==qobject_cast< VectorImageModel * >( model ) );
+  assert( vectorImageModel!=NULL );
+
+  //
+  // send the physical point of the clicked point in screen
+  // vectorImageModel is in charge of pixel information computation
+  QObject::connect(
+    m_ImageView,
+    SIGNAL(
+      PhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType &
+      )
+    ),
+    // to:
+    vectorImageModel,
+    SLOT(
+      OnPhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType&
+      )
+    )
+  );
+
+  QObject::connect(
+    GetQuicklookView(),
+    SIGNAL(
+      PhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType&
+      )
+    ),
+    // to:
+    vectorImageModel,
+    SLOT(
+      OnPhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType&
+      )
+    )
+  );
+
+  // get the PixelDescription widget
+  // TODO: Make a widget controller!
+  PixelDescriptionWidget * pixelDescriptionWidget =
+    qobject_cast< PixelDescriptionWidget * >(
+      m_PixelDescriptionDock->findChild< PixelDescriptionWidget * >()
+    );
+
+  assert( pixelDescriptionWidget!=NULL );
+
+  QObject::connect(
+    vectorImageModel,
+    SIGNAL( CurrentPhysicalUpdated( const QStringList & ) ),
+    // to:
+    pixelDescriptionWidget,
+    SLOT( OnCurrentPhysicalUpdated( const QStringList & ) )
+  );
+
+  QObject::connect(
+    vectorImageModel,
+    SIGNAL( CurrentGeographicUpdated( const QStringList & ) ),
+    // to:
+    pixelDescriptionWidget,
+    SLOT( OnCurrentGeographicUpdated( const QStringList & ) )
+  );
+
+  QObject::connect(
+    vectorImageModel,
+    SIGNAL( CurrentPixelValueUpdated(const VectorImageType::PixelType &,
+                                     const QStringList & ) ),
+    // to:
+    pixelDescriptionWidget,
+    SLOT( OnCurrentPixelValueUpdated(const VectorImageType::PixelType &,
+                                     const QStringList & ) )
+  );
+}
+
+#endif // USE_PIXEL_DESCRIPTION
+
+/*****************************************************************************/
+#if USE_PIXEL_DESCRIPTION
+
+void
+MainWindow
+::DisconnectPixelDescriptionWidget( const AbstractLayerModel * model )
+{
+  if( model==NULL ||
+      !model->inherits( VectorImageModel::staticMetaObject.className() ) )
+    return;
+
+  // Access vector-image model.
+  const VectorImageModel * vectorImageModel =
+    qobject_cast< const VectorImageModel * >( model );
+
+  assert( vectorImageModel==qobject_cast< const VectorImageModel * >( model ) );
+  assert( vectorImageModel!=NULL );
+
+  //
+  // send the physical point of the clicked point in screen
+  // vectorImageModel is in charge of pixel information computation
+  QObject::disconnect(
+    m_ImageView,
+    SIGNAL(
+      PhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType &
+      )
+    ),
+    // to:
+    vectorImageModel,
+    SLOT(
+      OnPhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType &
+      )
+    )
+  );
+
+  QObject::disconnect(
+    GetQuicklookView(),
+    SIGNAL(
+      PhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType &
+      )
+    ),
+    // to:
+    vectorImageModel,
+    SLOT(
+      OnPhysicalCursorPositionChanged(
+	const QPoint &,
+	const PointType &,
+	const PointType &,
+	const DefaultImageType::PixelType&
+      )
+    )
+  );
+
+  // get the PixelDescription widget
+  // TODO: Make a widget controller!
+  PixelDescriptionWidget * pixelDescriptionWidget =
+    qobject_cast< PixelDescriptionWidget * >(
+      m_PixelDescriptionDock->findChild< PixelDescriptionWidget * >()
+    );
+
+  assert( pixelDescriptionWidget!=NULL );
+
+  QObject::disconnect(
+    vectorImageModel,
+    SIGNAL( CurrentPhysicalUpdated( const QStringList & ) ),
+    // to:
+    pixelDescriptionWidget,
+    SLOT( OnCurrentPhysicalUpdated( const QStringList & ) )
+  );
+
+  QObject::disconnect(
+    vectorImageModel,
+    SIGNAL( CurrentGeographicUpdated( const QStringList & ) ),
+    // to:
+    pixelDescriptionWidget,
+    SLOT( OnCurrentGeographicUpdated( const QStringList & ) )
+  );
+
+  QObject::connect(
+    vectorImageModel,
+    SIGNAL(
+      CurrentPixelValueUpdated(
+        const VectorImageType::PixelType &,
+        const QStringList &
+      )
+    ),
+    // to:
+    pixelDescriptionWidget,
+    SLOT(
+      OnCurrentPixelValueUpdated(
+        const VectorImageType::PixelType &,
+        const QStringList &
+      )
+    )
+  );
+}
+
+#endif // USE_PIXEL_DESCRIPTION
+
+/*****************************************************************************/
+void
+MainWindow
+::InitializeDockWidgets()
+{
+#define ENABLE_QTOOLBAR_TEST 0
+#if ENABLE_QTOOLBAR_TEST
+  // XP: QToolBar test.
+  QDockWidget* dock =
+    AddWidgetToDock(
+      m_UI->m_ToolBar,
+      "TOOL_BAR",
+      tr( "Tool bar" ),
+      Qt::TopDockWidgetArea
+    );
+
+  m_UI->menu_View->addAction( dock->toggleViewAction() );
+#endif
+
+  //
+  // Left pane.
+
+  //
+  // Right pane.
+
+  // Quicklook-view dock-widget
+  assert( m_QuicklookViewDock==NULL );
+  assert( m_ImageView!=NULL );
+  m_QuicklookViewDock = AddWidgetToDock(
+    CreateQuicklookViewWidget( m_ImageView ),
+    "QUICKLOOK_VIEW",
+    tr( "Quicklook view" ),
+    Qt::RightDockWidgetArea
+  );
+
+  // Histogram-view.
+  assert( m_HistogramDock==NULL );
+  m_HistogramDock =
+    AddDockWidget
+    < HistogramWidget, HistogramController, QDockWidget >
+    ( "HISTOGRAM",
+      tr( "Histogram" ),
+      Qt::RightDockWidgetArea
+    );
+
+  tabifyDockWidget( m_QuicklookViewDock, m_HistogramDock );
+
+#if USE_PIXEL_DESCRIPTION
+
+  // Pixel Description (no controller needed here / direct update of
+  // the pixel description through signals from VectorImageModel)
+  assert( m_PixelDescriptionDock==NULL );
+  m_PixelDescriptionDock =
+    AddDockWidget
+    < PixelDescriptionWidget, QDockWidget >
+    ( "CURRENT_PIXEL_DESCRIPTION",
+      tr( "Pixel Description" ),
+      Qt::RightDockWidgetArea
+    );
+
+  tabifyDockWidget( m_PixelDescriptionDock, m_HistogramDock );
+
+#endif // USE_PIXEL_DESCRIPTION
+
+  // Color-setup.
+  assert( m_ColorSetupDock==NULL );
+  m_ColorSetupDock =
+    AddDockWidget
+    < ColorSetupWidget, ColorSetupController, QDockWidget >
+    ( "COLOR_SETUP",
+      tr( "Color setup" ),
+      Qt::RightDockWidgetArea
+    );
+
+  // Color-dynamics.
+  assert( m_ColorDynamicsDock==NULL );
+  m_ColorDynamicsDock =
+    AddDockWidget
+    < ColorDynamicsWidget, ColorDynamicsController, QDockWidget >
+    ( "COLOR_DYNAMICS",
+      tr( "Color dynamics" ),
+      Qt::RightDockWidgetArea,
+      I18nMainWindow::DOCK_LAYOUT_SCROLLABLE
+    );
+
+  // Tabify dock-widgets.
+  tabifyDockWidget( m_ColorSetupDock, m_ColorDynamicsDock );
+
+
+  //
+  // Bottom pane
+  //
+
+  // Layer-stack editor.
+  assert( m_LayerStackDock==NULL );
+  m_LayerStackDock = AddDockWidget<
+    LayerStackWidget, LayerStackController, QDockWidget >(
+      "LAYER_STACK",
+      tr( "Layer stack" ),
+      Qt::BottomDockWidgetArea
+    );
+
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::InitializeCentralWidget()
+{
+#if USE_TABBED_VIEW
+  // Create central tab-widget for multi-view support.
+  assert( m_CentralTabWidget==NULL );
+  m_CentralTabWidget = new QTabWidget( this );
+
+  // Customize it.
+  m_CentralTabWidget->setTabsClosable( true );
+
+  // Set-it up as central widget.
+  setCentralWidget( m_CentralTabWidget );
+
+  //
+  // access to the quicklook tabBar to remove the close button
+  QTabBar* tabBar = m_CentralTabWidget->findChild< QTabBar* >();
+#endif // USE_TABBED_VIEW
+
+  // Initialize image-view.
+  assert( m_ImageView==NULL );
+  m_ImageView = CreateImageViewWidget();
+
+#if USE_TABBED_VIEW
+  // Add first tab: image-view.
+  int index = m_CentralTabWidget->addTab(
+    m_ImageView,
+    tr( "Image view" )
+  );
+
+  tabBar->setTabButton( index, QTabBar::RightSide, 0);
+  tabBar->setTabButton( index, QTabBar::LeftSide, 0);
+
+#else // USE_TABBED_VIEW
+  setCentralWidget( m_ImageView );
+
+#endif // USE_TABBED_VIEW
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::InitializeRenderToolBar()
+{
+  m_UI->m_RenderToolBar->addSeparator();
+
+  {
+  m_UI->m_RenderToolBar->addWidget(
+    new QLabel( tr( "Proj" ) )
+  );
+
+  QComboBox * comboBox =
+    new QComboBox( m_UI->m_RenderToolBar );
+
+  comboBox->setToolTip( tr( "Select projection used as reference for the view." ) );
+
+  assert( comboBox!=NULL );
+
+  comboBox->setObjectName( "referenceLayerComboBox" );
+  comboBox->setMinimumSize(
+    QSize(
+#ifdef OTB_DEBUG
+      116,
+#else
+      128,
+#endif
+      0
+    )
+  );
+
+  m_UI->m_RenderToolBar->addWidget( comboBox );
+  }
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::InitializeShaderToolBar()
+{
+  assert( m_ShaderWidget==NULL );
+
+  {
+  m_UI->m_ShaderToolBar->addWidget(
+    new QLabel( tr( "Layer FX" ) )
+  );
+
+  m_ShaderWidget = new ShaderWidget( m_UI->m_ShaderToolBar );
+
+  m_UI->m_ShaderToolBar->addWidget( m_ShaderWidget );
+  }
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::InitializeStatusBarWidgets()
+{
+  // MANTIS-
+  assert( m_StatusBarWidget==NULL );
+
+  m_StatusBarWidget = new StatusBarWidget( statusBar() );
+
+  statusBar()->addPermanentWidget( m_StatusBarWidget, 1 );
+
+  m_StatusBarWidget->setEnabled( false );
+}
+
+/*****************************************************************************/
+ImageViewWidget*
+MainWindow
+::CreateImageViewWidget( QGLWidget* sharedGlWidget )
+{
+  ImageViewRenderer* renderer =
+    new ImageViewRenderer( this );
+
+  ImageViewManipulator* manipulator =
+    new ImageViewManipulator(
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+      renderer->GetViewSettings(),
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+      this
+    );
+
+  ImageViewWidget* imageView = new ImageViewWidget(
+    manipulator, // (will be reparented.)
+    renderer, // (will be reparented.)
+    this,
+    sharedGlWidget
+  );
+
+  imageView->setMinimumWidth( 256 );
+
+  return imageView;
+}
+
+/*****************************************************************************/
+ImageViewWidget*
+MainWindow
+::CreateQuicklookViewWidget( QGLWidget* sharedGlWidget )
+{
+  QuicklookViewRenderer* renderer =
+    new QuicklookViewRenderer( this );
+
+  QuicklookViewManipulator* manipulator =
+    new QuicklookViewManipulator(
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+      renderer->GetViewSettings(),
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+      this
+    );
+
+  ImageViewWidget* quicklookView = new ImageViewWidget(
+    manipulator, // (will be reparented.)
+    renderer, // (will be reparented.)
+    this,
+    sharedGlWidget
+  );
+
+  quicklookView->SetPickingEnabled( false );
+  quicklookView->SetPickingDefaultStatus( false );
+
+  quicklookView->setMinimumSize(  64,  64 );
+  quicklookView->setMaximumSize( 512, 512 );
+  quicklookView->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
+
+  return quicklookView;
+}
+
+/*****************************************************************************/
+CountType
+MainWindow
+::ImportImage( const QString& filename, StackedLayerModel::SizeType index )
+{
+  // qDebug() << this << "::ImportImage(" << filename << "," << index << ")";
+
+  //
+  // Get stacked-layer.
+  assert( Application::Instance() );
+  assert(
+    Application::Instance()->GetModel()==
+    Application::Instance()->GetModel< StackedLayerModel >()
+  );
+
+  StackedLayerModel* stackedLayerModel =
+    Application::Instance()->GetModel< StackedLayerModel >();
+
+  assert( stackedLayerModel!=NULL );
+
+  //
+  // CDS import
+  {
+    ImportSubDatasetDialog * importDialog = new ImportSubDatasetDialog( filename, this );
+
+    assert( importDialog!=NULL );
+
+    if( importDialog->HasSubDatasets() )
+      {
+      if( importDialog->exec()==QDialog::Rejected )
+        {
+        delete importDialog;
+        return 0;
+        }
+
+      IntVector::size_type count = 0;
+      IntVector indices;
+
+      importDialog->GetSubDatasets( indices );
+
+      for( IntVector::size_type i=0;
+	   i<indices.size();
+	   ++ i )
+	count +=
+	  ImportImage(
+	    QString( "%1%2&sdataidx=%3" ).arg( filename ).arg( filename.count(QChar('?')) ? "" : "?" ).arg( indices[ i ] ),
+	    index + count
+	  );
+
+      delete importDialog;
+      return count;
+      }
+    else
+      {
+      delete importDialog;
+      }
+  }
+  // CDS import.
+  //
+
+  //
+  // Count images regarding their spatial-reference type.
+  size_t gcs = 0; // Geo/Carto/Sensor
+  size_t unk = 0; // Unknown
+
+  stackedLayerModel->CountSRT( unk, gcs, gcs, gcs );
+
+  //
+  //
+  // Coverity-112757
+  // {
+  SpatialReferenceType srt = SRT_UNKNOWN;
+
+  try
+    {
+    // qDebug()
+    //   << this << "\n"
+    //   << "\tQString:" << filename;
+
+    // std::cout
+    //   << "\tstd::string: " << QFile::encodeName( filename ).constData()
+    //   << std::endl;
+
+    srt = GetSpatialReferenceType( QFile::encodeName( filename ).constData() );
+    }
+  catch( const std::exception & exception )
+    {
+    QMessageBox::warning(
+      this,
+      "Warning!",
+      tr( "Exception caught while checking Spatial Reference Type of image-file '%1':\n\n%2" )
+      .arg( filename )
+      .arg( exception.what() )
+    );
+    }
+  // }
+  // Coverity-112757.
+
+  QMessageBox::StandardButton button = QMessageBox::NoButton;
+
+  if( unk==0 && gcs>0 && srt==SRT_UNKNOWN )
+    {
+    button =
+      QMessageBox::warning(
+	this,
+	tr( "Warning!" ),
+	tr( "No projection information (geographical or cartographical coordinate-system or sensor model) has been found for image. While already loaded images all have some, they are displayed in a geo-referenced view.\n\nLoading '%1' will cause the display to switch to a non geo-referenced view (where images are displayed relatively regarding their origin and spacing)." )
+	.arg( filename ),
+	QMessageBox::Ok | QMessageBox::Cancel
+      );
+    }
+
+  if( button==QMessageBox::Cancel )
+    return 0;
+
+  /*
+  switch( button )
+    {
+    case QMessageBox::Cancel:
+      return;
+      break;
+
+    case QMessageBox::Ok:
+      // Disable reference-layer combo-box.
+      // Disable layer-stack projection-button.
+      break;
+
+    default:
+      assert( false && "Unhandled QMessageBox::StandardButton value!" );
+      break;
+    }
+  */
+
+  //
+  // Import image file.
+  VectorImageModel * imageModel = ImportImage( filename, -1, -1 );
+
+  if( imageModel==NULL )
+    return 0;
+
+  //
+  // Bypass rendering of image-views.
+  assert( m_ImageView!=NULL );
+  bool bypassImageView = m_ImageView->SetBypassRenderingEnabled( true );
+
+  ImageViewWidget * quicklookView = GetQuicklookView();
+  assert( quicklookView!=NULL );
+
+  bool bypassQuicklookView = quicklookView->SetBypassRenderingEnabled( true );
+
+  //
+  // Block some signals.
+  //
+  // BUGFIX: MANTIS-1120
+  // {
+  assert( m_UI!=NULL );
+  assert( m_UI->m_RenderToolBar!=NULL );
+
+  QComboBox * referenceLayerComboBox =
+    m_UI->m_RenderToolBar->findChild< QComboBox * >(
+      REFERENCE_LAYER_COMBOBOX_NAME
+    );
+
+  assert( referenceLayerComboBox!=NULL );
+
+  bool blocked = referenceLayerComboBox->blockSignals( true );
+  // }
+
+  //
+  // Store image-mode in layer-stack.
+  stackedLayerModel->Insert( imageModel, index );
+
+  imageModel->setParent( stackedLayerModel );
+
+  stackedLayerModel->SetCurrent( imageModel );
+
+  if( gcs==0 )
+    {
+    if( unk==0 )
+      {
+      if( srt!=SRT_UNKNOWN )
+	stackedLayerModel->SetReference( imageModel  );
+
+      UserZoomExtent();
+      }
+    }
+  else if( unk==0 && srt==SRT_UNKNOWN )
+    stackedLayerModel->SetReference( StackedLayerModel::NIL_INDEX );
+
+  //
+  // Re-activate rendering of image-views.
+  m_ImageView->SetBypassRenderingEnabled( bypassImageView );
+  quicklookView->SetBypassRenderingEnabled( bypassQuicklookView );
+
+  //
+  // Un-block some signals.
+  //
+  // BUGFIX: MANTIS-1120
+  // {
+  referenceLayerComboBox->blockSignals( blocked );
+  // }
+  //
+
+  return 1;
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::ImportImages( const QStringList & filenames )
+{
+  if( filenames.isEmpty() )
+    return;
+
+  assert( I18nCoreApplication::Instance()!=NULL );
+
+  {
+    QVariant value(
+      I18nApplication::Instance()->RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_ENABLED
+      )
+    );
+
+    if( !( value.isValid() ? value.toBool() : OVERVIEWS_ENABLED_DEFAULT ) ||
+	!BuildGDALOverviews( filenames ) )
+      return;
+  }
+
+  if( filenames.count()==1 )
+    ImportImage( filenames.front(), 0 );
+
+  else
+    {
+    StackedLayerModel::SizeType i = 0;
+
+    for( QStringList::const_iterator it( filenames.constBegin() );
+         it!=filenames.end();
+	 ++it )
+      {
+        ImportImage( *it, i ++ );
+      }
+    }
+
+  assert( m_ImageView!=NULL );
+  m_ImageView->updateGL();
+
+  ImageViewWidget * quicklookView = GetQuicklookView();
+  assert( quicklookView!=NULL );
+
+  quicklookView->updateGL();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::closeEvent( QCloseEvent * e )
+{
+  assert( e!=NULL );
+
+  {
+    //
+    // List OTB-application widgets.
+    typedef QList< mvd::Wrapper::QtWidgetView * > QtWidgetViewList;
+
+    QtWidgetViewList c( findChildren< mvd::Wrapper::QtWidgetView * >() );
+
+    QStringList names;
+
+    //
+    // Find out which OTB-applications are running.
+    for( QtWidgetViewList::iterator it( c.begin() );
+	 it!=c.end();
+	 ++ it )
+      {
+      assert( *it );
+
+      if( !( *it )->IsClosable() )
+	{
+	assert( !( *it )->GetApplication().IsNull() );
+
+	// qDebug() << "OTB-application:" << ( *it )->GetApplication()->GetDocName();
+
+	names.push_back( ( *it )->GetApplication()->GetDocName() );
+	}
+      }
+
+    //
+    // If some OTB-application is running, display warning, names and
+    // prevent to close.
+    if( !names.isEmpty() )
+      {
+      QMessageBox::warning(
+	this,
+	tr( "Warning!" ),
+	tr(
+	  PROJECT_NAME
+	  " cannot exit while some OTB-application is running!\n\n"
+	  "Please wait for following OTB-applicatio(s) to exit:\n- %1"
+	)
+	.arg( names.join( "\n- " ) )
+      );
+
+      e->ignore();
+
+      return;
+      }
+  }
+
+
+  {
+    assert( I18nCoreApplication::Instance()!=NULL );
+    assert( I18nCoreApplication::Instance()->GetModel()==
+	    I18nCoreApplication::Instance()->GetModel< StackedLayerModel >() );
+
+    StackedLayerModel * stackedLayerModel =
+      I18nCoreApplication::Instance()->GetModel< StackedLayerModel >();
+
+    if( stackedLayerModel!=NULL &&
+	!stackedLayerModel->IsEmpty() )
+      {
+      QMessageBox::StandardButton button =
+	QMessageBox::question(
+	  this,
+	  PROJECT_NAME,
+	  tr( "Some files have been loaded. Are you sure you want to quit?" ),
+	  QMessageBox::Yes | QMessageBox::No
+	);
+
+      if( button==QMessageBox::No )
+	{
+	e->ignore();
+
+	return;
+	}
+      }
+  }
+
+
+  SaveLayout( Monteverdi_UI_VERSION );
+
+
+  //
+  // Otherwise, close.
+  I18nMainWindow::closeEvent( e );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::virtual_InitializeUI()
+{
+  assert( Application::Instance() );
+
+  Application::Instance()->SetModel( new StackedLayerModel() );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::ConnectReferenceLayerComboBox( StackedLayerModel * model )
+{
+  assert( model!=NULL );
+
+  QComboBox * comboBox =
+    m_UI->m_RenderToolBar->findChild< QComboBox * >(
+      REFERENCE_LAYER_COMBOBOX_NAME
+    );
+
+  assert( comboBox!=NULL );
+
+  QObject::connect(
+    comboBox,
+    SIGNAL( currentIndexChanged( int ) ),
+    // to:
+    this,
+    SLOT( OnReferenceLayerCurrentIndexChanged( int ) )
+  );
+
+  QObject::connect(
+    model,
+    SIGNAL( ContentChanged() ),
+    // to:
+    this,
+    SLOT( RefreshReferenceLayerComboBox() )
+  );
+
+  QObject::connect(
+    model,
+    SIGNAL( ContentReset() ),
+    // to:
+    this,
+    SLOT( RefreshReferenceLayerComboBox() )
+  );
+
+  QObject::connect(
+    model,
+    SIGNAL( OrderChanged() ),
+    // to:
+    this,
+    SLOT( RefreshReferenceLayerComboBox() )
+  );
+
+  QObject::connect(
+    model,
+    SIGNAL( ReferenceChanged( size_t ) ),
+    // to:
+    this,
+    SLOT( OnReferenceLayerChanged( size_t ) )
+  );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::SetupReferenceLayerComboBox( StackedLayerModel * model )
+{
+  QComboBox * comboBox =
+    m_UI->m_RenderToolBar->findChild< QComboBox * >(
+      REFERENCE_LAYER_COMBOBOX_NAME
+    );
+
+  assert( comboBox!=NULL );
+
+
+  bool blocked = comboBox->blockSignals( true );
+  {
+  comboBox->clear();
+
+  comboBox->addItem( "None" );
+  }
+  comboBox->blockSignals( blocked );
+
+
+  if( model==NULL )
+    return;
+
+
+  for( StackedLayerModel::SizeType i=0;
+       i<model->GetCount();
+       ++i )
+    {
+    AbstractLayerModel * layer = model->At( i );
+    assert( layer!=NULL );
+
+    if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+      {
+      const VectorImageModel * vectorImageModel =
+        qobject_cast< const VectorImageModel * >( layer );
+
+      assert( vectorImageModel!=NULL );
+
+      comboBox->addItem(
+        QString( "%1 (%2)" )
+        .arg( layer->GetAuthorityCode( true ).c_str()  )
+        .arg( QFileInfo( vectorImageModel->GetFilename() ).fileName() )
+      );
+      }
+    else
+      qDebug() << "Unhandled AbstractLayerModel subclass.";
+    }
+
+  {
+  size_t gcs = 0; // Geo/Carto/Sensor
+  size_t unk = 0; // Unknown
+
+  model->CountSRT( unk, gcs, gcs, gcs );
+
+  comboBox->setEnabled( model->GetCount()>0 && unk==0 );
+  }
+
+  comboBox->setCurrentIndex(
+    model->GetReferenceIndex()>=model->GetCount()
+    ? 0 // comboBox->count() - 1
+    : model->GetReferenceIndex() + 1
+  );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::DisconnectReferenceLayerComboBox( StackedLayerModel * model )
+{
+  QComboBox * comboBox =
+    m_UI->m_RenderToolBar->findChild< QComboBox * >(
+      REFERENCE_LAYER_COMBOBOX_NAME
+    );
+
+  assert( comboBox!=NULL );
+
+  QObject::disconnect(
+    comboBox,
+    SIGNAL( currentIndexChanged( int ) ),
+    // to:
+    this,
+    SLOT( OnReferenceLayerCurrentIndexChanged( int ) )
+  );
+
+  if( model!=NULL )
+    {
+    QObject::disconnect(
+      model,
+      SIGNAL( ContentChanged() ),
+      // to:
+      this,
+      SLOT( RefreshReferenceLayerComboBox() )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( ContentReset() ),
+      // to:
+      this,
+      SLOT( RefreshReferenceLayerComboBox() )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( OrderChanged() ),
+      // to:
+      this,
+      SLOT( RefreshReferenceLayerComboBox() )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( ReferenceChanged( size_t ) ),
+      // to:
+      this,
+      SLOT( OnReferenceLayerChanged( size_t ) )
+    );
+    }
+
+  comboBox->clear();
+  comboBox->setEnabled( false );
+}
+
+/****************************************************************************/
+#if USE_OTB_APPS
+
+void
+MainWindow
+::SetupOTBApplications()
+{
+  // qDebug() << this << "::SetupOTBApplications()";
+  // qDebug() << "{";
+
+  assert( m_OtbApplicationsBrowserDock==NULL );
+
+  //
+  // Load OTB-applications and create browser in dock-widget .
+  m_OtbApplicationsBrowserDock =
+    AddDockWidget
+    < ApplicationsToolBox, ApplicationsToolBoxController, QDockWidget >
+    ( "APPLICATIONS_BROWSER",
+      tr( "OTB-Applications browser" ),
+      Qt::RightDockWidgetArea
+    );
+
+  tabifyDockWidget( m_HistogramDock, m_OtbApplicationsBrowserDock );
+
+  SetControllerModel(
+    m_OtbApplicationsBrowserDock,
+    Application::Instance()->GetOTBApplicationsModel()
+  );
+
+  //
+  // Connect signals.
+  //
+  // need to get the ApplicationToolBox widget to setup connections.
+  // a double click on the tree widget should trigger a signal connected
+  // to this MainWindow slot. this slot will be in charge of getting the
+  // widget of the application selected, and show it in the
+  // MainWindow centralView.
+
+  // # Step 1 : get the ApplicationToolBoxWidget
+  ApplicationsToolBox* appWidget =
+    qobject_cast< ApplicationsToolBox * >(
+      m_OtbApplicationsBrowserDock->findChild< ApplicationsToolBox* >()
+    );
+  assert( appWidget!=NULL );
+
+  // # Step 2 : setup connections
+  QObject::connect(
+    appWidget,
+    SIGNAL( ApplicationToLaunchSelected(const QString &, const QString &) ),
+    this,
+    SLOT( OnApplicationToLaunchSelected(const QString &, const QString &) )
+  );
+
+  // # Step 3 : connect close slots
+  // TODO
+
+  //
+  // Update main-window UI.
+  m_UI->action_LoadOTBApplications->setEnabled( false );
+  m_UI->action_LoadOTBApplications->setVisible( false );
+
+  m_UI->menu_View->addAction(
+    m_OtbApplicationsBrowserDock->toggleViewAction()
+  );
+
+  // qDebug() << "}";
+}
+
+#endif // USE_OTB_APPS
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+MainWindow
+::on_action_Keymap_triggered()
+{
+  assert( m_KeymapDialog!=NULL );
+
+  if( m_KeymapDialog->isVisible() )
+    return;
+
+  m_KeymapDialog->show();
+}
+
+/****************************************************************************/
+void
+MainWindow
+::on_action_LoadOTBApplications_triggered()
+{
+#if USE_OTB_APPS
+  SetupOTBApplications();
+#endif // USE_OTB_APPS
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_OpenImage_triggered()
+{
+  //
+  // Select filename.
+  ImportImages(
+    otb::GetOpenFileNames( this, tr( "Open file..." ) )
+  );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_Preferences_triggered()
+{
+  PreferencesDialog prefDialog( this );
+
+  prefDialog.exec();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_SaveScreenshot_triggered()
+{
+  assert( m_ImageView!=NULL );
+
+  m_ImageView->SaveScreenshot( false );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_ZoomIn_triggered()
+{
+  emit UserZoomIn();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_ZoomOut_triggered()
+{
+  emit UserZoomOut();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_ZoomExtent_triggered()
+{
+  emit UserZoomExtent();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_ZoomFull_triggered()
+{
+  emit UserZoomFull();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::on_action_ZoomLayer_triggered()
+{
+  emit UserZoomLayer();
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnAboutToChangeModel( const AbstractModel * )
+{
+  // qDebug() << this << "::OnAboutToChangeModel(" << model << ")";
+
+
+  // Force to disconnect previously selected layer-model before
+  // stacked-layer model is disconnected.
+  //
+  // If there was no previously set layer-model, this will cause GUI
+  // views to be disabled.
+  //
+  // N.B.: This will cause UI controllers to disable widgets.
+  OnAboutToChangeSelectedLayerModel( StackedLayerModel::KeyType() );
+
+  // Assign stacked-layer model controller.
+  SetControllerModel( m_LayerStackDock, NULL );
+
+
+  assert( Application::Instance() );
+  assert( Application::Instance()->GetModel()==
+          Application::Instance()->GetModel< StackedLayerModel >() );
+
+  StackedLayerModel * stackedLayerModel =
+    Application::Instance()->GetModel< StackedLayerModel >();
+
+  DisconnectReferenceLayerComboBox( stackedLayerModel );
+
+  // Exit, if there were no previously set database model.
+  if( stackedLayerModel==NULL )
+    return;
+
+  // Disonnect stacked-layer model from main-window when selected
+  // layer-model is about to change.
+  QObject::disconnect(
+    stackedLayerModel,
+    SIGNAL(
+      AboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & )
+    ),
+    // from:
+    this,
+    SLOT(
+      OnAboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & )
+    )
+  );
+
+  // Disconnect stacked-layer model to main-window when selected
+  // layer-model has been changed.
+  QObject::disconnect(
+    stackedLayerModel,
+    SIGNAL( SelectedLayerModelChanged( const StackedLayerModel::KeyType & ) ),
+    // from:
+    this,
+    SLOT( OnSelectedLayerModelChanged( const StackedLayerModel:KeyType & ) )
+  );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnModelChanged( AbstractModel * model )
+{
+  // qDebug() << this << "::OnModelChanged(" << model << ")";
+
+  assert( model==qobject_cast< StackedLayerModel * >( model ) );
+
+  StackedLayerModel * stackedLayerModel =
+    qobject_cast< StackedLayerModel * >( model );
+
+  SetupReferenceLayerComboBox( stackedLayerModel );
+  ConnectReferenceLayerComboBox( stackedLayerModel );
+
+  // Assign stacked-layer model controller.
+  SetControllerModel( m_LayerStackDock, model );
+
+#if !RENDER_IMAGE_VIEW_DISABLED
+  m_ImageView->SetLayerStack( stackedLayerModel );
+#endif
+
+#if !RENDER_QUICKLOOK_VIEW_DISABLED
+  assert( GetQuicklookView()!=NULL );
+  GetQuicklookView()->SetLayerStack( stackedLayerModel );
+#endif
+
+  if( stackedLayerModel==NULL )
+    return;
+
+
+  // Connect stacked-layer model to main-window when selected layer-model
+  // is about to change.
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL(
+      AboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & )
+    ),
+    // to:
+    this,
+    SLOT(
+      OnAboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & )
+    )
+  );
+
+  // Connect stacked-layer -model to main-window when selected layer-model
+  // has been changed.
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( SelectedLayerModelChanged( const StackedLayerModel::KeyType & ) ),
+    // to:
+    this,
+    SLOT( OnSelectedLayerModelChanged( const StackedLayerModel::KeyType & ) )
+  );
+
+  // Force to connect selected layer-model after stacked-layer model
+  // is connected.
+  //
+  // N.B.: This will cause UI controllers to disable widgets.
+  OnSelectedLayerModelChanged( stackedLayerModel->GetCurrentKey() );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnAboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnAboutToChangeSelectedDatasetModel(" << FromStdString( key ) << ")";
+
+  //
+  // CONTROLLERS.
+  //
+
+  //
+  // Unset model from controllers.
+  //
+  // N.B.: This step must be done *before* disconnecting signals &
+  // slots between model(s) and view(s).
+  //
+  // See also, ::OnSelectedLayerModel() changed.
+
+  // Unset image-model from color-dynamics controller.
+  SetControllerModel( m_ColorDynamicsDock, NULL );
+
+  // Unset image-model from color-setup controller.
+  SetControllerModel( m_ColorSetupDock, NULL );
+
+  // Unset histogram-model from histogram controller.
+  SetControllerModel( m_HistogramDock, NULL );
+
+  // Unset stacked-layer model from stacked-layer controller.
+  // SetControllerModel( m_StackedLayerDock, NULL );
+
+  //
+  // VIEWS.
+  //
+
+  //
+  // MODEL(s).
+  //
+  assert( Application::Instance() );
+  assert( Application::Instance()->GetModel()==
+          Application::Instance()->GetModel< StackedLayerModel >() );
+
+  const StackedLayerModel * stackedLayerModel =
+    Application::Instance()->GetModel< StackedLayerModel >();
+
+  if( !stackedLayerModel )
+    return;
+
+  const AbstractLayerModel * layerModel = stackedLayerModel->GetCurrent();
+
+  if( !layerModel )
+    return;
+
+  if( layerModel->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    m_ShaderWidget->SetSettings( NULL );
+
+    // Disconnect previously selected image-model from view.
+    QObject::disconnect(
+      layerModel,
+      SIGNAL( SettingsUpdated() ),
+      // from:
+      this,
+      SLOT( OnSettingsUpdated()  )
+    );
+
+    //
+    // Disconnect shader-widget from model-updated slot.
+    QObject::disconnect(
+      m_ShaderWidget,
+      SIGNAL( SettingsChanged() ),
+      // from:
+      layerModel,
+      SLOT( OnModelUpdated() )
+    );
+    }
+
+  else
+    {
+    assert( false && "Unhandled AbstractLayerModel derived-type." );
+    }
+
+#if USE_PIXEL_DESCRIPTION
+  DisconnectPixelDescriptionWidget( layerModel );
+#endif // USE_PIXEL_DESCRIPTION
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnSelectedLayerModelChanged( const StackedLayerModel::KeyType & key )
+{
+  // qDebug()
+  //   << this << "::OnLayerModelChanged( " << FromStdString( key ) << ")";
+
+  assert( Application::Instance() );
+  assert( Application::Instance()->GetModel()==
+          Application::Instance()->GetModel< StackedLayerModel >() );
+
+  StackedLayerModel * stackedLayerModel =
+    Application::Instance()->GetModel< StackedLayerModel >();
+
+  assert( stackedLayerModel==Application::Instance()->GetModel() );
+
+  if( stackedLayerModel==NULL )
+    return;
+
+  //
+  // VIEWS.
+  //
+
+  //
+  // MODEL(s).
+  //
+
+  AbstractLayerModel * layerModel = stackedLayerModel->Get( key );
+
+  assert( m_StatusBarWidget!=NULL );
+
+  if( !layerModel )
+    {
+    m_StatusBarWidget->setEnabled( false );
+
+    return;
+    }
+
+  m_StatusBarWidget->setEnabled( true );
+
+  if( layerModel->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    //
+    // SAT: Using m_TabWidget->index( 0 ) or m_ImageView is equivalent
+    // since Qt may use signal & slot names to connect (see MOC .cxx
+    // files). Thus, using m_ImageView saves one indirection call.
+    QObject::connect(
+      layerModel,
+      SIGNAL( SettingsUpdated() ),
+      // to:
+      this,
+      SLOT( OnSettingsUpdated()  )
+    );
+
+    //
+    // Connect shader-widget to model-updated slot.
+    QObject::connect(
+      m_ShaderWidget,
+      SIGNAL( SettingsChanged() ),
+      // to:
+      layerModel,
+      SLOT( OnModelUpdated() )
+    );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layerModel );
+
+    assert( imageModel!=NULL );
+
+    setWindowTitle(
+#ifdef OTB_DEBUG
+      QString( PROJECT_NAME " (Debug) - %1" )
+#else // OTB_DEBUG
+      QString( PROJECT_NAME " - %1" )
+#endif // OTB_DEBUG
+      .arg( QFileInfo( imageModel->GetFilename() ).fileName() )
+    );
+
+    m_ShaderWidget->SetSettings( &imageModel->GetSettings() );
+    }
+  else
+    {
+    assert( false && "Unhandled AbstractLayerModel derived-type." );
+    }
+
+#if USE_PIXEL_DESCRIPTION
+  ConnectPixelDescriptionWidget( layerModel );
+#endif // USE_PIXEL_DESCRIPTION
+
+  //
+  // CONTROLLERS.
+  //
+
+  //
+  // Connect image-model controllers.
+  //
+  // N.B.: This step *must* be done after signals and slots between
+  // model(s) and view(s) have been connected (because when model is
+  // assigned to controller, widgets/view are reset and emit
+  // refreshing signals).
+  //
+  // See also: OnAboutToChangeLayerModel().
+
+  // Assign dataset-model to dataset-properties controller.
+
+  // Assign image-model to color-dynamics controller.
+  SetControllerModel( m_ColorDynamicsDock, layerModel );
+
+  // Assign image-model to color-setup controller.
+  SetControllerModel( m_ColorSetupDock, layerModel );
+
+  // Assign histogram-model to histogram controller.
+  SetControllerModel( m_HistogramDock, layerModel );
+
+  //
+  // TOOLBAR.
+  //
+  m_UI->action_ZoomIn->setEnabled( layerModel!=NULL );
+  m_UI->action_ZoomOut->setEnabled( layerModel!=NULL );
+  m_UI->action_ZoomExtent->setEnabled( layerModel!=NULL );
+  m_UI->action_ZoomFull->setEnabled( layerModel!=NULL );
+  m_UI->action_ZoomLayer->setEnabled( layerModel!=NULL );
+}
+
+/*****************************************************************************/
+#if defined( OTB_USE_QT4 ) && USE_OTB_APPS
+
+void
+MainWindow
+::OnApplicationToLaunchSelected( const QString & appName,
+                                 const QString & /**docName*/ )
+{
+  assert( Application::ConstInstance()!=NULL );
+  assert( Application::ConstInstance()->GetOTBApplicationsModel()!=NULL );
+  assert(
+    Application::ConstInstance()->GetOTBApplicationsModel()->GetLauncher()!=NULL
+  );
+
+#if USE_TABBED_VIEW
+  Wrapper::QtWidgetView * appWidget =
+    Application::ConstInstance()
+    ->GetOTBApplicationsModel()
+    ->GetLauncher()
+    ->NewOtbApplicationWidget(
+      appName,
+      true
+    );
+
+  assert( appWidget!=NULL );
+
+  //
+  // add the application in a tab
+  // TODO : check if this application is already opened ???
+  int tabIndex = m_CentralTabWidget->addTab(
+    appWidget, QIcon( ":/icons/process" ), docName );
+
+  // no checking needed here, if index is not available nothing is
+  // done. Focus on the newly added tab
+  m_CentralTabWidget->setCurrentIndex( tabIndex );
+
+  //
+  // on quit widget signal, close its tab
+  QObject::connect(
+    appWidget,
+    SIGNAL( QuitSignal() ),
+    // to:
+    this,
+    SLOT( OnTabCloseRequested() )
+    );
+
+#else // USE_TABBED_VIEW
+
+  QWidget * appWidget =
+    Application::ConstInstance()
+    ->GetOTBApplicationsModel()
+    ->GetLauncher()
+    ->NewOtbApplicationWindow(
+      appName,
+      true,
+      this
+    );
+
+  assert( appWidget!=NULL );
+
+  appWidget->show();
+
+#endif // USE_TABBED_VIEW
+
+  //
+  // connections. not using m_CentralTabWidget->currentWidget() leads
+  // to a wrong connection!!!!
+  QObject::connect(
+    appWidget,
+    SIGNAL( OTBApplicationOutputImageChanged( const QString&,
+					      const QString& ) ),
+    // to:
+    this,
+    SLOT( OnOTBApplicationOutputImageChanged( const QString&,
+					      const QString& ) )
+    );
+
+  QObject::connect(
+    appWidget,
+    SIGNAL( ExecutionDone( int ) ),
+    // to:
+    this,
+    SLOT( OnExecutionDone( int ) )
+  );
+}
+
+#endif // defined( OTB_USE_QT4 ) && USE_OTB_APPS
+
+/*****************************************************************************/
+#if USE_TABBED_VIEW
+
+void
+MainWindow
+::OnTabCloseRequested()
+{
+  // get current tab index
+  int currentIndex = m_CentralTabWidget->currentIndex();
+
+  // close tab and delete its widget
+  OnTabCloseRequested( currentIndex );
+}
+
+#endif // USE_TABBED_VIEW
+
+/*****************************************************************************/
+#if USE_TABBED_VIEW
+
+void
+MainWindow
+::OnTabCloseRequested( int index )
+{
+  assert( index >= 1 );
+
+  QWidget* appWidget = m_CentralTabWidget->widget( index );
+  assert( appWidget!=NULL );
+
+#if defined( OTB_USE_QT4 ) && USE_OTB_APPS
+
+  assert( appWidget==qobject_cast< Wrapper::QtWidgetView* >( appWidget ) );
+  Wrapper::QtWidgetView* appWidgetView =
+    qobject_cast< Wrapper::QtWidgetView* >( appWidget );
+  assert( appWidgetView!=NULL );
+
+  if( !appWidgetView->IsClosable() )
+    {
+    QMessageBox::warning(
+      this,
+      tr( "Warning!" ),
+      tr( "Tab cannot be closed while OTB application is running." )
+    );
+
+    return;
+    }
+
+#endif
+
+  m_CentralTabWidget->removeTab( index );
+
+  delete appWidget;
+  appWidget = NULL;
+}
+
+#endif // USE_TABBED_VIEW
+
+/*****************************************************************************/
+void
+MainWindow
+::OnOTBApplicationOutputImageChanged( const QString &,
+				      const QString & outfname )
+{
+  //
+  // If this slot is called, it means that an application has finished
+  // its process and has an output image parameter. The 'outfname' in
+  // parameters is the output filename. This slot may launch or not,
+  // depending on the app settings, the import of the 'outfname' to the
+  // catalog database.
+
+  // import the result image into the database
+  ImportImage( outfname, false );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnExecutionDone( int status )
+{
+  if( status<0 )
+    return;
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnReferenceLayerChanged( size_t index )
+{
+  // qDebug() << this << "::OnReferenceLayerChanged(" << index << ")";
+
+  //
+  // Access widget.
+  QComboBox * comboBox =
+    m_UI->m_RenderToolBar->findChild< QComboBox * >(
+      REFERENCE_LAYER_COMBOBOX_NAME
+    );
+
+  assert( comboBox!=NULL );
+
+  //
+  // Access model.
+  assert( I18nCoreApplication::Instance()!=NULL );
+  assert( I18nCoreApplication::Instance()->GetModel()==
+          I18nCoreApplication::Instance()->GetModel< StackedLayerModel >() );
+
+  StackedLayerModel * model =
+    I18nCoreApplication::Instance()->GetModel< StackedLayerModel >();
+
+  // assert( model!=NULL );
+
+  //
+  // Update widget from model.
+  // comboBox->setCurrentIndex(
+  //   model->GetReferenceIndex()>=model->GetCount()
+  //   ? 0 // comboBox->count() - 1
+  //   : model->GetReferenceIndex() + 1
+  // );
+  comboBox->setCurrentIndex(
+    index>=model->GetCount()
+    ? 0
+    : index + 1
+  );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnReferenceLayerCurrentIndexChanged( int index )
+{
+  // qDebug() << this << "::OnReferenceLayerCurrentIndexChanged(" << index << ")";
+
+  //
+  // Access widget.
+  QComboBox * comboBox =
+    m_UI->m_RenderToolBar->findChild< QComboBox * >(
+      REFERENCE_LAYER_COMBOBOX_NAME
+    );
+
+  assert( comboBox!=NULL );
+
+  //
+  // Access model.
+  assert( I18nCoreApplication::Instance()!=NULL );
+  assert( I18nCoreApplication::Instance()->GetModel()==
+          I18nCoreApplication::Instance()->GetModel< StackedLayerModel >() );
+
+  StackedLayerModel * model =
+    I18nCoreApplication::Instance()->GetModel< StackedLayerModel >();
+
+  assert( model!=NULL );
+
+
+  //
+  // Update model.
+  model->SetReference(
+    index<=0 // index>=comboBox->count() - 1
+    ? StackedLayerModel::NIL_INDEX
+    : comboBox->currentIndex() - 1
+  );
+}
+
+/*****************************************************************************/
+void
+MainWindow
+::OnSettingsUpdated()
+{
+  assert( m_ShaderWidget!=NULL );
+
+  m_ShaderWidget->UpdateSettings();
+
+  //
+  {
+  assert( m_ColorSetupDock!=NULL );
+
+  AbstractModelController * controller = GetController( m_ColorSetupDock );
+  assert( controller!=NULL );
+
+  if( controller->GetModel()!=NULL )
+    controller->ResetWidget();
+  }
+  //
+  {
+  assert( m_ColorDynamicsDock!=NULL );
+
+  AbstractModelController * controller = GetController( m_ColorDynamicsDock );
+  assert( controller!=NULL );
+
+  if( controller->GetModel()!=NULL )
+    controller->ResetWidget();
+  }
+  //
+
+  assert( m_ImageView!=NULL );
+
+  m_ImageView->updateGL();
+
+  //
+
+  ImageViewWidget * quicklookView = GetQuicklookView();
+  assert( quicklookView!=NULL );
+
+  quicklookView->updateGL();
+}
+
+/****************************************************************************/
+void
+MainWindow
+::RefreshReferenceLayerComboBox()
+{
+  // qDebug() << this << "::RefreshReferenceLayerComboBox()";
+
+  assert( I18nCoreApplication::Instance()!=NULL );
+  assert( I18nCoreApplication::Instance()->GetModel()==
+          I18nCoreApplication::Instance()->GetModel< StackedLayerModel >() );
+
+  SetupReferenceLayerComboBox(
+    I18nCoreApplication::Instance()->GetModel< StackedLayerModel >()
+  );
+}
+
+/****************************************************************************/
+void
+MainWindow
+::OnPixelInfoChanged( const QPoint &,
+		      const PointType &,
+		      const PixelInfo::Vector & pixels )
+{
+  //
+  // Get stacked-layer.
+  assert( Application::Instance() );
+  assert(
+    Application::Instance()->GetModel()==
+    Application::Instance()->GetModel< StackedLayerModel >()
+  );
+
+  const StackedLayerModel * stackedLayerModel =
+    Application::Instance()->GetModel< StackedLayerModel >();
+
+  assert( stackedLayerModel!=NULL );
+
+  if( !stackedLayerModel->HasCurrent() )
+    {
+    m_StatusBarWidget->SetPixelIndex( IndexType(), false );
+    m_StatusBarWidget->SetText( tr( "Select layer..." ) );
+
+    return;
+    }
+
+  StackedLayerModel::SizeType current = stackedLayerModel->GetCurrentIndex();
+  assert( current!=StackedLayerModel::NIL_INDEX );
+
+  m_StatusBarWidget->SetPixelIndex( pixels[ current ].m_Index, pixels[ current ].m_HasIndex );
+
+  QString text;
+
+  if( pixels[ current ].m_HasPoint &&
+      stackedLayerModel->HasReference() )
+    {
+    assert( stackedLayerModel->GetCurrent()!=NULL );
+
+    PointType wgs84;
+    double alt = std::numeric_limits< double >::quiet_NaN();
+
+    stackedLayerModel->GetCurrent()->ToWgs84( pixels[ current ].m_Point, wgs84, alt );
+
+    text =
+      tr( "(%1 %2 ; %3 %4 ; %5)" )
+      .arg( wgs84[ 0 ]>=0.0 ? "N" : "S" ).arg( fabs( wgs84[ 1 ] ) )
+      .arg( wgs84[ 1 ]>=0.0 ? "E" : "W" ).arg( fabs( wgs84[ 0 ] ) )
+      .arg( alt );
+    }
+
+  if( pixels[ current ].m_HasPixel )
+    {
+    if( !text.isEmpty() )
+      text.append( " " );
+
+    text.append(
+      tr( "[ R: %1 ; G: %2 ; B: %3 ]" )
+      .arg( pixels[ current ].m_Pixel[ 0 ] )
+      .arg( pixels[ current ].m_Pixel[ 1 ] )
+      .arg( pixels[ current ].m_Pixel[ 2 ] )
+    );
+    }
+
+  m_StatusBarWidget->SetText( text );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc b/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc
new file mode 100644
index 0000000..c4178f4
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.qrc
@@ -0,0 +1,30 @@
+<RCC>
+  <qresource prefix="/icons">
+    <file alias="action_SaveScreenshot_Icon">../../../../Utilities/Data/Icons/image-export_24x24.png</file>
+    <file alias="action_LayerDeleteAll_Icon">../../../../Utilities/Data/Icons/layers-remove_24x24.png</file>
+    <file alias="action_Reload_Icon">../../../../Utilities/Data/Icons/reload_24x24.png</file>
+    <file alias="action_ApplyAll_Icon">../../../../Utilities/Data/Icons/check_24x24.png</file>
+    <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_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>
+    <file alias="otb">../../../../Utilities/Data/Icons/monteverdi-32x32.png</file>
+    <file alias="process">../../../../Utilities/Data/Icons/alg.png</file>
+    <file>../../../../Utilities/Data/Icons/execute.png</file>
+    <file>../../../../Utilities/Data/Icons/locked.png</file>
+    <file>../../../../Utilities/Data/Icons/unlocked.png</file>
+    <file alias="forbidden">../../../../Utilities/Data/Icons/forbidden-128x128.png</file>
+    <file alias="action_ZoomIn_Icon">../../../../Utilities/Data/Icons/action-zoomin_24x24.png</file>
+    <file alias="action_ZoomExtent_Icon">../../../../Utilities/Data/Icons/action-zoomfullextent_24x24.png</file>
+    <file alias="action_ZoomOut_Icon">../../../../Utilities/Data/Icons/action-zoomout_24x24.png</file>
+    <file alias="action_ZoomLayer_Icon">../../../../Utilities/Data/Icons/action-zoomtolayer_24x24.png</file>
+    <file alias="action_Open_Icon">../../../../Utilities/Data/Icons/document-open_32x32.png</file>
+  </qresource>
+  <qresource prefix="/images">
+    <file alias="application_icon">../../../../Utilities/Data/Icons/monteverdi-128x128.png</file>
+    <file alias="application_splash">../../../../Utilities/Data/Icons/monteverdi-splash.png</file>
+  </qresource>
+</RCC>
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui b/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui
new file mode 100644
index 0000000..4e52db5
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.ui
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::MainWindow</class>
+ <widget class="QMainWindow" name="mvd::MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Main window</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <widget class="QWidget" name="m_CentralWidget"/>
+  <widget class="QMenuBar" name="m_MenuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>27</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menu_File">
+    <property name="title">
+     <string>&File</string>
+    </property>
+    <addaction name="action_OpenImage"/>
+    <addaction name="separator"/>
+    <addaction name="action_Quit"/>
+   </widget>
+   <widget class="QMenu" name="menu_Help">
+    <property name="title">
+     <string>&Help</string>
+    </property>
+    <addaction name="action_About"/>
+    <addaction name="action_Keymap"/>
+   </widget>
+   <widget class="QMenu" name="menu_View">
+    <property name="title">
+     <string>&View</string>
+    </property>
+    <addaction name="action_ZoomIn"/>
+    <addaction name="action_ZoomOut"/>
+    <addaction name="action_ZoomFull"/>
+    <addaction name="action_ZoomExtent"/>
+    <addaction name="action_ZoomLayer"/>
+    <addaction name="separator"/>
+    <addaction name="action_SaveScreenshot"/>
+   </widget>
+   <widget class="QMenu" name="menu_Edit">
+    <property name="title">
+     <string>&Edit</string>
+    </property>
+    <addaction name="action_Preferences"/>
+   </widget>
+   <addaction name="menu_File"/>
+   <addaction name="menu_Edit"/>
+   <addaction name="menu_View"/>
+   <addaction name="menu_Help"/>
+  </widget>
+  <widget class="QStatusBar" name="m_StatusBar"/>
+  <widget class="QToolBar" name="m_ToolBar">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="windowTitle">
+    <string>Main toolbar</string>
+   </property>
+   <property name="toolTip">
+    <string>Import image-file.</string>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+   <addaction name="action_OpenImage"/>
+  </widget>
+  <widget class="QToolBar" name="m_RenderToolBar">
+   <property name="windowTitle">
+    <string>Render-mode toolbar</string>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+   <addaction name="action_ZoomIn"/>
+   <addaction name="action_ZoomOut"/>
+   <addaction name="action_ZoomExtent"/>
+   <addaction name="action_ZoomLayer"/>
+   <addaction name="action_ZoomFull"/>
+   <addaction name="action_SaveScreenshot"/>
+  </widget>
+  <widget class="QToolBar" name="m_ShaderToolBar">
+   <property name="windowTitle">
+    <string>Selected layer effect toolbar</string>
+   </property>
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+  </widget>
+  <action name="action_Quit">
+   <property name="text">
+    <string>&Quit</string>
+   </property>
+   <property name="toolTip">
+    <string>Quit application.</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Q</string>
+   </property>
+  </action>
+  <action name="action_OpenImage">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_Open_Icon</normaloff>:/icons/action_Open_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>&Open image(s)...</string>
+   </property>
+   <property name="iconText">
+    <string>Open image(s)...</string>
+   </property>
+   <property name="toolTip">
+    <string>Open image file(s).</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+O</string>
+   </property>
+  </action>
+  <action name="action_About">
+   <property name="text">
+    <string>&About...</string>
+   </property>
+   <property name="iconText">
+    <string>About...</string>
+   </property>
+   <property name="toolTip">
+    <string>About...</string>
+   </property>
+  </action>
+  <action name="action_Preferences">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Prefere&nces</string>
+   </property>
+  </action>
+  <action name="action_ZoomIn">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_ZoomIn_Icon</normaloff>:/icons/action_ZoomIn_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom in</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl++</string>
+   </property>
+  </action>
+  <action name="action_ZoomOut">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_ZoomOut_Icon</normaloff>:/icons/action_ZoomOut_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom out</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+-</string>
+   </property>
+  </action>
+  <action name="action_ZoomExtent">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_ZoomExtent_Icon</normaloff>:/icons/action_ZoomExtent_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom to full extent</string>
+   </property>
+   <property name="shortcut">
+    <string>3</string>
+   </property>
+  </action>
+  <action name="action_ZoomFull">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_ZoomFull_Icon</normaloff>:/icons/action_ZoomFull_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom to full resolution (1:1)</string>
+   </property>
+   <property name="shortcut">
+    <string>1</string>
+   </property>
+  </action>
+  <action name="action_ZoomLayer">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_ZoomLayer_Icon</normaloff>:/icons/action_ZoomLayer_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>Zoom to layer extent</string>
+   </property>
+   <property name="toolTip">
+    <string>Zoom to layer extent</string>
+   </property>
+   <property name="shortcut">
+    <string>2</string>
+   </property>
+  </action>
+  <action name="action_Keymap">
+   <property name="text">
+    <string>&Keymap...</string>
+   </property>
+   <property name="toolTip">
+    <string>Display keyboard and mouse key mapping</string>
+   </property>
+  </action>
+  <action name="action_LoadOTBApplications">
+   <property name="text">
+    <string>OTB-Applications browser</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+A</string>
+   </property>
+  </action>
+  <action name="action_SaveScreenshot">
+   <property name="icon">
+    <iconset resource="mvdMainWindow.qrc">
+     <normaloff>:/icons/action_SaveScreenshot_Icon</normaloff>:/icons/action_SaveScreenshot_Icon</iconset>
+   </property>
+   <property name="text">
+    <string>Save screenshot</string>
+   </property>
+   <property name="toolTip">
+    <string>Take screenshot of image-view and save it into file</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+P</string>
+   </property>
+  </action>
+ </widget>
+ <resources>
+  <include location="mvdMainWindow.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/Monteverdi/src/mvdPreferencesDialog.cxx b/Modules/Visualization/Monteverdi/src/mvdPreferencesDialog.cxx
new file mode 100644
index 0000000..2c1f57f
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdPreferencesDialog.cxx
@@ -0,0 +1,489 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdPreferencesDialog.h"
+#include "ui_mvdPreferencesDialog.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include <otbQtAdapters.h>
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+#include "mvdGui.h"
+#include "mvdI18nApplication.h"
+#include "mvdI18nMainWindow.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::PreferencesDialog
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+bool
+IsPathModified( I18nCoreApplication::SettingsKey,
+		bool,
+		I18nCoreApplication::SettingsKey,
+		const QString & );
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+bool
+IsPathModified( I18nCoreApplication::SettingsKey enabledKey,
+		bool isEnabled,
+		I18nCoreApplication::SettingsKey pathKey,
+		const QString & pathname )
+{
+  // qDebug()
+  //   << "::IsPathModified("
+  //   << I18nApplication::Instance()->RetrieveSettingsKey( enabledKey ).toBool()
+  //   << ","
+  //   << isEnabled
+  //   << ","
+  //   << I18nApplication::Instance()->RetrieveSettingsKey(
+  //        pathKey
+  //      ).toString()
+  //   << ","
+  //   << pathname
+  //   << ")";
+
+  return
+    I18nApplication::Instance()->RetrieveSettingsKey( enabledKey ).toBool()
+    != isEnabled
+    ||
+    QDir(
+      I18nApplication::Instance()->RetrieveSettingsKey(
+	pathKey
+      ).toString()
+    )
+    != QDir( pathname );
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+PreferencesDialog
+::PreferencesDialog( QWidget* p, Qt::WindowFlags flags ) :
+  QDialog( p, flags ),
+  m_UI( new mvd::Ui::PreferencesDialog() ),
+  m_ResultsDirModified( false ),
+  m_GeoidFileModified( false ),
+  m_SrtmDirModified( false )
+{
+  assert( m_UI!=NULL );
+  assert( I18nApplication::Instance()!=NULL );
+
+  m_UI->setupUi( this );
+
+  //
+  // Runtime UI initialization.
+  m_UI->settingsGroupBox->setVisible( false );
+
+  AddItemsInto( m_UI->resolutionComboBox, "mvd", RESOLUTION_NAMES, RESOLUTION_COUNT );
+
+  AddItemsInto( m_UI->tileSizeComboBox, "mvd", TILE_SIZE_NAMES, TILE_SIZE_COUNT );
+
+  //
+  // General settings.
+  m_UI->resultDirPathLineEdit->setText(
+    I18nApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_RESULTS_DIR
+    )
+    .toString()
+  );
+
+  //
+  // GDAL overviews.
+  {
+    QVariant value(
+      I18nApplication::Instance()->RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_ENABLED
+      )
+    );
+
+    m_UI->overviewsCheckBox->setChecked(
+      !value.isValid()
+      ? OVERVIEWS_ENABLED_DEFAULT
+      : value.toBool()
+    );
+  }
+  {
+    QVariant value(
+      I18nApplication::Instance()->RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_SIZE
+      )
+    );
+
+    m_UI->overviewsSpinBox->setValue(
+      !value.isValid()
+      ? OVERVIEWS_SIZE_DEFAULT
+      : value.toInt()
+    );
+  }
+
+  //
+  // Rendering settings.
+  {
+    QVariant value(
+      I18nApplication::Instance()->RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_RESOLUTION
+      )
+    );
+
+    m_UI->resolutionComboBox->setCurrentIndex(
+      !value.isValid()
+      ? RESOLUTION_DEFAULT
+      : value.toInt()
+    );
+  }
+
+  {
+    QVariant value(
+      I18nApplication::Instance()->RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_TILE_SIZE
+      )
+    );
+
+    m_UI->tileSizeComboBox->setCurrentIndex( TILE_SIZE_DEFAULT );
+
+    int val = value.toInt();
+
+    for( int i=0; i<TILE_SIZE_COUNT; ++i)
+      if( val==TILE_SIZE_VALUE[ i ] )
+	{
+	m_UI->tileSizeComboBox->setCurrentIndex( i );
+
+	break;
+	}
+  }
+
+  //
+  // Elevation management settings.
+  m_UI->srtmLineEdit->setText(
+    I18nApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_SRTM_DIR
+    )
+    .toString()
+  );
+
+  m_UI->srtmCheckbox->setChecked(
+    I18nApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE
+    )
+    .toBool()
+  );
+  m_UI->srtmLineEdit->setEnabled( m_UI->srtmCheckbox->isChecked() );
+  m_UI->srtmButton->setEnabled( m_UI->srtmCheckbox->isChecked() );
+
+  m_UI->geoidLineEdit->setText(
+    I18nApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_GEOID_PATH
+    )
+    .toString()
+  );
+
+  m_UI->geoidCheckbox->setChecked(
+    I18nApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE
+    )
+    .toBool()
+  );
+
+  m_UI->geoidLineEdit->setEnabled( m_UI->geoidCheckbox->isChecked() );
+  m_UI->geoidButton->setEnabled( m_UI->geoidCheckbox->isChecked() );
+
+  // Connect centralWidget manipulator to Ql renderer when viewportRegionChanged
+  QObject::connect(
+    m_UI->buttonBox, SIGNAL( rejected() ), 
+    this, SLOT( close() )
+  );
+
+  assert( !m_ResultsDirModified );
+  assert( !m_GeoidFileModified );
+  assert( !m_SrtmDirModified );
+
+  // qDebug() << "results-dir:" << m_ResultsDirModified;
+  // qDebug() << "geoid-file:" << m_GeoidFileModified;
+  // qDebug() << "srtm-dir:" << m_SrtmDirModified;
+}
+
+/*****************************************************************************/
+PreferencesDialog
+::~PreferencesDialog()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+PreferencesDialog
+::on_buttonBox_accepted()
+{
+  //
+  // General settings.
+  if( m_ResultsDirModified )
+    {
+    // Set the result dir
+    I18nApplication::Instance()->StoreSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_RESULTS_DIR,
+      QDir::cleanPath( m_UI->resultDirPathLineEdit->text()
+      )
+    );
+    }
+
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE,
+    m_UI->srtmCheckbox->isChecked()
+  );
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_SRTM_DIR,
+    QDir::cleanPath( m_UI->srtmLineEdit->text()
+    )
+  );
+
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE,
+    m_UI->geoidCheckbox->isChecked()
+  );
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_GEOID_PATH,
+    m_UI->geoidLineEdit->text()
+  );
+
+  //
+  // Overview settings.
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_ENABLED,
+    m_UI->overviewsCheckBox->isChecked()
+  );
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_SIZE,
+    m_UI->overviewsSpinBox->value()
+  );
+
+  //
+  // Rendering settings.
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_RESOLUTION,
+    m_UI->resolutionComboBox->currentIndex()
+  );
+
+  {
+  bool isOk = true;
+
+  int value = m_UI->tileSizeComboBox->currentText().toInt( &isOk );
+
+  assert( isOk );
+
+  if( !isOk )
+    value = TILE_SIZE_VALUE[ TILE_SIZE_DEFAULT ];
+
+  I18nApplication::Instance()->StoreSettingsKey(
+    I18nCoreApplication::SETTINGS_KEY_TILE_SIZE,
+    value
+  );
+  }
+
+  //
+  // Elevation management settings.
+  if( m_GeoidFileModified )
+    {
+    try
+      {
+      if( I18nApplication::Instance()->ElevationSetup() )
+	{
+	QMessageBox::warning(
+	  this,
+	  "Warning!",
+	  tr( "Geoid file has changed since application has been started. This setting needs the application to be restarted to be taken into account." )
+	);
+	}
+      }
+    catch( const std::exception & exception )
+      {
+      QMessageBox::warning(
+	this,
+	"Warning!",
+	tr(
+	  "The following exception has been caught when setting up Elevation Settings:\n\n%1"
+	).arg( exception.what() )
+      );
+      }
+    }
+
+  m_ResultsDirModified = false;
+  m_GeoidFileModified = false;
+  m_SrtmDirModified = false;
+
+  close();
+}
+
+/*****************************************************************************/
+void
+PreferencesDialog
+::on_srtmCheckbox_toggled( bool checked )
+{
+  assert( m_UI!=NULL );
+
+  m_UI->srtmLineEdit->setEnabled( checked );
+  m_UI->srtmButton->setEnabled( checked );
+
+  m_SrtmDirModified =
+    IsPathModified(
+      I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE,
+      checked,
+      I18nCoreApplication::SETTINGS_KEY_SRTM_DIR,
+      m_UI->srtmLineEdit->text()
+    );
+}
+
+/***************************************************************************/
+void
+PreferencesDialog
+::on_srtmLineEdit_textChanged( const QString & text )
+{
+  assert( m_UI!=NULL );
+
+  m_SrtmDirModified = 
+    IsPathModified(
+      I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE,
+      m_UI->srtmCheckbox->isChecked(),
+      I18nCoreApplication::SETTINGS_KEY_SRTM_DIR,
+      text
+    );
+}
+
+/***************************************************************************/
+void
+PreferencesDialog
+::on_geoidCheckbox_toggled( bool checked )
+{
+  m_UI->geoidLineEdit->setEnabled( checked );
+  m_UI->geoidButton->setEnabled( checked );
+
+  m_GeoidFileModified =
+    IsPathModified(
+      I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE,
+      checked,
+      I18nCoreApplication::SETTINGS_KEY_GEOID_PATH,
+      m_UI->geoidLineEdit->text()
+    );
+}
+
+/***************************************************************************/
+void
+PreferencesDialog
+::on_geoidLineEdit_textChanged( const QString & text )
+{
+  m_GeoidFileModified =
+    IsPathModified(
+      I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE,
+      m_UI->geoidCheckbox->isChecked(),
+      I18nCoreApplication::SETTINGS_KEY_GEOID_PATH,
+      text
+    );
+}
+
+/***************************************************************************/
+void
+PreferencesDialog
+::on_srtmButton_clicked()
+{
+  QString srtmDir(
+    otb::GetExistingDirectory(
+      this,
+      tr( "Select the directory containing DEM files." )
+    )
+  );
+
+  if( srtmDir.isEmpty() )
+    return;
+
+  m_UI->srtmLineEdit->setText(
+    QDir( srtmDir ).absolutePath()
+  );
+}
+
+/***************************************************************************/
+void
+PreferencesDialog
+::on_geoidButton_clicked()
+{
+  QString geoidFile(
+    otb::GetOpenFileName(
+      this,
+      tr( "Select a geoid file." )
+    )
+  );
+
+  if( geoidFile.isEmpty() )
+    return;
+
+  m_UI->geoidLineEdit->setText(
+    QDir( geoidFile ).absolutePath()
+  );
+}
+
+/***************************************************************************/
+void
+PreferencesDialog
+::on_resultDirButton_clicked()
+{
+  QString resultsDir(
+    otb::GetExistingDirectory(
+      this,
+      tr( "Select the default directory for results data: " )
+    )
+  );
+
+  if( resultsDir.isEmpty() )
+    return;
+
+  m_UI->resultDirPathLineEdit->setText(
+    QDir( resultsDir ).absolutePath()
+  );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/Monteverdi/src/mvdPreferencesDialog.ui b/Modules/Visualization/Monteverdi/src/mvdPreferencesDialog.ui
new file mode 100644
index 0000000..300d407
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdPreferencesDialog.ui
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::PreferencesDialog</class>
+ <widget class="QDialog" name="mvd::PreferencesDialog">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>445</width>
+    <height>397</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Preferences</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_3">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QGroupBox" name="settingsGroupBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="title">
+        <string>General Settings</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout_2">
+        <item row="0" column="0">
+         <widget class="QLabel" name="resultDirLabel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Results directory</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QLineEdit" name="resultDirPathLineEdit">
+          <property name="enabled">
+           <bool>true</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>200</width>
+            <height>0</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Default directory for results data</string>
+          </property>
+          <property name="text">
+           <string/>
+          </property>
+          <property name="readOnly">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="2">
+         <widget class="QPushButton" name="resultDirButton">
+          <property name="enabled">
+           <bool>true</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>...</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="overviewsGroupBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="title">
+        <string>GDAL Overviews</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout_5">
+        <item row="1" column="1">
+         <widget class="QLabel" name="overviewsLabel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Minimum size:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="2">
+         <widget class="QSpinBox" name="overviewsSpinBox">
+          <property name="maximum">
+           <number>999999999</number>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QCheckBox" name="overviewsCheckBox">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Generate</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="3">
+         <widget class="QLabel" name="pixelLabel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>pixel(s)</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="renderingGroupBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="title">
+        <string>Rendering</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout_4">
+        <item row="2" column="0">
+         <widget class="QLabel" name="tileSizeLabel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Size of the image-tile which is loaded when view shifts to an unloaded area.</string>
+          </property>
+          <property name="text">
+           <string>Image tile size</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="resolutionLabel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Method to choose level of resolution pyramid when scale is between two levels</string>
+          </property>
+          <property name="text">
+           <string>Level of resolution pyramid</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1" colspan="2">
+         <widget class="QComboBox" name="resolutionComboBox">
+          <property name="toolTip">
+           <string>Method to choose level of resolution pyramid when scale is between two levels</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="1" colspan="2">
+         <widget class="QComboBox" name="tileSizeComboBox"/>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <widget class="QGroupBox" name="elevationGroupBox">
+       <property name="title">
+        <string>Elevation Management</string>
+       </property>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="1" column="2">
+         <widget class="QPushButton" name="geoidButton">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>...</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QLineEdit" name="srtmLineEdit">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="2">
+         <widget class="QPushButton" name="srtmButton">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>...</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QCheckBox" name="geoidCheckbox">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Geoid File            </string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QLineEdit" name="geoidLineEdit">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="0">
+         <widget class="QCheckBox" name="srtmCheckbox">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>DEM directory</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="2" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>228</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>overviewsCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>overviewsSpinBox</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>69</x>
+     <y>116</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>319</x>
+     <y>117</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/Monteverdi/src/mvdWin32.rc.in b/Modules/Visualization/Monteverdi/src/mvdWin32.rc.in
new file mode 100644
index 0000000..fdb8647
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/src/mvdWin32.rc.in
@@ -0,0 +1,32 @@
+#include "winver.h"
+
+IDI_ICON1               ICON    DISCARDABLE     "@Monteverdi_App_WIN32_ICON@"
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @Monteverdi_VERSION_MAJOR@, at Monteverdi_VERSION_MINOR@, at Monteverdi_VERSION_PATCH@,0
+ PRODUCTVERSION @Monteverdi_VERSION_MAJOR@, at Monteverdi_VERSION_MINOR@, at Monteverdi_VERSION_PATCH@,0
+ FILEFLAGS 0x0L
+ FILEFLAGSMASK 0x3fL
+ FILEOS 0x00040004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "000004b0"
+        BEGIN
+            VALUE "CompanyName", "OrfeoToolbox"
+            VALUE "FileDescription", "Monteverdi 2"
+            VALUE "FileVersion", "@Monteverdi_VERSION_MAJOR at .@Monteverdi_VERSION_MINOR at .@Monteverdi_VERSION_PATCH at .0"
+            VALUE "LegalCopyright", "Copyright (c) 2012-2013 Centre National d'Etudes Spatiales. All rights reserved."
+            VALUE "InternalName", "monteverdi"
+            VALUE "OriginalFilename", "monteverdi.exe"
+            VALUE "ProductName", "Monteverdi 2"
+            VALUE "ProductVersion", "@Monteverdi_VERSION_MAJOR at .@Monteverdi_VERSION_MINOR at .@Monteverdi_VERSION_PATCH at .0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0, 1200
+    END
+END
diff --git a/Modules/Visualization/Monteverdi/test/CMakeLists.txt b/Modules/Visualization/Monteverdi/test/CMakeLists.txt
new file mode 100644
index 0000000..e4061b8
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/test/CMakeLists.txt
@@ -0,0 +1,13 @@
+otb_module_test()
+
+set(OTBMonteverdiTests
+mvdMonteverdiApplicationTest.cxx
+mvdMonteverdiTestDriver.cxx
+)
+
+add_executable(mvdMonteverdiTestDriver ${OTBMonteverdiTests})
+target_link_libraries(mvdMonteverdiTestDriver ${OTBMonteverdi-Test_LIBRARIES})
+otb_module_target_label(mvdMonteverdiTestDriver)
+
+# Tests Declaration
+# TODO
diff --git a/Modules/Visualization/Monteverdi/test/mvdMonteverdiApplicationTest.cxx b/Modules/Visualization/Monteverdi/test/mvdMonteverdiApplicationTest.cxx
new file mode 100644
index 0000000..bd0a135
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/test/mvdMonteverdiApplicationTest.cxx
@@ -0,0 +1,46 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdApplication.h"
+#include "mvdMainWindow.h"
+
+int mvdMonteverdiApplicationTest(int argc, char* argv[])
+{
+  QApplication qtApp( argc, argv );
+
+  mvd::Application application( &qtApp );
+  mvd::MainWindow main_window;
+
+  main_window.show();
+
+  QTimer::singleShot(1000, &qtApp, SLOT(quit()));
+
+  return qtApp.exec();
+}
diff --git a/Modules/Visualization/Monteverdi/test/mvdMonteverdiTestDriver.cxx b/Modules/Visualization/Monteverdi/test/mvdMonteverdiTestDriver.cxx
new file mode 100644
index 0000000..1a26d6d
--- /dev/null
+++ b/Modules/Visualization/Monteverdi/test/mvdMonteverdiTestDriver.cxx
@@ -0,0 +1,30 @@
+/*=========================================================================
+
+  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 file defines the otbCommonTest for the test driver
+// and all it expects is that you have a function called RegisterTests
+#if defined(_MSC_VER)
+#pragma warning ( disable : 4786 )
+#endif
+#include <iostream>
+#include "otbTestMain.h"
+
+void RegisterTests()
+{
+  REGISTER_TEST(mvdMonteverdiApplicationTest);
+}
diff --git a/Modules/Visualization/MonteverdiCore/CMakeLists.txt b/Modules/Visualization/MonteverdiCore/CMakeLists.txt
new file mode 100644
index 0000000..f97ec60
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/CMakeLists.txt
@@ -0,0 +1,37 @@
+#############################################################################
+project( OTBMonteverdiCore )
+
+#############################################################################
+
+set( Monteverdi_FLOATING_TYPE
+  "float"
+  CACHE
+  STRING "The type of data in which input images are read (double/float)."
+  )
+
+set(Monteverdi_UI_VERSION "1")
+
+set(Monteverdi_CONFIGURE_FILE "ConfigureMonteverdi.h" )
+
+set(Monteverdi_PROJECT_NAME "Monteverdi")
+
+#############################################################################
+configure_file( src/ConfigureMonteverdi.h.in ConfigureMonteverdi.h )
+
+#############################################################################
+set( OTBMonteverdiCore_INCLUDE_DIRS
+  ${OTBMonteverdiCore_BINARY_DIR}
+  )
+
+#############################################################################
+set( OTBMonteverdiCore_LIBRARIES OTBMonteverdiCore )
+
+#############################################################################
+otb_module_impl()
+
+#############################################################################
+install(FILES
+  ${OTBMonteverdiCore_BINARY_DIR}/ConfigureMonteverdi.h
+  DESTINATION ${OTBMonteverdiCore_INSTALL_INCLUDE_DIR}
+  COMPONENT Development
+  )
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdAbstractImageModel.h b/Modules/Visualization/MonteverdiCore/include/mvdAbstractImageModel.h
new file mode 100644
index 0000000..bc63bc1
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdAbstractImageModel.h
@@ -0,0 +1,605 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractImageModel_h
+#define mvdAbstractImageModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "otbImageMetadataInterfaceBase.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractLayerModel.h"
+#include "mvdImageProperties.h"
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class HistogramModel;
+class ImageProperties;
+class QuicklookModel;
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class AbstractImageModel
+ * \ingroup OTBMonteverdiCore
+ *
+ */
+class OTBMonteverdiCore_EXPORT AbstractImageModel :
+    public AbstractLayerModel
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  /**
+   * \class BuildContext
+   * \brief WIP.
+   * \ingroup OTBMonteverdiCore
+   */
+  class BuildContext
+  {
+    //
+    // Public methods.
+  public:
+    /** \brief Contrustor (testing consistency). */
+    BuildContext() :
+      m_Id( -1 ),
+      m_Filename(),
+      m_Quicklook(),
+      m_Histogram(),
+      m_Settings( NULL ),
+      m_Properties( NULL ),
+      m_IsBeingStored( false )
+    {
+    }
+
+    /** \brief Constructor (importing image). */
+    BuildContext( const QString& filename ) :
+      m_Id( -1 ),
+      m_Filename( filename ),
+      m_Quicklook(),
+      m_Histogram(),
+      m_Settings( NULL ),
+      m_Properties( NULL ),
+      m_IsBeingStored( true )
+    {
+      assert( !filename.isEmpty() );
+    }
+
+    /** \brief Constructor (loading image). */
+    BuildContext( void* const settings,
+		  ImageProperties* const properties ) :
+      m_Id( -1 ),
+      m_Filename(),
+      m_Quicklook(),
+      m_Histogram(),
+      m_Settings( settings ),
+      m_Properties( properties ),
+      m_IsBeingStored( false )
+    {
+    }
+
+    /**
+     */
+    inline bool IsBeingStored() const
+    {
+      return m_IsBeingStored;
+    }
+
+    //
+    // Public attributes
+  public:
+    int m_Id;
+    QString m_Filename;
+    QString m_Quicklook;
+    QString m_Histogram;
+    void * const m_Settings;
+    ImageProperties * const m_Properties;
+
+  private:
+    bool m_IsBeingStored;
+
+  };
+
+//
+// Public methods.
+public:
+
+  /** Destructor */
+  ~AbstractImageModel() ITK_OVERRIDE;
+
+  /** */
+  inline int GetId() const;
+
+  /**
+   * \return This image properties.
+   */
+  inline const ImageProperties* GetProperties() const;
+
+  /**
+   * \return This image properties.
+   */
+  inline ImageProperties* GetProperties();
+
+  /**
+   * \brief Copy external properties data to this image properties.
+   *
+   * \param properties External properties.
+   */
+  inline void SetProperties( const ImageProperties& properties );
+
+  /** */
+  const QuicklookModel* GetQuicklookModel() const;
+
+  /** */
+  QuicklookModel* GetQuicklookModel();
+
+  /** */
+  inline const HistogramModel* GetHistogramModel() const;
+
+  /** */
+  inline HistogramModel* GetHistogramModel();
+
+  /**
+   * Get a smart-pointer to the current LOD image-base.
+   */
+  virtual ImageBaseType::ConstPointer ToImageBase() const =0;
+
+  /**
+   * Get a smart-pointer to the current LOD image-base.
+   */
+  virtual ImageBaseType::Pointer ToImageBase() =0;
+
+  /**
+   * \return The largest possible region of the current LOD level.
+   */
+  inline const ImageRegionType& GetLodLargestRegion() const;
+
+  /**
+   * \return The largest possible region of the native image, which
+   * is, by default, LOD level zero.
+   */
+  inline const ImageRegionType& GetNativeLargestRegion() const;
+
+  /**
+   * \return The spacing of the native image, which
+   * is, by default, LOD level zero.
+   */
+  inline const SpacingType& GetNativeSpacing() const;
+
+  /**
+   * \return The estimated spacing of the native image at full resolution
+   *
+   */
+  inline const SpacingType& GetEstimatedGroundSpacing() const;
+
+  /** */
+  inline CountType GetNbComponents() const;
+
+  /**
+   */
+  QStringList GetBandNames( bool enhanced =false ) const;
+
+  /**
+   * Get the number of available LOD.
+   */
+  virtual CountType GetNbLod() const =0;
+
+  /**
+   * Set the current LOD index (which may causes disk IOs,
+   * decompressing and buffering etc.)
+   */
+  inline void SetCurrentLod( CountType lod );
+
+  /**
+   * Get the current LOD index.
+   */
+  inline CountType GetCurrentLod() const;
+
+  /**
+   */
+  inline const SpacingType& GetSpacing() const;
+
+  /**
+   */
+  inline const PointType& GetOrigin() const;
+
+  /**
+   */
+  inline PointType GetCenter() const;
+
+//
+// Public SLOTS.
+public slots:
+
+  /**
+   * \brief Refresh histogram-model based on no-data properties.
+   */
+  inline void RefreshHistogram();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /** */
+  void SpacingChanged( const SpacingType& );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** Constructor */
+  AbstractImageModel( QObject* p =NULL );
+
+  /**
+   * \brief Set image properties pointer.
+   *
+   * \param properties The new properties instance.
+   */
+  inline void SetProperties( ImageProperties* properties );
+
+  /**
+   * \brief Refresh histogram-model based on no-data settings.
+   *
+   * \param context Pointer to a histogram build-context.
+   */
+  void RefreshHistogram( void* const context );
+
+  /**
+   */
+  inline
+    otb::ImageMetadataInterfaceBase::ConstPointer
+    GetMetaDataInterface() const;
+
+  //
+  // AbstractModel methods.
+
+  void virtual_BuildModel( void* context ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /**
+   * The largest possible region of the native image, which is, by
+   * default, LOD level zero.
+   */
+  ImageRegionType m_NativeLargestRegion;
+
+  /**
+   * The spacing of the native image, which is, by
+   * default, LOD level zero.
+   */
+  SpacingType m_NativeSpacing;
+
+  /**
+   * The estimated spacing of the native image at full resolution  which is, by
+   * default, display in image info.
+   */
+  SpacingType m_EstimatedGroundSpacing;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  virtual void virtual_SetCurrentLod( CountType lod ) =0;
+
+  /**
+   * \brief Private virtual implementation of RefreshHistogram.
+   *
+   * Implement this method in subclass to construct a valid
+   * HistogramModel::BuildContext and call RefreshHistogram(void*
+   * const).
+   */
+  virtual void virtual_RefreshHistogram() {};
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  int m_Id;
+
+  /**
+   */
+  CountType m_CurrentLod;
+
+  /**
+   */
+  ImageProperties* m_Properties;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdHistogramModel.h"
+#endif //tag=QT4-boost-compatibility
+
+namespace mvd
+{
+
+/*****************************************************************************/
+int
+AbstractImageModel
+::GetId() const
+{
+  return m_Id;
+}
+
+/*****************************************************************************/
+inline
+const ImageProperties*
+AbstractImageModel
+::GetProperties() const
+{
+  return m_Properties;
+}
+
+/*****************************************************************************/
+inline
+ImageProperties*
+AbstractImageModel
+::GetProperties()
+{
+  return m_Properties;
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageModel
+::SetProperties( const ImageProperties& properties )
+{
+  assert( m_Properties!=NULL );
+
+  *m_Properties = properties;
+}
+
+/*****************************************************************************/
+const HistogramModel*
+AbstractImageModel
+::GetHistogramModel() const
+{
+  return findChild< const HistogramModel* >();
+}
+
+/*****************************************************************************/
+HistogramModel*
+AbstractImageModel
+::GetHistogramModel()
+{
+  return findChild< HistogramModel* >();
+}
+
+/*****************************************************************************/
+CountType
+AbstractImageModel
+::GetCurrentLod() const
+{
+  return m_CurrentLod;
+}
+
+/*****************************************************************************/
+void
+AbstractImageModel
+::SetCurrentLod( CountType lod )
+{
+  assert( lod<GetNbLod() );
+  virtual_SetCurrentLod( lod );
+
+  m_CurrentLod = lod;
+
+  // if everything ok emit the new spacing of the current lod
+  emit SpacingChanged(ToImageBase()->GetSpacing());
+}
+
+/*****************************************************************************/
+inline
+const ImageRegionType&
+AbstractImageModel
+::GetLodLargestRegion() const
+{
+  return ToImageBase()->GetLargestPossibleRegion();
+}
+
+/*****************************************************************************/
+inline
+const ImageRegionType&
+AbstractImageModel
+::GetNativeLargestRegion() const
+{
+  return m_NativeLargestRegion;
+}
+
+/*****************************************************************************/
+inline
+const SpacingType&
+AbstractImageModel
+::GetNativeSpacing() const
+{
+  return m_NativeSpacing;
+}
+
+
+/*****************************************************************************/
+inline
+const SpacingType&
+AbstractImageModel
+::GetEstimatedGroundSpacing() const
+{
+  return m_EstimatedGroundSpacing;
+}
+
+/*****************************************************************************/
+inline
+CountType
+AbstractImageModel
+::GetNbComponents() const
+{
+  return ToImageBase()->GetNumberOfComponentsPerPixel();
+}
+
+/*****************************************************************************/
+inline
+otb::ImageMetadataInterfaceBase::ConstPointer
+AbstractImageModel
+::GetMetaDataInterface() const
+{
+  return otb::ConstCast< const otb::ImageMetadataInterfaceBase >(
+    otb::ImageMetadataInterfaceFactory::CreateIMI(
+      ToImageBase()->GetMetaDataDictionary()
+    )
+  );
+}
+
+/*****************************************************************************/
+inline
+const PointType&
+AbstractImageModel
+::GetOrigin() const
+{
+  assert( !ToImageBase().IsNull() );
+
+  return ToImageBase()->GetOrigin();
+}
+
+/*****************************************************************************/
+inline
+const SpacingType&
+AbstractImageModel
+::GetSpacing() const
+{
+  assert( !ToImageBase().IsNull() );
+
+  return ToImageBase()->GetSpacing();
+}
+
+/*****************************************************************************/
+inline
+PointType
+AbstractImageModel
+::GetCenter() const
+{
+  PointType center( GetOrigin() );
+  SpacingType spacing( GetSpacing() );
+  SizeType size( GetNativeLargestRegion().GetSize() );
+
+  center[ 0 ] += 0.5 * spacing[ 0 ] * static_cast< double >( size[ 0 ] );
+  center[ 1 ] += 0.5 * spacing[ 1 ] * static_cast< double >( size[ 1 ] );
+
+  return center;
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageModel
+::RefreshHistogram()
+{
+  virtual_RefreshHistogram();
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageModel
+::SetProperties( ImageProperties* properties )
+{
+  if( m_Properties==properties )
+    return;
+
+  delete m_Properties;
+
+  m_Properties = properties;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdAbstractImageModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdAbstractLayerModel.h b/Modules/Visualization/MonteverdiCore/include/mvdAbstractLayerModel.h
new file mode 100644
index 0000000..4b3575e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdAbstractLayerModel.h
@@ -0,0 +1,231 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractLayerModel_h
+#define mvdAbstractLayerModel_h
+
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractModel.h"
+#include "mvdTypes.h"
+#include "mvdVisibleInterface.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+//
+// Global types.
+
+/**
+ */
+enum SpatialReferenceType
+{
+  SRT_UNKNOWN =0,
+  SRT_CARTO,
+  SRT_GEO,
+  SRT_SENSOR,
+};
+
+//
+// Global functions.
+
+/**
+ */
+OTBMonteverdiCore_EXPORT SpatialReferenceType GetSpatialReferenceType( const std::string & filename );
+
+/**
+ */
+OTBMonteverdiCore_EXPORT SpatialReferenceType GetSpatialReferenceType( const std::string & wkt, bool hasKwl );
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class AbstractLayerModel
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT AbstractLayerModel :
+    public AbstractModel,
+    public VisibleInterface
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  ~AbstractLayerModel() ITK_OVERRIDE;
+
+  /**
+   */
+  SpatialReferenceType GetSpatialReferenceType() const;
+
+  /**
+   */
+  std::string GetWkt() const;
+
+  /**
+   */
+  std::string GetAuthorityCode( bool ) const;
+
+  /**
+   */
+  void ToWgs84( const PointType &, PointType & wgs84, double & alt ) const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void VisibilityChanged( bool =true );
+  void VisibilityChanged( AbstractLayerModel *, bool );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  AbstractLayerModel( QObject* p =NULL );
+
+  /**
+   */
+  bool HasKwl() const;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  virtual std::string virtual_GetWkt() const =0;
+
+  /**
+   */
+  virtual bool virtual_HasKwl() const;
+
+  /**
+   */
+  virtual void virtual_ToWgs84( const PointType &, PointType & wgs84, double & alt ) const =0;
+
+  //
+  // VisibleInterface overloads.
+  void virtual_SignalVisibilityChanged( bool ) ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdAbstractLayerModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdAbstractModel.h b/Modules/Visualization/MonteverdiCore/include/mvdAbstractModel.h
new file mode 100644
index 0000000..90a5a41
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdAbstractModel.h
@@ -0,0 +1,254 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractModel_h
+#define mvdAbstractModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <cassert>
+#endif //tag=QT4-boost-compatibility
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiCoreExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class AbstractModel
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ */
+class OTBMonteverdiCore_EXPORT AbstractModel :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** Destructor */
+  ~AbstractModel() ITK_OVERRIDE;
+
+  /** */
+  template< typename TModel >
+    inline const TModel* GetParentModel() const;
+
+  /** */
+  template< typename TModel >
+    inline TModel* GetParentModel();
+
+  /** */
+  template< typename TModel >
+    TModel* newChildModel( void* context =NULL );
+
+  /** */
+  inline void attachChildModel( AbstractModel* model, void* context =NULL );
+
+  /** */
+  inline void BuildModel( void* context =NULL );
+
+  /**
+   */
+  virtual bool IsModified() const;
+
+  /**
+   */
+  virtual void ClearModified();
+
+  /**
+   */
+  inline void Save();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+  /** Constructor */
+  AbstractModel( QObject* p =NULL );
+
+  /**
+   */
+  virtual void virtual_BuildModel( void* context =NULL );
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  virtual void virtual_Save();
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+template< typename TModel >
+const TModel*
+AbstractModel
+::GetParentModel() const
+{
+  return qobject_cast< const TModel* >( parent() );
+}
+
+/*****************************************************************************/
+template< typename TModel >
+TModel*
+AbstractModel
+::GetParentModel()
+{
+  // qDebug()
+  //   << "parent:" << parent()
+  //   << ";" << qobject_cast< TModel* >( parent() );
+
+  return qobject_cast< TModel* >( parent() );
+}
+
+/*****************************************************************************/
+template< typename T >
+T *
+AbstractModel
+::newChildModel( void * context )
+{
+  T* model = new T( this );
+
+  try
+    {
+    attachChildModel( model, context );
+    }
+  catch( ... )
+    {
+    delete model;
+    model = NULL;
+
+    throw;
+    }
+
+  return model;
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractModel
+::attachChildModel( AbstractModel* model, void* context )
+{
+  assert( model!=NULL );
+
+  model->setParent( this );
+  model->BuildModel( context );
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractModel
+::BuildModel( void* context )
+{
+  virtual_BuildModel( context );
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractModel
+::Save()
+{
+  virtual_Save();
+
+  ClearModified();
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdAbstractModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdAbstractWorker.h b/Modules/Visualization/MonteverdiCore/include/mvdAbstractWorker.h
new file mode 100644
index 0000000..f691db8
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdAbstractWorker.h
@@ -0,0 +1,234 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractWorker_h
+#define mvdAbstractWorker_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class AbstractWorker
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief Abstract worker object used as a base-class for threaded tasks.
+ */
+class OTBMonteverdiCore_EXPORT AbstractWorker :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  ~AbstractWorker() ITK_OVERRIDE;
+
+  /**
+   */
+  inline QString GetFirstProgressText() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /**
+   * \brief Call the implemented do job/task routine.
+   */
+  void Do() throw();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   * \brief Signal emitted when progress text has changed.
+   *
+   * \param text New progress text to display;
+   */
+  void ProgressTextChanged( const QString& text );
+
+  /**
+   * \brief Signal emitted when progress value has changed.
+   *
+   * \param value New progress value to display.
+   */
+  void ProgressValueChanged( int value );
+
+  /**
+   * \brief Signal emitted when progress range has changed.
+   *
+   * \param min Minimum progress value.
+   * \param max Maximum progress value.
+   */
+  void ProgressRangeChanged( int min, int max );
+
+  /**
+   * \brief Signal emitted when job has correctly been done.
+   *
+   * Use this signal to get resulting object when job has been done.
+   *
+   * \param result Resulting QObject instance of NULL if none.
+   */
+  void Done( QObject* result =NULL );
+
+  /**
+   *  \brief Signal emitted when task (i.e. thread) has finished
+   *  correctly or incorrectly.
+   *
+   * Use this signal to forward to thead quit() slot when job has
+   * finished.
+   */
+  void Finished();
+
+  /**
+   * \brief Signal emitted when an exception has been caught by this worker.
+   *
+   * \param
+   */
+  void ExceptionRaised( QString what );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  AbstractWorker( QObject* p =NULL );
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   * \brief Do job/task abstract method to implement.
+   */
+  virtual QObject* virtual_Do() =0;
+
+  /**
+   */
+  virtual QString virtual_GetFirstProgressText() const =0;
+
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+QString
+AbstractWorker::GetFirstProgressText() const
+{
+  return virtual_GetFirstProgressText();
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdAbstractWorker_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h b/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h
new file mode 100644
index 0000000..5a2b07b
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h
@@ -0,0 +1,761 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAlgorithm_h
+#define mvdAlgorithm_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <string>
+#endif //tag=QT4-boost-compatibility
+
+//
+// ITK includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "itkFixedArray.h"
+#include "itkExceptionObject.h"
+#include "itkVariableLengthVector.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+} // end of namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* FUNCTIONS DECLARATION.                                                    */
+
+namespace otb
+{
+
+/**
+ * Convert an itk::VariableLengthVector< T2 > into a
+ * itk::FixedArray< T1, N >.
+ *
+ * Elements of type T1 are (safely) statically casted into T2.
+ *
+ * An itk::RangeError exception instance is thrown if lengths/sizes of
+ * both the containers are not equal.
+ *
+ * N.B.: Caller must ensure to that size N of itk::FixedArray< T1, N >
+ * to match the variable size of the itk::VariableLengthVector< T1 >.
+ */
+template< typename T2, unsigned int N, typename T1 >
+inline
+itk::FixedArray< T2, N >
+ToFixedArray( const itk::VariableLengthVector< T1 >& v );
+
+/**
+ * Convert an itk::VariableLengthVector< T2 > into a
+ * itk::FixedArray< T1, N >.
+ *
+ * Elements of type T1 are (safely) statically casted into T2.
+ *
+ * An itk::RangeError exception instance is thrown if lengths/sizes of
+ * both the containers are not equal.
+ *
+ * N.B.: Caller must ensure to that size N of itk::FixedArray< T1, N >
+ * to match the variable size of the itk::VariableLengthVector< T1 >.
+ */
+template< typename T2, unsigned int N, typename T1 >
+inline
+itk::FixedArray< T2, N >&
+ToFixedArray( itk::FixedArray< T2, N >& a,
+	      const itk::VariableLengthVector< T1 >& v );
+
+/**
+ * Convert an itk::FixedArray< T2, N > into a
+ * itk::VariableLengthVector< T1 >.
+ *
+ * Elements of type T1 are (safely) statically casted into T2.
+ *
+ * An itk::RangeError exception instance is thrown if lengths/sizes of
+ * both the containers are not equal.
+ */
+template< typename T2, typename T1, unsigned int N >
+inline
+itk::VariableLengthVector< T2 >
+ToVariableLengthVector( const itk::FixedArray< T1, N >& a );
+
+/**
+ * Convert an itk::FixedArray< T2, N > into a
+ * itk::VariableLengthVector< T1 >.
+ *
+ * Elements of type T1 are (safely) statically casted into T2.
+ *
+ * An itk::RangeError exception instance is thrown if lengths/sizes of
+ * both the containers are not equal.
+ */
+template< typename T2, typename T1, unsigned int N >
+inline
+itk::VariableLengthVector< T2 >&
+ToVariableLengthVector( itk::FixedArray< T1, N >& a,
+			const itk::VariableLengthVector< T1 >& v );
+} // end namespace 'otb'
+
+/*****************************************************************************/
+
+namespace mvd
+{
+/**
+ * \brief Write an itk::VariableLengthVector< T > into a QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param vector itk::VariableLengthVector< T > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< T >& vector );
+
+/**
+ * \brief Write an itk::VariableLengthVector< T > into a QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param vector itk::VariableLengthVector< T > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::VariableLengthVector< T >& vector );
+/**
+ * \brief Write an itk::VariableLengthVector< T > into a QDataStream.
+ *
+ * \param stream QDataStream into which to write data.
+ * \param vector itk::VariableLengthVector< T > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QDataStream&
+operator << ( QDataStream& stream,
+	      const itk::VariableLengthVector< T >& vector );
+
+/**
+ * \brief Write an itk::VariableLengthVector< T > into a QDataStream.
+ *
+ * \param stream QDataStream into which to write data.
+ * \param vector itk::VariableLengthVector< T > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QDataStream&
+operator >> ( QDataStream& stream,
+	      itk::VariableLengthVector< T >& vector );
+
+/**
+ * \brief Convert a StringVector object to a QStringList object.
+ *
+ * Because Qt uses a shallow mechanism to copy containers, the returned
+ * QStringList is shallow-copied.
+ */
+inline
+QStringList
+ToQStringList( const StringVector& sv );
+
+/**
+ * \brief Append the content of a StringVector object to the content
+ * of a QStringList object.
+ *
+ * Because Qt uses a shallow mechanism to copy containers, the returned
+ * QStringList is shallow-copied.
+ */
+inline
+QStringList&
+AppendToQStringList( QStringList& qsl,
+		     const StringVector& sv );
+
+/**
+ * \brief Convert and copy an STL std::string to a QString.
+ *
+ * The 8-bit data is converted to Unicode using the
+ * QString::fromAscii() method.
+ *
+ * \param str The 8-bit STL string to convert.
+ *
+ * \return The Unicode converted QString.
+ */
+
+inline
+QString
+FromStdString( const std::string& str );
+
+/**
+ */
+inline
+std::string
+ToLocalStdString( const QString & );
+
+/**
+ */
+inline
+const char *
+ToLocalString( const QString & );
+
+/**
+ * \brief Convert and copy a QString to a STL std::string.
+ *
+ * The Unicode data is converted to 8-bit using the QString::toAscii()
+ * method.
+ *
+ * \param str The Unicode string to convert.
+ *
+ * \return The 8-bit converted STL std::string.
+ */
+inline
+std::string
+ToStdString( const QString& str );
+
+/**
+ */
+inline
+const char*
+ToString( const QString& str );
+
+
+/**
+ * \return a std::string form various types.
+ */
+inline
+std::string
+ToStdString( unsigned int val );
+
+inline
+std::string
+ToStdString( const SpacingType & spacing);
+
+inline
+std::string
+ToStdString( const SizeType & size);
+
+inline
+std::string
+ToStdString( const PointType & point);
+
+template< typename T>
+std::string
+ToStdString( const std::vector<T> & vec);
+
+/**
+ */
+template< typename T >
+inline
+QString
+ToQString( const T& val );
+
+/**
+ */
+template<>
+inline
+QString
+ToQString< float >( const float& );
+
+/**
+ */
+template<>
+inline
+QString
+ToQString< double >( const double& );
+
+/**
+ */
+inline
+QString
+ToHumanReadableSize( qint64 fize, bool isInBits =true );
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+
+namespace mvd
+{
+/**
+ * \brief Test condition on all elements in range.
+ *
+ * \param first First element of range to test.
+ * \param last Upper (external) boundary of range to test.
+ * \param pred Predicate testing element in range.
+ *
+ * \return true if predicate is true on all elements in the range
+ * [first, last[ or if range is empty.
+ */
+template< typename TInputIterator, typename TUnaryPredicate >
+inline
+bool
+AllOf( TInputIterator first, TInputIterator last, TUnaryPredicate pred );
+
+/**
+ * \brief Test if any of element in range fulfills condition.
+ *
+ * \param first First element of range to test.
+ * \param last Upper (external) boundary of range to test.
+ * \param pred Predicate testing element in range.
+ *
+ * \return true if predicated is true for, at least, one element in range
+ * [first, last[. If range is empty, this function returns false.
+ */
+template< typename TInputIterator, typename TUnaryPredicate >
+inline
+bool
+AnyOf( TInputIterator first, TInputIterator last, TUnaryPredicate pred );
+
+/**
+ * \brief Test if no element in range fulfills condition.
+ *
+ * \param first First element of range to test.
+ * \param last Upper (external) boundary of range to test.
+ * \param pred Predicate testing element in range.
+ *
+ * \return true if predicated is false for all elements in range [first, last[. If range is empty, this function returns true.
+ */
+template< typename TInputIterator, typename TUnaryPredicate >
+inline
+bool
+NoneOf( TInputIterator first, TInputIterator last, TUnaryPredicate pred );
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace otb
+{
+/*******************************************************************************/
+template< typename T2, unsigned int N, typename T1 >
+inline
+itk::FixedArray< T2, N >
+ToFixedArray( const itk::VariableLengthVector< T1 >& v )
+{
+  assert( v.Size()==N );
+
+  throw itk::RangeError( __FILE__, __LINE__ );
+
+  itk::FixedArray< T2, N > a;
+
+  for( unsigned int i=0; i<N; ++i )
+    a[ i ] = static_cast< T2 >( v[ i ] );
+
+  return a;
+}
+
+/*******************************************************************************/
+template< typename T2, unsigned int N, typename T1 >
+inline
+itk::FixedArray< T2, N >&
+ToFixedArray( itk::FixedArray< T2, N >& a,
+	      const itk::VariableLengthVector< T1 >& v )
+{
+  assert( v.Size()==N && v.Size()==a.Size() );
+
+  throw itk::RangeError( __FILE__, __LINE__ );
+
+  for( unsigned int i=0; i<N; ++i )
+    a[ i ] = static_cast< T2>( v[ i ] );
+
+  return a;
+}
+
+/*******************************************************************************/
+template< typename T2, typename T1, unsigned int N >
+inline
+itk::VariableLengthVector< T2 >
+ToVariableLengthVector( const itk::FixedArray< T1, N >& a )
+{
+  assert( a.Size()==N );
+
+  throw itk::RangeError( __FILE__, __LINE__ );
+
+  itk::VariableLengthVector< T2 > v;
+
+  v.Reserve( N );
+
+  for( unsigned int i=0; i<N; ++i )
+    v[ i ] = static_cast< T2 >( a[ i ] );
+
+  return v;
+}
+
+/*******************************************************************************/
+template< typename T2, typename T1, unsigned int N >
+inline
+itk::VariableLengthVector< T2 >&
+ToVariableLengthVector( itk::VariableLengthVector< T2 >& v,
+			const itk::FixedArray< T1, N >& a )
+{
+  assert( a.Size()==N );
+
+  throw itk::RangeError( __FILE__, __LINE__ );
+
+  v.Reserve( N );
+
+  for( unsigned int i=0; i<N; ++i )
+    v[ i ] = static_cast< T2 >( a[ i ] );
+
+  return v;
+}
+
+} // end namespace 'otb'.
+
+namespace mvd
+{
+
+/*******************************************************************************/
+inline
+QStringList
+ToQStringList( const StringVector& sv )
+{
+  QStringList qsl;
+  return AppendToQStringList( qsl, sv );
+}
+
+/*******************************************************************************/
+inline
+QStringList&
+AppendToQStringList( QStringList& qsl, const StringVector& sv )
+{
+  for( StringVector::const_iterator it( sv.begin() );
+       it!=sv.end();
+       ++ it )
+    {
+    qsl.append( QString(it->c_str()) );
+    }
+
+  return qsl;
+}
+
+/*******************************************************************************/
+inline
+std::string
+ToLocalStdString( const QString & str )
+{
+  return std::string( str.toLocal8Bit().constData() );
+}
+
+/*******************************************************************************/
+inline
+const char *
+ToLocalString( const QString & str )
+{
+  return str.toLocal8Bit().constData();
+}
+
+/*******************************************************************************/
+inline
+QString
+FromStdString( const std::string& str )
+{
+  return QString( str.c_str() );
+}
+
+/*******************************************************************************/
+inline
+std::string
+ToStdString( const QString& str )
+{
+  return std::string( str.toAscii().constData() );
+}
+
+/*******************************************************************************/
+inline
+const char*
+ToString( const QString& str )
+{
+  return str.toAscii().constData();
+}
+
+/*******************************************************************************/
+inline
+std::string
+ToStdString( unsigned int val )
+{
+  std::ostringstream oss;
+  oss << val;
+  return oss.str();
+}
+
+/*******************************************************************************/
+inline
+std::string
+ToStdString( const SpacingType & spacing)
+{
+  std::ostringstream oss;
+  oss << spacing[0] << " , " << spacing[1];
+  return oss.str();
+}
+
+/*******************************************************************************/
+inline
+std::string
+ToStdString( const SizeType & size)
+{
+  std::ostringstream oss;
+  oss << size[0] << " , " << size[1];
+  return oss.str();
+}
+
+/*******************************************************************************/
+inline
+std::string
+ToStdString( const PointType & point)
+{
+  std::ostringstream oss;
+  oss << point[0] << " , " << point[1];
+  return oss.str();
+}
+
+/*******************************************************************************/
+template< typename T>
+inline
+std::string
+ToStdString( const std::vector<T> & vec)
+{
+  std::ostringstream oss;
+  typename std::vector<T>::const_iterator it = vec.begin();
+  while( it != vec.end() )
+    {
+    oss<<*it<< " ";
+    ++it;
+    }
+
+  return oss.str();
+}
+
+/*******************************************************************************/
+template< typename T >
+inline
+QString
+ToQString( const T& val )
+{
+  return QString( "%1" ).arg( val );
+}
+
+/*****************************************************************************/
+template<>
+inline
+QString
+ToQString< float >( const float& val )
+{
+  assert( !std::isnan( val ) );
+
+  QString valf;
+
+  // See IEEE-754
+  // Ref. http://en.wikipedia.org/wiki/Single-precision_floating-point_format
+  valf.sprintf( "%.9g", val );
+
+#if 0
+  std::cout
+    << "ToString< float >(" << val << "): "
+    << ToStdString( valf )
+    << "\t"
+    << valf.toFloat()
+    << std::endl;
+#endif
+
+  if( valf.toFloat()!=val )
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::DatasetDescritor",
+	  "Accuracy loss when converting float (%1) to string."
+	)
+	.arg( valf )
+      )
+    );
+
+  return valf;
+}
+
+/*****************************************************************************/
+template<>
+inline
+QString
+ToQString< double >( const double& val )
+{
+  assert( !std::isnan( val ) );
+
+  QString vald;
+
+  // See IEEE-754
+  // Ref. http://en.wikipedia.org/wiki/Double_precision
+  vald.sprintf( "%.17g", val );
+
+#if 0
+  std::cout
+    << "ToString< double >(" << val << "): "
+    << ToStdString( vald )
+    << "\t"
+    << vald.toDouble()
+    << std::endl;
+#endif
+
+  if( vald.toDouble()!=val )
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::DatasetDescriptor",
+	  "Accuracy loss when converting double (%1) to string."
+	)
+	.arg( vald )
+      )
+    );
+
+  return vald;
+}
+
+} // end namespace 'mvd'
+
+namespace mvd
+{
+
+/*******************************************************************************/
+template< typename TInputIterator, typename TUnaryPredicate >
+inline
+bool
+AllOf( TInputIterator first, TInputIterator last, TUnaryPredicate pred )
+{
+  while( first!=last )
+    {
+    if( !pred( *first ) )
+      return false;
+
+    ++first;
+    }
+
+  return true;
+}
+
+/*******************************************************************************/
+template< typename TInputIterator, typename TUnaryPredicate >
+inline
+bool
+AnyOf( TInputIterator first, TInputIterator last, TUnaryPredicate pred )
+{
+  while( first!=last )
+    {
+    if( pred( *first ) )
+      return true;
+
+    ++first;
+    }
+
+  return false;
+}
+
+/*******************************************************************************/
+template< typename TInputIterator, typename TUnaryPredicate >
+inline
+bool
+NoneOf( TInputIterator first, TInputIterator last, TUnaryPredicate pred )
+{
+  while( first!=last )
+    {
+    if( pred( *first ) )
+      return false;
+
+    ++first;
+    }
+
+  return true;
+}
+
+/*******************************************************************************/
+inline
+QString
+ToHumanReadableSize( qint64 size, bool isInBits )
+{
+  double thousand =
+    isInBits ? 1024.0 : 1000.0;
+
+  double remainder = static_cast< double >( size );
+
+  if( size < thousand )
+    return QString::number( size );
+
+  remainder /= thousand;
+
+  if( remainder < thousand )
+    return QString("%1 KiB" ).arg( QString::number( remainder, 'g', 3 ) );
+
+  remainder /= thousand;
+
+  if( remainder < thousand )
+    return QString("%1 MiB" ).arg( QString::number( remainder, 'g', 3 ) );
+
+  remainder /= thousand;
+
+  if( remainder < thousand )
+    return QString("%1 GiB" ).arg( QString::number( remainder, 'g', 3 ) );
+
+  remainder /= thousand;
+
+  return QString("%1 TiB" ).arg( QString::number( remainder, 'g', 3 ) );
+}
+
+} // end namespace 'mvd'
+
+
+#endif // mvdAlgorithm_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h b/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h
new file mode 100644
index 0000000..ce8ce10
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h
@@ -0,0 +1,201 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdApplicationsBrowser_h
+#define mvdApplicationsBrowser_h
+
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ApplicationsBrowser
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief Search for available applications in a directory.
+ *
+ * This class provides the functionnalities to look for
+ * otbWrapperApplication apps in a given directory. The method used to
+ * set the directory is SetAutoLoadPath(const std::string &).
+ *
+ * If applications are available in the directory set by the user,
+ * tags of each application are extracted.
+ *
+ * An association application-tags is then setup and stored in a
+ * std::vector to be sent (via a signal) to the
+ * mvd::ApplicationsToolBox or any widget or class connected to this
+ * signal.
+ *
+ */
+class OTBMonteverdiCore_EXPORT ApplicationsBrowser :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** typedef */
+
+  /** \brief Constructor. */
+  ApplicationsBrowser( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~ApplicationsBrowser() ITK_OVERRIDE;
+
+  /** set the path where to look for applications */
+  void SetAutoLoadPath(const std::string & itk_auto_load_path);
+
+  /** get available applications in the search path */
+  StringVector GetAvailableApplications();
+
+  /** return the list applications <->tags */
+  StringVector GetApplicationTags(const std::string& appName);
+
+  /** return std::map storing tag/apps association for all the
+    * applications in the search path
+    */
+  void SearchAvailableApplicationsTags();
+
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  void AvailableApplicationsTagsChanged(const ApplicationsTagContainer &,
+                                        const ApplicationDocNameToNameMap &);
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+
+  std::string m_AutoLoadPath;
+
+  ApplicationDocNameToNameMap m_DocNameToNameMap;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdApplicationsBrowser_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdBackgroundTask.h b/Modules/Visualization/MonteverdiCore/include/mvdBackgroundTask.h
new file mode 100644
index 0000000..da91ad4
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdBackgroundTask.h
@@ -0,0 +1,186 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdBackgroundTask_h
+#define mvdBackgroundTask_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractWorker;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class BackgroundTask
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT BackgroundTask :
+    public QThread
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   */
+  BackgroundTask( AbstractWorker* worker,
+		  bool autoDestroy =true,
+		  QObject* p =NULL );
+
+  /**
+   * \brief Destructor.
+   */
+  ~BackgroundTask() ITK_OVERRIDE;
+
+  /**
+   */
+  inline const AbstractWorker* GetWorker() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  AbstractWorker* m_Worker;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void OnObjectDestroyed( QObject* object );
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*****************************************************************************/
+inline
+const AbstractWorker*
+BackgroundTask::GetWorker() const
+{
+  return m_Worker;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdBackgroundTask_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdCore.h b/Modules/Visualization/MonteverdiCore/include/mvdCore.h
new file mode 100644
index 0000000..d0e2582
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdCore.h
@@ -0,0 +1,396 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdCore_h
+#define mvdCore_h
+
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+//
+// Internal classes pre-declaration.
+namespace mvd
+{
+} // end namespace 'mvd'
+
+
+/*****************************************************************************/
+/* TYPE DEFINITION SECTION                                                   */
+
+namespace mvd
+{
+
+/**
+ * Constants identifying the video-channels.
+ */
+enum RgbwChannel
+{
+  RGBW_CHANNEL_NONE = -1,
+
+  RGBW_CHANNEL_RED = 0,
+  RGBW_CHANNEL_GREEN,
+  RGBW_CHANNEL_BLUE,
+
+  RGBW_CHANNEL_WHITE,
+
+  RGBW_CHANNEL_RGB,
+
+  RGBW_CHANNEL_ALL,
+
+  RGBW_CHANNEL_COUNT,
+};
+
+/**
+ * Constant naming video-channels.
+ */
+extern OTBMonteverdiCore_EXPORT
+const char*
+RGBW_CHANNEL_NAMES[ RGBW_CHANNEL_COUNT ];
+
+/**
+ */
+enum Bound
+{
+  BOUND_LOWER = 0,
+  BOUND_UPPER,
+  BOUND_COUNT
+};
+
+/**
+ * Constant naming bound values.
+ */
+extern
+const char*
+BOUND_NAMES[ BOUND_COUNT ];
+
+/**
+ */
+enum Effect
+{
+  EFFECT_NONE = -1,
+  //
+  EFFECT_CHESSBOARD = 0,
+  EFFECT_GRADIENT,
+  EFFECT_LOCAL_CONTRAST,
+  EFFECT_LOCAL_TRANSLUCENCY,
+  EFFECT_NORMAL,
+  EFFECT_SPECTRAL_ANGLE,
+  EFFECT_SWIPE_H,
+  EFFECT_SWIPE_V,
+  //
+  EFFECT_COUNT
+};
+
+/**
+ * Constant naming effect values.
+ */
+OTBMonteverdiCore_EXPORT
+extern
+char const * const
+EFFECT_NAMES[ EFFECT_COUNT ];
+
+/**
+ */
+OTBMonteverdiCore_EXPORT
+extern
+bool
+OVERVIEWS_ENABLED_DEFAULT;
+
+/**
+ */
+OTBMonteverdiCore_EXPORT
+extern
+int
+OVERVIEWS_SIZE_DEFAULT;
+
+} // end of namespace mvd.
+
+
+/*****************************************************************************/
+/* FUNCTION DECLARATION SECTION                                              */
+
+namespace mvd
+{
+
+/**
+ * \brief Convenience method used to compute integer indices in order
+ * to iterate through RGB channels such as, for example:
+ * \code
+ * for( i=begin; i<end; ++i ) {}
+ * \endcode
+ *
+ * \param begin    The resulting first index where to begin iteration.
+ * \param end      The resulting upper-boundary index of the iteration.
+ * \param channels The channels to be iterated. Valid values are:
+ * _ RGBA_CHANNEL_NONE to select no video-channel at all;
+ * - RGBA_CHANNEL_RED to select red video-channel;
+ * - RGBA_CHANNEL_GREEN to select green video-channel;
+ * - RGBA_CHANNEL_BLUE to select blue video-channel;
+ * - RGBA_CHANNEL_WHITE is equivalent to RGBA_CHANNEL_NONE;
+ * - RGBA_CHANNEL_RGB to select all RGB video-channels;
+ * - RGBA_CHANNEL_ALL to select all RGB (without the alpha) video-channels.
+ *
+ * \return true if iteration indices have been set and loop can be
+ * processed.
+ */
+inline bool RgbBounds( CountType& begin, CountType& end, RgbwChannel channels );
+
+/**
+ * \brief Convenience method used to compute integer indices in order
+ * to iterate through RGBA channels such as, for example:
+ * \code
+ * for( i=begin; i<end; ++i ) {}
+ * \endcode
+ *
+ * \param begin    The first index where to begin iteration.
+ * \param end      The upper-boundary index of the iteration.
+ * \param channels The channels to be iterated. Valid values are:
+ * _ RGBA_CHANNEL_NONE to select no video-channel at all;
+ * - RGBA_CHANNEL_RED to select red video-channel;
+ * - RGBA_CHANNEL_GREEN to select green video-channel;
+ * - RGBA_CHANNEL_BLUE to select blue video-channel;
+ * - RGBA_CHANNEL_WHITE to select the white video-channel;
+ * - RGBA_CHANNEL_RGB to select all RGB (without the alpha) video-channels;
+ * - RGBA_CHANNEL_ALL to select all RGBA video-channels.
+ *
+ * \return true if iteration indices have been set and loop can be
+ * processed.
+ */
+inline bool RgbwBounds( CountType& begin, CountType& end, RgbwChannel channels );
+
+/**
+ * \brief Provide a lexicographical version-string 'M.m.p' less operator.
+ *
+ * \param v0 Left-operand version string.
+ * \param v1 Right-operand version string.
+ *
+ * \return true if left-operand is lesser than right-operand.
+ */
+inline bool IsVersionLess( const QString& v0, const QString& v1 );
+
+/**
+ * \brief Provide a lexicographical version-string 'M.m.p'
+ * greater-or-equal operator.
+ *
+ * \param v0 Left-operand version string.
+ * \param v1 Right-operand version string.
+ *
+ * \return true if left-operand is greater-or-equal than right-operand.
+ */
+inline bool IsVersionGreaterEqual( const QString& v0, const QString& v1 );
+
+/**
+ * \brief Provide a lexicographical version-string 'M.m.p' equal
+ * operator.
+ *
+ * \param v0 Left-operand version string.
+ * \param v1 Right-operand version string.
+ *
+ * \return true if left-operand is equal than right-operand.
+ */
+inline bool IsVersionEqual( const QString& v0, const QString& v1 );
+
+} // end namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+/*****************************************************************************/
+inline
+bool
+RgbBounds( CountType& begin, CountType& end, RgbwChannel channels )
+{
+  assert( channels!=RGBW_CHANNEL_COUNT );
+
+  switch( channels )
+    {
+    case RGBW_CHANNEL_NONE:
+    case RGBW_CHANNEL_WHITE:
+      begin = RGBW_CHANNEL_NONE;
+      end = RGBW_CHANNEL_NONE;
+      break;
+
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+      begin = channels;
+      end = channels + 1;
+      break;
+
+    case RGBW_CHANNEL_RGB:
+    case RGBW_CHANNEL_ALL:
+      begin = RGBW_CHANNEL_RED;
+      end = RGBW_CHANNEL_WHITE;
+      break;
+
+    default:
+      assert( false && "Non-managed RgbwChannel value.!" );
+      return false;
+      break;
+    }
+
+  return true;
+}
+
+/*****************************************************************************/
+inline
+bool
+RgbwBounds( CountType& begin, CountType& end, RgbwChannel channels )
+{
+  assert( channels!=RGBW_CHANNEL_COUNT );
+
+  switch( channels )
+    {
+    case RGBW_CHANNEL_NONE:
+      begin = RGBW_CHANNEL_NONE;
+      end = RGBW_CHANNEL_NONE;
+      break;
+
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+    case RGBW_CHANNEL_WHITE:
+      begin = channels;
+      end = channels + 1;
+      break;
+
+    case RGBW_CHANNEL_RGB:
+      begin = RGBW_CHANNEL_RED;
+      end = RGBW_CHANNEL_WHITE;
+      break;
+
+    case RGBW_CHANNEL_ALL:
+      begin = RGBW_CHANNEL_RED;
+      end = RGBW_CHANNEL_RGB;
+      break;
+
+    default:
+      assert( false && "Non-managed RgbwChannel value.!" );
+      return false;
+      break;
+    }
+
+  return true;
+}
+
+/*****************************************************************************/
+inline
+bool
+IsVersionLess( const QString& v0, const QString& v1 )
+{
+  QStringList V0List( v0.split( "." ) );
+  assert( V0List.size()>=3 );
+
+  QStringList V1List( v1.split( "." ) );
+  assert( V1List.size()>=3 );
+
+  return
+    V0List[ 0 ].toInt() < V1List[ 0 ].toInt() ||
+
+    ( V0List[ 0 ].toInt() == V1List[ 0 ].toInt() &&
+      V0List[ 1 ].toInt() < V1List[ 1 ].toInt() ) ||
+
+    ( V0List[ 1 ].toInt() == V1List[ 1 ].toInt() &&
+      V0List[ 2 ].toInt() < V1List[ 2 ].toInt() );
+}
+
+/*****************************************************************************/
+inline
+bool
+IsVersionEqual( const QString& v0, const QString& v1 )
+{
+  QStringList V0List( v0.split( "." ) );
+  assert( V0List.size()>=3 );
+
+  QStringList V1List( v1.split( "." ) );
+  assert( V1List.size()>=3 );
+
+  return
+    V0List[ 0 ].toInt() == V1List[ 0 ].toInt() &&
+    V0List[ 1 ].toInt() == V1List[ 1 ].toInt() &&
+    V0List[ 2 ].toInt() == V1List[ 2 ].toInt();
+}
+
+/*****************************************************************************/
+inline
+bool
+IsVersionGreaterEqual( const QString& v0, const QString& v1 )
+{
+  QStringList V0List( v0.split( "." ) );
+  assert( V0List.size()>=3 );
+
+  QStringList V1List( v1.split( "." ) );
+  assert( V1List.size()>=3 );
+
+  return
+    V0List[ 0 ].toInt() > V1List[ 0 ].toInt() ||
+
+    ( V0List[ 0 ].toInt() == V1List[ 0 ].toInt() &&
+      V0List[ 1 ].toInt() > V1List[ 1 ].toInt() ) ||
+
+    ( V0List[ 1 ].toInt() == V1List[ 1 ].toInt() &&
+      V0List[ 2 ].toInt() >= V1List[ 2 ].toInt() );
+}
+
+} // end namespace 'mvd'.
+
+#endif // mvdCore_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdDataStream.h b/Modules/Visualization/MonteverdiCore/include/mvdDataStream.h
new file mode 100644
index 0000000..d53c7a9
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdDataStream.h
@@ -0,0 +1,214 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdDataStream_h
+#define mvdDataStream_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <typeinfo>
+#endif //tag=QT4-boost-compatibility
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAlgorithm.h"
+#include "mvdSystemError.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+} // end of namespace 'mvd'.
+
+/**
+ */
+#define DATA_STREAM_OUT( ostream, T, pointer )                          \
+  {                                                                     \
+    size_t size = sizeof( T const * );                                  \
+                                                                        \
+    int count =                                                         \
+      ostream.writeRawData(                                             \
+        reinterpret_cast< char const * >( &pointer ),                   \
+        size                                                            \
+      );                                                                \
+                                                                        \
+    if( false )                                                         \
+      qDebug()                                                          \
+        << "Written" << count << "byte(s) as" << typeid( T ).name()     \
+        << "address" << pointer << "size" << size;                      \
+                                                                        \
+    if( static_cast< size_t >( count )!=size )                          \
+      throw                                                             \
+        mvd::SystemError(                                               \
+          mvd::ToStdString(                                             \
+            QString( "Error when writing %1 pointer to QDataStream." )  \
+            .arg( typeid( T ).name() )                                  \
+          )                                                             \
+        );                                                              \
+  }
+
+/**
+ */
+#define DATA_STREAM_IN( istream, T, pointer )                           \
+  {                                                                     \
+    size_t size = sizeof( T * );                                        \
+                                                                        \
+    int count =                                                         \
+      istream.readRawData(                                              \
+        reinterpret_cast< char * >( &pointer ), size );                 \
+                                                                        \
+    if( false )                                                         \
+      qDebug()                                                          \
+        << "Read" << count << "byte(s) as" << typeid( T ).name()        \
+        << "address" << pointer << "size" << size;                      \
+                                                                        \
+    if( static_cast< size_t >( count )!=size )                          \
+      throw                                                             \
+        mvd::SystemError(                                               \
+          mvd::ToStdString(                                             \
+            QString( "Error when reading %1 pointer from QDataStream." ) \
+            .arg( typeid( T ).name() )                                  \
+          )                                                             \
+        );                                                              \
+  }
+
+/*****************************************************************************/
+/* FUNCTIONS DECLARATION.                                                    */
+
+/**
+ */
+QDataStream&
+operator << ( QDataStream& out, void const * & pointer );
+
+/**
+ */
+QDataStream&
+operator >>( QDataStream& in, void * & pointer );
+
+
+/**
+ */
+#define DATA_STREAM_USE_TEMPLATE_OPERATORS 1
+
+
+#if DATA_STREAM_USE_TEMPLATE_OPERATORS
+
+/**
+ */
+template< typename T >
+inline
+QDataStream&
+operator << ( QDataStream& out, T const * & pointer );
+
+/**
+ */
+template< typename T >
+inline
+QDataStream&
+operator >>( QDataStream& in, T * & pointer );
+
+#endif // DATA_STREAM_USE_TEMPLATE_OPERATORS
+
+namespace mvd
+{
+} // end namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+#if DATA_STREAM_USE_TEMPLATE_OPERATORS
+
+/*****************************************************************************/
+template< typename T >
+inline
+QDataStream&
+operator << ( QDataStream& out, T const * & pointer )
+{
+  /*
+  qDebug() <<
+    "template< T > "
+    "QDataStream& operator << ( QDataStream&, T const * & ); "
+    "with [ T =" << typeid( T ).name() << "]";
+  */
+
+  DATA_STREAM_OUT( out, T, pointer );
+
+  return out;
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+QDataStream&
+operator >>( QDataStream& in, T * & pointer )
+{
+  /*
+  qDebug() <<
+    "template< T > "
+    "QDataStream& operator >> ( QDataStream&, T * & ); "
+    "with [ T =" << typeid( T ).name() << "]";
+  */
+
+  DATA_STREAM_IN( in, T, pointer );
+
+  return in;
+}
+
+#endif // DATA_STREAM_USE_TEMPLATE_OPERATORS
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdDataStream_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdFilenameInterface.h b/Modules/Visualization/MonteverdiCore/include/mvdFilenameInterface.h
new file mode 100644
index 0000000..8547bd7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdFilenameInterface.h
@@ -0,0 +1,154 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdFilenameInterface_h
+#define mvdFilenameInterface_h
+
+#include "OTBMonteverdiCoreExport.h"
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class FilenameInterface
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT FilenameInterface
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  virtual ~FilenameInterface();
+
+  /**
+   */
+  const QString & GetFilename() const;
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  FilenameInterface();
+
+  /**
+   */
+  void SetFilename( const QString & );
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  void virtual_SetFilename( const QString & ) {}
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  QString m_Filename;
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdFilenameInterface_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdHistogramModel.h b/Modules/Visualization/MonteverdiCore/include/mvdHistogramModel.h
new file mode 100644
index 0000000..b39590e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdHistogramModel.h
@@ -0,0 +1,734 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdHistogramModel_h
+#define mvdHistogramModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <boost/type_traits/is_floating_point.hpp>
+
+//
+// ITK includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "itkHistogram.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "otbObjectList.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractModel.h"
+#include "mvdAlgorithm.h"
+#include "mvdCore.h"
+#include "mvdSerializableInterface.h"
+#endif //tag=QT4-boost-compatibility
+
+#define HISTOGRAM_CURVE_TYPE 2
+#define USE_FULL_IMAGE_FOR_PASS_1 0
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+namespace
+{
+}
+
+//
+// Internal classes pre-declaration.
+class AbstractImageModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class HistogramModel
+ *
+ * \ingroup OTBMonteverdiCore
+ */
+class OTBMonteverdiCore_EXPORT HistogramModel :
+    public AbstractModel,
+    private SerializableInterface
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types & constants.
+public:
+
+  /**
+   */
+  static const int PRECISION = 4;
+
+  /** */
+  typedef
+    // itk::NumericTraits< T >::FloatType and
+    // itk::NumericTraits< T >::RealType do not depend on template
+    // parameter T. They are always typedef, respectively, as float
+    // and double.
+    //
+    // So, itk::NumericTraits< DefaultImageType::InternalPixelType
+    // >::RealType is equivalent to itk::NumericTraits< float
+    // >::RealType which is always an alias of double.
+    //
+    // This typedef is used for compatibility with
+    // itk::Histogram<>::MeasurementType.
+    itk::NumericTraits< DefaultImageType::InternalPixelType >::RealType RealType;
+
+  /**
+   */
+  typedef RealType MeasurementType;
+
+  /**
+   * \class BuildContext
+   * \brief WIP.
+   * \ingroup OTBMonteverdiCore
+   */
+  class BuildContext
+  {
+    //
+    // Public methods.
+  public:
+    /** \brief Constructor. */
+    BuildContext( bool isBeingStored, const QString& filename =QString() ) :
+      m_Filename( filename ),
+      m_IsBeingStored( isBeingStored )
+    {
+    }
+
+    /**
+     */
+    inline bool IsBeingStored() const
+    {
+      return m_IsBeingStored;
+    }
+
+    //
+    // Public attributes
+  public:
+    QString m_Filename;
+
+  private:
+    bool m_IsBeingStored;
+  };
+
+//
+// Public methods.
+public:
+  /**
+   */
+  static RealType GetEpsilon();
+
+  /** \brief Constructor. */
+  HistogramModel( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~HistogramModel() ITK_OVERRIDE;
+
+  /**
+   */
+  bool IsValid() const;
+
+  /**
+   */
+  bool IsMonoValue() const;
+
+  /** */
+  MeasurementType Quantile( CountType band, double p ) const;
+
+  /** */
+  MeasurementType Quantile( CountType band, double p, Bound bound ) const;
+
+  /** */
+  double Percentile(
+    CountType band,
+    MeasurementType intensity,
+    Bound bound ) const;
+
+  /** */
+  inline VectorPixelType GetMinPixel() const;
+
+  /** */
+  inline VectorPixelType GetMaxPixel() const;
+
+  /**
+   */
+  inline size_t GetDataCount( CountType band ) const;
+
+  /**
+   */
+  void GetData(
+    CountType band,
+    double * const x,
+    double * const y,
+    double& xMin,
+    double& xMax,
+    double& yMin,
+    double& yMax ) const;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // AbstractModel methods.
+
+  /** */
+  void virtual_BuildModel( void* context =NULL ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private constants.
+private:
+
+
+//
+// Private types.
+private:
+
+  /** */
+  typedef itk::Statistics::Histogram< MeasurementType > Histogram;
+
+  /** */
+  typedef otb::ObjectList< Histogram > HistogramList;
+
+//
+// Private methods.
+private:
+  /**
+   */
+  /*
+  template< typename TImage >
+    void template_BuildModel_I();
+  */
+
+  /**
+   */
+  template< typename TImageModel >
+    void template_BuildModel_M( BuildContext * =NULL );
+
+  //
+  // SerializableInterface methods.
+  //
+
+  void virtual_Read( QIODevice* device ) ITK_OVERRIDE;
+
+  void virtual_Write( QIODevice& device ) const ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  /** */
+  HistogramList::Pointer m_Histograms;
+  /** */
+  DefaultImageType::PixelType m_MinPixel;
+  /** */
+  DefaultImageType::PixelType m_MaxPixel;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "otbStreamingHistogramVectorImageFilter.h"
+#include "otbStreamingMinMaxVectorImageFilter.h"
+#include "otbStreamingStatisticsVectorImageFilter.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractImageModel.h"
+#endif //tag=QT4-boost-compatibility
+
+namespace mvd
+{
+
+/*******************************************************************************/
+inline
+DefaultImageType::PixelType
+HistogramModel
+::GetMinPixel() const
+{
+  return m_MinPixel;
+}
+
+/*******************************************************************************/
+inline
+DefaultImageType::PixelType
+HistogramModel
+::GetMaxPixel() const
+{
+  return m_MaxPixel;
+}
+
+/*******************************************************************************/
+inline
+size_t
+HistogramModel
+::GetDataCount( CountType band ) const
+{
+  // Get histogram of band.
+  Histogram::Pointer histogram( m_Histograms->GetNthElement( band ) );
+  assert( !histogram.IsNull() );
+
+  // Get number of bins for each dimension.
+  Histogram::SizeType size( histogram->GetSize() );
+
+  // Ensure dimension is 1.
+  assert( histogram->GetMeasurementVectorSize()==1 );
+
+  // There are twince number of points than number of bins.
+#if HISTOGRAM_CURVE_TYPE==0
+  return 2 * size[ 0 ];
+
+#elif HISTOGRAM_CURVE_TYPE==1
+  return size[ 0 ];
+
+#elif HISTOGRAM_CURVE_TYPE==2
+  return 4 * size[ 0 ];
+
+#else
+  assert( false && "Unknown HISTOGRAM_CURVE_TYPE value" );
+
+#endif
+}
+
+/*******************************************************************************/
+/*
+template< typename TImage >
+void
+HistogramModel
+::template_BuildModel_I()
+{
+  QTime lMain;
+  QTime lPass1;
+  QTime lPass2;
+
+  lMain.start();
+
+  qDebug() << tr( "%1: Generating histogram (I)..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+
+  AbstractImageModel* imageModel =
+    qobject_cast< AbstractImageModel* >( parent() );
+
+  assert( imageModel!=NULL );
+
+  //
+  // 1st pass: process min/MAX for each band.
+
+  qDebug() << tr( "%1: Pass #1 - finding pixel min/maxes..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+  lPass1.start();
+
+  // Connect min/MAX pipe-section.
+  typedef
+    otb::StreamingMinMaxVectorImageFilter< TImage >
+    MinMaxFilter;
+
+  typename MinMaxFilter::Pointer filterMinMax( MinMaxFilter::New() );
+
+  filterMinMax->SetInput(
+    // otb::DynamicCast< TImage >( imageModel->ToImageBase() )
+    imageModel->ToImageBase()
+  );
+
+  filterMinMax->Update();
+
+  // Extract-convert-remember min/MAX intensities for each band.
+  m_MinPixel = filterMinMax->GetMinimum();
+  m_MaxPixel = filterMinMax->GetMaximum();
+
+  qDebug() << tr( "%1: Pass #1 - done (%2 ms)." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+    .arg( lPass1.elapsed() );
+
+  //
+  // 2nd pass: compute histogram.
+
+  qDebug() << tr( "%1: Pass #2 - computing histogram..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+  lPass2.start();
+
+  // Connect histogram-generator pipe-section.
+  typedef
+    otb::StreamingHistogramVectorImageFilter< TImage >
+    HistogramFilter;
+
+  typename HistogramFilter::Pointer histogramFilter( HistogramFilter::New() );
+
+  histogramFilter->SetInput(
+    // otb::DynamicCast< TImage >( imageModel->ToImageBase() )
+    imageModel->ToImageBase()
+  );
+
+  // Setup histogram filter.
+  histogramFilter->GetFilter()->SetHistogramMin( m_MinPixel );
+  histogramFilter->GetFilter()->SetHistogramMax( m_MaxPixel );
+  histogramFilter->SetNumberOfBins(
+    HistogramModel::BINS_OVERSAMPLING_RATE * 256
+  );
+  histogramFilter->GetFilter()->SetSubSamplingRate( 1 );
+
+  // Go.
+  histogramFilter->Update();
+
+  qDebug() << tr( "%1: Pass #2 - done (%2 ms)." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+    .arg( lPass2.elapsed()  );
+
+  //
+  // Reference result.
+  m_Histograms = histogramFilter->GetHistogramList();
+
+  qDebug() << tr( "%1: Histogram (I) generated (%2 ms)." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+    .arg( lMain.elapsed() );
+}
+*/
+
+/*******************************************************************************/
+template< typename TImageModel >
+void
+HistogramModel
+::template_BuildModel_M( BuildContext * )
+{
+  QTime lMain;
+  QTime lPass1;
+  QTime lPass2;
+
+  lMain.start();
+
+  qDebug() << tr( "%1: Generating histogram (M)..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+
+#if USE_FULL_IMAGE_FOR_PASS_1
+  TImageModel * parentImageModel =
+    qobject_cast< TImageModel * >( parent() );
+
+#else // USE_FULL_IMAGE_FOR_PASS_1
+  AbstractImageModel * parentImageModel =
+    qobject_cast< AbstractImageModel* >( parent() );
+
+#endif // USE_FULL_IMAGE_FOR_PASS_1
+
+  assert( parentImageModel!=NULL );
+
+  ImageProperties * imageProperties = parentImageModel->GetProperties();
+  assert( imageProperties!=NULL );
+
+  TImageModel * imageModel = parentImageModel->GetQuicklookModel();
+
+  if( imageModel==NULL )
+    imageModel = qobject_cast< TImageModel * >( parentImageModel );
+
+  assert( imageModel!=NULL );
+
+  CountType components = imageModel->ToImage()->GetNumberOfComponentsPerPixel();
+  assert( components>0 );
+
+  // Always initialize min and Max pixels.
+
+  m_MinPixel = DefaultImageType::PixelType( components );
+  m_MaxPixel = DefaultImageType::PixelType( components );
+
+  m_MinPixel.Fill( 0 );
+  m_MaxPixel.Fill( 1 );
+
+  try
+    {
+    // 1st pass: process min/MAX for each band.
+
+    qDebug() << QString( "%1: Pass #1 - finding pixel min/maxes..." )
+                .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+    lPass1.start();
+
+    // Define histogram-filter type.
+    typedef otb::StreamingHistogramVectorImageFilter<
+      typename TImageModel::SourceImageType > HistogramFilter;
+
+    // Connect statistics pipe-section.
+    typedef otb::StreamingStatisticsVectorImageFilter<
+      typename TImageModel::SourceImageType > StatisticsFilter;
+
+    typename StatisticsFilter::Pointer filterStats( StatisticsFilter::New() );
+
+#if USE_FULL_IMAGE_FOR_PASS_1
+    filterStats->SetInput( parentImageModel->ToImage() );
+
+#else // USE_FULL_IMAGE_FOR_PASS_1
+    filterStats->SetInput( imageModel->ToImage() );
+
+#endif // USE_FULL_IMAGE_FOR_PASS_1
+
+    filterStats->SetEnableMinMax( true );
+    filterStats->SetIgnoreUserDefinedValue( imageProperties->IsNoDataEnabled() );
+    filterStats->SetUserIgnoredValue( imageProperties->GetNoData() );
+
+    // Connect statistics pipe-section.
+    filterStats->Update();
+
+    // qDebug() << "min:" << m_MinPixel << "max:" << m_MaxPixel;
+    // std::cout << "min:" << m_MinPixel << "\tmax:" << m_MaxPixel << std::endl;
+
+    // Extract-convert-remember min/MAX intensities for each band.
+    m_MinPixel = filterStats->GetMinimum();
+    m_MaxPixel = filterStats->GetMaximum();
+
+    // Define corrected min/MAX pixels.
+    DefaultImageType::PixelType minPixel( m_MinPixel );
+    DefaultImageType::PixelType maxPixel( m_MaxPixel );
+
+    // Extract sigmas for each band from covariance matrix.
+    typename StatisticsFilter::MatrixType covariance(
+      filterStats->GetFilter()->GetCovariance()
+    );
+
+    typename HistogramFilter::FilterType::CountVectorType bins( components );
+    typename StatisticsFilter::RealPixelType sums( filterStats->GetSum() );
+    typename StatisticsFilter::RealPixelType means( filterStats->GetMean() );
+
+    for( CountType i=0; i<components; ++i )
+      {
+      RealType n = sums[ i ] / means[ i ];
+
+      // qDebug() << "#" << i << ": " << n;
+
+      if( n <= 1.0 )
+        {
+        bins[ i ] = 1;
+        }
+      else
+        {
+        RealType sigma = sqrt( covariance( i, i ) );
+
+        // qDebug() << "#" << i << ":" << sigma;
+
+        assert( sigma >= 0.0 );
+
+        if( sigma<=0.0 )
+          {
+          bins[ i ] = 1;
+          }
+        else
+          {
+          // Scott's formula
+          // See http://en.wikipedia.org/wiki/Histogram#Number_of_bins_and_width
+          RealType h = 3.5 * sigma / pow( n, 1.0 / 3.0 );
+
+          /*
+            qDebug()
+            << "#" << i
+            << ": h = pow(" << n << "," << 1.0 / 3.0 << ") ="
+            << h;
+
+            qDebug()
+            << "#" << i
+            << ": bins[" << i << "] = ceil( ("
+            << m_MaxPixel[ i ] << "-" << m_MinPixel[ i ] << ") / " << h << ") ="
+            << ceil( ( m_MaxPixel[ i ] - m_MinPixel[ i ] ) / h );
+          */
+
+          bins[ i ] = ceil( ( maxPixel[ i ] - minPixel[ i ] ) / h );
+
+          // at least 1 bin is needed
+          bins[i] = std::max(bins[i],1U);
+          }
+        }
+
+      // MANTIS-1275
+      // {
+      if( minPixel[ i ]==maxPixel[ i ] )
+        {
+        double epsilon = HistogramModel::GetEpsilon();
+
+        // make sure the epsilon is not hidden when using large values
+        if( boost::is_floating_point< DefaultImageType::PixelType::ValueType >::value )
+          {
+          double absValue = vcl_abs(minPixel[i]);
+          // compute smallest epsilon for absolute pixel value (1.5 factor is for safety)
+          double limitEpsilon = absValue *
+            (double)std::numeric_limits<DefaultImageType::PixelType::ValueType>::epsilon()
+            * 1.5;
+          epsilon = std::max(epsilon,limitEpsilon);
+          }
+
+        double lowerBound;
+        // With C++11, we can use std::numeric_limits<>::lowest()
+        if( boost::is_floating_point< DefaultImageType::PixelType::ValueType >::value )
+          {
+          lowerBound = epsilon - std::numeric_limits< DefaultImageType::PixelType::ValueType >::max();
+          }
+        else
+          {
+          lowerBound = std::numeric_limits< DefaultImageType::PixelType::ValueType >::min() + epsilon;
+          }
+        double upperBound = std::numeric_limits< DefaultImageType::PixelType::ValueType >::max() - epsilon;
+
+        if( minPixel[ i ] >= lowerBound )
+            minPixel[ i ] -= epsilon;
+
+        if( maxPixel[ i ] <= upperBound )
+            maxPixel[ i ] += epsilon;
+        }
+      // }
+      //
+      }
+
+    // std::cout << "Number of bins : "<< bins << std::endl;
+
+    qDebug() << QString( "%1: Pass #1 - done (%2 ms)." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+      .arg( lPass1.elapsed() );
+
+    //
+    // 2nd pass: compute histogram.
+
+    qDebug() << QString( "%1: Pass #2 - computing histogram..." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+    lPass2.start();
+
+    // Connect histogram-generator pipe-section.
+
+    typename HistogramFilter::Pointer histogramFilter( HistogramFilter::New()  );
+
+    histogramFilter->SetInput( imageModel->ToImage() );
+
+    // Setup histogram filter.
+    histogramFilter->GetFilter()->SetHistogramMin( minPixel );
+    histogramFilter->GetFilter()->SetHistogramMax( maxPixel );
+    histogramFilter->GetFilter()->SetNumberOfBins( bins );
+    histogramFilter->GetFilter()->SetSubSamplingRate( 1 );
+    histogramFilter->GetFilter()->SetNoDataFlag(
+      imageProperties->IsNoDataEnabled() );
+    histogramFilter->GetFilter()->SetNoDataValue( imageProperties->GetNoData() );
+
+    // Go.
+    histogramFilter->Update();
+
+    qDebug() << QString( "%1: Pass #2 - done (%2 ms)." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+      .arg( lPass2.elapsed()  );
+
+    //
+    // Reference result.
+    m_Histograms = histogramFilter->GetHistogramList();
+
+    qDebug() << QString( "%1: Histogram (M) generated (%2 ms)." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+      .arg( lMain.elapsed() );
+    }
+  catch( const std::exception & )
+    {
+    qWarning()
+      << tr( "Zero relevant pixels found when computing histogram (probably because of no-data settings)" );
+
+    if( imageProperties->IsNoDataEnabled() )
+      {
+      DefaultImageType::PixelType::ValueType value( imageProperties->GetNoData() );
+
+      m_MinPixel.Fill( value );
+      m_MaxPixel.Fill( value );
+      }
+
+    qDebug() << QString( "%1: Pass #1 - aborted (%2 ms)." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+      .arg( lPass1.elapsed() );
+
+    qDebug() << QString( "%1: Pass #2 - aborted (%2 ms)." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+      .arg( lPass2.elapsed()  );
+
+    qDebug() << QString( "%1: No Histogram (M) has been generated (%2 ms)." )
+      .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+      .arg( lMain.elapsed() );
+    }
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdHistogramModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdI18nCoreApplication.h b/Modules/Visualization/MonteverdiCore/include/mvdI18nCoreApplication.h
new file mode 100644
index 0000000..e0e7930
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdI18nCoreApplication.h
@@ -0,0 +1,710 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdI18nCoreApplication_h
+#define mvdI18nCoreApplication_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAlgorithm.h"
+#include "mvdSystemError.h"
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Macros.
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+
+//
+// Classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractModel;
+class DatasetModel;
+class VectorImageModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class I18nCoreApplication
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief The MVD2 core-application (which is different from
+ * QCoreApplication).
+ *
+ * I18nCoreApplication do not derive from QCoreApplication to
+ * prevent a dread diamong multiple inheritance scheme which could not
+ * be resolved using virtual inheritance (because Qt is not designed
+ * for).
+ *
+ * I18nCoreApplication does not derive from QApplication to
+ * prevent package .../Common/Core to depend on QtGui package (which
+ * would have broken the Common/Core-Common/Gui package layout).
+ *
+ * The dread diamond multiple inheritance scheme is solved using
+ * aggregation.
+ *
+ * QCoreApplication is passed as argument of I18nCoreApplication
+ * constructor. So, is user application must derive QApplication (to,
+ * for example, provide sessio management), the specialized instance
+ * can be passed as argument of constructor.
+ */
+class OTBMonteverdiCore_EXPORT I18nCoreApplication
+  : public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public constants & types.
+public:
+  enum SettingsKey
+  {
+    SETTINGS_KEY_GEOID_PATH,
+    SETTINGS_KEY_GEOID_PATH_ACTIVE,
+    SETTINGS_KEY_OVERVIEWS_ENABLED,
+    SETTINGS_KEY_OVERVIEWS_SIZE,
+    SETTINGS_KEY_RESOLUTION,
+    SETTINGS_KEY_RESULTS_DIR,
+    SETTINGS_KEY_SRTM_DIR,
+    SETTINGS_KEY_SRTM_DIR_ACTIVE,
+    SETTINGS_KEY_TILE_SIZE,
+    //
+    SETTINGS_KEY_COUNT
+  };
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param qtApp The parent Qt application of this MVD2 application.
+   */
+  I18nCoreApplication( QCoreApplication* qtApp );
+
+  /** \brief Destructor. */
+  ~I18nCoreApplication() ITK_OVERRIDE;
+
+  /**
+   */
+  void Initialize();
+
+  //
+  // APPLICATION SINGLETON.
+  //
+
+  /**
+   * \brief Get the singleton instance of application as a
+   * I18Application pointer.
+   *
+   * \return The singleton instance of I18nCoreApplication.
+   */
+  inline static I18nCoreApplication* Instance();
+
+  /**
+   * \brief Get the singleton constant instance of application as a
+   * I18Application pointer.
+   *
+   * \return The singleton constant instance of I18nCoreApplication.
+   */
+  inline static const I18nCoreApplication* ConstInstance();
+
+  //
+  // APPLICATION MODEL.
+  //
+
+ /**
+  * \brief Access the AbstractModel of the MVC which is managed by the
+  * application.
+  *
+  * \return The managed AbstractModel.
+  */
+  inline const AbstractModel* GetModel() const;
+
+  /**
+  * \brief Access the AbstractModel of the MVC which is managed by the
+  * application.
+  *
+  * \return The managed AbstractModel.
+   */
+  inline AbstractModel* GetModel();
+
+ /**
+  * \brief Access the AbstractModel of the MVC which is managed by the
+  * application and cast it into the given dynamic type.
+  *
+  * \return The managed TModel typename instance.
+  */
+  template< typename TModel >
+  inline const TModel* GetModel() const;
+
+  /**
+  * \brief Access the AbstractModel of the MVC which is managed by the
+  * application and cast it into the given dynamic type.
+  *
+  * \return The managed TModel typename instance.
+   */
+  template< typename TModel >
+  inline TModel* GetModel();
+
+  //
+  // APPLICATION CACHE-DIRECTORY.
+  //
+
+
+  /**
+   * \brief setup elevation management
+   *
+   */
+  bool ElevationSetup();
+
+  //
+  // APPLICATION SETTINGS.
+  //
+
+  /**
+   */
+  // TODO: Move method into ApplicationSettings class.
+  inline bool HasSettingsKey( SettingsKey ) const;
+
+  /**
+   */
+  // TODO: Move method into ApplicationSettings class.
+  inline void StoreSettingsKey( SettingsKey, const QVariant& value );
+
+  /**
+   */
+  // TODO: Move method into Application class.
+  inline QVariant RetrieveSettingsKey( SettingsKey ) const;
+
+  /**
+   */
+  // TODO: Move method into ApplicationSettings class.
+  inline bool HasSettingsKey( const QString & key ) const;
+
+  /**
+   */
+  // TODO: Move method into ApplicationSettings class.
+  inline void StoreSettingsKey( const QString & key, const QVariant& value );
+
+  /**
+   */
+  // TODO: Move method into Application class.
+  inline QVariant RetrieveSettingsKey( const QString & key ) const;
+
+  //
+  // STATIC methods.
+  //
+
+  /**
+   */
+  static bool IsResultsDirValid( const QString& path );
+  /**
+   */
+  static bool IsDirValid( const QString& path );
+
+  /**
+   * \brief Make directory tree in given path.
+   *
+   * Throws mvd::SystemError exception if sub-directory tree could not
+   * have been created.
+   *
+   * \param path Location where to create sub-directory tree.
+   * \param tree Sub-directory tree path. E.g.: 'level_1/level_2'.
+   * \param dir resulting directory, if non-NULL.
+   *
+   * \return true if sub-directory tree is newly created or false if
+   * it is already existing.
+   */
+  static bool MakeDirTree( const QString& path,
+			   const QString& tree,
+			   QDir* dir =NULL );
+
+  /**
+   * \brief Construct a consistent Dataset path-name.
+   *
+   * \param path Resulting path where the Dataset will be stored.
+   * \param name Resulting name of the given Dataset.
+   * \param imageFilename The image filename used to compute the path
+   * and name of the Dataset.
+   *
+   * \return The MD5 hash-code generated from to full absolute
+   * pathname of image file.
+   */
+  static
+    QString DatasetPathName( QString& name,
+                             const QString& imageFilename );
+
+  /**
+   */
+  static
+    VectorImageModel *
+    LoadImageModel( const QString & filename,
+                    int width,
+                    int height,
+                    QObject * p =NULL );
+
+  /**
+   */
+  static
+    void DeleteDatasetModel( const QString & path, const QString & hash );
+
+  //
+  // NON-STATIC methods.
+  //
+
+  /**
+   * \brief Get the results directory (where output from
+   * OTBApplicaitons are stored).
+   *
+   * \return Return the cache directory.
+   */
+  inline const QDir& GetResultsDir() const;
+
+  /**
+   */
+  // TODO: Remove method when Viewer/Application is updated to reuse factorized code of I18nCoreApplication.
+  inline QDir& GetResultsDir();
+
+//
+// Public attributes.
+public:
+  /**
+   * Name of the cache directory
+   */
+  static const char* DEFAULT_CACHE_DIR_NAME;
+
+  /**
+   * Name of the result cache directory
+   */
+  static const char* DEFAULT_CACHE_RESULT_DIR_NAME;
+
+  /**
+   */
+  static const char* DATASET_EXT;
+
+  /*-[ PUBLIC SLOTS SECTION ]-----------------------------------------------**/
+public slots:
+  /**
+   * \brief Accessor used to changed model which is managed by the
+   * Application.
+   *
+   * This method emits the AboutToChangeModel() and ModelChanged()
+   * signals respectively, before and after, the model is changed.
+   *
+   * \param model The newly managed model.
+   */
+  // Method could be inline but it's better not new/delete in inline
+  // methods (heap and memory-alignment contexts).
+  void SetModel( AbstractModel* model );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+  /**
+   * \brief Signal emitted when the AbstractModel of the MVC is about
+   * to be changed.
+   *
+   * This signal could be slotted in order to disconnect previously
+   * managed model.
+   *
+   * \param model The newly managed model (previous model can still
+   * be accessed using the GetModel() methods).
+   */
+  void AboutToChangeModel( const AbstractModel* model );
+
+  /**
+   * \brief Signal emitted when the AbstractModel of the MVC has been
+   * changed.
+   *
+   * This signal coulb be slotted in order to connect newly managed
+   * model.
+   *
+   * \param model The newly selected model.
+   */
+  void ModelChanged( AbstractModel* model );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /**
+   * \brief Get the singleton instance of application (safe) casted
+   * into the TApplication type.
+   *
+   * \return The singleton instance of application (safely) casted
+   * into TApplication type.
+   */
+  template< typename TApplication >
+    inline static TApplication* Instance();
+
+  /**
+   * \brief Get the constant singleton instance of application (safe)
+   * casted  into the TApplication type.
+   *
+   * \return The constant singleton instance of application (safely)
+   * casted into TApplication type.
+   */
+  template< typename TApplication >
+    inline static const TApplication* ConstInstance();
+
+  /**
+   */
+  void InitializeCore( const QString& appName,
+		       const QString& appVersion,
+		       const QString& orgName,
+		       const QString& orgDomain );
+
+  /**
+   */
+  inline void SynchronizeSettings() const;
+
+//
+// Protected attributes.
+protected:
+
+
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  //
+  // Static methods.
+  //
+
+  /**
+   * \brief Handles Qt messages thrown by calls to qDebug(),
+   * qWarning(), qCritical(), qFatal().
+   *
+   * This is a callback method registered into Qt message handling
+   * system.
+   *
+   * \param type Type of caught message.
+   * \param message Content of caught message.
+   */
+  static void HandleQtMessage( QtMsgType type, const char* message );
+
+  /**
+   */
+  virtual void virtual_InitializeCore() =0;
+
+  /**
+   */
+  void InitializeLocale();
+
+  /**
+   */
+  void InitializeSettings();
+
+  /**
+   */
+  void LoadAndInstallTranslator( const QString& filename,
+				 const QString& directory =QString(),
+				 const QString& searchDelimiters =QString(),
+				 const QString& suffix =QString() );
+
+//
+// Private attributes.
+private:
+
+  /**
+   */
+  static const char* SETTINGS_KEYS[ SETTINGS_KEY_COUNT ];
+
+  /**
+   * \brief I18nCoreApplication singleton instance.
+   */
+  static I18nCoreApplication* m_Instance;
+
+  /**
+  * \brief Directory where all result files from OTB applications are
+  * stored
+  */
+  QDir m_ResultsDir;
+
+  /**
+   * \brief Application settings
+   */
+  QSettings * m_Settings;
+
+  /**
+   * \brief AbstractModel of the Model-View-Controller design pattern
+   * which is managed by the application.
+   */
+  AbstractModel* m_Model;
+
+  /**
+   */
+  bool m_IsRunningFromBuildDir;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// SLOTS
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+I18nCoreApplication*
+I18nCoreApplication
+::Instance()
+{
+  return I18nCoreApplication::m_Instance;
+}
+
+/*****************************************************************************/
+const I18nCoreApplication*
+I18nCoreApplication
+::ConstInstance()
+{
+  return I18nCoreApplication::m_Instance;
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+T*
+I18nCoreApplication
+::Instance()
+{
+  return qobject_cast< T* >( I18nCoreApplication::Instance() );
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+const T*
+I18nCoreApplication
+::ConstInstance()
+{
+  return qobject_cast< const T* >( I18nCoreApplication::ConstInstance() );
+}
+
+/*****************************************************************************/
+inline
+const AbstractModel*
+I18nCoreApplication
+::GetModel() const
+{
+  return m_Model;
+}
+
+/*****************************************************************************/
+inline
+AbstractModel*
+I18nCoreApplication
+::GetModel()
+{
+  return m_Model;
+}
+
+/*****************************************************************************/
+template< typename TModel >
+inline
+const TModel*
+I18nCoreApplication
+::GetModel() const
+{
+  return qobject_cast< const TModel* >( m_Model );
+}
+
+/*****************************************************************************/
+template< typename TModel >
+inline
+TModel*
+I18nCoreApplication
+::GetModel()
+{
+  return qobject_cast< TModel* >( m_Model );
+}
+
+/*****************************************************************************/
+const QDir&
+I18nCoreApplication
+::GetResultsDir() const
+{
+  return m_ResultsDir;
+}
+
+/*****************************************************************************/
+QDir&
+I18nCoreApplication
+::GetResultsDir()
+{
+  return m_ResultsDir;
+}
+
+/*****************************************************************************/
+inline
+bool
+I18nCoreApplication
+::HasSettingsKey( SettingsKey key ) const
+{
+  return HasSettingsKey( I18nCoreApplication::SETTINGS_KEYS[ key ] );
+}
+
+/*****************************************************************************/
+inline
+void
+I18nCoreApplication
+::StoreSettingsKey( SettingsKey key, const QVariant & value )
+{
+  StoreSettingsKey( I18nCoreApplication::SETTINGS_KEYS[ key ], value );
+}
+
+/*****************************************************************************/
+inline
+QVariant
+I18nCoreApplication
+::RetrieveSettingsKey( SettingsKey key ) const
+{
+  return RetrieveSettingsKey( I18nCoreApplication::SETTINGS_KEYS[ key ] );
+}
+
+/*****************************************************************************/
+inline
+bool
+I18nCoreApplication
+::HasSettingsKey( const QString & key ) const
+{
+  assert( m_Settings!=NULL );
+
+  SynchronizeSettings();
+
+  return m_Settings->contains( key );
+}
+
+/*****************************************************************************/
+inline
+void
+I18nCoreApplication
+::StoreSettingsKey( const QString & key, const QVariant& value )
+{
+  assert( m_Settings!=NULL );
+
+  // qDebug() << this << "::StoreSettingsKey(" << key << ", " << value << ")";
+
+  m_Settings->setValue( key, value );
+
+  SynchronizeSettings();
+}
+
+/*****************************************************************************/
+inline
+QVariant
+I18nCoreApplication
+::RetrieveSettingsKey( const QString & key ) const
+{
+  assert( m_Settings!=NULL );
+
+  SynchronizeSettings();
+
+  return m_Settings->value( key );
+}
+
+/*****************************************************************************/
+inline
+void
+I18nCoreApplication
+::SynchronizeSettings() const
+{
+  assert( m_Settings!=NULL );
+
+  m_Settings->sync();
+
+  switch( m_Settings->status() )
+    {
+    case QSettings::NoError:
+      // Ok.
+      break;
+
+    case QSettings::AccessError:
+      throw SystemError( ToStdString( tr( "Cannot access settings file." ) ) );
+      break;
+
+    case QSettings::FormatError:
+      throw SystemError( ToStdString( tr( "Bad settings file format." ) ) );
+      break;
+
+    default:
+      // In case when a new enum value if added in the API.
+      assert( false );
+      break;
+    }
+}
+
+} // end namespace 'mvd'
+
+#endif // I18nCoreApplication_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdImageImporter.h b/Modules/Visualization/MonteverdiCore/include/mvdImageImporter.h
new file mode 100644
index 0000000..74631e0
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdImageImporter.h
@@ -0,0 +1,235 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageImporter_h
+#define mvdImageImporter_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractWorker.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImageImporter
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief Import image worker. It is parametrized by the image
+ * filename and the desired (width, height) best-fit size.
+ */
+class OTBMonteverdiCore_EXPORT ImageImporter :
+    public AbstractWorker
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor (dataset-model).
+   *
+   * \param filename Filename of image to import.
+   * \param width Width of the best-fit size or -1 if none.
+   * \param height Height of the best-fit size or -1 if none.
+   * \param isForceCreateEnabled true to force creation of dataset.
+   */
+  ImageImporter( const QString& filename,
+		 bool isForceCreateEnabled,
+		 int width =-1,
+		 int height =-1,
+		 QObject* p =NULL );
+
+  /**
+   * \brief Constructor (image-model).
+   *
+   * \param filename Filename of image to import.
+   * \param width Width of the best-fit size or -1 if none.
+   * \param height Height of the best-fit size or -1 if none.
+   * \param isForceCreateEnabled true to force creation of dataset.
+   */
+  ImageImporter( const QString& filename,
+		 int width =-1,
+		 int height =-1,
+		 QObject* p =NULL );
+
+  /**
+   * \brief Destructor.
+   */
+  ~ImageImporter() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /**
+   * \brief Signal emitted when job/task has correctly been done.
+   *
+   * \param result Resulting QObject instance of NULL if none.
+   */
+  //void Done( QObject* result =NULL );
+
+  /**
+   * \brief Signal emitted when an exception has been caught by this worker.
+   *
+   * \param exc The copy (thread safety) exception which has been caught.
+   */
+  //void ExceptionRaised( std::exception exc );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+  enum ModelType
+  {
+    IMAGE,
+  };
+
+//
+// Private methods.
+private:
+
+  //
+  // AbstractWorker oveloads.
+
+  QObject* virtual_Do() ITK_OVERRIDE;
+
+  QString virtual_GetFirstProgressText() const ITK_OVERRIDE;
+
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  QString m_Filename;
+  /**
+   */
+  ModelType m_ModelType;
+  /**
+   */
+  int m_Width;
+  /**
+   */
+  int m_Height;
+  /**
+   */
+  bool m_IsForceCreateEnabled: 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdImageImporter_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdImagePlacenameLoader.h b/Modules/Visualization/MonteverdiCore/include/mvdImagePlacenameLoader.h
new file mode 100644
index 0000000..83d4877
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdImagePlacenameLoader.h
@@ -0,0 +1,99 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImagePlacenameLoader_h
+#define mvdImagePlacenameLoader_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+#include "OTBMonteverdiCoreExport.h"
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal class pre-declaration.
+class VectorImageModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImagePlacenameLoader
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief
+ *
+ */
+class OTBMonteverdiCore_EXPORT ImagePlacenameLoader : public QObject
+{
+    Q_OBJECT;
+
+public:
+  /** \brief Constructor */
+  ImagePlacenameLoader(VectorImageModel* model);
+
+public slots:
+  /** \brief load the placename */
+  void LoadPlacename();
+
+signals:
+  /** \brief Triggered after a non empty placename was loaded */
+  void PlacenameLoaded( const QString& );
+
+  /** \brief Triggered when processing is finished */
+  void Finished();
+
+private:
+
+  VectorImageModel* m_Model;
+};
+
+} // end namespace 'mvd'
+
+#endif // mvdImageModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdImageProperties.h b/Modules/Visualization/MonteverdiCore/include/mvdImageProperties.h
new file mode 100644
index 0000000..91b534f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdImageProperties.h
@@ -0,0 +1,307 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageProperties_h
+#define mvdImageProperties_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImageProperties
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+#define IMAGE_PROPERTIES_IS_QOBJECT 0
+class OTBMonteverdiCore_EXPORT ImageProperties
+#if IMAGE_PROPERTIES_IS_QOBJECT
+  : public QObject
+#endif
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+#if IMAGE_PROPERTIES_IS_QOBJECT
+  Q_OBJECT;
+
+  Q_PROPERTY( bool isNoDataEnabled
+	      READ IsNoDataEnabled
+	      WRITE SetNoDataEnabled );
+
+  Q_PROPERTY( ComponentType NoData
+	      READ GetNoData
+	      WRITE SetNoData );
+#endif
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+#if IMAGE_PROPERTIES_IS_QOBJECT
+  ImageProperties( QObject* p =NULL );
+#else
+  ImageProperties();
+#endif
+
+  /** \brief Destructor. */
+  virtual ~ImageProperties();
+
+  /**
+   */
+  inline bool IsModified() const;
+
+  /**
+   */
+  inline void ClearModified();
+
+  /*
+   */
+  bool IsNoDataEnabled() const;
+
+  /**
+   */
+  inline void SetNoDataEnabled( bool enabled );
+
+  /**
+   */
+  void SetNoData( ComponentType value = ComponentType( 0 ) );
+
+  /**
+   */
+  inline ComponentType GetNoData() const;
+
+  /**
+   */
+  bool operator == ( const ImageProperties & ) const;
+
+  /**
+   */
+  bool operator != ( const ImageProperties & ) const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  inline void SetModified();
+
+//
+// Private attributes.
+private:
+
+  //
+  // Group bitfield bool flags together.
+  struct Flags
+  {
+    Flags() :
+      m_IsModified( false ),
+      m_NoData( false )
+    {
+    }
+
+  public:
+    bool m_IsModified : 1;
+    bool m_NoData : 1;
+  };
+
+  /**
+   */
+  Flags m_Flags;
+
+  /**
+   */
+  ComponentType m_NoData;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+bool
+ImageProperties
+::IsModified() const
+{
+  return m_Flags.m_IsModified;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageProperties
+::SetModified()
+{
+  m_Flags.m_IsModified = true;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageProperties
+::ClearModified()
+{
+  m_Flags.m_IsModified = false;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageProperties
+::SetNoDataEnabled( bool enabled )
+{
+  m_Flags.m_NoData = enabled;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+void
+ImageProperties
+::SetNoData( ComponentType value )
+{
+  m_NoData = value;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+bool
+ImageProperties
+::IsNoDataEnabled() const
+{
+  return m_Flags.m_NoData;
+}
+
+/*****************************************************************************/
+inline
+ComponentType
+ImageProperties
+::GetNoData() const
+{
+  return m_NoData;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdImageProperties_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h b/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h
new file mode 100644
index 0000000..1281624
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdImageSettings.h
@@ -0,0 +1,412 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageSettings_h
+#define mvdImageSettings_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImageSettings
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT ImageSettings
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types & constants.
+public:
+
+  /** */
+  typedef unsigned int SizeType;
+
+  /** */
+  typedef double ValueType;
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ImageSettings();
+
+  /** \brief Destructor. */
+  virtual ~ImageSettings();
+
+  /**
+   */
+  inline bool IsApplied() const;
+
+  /**
+   */
+  inline bool IsModified() const;
+
+  /**
+   */
+  inline void ClearModified();
+
+  /**
+   */
+  inline void SetApplied();
+
+  /**
+   */
+  inline void SetEffect( Effect );
+
+  /**
+   */
+  inline Effect GetEffect() const;
+
+  /**
+   */
+  const char * GetEffectName() const;
+
+  /**
+   */
+  inline bool HasSize() const;
+
+  /**
+   */
+  inline bool HasValue() const;
+
+  /**
+   */
+  inline void SetSize( unsigned int );
+
+  /**
+   */
+  inline unsigned int GetSize() const;
+
+  /**
+   */
+  void SetValue( double );
+
+  /**
+   */
+  double GetValue() const;
+
+  /**
+   */
+  inline const char * GetValueName() const;
+
+  /**
+   */
+  inline void SetAlpha( double );
+
+  /**
+   */
+  inline double GetAlpha() const;
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /**
+   */
+  inline void SetModified();
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+
+  /**
+   */
+  static char const * const  EFFECT_VALUE_NAME[ EFFECT_COUNT ];
+
+  /**
+   * \brief Flag which notices that rendering settings have been
+   * edited.
+   */
+  // TODO: Optimize using C++ bitset bool foo:1;
+  bool m_IsModified: 1;
+
+  /**
+   * \brief Flag which notices that rendering settings have been
+   * applied to display.
+   */
+  // TODO: Optimize using C++ bitset bool foo:1;
+  bool m_IsApplied: 1;
+
+  /**
+   */
+  Effect m_Effect;
+
+  /**
+   */
+  unsigned int m_Size;
+
+  /**
+   */
+  double m_Range;
+  double m_Angle;
+
+  /**
+   */
+  double m_Alpha;
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+bool
+ImageSettings
+::IsApplied() const
+{
+  return m_IsApplied;
+}
+
+/*****************************************************************************/
+inline
+bool
+ImageSettings
+::IsModified() const
+{
+  return m_IsModified;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageSettings
+::SetModified()
+{
+  // qDebug() << this << "::SetModified()";
+
+  m_IsModified = true;
+  m_IsApplied = false;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageSettings
+::ClearModified()
+{
+  // qDebug() << this << "::ClearModified()";
+
+  m_IsModified = false;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageSettings
+::SetApplied()
+{
+  // qDebug() << this << "::SetApplied()";
+
+  m_IsApplied = true;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageSettings
+::SetEffect( Effect effect )
+{
+  m_Effect = effect;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+Effect
+ImageSettings
+::GetEffect() const
+{
+  return m_Effect;
+}
+
+/*****************************************************************************/
+inline
+const char *
+ImageSettings
+::GetValueName() const
+{
+  assert( qApp!=NULL );
+
+  return
+    qApp->translate(
+      "mvd::ImageSettings",
+      ImageSettings::EFFECT_VALUE_NAME[ m_Effect ]
+    )
+    .toLocal8Bit().constData();
+}
+
+/*****************************************************************************/
+inline
+bool
+ImageSettings
+::HasSize() const
+{
+  return
+    m_Effect==EFFECT_CHESSBOARD ||
+    m_Effect==EFFECT_GRADIENT ||
+    m_Effect==EFFECT_LOCAL_CONTRAST ||
+    m_Effect==EFFECT_LOCAL_TRANSLUCENCY ||
+    m_Effect==EFFECT_SPECTRAL_ANGLE;
+}
+
+/*****************************************************************************/
+inline
+bool
+ImageSettings
+::HasValue() const
+{
+  return
+    m_Effect==EFFECT_LOCAL_CONTRAST ||
+    m_Effect==EFFECT_SPECTRAL_ANGLE;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageSettings
+::SetSize( unsigned int size )
+{
+  m_Size = size;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+unsigned int
+ImageSettings
+::GetSize() const
+{
+  return m_Size;
+}
+
+/*****************************************************************************/
+inline
+void
+ImageSettings
+::SetAlpha( double alpha )
+{
+  m_Alpha = alpha;
+
+  if( m_Alpha>1.0 )
+    m_Alpha = 1.0;
+
+  if( m_Alpha<0.0 )
+    m_Alpha = 0.0;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+double
+ImageSettings
+::GetAlpha() const
+{
+  return m_Alpha;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdImageSettings_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdImageSettingsInterface.h b/Modules/Visualization/MonteverdiCore/include/mvdImageSettingsInterface.h
new file mode 100644
index 0000000..93e24d4
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdImageSettingsInterface.h
@@ -0,0 +1,212 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageSettingsInterface_h
+#define mvdImageSettingsInterface_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class ImageSettings;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImageSettingsInterface
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT ImageSettingsInterface
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  virtual ~ImageSettingsInterface();
+
+  /** */
+  inline const ImageSettings * GetSettings() const;
+
+  /** */
+  inline ImageSettings * GetSettings();
+
+  /** */
+  inline bool HasSettings() const;
+
+  /** */
+#if 0
+  inline
+    template< typename T >
+    const T * GetSettings() const;
+#endif
+
+  /**
+   */
+  void UpdateSettings();
+
+  /** */
+  void SetSettings( ImageSettings * );
+
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  ImageSettingsInterface();
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  virtual void virtual_UpdateSettings();
+  /**
+   */
+  virtual void virtual_SetSettings( ImageSettings * );
+
+//
+// Private attributes.
+private:
+
+  /** */
+  ImageSettings * m_Settings;
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const ImageSettings *
+ImageSettingsInterface
+::GetSettings() const
+{
+  return m_Settings;
+}
+
+/*****************************************************************************/
+inline
+ImageSettings *
+ImageSettingsInterface
+::GetSettings()
+{
+  return m_Settings;
+}
+
+/*****************************************************************************/
+#if 0
+
+template< typename T >
+inline
+const ImageSettings *
+ImageSettingsInterface
+::GetSettings() const
+{
+  return dynamic_cast< T >( m_Settings );
+}
+
+#endif
+
+/*****************************************************************************/
+inline
+bool
+ImageSettingsInterface
+::HasSettings() const
+{
+  return m_Settings!=0;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdImageSettingsInterface_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdMath.h b/Modules/Visualization/MonteverdiCore/include/mvdMath.h
new file mode 100644
index 0000000..fc37f61
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdMath.h
@@ -0,0 +1,187 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMath_h
+#define mvdMath_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+#define USE_VNL 0
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+#if USE_VNL
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "vnl_vector.h"
+#endif //tag=QT4-boost-compatibility
+#endif
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+} // end of namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* FUNCTIONS DECLARATION.                                                    */
+
+namespace otb
+{
+} // end namespace 'otb'
+
+namespace mvd
+{
+/**
+ */
+template< typename X, typename Y, typename K >
+void
+Lerp2( X& x, Y& y,
+       const K& k,
+       const X& x0, const Y& y0,
+       const X& x1, const Y& y1 );
+/**
+ */
+template< typename X, typename Y >
+const Y&
+Lerp2( const X& x,
+       const X& x0, const Y& y0,
+       const X& x1, const Y& y1 );
+
+/**
+ */
+#if USE_VNL
+template< typename T, unsigned int N >
+inline
+const vnl_vector< T, N >&
+Lerp( const T& k,
+      const vnl_vector< T, N >& v0,
+      const vnl_vector< T, N >& v1 );
+#endif // USE_VNL
+
+/**
+ */
+#if USE_VNL
+template< typename T >
+inline
+const T&
+Lerp( const T& k,
+      const T& x0, const T& x1,
+      const T& y0, const T& y1 );
+#endif // USE_VNL
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace otb
+{
+} // end namespace 'otb'.
+
+namespace mvd
+{
+/*******************************************************************************/
+template< typename X, typename Y, typename K >
+void
+Lerp2( X& x, Y& y,
+       const K& k,
+       const X& x0, const Y& y0,
+       const X& x1, const Y& y1 )
+{
+  const K& _1_minus_k( 1 - k );
+
+  x = k * x1 + _1_minus_k * x0;
+  y = k * y1 + _1_minus_k * y0;
+}
+
+/*******************************************************************************/
+template< typename X, typename Y, typename K >
+const Y&
+Lerp2( const X& x,
+       const X& x0, const Y& y0,
+       const X& x1, const Y& y1 )
+{
+  return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
+}
+
+/*******************************************************************************/
+#if USE_VNL
+template< typename T >
+inline
+const vnl_vector< T, N >&
+Lerp( const T& k,
+      const vnl_vector< T, N >& v0,
+      const vnl_vector< T, N >& v1 )
+{
+  return k * v1 + ( T( 1 ) - k ) * v2;
+}
+#endif // USE_VNL
+
+/*******************************************************************************/
+#if USE_VNL
+template< typename T >
+inline
+const T&
+Lerp( const T& k,
+      const T& x0, const T& x1,
+      const T& y0, const T& y1 )
+{
+  return Lerp( k, vnl_vector< T, 2 >( x0, x1 ), vnl_vector< T, 2 >( y0, y1 ) );
+}
+#endif // USE_VNL
+
+} // end namespace 'mvd'
+
+#endif // mvdMath_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdModifiableInterface.h b/Modules/Visualization/MonteverdiCore/include/mvdModifiableInterface.h
new file mode 100644
index 0000000..30226e8
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdModifiableInterface.h
@@ -0,0 +1,129 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdModifiableInterface_h
+#define mvdModifiableInterface_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class ModifiableInterface
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ */
+class OTBMonteverdiCore_EXPORT ModifiableInterface
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** Destructor */
+  virtual ~ModifiableInterface();
+
+  /**
+   */
+  virtual bool IsModified() const =0;
+
+  /**
+   */
+  virtual void ClearModified() =0;
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** Constructor */
+  ModifiableInterface();
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdModifiableInterface_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdMyClass.h b/Modules/Visualization/MonteverdiCore/include/mvdMyClass.h
new file mode 100644
index 0000000..3887c82
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdMyClass.h
@@ -0,0 +1,162 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMyClass_h
+#define mvdMyClass_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class MyClass
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT MyClass :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  MyClass( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~MyClass() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdMyClass_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdOverviewBuilder.h b/Modules/Visualization/MonteverdiCore/include/mvdOverviewBuilder.h
new file mode 100644
index 0000000..2dac8a7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdOverviewBuilder.h
@@ -0,0 +1,218 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdOverviewBuilder_h
+#define mvdOverviewBuilder_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGDALOverviewsBuilder.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractWorker.h"
+#include "mvdProgressInterface.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class OverviewBuilder
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief Import image worker. It is parametrized by the image
+ * filename and the desired (width, height) best-fit size.
+ */
+class OTBMonteverdiCore_EXPORT OverviewBuilder :
+    public AbstractWorker,
+    public ProgressInterface
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types
+public:
+  typedef std::vector< otb::GDALOverviewsBuilder::Pointer > GDALOverviewsBuilderVector;
+
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   */
+  OverviewBuilder( const GDALOverviewsBuilderVector & builders,
+		   QObject * p =NULL );
+
+  /**
+   * \brief Destructor.
+   */
+  ~OverviewBuilder() ITK_OVERRIDE;
+
+  //
+  // ProgressInterface overloads.
+
+  void SetProgress( double ) ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /**
+   * \brief Signal emitted when job/task has correctly been done.
+   *
+   * \param result Resulting QObject instance of NULL if none.
+   */
+  //void Done( QObject* result =NULL );
+
+  /**
+   * \brief Signal emitted when an exception has been caught by this worker.
+   *
+   * \param exc The copy (thread safety) exception which has been caught.
+   */
+  //void ExceptionRaised( std::exception exc );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+  //
+  // AbstractWorker oveloads.
+
+  QObject * virtual_Do() ITK_OVERRIDE;
+
+  QString virtual_GetFirstProgressText() const ITK_OVERRIDE;
+
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  GDALOverviewsBuilderVector m_GDALOverviewsBuilders;
+  /**
+   */
+  int m_Index;
+  /**
+   */
+  int m_Count;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdOverviewBuilder_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdProcessObjectObserver.h b/Modules/Visualization/MonteverdiCore/include/mvdProcessObjectObserver.h
new file mode 100644
index 0000000..1fba5bc
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdProcessObjectObserver.h
@@ -0,0 +1,186 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdProcessObjectObserver_h
+#define mvdProcessObjectObserver_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+#include <itkCommand.h>
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class ProgressInterface;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ProcessObjectObserver
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT ProcessObjectObserver :
+    public itk::Command
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  // Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  typedef ProcessObjectObserver Self;
+  typedef itk::Command Superclass;
+  typedef itk::SmartPointer< Self > Pointer;
+
+  itkNewMacro( Self );
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  ~ProcessObjectObserver() ITK_OVERRIDE;
+
+  const ProgressInterface * GetProgressInterface() const;
+  ProgressInterface * GetProgressInterface();
+
+  void SetProgressInterface( ProgressInterface * );
+
+  //
+  // itk::Command overloads.
+
+  void Execute( itk::Object * caller,
+			const itk::EventObject & event ) ITK_OVERRIDE;
+
+  void Execute( const itk::Object * caller,
+			const itk::EventObject & event ) ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  ProcessObjectObserver();
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  ProgressInterface * m_ProgressInterface;
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdProcessObjectObserver_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdProgressInterface.h b/Modules/Visualization/MonteverdiCore/include/mvdProgressInterface.h
new file mode 100644
index 0000000..c024822
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdProgressInterface.h
@@ -0,0 +1,140 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdProgressInterface_h
+#define mvdProgressInterface_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ProgressInterface
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT ProgressInterface
+{
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  virtual ~ProgressInterface();
+
+  /**
+   */
+  virtual void SetProgress( double ) = 0;
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  ProgressInterface();
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdProgressInterface_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdQuicklookModel.h b/Modules/Visualization/MonteverdiCore/include/mvdQuicklookModel.h
new file mode 100644
index 0000000..04452be
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdQuicklookModel.h
@@ -0,0 +1,233 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdQuicklookModel_h
+#define mvdQuicklookModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#include "mvdVectorImageModel.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class QuicklookModel
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ */
+class OTBMonteverdiCore_EXPORT QuicklookModel :
+    public VectorImageModel
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+
+  /** Constructor */
+  QuicklookModel( QObject* p =NULL );
+
+  /** Destructor */
+  ~QuicklookModel() ITK_OVERRIDE;
+
+  /**
+   * \brief Get the parent image-model of this quicklook image as an
+   * AbstractImageModel.
+   *
+   * \return The parent image-model of this quicklook image.
+   */
+  inline const AbstractImageModel* GetImageModel() const;
+
+  /**
+   * \brief Get the parent image-model of this quicklook image as an
+   * AbstractImageModel.
+   *
+   * \return The parent image-model of this quicklook image.
+   */
+  inline AbstractImageModel* GetImageModel();
+
+  /**
+   * \brief Get the parent image-model of this quicklook image as a
+   * TImageModel.
+   *
+   * \return The parent image-model of this quicklook image.
+   */
+  template< typename TImageModel >
+    inline const TImageModel* GetImageModel() const;
+
+  /**
+   * \brief Get the parent image-model of this quicklook image as a
+   * TImageModel.
+   *
+   * \return The parent image-model of this quicklook image.
+   */
+  template< typename TImageModel >
+    inline TImageModel* GetImageModel();
+
+  //
+  // VectorImageModel overloads.
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public slots.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void SettingsUpdated();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** */
+  void virtual_BuildModel( void* context =NULL ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+const AbstractImageModel*
+QuicklookModel
+::GetImageModel() const
+{
+  return GetImageModel< AbstractImageModel >();
+}
+
+/*****************************************************************************/
+AbstractImageModel*
+QuicklookModel
+::GetImageModel()
+{
+  return GetImageModel< AbstractImageModel >();
+}
+
+/*****************************************************************************/
+template< typename TImageModel >
+const TImageModel*
+QuicklookModel
+::GetImageModel() const
+{
+  return qobject_cast< const TImageModel* >( parent() );
+}
+
+/*****************************************************************************/
+template< typename TImageModel >
+TImageModel*
+QuicklookModel
+::GetImageModel()
+{
+  return qobject_cast< TImageModel* >( parent() );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdQuicklookModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdSerializableInterface.h b/Modules/Visualization/MonteverdiCore/include/mvdSerializableInterface.h
new file mode 100644
index 0000000..e3110d5
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdSerializableInterface.h
@@ -0,0 +1,151 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdSerializableInterface_h
+#define mvdSerializableInterface_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class SerializableInterface
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief 'Template method' pattern applied to serializable objects.
+ */
+class OTBMonteverdiCore_EXPORT SerializableInterface
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  /**
+   */
+  enum Mode
+  {
+    MODE_BINARY = 0,
+    MODE_TEXT = 1,
+  };
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  virtual ~SerializableInterface();
+
+  /**
+   */
+  void Write( const QString& filename, Mode mode ) const;
+
+  /**
+   */
+  void Read( const QString& filename, Mode mode );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  SerializableInterface();
+
+  /**
+   */
+  virtual void virtual_Read( QIODevice* device ) =0;
+
+  /**
+   */
+  virtual void virtual_Write( QIODevice& device ) const =0;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdSerializableInterface_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdStackedLayerModel.h b/Modules/Visualization/MonteverdiCore/include/mvdStackedLayerModel.h
new file mode 100644
index 0000000..34b5e50
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdStackedLayerModel.h
@@ -0,0 +1,955 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdStackedLayerModel_h
+#define mvdStackedLayerModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractModel.h"
+#endif //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractLayerModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class StackedLayerModel
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT StackedLayerModel :
+    public AbstractModel
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+//
+// Private types
+private:
+  // typedef std::vector< AbstractLayerModel * > LayerModelVector;
+  typedef std::map< std::string, AbstractLayerModel * > LayerModelMap;
+
+  // typedef std::pair< AbstractLayerModel *, void * > LayerModelPair;
+  // typedef std::map< std::string, LayerDataPair > LayerModelPairMap;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  typedef std::vector< LayerModelMap::key_type > KeyVector;
+
+  typedef LayerModelMap::size_type SizeType;
+  typedef LayerModelMap::key_type KeyType;
+  typedef LayerModelMap::const_iterator ConstIterator;
+  static const SizeType NIL_INDEX;
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  StackedLayerModel( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~StackedLayerModel() ITK_OVERRIDE;
+
+  inline const AbstractLayerModel * operator[]( SizeType ) const;
+  inline AbstractLayerModel * operator[]( SizeType );
+
+  KeyType Add( AbstractLayerModel * );
+
+  inline const AbstractLayerModel * At( SizeType ) const;
+  inline AbstractLayerModel * At( SizeType );
+
+  inline ConstIterator Begin() const;
+
+  inline void BeginEditPixelInfo() {};
+
+  void BeginEditResolutions() {};
+
+  inline bool Contains( const KeyType & key ) const;
+  bool Contains( const AbstractLayerModel * ) const;
+
+  void CountSRT( size_t & unknown,
+		 size_t & carto,
+		 size_t & geo,
+		 size_t & sensor ) const;
+
+  inline ConstIterator End() const;
+
+  inline void EndEditPixelInfo( const QPoint &, const PointType & );
+
+  void EndEditResolutions();
+
+  /*
+  inline const AbstractLayerModel * Front() const;
+  inline AbstractLayerModel * Front();
+  */
+  inline ConstIterator Find( const AbstractLayerModel * ) const;
+
+  inline const AbstractLayerModel * Get( const KeyType & ) const;
+  inline AbstractLayerModel * Get( const KeyType & );
+
+  inline SizeType GetCount() const;
+
+  inline const KeyType & GetKey( SizeType ) const;
+
+  inline const KeyVector & GetKeys() const;
+
+  template< typename T >
+    T * GetCurrent() const;
+
+  template< typename T >
+    T * GetCurrent();
+
+  AbstractLayerModel * GetCurrent() const;
+  AbstractLayerModel * GetCurrent();
+
+  inline SizeType GetCurrentIndex() const;
+
+  inline const KeyType & GetCurrentKey() const;
+
+  template< typename T >
+    T * GetReference() const;
+
+  template< typename T >
+    T * GetReference();
+
+  AbstractLayerModel * GetReference() const;
+  AbstractLayerModel * GetReference();
+
+  inline SizeType GetReferenceIndex() const;
+
+  inline bool HasCurrent() const;
+
+  inline bool HasReference() const;
+
+  inline SizeType IndexOf( const AbstractLayerModel * ) const;
+
+  KeyType Insert( AbstractLayerModel *, SizeType index );
+
+  inline bool IsEmpty() const;
+
+  inline const PixelInfo::Vector & PixelInfos() const;
+  inline PixelInfo::Vector & PixelInfos();
+
+  inline void SetCurrent( SizeType, bool =false );
+  void SetCurrent( const KeyType & );
+  void SetCurrent( const AbstractLayerModel * );
+
+  inline void SetReference( SizeType, bool =false );
+  void SetReference( const KeyType & );
+  void SetReference( const AbstractLayerModel * );
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+  void Clear();
+  inline void Delete( const KeyType & );
+  inline void DeleteCurrent();
+  inline void LowerCurrent();
+  inline void MoveCurrentToBottom();
+  inline void MoveCurrentToTop();
+  inline void RaiseCurrent();
+  inline void RotateLayers( int );
+  inline void SelectFirst();
+  inline void SelectLast();
+  inline void SelectPrevious();
+  inline void SelectNext();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  void AboutToChangeSelectedLayerModel( const StackedLayerModel::KeyType & );
+  void SelectedLayerModelChanged( const StackedLayerModel::KeyType & );
+
+  void ContentAboutToBeChanged();
+  void ContentAboutToBeReset();
+  void ContentChanged();
+  void ContentReset();
+
+  void CurrentAboutToBeChanged( size_t );
+  void CurrentChanged( size_t );
+
+  void LayerAboutToBeDeleted( size_t index );
+  void LayerAdded( size_t index );
+  void LayerDeleted( size_t index );
+
+  void OrderAboutToBeChanged();
+  void OrderChanged();
+
+  void PixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & );
+
+  void ReferenceAboutToBeChanged( size_t );
+  void ReferenceChanged( size_t );
+
+  void ResolutionsChanged( const PixelInfo::Vector & );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  static KeyType GenerateKey( AbstractLayerModel * );
+
+  inline void ClearPixelInfos();
+
+  void Delete( SizeType );
+
+  inline SizeType FindKey( const KeyType & ) const;
+
+  inline SizeType Next( SizeType );
+  inline SizeType Prev( SizeType );
+
+  void RaiseLayer( SizeType );
+  void LowerLayer( SizeType );
+
+  void RotateLayerUp( SizeType );
+  void RotateLayerDown( SizeType );
+
+  void MoveTo( SizeType index, SizeType position );
+  void MoveToTop( SizeType );
+  void MoveToBottom( SizeType );
+
+  // inline void Swap( SizeType, SizeType );
+
+  inline const KeyType & KeyOf( const AbstractLayerModel * ) const;
+
+//
+// Private attributes.
+private:
+  static const KeyType NIL_KEY;
+
+  static SizeType m_LayerCount;
+
+  LayerModelMap m_LayerModels;
+  KeyVector m_Keys;
+  SizeType m_Current;
+  SizeType m_Reference;
+
+  // Usually, information is a singular term which denotes a
+  // plural. Since there's a container of several pixel-infos and we
+  // usually name container variables by using the plural form, an 's'
+  // is appended to PixelInfo.
+  PixelInfo::Vector m_PixelInfos;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+#if OTB_DEBUG
+inline void trace( const StringVector & );
+#endif
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const AbstractLayerModel *
+StackedLayerModel
+::operator[]( SizeType i ) const
+{
+  return At( i );
+}
+
+/*****************************************************************************/
+inline
+AbstractLayerModel *
+StackedLayerModel
+::operator[]( SizeType i )
+{
+  return At( i );
+}
+
+/*****************************************************************************/
+inline
+const AbstractLayerModel *
+StackedLayerModel
+::At( SizeType i ) const
+{
+  return const_cast< StackedLayerModel * >( this )->At( i );
+}
+
+/*****************************************************************************/
+inline
+AbstractLayerModel *
+StackedLayerModel
+::At( SizeType i )
+{
+  if( i>=GetCount() )
+    return NULL;
+
+  assert( !GetKey( i ).empty() );
+
+  LayerModelMap::const_iterator it(
+    m_LayerModels.find( GetKey( i ) )
+  );
+
+  assert( it!=m_LayerModels.end() );
+
+  return it->second;
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::ConstIterator
+StackedLayerModel
+::Begin() const
+{
+  return m_LayerModels.begin();
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::ClearPixelInfos()
+{
+  m_PixelInfos.reserve( 0 );
+}
+
+/*****************************************************************************/
+inline
+bool
+StackedLayerModel
+::Contains( const KeyType & key ) const
+{
+  return m_LayerModels.find( key )!=m_LayerModels.end();
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::Delete( const KeyType & key )
+{
+  // qDebug() << this << "::Delete(" << key << ")";
+
+  Delete( FindKey( key ) );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::DeleteCurrent()
+{
+  // qDebug() << this << "::DeleteCurrent()";
+
+  Delete( m_Current );
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::FindKey( const KeyType & key ) const
+{
+  KeyVector::const_iterator it( std::find( m_Keys.begin(), m_Keys.end(), key ) );
+
+  if( it==m_Keys.end() )
+    return StackedLayerModel::NIL_INDEX;
+
+  return std::distance( m_Keys.begin(), it );
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::GetCount() const
+{
+  return m_LayerModels.size();
+}
+
+/*****************************************************************************/
+inline
+const StackedLayerModel::KeyVector &
+StackedLayerModel
+::GetKeys() const
+{
+  return m_Keys;
+}
+
+/*****************************************************************************/
+inline
+bool
+StackedLayerModel
+::HasCurrent() const
+{
+  return m_Current<GetCount();
+}
+
+/*****************************************************************************/
+inline
+bool
+StackedLayerModel
+::HasReference() const
+{
+  return m_Reference<GetCount();
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::ConstIterator
+StackedLayerModel
+::End() const
+{
+  return m_LayerModels.end();
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::EndEditPixelInfo( const QPoint & screen, const PointType & view )
+{
+  emit PixelInfoChanged( screen, view, m_PixelInfos );
+}
+
+/*****************************************************************************/
+StackedLayerModel::ConstIterator
+StackedLayerModel
+::Find( const AbstractLayerModel * layer ) const
+{
+  for( LayerModelMap::const_iterator it( m_LayerModels.begin() );
+       it!=m_LayerModels.end();
+       ++it )
+    if( it->second==layer )
+      return it;
+
+  return m_LayerModels.end();
+}
+
+/*****************************************************************************/
+const AbstractLayerModel *
+StackedLayerModel
+::Get( const KeyType & key ) const
+{
+  return const_cast< StackedLayerModel * >( this )->Get( key );
+}
+
+/*****************************************************************************/
+AbstractLayerModel *
+StackedLayerModel
+::Get( const KeyType & key )
+{
+  ConstIterator it( m_LayerModels.find( key ) );
+
+  return
+    it==m_LayerModels.end()
+    ? NULL
+    : it->second;
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+T *
+StackedLayerModel
+::GetCurrent()
+{
+  return dynamic_cast< T * >( GetCurrent() );
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+T *
+StackedLayerModel
+::GetCurrent() const
+{
+  return dynamic_cast< T * >( GetCurrent() );
+}
+
+/*****************************************************************************/
+inline
+AbstractLayerModel *
+StackedLayerModel
+::GetCurrent()
+{
+  if( m_Current>=GetCount() )
+    return NULL;
+
+  LayerModelMap::const_iterator it(
+    m_LayerModels.find( m_Keys[ m_Current ] )
+  );
+
+  if( it==m_LayerModels.end() )
+    return NULL;
+
+  return it->second;
+}
+
+/*****************************************************************************/
+inline
+AbstractLayerModel *
+StackedLayerModel
+::GetCurrent() const
+{
+  return const_cast< StackedLayerModel * >( this )->GetCurrent();
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::GetCurrentIndex() const
+{
+  return m_Current;
+}
+
+/*****************************************************************************/
+inline
+const StackedLayerModel::KeyType &
+StackedLayerModel
+::GetCurrentKey() const
+{
+  return GetKey( m_Current );
+}
+
+/*****************************************************************************/
+inline
+const StackedLayerModel::KeyType &
+StackedLayerModel
+::GetKey( SizeType index ) const
+{
+  if( index>=GetCount() )
+    return StackedLayerModel::NIL_KEY;
+
+  return m_Keys[ index ];
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+T *
+StackedLayerModel
+::GetReference()
+{
+  return dynamic_cast< T * >( GetReference() );
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+T *
+StackedLayerModel
+::GetReference() const
+{
+  return dynamic_cast< T * >( GetReference() );
+}
+
+/*****************************************************************************/
+inline
+AbstractLayerModel *
+StackedLayerModel
+::GetReference()
+{
+  if( m_Reference>=GetCount() )
+    return NULL;
+
+  LayerModelMap::const_iterator it(
+    m_LayerModels.find( m_Keys[ m_Reference ] )
+  );
+
+  if( it==m_LayerModels.end() )
+    return NULL;
+
+  return it->second;
+}
+
+/*****************************************************************************/
+inline
+AbstractLayerModel *
+StackedLayerModel
+::GetReference() const
+{
+  return const_cast< StackedLayerModel * >( this )->GetReference();
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::GetReferenceIndex() const
+{
+  return m_Reference;
+}
+
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::IndexOf( const AbstractLayerModel * layer ) const
+{
+  KeyType key( KeyOf( layer ) );
+
+  if( key==StackedLayerModel::NIL_KEY )
+    return StackedLayerModel::NIL_INDEX;
+
+  for( KeyVector::size_type i=0;
+       i<m_Keys.size();
+       ++i )
+    if( m_Keys[ i ]==key )
+      return i;
+
+  return StackedLayerModel::NIL_INDEX;
+}
+
+/*****************************************************************************/
+inline
+bool
+StackedLayerModel
+::IsEmpty() const
+{
+  return m_LayerModels.empty();
+}
+
+/*****************************************************************************/
+inline
+const StackedLayerModel::KeyType &
+StackedLayerModel
+::KeyOf( const AbstractLayerModel * layerModel ) const
+{
+  for( LayerModelMap::const_iterator it( m_LayerModels.begin() );
+       it!=m_LayerModels.end();
+       ++it )
+    if( it->second==layerModel )
+      return it->first;
+
+  return StackedLayerModel::NIL_KEY;
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::LowerCurrent()
+{
+  if( GetCount()<2 )
+    return;
+
+  assert( m_Current<GetCount() );
+
+  if( m_Current==GetCount()-1 )
+    RotateLayerDown( 1 );
+  else
+    LowerLayer( m_Current );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::MoveCurrentToBottom()
+{
+  if( m_Current>=GetCount() )
+    return;
+
+  MoveToBottom( m_Current );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::MoveCurrentToTop()
+{
+  if( m_Current>=GetCount() )
+    return;
+
+  MoveToTop( m_Current );
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::Next( SizeType index )
+{
+  return
+    index>=GetCount()
+    ? 0
+    : ( index + 1 ) % GetCount();
+}
+
+/*****************************************************************************/
+inline
+const PixelInfo::Vector &
+StackedLayerModel
+::PixelInfos() const
+{
+  return m_PixelInfos;
+}
+
+/*****************************************************************************/
+inline
+PixelInfo::Vector &
+StackedLayerModel
+::PixelInfos()
+{
+  return m_PixelInfos;
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel::SizeType
+StackedLayerModel
+::Prev( SizeType index )
+{
+  return
+    index>=GetCount() || index==0
+    ? GetCount() - 1
+    : index - 1;
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::RaiseCurrent()
+{
+  if( GetCount()<2 )
+    return;
+
+  assert( m_Current<GetCount() );
+
+  if( m_Current==0 )
+    RotateLayerUp( 1 );
+  else
+    RaiseLayer( m_Current );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::RotateLayers( int steps )
+{
+  if( IsEmpty() )
+    return;
+
+  if( steps>=0 )
+    RotateLayerUp( steps % GetCount() );
+
+  else
+    RotateLayerDown( ( -steps ) % GetCount() );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::SelectFirst()
+{
+  if( GetCount()<1 )
+    return;
+
+  SetCurrent( SizeType( 0 ) );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::SelectLast()
+{
+  if( GetCount()<1 )
+    return;
+
+  SetCurrent( m_Keys.size() - 1 );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::SelectNext()
+{
+  if( IsEmpty() )
+    return;
+
+  SetCurrent( Next( m_Current ) );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::SelectPrevious()
+{
+  if( IsEmpty() )
+    return;
+
+  SetCurrent( Prev( m_Current ) );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::SetCurrent( SizeType index, bool force )
+{
+  // qDebug() << this << "::SetCurrent(" << index << ")";
+
+  if( index==m_Current && !force )
+    return;
+
+  KeyType key( GetKey( index  ) );
+
+  // qDebug()
+  //   << QString( "'%1'" ).arg( GetCurrentKey().c_str() )
+  //   << "->"
+  //   << QString( "'%1'" ).arg( key.c_str() );
+
+  emit CurrentAboutToBeChanged( index );
+  emit AboutToChangeSelectedLayerModel( key );
+
+  m_Current = index;
+
+  emit CurrentChanged( index );
+  emit SelectedLayerModelChanged( key );
+}
+
+/*****************************************************************************/
+inline
+void
+StackedLayerModel
+::SetReference( SizeType index, bool force )
+{
+  // qDebug() << this << "::SetReference(" << index << ")";
+
+  if( index==m_Reference && !force )
+    return;
+
+  emit ReferenceAboutToBeChanged( index );
+
+  m_Reference = index;
+
+  emit ReferenceChanged( index );
+}
+
+/*****************************************************************************/
+#if OTB_DEBUG
+
+inline
+void
+trace( const StringVector & strv )
+{
+  qDebug() << "{";
+
+  for( StringVector::const_iterator it( strv.begin() );
+       it!=strv.end();
+       ++it )
+    qDebug() << QString( "%1" ).arg( it->c_str() );
+
+  qDebug() << "}";
+}
+
+#endif
+
+} // end namespace 'mvd'
+
+#endif // mvdStackedLayerModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdSystemError.h b/Modules/Visualization/MonteverdiCore/include/mvdSystemError.h
new file mode 100644
index 0000000..c8f8f4a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdSystemError.h
@@ -0,0 +1,129 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdSystemError_h
+#define mvdSystemError_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <stdexcept>
+#endif //tag=QT4-boost-compatibility
+
+//
+// ITK includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "itksys/SystemTools.hxx"
+#endif //tag=QT4-boost-compatibility
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class SystemError
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT SystemError :
+    public std::runtime_error
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  SystemError( const std::string& message =std::string() ) :
+    std::runtime_error( itksys::SystemTools::GetLastSystemError()
+        + ": " + message) {};
+
+  /** \brief Destructor. */
+  ~SystemError() throw() ITK_OVERRIDE {};
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+
+//
+// Private attributes.
+private:
+
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+
+#endif // mvdSystemError_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdTextStream.h b/Modules/Visualization/MonteverdiCore/include/mvdTextStream.h
new file mode 100644
index 0000000..b935eff
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdTextStream.h
@@ -0,0 +1,1023 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdStream_h
+#define mvdStream_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "itkHistogram.h"
+#include "itkSize.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAlgorithm.h"
+#include "mvdSystemError.h"
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+/**
+ * \brief TODO.
+ */
+enum StreamTag
+{
+  STREAM_TAG_SIZE = 0,
+  STREAM_TAG_VECTOR,
+  STREAM_TAG_VARIABLE_LENGTH_VECTOR,
+  //
+  STREAM_TAG_COUNT
+};
+
+/**
+ * \brief TODO.
+ */
+extern
+const char* STREAM_TAG_NAMES[ STREAM_TAG_COUNT ];
+
+//
+// Internal classes pre-declaration.
+} // end of namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* FUNCTIONS DECLARATION.                                                    */
+
+
+/*****************************************************************************/
+
+namespace mvd
+{
+
+/**
+ * \brief Check status Qt stream and throw SystemError exception if
+ * status is not Ok.
+ */
+inline
+void
+CheckStreamStatus( QTextStream& stream );
+
+/**
+ * \brief Write a text tag followed by a white space to the stream.
+ *
+ * \param stream Stream to write into.
+ * \param name Tag name to write.
+ * \param enqueueWS Enqueue a whitespace following the tag name.
+ *
+ * \return stream instance.
+ */
+inline
+QTextStream&
+WriteStreamTag( QTextStream& stream,
+		const QString& name,
+		bool enqueueWS =true );
+
+/**
+ * \brief Read a text tag followed by a whitespace from the stream and
+ * check it against an expected value.
+ *
+ * \param stream Stream to read from.
+ * \param tag Text tag which has been read.
+ * \param expected The expected tag name. If non-empty, value read
+ * from stream is checked against expected value; an
+ * std::runtime_exception is thrown if both values doest not match.
+ * \param skipWS Skip whitespace following tag name.
+ *
+ * \return stream instance.
+ */
+inline
+QTextStream&
+ReadStreamTag( QTextStream& stream,
+	       QString& tag,
+	       const QString& expected =QString(),
+	       bool skipWS =true );
+
+/*****************************************************************************/
+
+/**
+ * \brief Write an StreamTag followed by a whitespace separator into a
+ * QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param tag StreamTag data to write.
+ *
+ * \return stream instance.
+ */
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      StreamTag tag );
+
+/**
+ * \brief Read a StreamTag followed by a whitespace from a
+ * QTextStream.
+ *
+ * \param stream QTextStream from which to read data.
+ * \param tag StreamTag to data read.
+ *
+ * \return stream instance.
+ */
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      StreamTag& tag );
+
+/*****************************************************************************/
+
+/**
+ * \brief Write an std::vector< T, std::allocator< T > > into a QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param vector std::vector< T, std::allocator< T > > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const std::vector< T, std::allocator< T > >& vector );
+
+/**
+ * \brief
+ */
+template<>
+inline
+QTextStream&
+operator << < double >( QTextStream& stream,
+			const std::vector< double >& vector );
+
+/**
+ * \brief
+ */
+template<>
+inline
+QTextStream&
+operator << < float >( QTextStream& stream,
+		       const std::vector< float >& vector );
+
+/**
+ * \brief Read an std::vector< T, Alloc > from a QTextStream.
+ *
+ * \param stream QTextStream from which to read data.
+ * \param vector std::vector< T, Alloc > container to read data into.
+ *
+ * \return stream instance.
+ */
+template< typename T, typename Alloc >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      std::vector< T, Alloc >& vector );
+
+/*****************************************************************************/
+
+/**
+ * \brief Write an itk::Array< T > into a QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param array itk::Array< T > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::Array< T >& array );
+
+/**
+ * \brief Read an itk::Array< T > from a QTextStream.
+ *
+ * \param stream QTextStream from which to read data.
+ * \param array itk::Array< T > container to read data into.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::Array< T >& array );
+
+/*****************************************************************************/
+
+/**
+ * \brief Write an itk::VariableLengthVector< T > into a QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param vector itk::VariableLengthVector< T > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< T >& vector );
+
+/**
+ */
+template<>
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< float >& vector );
+
+/**
+ */
+template<>
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< double >& vector );
+
+/**
+ * \brief Read an itk::VariableLengthVector< T > from a QTextStream.
+ *
+ * \param stream QTextStream from which to read data.
+ * \param vector itk::VariableLengthVector< T > container to read data into.
+ *
+ * \return stream instance.
+ */
+template< typename T >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::VariableLengthVector< T >& vector );
+
+/*****************************************************************************/
+
+/**
+ * \brief Write an itk::statistics::Histogram< T, FC > into a QTextStream.
+ *
+ * \param stream QTextStream into which to write data.
+ * \param histogram itk::statistics::Histogram< T, FC > data to write.
+ *
+ * \return stream instance.
+ */
+template< typename T, typename FC >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::Statistics::Histogram< T, FC >& histogram );
+
+/**
+ * \brief Read an itk::statistics::Histogram< T, FC > from a QTextStream.
+ *
+ * \param stream QTextStream from which to read data.
+ * \param histogram itk::statistics::Histogram< T, FC > container to
+ * read data into.
+ *
+ * \return stream instance.
+ */
+template< typename T, typename FC >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::Statistics::Histogram< T, FC >& histogram );
+
+} // end namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*******************************************************************************/
+inline
+void
+CheckStreamStatus( QTextStream& stream )
+{
+  if( stream.status()!=QTextStream::Ok )
+    throw SystemError();
+}
+
+/*******************************************************************************/
+inline
+QTextStream&
+WriteStreamTag( QTextStream& stream,
+		const QString& name,
+		bool queueWhiteSpace )
+{
+  stream << name;
+
+  if( queueWhiteSpace )
+    stream << " ";
+
+  CheckStreamStatus( stream );
+
+  return stream;
+}
+
+/*******************************************************************************/
+inline
+QTextStream&
+ReadStreamTag( QTextStream& stream,
+	       QString& name,
+	       const QString& expected,
+	       bool skipWhiteSpace )
+{
+  stream >> name;
+
+  if( skipWhiteSpace )
+    stream >> ws;
+
+  CheckStreamStatus( stream );
+
+  if( !expected.isEmpty() &&
+      expected.compare( name, Qt::CaseInsensitive )!=0 )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Read tag '%1' does not match expected tag '%2'."
+	)
+	.arg( name )
+	.arg( expected )
+      )
+    );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      StreamTag tag )
+{
+  WriteStreamTag( stream, STREAM_TAG_NAMES[ tag ] );
+
+  return stream;
+}
+
+/*******************************************************************************/
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      StreamTag& tag )
+{
+  QString name;
+
+  ReadStreamTag( stream, name );
+
+  bool found = false;
+
+  for( int i=0; i<STREAM_TAG_COUNT && !found; ++i )
+    {
+    if( name.compare( STREAM_TAG_NAMES[ i ], Qt::CaseInsensitive )==0 )
+      {
+      found = true;
+      tag = static_cast< StreamTag >( i );
+      }
+    }
+
+  if( !found )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Invalid tag name '%1'."
+	)
+	.arg( name )
+      )
+    );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const std::vector< T, std::allocator< T > >& vector )
+{
+  typedef std::vector< T, std::allocator< T > > Vector;
+
+  stream << STREAM_TAG_VECTOR << vector.size();
+
+  for( typename Vector::const_iterator it( vector.begin() );
+       it!=vector.end();
+       ++it )
+    {
+    stream << " " << *it;
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template<>
+inline
+QTextStream&
+operator << < float >( QTextStream& stream,
+		       const std::vector< float >& vector )
+{
+  typedef std::vector< float, std::allocator< float > > Vector;
+
+  stream << STREAM_TAG_VECTOR << vector.size();
+
+  for( Vector::const_iterator it( vector.begin() );
+       it!=vector.end();
+       ++it )
+    {
+    stream << " " << ToQString( *it );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template<>
+inline
+QTextStream&
+operator << < double >( QTextStream& stream,
+			const std::vector< double >& vector )
+{
+  typedef std::vector< double, std::allocator< double > > Vector;
+
+  stream << STREAM_TAG_VECTOR << vector.size();
+
+  for( Vector::const_iterator it( vector.begin() );
+       it!=vector.end();
+       ++it )
+    {
+    stream << " " << ToQString( *it );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T, typename Alloc >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      std::vector< T, Alloc >& vector )
+{
+  typedef std::vector< T, Alloc > Vector;
+
+  QString type;
+  ReadStreamTag( stream, type, STREAM_TAG_NAMES[ STREAM_TAG_VECTOR ] );
+
+  typename Vector::size_type size = 0;
+
+  stream >> size;
+
+  vector.resize( size );
+
+  for( typename Vector::iterator it( vector.begin() );
+       it!=vector.end();
+       ++it )
+    {
+    stream >> ws >> *it;
+    }
+
+  return stream;
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::Array< T >& array )
+{
+
+  stream << STREAM_TAG_SIZE << array.GetSize();
+  CheckStreamStatus( stream );
+
+  for( CountType i=0; i<array.GetSize(); ++i )
+    {
+    stream << " " << array[ i ];
+    CheckStreamStatus( stream );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::Array< T >& array )
+{
+
+  CountType dimension = 0;
+
+  QString type;
+  ReadStreamTag( stream, type, STREAM_TAG_NAMES[ STREAM_TAG_SIZE ] );
+
+  stream >> dimension;
+
+  if( dimension!=array.GetSize() )
+    {
+    throw std::length_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Array dimension (%1) does not match "
+	  "expected dimension (%2)."
+	)
+	.arg( dimension )
+	.arg( array.GetSize() )
+      )
+    );
+    }
+
+  for( CountType i=0; i<array.GetSize(); ++i )
+    {
+    stream >> ws >> array[ i ];
+    CheckStreamStatus( stream );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< T >& vector )
+{
+  typedef typename itk::VariableLengthVector< T > Vector;
+
+  // Write number of elements.
+  stream << STREAM_TAG_VARIABLE_LENGTH_VECTOR << vector.Size();
+  CheckStreamStatus( stream );
+
+  // Write each element prefixed by a delimitting whitespace.
+  for( typename Vector::ElementIdentifier i=0;
+       i<vector.Size();
+       ++i )
+    {
+    stream << " " << vector[ i ];
+    CheckStreamStatus( stream );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template<>
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< double >& vector )
+{
+  typedef itk::VariableLengthVector< double > Vector;
+
+  // Write number of elements.
+  stream << STREAM_TAG_VARIABLE_LENGTH_VECTOR << vector.Size();
+  CheckStreamStatus( stream );
+
+  // Write each element prefixed by a delimitting whitespace.
+  for( Vector::ElementIdentifier i=0;
+       i<vector.Size();
+       ++i )
+    {
+    stream << " " << ToQString( vector[ i ] );
+    CheckStreamStatus( stream );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template<>
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::VariableLengthVector< float >& vector )
+{
+  typedef itk::VariableLengthVector< float > Vector;
+
+  // Write number of elements.
+  stream << STREAM_TAG_VARIABLE_LENGTH_VECTOR << vector.Size();
+  CheckStreamStatus( stream );
+
+  // Write each element prefixed by a delimitting whitespace.
+  for( Vector::ElementIdentifier i=0;
+       i<vector.Size();
+       ++i )
+    {
+    stream << " " << ToQString( vector[ i ] );
+    CheckStreamStatus( stream );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::VariableLengthVector< T >& vector )
+{
+  typedef typename itk::VariableLengthVector< T > Vector;
+
+  QString type;
+  ReadStreamTag( stream, type, STREAM_TAG_NAMES[ STREAM_TAG_VARIABLE_LENGTH_VECTOR ] );
+
+  // Read number of elements.
+  typename Vector::ElementIdentifier size = 0;
+  stream >> size;
+  CheckStreamStatus( stream );
+
+  // Allocates vector elements.
+  vector.SetSize( size );
+
+  // Read each element prefixed by a delimitting whitespace.
+  for( typename Vector::ElementIdentifier i=0;
+       i<vector.Size();
+       ++i )
+    {
+    stream >> ws >> vector[ i ];
+    CheckStreamStatus( stream );
+    }
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T, typename FC >
+inline
+QTextStream&
+operator << ( QTextStream& stream,
+	      const itk::Statistics::Histogram< T, FC >& histogram )
+{
+  typedef typename itk::Statistics::Histogram< T, FC > Histogram;
+
+  WriteStreamTag( stream, "HISTOGRAM", false );
+  stream << endl;
+
+  WriteStreamTag( stream, "MEASUREMENT" );
+  stream << histogram.GetSize() << endl;
+
+#if 1
+  WriteStreamTag( stream, "MINS" );
+  stream << histogram.GetMins() << endl;
+
+  WriteStreamTag( stream, "MAXS" );
+  stream << histogram.GetMaxs() << endl;
+#endif
+
+
+#if 0
+  typename Histogram::SizeType size( histogram.GetSize() );
+
+  for( unsigned int dim=0; dim<N; ++dim )
+    {
+    for( unsigned long bin=0; bin<size[ dim ]; ++bin )
+      {
+      stream
+	<< dim << " "
+	<< bin << " "
+	<< histogram.GetMins()[ dim ][ bin ] << " "
+	<< histogram.GetMaxs()[ dim ][ bin ] << " "
+	<< histogram.GetFrequency( bin, dim ) << endl;
+
+      CheckStreamStatus( stream );
+      }
+    }
+
+#else
+  CountType size = histogram.Size();
+
+  WriteStreamTag( stream, "SAMPLES" );
+  stream << size << endl;
+  CheckStreamStatus( stream );
+
+  CountType count = 0;
+
+  for( typename Histogram::ConstIterator it( histogram.Begin() );
+       it!=histogram.End();
+       ++it, ++count )
+    {
+    stream
+      << it.GetInstanceIdentifier() << " "
+      << ToQString( it.GetFrequency() ) << endl;
+
+    CheckStreamStatus( stream );
+    }
+
+  WriteStreamTag( stream, "COUNT" );
+  stream << count << endl;
+  CheckStreamStatus( stream );
+
+  if( count!=size )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Histogram sample count (%1) does not match "
+	  "written sample count (%2)."
+	)
+	.arg( size )
+	.arg( count )
+      )
+    );
+    }
+#endif
+
+  return stream;
+}
+
+/*******************************************************************************/
+template< typename T, typename FC >
+inline
+QTextStream&
+operator >> ( QTextStream& stream,
+	      itk::Statistics::Histogram< T, FC >& histogram )
+{
+  typedef itk::Statistics::Histogram< T, FC > Histogram;
+
+  QString string;
+  unsigned int N = histogram.GetMeasurementVectorSize();
+
+
+  //
+  // Histogram section.
+  ReadStreamTag( stream, string, "HISTOGRAM" );
+
+  //
+  // Measurement-size section.
+  ReadStreamTag( stream, string, "MEASUREMENT" );
+  typename Histogram::SizeType size;
+  size.SetSize(N);
+
+  stream >> size;
+
+  // Dimension of size is checked in operator >> ( QTextStream&,
+  // itk::Size< T > ).
+
+  histogram.Initialize( size );
+
+#if 1
+  //
+  // Bin mins.
+  ReadStreamTag( stream, string, "MINS" );
+  typename Histogram::BinMinContainerType mins;
+  stream >> mins;
+
+  //
+  // Bin maxes.
+  ReadStreamTag( stream, string, "MAXS" );
+  typename Histogram::BinMaxContainerType maxs;
+  stream >> maxs;
+
+  if( mins.size()!=N )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Histogram mins dimension (%1) does not match "
+	  "expected dimension (%2)."
+	)
+	.arg( mins.size() )
+	.arg( N )
+      )
+    );
+    }
+
+  if( maxs.size()!=N )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Histogram maxs dimension (%1) does not match "
+	  "expected dimension (%2)."
+	)
+	.arg( maxs.size() )
+	.arg( N )
+      )
+    );
+    }
+
+  //
+  // Initialize histogram mins & maxs within single pass.
+  for( typename Histogram::BinMaxContainerType::size_type dim=0;
+       dim<maxs.size();
+       ++dim )
+    {
+    for( typename Histogram::BinMaxContainerType::value_type::size_type bin=0;
+	 bin<maxs[ dim ].size();
+	 ++bin )
+      {
+      histogram.SetBinMin( dim, bin, mins[ dim ][ bin ] );
+      histogram.SetBinMax( dim, bin, maxs[ dim ][ bin ] );
+      }
+    }
+#endif
+
+#if 0
+  //
+  // Bins.
+  for( unsigned int dim=0; dim<N; ++dim )
+    {
+    for( unsigned long bin=0; bin<size[ dim ]; ++bin )
+      {
+      // Dimension.
+      unsigned int d = 0;
+
+      stream >> d >> ws;
+      CheckStreamStatus( stream );
+      if( d!=dim )
+	{
+	throw std::runtime_error(
+	  ToStdString(
+	    QCoreApplication::translate(
+	      "mvd::TextStream",
+	      "Histogram dimension (%1) does not match "
+	      "expected dimension (%2)."
+	    )
+	    .arg( d )
+	    .arg( dim )
+	  )
+	);
+	}
+
+      // Bin.
+      unsigned long b = 0;
+
+      stream >> b >> ws;
+      CheckStreamStatus( stream );
+      if( b!=bin )
+	{
+	throw std::runtime_error(
+	  ToStdString(
+	    QCoreApplication::translate(
+	      "mvd::TextStream",
+	      "Histogram bin count (%1) does not match "
+	      "expected bin count (%2)."
+	    )
+	    .arg( b )
+	    .arg( bin )
+	  )
+	);
+	}
+
+      // Min.
+      typename Histogram::BinMinContainerType::value_type::value_type min;
+
+      stream >> min >> ws;
+      CheckStreamStatus( stream );
+
+      histogram.SetBinMin( dim, bin, min );
+
+      // Max.
+      typename Histogram::BinMaxContainerType::value_type::value_type max;
+
+      stream >> max >> ws;
+      CheckStreamStatus( stream );
+
+      histogram.SetBinMax( dim, bin, max );
+
+      // Frequency.
+      typename Histogram::AbsoluteFrequencyType freq( 0 );
+
+      stream >> freq;
+      CheckStreamStatus( stream );
+
+      typename Histogram::MeasurementType measurement(
+	histogram.GetMeasurement( b, d )
+      );
+
+      typename Histogram::IndexType index( histogram.GetIndex( measurement ) );
+
+      histogram.SetFrequency( index, freq );
+      }
+    }
+
+#else
+  CountType samples = 0;
+
+  ReadStreamTag( stream, string, "SAMPLES" );
+  stream >> samples;
+  CheckStreamStatus( stream );
+
+  CountType space = histogram.Size();
+
+  if( samples!=space )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Histogram sample count (%1) does not match "
+	  "expected sample count (%2)."
+	)
+	.arg( samples )
+	.arg( space )
+      )
+    );
+    }
+
+  CountType i = 0;
+  for( ; i<samples; ++i )
+    {
+    typename Histogram::InstanceIdentifier id( 0 );
+    typename Histogram::AbsoluteFrequencyType freq( 0 );
+
+    stream >> id >> ws >> freq;
+    CheckStreamStatus( stream );
+
+    histogram.SetFrequency( id, freq );
+    }
+
+  CountType count = 0;
+
+  ReadStreamTag( stream, string, "COUNT" );
+  stream >> count;
+  CheckStreamStatus( stream );
+
+  if( count!=i )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	QCoreApplication::translate(
+	  "mvd::TextStream",
+	  "Read sample count (histogram) (%1) does not match "
+	  "written sample count (%2)."
+	)
+	.arg( i )
+	.arg( count )
+      )
+    );
+    }
+
+#endif
+
+  return stream;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdStream_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdTypes.h b/Modules/Visualization/MonteverdiCore/include/mvdTypes.h
new file mode 100644
index 0000000..e895260
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdTypes.h
@@ -0,0 +1,310 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdTypes_h
+#define mvdTypes_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <exception>
+#endif //tag=QT4-boost-compatibility
+
+//
+// ITK includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include <itkArray.h>
+#include <itkImageRegion.h>
+#endif //tag=QT4-boost-compatibility
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See:
+		   // https://bugreports.qt-project.org/browse/QTBUG-22829
+		   // //tag=QT4-boost-compatibility
+#include <otbCast.h>
+#include <otbImage.h>
+#include <otbImageFileReader.h>
+#include <otbImageFileWriter.h>
+#include <otbVectorImage.h>
+#endif //tag=QT4-boost-compatibility
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+//
+// Type definitions.
+namespace mvd
+{
+
+/*******************************************************************************/
+/* Enumerations                                                                */
+
+/*******************************************************************************/
+/* Type definitions of scalar values.                                          */
+
+/**
+ */
+typedef unsigned int CountType;
+
+/**
+ */
+typedef Monteverdi_FLOATING_TYPE RealType;
+
+/**
+ */
+typedef RealType ComponentType;
+
+/**
+ */
+typedef itk::VariableLengthVector< RealType > VectorPixelType;
+
+/*******************************************************************************/
+/* Type definitions of STL realization.                                        */
+
+/**
+ */
+typedef std::vector< std::string > StringVector;
+
+/**
+ */
+typedef std::vector< int > IntVector;
+
+/**
+ */
+typedef std::vector< unsigned int > UIntVector;
+
+/**
+ */
+typedef std::list< std::string > StringList;
+
+/**
+ */
+typedef std::vector< double > DoubleVector;
+
+/*******************************************************************************/
+/* Type definitions of ITK realization.                                        */
+
+/**
+ */
+typedef itk::Array< double > ParametersType;
+
+/*******************************************************************************/
+/* Type definitions depending on dimension.                                    */
+
+/**
+ */
+typedef itk::ImageRegion< Monteverdi_DIMENSION > ImageRegionType;
+
+/**
+ */
+typedef itk::Index< Monteverdi_DIMENSION > IndexType;
+
+/**
+ */
+typedef itk::Size< Monteverdi_DIMENSION > SizeType;
+
+/**
+ */
+typedef itk::ImageBase< Monteverdi_DIMENSION > ImageBaseType;
+
+/*******************************************************************************/
+/* Type definitions for scalar/mono-band images.                               */
+
+/**
+ */
+typedef
+otb::Image< ComponentType, Monteverdi_DIMENSION >
+ScalarImageType;
+
+/**
+ */
+typedef
+otb::ImageFileReader< ScalarImageType > ScalarImageFileReaderType;
+
+/**
+ */
+typedef
+otb::ImageFileWriter< ScalarImageType > ScalarImageFileWriterType;
+
+/*******************************************************************************/
+/* Type definitions for vector/multi-band images (generic internal data).      */
+
+/**
+ */
+typedef
+otb::VectorImage< ComponentType, Monteverdi_DIMENSION >
+VectorImageType;
+
+/**
+ */
+typedef otb::ImageFileReader< VectorImageType > VectorImageFileReaderType;
+
+/**
+ */
+typedef otb::ImageFileWriter< VectorImageType > VectorImageFileWriterType;
+
+/**
+ */
+typedef VectorImageType::SpacingType SpacingType;
+
+/**
+ */
+typedef VectorImageType::SizeType SizeType;
+
+/**
+ */
+typedef VectorImageType::PointType PointType;
+
+/*******************************************************************************/
+/* Type definitions for application defaults.                                  */
+
+/**
+ */
+typedef mvd::VectorImageType DefaultImageType;
+
+/**
+ */
+typedef mvd::VectorImageFileReaderType DefaultImageFileReaderType;
+
+/**
+ */
+struct PixelInfo
+{
+  typedef std::vector< PixelInfo > Vector;
+
+  PixelInfo() :
+    m_Key(),
+    m_Point(),
+    m_Index(),
+    m_Pixel(),
+    m_HasPoint( false ),
+    m_HasIndex( false ),
+    m_HasPixel( false ),
+    m_HasResolution( false )
+  {
+  }
+
+  std::string m_Key;
+
+  DefaultImageType::PointType m_Point;
+  DefaultImageType::IndexType m_Index;
+  DefaultImageType::PixelType m_Pixel;
+  unsigned int m_Resolution;
+
+  bool m_HasPoint: 1;
+  bool m_HasIndex: 1;
+  bool m_HasPixel: 1;
+  bool m_HasResolution: 1;
+};
+
+/*******************************************************************************/
+/* Type definitions for wrapped applications                                   */
+
+/**
+ */
+typedef std::map< std::string, std::string > ApplicationDocNameToNameMap;
+
+/**
+ */
+typedef std::map< std::string, StringVector > ApplicationsTagContainer;
+
+/*******************************************************************************/
+/* Type definitions for dataset properties                                     */
+/**
+ */
+typedef qlonglong SqlId;
+/**
+ */
+// typedef SqlId DatasetId;
+typedef QString DatasetHash;
+/**
+ */
+typedef std::pair< std::string, std::string > PropertyType;
+
+/**
+ */
+typedef std::vector< PropertyType > PropertiesVector;
+
+/**
+ */
+typedef
+std::pair< std::string, std::vector< PropertyType > > PropertiesVectorByCategory;
+
+/**
+ */
+typedef std::map< std::string, PropertiesVector > PropertiesContainer;
+
+/*******************************************************************************/
+/* Type definitions for Dataset list                                           */
+
+/**
+ */
+typedef QPair< QString, QString > StringPairType;
+
+/**
+ */
+typedef QList< StringPairType > StringPairListType;
+
+/*******************************************************************************/
+template< typename T >
+inline
+T
+QObjectCast( QObject * object, const QString & string = QString() )
+{
+  T model = qobject_cast< T >( object );
+
+  if( model!=object )
+    {
+    if( !string.isNull() )
+      qWarning() << string;
+
+    throw std::bad_cast();
+    }
+
+  return model;
+}
+
+/*******************************************************************************/
+} // end namespace 'mvd'
+
+#endif // mvdTypes_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdVectorImageModel.h b/Modules/Visualization/MonteverdiCore/include/mvdVectorImageModel.h
new file mode 100644
index 0000000..17f5b98
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdVectorImageModel.h
@@ -0,0 +1,403 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdVectorImageModel_h
+#define mvdVectorImageModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiCoreExport.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "itkExtractImageFilter.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "otbGenericRSTransform.h"
+#endif //tag=QT4-boost-compatibility
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractImageModel.h"
+#include "mvdFilenameInterface.h"
+#include "mvdVectorImageSettings.h"
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class DatasetModel;
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class VectorImageModel
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ */
+class OTBMonteverdiCore_EXPORT VectorImageModel :
+    public AbstractImageModel,
+    public FilenameInterface
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  /**
+   * In-memory storage type of source image (from file).
+   */
+  typedef DefaultImageType SourceImageType;
+
+//
+// Public methods.
+public:
+
+  /**
+   */
+  static const unsigned int DEFAULT_LOD_SIZE;
+
+  /** Constructor */
+  VectorImageModel( QObject* p =NULL );
+
+  /** Destructor */
+  ~VectorImageModel() ITK_OVERRIDE;
+
+  /** */
+  static void EnsureValidImage( const QString& filename );
+
+  /** */
+  // TODO: Move into template wrapper base-class.
+  SourceImageType::ConstPointer ToImage() const;
+
+  /** */
+  // TODO: Move into template wrapper base-class.
+  const SourceImageType::Pointer& ToImage();
+
+  /**
+   */
+  inline const VectorImageSettings & GetSettings() const;
+
+  /** */
+  inline VectorImageSettings & GetSettings();
+
+  /** */
+  inline void SetSettings( const VectorImageSettings & settings );
+
+  /** */
+  inline const otb::GenericRSTransform<> * GetGenericRSTransform() const;
+
+  /**
+   * Width and height are added to compute the best level of detail to
+   * load from the image if multi-resolution image.
+   */
+  void SetFilename( const QString& filename, int width, int height );
+
+  /**
+   * Following the zoom factor, get the best level of detail
+   */
+  CountType ComputeBestLod( double ZoomFactor ) const;
+
+  /**
+   * Following the zoom factor, get the best level of detail
+   */
+  CountType ComputeBestLod( int width, int height ) const;
+
+  //
+  // AbstractImageModel methods.
+
+  /**
+   * Get the number of available LOD.
+   */
+  CountType GetNbLod() const ITK_OVERRIDE;
+
+  /**
+   * Get a smart-pointer to the current LOD image-base.
+   */
+  ImageBaseType::ConstPointer ToImageBase() const ITK_OVERRIDE;
+
+  /**
+   * Get a smart-pointer to the current LOD image-base.
+   */
+  ImageBaseType::Pointer ToImageBase() ITK_OVERRIDE;
+
+  /**
+   * Get the placename from the center pixel
+   */
+  std::string GetCenterPixelPlaceName();
+
+  //
+  // AbstractModel methods.
+
+  bool IsModified() const ITK_OVERRIDE;
+
+  void ClearModified() ITK_OVERRIDE;
+
+  // get image size in byte
+  std::streamoff GetImageSizeInBytes()
+  {
+    return m_ImageFileReader->GetImageIO()->GetImageSizeInBytes();
+  }
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public slots.
+public slots:
+  /**
+   */
+  void OnPhysicalCursorPositionChanged( const QPoint &,
+                                        const PointType &,
+                                        const PointType &,
+                                        const DefaultImageType::PixelType & );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void SettingsUpdated( AbstractImageModel* imageModel =NULL );
+
+  /**
+   */
+  void PropertiesUpdated( AbstractImageModel* imageModel =NULL );
+
+  /**   */
+  void ViewportRegionChanged(double, double);
+
+  /** */
+  void CurrentIndexUpdated( const IndexType&, bool isInside );
+  void CurrentIndexUpdated(const QString&);
+  void CurrentPhysicalUpdated(const QStringList&);
+  void CurrentGeographicUpdated(const QStringList&);
+  void CurrentRadioUpdated(const QString&);
+  void CurrentPixelValueUpdated(const VectorImageType::PixelType &,
+                                const QStringList& );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // AbstractModel methods.
+
+  void virtual_BuildModel( void* context =NULL ) ITK_OVERRIDE;
+
+  //
+  // AbstractImageModel methods.
+
+  void InitializeColorSetupSettings();
+
+  void InitializeColorDynamicsSettings();
+
+//
+// Protected attributes.
+protected:
+
+  /** */
+  SourceImageType::Pointer m_Image;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+  /**
+    * Helper method to get the best closest Jpeg2K level of detail.
+    */
+  static
+    unsigned int
+    Closest( double invZoomfactor,
+             unsigned int lodCount );
+
+  /**
+    * helper to setup the lod image using a width/height or a zoom factor
+    */
+  void SetupCurrentLodImage(int w, int h);
+
+  /**
+   */
+  void ApplySettings();
+
+  /**
+   */
+  void BuildGdalOverviews();
+
+  //
+  // AbstractLayerModel methods.
+
+  std::string virtual_GetWkt() const ITK_OVERRIDE;
+  bool virtual_HasKwl() const ITK_OVERRIDE;
+  void virtual_ToWgs84( const PointType &,
+				PointType &,
+				double & alt ) const ITK_OVERRIDE;
+
+  //
+  // AbstractImageModel methods.
+
+  void virtual_SetCurrentLod( CountType lod ) ITK_OVERRIDE;
+
+  void virtual_RefreshHistogram() ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  // Default image reader
+  DefaultImageFileReaderType::Pointer m_ImageFileReader;
+
+  /**
+   * User-configurable settings of image-model.
+   */
+  VectorImageSettings m_Settings;
+
+  /** List of all Level of detail (Resolution) available from the file */
+  CountType m_LodCount;
+
+  //  Generic RS Transform to get lat/long coordinates
+  otb::GenericRSTransform<>::Pointer m_ToWgs84;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /** */
+  void OnModelUpdated();
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+VectorImageModel::SourceImageType::ConstPointer
+VectorImageModel
+::ToImage() const
+{
+  // TODO: Fix unsafe weak-pointer dereferencing.
+  return otb::ConstCast< VectorImageModel::SourceImageType >( m_Image );
+}
+
+/*****************************************************************************/
+inline
+const VectorImageModel::SourceImageType::Pointer&
+VectorImageModel
+::ToImage()
+{
+  return m_Image;
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageModel
+::SetSettings( const VectorImageSettings & settings )
+{
+  m_Settings = settings;
+}
+
+/*****************************************************************************/
+inline
+const VectorImageSettings &
+VectorImageModel
+::GetSettings() const
+{
+  return m_Settings;
+}
+
+/*****************************************************************************/
+inline
+VectorImageSettings &
+VectorImageModel
+::GetSettings()
+{
+  return m_Settings;
+}
+
+/*****************************************************************************/
+inline
+const otb::GenericRSTransform<> *
+VectorImageModel
+::GetGenericRSTransform() const
+{
+  return m_ToWgs84;
+}
+
+/*****************************************************************************/
+
+} // end namespace 'mvd'
+
+#endif // mvdVectorImageModel_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h b/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h
new file mode 100644
index 0000000..8532f8a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdVectorImageSettings.h
@@ -0,0 +1,663 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdVectorImageSettings_h
+#define mvdVectorImageSettings_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdCore.h"
+#include "mvdImageSettings.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class VectorImageSettings
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT VectorImageSettings :
+    public ImageSettings
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+//
+// Public types and attributes.
+public:
+  /**
+   */
+  typedef UIntVector ChannelVector;
+
+//
+// Public methods.
+public:
+  /**
+   * \brief Constructor.
+   */
+  VectorImageSettings();
+
+  /**
+   * \brief Copy constructor.
+   *
+   * \param other
+   *
+   * Copy settings POD content without the modified flag.
+   */
+  VectorImageSettings( const VectorImageSettings & other );
+
+  /**
+   * \brief Destructor.
+   */
+  ~VectorImageSettings() ITK_OVERRIDE;
+
+  /**
+   * \brief Assignment operator.
+   *
+   * \param other
+   */
+#if 0
+  VectorImageSettings & operator = ( const VectorImageSettings & other );
+#endif
+
+  //
+  // COLOR COMPOSITION.
+  //
+
+  /**
+   */
+  inline void SetRgbChannels( const ChannelVector& rgb );
+
+  /**
+   */
+  inline const ChannelVector& GetRgbChannels() const;
+
+  /**
+   */
+  inline
+    void SetRgbChannel( ChannelVector::size_type i,
+			const ChannelVector::value_type& channel );
+
+  /**
+   */
+  inline
+    const ChannelVector::value_type&
+    GetRgbChannel( ChannelVector::size_type i ) const;
+
+  /**
+   * \return the band-index for the given component taking the
+   * grayscale-mode activation state flag into account.
+   */
+  inline
+    ChannelVector::value_type
+    GetSmartChannel( RgbwChannel channel ) const;
+
+  /**
+   * \return the band-index for the given component not taking the
+   * grayscale-mode activation state flag into account.
+   */
+  ChannelVector::value_type GetRgbwChannel( RgbwChannel channel ) const;
+
+  /**
+   * \return the channels band-index vector taking the
+   * grayscale-mode activation state flag into account.
+   */
+  inline void GetSmartChannels( ChannelVector& channels ) const;
+
+  //
+  // COLOR DYNAMICS.
+  //
+
+  /**
+   */
+  inline void SetRgbDynamicsParams( const ParametersType& params );
+
+  /**
+   */
+  inline const ParametersType& GetRgbDynamicsParams() const;
+
+  /**
+   */
+  inline ParametersType GetSmartDynamicsParams() const;
+
+  /**
+   * Set low-intensity dynamics parameter for given channel. If
+   * channel is RGBW_CHANNEL_WHITE, this method sets all RGB
+   * channels.
+   *
+   * \param channel The RGB/W channel to set low-intensity dynamics for.
+   * \param intensity low-intensity value.
+   */
+  void SetLowIntensity( RgbwChannel channel,
+                        ParametersType::ValueType intensity );
+
+  /**
+   */
+  ParametersType::ValueType GetLowIntensity( RgbwChannel channel ) const;
+
+  /**
+   * Set high-intensity dynamics parameter for given channel. If
+   * channel is RGBW_CHANNEL_WHITE, this method sets all RGB
+   * channels.
+   *
+   * \param channel The RGB/W channel to set high-intensity dynamics for.
+   * \param intensity high-intensity value.
+   */
+  void SetHighIntensity( RgbwChannel channel,
+                         ParametersType::ValueType intensity );
+
+  /**
+   */
+  ParametersType::ValueType GetHighIntensity( RgbwChannel channel ) const;
+
+  //
+  // GRAYSCALE MODE.
+  //
+
+  /**
+   * \brief Set/clear grayscale-mode activation-state flag for image.
+   */
+  inline void SetGrayscaleActivated( bool activated );
+
+  /**
+   * \return Grayscale-mode activation state flag.
+   */
+  inline bool IsGrayscaleActivated() const;
+
+  /**
+   * \brief Set white (gray) channel index.
+   *
+   * \param index The new index of white (gray) channel.
+   */
+  inline void SetGrayChannel( unsigned int );
+
+  /**
+   * \return White (gray) channel index.
+   */
+  inline unsigned int GetGrayChannel() const;
+
+  /**
+   */
+  inline void SetGrayDynamicsParams( const ParametersType& params );
+
+  /**
+   */
+  inline const ParametersType& GetGrayDynamicsParams() const;
+
+  /**
+   */
+  inline void SetGamma( double gamma );
+
+  /**
+   */
+  inline double GetGamma() const;
+
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  inline
+    const ParametersType::ValueType& GetRgbDynamicsParam( CountType i ) const;
+
+  /**
+   */
+  inline
+    void SetRgbDynamicsParam( CountType i,
+			      const ParametersType::ValueType& param );
+
+  /**
+   */
+  inline
+    const ParametersType::ValueType& GetGrayDynamicsParam( bool high ) const;
+
+  /**
+   */
+  inline
+    void SetGrayDynamicsParam( bool high,
+			       const ParametersType::ValueType& param );
+
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief Color-composition setup (file-component to video
+   * RGB-components).
+   */
+  ChannelVector m_RgbChannels;
+
+  /**
+   * \brief Color-dynamics parameters (\sa
+   * HistogramModel::Quantile()).
+   */
+  ParametersType m_RgbDynamicsParams;
+
+  /**
+   * \brief Grayscale-mode activation state.
+   */
+  bool m_IsGrayscaleActivated;
+
+  /**
+   * \brief Grayscale-mode band-index.
+   */
+  ChannelVector::value_type m_GrayChannel;
+
+  /**
+   * \brief Color-dynamics parameters (\sa
+   * HistogramModel::Quantile()).
+   */
+  ParametersType m_GrayDynamicsParams;
+
+  /**
+   */
+  double m_Gamma;
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+#if 0
+
+inline
+VectorImageSettings &
+VectorImageSettings
+::operator = ( const VectorImageSettings & other )
+{
+  if( &other==this )
+    return *this;
+
+  m_RgbChannels = other.m_RgbChannels;
+  m_RgbDynamicsParams = other.m_RgbDynamicsParams;
+  m_IsGrayscaleActivated = other.m_IsGrayscaleActivated;
+  m_GrayChannel = other.m_GrayChannel;
+  m_GrayDynamicsParams = other.m_GrayDynamicsParams;
+  m_Gamma = other.m_Gamma;
+
+  return *this;
+}
+
+#endif
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetRgbChannels( const ChannelVector& rgb )
+{
+  // qDebug() << "setRgbChannels()";
+
+  assert( m_RgbChannels.empty() || m_RgbChannels.size()==rgb.size() );
+
+  if( !m_RgbChannels.empty() &&
+      std::equal( m_RgbChannels.begin(), m_RgbChannels.end(), rgb.begin() ) )
+    return;
+
+  m_RgbChannels = rgb;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+const VectorImageSettings::ChannelVector&
+VectorImageSettings
+::GetRgbChannels() const
+{
+  return m_RgbChannels;
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::GetSmartChannels( VectorImageSettings::ChannelVector& channels ) const
+{
+  if( IsGrayscaleActivated() )
+    {
+    channels.resize( m_RgbChannels.size() );
+    std::fill( channels.begin(), channels.end(), m_GrayChannel );
+    }
+  else
+    {
+    channels = m_RgbChannels;
+    }
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetRgbChannel( ChannelVector::size_type i,
+		 const ChannelVector::value_type& channel )
+{
+  // qDebug() << "SetRgbChannel()";
+
+  if( m_RgbChannels[ i ]==channel )
+    return;
+
+  SetModified();
+
+  m_RgbChannels[ i ] = channel;
+}
+
+/*****************************************************************************/
+inline
+const VectorImageSettings::ChannelVector::value_type&
+VectorImageSettings
+::GetRgbChannel( ChannelVector::size_type i ) const
+{
+  return m_RgbChannels[ i ];
+}
+
+/*****************************************************************************/
+inline
+VectorImageSettings::ChannelVector::value_type
+VectorImageSettings
+::GetSmartChannel( RgbwChannel channel ) const
+{
+  return GetRgbwChannel(
+    m_IsGrayscaleActivated
+    ? RGBW_CHANNEL_WHITE
+    : channel
+  );
+
+  /*
+  if( m_IsGrayscaleActivated )
+    {
+    return m_GrayChannel;
+    }
+  else
+    {
+    return GetRgbwChannel( channel );
+    }
+  */
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetRgbDynamicsParams( const ParametersType& params )
+{
+  // qDebug() << "SetDynamicsParams()";
+
+  assert( m_RgbDynamicsParams.size()==params.size() );
+
+  if( std::equal( m_RgbDynamicsParams.begin(),
+		  m_RgbDynamicsParams.end(),
+		  params.begin() ) )
+    return;
+
+  m_RgbDynamicsParams = params;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+const ParametersType&
+VectorImageSettings
+::GetRgbDynamicsParams() const
+{
+  return m_RgbDynamicsParams;
+}
+
+/*****************************************************************************/
+inline
+ParametersType
+VectorImageSettings
+::GetSmartDynamicsParams() const
+{
+  return m_IsGrayscaleActivated ? m_GrayDynamicsParams : m_RgbDynamicsParams;
+}
+
+/*****************************************************************************/
+inline
+const ParametersType::ValueType&
+VectorImageSettings
+::GetRgbDynamicsParam( CountType i ) const
+{
+  return m_RgbDynamicsParams[ i ];
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetRgbDynamicsParam( CountType i,
+		       const ParametersType::ValueType& param )
+{
+  // qDebug() << "SetDynamicsParam()";
+
+  if( m_RgbDynamicsParams[ i ]==param )
+    return;
+
+  SetModified();
+
+  m_RgbDynamicsParams[ i ] = param;
+}
+
+/*****************************************************************************/
+inline
+bool
+VectorImageSettings
+::IsGrayscaleActivated() const
+{
+  return m_IsGrayscaleActivated;
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetGrayscaleActivated( bool activated )
+{
+  m_IsGrayscaleActivated = activated;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+unsigned int
+VectorImageSettings
+::GetGrayChannel() const
+{
+  return m_GrayChannel;
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetGrayChannel( unsigned int index )
+{
+  m_GrayChannel = index;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetGrayDynamicsParams( const ParametersType& params )
+{
+  // qDebug() << "SetDynamicsParams()";
+
+  assert( m_GrayDynamicsParams.size()==params.size() );
+
+  if( std::equal( m_GrayDynamicsParams.begin(),
+		  m_GrayDynamicsParams.end(),
+		  params.begin() ) )
+    {
+    assert( false );
+
+    return;
+    }
+
+  m_GrayDynamicsParams = params;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+const ParametersType&
+VectorImageSettings
+::GetGrayDynamicsParams() const
+{
+  return m_GrayDynamicsParams;
+}
+
+/*****************************************************************************/
+inline
+const ParametersType::ValueType&
+VectorImageSettings
+::GetGrayDynamicsParam( bool high ) const
+{
+  return m_GrayDynamicsParams[ high ? 1 : 0 ];
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetGrayDynamicsParam( bool high,
+			const ParametersType::ValueType& param )
+{
+  // qDebug() << "SetDynamicsParam()";
+
+  CountType ofs = high ? 1 : 0;
+
+  if( m_GrayDynamicsParams[ 0 * 2 + ofs ]==param )
+    return;
+
+  SetModified();
+
+  // Indices are detailed for better readability since the compiler
+  // will optimize constants.
+  m_GrayDynamicsParams[ 0 * 2 + ofs ] = param;
+  m_GrayDynamicsParams[ 1 * 2 + ofs ] = param;
+  m_GrayDynamicsParams[ 2 * 2 + ofs ] = param;
+}
+
+/*****************************************************************************/
+inline
+void
+VectorImageSettings
+::SetGamma( double value )
+{
+  m_Gamma = value;
+
+  SetModified();
+}
+
+/*****************************************************************************/
+inline
+double
+VectorImageSettings
+::GetGamma() const
+{
+  return m_Gamma;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdVectorImageSettings_h
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdVisibleInterface.h b/Modules/Visualization/MonteverdiCore/include/mvdVisibleInterface.h
new file mode 100644
index 0000000..40f0077
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/include/mvdVisibleInterface.h
@@ -0,0 +1,169 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdVisibleInterface_h
+#define mvdVisibleInterface_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiCoreExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class VisibleInterface
+ *
+ * \ingroup OTBMonteverdiCore
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiCore_EXPORT VisibleInterface
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  VisibleInterface( bool =true );
+
+  /** \brief Destructor. */
+  virtual ~VisibleInterface();
+
+  /**
+   */
+  inline void SetVisible( bool );
+
+  /**
+   */
+  inline bool IsVisible() const;
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  virtual void virtual_SignalVisibilityChanged( bool );
+
+//
+// Private attributes.
+private:
+  bool m_IsVisible: 1;
+};
+
+} // end namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+bool
+VisibleInterface
+::IsVisible() const
+{
+  return m_IsVisible;
+}
+
+/*****************************************************************************/
+inline
+void
+VisibleInterface
+::SetVisible( bool state )
+{
+  m_IsVisible = state;
+
+  virtual_SignalVisibilityChanged( state );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdVisibleInterface_h
diff --git a/Modules/Visualization/MonteverdiCore/otb-module.cmake b/Modules/Visualization/MonteverdiCore/otb-module.cmake
new file mode 100644
index 0000000..e18fe5d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/otb-module.cmake
@@ -0,0 +1,28 @@
+set(DOCUMENTATION
+  "This module provides MonteverdiCore, the core library of the Monteverdi applications."
+  )
+
+otb_module( OTBMonteverdiCore
+  ENABLE_SHARED
+  DEPENDS
+    OTBBoost
+    OTBCarto
+    OTBCommon
+    OTBImageBase
+    OTBImageIO
+    OTBImageManipulation
+    OTBIOGDAL
+    OTBMetadata
+    OTBObjectList
+    OTBOSSIMAdapters
+    OTBProjection
+    OTBQt4
+    OTBStatistics
+    OTBTransform
+
+  OPTIONAL_DEPENDS
+    OTBApplicationEngine
+
+  DESCRIPTION
+  "${DOCUMENTATION}"
+  )
diff --git a/Modules/Visualization/MonteverdiCore/src/CMakeLists.txt b/Modules/Visualization/MonteverdiCore/src/CMakeLists.txt
new file mode 100644
index 0000000..f8e3075
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/CMakeLists.txt
@@ -0,0 +1,100 @@
+#############################################################################
+set( OTBMonteverdiCore_SRCS
+  mvdAbstractWorker.cxx
+  mvdAbstractModel.cxx
+  mvdAbstractImageModel.cxx
+  mvdAbstractLayerModel.cxx
+  mvdBackgroundTask.cxx
+  mvdCore.cxx
+  mvdDataStream.cxx
+  mvdFilenameInterface.cxx
+  mvdHistogramModel.cxx
+  mvdI18nCoreApplication.cxx
+  mvdImageImporter.cxx
+  mvdImagePlacenameLoader.cxx
+  mvdImageProperties.cxx
+  mvdImageSettings.cxx
+  mvdImageSettingsInterface.cxx
+  mvdModifiableInterface.cxx
+  mvdMyClass.cxx
+  mvdOverviewBuilder.cxx
+  mvdProcessObjectObserver.cxx
+  mvdProgressInterface.cxx
+  mvdQuicklookModel.cxx
+  mvdSerializableInterface.cxx
+  mvdStackedLayerModel.cxx
+  mvdTextStream.cxx
+  mvdTypes.cxx
+  mvdVectorImageModel.cxx
+  mvdVectorImageSettings.cxx
+  mvdVisibleInterface.cxx
+  )
+
+set( OTBMonteverdiCore_HEADERS_MOC
+  ../include/mvdAbstractImageModel.h
+  ../include/mvdAbstractLayerModel.h
+  ../include/mvdAbstractModel.h
+  ../include/mvdAbstractWorker.h
+  # ../include/mvdAlgorithm.h
+  ../include/mvdBackgroundTask.h
+  # ../include/mvdCore.h
+  # ../include/mvdDatabaseConnection.h
+  # ../include/mvdDatabaseError.h
+  # ../include/mvdDatabaseModel.h
+  # ../include/mvdDatabaseQueries.h
+  # ../include/mvdDatasetDescriptor.h
+  # ../include/mvdDatasetModel.h
+  ../include/mvdHistogramModel.h
+  ../include/mvdI18nCoreApplication.h
+  ../include/mvdImageImporter.h
+  ../include/mvdImagePlacenameLoader.h
+  # ../include/mvdImageProperties.h
+  # ../include/mvdMath.h
+  ../include/mvdMyClass.h
+  ../include/mvdOverviewBuilder.h
+  ../include/mvdQuicklookModel.h
+  ../include/mvdStackedLayerModel.h
+  # ../include/mvdSystemError.h
+  # ../include/mvdTypes.h
+  ../include/mvdVectorImageModel.h
+)
+
+#############################################################################
+if( OTBApplicationEngine_ENABLED )
+  list( APPEND OTBMonteverdiCore_SRCS
+    mvdApplicationsBrowser.cxx
+  )
+  list( APPEND OTBMonteverdiCore_HEADERS_MOC
+    ../include/mvdApplicationsBrowser.h
+  )
+endif()
+
+#############################################################################
+add_to_qt4_i18n_sources( ${OTBMonteverdiCore_SRCS} )
+add_to_qt4_i18n_headers( "../include" ${OTBMonteverdiCore_SRCS} )
+
+#############################################################################
+qt4_wrap_cpp( OTBMonteverdiCore_SRC_MOC ${OTBMonteverdiCore_HEADERS_MOC} )
+
+add_library( OTBMonteverdiCore ${OTBMonteverdiCore_SRCS} ${OTBMonteverdiCore_SRC_MOC})
+
+#############################################################################
+target_link_libraries( OTBMonteverdiCore
+  ${OTBApplicationEngine_LIBRARIES}
+  ${OTBCarto_LIBRARIES}
+  ${OTBCommon_LIBRARIES}
+  ${OTBImageBase_LIBRARIES}
+  ${OTBImageIO_LIBRARIES}
+  ${OTBImageManipulation_LIBRARIES}
+  ${OTBIOGDAL_LIBRARIES}
+  ${OTBMetadata_LIBRARIES}
+  ${OTBObjectList_LIBRARIES}
+  ${OTBOSSIMAdapters_LIBRARIES}
+  ${OTBProjection_LIBRARIES}
+  ${OTBQt4_LIBRARIES}
+  ${OTBStatistics_LIBRARIES}
+  ${OTBTransform_LIBRARIES}
+  )
+
+#############################################################################
+otb_module_target( OTBMonteverdiCore )
diff --git a/Modules/Visualization/MonteverdiCore/src/ConfigureMonteverdi.h.in b/Modules/Visualization/MonteverdiCore/src/ConfigureMonteverdi.h.in
new file mode 100644
index 0000000..bd2de71
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/ConfigureMonteverdi.h.in
@@ -0,0 +1,138 @@
+#ifndef ConfigureMonteverdi_h
+#define ConfigureMonteverdi_h
+
+//
+// Monteverdi project
+#define PROJECT_NAME "@Monteverdi_PROJECT_NAME@"
+
+//
+// Monteverdi version.
+#define Monteverdi_VERSION_MAJOR @Monteverdi_VERSION_MAJOR@
+#define Monteverdi_VERSION_MINOR @Monteverdi_VERSION_MINOR@
+#define Monteverdi_VERSION_PATCH @Monteverdi_VERSION_PATCH@
+#define Monteverdi_VERSION_SUFFIX @Monteverdi_VERSION_SUFFIX@
+
+#define Monteverdi_VERSION_STRING "@Monteverdi_VERSION_STRING@"
+
+//
+// Monteverdi data version.
+#define Monteverdi_DATA_VERSION_MAJOR @Monteverdi_DATA_VERSION_MAJOR@
+#define Monteverdi_DATA_VERSION_MINOR @Monteverdi_DATA_VERSION_MINOR@
+#define Monteverdi_DATA_VERSION_PATCH @Monteverdi_DATA_VERSION_PATCH@
+
+#define Monteverdi_DATA_VERSION_STRING "@Monteverdi_DATA_VERSION_STRING@"
+
+//
+// Monteverdi data version.
+#define Monteverdi_UI_VERSION @Monteverdi_UI_VERSION@
+
+//
+// Directories
+#define Monteverdi_INSTALL_BIN_DIR "@OTB_INSTALL_BIN_DIR@"
+#define Monteverdi_INSTALL_INCLUDE_DIR "@OTB_INSTALL_INCLUDE_DIR@"
+#define Monteverdi_INSTALL_LIB_DIR "@OTB_INSTALL_LIB_DIR@"
+#define Monteverdi_INSTALL_DATA_DIR "@OTB_INSTALL_DATA_DIR@"
+
+//
+#define OTB_VERSION_CHECK( M, m, p )					\
+  (OTB_VERSION_MAJOR>(M) ||						\
+   (OTB_VERSION_MAJOR==(M) && (OTB_VERSION_MINOR>(m) ||			\
+			       OTB_VERSION_MINOR==(m) && OTB_VERSION_PATH>=(p))))
+
+//
+// Sub-directories
+#define Monteverdi_INSTALL_DATA_I18N_DIR Monteverdi_INSTALL_DATA_DIR "/i18n"
+
+//
+// Files
+#define Monteverdi_CONFIGURE_FILE "@Monteverdi_CONFIGURE_FILE@"
+#define Monteverdi_BUILD_DIR_FILE "CMakeCache.txt"
+
+//
+// Miscellaneous
+#define Monteverdi_FLOATING_TYPE @Monteverdi_FLOATING_TYPE@
+#define Monteverdi_DIMENSION int( 2 )
+
+//
+// Qt Message handling and logging.
+#ifndef NO_QECHO
+#define NO_QECHO        0
+#endif
+
+#ifndef NO_QDEBUG
+#define NO_QDEBUG       0
+#endif
+
+#ifndef NO_QWARNING
+#define NO_QWARNING     0
+#endif
+
+#ifndef NO_QCRITICAL
+#define NO_QCRITICAL    0
+#endif
+
+#ifndef NO_QFATAL
+#define NO_QFATAL       0
+#endif
+
+#ifndef NO_QLOG
+#define NO_QLOG         0
+#endif
+
+#ifndef NO_QTHROW
+#define NO_QTHROW       0
+#endif
+
+#ifndef ECHO_QDEBUG
+#define ECHO_QDEBUG     ( ( !NO_QECHO && !NO_QDEBUG && defined( OTB_DEBUG ) && 1 ) || 0 )
+#endif
+
+#ifndef ECHO_QWARNING
+#define ECHO_QWARNING   ( !NO_QECHO && !NO_QWARNING && 1 )
+#endif
+
+#ifndef ECHO_QCRITICAL
+#define ECHO_QCRITICAL  ( !NO_QECHO && !NO_QCRITICAL && 1 )
+#endif
+
+#ifndef ECHO_QFATAL
+#define ECHO_QFATAL     ( !NO_QECHO && !NO_QFATAL && 1 )
+#endif
+
+#ifndef LOG_QDEBUG
+#define LOG_QDEBUG      ( !NO_QLOG && !NO_QDEBUG && defined( OTB_DEBUG ) && 0 )
+#endif
+
+#ifndef LOG_QWARNING
+#define LOG_QWARNING    ( !NO_QLOG && !NO_QWARNING && 0 )
+#endif
+
+#ifndef LOG_QCRITICAL
+#define LOG_QCRITICAL   ( !NO_QLOG && !NO_QCRITICAL && 0 )
+#endif
+
+#ifndef LOG_QFATAL
+#define LOG_QFATAL      ( !NO_QLOG && !NO_QFATAL && 0 )
+#endif
+
+#ifndef THROW_QCRITICAL
+#define THROW_QCRITICAL ( !NO_QTHROW && !NO_QCRITICAL && 1 )
+#endif
+
+#ifndef THROW_QFATAL
+#define THROW_QFATAL    ( !NO_QTHROW && !NO_QFATAL && 1 )
+#endif
+
+#include "otbConfigure.h"
+#include "otbMacro.h"
+
+//
+// Options
+
+// #if (defined( OTB_DEBUG ) && FORCE_DISABLE) || FORCE_ENABLE
+#define USE_OPTION_SAMPLE ((defined( OTB_DEBUG )  && 0) || 0)
+
+//
+// Macros
+
+#endif // ConfigureMonteverdi_h
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdAbstractImageModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdAbstractImageModel.cxx
new file mode 100644
index 0000000..a89c36d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdAbstractImageModel.cxx
@@ -0,0 +1,312 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAbstractImageModel.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdQuicklookModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::AbstractImageModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+
+/**
+ * \brief Array of enhanced band names that OTB can return.
+ *
+ * It is defined (statically) as a constant for translation purposes.
+ */
+char const * const
+ENHANCED_BAND_NAMES[ 10 ] = {
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "Red" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "Green" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "Blue" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "Yellow" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "RedEdge" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "Coastal" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "NIR" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "NIR1" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "NIR2" ),
+  QT_TRANSLATE_NOOP( "mvd::AbstractImageModel", "PAN" ),
+};
+
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+namespace hidden
+{
+
+// Do never call this private hidden function.
+void fix_unused_variable_warning()
+{
+  // This variable is used to declare OTB band names to the Qt I18N
+  // translation process.
+  //
+  // The translated string are used by side effect to the
+  // QObject::translate() function which searches the translated
+  // strings from the .qm files loaded at runtime.
+  (void)ENHANCED_BAND_NAMES;
+}
+
+};
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+AbstractImageModel
+::AbstractImageModel( QObject* p ) :
+  AbstractLayerModel( p ),
+  m_NativeLargestRegion(),
+  m_Id( -1 ),
+  m_CurrentLod( 0 ),
+  m_Properties( NULL )
+{
+}
+
+/*******************************************************************************/
+AbstractImageModel
+::~AbstractImageModel()
+{
+  SetProperties( NULL );
+}
+
+/*****************************************************************************/
+const QuicklookModel*
+AbstractImageModel
+::GetQuicklookModel() const
+{
+  return findChild< const QuicklookModel* >();
+}
+
+/*****************************************************************************/
+QuicklookModel*
+AbstractImageModel
+::GetQuicklookModel()
+{
+  return findChild< QuicklookModel* >();
+}
+
+/*******************************************************************************/
+QStringList
+AbstractImageModel
+::GetBandNames( bool enhanced ) const
+{
+  ImageBaseType::ConstPointer output( ToImageBase() );
+
+  otb::ImageMetadataInterfaceBase::ConstPointer metaDataInterface(
+    GetMetaDataInterface()
+    );
+
+  //
+  // Basic band names.
+  StringVector stdBandNames1( metaDataInterface->GetBandName() );
+
+  // output band name list
+  QStringList qBandNames1( QString("") );
+
+  //
+  // PS: need to handle images with extracted channels and a geom file
+  // storing the original image band names.
+  if (stdBandNames1.empty() ||
+      stdBandNames1.size()!=output->GetNumberOfComponentsPerPixel())
+    {
+    // output stringVector
+    StringVector outputBandNames;
+
+    //
+    // Fill the output std::vector with default values
+    for( unsigned int count = 0;
+         count < output->GetNumberOfComponentsPerPixel(); 
+         count++)
+      {
+      std::ostringstream oss;
+      oss <<ToStdString( tr("BAND ") )<< count;
+      outputBandNames.push_back(oss.str());
+      }
+
+    // set the output QStringList
+    qBandNames1 = ToQStringList( outputBandNames );
+    }
+  else
+    {
+    // useless
+    assert( !stdBandNames1.empty() ||
+            stdBandNames1.size()==output->GetNumberOfComponentsPerPixel() );
+
+    if( stdBandNames1.size()!=output->GetNumberOfComponentsPerPixel() )
+      {
+      stdBandNames1.resize( output->GetNumberOfComponentsPerPixel() );
+      }
+
+    //
+    // Enhanced band names.
+    StringVector stdBandNames2;
+    if( enhanced )
+      {
+      try
+        {
+        stdBandNames2 = metaDataInterface->GetEnhancedBandNames();
+        }
+      catch( std::exception& exc )
+        {
+	qWarning() << exc.what();
+	}
+      }
+
+    assert( stdBandNames2.empty() ||
+            stdBandNames2.size()==output->GetNumberOfComponentsPerPixel() );
+
+    if( stdBandNames2.size()!=output->GetNumberOfComponentsPerPixel() )
+      {
+      stdBandNames2.resize( output->GetNumberOfComponentsPerPixel() );
+      }
+
+    //
+    // Join basic and enhanced band-name lists.
+    assert( stdBandNames1.size()==stdBandNames2.size() );
+
+    qBandNames1 =  ToQStringList( stdBandNames1 );
+    QStringList qBandNames2( ToQStringList( stdBandNames2 ) );
+
+    assert( qApp!=NULL );
+
+    QStringList::iterator it1( qBandNames1.begin() );
+    QStringList::const_iterator it2( qBandNames2.begin() );
+
+    for( ; it1!=qBandNames1.end(); ++it1, ++it2 )
+      {
+      if( !it2->isEmpty() )
+        it1->append(
+	  " (" +
+	  qApp->translate(
+	    "mvd::AbstractImageModel",
+	    it2->toAscii().constData()
+	  )
+	  + ")"
+	);
+      }
+    }
+
+  //
+  // Return joined band-name list.
+  return qBandNames1;
+}
+
+/*******************************************************************************/
+void
+AbstractImageModel
+::RefreshHistogram( void* const context )
+{
+  // qDebug() << this << "::RefreshHistogram(" << context << ")";
+
+  // Remember existing child histogram.
+  HistogramModel* currentHistogramModel = GetHistogramModel();
+
+#if 0
+  // Access histogram-model build-context.
+  HistogramModel::BuildContext* const buildContext =
+    static_cast< HistogramModel::BuildContext* const >( context );
+
+  // Force writing histgram file by setting IsBeingStored flag.
+  buildContext->m_IsBeingStored = true;
+#endif
+
+  // Create new child histogram providing build-context.
+  newChildModel< HistogramModel >( context );
+
+  // Delete (and remove) previous child histogram.
+  delete currentHistogramModel;
+  currentHistogramModel = NULL;
+}
+
+/*******************************************************************************/
+void
+AbstractImageModel
+::virtual_BuildModel( void* context )
+{
+  //
+  // Retrieve proper build-context.
+  assert( context!=NULL );
+  BuildContext* buildContext = static_cast< BuildContext* >( context );
+
+  //
+  // ID.
+  m_Id = buildContext->m_Id;
+
+  //
+  // QUICKLOOK.
+  //
+  // Build quicklook before histogram because histogram calculation is
+  // based on quicklook image.
+  newChildModel< QuicklookModel >( context );
+
+  //
+  // HISTOGRAM.
+  if( buildContext->m_Histogram.isEmpty() )
+    newChildModel< HistogramModel >();
+
+  else
+    {
+    HistogramModel::BuildContext histogramContext(
+      buildContext->IsBeingStored(),
+      buildContext->m_Histogram
+    );
+
+    newChildModel< HistogramModel >( &histogramContext );
+    }
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdAbstractLayerModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdAbstractLayerModel.cxx
new file mode 100644
index 0000000..55fbc38
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdAbstractLayerModel.cxx
@@ -0,0 +1,211 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAbstractLayerModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include "ogr_spatialref.h"
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdTypes.h"
+
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::AbstractLayerModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+char const * const STR_SENSOR = QT_TRANSLATE_NOOP( "mvd::AbstractLayerModel", "Sensor" );
+char const * const STR_UNKNOWN = QT_TRANSLATE_NOOP( "mvd::AbstractLayerModel", "Unknown" );
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+SpatialReferenceType
+GetSpatialReferenceType( const std::string & filename )
+{
+  DefaultImageFileReaderType::Pointer reader( DefaultImageFileReaderType::New() );
+  assert( !reader.IsNull() );
+
+  reader->SetFileName( filename );
+  reader->UpdateOutputInformation();
+
+  DefaultImageType * image = reader->GetOutput();
+  assert( image!=NULL );
+
+  return GetSpatialReferenceType(
+    image->GetProjectionRef(),
+    image->GetImageKeywordlist().GetSize()>0
+  );
+}
+
+/*****************************************************************************/
+SpatialReferenceType
+GetSpatialReferenceType( const std::string & wkt, bool hasKwl )
+{
+  if( wkt.empty() )
+    return
+      hasKwl
+      ? SRT_SENSOR
+      : SRT_UNKNOWN;
+
+  OGRSpatialReference ogr_sr( wkt.c_str() );
+
+  const char * epsg = ogr_sr.GetAuthorityCode( "PROJCS" );
+
+  if( epsg!=NULL && strcmp( epsg, "" )!=0 )
+    return SRT_CARTO;
+
+  epsg = ogr_sr.GetAuthorityCode( "GEOGCS" );
+
+  if( epsg!=NULL && strcmp( epsg, "" )!=0 )
+    return SRT_GEO;
+
+  return SRT_UNKNOWN;
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+AbstractLayerModel
+::AbstractLayerModel( QObject* p ) :
+  AbstractModel( p ),
+  VisibleInterface()
+{
+}
+
+/*******************************************************************************/
+AbstractLayerModel
+::~AbstractLayerModel()
+{
+}
+
+/*******************************************************************************/
+SpatialReferenceType
+AbstractLayerModel
+::GetSpatialReferenceType() const
+{
+  return mvd::GetSpatialReferenceType( GetWkt(), HasKwl() );
+}
+
+/*******************************************************************************/
+std::string
+AbstractLayerModel
+::GetWkt() const
+{
+  return virtual_GetWkt();
+}
+
+/*******************************************************************************/
+std::string
+AbstractLayerModel
+::GetAuthorityCode( bool isEnhanced ) const
+{
+  std::string wkt( GetWkt() );
+
+  if( wkt.empty() )
+    return
+      !isEnhanced
+      ? std::string()
+      : ( HasKwl()
+	  ? ToStdString( tr( STR_SENSOR ) )
+	  : ToStdString( tr( STR_UNKNOWN ) ) );
+
+  OGRSpatialReference ogr_sr( wkt.c_str() );
+
+  const char * epsg = ogr_sr.GetAuthorityCode( "PROJCS" );
+
+  if( epsg!=NULL && strcmp( epsg, "" )!=0 )
+    return epsg;
+
+  epsg = ogr_sr.GetAuthorityCode( "GEOGCS" );
+
+  if( epsg==NULL || strcmp( epsg, "" )==0 )
+    return ToStdString( tr( STR_UNKNOWN ) );
+
+  return epsg;
+}
+
+/*******************************************************************************/
+bool
+AbstractLayerModel
+::HasKwl() const
+{
+  return virtual_HasKwl();
+}
+
+/*****************************************************************************/
+void
+AbstractLayerModel
+::ToWgs84( const PointType & p, PointType & wgs84, double & alt) const
+{
+  virtual_ToWgs84( p, wgs84, alt );
+}
+
+/*******************************************************************************/
+bool
+AbstractLayerModel
+::virtual_HasKwl() const
+{
+  return false;
+}
+
+/*******************************************************************************/
+void
+AbstractLayerModel
+::virtual_SignalVisibilityChanged( bool isVisible )
+{
+  emit VisibilityChanged( isVisible );
+  emit VisibilityChanged( this, isVisible );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdAbstractModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdAbstractModel.cxx
new file mode 100644
index 0000000..4640523
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdAbstractModel.cxx
@@ -0,0 +1,106 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAbstractModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::AbstractModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+AbstractModel
+::AbstractModel( QObject* p ) :
+  QObject( p )
+{
+}
+
+/*******************************************************************************/
+AbstractModel
+::~AbstractModel()
+{
+}
+
+/*******************************************************************************/
+bool
+AbstractModel
+::IsModified() const
+{
+  return false;
+}
+
+/*******************************************************************************/
+void
+AbstractModel
+::ClearModified()
+{
+}
+
+/*******************************************************************************/
+void
+AbstractModel
+::virtual_Save()
+{
+  qDebug() << this << "::Save()";
+}
+
+/*******************************************************************************/
+void
+AbstractModel
+::virtual_BuildModel( void * model )
+{
+  qDebug() << this << "::virtual_BuildModel(" << model << ")";
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdAbstractWorker.cxx b/Modules/Visualization/MonteverdiCore/src/mvdAbstractWorker.cxx
new file mode 100644
index 0000000..b018201
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdAbstractWorker.cxx
@@ -0,0 +1,128 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAbstractWorker.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdI18nCoreApplication.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::AbstractWorker
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+AbstractWorker
+::AbstractWorker( QObject* p ) :
+  QObject( p )
+{
+}
+
+/*******************************************************************************/
+AbstractWorker
+::~AbstractWorker()
+{
+}
+
+/*****************************************************************************/
+void
+AbstractWorker
+::Do() throw()
+{
+  QObject* result = NULL;
+
+  try
+    {
+    // Just do it and get resulting QObject.
+    result = virtual_Do();
+
+    // Access application.
+    const QCoreApplication* app = QCoreApplication::instance();
+    assert( app!=NULL );
+
+    // Move object into application's main thread.
+    //
+    // We can only push to another thread,
+    // so thread affinity must be set here,
+    // and not in the slot that receives the object.
+    if( result!=NULL &&
+	result->thread()!=app->thread() )
+      result->moveToThread( app->thread() );
+
+    // Emit task/job has correctly been done giving resulting object
+    // to main thread.
+    emit Done( result );
+    }
+  catch( std::exception& exc )
+    {
+    // Delete allocated object.
+    delete result;
+    result = NULL;
+
+    // Emit task/job has incorrectly been done giving clone of
+    // exception to main thread.
+    emit ExceptionRaised( FromStdString( exc.what() ) );
+    }
+
+  // Emit task/job has finished (thread can be signal to quit()).
+  emit Finished();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx b/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx
new file mode 100644
index 0000000..8b27ea3
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx
@@ -0,0 +1,224 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdApplicationsBrowser.h"
+
+#include "mvdAlgorithm.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbWrapperApplicationRegistry.h"
+#include "otbWrapperApplication.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ApplicationsBrowser
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ApplicationsBrowser
+::ApplicationsBrowser( QObject* p ) :
+  QObject( p ),
+  m_AutoLoadPath("")
+{
+}
+
+/*******************************************************************************/
+ApplicationsBrowser
+::~ApplicationsBrowser()
+{
+}
+
+/*******************************************************************************/
+void
+ApplicationsBrowser
+::SetAutoLoadPath(const std::string & itk_auto_load_path)
+{
+  m_AutoLoadPath = itk_auto_load_path;
+
+  //
+  // add the path
+  otb::Wrapper::ApplicationRegistry::AddApplicationPath(m_AutoLoadPath);
+}
+
+/*******************************************************************************/
+StringVector
+ApplicationsBrowser
+::GetAvailableApplications()
+{
+  //
+  // get available application in search path
+  StringVector appList(
+    otb::Wrapper::ApplicationRegistry::GetAvailableApplications()
+  );
+
+  // 
+  // some verbosity
+  // TODO : remove this verbosity later
+  if ( appList.size() == 0 )
+    {
+    qWarning() << "Available OTB applications: NONE!";
+    }
+  else
+    {
+    qDebug() << "Available OTB applications:";
+
+    for( StringVector::const_iterator it( appList.begin() );
+	 it!=appList.end();
+	 ++it )
+      {
+      qDebug() << "- " << it->c_str();
+      }
+    }
+
+  return appList;
+}
+
+/*******************************************************************************/
+StringVector
+ApplicationsBrowser
+::GetApplicationTags( const std::string& appName )
+{
+  //
+  // instantiate the application using the factory
+  otb::Wrapper::Application::Pointer application(
+    otb::Wrapper::ApplicationRegistry::CreateApplication( appName )
+  );
+
+  if( application.IsNull() )
+    return StringVector();
+
+  //
+  // get tags
+  StringVector vtags( application->GetDocTags() );
+
+  //
+  // fill the OTBApps 'docName <-> name' map
+  m_DocNameToNameMap[ application->GetDocName() ] = appName;
+
+  return vtags;
+}
+
+/*******************************************************************************/
+void
+ApplicationsBrowser
+::SearchAvailableApplicationsTags()
+{
+  //
+  // clear previously filled map
+  m_DocNameToNameMap.clear();
+
+  //
+  // get all the applications in the search path
+  StringVector vapp( GetAvailableApplications() );
+
+  //
+  // Fill the  map as following
+  // - key   -> tag
+  // - value -> list of applications having this tag
+  ApplicationsTagContainer      outputContainer;
+  StringVector::const_iterator  it = vapp.begin();
+
+  while ( it != vapp.end() )
+    {
+    // get tags of current app
+    StringVector ctags = GetApplicationTags( *it );
+
+    // case applications has no tag associated 
+    if (ctags.size() == 0 )
+      {
+      // add a default tag 'unknown'. The processing after remains
+      // unchanged
+      ctags.push_back( ToStdString(tr("Uncategorized")) );
+      }
+
+    // key will be the tag (easier for tree origanisation in )
+    StringVector::const_iterator  itTag = ctags.begin();
+    
+    while ( itTag != ctags.end() )
+      {
+
+      // search for this tag in the output container
+      ApplicationsTagContainer::iterator  pos = outputContainer.find( *itTag );
+      if ( pos != outputContainer.end() )  // key found
+        {
+        //
+        // append the application name (*it)
+        (*pos).second.push_back(*it);
+        }
+      else
+        {
+        //
+        // if tag not found in the container, add it
+        std::pair< std::string, StringVector > currentAppTags;
+        currentAppTags.first  = *itTag;
+        currentAppTags.second.push_back( *it );
+        outputContainer.insert( currentAppTags );
+        }
+
+      ++itTag;
+      }
+    
+    ++it;
+    }
+
+  //
+  // emit a signal with the ApplicationsTagContainer as
+  // parameter 
+  emit AvailableApplicationsTagsChanged(outputContainer, m_DocNameToNameMap);
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdBackgroundTask.cxx b/Modules/Visualization/MonteverdiCore/src/mvdBackgroundTask.cxx
new file mode 100644
index 0000000..69b5fbe
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdBackgroundTask.cxx
@@ -0,0 +1,200 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdBackgroundTask.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+#include <stdexcept>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractWorker.h"
+#include "mvdAlgorithm.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::BackgroundTask
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+BackgroundTask
+::BackgroundTask( AbstractWorker* worker, bool autoDestroy, QObject* p ) :
+  QThread( p ),
+  m_Worker( worker )
+{
+  // Check worker argument.
+  assert( m_Worker!=NULL );
+  assert( m_Worker->parent()==NULL );
+
+  if( m_Worker->parent()!=NULL )
+    throw std::invalid_argument(
+      ToStdString(
+        tr(
+          "Worker must not be parented in order to be moved to another thread."
+        )
+      )
+    );
+
+  // Change thread affinity and take ownership of managed worker.
+  m_Worker->moveToThread( this );
+
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Do not re-parent worker to background-task thread here since it
+  // will generate a 'WARNG> QObject::setParent: Cannot set parent,
+  // new parent is in a different thread' warning message from Qt.
+  //
+  // m_Worker->setParent( this );
+
+  // When thread is started, start doing worker job.
+  QObject::connect(
+    this, SIGNAL( started() ),
+    // to:
+    worker, SLOT( Do() )
+  );
+
+  // When worker has finished its job, quit thread.
+  QObject::connect(
+    worker, SIGNAL( Finished() ),
+    // to:
+    this, SLOT( quit() )
+  );
+
+  // Keep informed When some object is destroyed.
+  QObject::connect(
+    worker,
+    SIGNAL( destroyed( QObject* ) ),
+    // to:
+    this,
+    SLOT( OnObjectDestroyed( QObject* ) )
+  );
+
+  // Conditionally auto-destroy this background task.
+  if( autoDestroy )
+    {
+    // When thread has finished.
+    QObject::connect(
+      this, SIGNAL( finished() ),
+      // to:
+      this, SLOT( deleteLater() )
+    );
+
+    // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+    //
+    // NEVER deleteLater() (i.e. asynchronously) worker instance.
+    //
+    // QObject::connect(
+    //   this, SIGNAL( finished() ),
+    //   // to:
+    //   worker, SLOT( deleteLater() )
+    // );
+    }
+}
+
+/*******************************************************************************/
+BackgroundTask
+::~BackgroundTask()
+{
+  // Trace.
+  // qDebug() << this << "is being destroyed.";
+
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Warns if this background-task thread is still running while
+  // destroying instance.
+  //
+  // Thread cannot be forced to quit() & wait() nor terminate()
+  // because it would emit signal while execution of instance
+  // destructor. This could be DANGEROUS.
+  assert( isFinished() );
+
+  if( isRunning() )
+    qWarning() << this << "is being destroyed while still running!";
+
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Synchronously delete owned worker instance when this
+  // background-task is being destroyed.
+  delete m_Worker;
+  m_Worker = NULL;
+
+  // Trace.
+  // qDebug() << this << "has been destroyed.";
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+BackgroundTask
+::OnObjectDestroyed( QObject* object )
+{
+  // NOTE: Won't be called if deleteLater() is used!?
+
+  // qDebug() << this << "::OnObjectDestryed(" << object << ")";
+
+  //
+  // If worker instance is destroyed before this instance, simply
+  // forget worker instance.
+  assert( object==m_Worker );
+
+  if( object==m_Worker )
+    {
+    // qDebug() << this << "forgetting" << m_Worker;
+
+    m_Worker = NULL;
+    }
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx b/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx
new file mode 100644
index 0000000..0414291
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdCore.cxx
@@ -0,0 +1,107 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdCore.h"
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::Core
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+ITK_EXPORT const char*
+RGBW_CHANNEL_NAMES[ RGBW_CHANNEL_COUNT ] = {
+  "RGBW_CHANNEL_RED",
+  "RGBW_CHANNEL_GREEN",
+  "RGBW_CHANNEL_BLUE",
+  "RGBW_CHANNEL_WHITE",
+  "RGBW_CHANNEL_RGB",
+  "RGBW_CHANNEL_ALL"
+};
+
+const char*
+BOUND_NAMES[ BOUND_COUNT ] = {
+  "BOUND_LOWER",
+  "BOUND_UPPER"
+};
+
+char const * const
+EFFECT_NAMES[ EFFECT_COUNT ] =
+{
+  // QT_TRANSLATE_NOOP( "mvd", "None" ),
+  QT_TRANSLATE_NOOP( "mvd", "Chessboard" ),
+  QT_TRANSLATE_NOOP( "mvd", "Gradient" ),
+  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)" ),
+};
+
+bool
+OVERVIEWS_ENABLED_DEFAULT = true;
+
+int
+OVERVIEWS_SIZE_DEFAULT = 4096;
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdDataStream.cxx b/Modules/Visualization/MonteverdiCore/src/mvdDataStream.cxx
new file mode 100644
index 0000000..4256b43
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdDataStream.cxx
@@ -0,0 +1,134 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdDataStream.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::DataStream
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+}
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+class StaticInitializer
+{
+public:
+  StaticInitializer()
+  {
+    Initialize();
+  }
+
+  ~StaticInitializer()
+  {
+    Finalize();
+  }
+
+private:
+  inline
+  void
+  Initialize()
+  {
+    //
+    // Call qRegisterMetaType<>() to make type available in
+    // non-template signatures and serialization.
+
+    //
+    // Register serialization operators for custom meta-types.
+  }
+
+  inline
+  void
+  Finalize()
+  {
+  }
+};
+
+namespace
+{
+static const StaticInitializer STATIC_INITIALIZER;
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* GLOBAL FUNCTION IMPLEMENTATION SECTION                                    */
+/*****************************************************************************/
+QDataStream&
+operator << ( QDataStream& out, void const * & pointer )
+{
+  /*
+  qDebug()
+    << "QDataStream& operator << ( QDataStream&, void const * & );";
+  */
+
+  DATA_STREAM_OUT( out, void, pointer );
+
+  return out;
+}
+
+/*****************************************************************************/
+QDataStream&
+operator >>( QDataStream& in, void * & pointer )
+{
+  /*
+  qDebug()
+    << "QDataStream& operator >> ( QDataStream&, void * & );";
+  */
+
+  DATA_STREAM_IN( in, void, pointer );
+
+  return in;
+}
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdFilenameInterface.cxx b/Modules/Visualization/MonteverdiCore/src/mvdFilenameInterface.cxx
new file mode 100644
index 0000000..333ed4d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdFilenameInterface.cxx
@@ -0,0 +1,102 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdFilenameInterface.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::FilenameInterface
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+FilenameInterface
+::FilenameInterface() :
+  m_Filename()
+{
+}
+
+/*****************************************************************************/
+FilenameInterface
+::~FilenameInterface()
+{
+}
+
+/*****************************************************************************/
+void
+FilenameInterface
+::SetFilename( const QString & filename )
+{
+  m_Filename = filename;
+
+  virtual_SetFilename( filename );
+}
+
+/*****************************************************************************/
+const QString &
+FilenameInterface
+::GetFilename() const
+{
+  return m_Filename;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdHistogramModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdHistogramModel.cxx
new file mode 100644
index 0000000..b23a57c
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdHistogramModel.cxx
@@ -0,0 +1,505 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdHistogramModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTextStream.h"
+#include "mvdQuicklookModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::HistogramModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+HistogramModel::RealType
+HistogramModel
+::GetEpsilon()
+{
+  if( boost::is_floating_point< DefaultImageType::PixelType::ValueType >::value )
+    return
+      std::pow( 10.0, -HistogramModel::PRECISION - 1 );
+
+  else
+    return 1;
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+HistogramModel
+::HistogramModel( QObject* p ) :
+  AbstractModel( p ),
+  m_Histograms(),
+  m_MinPixel(),
+  m_MaxPixel()
+{
+  m_MinPixel.Fill( 0 );
+  m_MaxPixel.Fill( 0 );
+}
+
+/*******************************************************************************/
+HistogramModel
+::~HistogramModel()
+{
+}
+
+/*******************************************************************************/
+bool
+HistogramModel
+::IsValid() const
+{
+  // qDebug() << this << "::IsValid() ->" << ( !m_Histograms.IsNull() && m_Histograms->Size()>0 );
+
+  return !m_Histograms.IsNull() && m_Histograms->Size()>0;
+}
+
+/*******************************************************************************/
+bool
+HistogramModel
+::IsMonoValue() const
+{
+  // qDebug() << this << "::IsMonoValue() ->" << m_MinPixel==m_MaxPixel;
+
+  return m_MinPixel==m_MaxPixel;
+}
+
+/*******************************************************************************/
+HistogramModel::MeasurementType
+HistogramModel
+::Quantile( unsigned int band,
+	    double p ) const
+{
+  assert( band<m_Histograms->Size() );
+
+  // qDebug()
+  //   << "Quantile" << p << ":" <<
+  //   ( IsMonoValue()
+  //     ? m_MinPixel[ band ]
+  //     : m_Histograms->GetNthElement( band )->Quantile( 0, p ) );
+
+  return
+    IsMonoValue()
+    ? m_MinPixel[ band ]
+    : m_Histograms->GetNthElement( band )->Quantile( 0, p );
+}
+
+/*******************************************************************************/
+HistogramModel::MeasurementType
+HistogramModel
+::Quantile( unsigned int band,
+	    double p,
+	    Bound bound ) const
+{
+  return Quantile(
+    band, 
+    bound==BOUND_UPPER
+    ? 1.0 - p
+    : p
+  );
+}
+
+/*******************************************************************************/
+double
+HistogramModel
+::Percentile( CountType band, MeasurementType intensity, Bound bound ) const
+{
+  // Get histogram of band.
+  Histogram::Pointer histogram( m_Histograms->GetNthElement( band ) );
+
+  // Construct 1D measurement vector.
+  assert( histogram->GetMeasurementVectorSize()==1 );
+  Histogram::MeasurementVectorType measurement( 1 );
+
+  {
+    assert( histogram->GetSize( 0 ) > 0 );
+
+    Histogram::MeasurementType binMin( histogram->GetBinMin( 0, 0 ) );
+
+    Histogram::MeasurementType binMax(
+      histogram->GetBinMax( 0, histogram->GetSize( 0 ) - 1 )
+    );
+
+    // Due to float/double conversion, it can happen
+    // that the minimum or maximum value go slightly outside the histogram
+    // Clamping the value solves the issue and avoid RangeError
+    // itk::NumericsTraits<>::Clamp(...) was removed
+    // TODO : when otb::Clamp will be developed, use this function
+    measurement[ 0 ]  =
+      intensity < binMin
+      ? binMin
+      : ( intensity > binMax
+	  ? binMax
+	  : intensity );
+  }
+
+  // Get the index of measurement in 1D-histogram.
+  Histogram::IndexType index;
+  if( !histogram->GetIndex( measurement, index ) )
+    throw itk::RangeError( __FILE__, __LINE__ );
+
+  assert( index.GetSize()==1 );
+
+  // Min/max intensities of bin.
+  MeasurementType minI = histogram->GetBinMin( 0, index[ 0 ] );
+  MeasurementType maxI = histogram->GetBinMax( 0, index[ 0 ] );
+
+  assert( minI <= maxI );
+
+  MeasurementType rangeI = vcl_abs( maxI - minI );
+
+  // Frequency of current bin
+  Histogram::AbsoluteFrequencyType frequency(
+    histogram->GetFrequency( index )
+  );
+
+  double percent =
+    ( IsMonoValue() ||
+      rangeI <= std::numeric_limits< MeasurementType >::epsilon() )
+    ? 0.0
+    : frequency
+      * ( bound == BOUND_LOWER
+	  ? ( intensity - minI )
+	  : ( maxI - intensity ) )
+      / rangeI;
+
+  // Number of bins of histogram.
+  Histogram::SizeType::SizeValueType binCount = histogram->Size();
+
+  // Initialize bound indices.
+  assert( index[ 0 ]>=0 );
+  Histogram::SizeType::SizeValueType index0 = index[ 0 ];
+  Histogram::SizeType::SizeValueType i0 = 0;
+  Histogram::SizeType::SizeValueType iN = binCount;
+
+  switch( bound )
+    {
+    case BOUND_LOWER:
+      i0 = 0;
+      iN = index[ 0 ];
+      break;
+
+    case BOUND_UPPER:
+      i0 = index0 < binCount ? index0 + 1 : binCount;
+      iN = binCount;
+      break;
+
+    default:
+      assert( false && "Implement case statement of switch instruction." );
+      break;
+    };
+
+  // Traverse lower/upper bound (contribution of other bins)
+  Histogram::SizeType::SizeValueType i;
+
+  for( i=i0; i<iN; ++i )
+    percent += histogram->GetFrequency( i, 0 );
+
+  // Calculate frequency rate.
+  percent /= histogram->GetTotalFrequency();
+
+  // Return frequency rate.
+  return percent;
+}
+
+/*******************************************************************************/
+void
+HistogramModel
+::GetData( CountType band,
+	   double * const x,
+	   double * const y,
+	   double& xMin,
+	   double& xMax,
+	   double& yMin,
+	   double& yMax ) const
+{
+  assert( x!=NULL );
+  assert( y!=NULL );
+
+  // Get histogram of band.
+  Histogram::Pointer histogram( m_Histograms->GetNthElement( band ) );
+  assert( !histogram.IsNull() );
+
+  // Get number of bins for each dimension.
+  Histogram::SizeType size( histogram->GetSize() );
+
+  // Ensure dimension is 1.
+  assert( histogram->GetMeasurementVectorSize()==1 );
+
+  // Initialize bounds.
+  assert( std::numeric_limits< double >::has_infinity );
+  yMax = -std::numeric_limits< double >::infinity();
+  yMin = 0;
+  xMin = histogram->GetBinMin( 0, 0 );
+  xMax = histogram->GetBinMax( 0, size[ 0 ] - 1 );
+
+  // Traverse samples.
+  for( unsigned long bin=0; bin<size[ 0 ]; ++bin )
+    {
+    Histogram::AbsoluteFrequencyType f( histogram->GetFrequency( bin, 0 ) );
+
+    if( f>yMax )
+      yMax = f;
+
+    if( f<yMin )
+      yMin = f;
+
+#if HISTOGRAM_CURVE_TYPE==0
+    CountType i = 2 * bin;
+
+    x[ i ] = histogram->GetBinMin( 0, bin );
+    y[ i ] = f;
+
+    ++ i;
+
+    x[ i ] = histogram->GetBinMax( 0, bin );
+    y[ i ] = f;
+
+    // Warning:
+    // coordinates for (x, y) curve will cause graphical artifacts if
+    // max[ bin ]!=min[ bin + 1].
+
+#elif HISTOGRAM_CURVE_TYPE==1
+    x[ bin ] = histogram->GetBinMin( 0, bin );
+    y[ bin ] = f;
+
+#elif HISTOGRAM_CURVE_TYPE==2
+    CountType i = 4 * bin;
+
+    x[ i ] = histogram->GetBinMin( 0, bin );
+    y[ i ] = 0;
+
+    x[ i + 1 ] = x[ i ];
+    y[ i + 1 ] = f;
+
+    x[ i + 2 ] = histogram->GetBinMax( 0, bin );
+    y[ i + 2 ] = f;
+
+    x[ i + 3 ] = x[ i + 2 ];
+    y[ i + 3 ] = 0;
+
+#else
+  assert( false && "Unknown HISTOGRAM_CURVE_TYPE value" );
+
+#endif
+    }
+}
+
+/*******************************************************************************/
+void
+HistogramModel
+::virtual_BuildModel( void* context )
+{
+  if( context==NULL )
+    {
+    template_BuildModel_M< VectorImageModel >();
+
+    // template_BuildModel_I< VectorImageModel::SourceImageType >();
+
+    // template_BuildModel< otb::Image< FixedArray< double, 4 >, 2 > >();
+    // template_BuildModel< otb::Image< itk::FixedArray< float, 4 >, 2 > >();
+
+    /*
+      template_BuildModel< otb::VectorImage< float, 2 > >();
+      template_BuildModel< otb::Image< float, 2 > >();
+    */
+    }
+  else
+    {
+    // Retrieve proper build-context.
+    BuildContext* buildContext = static_cast< BuildContext* >( context );
+
+    if( buildContext->IsBeingStored() )
+      {
+      template_BuildModel_M< VectorImageModel >( buildContext );
+
+      Write( buildContext->m_Filename, SerializableInterface::MODE_TEXT );
+      }
+    else
+      {
+      if( buildContext->m_Filename.isEmpty() )
+	{
+	template_BuildModel_M< VectorImageModel >( buildContext );
+	}
+      else
+	{
+	Read( buildContext->m_Filename, SerializableInterface::MODE_TEXT );
+	}
+      }
+    }
+}
+
+/*******************************************************************************/
+void
+HistogramModel
+::virtual_Read( QIODevice* device )
+{
+  // qDebug() << this << "::virtual_Read(" << device << ")";
+
+  qDebug() <<
+    tr( "%1: Reading histogram..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+  QTime time;
+  time.start();
+
+
+  QTextStream stream( device );
+
+
+  QString string;
+  QString version;
+
+  ReadStreamTag( stream, string, PROJECT_NAME, false );
+  ReadStreamTag( stream, version, QString(), false );
+  ReadStreamTag( stream, string, "HISTOGRAM-MODEL", false );
+
+
+  ReadStreamTag( stream, string, "MIN-PIXEL" );
+  stream >> m_MinPixel;
+
+  ReadStreamTag( stream, string, "MAX-PIXEL" );
+  stream >> m_MaxPixel;
+
+  ReadStreamTag( stream, string, "BANDS" );
+  CountType size = 0;
+  stream >> size;
+  CheckStreamStatus( stream );
+
+  HistogramList::Pointer histograms( HistogramList::New() );
+
+  histograms->Initialize();
+  histograms->Resize( size );
+
+  for( CountType i=0; i<size; ++i )
+    {
+    Histogram::Pointer histogram( Histogram::New() );
+    histogram->SetMeasurementVectorSize(1);
+
+    stream >> *histogram;
+
+    histograms->SetNthElement( i, histogram );
+    }
+
+  m_Histograms = histograms;
+
+  qDebug() <<
+    tr( "%1: Histogram read (%2 ms)..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+    .arg( time.elapsed()  );
+}
+
+/*******************************************************************************/
+void
+HistogramModel
+::virtual_Write( QIODevice& device ) const
+{
+  // qDebug() << this << "::virtual_Write(" << &device << ")";
+
+  qDebug() <<
+    tr( "%1: Writing histogram..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) );
+
+  QTime time;
+  time.start();
+
+#if 0
+  QByteArray byteArray;
+  QTextStream stream( &byteArray, device.openMode() );
+#else
+  QTextStream stream( &device );
+#endif
+
+  stream << PROJECT_NAME << endl;
+  stream << Monteverdi_DATA_VERSION_STRING << endl;
+  stream << "HISTOGRAM-MODEL" << endl;
+
+  WriteStreamTag( stream, "MIN-PIXEL" );
+  stream << m_MinPixel << endl;
+
+  WriteStreamTag( stream, "MAX-PIXEL" );
+  stream << m_MaxPixel << endl;
+
+  WriteStreamTag( stream, "BANDS" );
+  stream << m_Histograms->Size() << endl;
+
+  for( HistogramList::ConstIterator it( m_Histograms->Begin() );
+       it!=m_Histograms->End();
+       ++it )
+    {
+    stream << *it.Get();
+    }
+
+  stream << flush;
+  CheckStreamStatus( stream );
+
+  qDebug() <<
+    tr( "%1: Histogram written (%2 ms)..." )
+    .arg( QDateTime::currentDateTime().toString( Qt::ISODate ) )
+    .arg( time.elapsed()  );
+
+#if 0
+  qDebug() << byteArray;
+
+  if( device.write( byteArray )!=byteArray.size() )
+    throw SystemError();
+#else
+#endif
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx b/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx
new file mode 100644
index 0000000..da3a3c6
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdI18nCoreApplication.cxx
@@ -0,0 +1,824 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdI18nCoreApplication.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <exception>
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbDEMHandler.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdSystemError.h"
+#include "mvdVectorImageModel.h"
+
+
+#define FORCE_QDEBUG 0
+#define FORCE_QWARNING 0
+#define FORCE_QCRITICAL 0
+#define FORCE_QFATAL 0
+
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::I18nCoreApplication
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+const char* I18nCoreApplication::DEFAULT_CACHE_DIR_NAME = "mvd2";
+
+const char* I18nCoreApplication::DEFAULT_CACHE_RESULT_DIR_NAME = "result";
+
+const char* I18nCoreApplication::DATASET_EXT = ".ds";
+
+const char* I18nCoreApplication::SETTINGS_KEYS[ SETTINGS_KEY_COUNT ] =
+{
+  "geoidPath",
+  "geoidPathActive",
+  "overviewsEnabled",
+  "overviewsSize",
+  "resolutionAlgorithm",
+  "resultsDir",
+  "srtmDir",
+  "srtmDirActive",
+  "tileSize",
+};
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+I18nCoreApplication* I18nCoreApplication::m_Instance = NULL;
+
+/*******************************************************************************/
+bool
+I18nCoreApplication
+::IsResultsDirValid( const QString& path )
+{
+  QDir dir( path );
+  QFileInfo fileInfo( path );
+
+  return
+    fileInfo.exists() &&
+    fileInfo.isDir() &&
+    fileInfo.isReadable() &&
+    fileInfo.isWritable();
+}
+
+/*******************************************************************************/
+bool
+I18nCoreApplication
+::MakeDirTree( const QString& path, const QString& tree, QDir* dir )
+{
+  QDir pathDir( path );
+
+  if( !pathDir.exists() )
+    throw SystemError( ToStdString( QString( "('%1')" ).arg( path ) ) );
+
+  QDir treeDir( pathDir.filePath( tree ) );
+  if( treeDir.exists() )
+    {
+    if( dir!=NULL )
+      {
+      *dir = treeDir;
+      }
+
+    return false;
+    }
+
+  if( !pathDir.mkpath( tree ) )
+    throw SystemError(
+      ToStdString(
+	QString( "('%1')" ).arg( pathDir.filePath( tree ) )
+      )
+    );
+
+  if( !pathDir.cd( tree ) )
+    throw SystemError(
+      ToStdString(
+	QString( "('%1')" ).arg(
+	  pathDir.filePath( tree )
+	)
+      )
+    );
+
+  if( dir!=NULL )
+    {
+    *dir = pathDir;
+    }
+
+  return true;
+}
+
+/*****************************************************************************/
+QString
+I18nCoreApplication
+::DatasetPathName( QString& name,
+		   const QString& imageFilename )
+{
+  // convenient QFileInfo
+  QFileInfo fileInfo( imageFilename );
+
+  // get the md5 of the filename
+  QByteArray result =
+    QCryptographicHash::hash( fileInfo.absoluteFilePath().toAscii(), 
+			      QCryptographicHash::Md5 );
+
+  // MD5 hash-code.
+  QString hash( result.toHex() );
+
+  // store the md5 + the dataset extension at the end
+  name = hash + I18nCoreApplication::DATASET_EXT;
+
+  // Return hash-code for further use.
+  return hash;
+}
+
+/*****************************************************************************/
+VectorImageModel *
+I18nCoreApplication
+::LoadImageModel( const QString & filename,
+                  int width,
+                  int height,
+                  QObject * p )
+{
+  try
+    {
+    VectorImageModel::EnsureValidImage( filename );
+    }
+  catch( ... )
+    {
+    throw;
+    }
+
+  VectorImageModel * imageModel = NULL;
+
+  try
+    {
+    AbstractImageModel::BuildContext context( filename );
+
+    imageModel = new VectorImageModel( p );
+
+    imageModel->SetFilename( filename, width, height );
+
+    imageModel->BuildModel( &context );
+    }
+  catch( ... )
+    {
+    delete imageModel;
+    imageModel = NULL;
+
+    throw;
+    }
+
+  return imageModel;
+}
+
+/*****************************************************************************/
+void
+I18nCoreApplication
+::DeleteDatasetModel( const QString & path, const QString & hash )
+{
+  QFileInfo finfo( path, hash );
+
+  QDir dir( finfo.filePath() );
+
+  QFileInfoList fileInfos(
+    dir.entryInfoList( QDir::NoDotAndDotDot | QDir::Files )
+  );
+
+  for( QFileInfoList::const_iterator it( fileInfos.begin() );
+       it!=fileInfos.end();
+       ++it )
+    {
+    if( !dir.remove( it->fileName() ) )
+      throw SystemError(
+        ToStdString(
+          tr( "Failed to remove file '%1'." ).arg( it->filePath() )
+        )
+      );
+    }
+
+  QDir parentDir( dir );
+
+  if( !parentDir.cdUp() )
+    throw SystemError(
+      ToStdString(
+        tr( "Failed to access parent directory of '%1'." ).arg( dir.path() )
+      )
+    );
+
+  if( !parentDir.rmdir( hash  ) )
+    throw SystemError(
+      ToStdString(
+        tr( "Failed to remove dataset directory '%1'." ).arg( dir.path() )
+      )
+    );
+}
+
+/*****************************************************************************/
+void
+I18nCoreApplication
+::HandleQtMessage( QtMsgType type, const char* message )
+{
+  switch( type )
+    {
+    //
+    // DEBUG
+    case QtDebugMsg:
+#if ECHO_QDEBUG || FORCE_QDEBUG
+#if _WIN32
+      OutputDebugString( message );
+      OutputDebugString( "\n" );
+#endif
+      fprintf( stderr, "%s\n", message );
+#endif
+#if LOG_QDEBUG
+      assert( false && "Not yet implemented!" );
+#endif
+      break;
+    //
+    // WARNING
+    case QtWarningMsg:
+#if ECHO_QWARNING || FORCE_QWARNING
+#if _WIN32
+      OutputDebugString( "WARNG> " );
+      OutputDebugString( message );
+      OutputDebugString( "\n" );
+#endif
+      fprintf( stderr, tr( "WARNG> %s\n" ).toLatin1().constData(), message );
+#endif
+#if LOG_QWARNING
+      assert( false && "Not yet implemented!" );
+#endif
+      break;
+    //
+    // CRITICAL
+    case QtCriticalMsg:
+#if ECHO_QCRITICAL || FORCE_QCRITICAL
+#if _WIN32
+      OutputDebugString( "ERROR> " );
+      OutputDebugString( message );
+      OutputDebugString( "\n" );
+#endif
+      fprintf( stderr, tr( "ERROR> %s\n" ).toLatin1().constData(), message );
+#endif
+#if LOG_QCRITICAL
+      assert( false && "Not yet implemented!" );
+#endif
+#if THROW_QCRITICAL
+      throw std::runtime_error(
+	ToStdString(
+	  tr( "Error: " )
+	  .arg( message )
+	)
+      );
+#endif
+      break;
+    //
+    // FATAL
+    case QtFatalMsg:
+#if ECHO_QFATAL || FORCE_QFATAL
+#if _WIN32
+      OutputDebugString( "FATAL> " );
+      OutputDebugString( message );
+      OutputDebugString( "\n" );
+#endif
+      fprintf(
+	stderr,
+	tr( "FATAL> %s\n" ).toLatin1().constData(),
+	message
+      );
+#endif
+#if LOG_QFATAL
+      assert( false && "Not yet implemented!" );
+#endif
+#if THROW_QFATAL
+      throw std::runtime_error(
+	ToStdString(
+	  tr( "Fatal error: " )
+	  .arg( message )
+	)
+      );
+#endif
+      abort();
+      break;
+
+    default:
+      assert( false && "Unhandled message QtMsgType!" );
+      break;
+    }
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+I18nCoreApplication
+::I18nCoreApplication( QCoreApplication* qtApp ) :
+  QObject( qtApp ),
+  m_Settings( NULL ),
+  m_Model( NULL ),
+  m_IsRunningFromBuildDir( false )
+{
+  if( m_Instance!=NULL )
+    {
+    throw std::runtime_error(
+      ToStdString(
+        tr( "I18nCoreApplication is a singleton class!" )
+      )
+    );
+    }
+
+  if( qtApp==NULL )
+    {
+    throw std::invalid_argument(
+      ToStdString(
+	tr( "Class 'I18nCoreApplication' instance must be provided a "
+	    "QCoreApplication' pointer at construction time!" )
+      )
+    );
+    }
+
+  qInstallMsgHandler( I18nCoreApplication::HandleQtMessage );
+
+  m_Instance = this;
+}
+
+/*******************************************************************************/
+I18nCoreApplication
+::~I18nCoreApplication()
+{
+}
+
+/*******************************************************************************/
+void
+I18nCoreApplication
+::Initialize()
+{
+  // Initialize internationlization.
+  InitializeLocale();
+
+  //
+  // Force numeric options of locale to "C"
+  // See issue #635
+  //
+  // TODO: Check it is still needed here!
+  setlocale( LC_NUMERIC, "C" );
+
+  // Initialize QCoreApplication.
+  virtual_InitializeCore();
+
+  // Initialize settings.
+  InitializeSettings();
+
+  // Elevation setup
+  ElevationSetup();
+}
+
+/*******************************************************************************/
+void
+I18nCoreApplication
+::SetModel( AbstractModel* model )
+{
+  emit AboutToChangeModel( model );
+
+  delete m_Model;
+
+  m_Model = model;
+
+  if( model!=NULL )
+    m_Model->setParent( this );
+
+  emit ModelChanged( m_Model );
+}
+
+/*******************************************************************************/
+bool
+I18nCoreApplication
+::ElevationSetup()
+{
+  assert( !otb::DEMHandler::Instance().IsNull() );
+
+  otb::DEMHandler::Pointer demHandlerInstance( otb::DEMHandler::Instance() );
+
+  bool geoidUpdated = false;
+
+  if( I18nCoreApplication::HasSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE ) &&
+      I18nCoreApplication::RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE ).toBool() )
+    {
+    qDebug() <<
+      "Settings/GeoidFile:" <<
+      I18nCoreApplication::RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_GEOID_PATH
+      ).toString();
+
+    try
+      {
+      QString filename(
+	I18nCoreApplication::RetrieveSettingsKey(
+	  I18nCoreApplication::SETTINGS_KEY_GEOID_PATH
+	).toString()
+      );
+
+      geoidUpdated =
+	demHandlerInstance->OpenGeoidFile(
+	  QFile::encodeName(
+	    filename
+	  )
+	);
+
+      // BUGFIX: When geoid file has not been updated by
+      // otb::DEMHandler, the filename may be erroneous and unchecked
+      // so, add a check, in this case, to report input error to the
+      // user.
+      if( !geoidUpdated )
+	{
+	QFileInfo finfo( filename );
+
+	if( !finfo.exists() )
+	  throw std::runtime_error(
+	    ToStdString(
+	      tr( "Geoid file '%1' not found!" )
+	      .arg( filename )
+	    )
+	  );
+	}
+      }
+    catch( const std::exception & err )
+      {
+      qWarning()
+	<< ToStdString( tr( "An error occurred while loading the geoid file, "
+			    "no geoid file will be used:" ) ).c_str()
+	<< err.what();
+
+      throw;
+      }
+    }
+  else
+    geoidUpdated = true;
+
+  if( I18nCoreApplication::HasSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE ) &&
+      I18nCoreApplication::RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE ).toBool() )
+    {
+    qDebug() <<
+      "Settings/DEMDir:" <<
+      I18nCoreApplication::RetrieveSettingsKey(
+	I18nCoreApplication::SETTINGS_KEY_SRTM_DIR
+      ).toString();
+
+    try
+      {
+      demHandlerInstance->ClearDEMs();
+
+      demHandlerInstance->OpenDEMDirectory(
+	QFile::encodeName(
+	  I18nCoreApplication::RetrieveSettingsKey(
+	    I18nCoreApplication::SETTINGS_KEY_SRTM_DIR
+	  )
+	  .toString()
+	)
+      );
+      }
+    catch( const std::exception & err )
+      {
+      qWarning()
+	<< ToStdString( tr( "An error occurred while loading the DEM directory, "
+			    "no DEM will be used:" ) ).c_str()
+	<< err.what();
+
+      throw;
+      }
+    }
+  else
+    {
+    otb::DEMHandler::Instance()->ClearDEMs();
+    }
+
+  return geoidUpdated;
+}
+
+/*******************************************************************************/
+void
+I18nCoreApplication
+::InitializeLocale()
+{
+  {
+  typedef QList< QByteArray > ByteArrayList;
+
+  ByteArrayList codecs( QTextCodec::availableCodecs() );
+
+  qDebug() << "Available codecs:";
+
+  foreach( const QByteArray & codec, codecs )
+    qDebug() << "\t" << codec;
+  }
+
+  // Literal strings to be translated are UTF-8 encoded because source
+  // files are UTF-8 encoded.
+  QTextCodec::setCodecForTr( QTextCodec::codecForName( "UTF-8" ) );
+
+  // QTextCodec::setCodecForLocale( QTextCodec::codecForName("UTF-8") );
+
+  // QTextCodec::setCodecForCStrings( QTextCodec::codecForName("System") );
+
+  qWarning()
+    << "Codec for C-strings:"
+    << ( QTextCodec::codecForCStrings()!=NULL
+	 ? QTextCodec::codecForCStrings()->name()
+	 : "none" );
+
+  qWarning()
+    << "Codec for Locale:"
+    << ( QTextCodec::codecForLocale()!=NULL
+	 ? QTextCodec::codecForLocale()->name()
+	 : "none" );
+
+  qWarning()
+    << "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()
+    << "Language:" << QLocale::languageToString( sys_lc.language() );
+
+  qWarning()
+    << "Country:" << QLocale::countryToString( sys_lc.country() );
+
+  // Check system locale.
+  if( sys_lc.language() == QLocale::C ||
+      ( sys_lc.language() == QLocale::English &&
+        sys_lc.country() == QLocale::UnitedStates ) )
+    {
+    return;
+    }
+
+  //
+  // 2. Choose i18n path between build dir and install dir.
+
+  // Begin from the executable path
+  QDir bin_dir( QDir::cleanPath(QCoreApplication::applicationDirPath()) );
+  
+  // Go up in the directory hierarchy until we have a candidate install prefix
+  bool prefixFound = false;
+  QDir prefix( bin_dir );
+  while ( prefix.cdUp() )
+    {
+    if ( QDir(prefix).cd( Monteverdi_INSTALL_BIN_DIR) )
+      {
+      prefixFound = true;
+      break;
+      }
+    }
+  
+  if( !prefixFound )
+    throw std::runtime_error(
+      ToStdString(
+	tr( "Failed to locate translation files directory 'i18n' in '%1'." )
+	.arg( prefix.path() )
+      )
+    );
+
+  QDir i18n_dir( prefix );
+
+  // At this point the candidate install prefix can also be the build dir root
+  if ( prefix.exists( Monteverdi_BUILD_DIR_FILE  )
+       && i18n_dir.cd( "i18n" ) )
+    {
+    m_IsRunningFromBuildDir = true;
+
+    // Report found build dir root
+    qDebug() <<
+      tr( "Running from build directory '%1'." )
+      .arg( prefix.path() );
+
+    qDebug()
+      << tr( "Loading translation files from directory '%1'." )
+      .arg( i18n_dir.path() );
+    }
+  else
+    {
+    m_IsRunningFromBuildDir = false;
+    
+    // Report found install prefix
+    qDebug()
+      << tr( "Running from install directory '%1'." )
+      .arg( prefix.path() );
+
+    if ( i18n_dir.cd( Monteverdi_INSTALL_DATA_I18N_DIR ) )
+      {
+      qDebug()
+	<< tr( "Loading translation files from directory '%1'." )
+	.arg( i18n_dir.path() );
+      }
+    else
+      {
+      throw std::runtime_error(
+	ToStdString(
+	  tr( "Failed to access translation-files directory '%1'" )
+	  .arg( QDir::cleanPath(
+		  prefix.path()
+		  + QDir::separator()
+		  + Monteverdi_INSTALL_DATA_I18N_DIR
+		)
+	  )
+	)
+      );
+      }
+    }
+
+  try
+    {
+    //
+    // 3.1 Stack Qt translator.
+    LoadAndInstallTranslator(
+      "qt_" + sys_lc.name(),
+      QLibraryInfo::location( QLibraryInfo::TranslationsPath  )
+    );
+    }
+  catch( std::exception& exc )
+    {
+    qWarning() << exc.what();
+    }
+
+  try
+    {
+    //
+    // 3.2 Stack Monteverdi translator as prioritary over Qt translator.
+    LoadAndInstallTranslator( sys_lc.name(), i18n_dir.path() );
+    }
+  catch( std::exception& exc )
+    {
+    qWarning() << exc.what();
+    }
+
+  // TODO: Record locale translation filename(s) used in UI component (e.g.
+  // AboutDialog, Settings dialog, Information dialog etc.)
+}
+
+/*******************************************************************************/
+void
+I18nCoreApplication
+::InitializeCore( const QString& appName,
+		  const QString& appVersion,
+		  const QString& orgName,
+		  const QString& orgDomain )
+{
+  setObjectName( "Application" );
+
+  //
+  // Setup application tags.
+  //
+  QCoreApplication::setApplicationName(
+    appName
+  );
+  QCoreApplication::setApplicationVersion(
+    appVersion
+  );
+
+  //
+  // Setup organization tags.
+  //
+  QCoreApplication::setOrganizationName( orgName );
+  QCoreApplication::setOrganizationDomain( orgDomain );
+
+#if 0
+#ifndef Q_WS_MAC
+    setWindowIcon( QIcon( QLatin1String( ":/images/application_icon" ) ) );
+#endif
+#endif
+}
+
+/*******************************************************************************/
+void
+I18nCoreApplication
+::InitializeSettings()
+{
+  //
+  // Create settings proxy.
+  m_Settings = new QSettings(
+    QSettings::IniFormat,
+    QSettings::UserScope,
+    QCoreApplication::organizationName(),
+    QCoreApplication::applicationName(),
+    this
+  );
+
+  //
+  // Restore result directory.
+  QVariant resultDir(
+    RetrieveSettingsKey( I18nCoreApplication::SETTINGS_KEY_RESULTS_DIR )
+  );
+
+  if( !resultDir.isNull() )
+    {
+    QString resultPath( resultDir.toString() );
+
+    qDebug() << "Settings/resultsDir:" << resultPath;
+
+    if( I18nCoreApplication::IsResultsDirValid( resultPath  ) )
+      {
+      m_ResultsDir.setPath( resultPath );
+      }
+    }
+}
+
+/*******************************************************************************/
+void
+I18nCoreApplication
+::LoadAndInstallTranslator( const QString& filename,
+			    const QString& directory,
+			    const QString& searchDelimiters,
+			    const QString& suffix )
+{
+  QString filename_ext(
+    filename +
+    ( suffix.isNull()
+      ? ".qm"
+      : suffix )
+  );
+
+  // (a) Do need to new QTranslator() here!
+  QTranslator* lc_translator = new QTranslator( this );
+
+  if( !lc_translator->load( filename, directory, searchDelimiters, suffix ) )
+    {
+    delete lc_translator;
+    lc_translator = NULL;
+
+    throw std::runtime_error(
+      ToStdString(
+	tr( "Failed to load '%1' translation file from '%2'." )
+	.arg( filename_ext )
+	.arg( directory )
+      )
+    );
+    }
+
+  // (a) ...because QTranslator needs to be alive during the whole
+  // lifespan of the application.
+  QCoreApplication::installTranslator( lc_translator );
+
+  QString message(
+    tr( "Successfully loaded '%1' translation file from '%2'." )
+    .arg( filename_ext )
+    .arg( directory )
+  );
+
+  // TODO: Log locale translation filename used.
+
+  qDebug() << message;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdImageImporter.cxx b/Modules/Visualization/MonteverdiCore/src/mvdImageImporter.cxx
new file mode 100644
index 0000000..3e5a6fe
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdImageImporter.cxx
@@ -0,0 +1,152 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageImporter.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdI18nCoreApplication.h"
+#include "mvdVectorImageModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageImporter
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*******************************************************************************/
+ImageImporter
+::ImageImporter( const QString& filename,
+		 int width,
+		 int height,
+		 QObject* p ) :
+  AbstractWorker( p ),
+  m_Filename( filename ),
+  m_ModelType( IMAGE ),
+  m_Width( width ),
+  m_Height( height ),
+  m_IsForceCreateEnabled( false )
+{
+}
+
+/*******************************************************************************/
+ImageImporter
+::~ImageImporter()
+{
+  // qDebug() << this << "destroyed.";
+}
+
+/*******************************************************************************/
+QObject*
+ImageImporter
+::virtual_Do()
+{
+  /*
+  emit ProgressTextChanged(
+    tr( "Importing image '%1' as dataset into cache directory..." )
+    .arg( QFileInfo( m_Filename ).fileName() )
+  );
+  */
+
+  // emit ProgressTextChanged( GetFirstProgressText() );
+
+  emit ProgressValueChanged( -1 );
+
+  emit ProgressRangeChanged( 0, 0 );
+
+  // Load model.
+  switch( m_ModelType )
+    {
+    case IMAGE:
+      return
+        I18nCoreApplication::LoadImageModel(
+          m_Filename, m_Width, m_Height
+        );
+      break;
+
+    default:
+      assert( false && "Unhandled ImageImporter::ModelType value." );
+      break;
+    }
+
+  return NULL;
+}
+
+/*******************************************************************************/
+QString
+ImageImporter
+::virtual_GetFirstProgressText() const
+{
+  switch( m_ModelType )
+    {
+    case IMAGE:
+      return
+        tr( "Loading image '%1'..." )
+        .arg( QFileInfo( m_Filename ).fileName()
+        );
+      break;
+
+    default:
+      assert( false && "Unhandled ImageImporter::ModelType value." );
+      break;
+    }
+
+  return QString();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdImagePlacenameLoader.cxx b/Modules/Visualization/MonteverdiCore/src/mvdImagePlacenameLoader.cxx
new file mode 100644
index 0000000..8611abf
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdImagePlacenameLoader.cxx
@@ -0,0 +1,66 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  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 "mvdImagePlacenameLoader.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdVectorImageModel.h"
+
+namespace mvd
+{
+
+/*****************************************************************************/
+ImagePlacenameLoader
+::ImagePlacenameLoader(VectorImageModel* model):
+  m_Model(model)
+{
+}
+
+/*****************************************************************************/
+void
+ImagePlacenameLoader
+::LoadPlacename()
+{
+  // This method is executed in a separate thread
+
+  // get the placename if any
+  std::string placename = m_Model->GetCenterPixelPlaceName();
+  if (!placename.empty())
+    {
+    // emit a signal to
+    emit PlacenameLoaded( FromStdString( placename) );
+    }
+
+  emit Finished();
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdImageProperties.cxx b/Modules/Visualization/MonteverdiCore/src/mvdImageProperties.cxx
new file mode 100644
index 0000000..1903065
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdImageProperties.cxx
@@ -0,0 +1,109 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageProperties.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageProperties
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ImageProperties
+#if IMAGE_PROPERTIES_IS_QOBJECT
+::ImageProperties( QObject* p ) :
+  QObject( p ),
+#else
+::ImageProperties() :
+#endif
+  m_Flags(),
+  m_NoData( ComponentType( 0 ) )
+{
+  m_Flags.m_NoData = false;
+}
+
+/*******************************************************************************/
+ImageProperties
+::~ImageProperties()
+{
+}
+
+/*******************************************************************************/
+bool
+ImageProperties
+::operator == ( const ImageProperties & other ) const
+{
+  return
+    other.m_Flags.m_NoData==m_Flags.m_NoData &&
+    other.m_NoData==m_NoData;
+}
+
+/*******************************************************************************/
+bool
+ImageProperties
+::operator != ( const ImageProperties & other ) const
+{
+  return !operator == ( other );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx b/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx
new file mode 100644
index 0000000..cc82534
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdImageSettings.cxx
@@ -0,0 +1,168 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageSettings.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+#include <limits>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageSettings
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+char const * const
+ImageSettings
+::EFFECT_VALUE_NAME[ EFFECT_COUNT ] =
+{
+  NULL,
+  NULL,
+  QT_TRANSLATE_NOOP( "mvd::ImageSettings", "Range" ),
+  NULL,
+  NULL,
+  QT_TRANSLATE_NOOP( "mvd::ImageSettings", "Angle" ),
+  NULL,
+  NULL,
+};
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+ImageSettings
+::ImageSettings() :
+  m_IsModified( false ),
+  m_IsApplied( false ),
+  m_Effect( EFFECT_NORMAL ),
+  m_Size( 256 ),
+  m_Range( 50.0 ),
+  m_Angle( 10.0 ),
+  m_Alpha( 1.0 )
+{
+}
+
+/*****************************************************************************/
+ImageSettings
+::~ImageSettings()
+{
+}
+
+/*****************************************************************************/
+const char *
+ImageSettings
+::GetEffectName() const
+{
+  assert( m_Effect>=0 && m_Effect<EFFECT_COUNT );
+  assert( qApp!=NULL );
+
+  return
+    qApp->translate(
+      "mvd", EFFECT_NAMES[ m_Effect ]
+    )
+    .toLatin1().constData();
+}
+
+/*****************************************************************************/
+double
+ImageSettings
+::GetValue() const
+{
+  switch( m_Effect )
+    {
+    case EFFECT_LOCAL_CONTRAST:
+      // qDebug() << "Range:" << m_Range;
+      return m_Range;
+      break;
+
+    case EFFECT_SPECTRAL_ANGLE :
+      // qDebug() << "Angle:" << m_Angle;
+      return m_Angle;
+      break;
+
+    default:
+      break;
+    }
+
+  return std::numeric_limits< double >::signaling_NaN();
+}
+
+/*****************************************************************************/
+void
+ImageSettings
+::SetValue( double value )
+{
+  switch( m_Effect )
+    {
+    case EFFECT_LOCAL_CONTRAST:
+      // qDebug() << "Range = " << value;
+      m_Range = value;
+      break;
+
+    case EFFECT_SPECTRAL_ANGLE :
+      // qDebug() << "Angle = " << value;
+      m_Angle = value;
+      break;
+
+    default:
+      break;
+    }
+
+  SetModified();
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdImageSettingsInterface.cxx b/Modules/Visualization/MonteverdiCore/src/mvdImageSettingsInterface.cxx
new file mode 100644
index 0000000..39f685a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdImageSettingsInterface.cxx
@@ -0,0 +1,126 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageSettingsInterface.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdImageSettings.h"
+
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageSettingsInterface
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+ImageSettingsInterface
+::ImageSettingsInterface() :
+  m_Settings( NULL )
+{
+}
+
+/*****************************************************************************/
+ImageSettingsInterface
+::~ImageSettingsInterface()
+{
+#if 0
+  delete m_Settings;
+  m_Settings = NULL;
+#endif
+}
+
+/*****************************************************************************/
+void
+ImageSettingsInterface
+::SetSettings( ImageSettings * settings )
+{
+#if 0
+  delete m_Settings;
+#endif
+
+  m_Settings = settings;
+
+  virtual_SetSettings( settings );
+}
+
+/*****************************************************************************/
+void
+ImageSettingsInterface
+::UpdateSettings()
+{
+  virtual_UpdateSettings();
+}
+
+/*****************************************************************************/
+void
+ImageSettingsInterface
+::virtual_SetSettings( ImageSettings * )
+{
+}
+
+/*****************************************************************************/
+void
+ImageSettingsInterface
+::virtual_UpdateSettings()
+{
+  virtual_SetSettings( m_Settings );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdModifiableInterface.cxx b/Modules/Visualization/MonteverdiCore/src/mvdModifiableInterface.cxx
new file mode 100644
index 0000000..84e6679
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdModifiableInterface.cxx
@@ -0,0 +1,70 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdModifiableInterface.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ModifiableInterface
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ModifiableInterface
+::ModifiableInterface()
+{
+}
+
+/*******************************************************************************/
+ModifiableInterface
+::~ModifiableInterface()
+{
+}
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdMyClass.cxx b/Modules/Visualization/MonteverdiCore/src/mvdMyClass.cxx
new file mode 100644
index 0000000..b2ba7f0
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdMyClass.cxx
@@ -0,0 +1,84 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdMyClass.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::MyClass
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+MyClass
+::MyClass( QObject* p ) :
+  QObject( p )
+{
+}
+
+/*******************************************************************************/
+MyClass
+::~MyClass()
+{
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdOverviewBuilder.cxx b/Modules/Visualization/MonteverdiCore/src/mvdOverviewBuilder.cxx
new file mode 100644
index 0000000..a0dd57e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdOverviewBuilder.cxx
@@ -0,0 +1,192 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdOverviewBuilder.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+#include <itkProcessObject.h>
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdI18nCoreApplication.h"
+#include "mvdProcessObjectObserver.h"
+#include "mvdVectorImageModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::OverviewBuilder
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+OverviewBuilder
+::OverviewBuilder( const GDALOverviewsBuilderVector & builders,
+		   QObject * p ) :
+  AbstractWorker( p ),
+  ProgressInterface(),
+  m_GDALOverviewsBuilders( builders ),
+  m_Index( 0 ),
+  m_Count( 0 )
+{
+}
+
+/*******************************************************************************/
+OverviewBuilder
+::~OverviewBuilder()
+{
+  // qDebug() << this << "destroyed.";
+}
+
+/*******************************************************************************/
+void
+OverviewBuilder
+::SetProgress( double value )
+{
+  assert( m_Count>0 );
+  assert( m_Index>=0 && m_Index<m_Count );
+  assert( value>=0.0 && value<=1.0 );
+
+  // qDebug()
+  //   << m_Index << "/" << m_Count
+  //   << value << "\t"
+  //   << ( 100 * m_Index + static_cast< int >( 100.0 * value ) );
+
+  emit ProgressValueChanged(
+    100 * m_Index + static_cast< int >( 100.0 * value )
+  );
+}
+
+/*******************************************************************************/
+QObject *
+OverviewBuilder
+::virtual_Do()
+{
+  /*
+  emit ProgressTextChanged(
+    tr( "Importing image '%1' as dataset into cache directory..." )
+    .arg( QFileInfo( m_Filename ).fileName() )
+  );
+  */
+
+  // emit ProgressTextChanged( GetFirstProgressText() );
+
+  //
+  // Count elements to process.
+  m_Count = 0;
+
+  for( GDALOverviewsBuilderVector::const_iterator it(
+	 m_GDALOverviewsBuilders.begin()
+       );
+       it!=m_GDALOverviewsBuilders.end();
+       ++ it )
+    if( !it->IsNull() && ( *it )->GetNbResolutions()>0 )
+      ++ m_Count;
+
+  emit ProgressRangeChanged( 0, 100 * m_Count );
+
+  //
+  // Process elements.
+  m_Index = 0;
+
+  {
+    ProcessObjectObserver::Pointer observer( ProcessObjectObserver::New() );
+
+    observer->SetProgressInterface( this );
+
+    for( GDALOverviewsBuilderVector::const_iterator it(
+	   m_GDALOverviewsBuilders.begin()
+	 );
+	 it!=m_GDALOverviewsBuilders.end();
+	 ++ it, ++ m_Index )
+      if( !it->IsNull() && ( *it )->GetNbResolutions()>0 )
+	{
+	unsigned long id =
+	  ( *it )->AddObserver( itk::ProgressEvent(), observer );
+
+	( *it )->Update();
+
+	( *it )->RemoveObserver( id );
+
+	emit ProgressTextChanged(
+	  QString(
+	    tr( "Generting overviews for file %1/%2 '%3'." )
+	  )
+	  .arg( m_Index + 1 )
+	  .arg( m_Count )
+	  .arg(
+	    QFile::decodeName(
+	      ( *it )->GetInputFileName().c_str()
+	    )
+	  )
+	);
+	}
+  }
+
+  emit ProgressValueChanged( 100 * m_Count );
+ 
+  return NULL;
+}
+
+/*******************************************************************************/
+QString
+OverviewBuilder
+::virtual_GetFirstProgressText() const
+{
+  return QString( tr( "Preparing to build GDAL overviews..." ) );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdProcessObjectObserver.cxx b/Modules/Visualization/MonteverdiCore/src/mvdProcessObjectObserver.cxx
new file mode 100644
index 0000000..db2f87e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdProcessObjectObserver.cxx
@@ -0,0 +1,140 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdProcessObjectObserver.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+#include <itkLightProcessObject.h>
+#include <itkProcessObject.h>
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdProgressInterface.h"
+
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ProcessObjectObserver
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ProcessObjectObserver
+::ProcessObjectObserver() :
+  itk::Command(),
+  m_ProgressInterface( NULL )
+{
+}
+
+/*******************************************************************************/
+ProcessObjectObserver
+::~ProcessObjectObserver()
+{
+}
+
+/*******************************************************************************/
+void
+ProcessObjectObserver
+::SetProgressInterface( ProgressInterface * interface )
+{
+  m_ProgressInterface = interface;
+}
+
+/*******************************************************************************/
+void
+ProcessObjectObserver
+::Execute( itk::Object * caller, const itk::EventObject & event )
+{
+  Execute( const_cast< const itk::Object * >( caller ), event );
+}
+
+/*******************************************************************************/
+void
+ProcessObjectObserver
+::Execute( const itk::Object * caller, const itk::EventObject & event )
+{
+  assert( caller!=NULL );
+
+  if( typeid( event )==typeid( itk::ProgressEvent ) )
+    {
+    assert( m_ProgressInterface!=NULL );
+
+    // itk::LightProcessObject and itk::ProcessObject don't have any
+    // common ::GetProgress() interface (because there is no common
+    // super-class providing this interface). So, itk::Object must be
+    // dynamically casted to both types in order to get progress.
+    assert(
+      dynamic_cast< const itk::LightProcessObject * >( caller )!=NULL ||
+      dynamic_cast< const itk::ProcessObject * >( caller )!=NULL
+    );
+
+    const itk::LightProcessObject * lpo =
+      dynamic_cast< const itk::LightProcessObject * >( caller );
+
+    if( lpo!=NULL )
+      m_ProgressInterface->SetProgress( lpo->GetProgress() );
+    else
+      {
+      const itk::ProcessObject * po =
+	dynamic_cast< const itk::ProcessObject * >( caller );
+
+      m_ProgressInterface->SetProgress( po->GetProgress() );
+      }
+    }
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdProgressInterface.cxx b/Modules/Visualization/MonteverdiCore/src/mvdProgressInterface.cxx
new file mode 100644
index 0000000..caeb682
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdProgressInterface.cxx
@@ -0,0 +1,83 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdProgressInterface.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ProgressInterface
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ProgressInterface
+::ProgressInterface()
+{
+}
+
+/*******************************************************************************/
+ProgressInterface
+::~ProgressInterface()
+{
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdQuicklookModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdQuicklookModel.cxx
new file mode 100644
index 0000000..70dcc9c
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdQuicklookModel.cxx
@@ -0,0 +1,154 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdQuicklookModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbStreamingShrinkImageFilter.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::QuicklookModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+QuicklookModel
+::QuicklookModel( QObject* p ) :
+  VectorImageModel( p )
+{
+}
+
+/*******************************************************************************/
+QuicklookModel
+::~QuicklookModel()
+{
+}
+
+/*******************************************************************************/
+void
+QuicklookModel
+::virtual_BuildModel( void* context )
+{
+  //
+  // Get build-context.
+  assert( context );
+  BuildContext* buildContext = static_cast< BuildContext* >( context );
+
+  //
+  // Access rendering settings.
+
+  // TODO: Remove temporary hack (Quicklook rendering settings).
+  if( buildContext->m_Settings!=NULL )
+    {
+    VectorImageSettings * const settings =
+      static_cast< VectorImageSettings * const >( buildContext->m_Settings );
+
+    SetSettings( *settings );
+    }
+
+  //
+  // Quicklook file.
+
+  // Quicklook file information.
+  bool inMemory = buildContext->m_Quicklook.isEmpty();
+
+  QFileInfo quicklookFileInfo(
+    inMemory
+    ? buildContext->m_Filename
+    : buildContext->m_Quicklook
+  );
+
+  // Quicklook filename.
+  QString quicklookFilename( quicklookFileInfo.filePath() );
+
+  // First time?
+  if( buildContext->IsBeingStored() && !inMemory )
+    {
+    // Instantiate a quicklook file writer.
+    VectorImageFileWriterType::Pointer fileWriter(
+      VectorImageFileWriterType::New()
+    );
+
+    // Access parent image-model.
+    VectorImageModel* viModel = GetImageModel< VectorImageModel >();
+    assert( viModel!=NULL );
+
+    CountType currentLod = viModel->GetCurrentLod();
+    CountType bestLod = viModel->ComputeBestLod( 512, 512 );
+
+    if( bestLod!=currentLod )
+      viModel->SetCurrentLod( bestLod );
+
+    // Write quicklook file on the disk.
+    fileWriter->SetFileName( QFile::encodeName( quicklookFilename ).constData()  );
+    fileWriter->SetInput( viModel->ToImage() );
+    fileWriter->Update();
+
+    if( currentLod!=bestLod )
+      viModel->SetCurrentLod( currentLod );
+    }
+
+  // Source stored quicklook image-file.
+  // Best fit to 512x512 px² size.
+  SetFilename(
+    quicklookFilename,
+    VectorImageModel::DEFAULT_LOD_SIZE,
+    VectorImageModel::DEFAULT_LOD_SIZE );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdSerializableInterface.cxx b/Modules/Visualization/MonteverdiCore/src/mvdSerializableInterface.cxx
new file mode 100644
index 0000000..98d8b2b
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdSerializableInterface.cxx
@@ -0,0 +1,158 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdSerializableInterface.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdSystemError.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::SerializableInterface
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+SerializableInterface
+::SerializableInterface()
+{
+}
+
+/*******************************************************************************/
+SerializableInterface
+::~SerializableInterface()
+{
+}
+
+/*******************************************************************************/
+void
+SerializableInterface
+::Read( const QString& filename, Mode mode )
+{
+  // File instance.
+  QFile file( filename );
+
+  // Setup open-mode.
+  QIODevice::OpenMode openMode( QIODevice::ReadOnly );
+
+  if( mode==MODE_TEXT )
+    openMode |= QIODevice::Text;
+
+  // Open file on device.
+  if( !file.open( openMode ) )
+    throw SystemError(
+      ToStdString(
+	QString( "('%1')" ).arg( filename ) )
+    );
+
+  try
+    {
+    // Read file context.
+    virtual_Read( &file );
+    }
+  catch( SystemError& syserr )
+    {
+    // Catch any SystemError thrown by DatasetDescriptor::Write() and
+    // morph it into the same SystemError containing filename
+    // information.
+    syserr = SystemError(
+      ToStdString(
+	QString( "('%1')" ).arg( filename ) )
+    );
+
+    // Throw morphed SystemError.
+    throw syserr;
+    }
+
+  // File is closed by automatic scope detruction of QFile instance.
+}
+
+/*******************************************************************************/
+void
+SerializableInterface
+::Write( const QString& filename, Mode mode ) const
+{
+  // File instance.
+  QFile file( filename );
+
+  // Setup open-mode.
+  QIODevice::OpenMode openMode( QIODevice::WriteOnly );
+
+  if( mode==MODE_TEXT )
+    openMode |= QIODevice::Text;
+
+  // Open file on device.
+  if( !file.open( openMode ) )
+    throw SystemError(
+      ToStdString(
+	QString( "('%1')" ).arg( filename ) )
+    );
+
+  try
+    {
+    // Write file context.
+    virtual_Write( file );
+    }
+  catch( SystemError& syserr )
+    {
+    // Catch any SystemError thrown by DatasetDescriptor::Write() and
+    // morph it into the same SystemError containing filename
+    // information.
+    syserr = SystemError(
+      ToStdString(
+	QString( "('%1')" ).arg( filename ) )
+    );
+
+    // Throw morphed SystemError.
+    throw syserr;
+    }
+
+  // File is closed by automatic scope detruction of QFile instance.
+}
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx
new file mode 100644
index 0000000..95dd12f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdStackedLayerModel.cxx
@@ -0,0 +1,731 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdStackedLayerModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <algorithm>
+#include <sstream>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractLayerModel.h"
+#include "mvdAlgorithm.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::StackedLayerModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+StackedLayerModel::SizeType
+StackedLayerModel::m_LayerCount = 0;
+
+const StackedLayerModel::KeyType
+StackedLayerModel::NIL_KEY;
+
+const StackedLayerModel::SizeType
+StackedLayerModel::NIL_INDEX = -1;
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+StackedLayerModel
+::StackedLayerModel( QObject* p ) :
+  AbstractModel( p ),
+  m_LayerModels(),
+  m_Keys(),
+  m_Current( StackedLayerModel::NIL_INDEX ),
+  m_Reference( StackedLayerModel::NIL_INDEX )
+{
+}
+
+/*******************************************************************************/
+StackedLayerModel
+::~StackedLayerModel()
+{
+}
+
+/*****************************************************************************/
+StackedLayerModel::KeyType
+StackedLayerModel
+::Add( AbstractLayerModel * model )
+{
+  return Insert( model, StackedLayerModel::NIL_INDEX );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::Clear()
+{
+  bool emitSignal0 = !IsEmpty();
+  bool emitSignal1 = !IsEmpty() && m_Current<GetCount();
+  bool emitSignal2 = !IsEmpty() && m_Reference<GetCount();
+
+
+  if( emitSignal0 )
+    emit ContentAboutToBeReset();
+
+  //
+  // Clear current.
+  if( emitSignal1 )
+    {
+    emit CurrentAboutToBeChanged( StackedLayerModel::NIL_INDEX );
+    emit AboutToChangeSelectedLayerModel( KeyType() );
+    }
+
+  m_Current = StackedLayerModel::NIL_INDEX;
+
+  if( emitSignal1 )
+    {
+    emit CurrentChanged( m_Current );
+    emit SelectedLayerModelChanged( KeyType() );
+    }
+
+  //
+  // Clear reference.
+  if( emitSignal2 )
+    emit ReferenceAboutToBeChanged( StackedLayerModel::NIL_INDEX );
+
+  m_Reference = StackedLayerModel::NIL_INDEX;
+
+  if( emitSignal2 )
+    emit ReferenceChanged( m_Reference );
+
+  //
+  // Clear content.
+  ClearPixelInfos();
+
+  for( LayerModelMap::iterator it( m_LayerModels.begin() );
+       it!=m_LayerModels.end();
+       ++it )
+    {
+    assert( it->second!=NULL );
+
+    if( it->second->parent()==this )
+      {
+      delete it->second;
+      it->second = NULL;
+      }
+    }
+
+  m_LayerModels.clear();
+  m_Keys.clear();
+
+  if( emitSignal0 )
+    emit ContentReset();
+}
+
+/*****************************************************************************/
+bool
+StackedLayerModel
+::Contains( const AbstractLayerModel * layerModel ) const
+{
+  for( LayerModelMap::const_iterator it( m_LayerModels.begin() );
+       it!=m_LayerModels.end();
+       ++it )
+    if( it->second==layerModel )
+      return true;
+
+  return false;
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::CountSRT( SizeType & unk,
+	    SizeType & crt,
+	    SizeType & geo,
+	    SizeType & ssr ) const
+{
+  for( LayerModelMap::const_iterator it( m_LayerModels.begin() );
+       it!=m_LayerModels.end();
+       ++it )
+    {
+    assert( it->second!=NULL );
+
+    switch( it->second->GetSpatialReferenceType() )
+      {
+      case SRT_UNKNOWN:
+	++ unk;
+	break;
+
+      case SRT_CARTO:
+	++ crt;
+	break;
+
+      case SRT_GEO:
+	++ geo;
+	break;
+
+      case SRT_SENSOR:
+	++ ssr;
+	break;
+      }
+    }
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::Delete( SizeType index )
+{
+  // qDebug() << this << "::Delete(" << index << ")";
+
+
+  //
+  // Check content.
+  if( IsEmpty() )
+    return;
+
+  if( index>=GetCount() )
+    return;
+
+  assert( !m_Keys[ index ].empty() );
+
+  //
+  // Find item.
+  LayerModelMap::iterator it(
+    m_LayerModels.find( m_Keys[ index ] )
+  );
+
+  assert( it!=m_LayerModels.end() );
+
+  //
+  // Check if signals have to be emitted.
+  bool emitCurrentChanged = m_Current<GetCount() && index<=m_Current;
+  bool emitReferenceChanged = m_Reference<GetCount() && index<=m_Reference;
+
+  //
+  // Remember new current index.
+  SizeType current =
+    index>m_Current
+    ? m_Current
+    : ( m_Current>0
+        ? m_Current - 1
+        : StackedLayerModel::NIL_INDEX );
+
+  //
+  // Emit signals.
+  emit ContentAboutToBeChanged();
+  emit LayerAboutToBeDeleted( index );
+
+  //
+  // Clear satellite date.
+  ClearPixelInfos();
+
+  //
+  // Remove layer-model.
+  AbstractLayerModel * layer = it->second;
+
+  m_LayerModels.erase( it );
+
+  m_Keys.erase( m_Keys.begin() + index );
+
+  it = m_LayerModels.end();
+
+  //
+  // Update pointer to current.
+  if( emitCurrentChanged )
+    SetCurrent( current, true );
+
+  //
+  // Update reference pointer.
+  if( emitReferenceChanged )
+    SetReference(
+      index>m_Reference
+      ? m_Reference
+      : ( m_Reference > 0
+	  ? m_Reference - 1
+	  : StackedLayerModel::NIL_INDEX ),
+      true
+    );
+
+  //
+  // Eventually delete layer.
+  if( layer->parent()==this )
+    {
+    delete layer;
+    layer = NULL;
+    }
+
+  //
+  // Emit signals.
+  emit LayerDeleted( index );
+  emit ContentChanged();
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::EndEditResolutions()
+{
+  // qDebug() << this << "::EndEditResolutions()";
+
+  emit ResolutionsChanged( m_PixelInfos );
+}
+
+/*******************************************************************************/
+std::string
+StackedLayerModel
+::GenerateKey( AbstractLayerModel * otbUseInDebug( layerModel ) )
+{
+  std::ostringstream oss;
+
+  oss << "Layer #" << m_LayerCount++;
+
+#ifdef OTB_DEBUG 
+  oss << " (" << layerModel->metaObject()->className()
+      << "@" << std::hex << layerModel << ")";
+#endif
+
+  return oss.str();
+}
+
+/*****************************************************************************/
+StackedLayerModel::KeyType
+StackedLayerModel
+::Insert( AbstractLayerModel * model, SizeType index )
+{
+  // qDebug() << this << "::Insert(" << model << "," << index << ")";
+
+  //
+  // Check given model.
+  assert( model!=NULL );
+
+  if( model==NULL )
+    {
+    throw
+      std::runtime_error(
+        ToStdString(
+          tr( "Cannot insert NULL AbstractLayerModel." )
+        )
+      );
+    }
+
+  //
+  // Generate key for new layer.
+  std::string key( StackedLayerModel::GenerateKey( model ) );
+  assert( !key.empty() );
+
+  if( key.empty() )
+    {
+    throw
+      std::runtime_error(
+        ToStdString(
+          tr( "Failed to generate string key for '%1'." )
+          .arg( model->metaObject()->className() )
+        )
+      );
+    }
+
+  //
+  // Clamp index. If out of bounds, insert model at the end of stack.
+  if( index>GetCount() )
+    index = GetCount();
+
+  //
+  // Check if signals have to be emitted.
+  bool emitCurrentChanged = m_Current<GetCount() && index<=m_Current;
+  bool emitReferenceChanged = m_Reference<GetCount() && index<=m_Reference;
+
+  //
+  // Emit signals.
+  emit ContentAboutToBeChanged();
+
+  //
+  // Clear satellite date.
+  ClearPixelInfos();
+
+  //
+  // Insert model.
+  m_LayerModels.insert( LayerModelMap::value_type( key, model ) );
+  m_Keys.insert( m_Keys.begin() + index, key );
+
+  //
+  // Update pointer to current.
+  if( emitCurrentChanged )
+    SetCurrent( m_Current + 1, true );
+
+  //
+  // Update reference pointer.
+  if( emitReferenceChanged )
+    SetReference( m_Reference + 1, true );
+
+  //
+  // Emit signals.
+  emit LayerAdded( index );
+  emit ContentChanged();
+
+  //
+  // Return generated key.
+  return key;
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::LowerLayer( SizeType index )
+{
+  assert( GetCount()>1 );
+  assert( index<GetCount() );
+
+  SizeType next = Next( index );
+
+  emit OrderAboutToBeChanged();
+  {
+  ClearPixelInfos();
+
+  std::swap(
+    *( m_Keys.begin() + index ),
+    *( m_Keys.begin() + next )
+  );
+  }
+  emit OrderChanged();
+
+  // WARNING: This may be buggy if index!=m_Current
+  emit CurrentAboutToBeChanged( next );
+  {
+  m_Current = next;
+  }
+  emit CurrentChanged( next );
+
+  // WARNING: This may be buggy if index!=m_Reference
+  SetReference(
+    m_Reference==next
+    ? index
+    : ( m_Reference==index
+        ? next
+        : m_Reference )
+  );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::MoveTo( SizeType index, SizeType position )
+{
+  assert( GetCount()>1 );
+  assert( index<GetCount() );
+  assert( position<GetCount() );
+
+  if( index==position )
+    return;
+
+  //
+  // Move element.
+  emit OrderAboutToBeChanged();
+  {
+  ClearPixelInfos();
+
+  KeyType key( m_Keys[ index ] );
+
+  m_Keys.erase( m_Keys.begin() + index );
+  m_Keys.insert( m_Keys.begin() + position, key );
+  }
+  emit OrderChanged();
+
+  //
+  // Compute new current element.
+  SizeType current( m_Current );
+
+  if( index==m_Current )
+    current = position;
+
+  if( index>m_Current && position<=m_Current )
+    ++ current;
+
+  else if( index<m_Current && position>=m_Current )
+    -- current;
+
+  //
+  // Signal new current element.
+  SetCurrent( current );
+
+  //
+  // Compute new reference element.
+  SizeType reference( m_Reference );
+
+  if( index==m_Reference )
+    reference = position;
+
+  if( index>m_Reference && position<=m_Reference )
+    ++ reference;
+
+  else if( index<m_Reference && position>=m_Reference )
+    -- reference;
+
+  SetReference( reference );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::MoveToBottom( SizeType index )
+{
+  MoveTo( index, m_Keys.size() - 1 );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::MoveToTop( SizeType index )
+{
+  MoveTo( index, 0 );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::RaiseLayer( SizeType index )
+{
+  assert( GetCount()>1 );
+  assert( index<GetCount() );
+
+  SizeType prev = Prev( index );
+
+  emit OrderAboutToBeChanged();
+  {
+  ClearPixelInfos();
+
+  std::swap(
+    *( m_Keys.begin() + index ),
+    *( m_Keys.begin() + prev )
+  );
+  }
+  emit OrderChanged();
+
+  // WARNING: This may be buggy if index!=m_Current.
+  emit CurrentAboutToBeChanged( prev );
+  {
+  m_Current = prev;
+  }
+  emit CurrentChanged( prev );
+
+  // WARNING: This may be buggy if index!=m_Reference.
+  SetReference(
+    m_Reference==prev
+    ? index
+    : ( m_Reference==index
+        ? prev
+        : m_Reference )
+  );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::RotateLayerUp( SizeType index )
+{
+  if( GetCount()<2 )
+    return;
+
+  if( index>=GetCount() )
+    return;
+
+  KeyType currentKey( GetKey( m_Current ) );
+  KeyType referenceKey( GetKey( m_Reference ) );
+
+  emit OrderAboutToBeChanged();
+  {
+  ClearPixelInfos();
+
+  std::rotate( m_Keys.begin(), m_Keys.begin() + index, m_Keys.end() );
+  }
+  emit OrderChanged();
+
+  if( !currentKey.empty() )
+    {
+    SizeType current = FindKey( currentKey );
+
+    assert( current!=StackedLayerModel::NIL_INDEX );
+
+    emit CurrentAboutToBeChanged( current );
+    {
+      m_Current = current;
+    }
+    emit CurrentChanged( m_Current );
+    }
+
+  if( !referenceKey.empty() )
+    {
+    SizeType reference = FindKey( referenceKey );
+
+    assert( reference!=StackedLayerModel::NIL_INDEX );
+
+    emit ReferenceAboutToBeChanged( reference );
+    {
+      m_Reference = reference;
+    }
+    emit ReferenceChanged( m_Reference );
+    }
+
+  // qDebug() << "current:" << index;
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::RotateLayerDown( SizeType index )
+{
+  if( GetCount()<2 )
+    return;
+
+  if( index>=GetCount() )
+    return;
+
+  KeyType currentKey( GetKey( m_Current ) );
+  KeyType referenceKey( GetKey( m_Reference ) );
+
+  emit OrderAboutToBeChanged();
+  {
+  ClearPixelInfos();
+
+  std::rotate( m_Keys.rbegin(), m_Keys.rbegin() + index, m_Keys.rend()  );
+  }
+  emit OrderChanged();
+
+  if( !currentKey.empty() )
+    {
+    SizeType current = FindKey( currentKey );
+
+    assert( current!=StackedLayerModel::NIL_INDEX );
+
+    emit CurrentAboutToBeChanged( current );
+    {
+    m_Current = current;
+    }
+    emit CurrentChanged( current );
+    }
+
+  if( !referenceKey.empty() )
+    {
+    SizeType reference = FindKey( referenceKey );
+
+    assert( reference!=StackedLayerModel::NIL_INDEX );
+
+    emit ReferenceAboutToBeChanged( reference );
+    {
+    m_Reference = reference;
+    }
+    emit ReferenceChanged( reference );
+    }
+
+  // qDebug() << "current:" << index;
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::SetCurrent( const AbstractLayerModel * layerModel )
+{
+  SetCurrent( KeyOf( layerModel ) );
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::SetCurrent( const KeyType & key )
+{
+  if( key==GetCurrentKey() )
+    return;
+
+  if( key==StackedLayerModel::NIL_KEY )
+    {
+    SetCurrent( StackedLayerModel::NIL_INDEX );
+
+    return;
+    }
+
+  for( SizeType i=0; i<m_Keys.size(); ++i )
+    if( m_Keys[ i ]==key )
+      {
+      SetCurrent( i );
+      return;
+      }
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::SetReference( const KeyType & key )
+{
+  if( key==GetKey( m_Reference ) )
+    return;
+
+  if( key==StackedLayerModel::NIL_KEY )
+    {
+    SetReference( StackedLayerModel::NIL_INDEX );
+
+    return;
+    }
+
+  for( SizeType i=0; i<m_Keys.size(); ++i )
+    if( m_Keys[ i ]==key )
+      {
+      SetReference( i );
+      return;
+      }
+}
+
+/*****************************************************************************/
+void
+StackedLayerModel
+::SetReference( const AbstractLayerModel * layerModel )
+{
+  SetReference( KeyOf( layerModel ) );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdTextStream.cxx b/Modules/Visualization/MonteverdiCore/src/mvdTextStream.cxx
new file mode 100644
index 0000000..8af9a97
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdTextStream.cxx
@@ -0,0 +1,61 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdTextStream.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::TextStream
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+const char*
+STREAM_TAG_NAMES[ STREAM_TAG_COUNT ] =
+{
+  "SIZE",
+  "VECTOR",
+  "VARIABLE_LENGTH_VECTOR",
+};
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdTypes.cxx b/Modules/Visualization/MonteverdiCore/src/mvdTypes.cxx
new file mode 100644
index 0000000..578d0b8
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdTypes.cxx
@@ -0,0 +1,50 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdTypes.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::Types
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
new file mode 100644
index 0000000..d891e8f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
@@ -0,0 +1,998 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdVectorImageModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+#include "itkImageRegionConstIteratorWithIndex.h"
+#include "itksys/SystemTools.hxx"
+#include "vnl/vnl_random.h"
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbConfigure.h"
+#include "otbGDALDriverManagerWrapper.h"
+#include "otbStandardOneLineFilterWatcher.h"
+#include "otbGeoInformationConversion.h"
+#include "otbCoordinateToName.h"
+#include "otbDEMHandler.h"
+#include "otbGroundSpacingImageFunction.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdQuicklookModel.h"
+#include "mvdSystemError.h"
+
+
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::VectorImageModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+const unsigned int VectorImageModel::DEFAULT_LOD_SIZE = 512;
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+VectorImageModel
+::VectorImageModel( QObject* p ) :
+  AbstractImageModel( p ),
+  FilenameInterface(),
+  m_Image(),
+  m_ImageFileReader(),
+  m_Settings(),
+  m_LodCount( -1 ),
+  m_ToWgs84()
+{
+}
+
+/*****************************************************************************/
+VectorImageModel
+::~VectorImageModel()
+{
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::SetFilename( const QString& filename , int w, int h)
+{
+  setObjectName( filename );
+
+  // 1. store the input filename
+  FilenameInterface::SetFilename( filename );
+
+  // Get the largest possible region of the image
+  m_ImageFileReader = DefaultImageFileReaderType::New();
+
+  // qDebug()
+  //   << this << "\n"
+  //   << "\tQString:" << GetFilename();
+
+  // std::cout
+  //   << "\tstd::string: " << QFile::encodeName( GetFilename() ).constData()
+  //   << std::endl;
+
+  m_ImageFileReader->SetFileName( QFile::encodeName( GetFilename() ) );
+  m_ImageFileReader->GetOutput()->UpdateOutputInformation();
+  
+  // Retrieve the list of Lod from file
+  m_LodCount = m_ImageFileReader->GetOverviewsCount();
+
+  // Remember native largest region.
+  m_NativeLargestRegion =
+      m_ImageFileReader->GetOutput()->GetLargestPossibleRegion();
+
+  // Remember native spacing
+  m_NativeSpacing = m_ImageFileReader->GetOutput()->GetSpacing();
+
+  // qDebug()
+  //   << filename
+  //   << "\norigin:"
+  //   << m_ImageFileReader->GetOutput()->GetOrigin()[ 0 ]
+  //   << m_ImageFileReader->GetOutput()->GetOrigin()[ 1 ]
+  //   << "\nspacing:" << m_NativeSpacing[ 0 ] << m_NativeSpacing[ 1 ];
+
+  
+  // Setup GenericRSTransform
+  m_ToWgs84 = otb::GenericRSTransform<>::New();
+  m_ToWgs84->SetInputDictionary(m_ImageFileReader->GetOutput()->GetMetaDataDictionary());
+  m_ToWgs84->SetOutputProjectionRef(otb::GeoInformationConversion::ToWKT(4326));
+  m_ToWgs84->InstantiateTransform();
+
+  //Compute estimated spacing here
+  //m_EstimatedGroundSpacing
+  m_EstimatedGroundSpacing = m_NativeSpacing;
+ 
+  typedef otb::GroundSpacingImageFunction<VectorImageType> GroundSpacingImageType;
+  GroundSpacingImageType::Pointer GroundSpacing = GroundSpacingImageType::New();
+  GroundSpacing->SetInputImage(m_ImageFileReader->GetOutput());
+  
+  if (m_ToWgs84->IsUpToDate())
+    {
+    if (m_ToWgs84->GetTransformAccuracy() != otb::Projection::UNKNOWN)
+      {
+      IndexType  index;
+      vnl_random rand;
+
+      index[0] = static_cast<IndexType::IndexValueType>(rand.lrand32(0, m_ImageFileReader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]));
+      index[1] = static_cast<IndexType::IndexValueType>(rand.lrand32(0, m_ImageFileReader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]));
+
+      m_EstimatedGroundSpacing = GroundSpacing->EvaluateAtIndex(index);
+      }
+    }
+
+  //
+  // 2. Setup file-reader.
+  SetupCurrentLodImage(w, h);
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::EnsureValidImage( const QString& filename )
+{
+  try
+    {
+    DefaultImageFileReaderType::Pointer imageFileReader(
+      DefaultImageFileReaderType::New()
+    );
+
+    QString fname = filename;
+    if (!filename.contains(QChar('?')))
+      {
+      fname.append(QChar('?'));
+      }
+    imageFileReader->SetFileName( QFile::encodeName( fname.append(QString("&skipgeom=true"))).constData());
+    imageFileReader->GetOutput()->UpdateOutputInformation();
+    }
+
+  catch( std::exception& exc )
+    {
+    // TODO manage the message returned by OTB
+    qWarning()
+      << ToStdString(
+	tr( "Exception caught when validating file '%1': ")
+	.arg( filename ) ).c_str()
+      << exc.what();
+
+    throw
+      // std::runtime_error(
+      SystemError(
+	ToStdString(
+	  tr( "File '%1' cannot be read by OTB." )
+	  .arg( filename )
+	)
+      );
+    }
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::BuildGdalOverviews()
+{
+  // Build overviews if necessary
+  // bool hasOverviewsSupport = (m_ImageFileReader->GetOverviewsCount()>0);
+  int nbOfAvailableOvw = m_ImageFileReader->GetOverviewsCount();
+  // 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." );
+
+  if( nbOfAvailableOvw>0 )
+    {
+    // qDebug() << tr("The file already has overviews!");
+    return;
+    }
+
+  // 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." );
+
+  if( !forceToCacheOvw )
+    {
+    // the user doesn't want to cache the overviews, GDAL will virtually compute the ovw on demand
+    qWarning() << tr("Letting GDAL decimate the file on-the-fly !");
+
+    return;
+    }
+
+  // the user want to cache the overviews
+  // qDebug() << tr("Caching of overviews.");
+  typedef otb::GDALOverviewsBuilder FilterType;
+  FilterType::Pointer filter = FilterType::New();
+
+  assert( m_LodCount!=static_cast< unsigned int >( -1 ) );
+  // m_ImageFileReader->GetAvailableResolutions(m_AvailableLod);
+
+  std::string tempfilename( QFile::encodeName( GetFilename() ) );
+
+  filter->SetInputFileName(tempfilename);
+  filter->SetResamplingMethod( otb::GDAL_RESAMPLING_AVERAGE );
+  filter->SetResolutionFactor(4);
+
+  assert( m_ImageFileReader->GetOverviewsCount()==m_LodCount );
+
+  filter->SetNbResolutions(
+    GetNbLod() > 1
+    ? GetNbLod() / 2
+    : 1
+  );
+
+  try
+    {
+    otb::StandardOneLineFilterWatcher watcher(
+      filter,
+      ToStdString( tr( "Overviews creation: " ) )
+    );
+    filter->Update();
+    std::cout << std::endl;
+    }
+  catch( std::exception& /*exc*/ )
+    {
+    // The user can continue to use the file so we return a warning message
+    // TODO MSD return the message to the log widget
+    qWarning() <<
+      ToStdString(
+	tr( "The overviews creation failed.\n"
+	    "Navigation in resolution will be slower." )
+      ).c_str();
+
+    // throw exc;
+    }
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::virtual_BuildModel( void* context )
+{
+  SetProperties( new ImageProperties() );
+
+   // Get build-context.
+  assert( context!=NULL );
+  BuildContext* buildContext = static_cast< BuildContext* >( context );
+
+  // Build image overview.
+  if( buildContext->IsBeingStored() )
+    BuildGdalOverviews();
+
+  // Get build-context settings.
+  VectorImageSettings * const  settings =
+    static_cast< VectorImageSettings * const >( buildContext->m_Settings );
+
+
+// Fetch the no data flags if any
+  otb::ImageMetadataInterfaceBase::ConstPointer metaData(
+    GetMetaDataInterface()
+    );
+
+  std::vector<double> values;
+  std::vector<bool> flags;
+
+  bool ret = metaData->GetNoDataFlags(flags,values);
+
+  if(ret && !values.empty() && !flags.empty() && flags[0])
+    {
+    GetProperties()->SetNoDataEnabled(true);
+    GetProperties()->SetNoData(values[0]);
+    }
+  
+  //
+  // Step #1: Perform pre-process of AbstractModel::BuildModel()
+  // pattern.
+
+  // Store default display settings in the pre-process stage
+  // i.e. before histogram is generated by the standard
+  // AbstractImageModel::BuildModel().
+  if( settings==NULL )
+    InitializeColorSetupSettings();
+
+  //
+  // Step #2: Perform standard AbstractModel::BuildModel()
+  // pattern. Call parent virtual method.
+
+  // The call to the parent BuildModel() method will, for example,
+  // generate the histogram.
+  AbstractImageModel::virtual_BuildModel( context );
+
+  //
+  // Step #3: Post-process of the BuildModel() pattern.
+
+  // Remember min/max pixel for color-dynamics once histogram has been
+  // generated.
+  if( settings==NULL )
+    InitializeColorDynamicsSettings();
+  else
+    SetSettings( *settings );
+
+  // Remember image properties.
+  if( buildContext->m_Properties!=NULL )
+    SetProperties( *buildContext->m_Properties );
+  
+  // Apply settings to child QuicklookModel.
+  ApplySettings();
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::InitializeColorSetupSettings()
+{
+  // Remember meta-data interface.
+  otb::ImageMetadataInterfaceBase::ConstPointer metaData(
+    GetMetaDataInterface()
+  );
+
+  // Ensure default display returns valid band indices (see OTB bug).
+  assert( metaData->GetDefaultDisplay().size()==3 );
+#if 0
+  assert( metaData->GetDefaultDisplay()[ 0 ]
+    < m_Image->GetNumberOfComponentsPerPixel() );
+  assert( metaData->GetDefaultDisplay()[ 1 ]
+    < m_Image->GetNumberOfComponentsPerPixel() );
+  assert( metaData->GetDefaultDisplay()[ 2 ]
+    < m_Image->GetNumberOfComponentsPerPixel() );
+#endif
+
+  // Patch invalid band indices of default-display (see OTB bug).
+  VectorImageSettings::ChannelVector rgb( metaData->GetDefaultDisplay() );
+
+  if( rgb[ 0 ]>=m_Image->GetNumberOfComponentsPerPixel() )
+    {
+    rgb[ 0 ] = 0;
+    }
+
+  if( rgb[ 1 ]>=m_Image->GetNumberOfComponentsPerPixel() )
+    {
+    rgb[ 1 ] = 0;
+    }
+
+  if( rgb[ 2 ]>=m_Image->GetNumberOfComponentsPerPixel() )
+    {
+    rgb[ 2 ] = 0;
+    }
+
+  // Store default display settings.
+  GetSettings().SetRgbChannels( rgb );
+
+  // Store default grayscale-mode.
+  if( m_Image->GetNumberOfComponentsPerPixel()<3 )
+    {
+    GetSettings().SetGrayscaleActivated( true );
+    GetSettings().SetGrayChannel( rgb[ 0 ] );
+    }
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::InitializeColorDynamicsSettings()
+{
+  // Get the histogram-model.
+  HistogramModel* histogramModel = GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  // Remember min/max pixels.
+  DefaultImageType::PixelType min( histogramModel->GetMinPixel() );
+  DefaultImageType::PixelType max( histogramModel->GetMaxPixel() );
+
+  CountType begin = -1;
+  CountType end = -1;
+
+  mvd::RgbwBounds( begin, end, RGBW_CHANNEL_ALL );
+
+  // Store min/max intensities of default-display channels.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    VectorImageSettings::ChannelVector::value_type band =
+      GetSettings().GetRgbwChannel( channel );
+
+    bool isInvalid = !histogramModel->IsValid() /* || histogramModel->IsMonoValue() */;
+
+    GetSettings().SetLowIntensity(
+      channel,
+      isInvalid
+      ? min[ band ]
+      : histogramModel->Quantile( band , 0.02, BOUND_LOWER )
+    );
+
+    GetSettings().SetHighIntensity(
+      channel,
+      isInvalid
+      ? max[ band ]
+      : histogramModel->Quantile( band , 0.02, BOUND_UPPER )
+    );
+    }
+}
+
+/*****************************************************************************/
+CountType
+VectorImageModel::ComputeBestLod( int width, int height ) const
+{
+  if( width<=0 || height<=0 )
+    return 0;
+
+  ImageRegionType nativeLargestRegion( GetNativeLargestRegion() );
+
+  double factorX =
+    double( width ) / double( nativeLargestRegion.GetSize()[ 0 ] );
+
+  double factorY =
+    double( height ) / double( nativeLargestRegion.GetSize()[ 1 ] );
+
+  double initialZoomFactor = std::min(factorX, factorY);
+
+  // Compute the best lod from the initialZoomFactor
+  return ComputeBestLod( initialZoomFactor );
+}
+
+/*****************************************************************************/
+unsigned int
+VectorImageModel::ComputeBestLod( double zoomFactor ) const
+{
+  return this->Closest(
+    static_cast< int >( (1 / zoomFactor + 0.5) ),
+    m_LodCount
+  );
+}
+
+/*****************************************************************************/
+unsigned int 
+VectorImageModel::Closest( double invZoomfactor,
+                           unsigned int lodCount )
+{
+  double minDist = 50000.;
+  unsigned int closest = 0;
+
+  // Compute the diff and keep the index that minimize the distance
+  for (unsigned int idx = 0; idx < lodCount; idx++)
+    {
+    double diff = vcl_abs( static_cast< double >( 1 << idx ) - invZoomfactor );
+
+    if( diff < minDist )
+      {
+      minDist = diff;
+      closest = idx;
+      }
+    }
+
+  return closest;
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::SetupCurrentLodImage( int width, int height )
+{
+  CountType bestInitialLod = 0;
+  // Compute the initial zoom factor and the best LOD.
+  if( width>0 && height>0 )
+    {
+    ImageRegionType nativeLargestRegion( GetNativeLargestRegion() );
+
+    double factorX =
+      double( width ) / double( nativeLargestRegion.GetSize()[ 0 ] );
+
+    double factorY =
+      double( height ) / double( nativeLargestRegion.GetSize()[ 1 ] );
+
+    double initialZoomFactor = std::min(factorX, factorY);
+
+    // Compute the best lod from the initialZoomFactor
+    bestInitialLod = ComputeBestLod(initialZoomFactor);
+    }
+
+  this->SetCurrentLod( bestInitialLod );
+}
+
+/*****************************************************************************/
+CountType
+VectorImageModel
+::GetNbLod() const
+{
+  return m_LodCount;
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::virtual_SetCurrentLod( CountType lod )
+{
+  // new filename if lod is not 0
+  QString lodFilename( GetFilename() );
+
+  // If model is a multi-resolution image.
+  if (lodFilename.count(QChar('?')) == 0)
+    {
+    // the filename is not an extended filename yet
+    lodFilename.append( QChar('?') );
+    }
+  lodFilename.append( QString( "&resol=%1" ).arg( lod ) );
+
+  // Update m_ImageFileReader
+  m_ImageFileReader->SetFileName( QFile::encodeName( lodFilename ).constData() );
+  m_ImageFileReader->GetOutput()->UpdateOutputInformation();
+  
+  // (Always) Update m_Image reference.
+  m_Image = m_ImageFileReader->GetOutput();
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::virtual_RefreshHistogram()
+{
+  assert( GetProperties()!=NULL );
+
+  RefreshHistogram( NULL );
+}
+
+/*****************************************************************************/
+ImageBaseType::ConstPointer
+VectorImageModel
+::ToImageBase() const
+{
+  return ImageBaseType::ConstPointer( m_Image );
+}
+
+/*****************************************************************************/
+ImageBaseType::Pointer
+VectorImageModel
+::ToImageBase()
+{
+  return ImageBaseType::Pointer( m_Image );
+}
+
+/*****************************************************************************/
+std::string
+VectorImageModel
+::GetCenterPixelPlaceName()
+{
+  // center index
+  IndexType centerIndex;
+  centerIndex[0] = GetNativeLargestRegion().GetIndex()[0] + GetNativeLargestRegion().GetSize(0)/2;
+  centerIndex[1] = GetNativeLargestRegion().GetIndex()[1] + GetNativeLargestRegion().GetSize(1)/2;
+  
+  //
+  // Compute the physical coordinates of the center pixel 
+  PointType centerPoint;
+  centerPoint[0] = (centerIndex[0] *   GetNativeSpacing()[0] )  + GetOrigin()[0];
+  centerPoint[1] = (centerIndex[1] *   GetNativeSpacing()[1] )  + GetOrigin()[1];
+  
+  // lat / long
+  PointType wgs84;
+  wgs84 = GetGenericRSTransform()->TransformPoint(centerPoint);
+  
+  // get placename
+  otb::CoordinateToName::Pointer coordinateToName = otb::CoordinateToName::New();
+  coordinateToName->SetLonLat(wgs84);
+  coordinateToName->Evaluate();
+
+  // get the placename - Country (if any)
+  std::ostringstream oss;
+  
+  std::string placeName = coordinateToName->GetPlaceName();
+  std::string countryName = coordinateToName->GetCountryName();
+  
+  if (placeName != "")
+    oss << placeName;
+  
+  if (countryName != "")
+    oss << " - "<< countryName;
+
+  return oss.str();
+}
+
+/*****************************************************************************/
+bool
+VectorImageModel
+::IsModified() const
+{
+  return
+    GetSettings().IsModified() ||
+    ( GetProperties()!=NULL && GetProperties()->IsModified() );
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::ClearModified()
+{
+  GetSettings().ClearModified();
+
+  if( GetProperties()!=NULL )
+    GetProperties()->ClearModified();
+
+  // TODO: Remove temporary hack (Quicklook modified flag).
+  QuicklookModel* quicklookModel = GetQuicklookModel();
+  // If image-model is not quicklook-model.
+  if( quicklookModel!=NULL )
+    quicklookModel->ClearModified();
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::ApplySettings()
+{
+  // qDebug() << this << "::ApplySettings()";
+
+  // TODO: Remove temporary hack (Quicklook rendering settings).
+  QuicklookModel* quicklookModel = GetQuicklookModel();
+  // If image-model is not quicklook-model.
+  if( quicklookModel!=NULL )
+    {
+    // Update quicklook rendering-settings.
+    quicklookModel->SetSettings( GetSettings() );
+    quicklookModel->ApplySettings();
+    }
+}
+
+/*****************************************************************************/
+std::string
+VectorImageModel
+::virtual_GetWkt() const
+{
+  assert( !m_Image.IsNull() );
+
+  return m_Image->GetProjectionRef();
+}
+
+/*****************************************************************************/
+bool
+VectorImageModel
+::virtual_HasKwl() const
+{
+  assert( !m_Image.IsNull() );
+
+  return m_Image->GetImageKeywordlist().GetSize()>0;
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::virtual_ToWgs84( const PointType & physical,
+		   PointType & wgs84,
+		   double & alt ) const
+{
+  assert( !m_ToWgs84.IsNull() );
+  assert( m_ToWgs84->IsUpToDate() );
+
+  wgs84 = m_ToWgs84->TransformPoint( physical );
+
+  alt =
+    otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(
+      wgs84[ 0 ],
+      wgs84[ 1 ]
+    );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+VectorImageModel
+::OnModelUpdated()
+{
+  // qDebug() << this << "::OnModelUpdated()";
+
+  // Apply settings to rendering pipeline.
+  ApplySettings();
+
+  // Emit settings update to notify display refresh.
+  emit SettingsUpdated( this );
+
+  // Emit properties update.
+  emit PropertiesUpdated( this );
+}
+
+/*****************************************************************************/
+void
+VectorImageModel
+::OnPhysicalCursorPositionChanged( const QPoint &,
+                                   const PointType &,
+                                   const PointType & point,
+                                   const DefaultImageType::PixelType& pixel )
+{
+// Pixel is read from otb::GlImageActor (inside ImageViewRender)
+// which does only components contain red, green and blue channel components.
+// Only read, green and blue channel related component are
+// present.
+#define USE_RGB_CHANNELS_LIMIT 1
+
+  // stream to fill
+  std::ostringstream ossPhysicalX;
+  std::ostringstream ossPhysicalY;
+  std::ostringstream ossGeographicLong;
+  std::ostringstream ossGeographicLat;
+  std::ostringstream ossGeographicElevation;
+  std::ostringstream ossRadio;
+
+  // emitted current pixel
+  QStringList      bandNames;
+#if USE_RGB_CHANNELS_LIMIT
+  QStringList stringList;
+#endif
+
+  //emitted current geography
+  StringVector     geoVector;
+  QStringList      geoList;
+
+  //emitted current geography
+  StringVector     cartoVector;
+  QStringList      cartoList;
+
+  SpacingType nativeSpacing( GetNativeSpacing() );
+
+  // physical coordinates to index (at resol 0)
+  IndexType currentIndex;
+
+  currentIndex[ 0 ]
+    = static_cast< unsigned int >(
+      ( point[ 0 ] - GetOrigin()[ 0 ] ) / nativeSpacing[ 0 ]
+    );
+
+  currentIndex[ 1 ] =
+    static_cast< unsigned int >(
+      ( point[ 1 ] - GetOrigin()[ 1 ] ) / nativeSpacing[ 1 ]
+    );
+
+  bool isInsideNativeLargestRegion =
+    GetNativeLargestRegion().IsInside( currentIndex );
+
+  emit CurrentIndexUpdated( currentIndex, isInsideNativeLargestRegion );
+
+  //
+  // Display the radiometry of the displayed channels
+  VectorImageSettings::ChannelVector rgb;
+  GetSettings().GetSmartChannels( rgb );
+
+  // show the current pixel description only if the mouse cursor is
+  // under the image
+  if( isInsideNativeLargestRegion || 1 )
+    {   
+    //
+    // get the physical coordinates
+    if (!ToImage()->GetProjectionRef().empty())
+      {
+      cartoVector.push_back(ToStdString(tr("Cartographic")));
+      }
+    else
+      {
+      //No cartographic info available
+      cartoVector.push_back(ToStdString(tr("Physical")));
+      }
+
+    ossPhysicalX << point[ 0 ];
+    ossPhysicalY << point[ 1 ];
+
+    cartoVector.push_back(ossPhysicalX.str());
+    cartoVector.push_back(ossPhysicalY.str());
+
+    // index in current Lod image
+    IndexType currentLodIndex;
+    currentLodIndex[0] = (point[ 0 ] - ToImage()->GetOrigin()[0]) / ToImage()->GetSpacing()[0];
+    currentLodIndex[1] = (point[ 1 ] - ToImage()->GetOrigin()[1]) / ToImage()->GetSpacing()[1];
+    
+    //
+    // get the LatLong
+    
+    if (!ToImage()->GetProjectionRef().empty()) 
+      {
+      geoVector.push_back(ToStdString(tr("Geographic(exact)")));
+      }
+    else if (ToImage()->GetImageKeywordlist().GetSize() != 0)
+      {
+      geoVector.push_back(ToStdString(tr("Geographic(sensor model)")));
+      }
+    else
+      {
+      geoVector.push_back(ToStdString(tr("No geoinfo")));
+      }
+
+    if( ToImage()->GetLargestPossibleRegion().IsInside(currentLodIndex) || 1 )
+      {
+      // TODO : Is there a better method to detect no geoinfo available ?
+      if (!ToImage()->GetProjectionRef().empty() || ToImage()->GetImageKeywordlist().GetSize() != 0) 
+        {
+	assert( !m_ToWgs84.IsNull() );
+
+        PointType wgs84;
+
+        wgs84 = m_ToWgs84->TransformPoint( point );
+      
+        ossGeographicLong.precision(6);
+        ossGeographicLat.precision(6);
+        
+        ossGeographicLong << std::fixed << wgs84[0];
+        ossGeographicLat << std::fixed << wgs84[1];
+
+        geoVector.push_back(ossGeographicLong.str());
+        geoVector.push_back(ossGeographicLat.str());
+      
+        double elev = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(wgs84[0],wgs84[1]);
+
+        if(elev > -32768)
+          {
+          ossGeographicElevation << elev;
+          geoVector.push_back(ossGeographicElevation.str());
+          }
+        else
+          geoVector.push_back( "" );
+        }
+      else
+        {
+        //No geoinfo available
+        geoVector.push_back("");
+        geoVector.push_back("");
+        geoVector.push_back("");
+        }
+      }
+    /*
+    else
+      {
+      //handle here the case of QL information display. It 
+      //displays geographic info when the user is scrolling over the QL
+      //
+      // compute the current ql index
+
+      if (!ToImage()->GetProjectionRef().empty() || ToImage()->GetImageKeywordlist().GetSize() != 0) 
+        {
+      currentLodIndex[0] = (Xpc - GetQuicklookModel()->ToImage()->GetOrigin()[0]) 
+        / GetQuicklookModel()->ToImage()->GetSpacing()[0];
+      currentLodIndex[1] = (Ypc - GetQuicklookModel()->ToImage()->GetOrigin()[1]) 
+        / GetQuicklookModel()->ToImage()->GetSpacing()[1];
+
+       PointType wgs84;
+       PointType currentLodPoint;
+       GetQuicklookModel()->ToImage()->TransformIndexToPhysicalPoint(currentLodIndex, currentLodPoint);
+       wgs84 = GetGenericRSTransform()->TransformPoint(currentLodPoint);
+      
+       ossGeographicLong.precision(6);
+       ossGeographicLat.precision(6);
+       
+       ossGeographicLong << std::fixed << wgs84[0];
+       ossGeographicLat << std::fixed << wgs84[1];
+
+       //Update geovector with location over QL index
+       geoVector.push_back(ossGeographicLong.str());
+       geoVector.push_back(ossGeographicLat.str());
+      
+       double elev = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(wgs84[0],wgs84[1]);
+
+       if(elev > -32768)
+         {
+         ossGeographicElevation << elev;
+         geoVector.push_back(ossGeographicElevation.str());
+         }
+        }
+      else
+        {
+        //No geoinfo available
+        geoVector.push_back("");
+        geoVector.push_back("");
+        geoVector.push_back("");
+        }
+      }
+    */
+
+    cartoList = ToQStringList( cartoVector );
+    geoList = ToQStringList( geoVector );
+
+    if( true /* ToImage()->GetBufferedRegion().IsInside(currentLodIndex) */ )
+      {
+      /*
+      //
+      // get the pixel at current index
+      currentPixel = ToImage()->GetPixel(currentLodIndex);
+      */
+
+      ossRadio << ToStdString( tr( "Radiometry: [ " ) );
+
+#if USE_RGB_CHANNELS_LIMIT
+      for( unsigned int i=0; i<pixel.GetSize(); ++i )
+        ossRadio << pixel.GetElement( i ) << " ";
+#else
+      for (unsigned int idx = 0; idx < rgb.size(); idx++)
+        {
+        ossRadio << pixel.GetElement(rgb[idx]) << " ";
+        }
+#endif
+
+      ossRadio << "]";
+
+      // qDebug() << ossRadio.str().c_str();
+      }
+    /*
+    else
+      {
+      //
+      // compute the current ql index
+      currentLodIndex[0] = (Xpc - GetQuicklookModel()->ToImage()->GetOrigin()[0]) 
+        / GetQuicklookModel()->ToImage()->GetSpacing()[0];
+      currentLodIndex[1] = (Ypc - GetQuicklookModel()->ToImage()->GetOrigin()[1]) 
+        / GetQuicklookModel()->ToImage()->GetSpacing()[1];
+    
+      //
+      // Get the radiometry form the Ql
+      if ( GetQuicklookModel()->ToImage()->GetBufferedRegion().IsInside(currentLodIndex) )
+        {
+        currentPixel = 
+          GetQuicklookModel()->ToImage()->GetPixel(currentLodIndex);
+
+        ossRadio <<"Ql [ ";
+        for (unsigned int idx = 0; idx < rgb.size(); idx++)
+          {
+          ossRadio <<currentPixel.GetElement(rgb[idx]) << " ";
+          }
+        ossRadio <<"]";
+        }
+      }
+    */
+    }
+
+  // update band name for the current position 
+  bandNames = GetBandNames( true );
+
+    // qDebug() << bandNames;
+
+#if USE_RGB_CHANNELS_LIMIT
+  stringList
+    << bandNames.at( rgb[ RGBW_CHANNEL_RED ] )
+    << bandNames.at( rgb[ RGBW_CHANNEL_GREEN ] )
+    << bandNames.at( rgb[ RGBW_CHANNEL_BLUE ] );
+
+  // qDebug() << "Bands:" << stringList;
+#endif
+
+  // update the status bar
+  emit CurrentPhysicalUpdated( cartoList );
+  emit CurrentGeographicUpdated( geoList );
+  emit CurrentRadioUpdated( ToQString( ossRadio.str().c_str() ) );
+#if USE_RGB_CHANNELS_LIMIT
+  emit CurrentPixelValueUpdated( pixel,  stringList );
+#else
+  emit CurrentPixelValueUpdated( pixel,  bandNames );
+#endif
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageSettings.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageSettings.cxx
new file mode 100644
index 0000000..0cc0091
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageSettings.cxx
@@ -0,0 +1,292 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdVectorImageSettings.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTextStream.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::VectorImageSettings
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+VectorImageSettings
+::VectorImageSettings() :
+  m_RgbChannels(),
+  m_RgbDynamicsParams( 6 ),
+  m_IsGrayscaleActivated( false ),
+  m_GrayChannel( 0 ),
+  m_GrayDynamicsParams( 6 ),
+  m_Gamma( 1.0 )
+{
+  m_RgbDynamicsParams.Fill( 0 );
+  m_GrayDynamicsParams.Fill( 0 );
+}
+
+/***************************************************************************/
+VectorImageSettings
+::VectorImageSettings( const VectorImageSettings & other ) :
+  m_RgbChannels( other.m_RgbChannels ),
+  m_RgbDynamicsParams( other.m_RgbDynamicsParams ),
+  m_IsGrayscaleActivated( other.m_IsGrayscaleActivated ),
+  m_GrayChannel( other.m_GrayChannel ),
+  m_GrayDynamicsParams( 6 ),
+  m_Gamma( other.m_Gamma )
+{
+}
+
+/*****************************************************************************/
+VectorImageSettings
+::~VectorImageSettings()
+{
+}
+
+/*****************************************************************************/
+VectorImageSettings::ChannelVector::value_type
+VectorImageSettings
+::GetRgbwChannel( RgbwChannel channel ) const
+{
+  switch( channel )
+    {
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+      return m_RgbChannels[ channel ];
+      break;
+
+    case RGBW_CHANNEL_WHITE:
+      return m_GrayChannel;
+      break;
+
+    default:
+      throw std::invalid_argument(
+        ToStdString(
+          QCoreApplication::translate(
+            "mvd::VectorImageSettings",
+            "Invalid argument: %1 ('%2')"
+          )
+          .arg( channel )
+          .arg( RGBW_CHANNEL_NAMES[ channel ] )
+        )
+      );
+      break;
+    }
+}
+
+/*****************************************************************************/
+void
+VectorImageSettings
+::SetLowIntensity( RgbwChannel channel, ParametersType::ValueType intensity )
+{
+  switch( channel )
+    {
+    case RGBW_CHANNEL_RGB:
+      SetRgbDynamicsParam( 2 * RGBW_CHANNEL_RED, intensity );
+      SetRgbDynamicsParam( 2 * RGBW_CHANNEL_GREEN, intensity );
+      SetRgbDynamicsParam( 2 * RGBW_CHANNEL_BLUE, intensity );
+      break;
+
+    case RGBW_CHANNEL_WHITE:
+      SetGrayDynamicsParam( 0, intensity );
+      break;
+
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+      SetRgbDynamicsParam( 2 * channel, intensity );
+      break;
+
+    default:
+      throw std::invalid_argument(
+	ToStdString(
+	  QCoreApplication::translate(
+            "mvd::VectorImageSettings",
+            "Invalid argument: %1 ('%2')"
+          )
+	  .arg( channel )
+	  .arg( RGBW_CHANNEL_NAMES[ channel ] )
+	)
+      );
+      break;
+    }
+}
+
+/*****************************************************************************/
+ParametersType::ValueType
+VectorImageSettings
+::GetLowIntensity( RgbwChannel channel ) const
+{
+  switch( channel )
+    {
+    case RGBW_CHANNEL_RGB:
+      {
+      ParametersType::ValueType r =
+	GetRgbDynamicsParam( 2 * RGBW_CHANNEL_RED );
+
+      ParametersType::ValueType g =
+	GetRgbDynamicsParam( 2 * RGBW_CHANNEL_GREEN );
+
+      ParametersType::ValueType b =
+	GetRgbDynamicsParam( 2 * RGBW_CHANNEL_BLUE );
+
+      return (r + g + b) / 3;
+      }
+      break;
+
+    case RGBW_CHANNEL_WHITE:
+      return GetGrayDynamicsParam( false );
+      break;
+
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+      return GetRgbDynamicsParam( 2 * channel );
+      break;
+
+    default:
+      throw std::invalid_argument(
+	ToStdString(
+	  QCoreApplication::translate(
+            "mvd::VectorImageSettings",
+            "Invalid argument: %1 ('%2')"
+          )
+	  .arg( channel )
+	  .arg( RGBW_CHANNEL_NAMES[ channel ] )
+	)
+      );
+      break;
+    }
+}
+
+/*****************************************************************************/
+void
+VectorImageSettings
+::SetHighIntensity( RgbwChannel channel, ParametersType::ValueType intensity )
+{
+  switch( channel )
+    {
+    case RGBW_CHANNEL_RGB:
+      SetRgbDynamicsParam( 1 + 2 * RGBW_CHANNEL_RED, intensity );
+      SetRgbDynamicsParam( 1 + 2 * RGBW_CHANNEL_GREEN, intensity );
+      SetRgbDynamicsParam( 1 + 2 * RGBW_CHANNEL_BLUE, intensity );
+      break;
+
+    case RGBW_CHANNEL_WHITE:
+      SetGrayDynamicsParam( 1, intensity );
+      break;
+
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+      SetRgbDynamicsParam( 1 + 2 * channel, intensity );
+      break;
+
+    default:
+      assert( false );
+      break;
+    }
+}
+
+/*****************************************************************************/
+ParametersType::ValueType
+VectorImageSettings
+::GetHighIntensity( RgbwChannel channel ) const
+{
+  switch( channel )
+    {
+    case RGBW_CHANNEL_RGB:
+      {
+      ParametersType::ValueType r =
+	GetRgbDynamicsParam( 1+ 2*RGBW_CHANNEL_RED );
+
+      ParametersType::ValueType g =
+	GetRgbDynamicsParam( 1+ 2*RGBW_CHANNEL_GREEN );
+
+      ParametersType::ValueType b =
+	GetRgbDynamicsParam( 1+ 2*RGBW_CHANNEL_BLUE );
+
+      return (r + g + b) / 3;
+      }
+      break;
+
+    case RGBW_CHANNEL_WHITE:
+      return GetGrayDynamicsParam( 1 );
+      break;
+
+    case RGBW_CHANNEL_RED:
+    case RGBW_CHANNEL_GREEN:
+    case RGBW_CHANNEL_BLUE:
+      return GetRgbDynamicsParam( 1 + 2 * channel );
+      break;
+
+    default:
+      throw std::invalid_argument(
+	ToStdString(
+	  QCoreApplication::translate(
+            "mvd::VectorImageSettings",
+            "Invalid argument: %1 ('%2')"
+          )
+	  .arg( channel )
+	  .arg( RGBW_CHANNEL_NAMES[ channel ] )
+	)
+      );
+      break;
+    }
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVisibleInterface.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVisibleInterface.cxx
new file mode 100644
index 0000000..4fc8875
--- /dev/null
+++ b/Modules/Visualization/MonteverdiCore/src/mvdVisibleInterface.cxx
@@ -0,0 +1,91 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdVisibleInterface.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::VisibleInterface
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+VisibleInterface
+::VisibleInterface( bool isVisible ) :
+  m_IsVisible( isVisible )
+{
+}
+
+/*******************************************************************************/
+VisibleInterface
+::~VisibleInterface()
+{
+}
+
+/*******************************************************************************/
+void
+VisibleInterface
+::virtual_SignalVisibilityChanged( bool )
+{
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/CMakeLists.txt
new file mode 100644
index 0000000..73d8b00
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/CMakeLists.txt
@@ -0,0 +1,10 @@
+project( OTBMonteverdiGUI )
+
+set( OTBMonteverdiGUI_LIBRARIES OTBMonteverdiGUI )
+
+# folder where ui headers are generated
+set( OTBMonteverdiGUI_INCLUDE_DIRS
+  ${OTBMonteverdiGUI_BINARY_DIR}/src
+  )
+
+otb_module_impl()
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdAboutDialog.h b/Modules/Visualization/MonteverdiGui/include/mvdAboutDialog.h
new file mode 100644
index 0000000..45a2320
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdAboutDialog.h
@@ -0,0 +1,111 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAboutDialog_h
+#define mvdAboutDialog_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class AboutDialog;
+}
+
+/** \class AboutDialog
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ */
+class OTBMonteverdiGUI_EXPORT AboutDialog :
+    public QDialog
+{
+  Q_OBJECT;
+
+//
+// Public methods.
+public:
+
+  /** Constructor */
+  AboutDialog( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** Destructor */
+  ~AboutDialog() ITK_OVERRIDE;
+
+//
+// SIGNALS.
+signals:
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  Ui::AboutDialog* m_UI;
+
+//
+// SLOTS.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+#endif // mvdAboutDialog_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdAbstractDragAndDropEventFilter.h b/Modules/Visualization/MonteverdiGui/include/mvdAbstractDragAndDropEventFilter.h
new file mode 100644
index 0000000..95a09b5
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdAbstractDragAndDropEventFilter.h
@@ -0,0 +1,172 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractDragAndDropEventFilter_h
+#define mvdAbstractDragAndDropEventFilter_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class AbstractDragAndDropEventFilter
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT AbstractDragAndDropEventFilter :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  ~AbstractDragAndDropEventFilter() ITK_OVERRIDE;
+
+  //
+  // QObject overloads.
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qobject.html#eventFilter
+   */
+  bool eventFilter( QObject* watched, QEvent* event ) ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  AbstractDragAndDropEventFilter( QObject* p =NULL );
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragEnterEvent
+   */
+  virtual bool DragEnterEvent( QObject* object, QDragEnterEvent* event ) =0;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragLeaveEvent
+   */
+  virtual bool DragLeaveEvent( QObject* object, QDragLeaveEvent* event ) =0;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragMoveEvent
+   */
+  virtual bool DragMoveEvent( QObject* object, QDragMoveEvent* event ) =0;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dropEvent
+   */
+  virtual bool DropEvent( QObject* object, QDropEvent* event ) =0;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdAbstractDragAndDropEventFilter_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewManipulator.h b/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewManipulator.h
new file mode 100644
index 0000000..32b2470
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewManipulator.h
@@ -0,0 +1,305 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractImageViewManipulator_h
+#define mvdAbstractImageViewManipulator_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+#include "mvdAbstractImageViewRenderer.h"
+#include "mvdGui.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class AbstractImageViewManipulator
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ *  \brief Base class for QWidget manipulation
+ */
+class OTBMonteverdiGUI_EXPORT AbstractImageViewManipulator :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Destructor. */
+  ~AbstractImageViewManipulator() ITK_OVERRIDE {};
+
+  //
+  // Accessors
+
+  /**
+   */
+  virtual void SetViewportSize( int width, int height ) =0;
+  /**
+   */
+  virtual SizeType GetViewportSize() const =0;
+
+  /**
+   */
+  virtual void SetOrigin( const PointType& origin ) =0;
+  /**
+   */
+  virtual PointType GetOrigin() const =0;
+
+  /**
+   */
+  virtual void SetSpacing( const SpacingType& spacing ) =0;
+  /**
+   */
+  virtual SpacingType GetSpacing() const =0;
+
+  /**
+   */
+  virtual void SetNativeSpacing( const SpacingType& spacing ) =0;
+
+  /**
+   */
+  virtual void SetWkt( const std::string& wkt ) =0;
+
+  /**
+   */
+  virtual
+    void SetKeywordList( const DefaultImageType::ImageKeywordlistType& kwl ) =0;
+
+  /**
+   */
+  virtual PointType GetCenter() const =0;
+
+  /**
+   */
+  virtual ZoomType GetFixedZoomType() const =0;
+
+  //
+  // Controls
+
+  /**
+   */
+  virtual
+    void
+    SetupRenderingContext(
+      AbstractImageViewRenderer::RenderingContext * const ) const =0;
+
+  /**
+   */
+  virtual void ZoomIn() =0;
+
+  /**
+   */
+  virtual void ZoomOut() =0;
+
+  /**
+   */
+  virtual const PointType& Transform( PointType&, const QPoint& ) const =0;
+
+  //
+  // Events
+
+  /**
+   */
+  virtual void MouseMoveEvent( QMouseEvent* event ) =0;
+  /**
+   */
+  virtual void MousePressEvent( QMouseEvent* event ) =0;
+  /**
+   */
+  virtual void MouseReleaseEvent( QMouseEvent* event ) =0;
+  /**
+   */
+  virtual void MouseDoubleClickEvent( QMouseEvent * ) {};
+
+  /**
+   */
+  virtual void WheelEvent( QWheelEvent* event) =0;
+
+  /**
+   */
+  virtual void KeyPressEvent( QKeyEvent* event ) =0;
+
+  /**
+   */
+  virtual void KeyReleaseEvent( QKeyEvent* event ) =0;
+
+  /**
+   */
+  virtual void ResizeEvent( QResizeEvent* event ) =0;
+
+  /**
+   */
+  virtual void ResetViewport() =0;
+
+//
+// Public SLOTS.
+public slots:
+  /**
+   */
+  virtual void CenterOn( const PointType& point ) =0;
+  /**
+   */
+  virtual void ZoomTo( double scale ) =0;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+  /**
+   */
+  void RefreshViewRequested();
+  /**
+   */
+  void ZoomToExtentRequested();
+  /**
+   */
+  void ZoomToFullResolutionRequested();
+  /**
+   */
+  void CenterRoiRequested( const PointType& center );
+  /**
+   */
+  void RoiChanged( const PointType& origin,
+                   const SizeType& size,
+                   const SpacingType& spacing,
+                   const PointType& center );
+
+  // Signal for DatasetModel
+  // void RenderingContextChanged(const PointType& center, double zoom);
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected types.
+protected:
+  /** Navigation context  */
+  struct NavigationContext
+  {
+    /**
+     * \brief Constructor.
+     *
+     * Default constructor (safely) initializes POD (Plain Old Data)
+     * structure.
+     */
+    NavigationContext()
+    {
+    }
+  };
+
+  /** Mouse context */
+  struct MouseContext
+  {
+    /**
+     * \brief Default constructor.
+     */
+    MouseContext()
+    {
+    }
+  };
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  AbstractImageViewManipulator( QObject* p =NULL ):QObject( p ){};
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// SLOTS.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdAbstractImageViewManipulator_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h b/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h
new file mode 100644
index 0000000..c2930c3
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdAbstractImageViewRenderer.h
@@ -0,0 +1,526 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractImageViewRenderer_h
+#define mvdAbstractImageViewRenderer_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdStackedLayerModel.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+class AbstractLayerModel;
+class StackedLayerModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class AbstractImageViewRenderer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief TODO.
+ */
+class OTBMonteverdiGUI_EXPORT AbstractImageViewRenderer :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  /**
+   */
+  struct RenderingContext
+  {
+    /**
+     */
+    inline
+    RenderingContext() :
+      m_RenderMode( RENDER_MODE_FULL )
+    {
+    }
+
+    /**
+     */
+    virtual ~RenderingContext() {}
+
+    /**
+     */
+    enum RenderMode
+    {
+      RENDER_MODE_LIGHT = 0,
+      RENDER_MODE_FULL
+    };
+
+    RenderMode m_RenderMode;
+  };
+
+//
+// Public methods.
+public:
+  /**
+   * Destructor.
+   */
+  ~AbstractImageViewRenderer() ITK_OVERRIDE{};
+
+  /**
+   */
+  inline void SetLayerStack( StackedLayerModel * );
+
+  /**
+   */
+  inline const StackedLayerModel * GetLayerStack() const;
+
+  /**
+   */
+  inline StackedLayerModel * GetLayerStack();
+
+  /**
+   */
+  virtual bool CheckGLCapabilities( int * ) =0;
+
+  template< typename T >
+  const T * GetReferenceModel() const;
+
+  template< typename T >
+  T * GetReferenceModel();
+
+  /**
+   */
+  virtual const AbstractLayerModel * GetReferenceModel() const =0;
+
+  /**
+   */
+  virtual AbstractLayerModel * GetReferenceModel() =0;
+
+  /**
+   */
+  virtual void GetLayerExtent( const StackedLayerModel::KeyType & key,
+                               PointType& origin,
+                               PointType& extent ) const =0;
+
+  /**
+   */
+  virtual void GetReferenceExtent( PointType& origin,
+                                   PointType& extent ) const =0;
+
+  /**
+   */
+  virtual void GetViewExtent( PointType& origin,
+                              PointType& extent ) const =0;
+
+  /**
+   */
+  virtual bool GetLayerDynamics( const StackedLayerModel::KeyType & key,
+				 ParametersType & params,
+				 bool isGlobal ) const =0;
+
+  /**
+   */
+  virtual
+    AbstractImageViewRenderer::RenderingContext* NewRenderingContext() const =0;
+
+  /**
+   */
+  virtual void InitializeGL() =0;
+
+  /**
+   */
+  virtual void ResizeGL( int width, int height ) =0;
+
+  /**
+   */
+  virtual void PaintGL( RenderingContext const * context ) =0;
+
+  /**
+   */
+  virtual void Pick( const PointType & view,
+                     PixelInfo::Vector & pixels ) const = 0;
+
+  /**
+   */
+  virtual void GetResolutions( PixelInfo::Vector & pixels ) const =0;
+
+  /**
+   */
+  virtual bool TransformToView( PointType & point,
+				const StackedLayerModel::KeyType &,
+				const IndexType &,
+				bool isPhysical ) const =0;
+
+  /**
+   */
+  virtual void SaveScreenshot( const QString & ) const =0;
+
+  /**
+   */
+  inline bool SetBypassRenderingEnabled( bool );
+  /**
+   */
+  inline bool IsBypassRenderingEnabled() const;
+  /**
+   */
+  inline bool SetGLSLEnabled( bool );
+  /**
+   */
+  inline bool IsGLSLEnabled() const;
+  /**
+   */
+  virtual bool IsEffectsEnabled() const = 0;
+  /**
+   */
+  inline bool ZoomToRegion( const PointType & origin,
+			    const PointType & extent,
+			    PointType & center,
+			    SpacingType & spacing ) const;
+  /**
+   */
+  inline bool ZoomToExtent( PointType & center, SpacingType & spacing ) const;
+  /**
+   */
+  inline bool ZoomToLayer( const StackedLayerModel::KeyType & key,
+			   PointType & center,
+			   SpacingType & spacing ) const;
+  /**
+   */
+  inline bool ZoomToFull( const StackedLayerModel::KeyType & key,
+			  PointType & center,
+			  SpacingType & spacing ) const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+// public slots
+public slots:
+  inline void UpdateScene();
+  inline void RefreshScene();
+
+  virtual void UpdatePixelInfo( const QPoint & point,
+				const PointType & view,
+				const PixelInfo::Vector & pixels ) =0;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /**
+   * Constructor.
+   */
+  AbstractImageViewRenderer( QObject* p = NULL ) :
+    QObject( p ),
+    m_StackedLayerModel( NULL ),
+    m_BypassRenderingEnabled( false ),
+    m_GLSLEnabled( true )
+  {
+  }
+
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  // virtual void virtual_ClearScene() {};
+  /**
+   */
+  virtual void virtual_PrepareScene() {};
+  /**
+   */
+  virtual void virtual_UpdateScene() {};
+  /**
+   */
+  virtual void virtual_RefreshScene() {};
+  /**
+   */
+  // virtual void virtual_SetLayerStack( const StackedLayerModel & ) =0;
+  /**
+   */
+  virtual void virtual_FinishScene() {};
+
+  /**
+   */
+  virtual bool virtual_ZoomToRegion( const PointType &,
+				     const PointType &,
+				     PointType &,
+				     SpacingType & ) const
+  { return false; }
+  /**
+   */
+  virtual bool virtual_ZoomToExtent( PointType &, SpacingType & ) const
+  { return false; }
+  /**
+   */
+  virtual bool virtual_ZoomToLayer( const StackedLayerModel::KeyType &,
+				    PointType &,
+				    SpacingType & ) const
+  { return false; }
+  /**
+   */
+  virtual bool virtual_ZoomToFull( const StackedLayerModel::KeyType &,
+				   PointType &,
+				   SpacingType & ) const
+  { return false; }
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  StackedLayerModel * m_StackedLayerModel;
+  /**
+   */
+  bool m_BypassRenderingEnabled: 1;
+  /**
+   */
+  bool m_GLSLEnabled: 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// SLOTS.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+template< typename T >
+const T *
+AbstractImageViewRenderer
+::GetReferenceModel() const
+{
+  return dynamic_cast< const T * >( GetReferenceModel() );
+}
+
+/*****************************************************************************/
+template< typename T >
+T *
+AbstractImageViewRenderer
+::GetReferenceModel()
+{
+  return dynamic_cast< T * >( GetReferenceModel() );
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel *
+AbstractImageViewRenderer
+::GetLayerStack()
+{
+  return m_StackedLayerModel;
+}
+
+/*****************************************************************************/
+inline
+const StackedLayerModel *
+AbstractImageViewRenderer
+::GetLayerStack() const
+{
+  return m_StackedLayerModel;
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageViewRenderer
+::SetLayerStack( StackedLayerModel * stackedLayerModel )
+{
+  virtual_PrepareScene();
+
+  m_StackedLayerModel = stackedLayerModel;
+
+  virtual_UpdateScene();
+
+  virtual_FinishScene();
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::IsBypassRenderingEnabled() const
+{
+  return m_BypassRenderingEnabled;
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::SetBypassRenderingEnabled( bool isEnabled )
+{
+  bool bypass = m_BypassRenderingEnabled;
+
+  m_BypassRenderingEnabled = isEnabled;
+
+  return bypass;
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::IsGLSLEnabled() const
+{
+  return m_GLSLEnabled;
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::SetGLSLEnabled( bool isEnabled )
+{
+  bool wasEnabled = m_GLSLEnabled;
+
+  m_GLSLEnabled = isEnabled;
+
+  return wasEnabled;
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageViewRenderer
+::UpdateScene()
+{
+  virtual_PrepareScene();
+
+  virtual_UpdateScene();
+
+  virtual_FinishScene();
+}
+
+/*****************************************************************************/
+inline
+void
+AbstractImageViewRenderer
+::RefreshScene()
+{
+  virtual_RefreshScene();
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::ZoomToExtent( PointType & center, SpacingType & spacing ) const
+{
+  return virtual_ZoomToExtent( center, spacing );
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::ZoomToLayer( const StackedLayerModel::KeyType & key,
+	       PointType & center,
+	       SpacingType & spacing) const
+{
+  return virtual_ZoomToLayer( key, center, spacing );
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::ZoomToRegion( const PointType & origin,
+		const PointType & extent,
+		PointType & center,
+		SpacingType & spacing ) const
+{
+  return virtual_ZoomToRegion( origin, extent, center, spacing );
+}
+
+/*****************************************************************************/
+inline
+bool
+AbstractImageViewRenderer
+::ZoomToFull( const StackedLayerModel::KeyType & key,
+	      PointType & center,
+	      SpacingType & spacing ) const
+{
+  return virtual_ZoomToFull( key, center, spacing );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdAbstractImageViewRenderer_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdAbstractModelController.h b/Modules/Visualization/MonteverdiGui/include/mvdAbstractModelController.h
new file mode 100644
index 0000000..acda4b3
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdAbstractModelController.h
@@ -0,0 +1,319 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdAbstractModelController_h
+#define mvdAbstractModelController_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class AbstractModelController
+ *
+ * \ingroup OTBMonteverdiGUI
+ */
+class OTBMonteverdiGUI_EXPORT AbstractModelController :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+
+  /** Destructor */
+  ~AbstractModelController() ITK_OVERRIDE;
+
+  /** */
+  void SetModel( AbstractModel* );
+
+  /** */
+  inline const AbstractModel* GetModel() const;
+
+  /** */
+  inline AbstractModel* GetModel();
+
+  /** */
+  template< typename TModel >
+  inline const TModel* GetModel() const;
+
+  /** */
+  template< typename TModel >
+  inline TModel* GetModel();
+
+  /** */
+  inline const QWidget* GetWidget() const;
+
+  /** */
+  inline QWidget* GetWidget();
+
+  /** */
+  template< typename TWidget >
+  inline const TWidget* GetWidget() const;
+
+  /** */
+  template< typename TWidget >
+  inline TWidget* GetWidget();
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Slots.
+public slots:
+
+  /**
+   */
+  void ResetWidget();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void AboutToDisconnectModel( AbstractModel* );
+
+  /**
+   */
+  void ModelDisconnected( AbstractModel* );
+
+  /**
+   */
+  void AboutToConnectModel( AbstractModel* );
+
+  /**
+   */
+  void ModelConnected( AbstractModel* );
+
+  /**
+   */
+  void ModelUpdated();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** Constructor */
+  AbstractModelController( QWidget* widget, QObject* p =NULL );
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  void private_Connect( AbstractModel* );
+
+  /**
+   */
+  void private_Disconnect( AbstractModel* );
+
+  /**
+   */
+  void private_ClearWidget();
+
+  /**
+   */
+  virtual void Connect( AbstractModel* ) =0;
+
+  /**
+   */
+  virtual void Disconnect( AbstractModel* ) =0;
+
+  /**
+   */
+  virtual void ClearWidget() =0;
+
+  /**
+   */
+  virtual void virtual_ResetWidget( bool ) =0;
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  QWidget* m_Widget;
+
+  /**
+   */
+  AbstractModel* m_Model;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   * Slot called before object is destroyed.
+   * It is used to disconnect model from controller when controller is
+   * destroyed. This prevents the indirect call the virtual
+   * Disconnect() method (which is dangerous in destructor).
+   */
+  void OnDestroyed( QObject* =0 );
+
+  /**
+   */
+  virtual void RefreshWidget();
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const AbstractModel*
+AbstractModelController
+::GetModel() const
+{
+  return m_Model;
+}
+
+/*****************************************************************************/
+inline
+AbstractModel*
+AbstractModelController
+::GetModel()
+{
+  return m_Model;
+}
+
+/*****************************************************************************/
+template< typename TModel >
+inline
+const TModel*
+AbstractModelController
+::GetModel() const
+{
+  return qobject_cast< const TModel* >( m_Model );
+}
+
+/*****************************************************************************/
+template< typename TModel >
+inline
+TModel*
+AbstractModelController
+::GetModel()
+{
+  return qobject_cast< TModel* >( m_Model );
+}
+
+/*****************************************************************************/
+inline
+const QWidget*
+AbstractModelController
+::GetWidget() const
+{
+  return m_Widget;
+}
+
+/*****************************************************************************/
+inline
+QWidget*
+AbstractModelController
+::GetWidget()
+{
+  return m_Widget;
+}
+
+/*****************************************************************************/
+template< typename TWidget >
+inline
+const TWidget*
+AbstractModelController
+::GetWidget() const
+{
+  return qobject_cast< const TWidget* >( m_Widget );
+}
+
+/*****************************************************************************/
+template< typename TWidget >
+inline
+TWidget*
+AbstractModelController
+::GetWidget()
+{
+  return qobject_cast< TWidget* >( m_Widget );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdAbstractModelController_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h b/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h
new file mode 100644
index 0000000..0b7314f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h
@@ -0,0 +1,181 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdApplicationLauncher_h
+#define mvdApplicationLauncher_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Wrapper
+{
+class QtWidgetView;
+}
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ApplicationLauncher
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiGUI_EXPORT ApplicationLauncher :
+    public QObject
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ApplicationLauncher( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~ApplicationLauncher() ITK_OVERRIDE;
+
+  /**
+   * \return A new instance of the automatically-generated widget of
+   * the given OTB application.
+   */
+  Wrapper::QtWidgetView *
+    NewOtbApplicationWidget( const QString & appName,
+                             bool isStandalone =false,
+			     QWidget * p =NULL,
+			     Qt::WindowFlags =0 ) const;
+
+  /**
+   */
+  QWidget * NewOtbApplicationWindow( const QString & appName,
+				     bool isStandalone =false,
+				     QWidget * p =NULL,
+				     Qt::WindowFlags =0 ) const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdApplicationLauncher_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h b/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h
new file mode 100644
index 0000000..d9938fb
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h
@@ -0,0 +1,197 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdApplicationsToolBox_h
+#define mvdApplicationsToolBox_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+
+
+#define USE_ALGORITHM_ROOT_NODE 0
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ApplicationsToolBox;
+};
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ApplicationsToolBox
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT ApplicationsToolBox :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ApplicationsToolBox( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~ApplicationsToolBox() ITK_OVERRIDE;
+
+  /** Get TreeWidget */
+  // QTreeWidget * GetAlgorithmsTree();
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+  void OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer& appsTags,
+                                           const ApplicationDocNameToNameMap& docNameToNameMap);
+  void OnSearchBoxChanged( const QString & search );
+  void OnAlgorithmTreeDoubleClick( QTreeWidgetItem * item , int column );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  void ApplicationToLaunchSelected(const QString &, const QString &);
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+  /**
+   * \brief fill the widget tree using the tags map
+   */
+  void FillTreeUsingTags();
+
+  /**
+   * \brief Launch the appName algorithm
+   */
+  void LaunchApplication( const QString& appName );
+
+  /**
+   * \brief Helper method to check if searchText matches any of the
+   * algorithms string contained in the map
+   */
+  bool IsSearchTextMatchAnyAlgorithm( const QString & tagName,
+				      const QString & search );
+
+  /**
+   * \brief Helper method to get the DocName of an application from an
+   * application name
+   */
+  QString GetApplicationDocNameByApplicationName( const QString & appName );
+
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::ApplicationsToolBox* m_UI;
+
+  /**
+   * \brief map storing applications and its tags
+   */
+  ApplicationsTagContainer m_AppTags;
+
+  /**
+   * \brief map storing applications docName and appName association
+   */
+  ApplicationDocNameToNameMap m_AppsDocNameToNameMap;
+
+  /**
+   * \brief text to search in the widget tree
+   */
+  QString m_SearchText;
+
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+} // end namespace 'mvd'
+
+#endif // mvdApplicationsToolBox_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBoxController.h b/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBoxController.h
new file mode 100644
index 0000000..329d389
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBoxController.h
@@ -0,0 +1,170 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdApplicationsToolBoxController_h
+#define mvdApplicationsToolBoxController_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractModelController.h"
+#endif //tag=QT4-boost-compatibility
+//#include "mvdGui.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class ApplicationsToolBox;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ApplicationsToolBoxController
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Color-setup widget controller for VectorImageModel objects.
+ */
+class OTBMonteverdiGUI_EXPORT ApplicationsToolBoxController :
+    public AbstractModelController
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param widget Controlled widget.
+   * \param parent Parent QObject of this QObject.
+   */
+  ApplicationsToolBoxController( ApplicationsToolBox* widget,
+			     QObject* p =NULL );
+
+  /**
+   * \brief Destructor.
+   */
+  ~ApplicationsToolBoxController() ITK_OVERRIDE;
+
+  /** Get the seleceted application Gui */
+  // QWidget * GetSelectedApplicationWidget(const QString& appName);
+
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // AbstractModelController methods.
+
+  void Connect( AbstractModel* ) ITK_OVERRIDE;
+
+  void ClearWidget() ITK_OVERRIDE;
+
+  void virtual_ResetWidget( bool ) ITK_OVERRIDE;
+
+  void Disconnect( AbstractModel* ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  void ResetDatasetTree();
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdApplicationsToolBoxController_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdColorBandDynamicsWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdColorBandDynamicsWidget.h
new file mode 100644
index 0000000..3a86a1a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdColorBandDynamicsWidget.h
@@ -0,0 +1,275 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdColorBandDynamicsWidget_h
+#define mvdColorBandDynamicsWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+class DoubleValidator;
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ColorBandDynamicsWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ColorBandDynamicsWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ */
+class OTBMonteverdiGUI_EXPORT ColorBandDynamicsWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /** */
+  Q_PROPERTY( RgbwChannel channelLabel
+	      READ GetChannelLabel
+	      WRITE SetChannelLabel );
+
+  /**
+   */
+  Q_PROPERTY( double minIntensity
+	      READ GetMinIntensity
+	      WRITE SetMinIntensity );
+
+  /**
+   */
+  Q_PROPERTY( double maxIntensity
+	      READ GetMaxIntensity
+	      WRITE SetMaxIntensity );
+
+  /**
+   */
+  Q_PROPERTY( double lowIntensity
+	      READ GetLowIntensity
+	      WRITE SetLowIntensity );
+
+  /**
+   */
+  Q_PROPERTY( double highIntensity
+	      READ GetHighIntensity
+	      WRITE SetHighIntensity );
+
+  /**
+   */
+  Q_PROPERTY( double lowQuantile
+	      READ GetLowQuantile
+	      WRITE SetLowQuantile );
+
+  /**
+   */
+  Q_PROPERTY( double highQuantile
+	      READ GetHighQuantile
+	      WRITE SetHighQuantile );
+
+  /**
+   */
+  Q_PROPERTY( bool isBounded
+	      READ IsBounded()
+	      WRITE SetBounded() );
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** Constructor */
+  ColorBandDynamicsWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** Destructor */
+  ~ColorBandDynamicsWidget() ITK_OVERRIDE;
+
+  /** */
+  RgbwChannel GetChannelLabel() const;
+
+  /** */
+  void SetChannelLabel( RgbwChannel );
+
+  /** */
+  double GetMinIntensity() const;
+  /** */
+  void SetMinIntensity( double );
+
+  /** */
+  double GetMaxIntensity() const;
+  /** */
+  void SetMaxIntensity( double );
+
+  /** */
+  double GetLowIntensity() const;
+  /** */
+  void SetLowIntensity( double );
+
+  /** */
+  double GetHighIntensity() const;
+  /** */
+  void SetHighIntensity( double );
+
+  /** */
+  double GetLowQuantile() const;
+  /** */
+  void SetLowQuantile( double );
+
+  /** */
+  double GetHighQuantile() const;
+  /** */
+  void SetHighQuantile( double );
+
+  /**
+   */
+  bool IsBounded() const;
+  /**
+   */
+  void SetBounded( bool enabled );
+  /**
+   */
+  void SetLinkButtonEnabled( bool );
+  /**
+   */
+  void SetDefaultsButtonEnabled( bool );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /** */
+  void LowQuantileChanged( RgbwChannel, double );
+  /** */
+  void HighQuantileChanged( RgbwChannel, double );
+  /** */
+  void LowIntensityChanged( RgbwChannel, double );
+  /** */
+  void HighIntensityChanged( RgbwChannel, double );
+
+  /** */
+  void ResetIntensityClicked( RgbwChannel );
+  /** */
+  void ResetQuantileClicked( RgbwChannel );
+  /** */
+  void ApplyAllClicked( RgbwChannel, double, double);
+
+  /**
+   */
+  void LinkToggled( RgbwChannel, bool );
+
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   * uic generated.
+   */
+  Ui::ColorBandDynamicsWidget* m_UI;
+
+  /**
+   */
+  DoubleValidator* m_LowIntensityValidator;
+
+  /**
+   */
+  DoubleValidator* m_HighIntensityValidator;
+
+  /** */
+  RgbwChannel m_Channel;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  void on_lowIntensityLineEdit_editingFinished();
+  void on_highIntensityLineEdit_editingFinished();
+
+  void on_lowQuantileSpinBox_valueChanged( double );
+  void on_highQuantileSpinBox_valueChanged( double );
+
+  void on_minMaxButton_clicked();
+  void on_defaultsButton_clicked();
+  void on_applyAllButton_clicked();
+
+  void on_linkButton_toggled( bool );
+};
+
+} // end namespace 'mvd'.
+
+#endif // mvdColorBandDynamicsWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsController.h b/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsController.h
new file mode 100644
index 0000000..7cad625
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsController.h
@@ -0,0 +1,399 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdColorDynamicsController_h
+#define mvdColorDynamicsController_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+//
+#include "mvdAbstractModelController.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class ColorDynamicsWidget;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ColorDynamicsController
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Color-dynamics widget controller for VectorImageModel objects.
+ */
+class OTBMonteverdiGUI_EXPORT ColorDynamicsController :
+    public AbstractModelController
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param widget Controlled widget.
+   * \param parent Parent QObject of this QObject.
+   */
+  ColorDynamicsController( ColorDynamicsWidget* widget, QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~ColorDynamicsController() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]-----------------------------------------------**/
+
+//
+// Slots.
+public slots:
+  /**
+   * \brief Slot called when the band-index of a RGB channel has
+   * changed.
+   *
+   * \param channel The RGB channel for which the band-index has changed.
+   * \param band The new band-index of the RGB channel.
+   */
+  void OnRgbChannelIndexChanged( RgbwChannel channel, int band );
+
+  /**
+   * \brief Slot called when the band-index of the white (gray)
+   * channel has changed.
+   *
+   * \param band The new band-index of the white (gray) channel.
+   */
+  void OnGrayChannelIndexChanged( int band );
+
+  /**
+   * \brief Slot called when the activation-state of the
+   * grayscale-mode has changed.
+   *
+   * \param activated The new grayscale-mode activation state.
+   */
+  void OnGrayscaleActivated( bool activated );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   * \brief
+   */
+  void LowIntensityChanged( RgbwChannel channel, double value, bool refresh );
+
+  /**
+   * \brief
+   */
+  void HighIntensityChanged( RgbwChannel channel, double value, bool refresh );
+
+  /**
+   */
+  void HistogramRefreshed();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  //
+  // AbstractModelController methods.
+
+  void Connect( AbstractModel* ) ITK_OVERRIDE;
+
+  void ClearWidget() ITK_OVERRIDE;
+
+  void virtual_ResetWidget( bool ) ITK_OVERRIDE;
+
+  void Disconnect( AbstractModel* ) ITK_OVERRIDE;
+
+  /**
+   * \brief Reset intensity ranges to default values for given RGB
+   * channels.
+   *
+   * \param channels Given channels for which to reset current-band
+   * index. \see RgbBound() for valid values.
+   */
+  void ResetIntensityRanges( RgbwChannel );
+
+  /**
+   * \brief Reset low and high intensities to default values for given
+   * RGB channels.
+   *
+   * \param channels Given channels for which to reset current-band
+   * index. \see RgbBound() for valid values.
+   */
+  void ResetIntensities( RgbwChannel );
+
+  /**
+   * \brief Set low and high intensitied of controlled widget based on
+   * the values stored in the model settings.
+   *
+   * \param channels RGB/W channels for which to set low and hight intensities.
+   */
+  void SetIntensities( RgbwChannel channels );
+
+  /**
+   * \brief Reset low and high quantiles to default values for given
+   * RGB channels.
+   *
+   * \param channels Given channels for which to reset current-band
+   * index. \see RgbBound() for valid values.
+   */
+  void ResetQuantiles( RgbwChannel channels );
+
+  /**
+   * \brief Restore low and high intensities from quantile values
+   * stored in widget when enabling intensity-range bounds again.
+   *
+   * \param channels Channels for which to reset intensities.
+   */
+  void RestoreQuantiles( RgbwChannel channels );
+
+  /**
+   * \brief Convenience method used to compute integer indices in order
+   * to iterate through RGB channels such as, for example:
+   * \code
+   * for( i=begin; i<end; ++i ) {}
+   * \endcode
+   *
+   * \see mvd::RgbwBounds().
+   *
+   * \param begin    The resulting first index where to begin iteration.
+   * \param end      The resulting upper-boundary index of the iteration.
+   * \param channels The channels to be iterated. Valid values are:
+   * _ RGBA_CHANNEL_NONE to select no video-channel at all;
+   * - RGBA_CHANNEL_RED to select red video-channel;
+   * - RGBA_CHANNEL_GREEN to select green video-channel;
+   * - RGBA_CHANNEL_BLUE to select blue video-channel;
+   * - RGBA_CHANNEL_WHITE is equivalent to RGBA_CHANNEL_RGB;
+   * - RGBA_CHANNEL_RGB to select all RGB video-channels;
+   * - RGBA_CHANNEL_ALL to select all RGB (without the alpha) video-channels.
+   *
+   * \return true if iteration indices have been set and loop can be
+   * processed.
+   */
+  inline
+    static bool RgbwBounds( CountType& begin,
+			    CountType& end,
+			    RgbwChannel channels );
+
+  /**
+   */
+  void SetNoData();
+
+  /**
+   */
+  void SetGamma();
+
+  /**
+   */
+  void SetBoundsEnabled( RgbwChannel, bool );
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void RefreshHistogram();
+
+  /**
+   * \brief Slot called when low quantile value of a RGB channel has
+   * been edited.
+   *
+   * \param channel RGB channel for which the quantile value has
+   * changed.
+   * \param quantile The new quantile value.
+   */
+  void OnLowQuantileChanged( RgbwChannel channel, double quantile );
+
+  /**
+   * \brief Slot called when high quantile value of a RGB channel has
+   * been edited.
+   *
+   * \param channel RGB channel for which the quantile value has
+   * changed.
+   * \param quantile The new quantile value.
+   */
+  void OnHighQuantileChanged( RgbwChannel channel, double quantile );
+
+  /**
+   * \brief Slot called when low intensity value of a RGB channel has
+   * been edited.
+   *
+   * \param channel RGB channel for which the intensity value has
+   * changed.
+   * \param intensity The new intensity value.
+   */
+  void OnLowIntensityChanged( RgbwChannel channel, double intensity );
+
+  /**
+   * \brief Slot called when high intensity value of a RGB channel has
+   * been edited.
+   *
+   * \param channel RGB channel for which the intensity value has
+   * changed.
+   * \param intensity The new intensity value.
+   */
+  void OnHighIntensityChanged( RgbwChannel channel, double intensity );
+
+  /**
+   * \brief Slot called when the reset intensities button has been
+   * clicked.
+   *
+   * \param channel RGB channel for which to reset low and high
+   * intensities.
+   */
+  void OnResetIntensityClicked( RgbwChannel channel );
+
+  /**
+   * \brief Slot called when the reset quantiles button has been
+   * clicked.
+   *
+   * \param channel RGB channel for which to reset low and high
+   * quantiles.
+   */
+  void OnResetQuantileClicked( RgbwChannel channel );
+
+  /**
+   * \brief Slot called when the apply all button has been clicked.
+   *
+   * \param channel RGB channel for which to reset low and high
+   * quantiles.
+   */
+  void OnApplyAllClicked( RgbwChannel channel, double low, double high );
+
+  /**
+   * \brief Slot called when the NoDataFlagToggled() signal of the
+   * controlled widget has been emitted (\see ColorDynamicsWidget).
+   *
+   * \param enabled true when the no-data flag is enabled.
+   */
+  void OnNoDataFlagToggled( bool enabled );
+
+  /**
+   * \brief Slot called when the NoDataValueChanged() signal of the
+   * controlled widget has been emitted (\see ColorDynamicsWidget).
+   */
+  void OnNoDataValueChanged( double value );
+
+  /**
+   * \brief Slot called when the link button has been toggled.
+   *
+   * \param channel RGB channel for which the link button has been toggled.
+   * \param checked The state of the button.
+   */
+  void OnLinkToggled( RgbwChannel channel, bool checked );
+
+
+  /**
+   * \brief Slot called when gamma value is changed
+   *
+   * \param value Gamma value.
+   */
+  void OnGammaValueChanged( double value );
+
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*******************************************************************************/
+inline
+bool
+ColorDynamicsController
+::RgbwBounds( CountType& begin, CountType& end, RgbwChannel channels )
+{
+#if 0
+  return mvd::RgbBounds(
+    begin, end,
+    channels==RGBW_CHANNEL_WHITE
+    ? RGBW_CHANNEL_RGB
+    : channels
+  );
+#else
+  return mvd::RgbwBounds( begin, end, channels );
+#endif
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdColorDynamicsController_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h
new file mode 100644
index 0000000..3182a3e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdColorDynamicsWidget.h
@@ -0,0 +1,373 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdColorDynamicsWidget_h
+#define mvdColorDynamicsWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdColorBandDynamicsWidget.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ColorDynamicsWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ColorDynamicsWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ */
+class OTBMonteverdiGUI_EXPORT ColorDynamicsWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  Q_PROPERTY( bool isNoDataChecked
+	      READ IsNoDataChecked
+	      WRITE SetNoDataChecked );
+
+  Q_PROPERTY( double NoDataValue
+	      READ GetNoDataValue
+	      WRITE SetNoDataValue );
+
+  Q_PROPERTY( int GammaCursorPosition
+	      READ GetGammaCursorPosition
+	      WRITE SetGammaCursorPosition );
+
+  Q_PROPERTY( int MinGamma
+	      READ GetMinGamma
+	      WRITE SetMinGamma );
+
+  Q_PROPERTY( int MaxGamma
+	      READ GetMaxGamma
+	      WRITE SetMaxGamma );
+
+  Q_PROPERTY( int GammaStep
+	      READ GetGammaStep
+	      WRITE SetGammaStep );
+
+  Q_PROPERTY( double Gamma
+              READ GetGamma
+              WRITE SetGamma );
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** Constructor. */
+  ColorDynamicsWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** Destructor. */
+  ~ColorDynamicsWidget() ITK_OVERRIDE;
+
+  /**
+   */
+  inline const ColorBandDynamicsWidget* GetChannel( RgbwChannel ) const;
+
+  /**
+   */
+  inline ColorBandDynamicsWidget* GetChannel( RgbwChannel );
+
+  /**
+   */
+  void SetGrayscaleActivated( bool activated );
+
+  /**
+   */
+  bool IsGrayscaleActivated() const;
+
+  /**
+   */
+  void SetNoDataChecked( bool checked );
+
+  /**
+   */
+  bool IsNoDataChecked() const;
+
+  /**
+   */
+  void SetNoDataValue( double value );
+
+  /**
+   */
+  double GetNoDataValue() const;
+
+  /**
+   */
+  void SetGamma( double value );
+
+  /**
+   */
+  double GetGamma() const;
+
+  /**
+   */
+  void SetGammaCursorPosition( int value );
+
+  /**
+   */
+  int GetGammaCursorPosition() const;
+
+  /**
+   */
+  void SetMinGamma( int value );
+
+  /**
+   */
+  int GetMinGamma() const;
+
+  /**
+   */
+  void SetMaxGamma( int value );
+
+  /**
+   */
+  int GetMaxGamma() const;
+
+  /**
+   */
+  void SetGammaStep( int value );
+
+  /**
+   */
+  int GetGammaStep() const;
+
+//
+// Public slots.
+public slots:
+
+  /**
+   */
+  void SetNoDataButtonChecked( bool checked );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void LowQuantileChanged( RgbwChannel, double );
+
+  /**
+   */
+  void HighQuantileChanged( RgbwChannel, double );
+
+  /**
+   */
+  void LowIntensityChanged( RgbwChannel, double );
+
+  /**
+   */
+  void HighIntensityChanged( RgbwChannel, double );
+
+  /**
+   */
+  void ResetIntensityClicked( RgbwChannel );
+
+  /**
+   */
+  void ResetQuantileClicked( RgbwChannel );
+
+  /**
+   */
+  void ApplyAllClicked( RgbwChannel, double, double );
+
+  /**
+   */
+  void LinkToggled( RgbwChannel, bool );
+
+  /**
+   */
+  void NoDataFlagToggled( bool enabled );
+
+  /**
+   */
+  void NoDataValueChanged( double value );
+
+  /**
+   */
+  void NoDataButtonPressed();
+
+  /**
+   */
+  void GammaCursorPositionChanged( int value );
+
+  /**
+   */
+  void GammaValueChanged( double value );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   * \brief Connect signals of color-band dynamics child widget to
+   * slots of this widget.
+   *
+   * \param child Color-band dynamics child widget.
+   * \param channel RGBAW channel setup of child widget.
+   */
+  void ConnectChild( ColorBandDynamicsWidget* child, RgbwChannel channel );
+
+//
+// Private attributes.
+private:
+  /** */
+  static const char* COLOR_BAND_DYNAMICS_WIDGET_NAMES[];
+
+  /**
+   * uic generated.
+   */
+  Ui::ColorDynamicsWidget* m_UI;
+
+  /**
+   */
+  QDoubleValidator* m_NoDataValidator;
+
+  /**
+   */
+  bool m_IsGrayscaleActivated;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+
+  /**
+   */
+  void on_noDataLineEdit_textChanged( const QString& text );
+
+  /**
+   */
+  void on_noDataCheckBox_toggled( bool enabled );
+
+  /**
+   */
+  void on_noDataButton_toggled( bool checked );
+
+  /**
+   */
+  void on_gammaSlider_valueChanged( int gamma );
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const ColorBandDynamicsWidget*
+ColorDynamicsWidget
+::GetChannel( RgbwChannel channel ) const
+{
+  return findChild< const ColorBandDynamicsWidget* >(
+    ColorDynamicsWidget::COLOR_BAND_DYNAMICS_WIDGET_NAMES[ channel ]
+  );
+}
+
+/*****************************************************************************/
+inline
+ColorBandDynamicsWidget*
+ColorDynamicsWidget
+::GetChannel( RgbwChannel channel )
+{
+  return findChild< ColorBandDynamicsWidget* >(
+    ColorDynamicsWidget::COLOR_BAND_DYNAMICS_WIDGET_NAMES[ channel ]
+  );
+}
+
+/*****************************************************************************/
+inline
+bool
+ColorDynamicsWidget
+::IsGrayscaleActivated() const
+{
+  return m_IsGrayscaleActivated;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
+
+#endif // mvdColorDynamicsWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdColorSetupController.h b/Modules/Visualization/MonteverdiGui/include/mvdColorSetupController.h
new file mode 100644
index 0000000..16033b2
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdColorSetupController.h
@@ -0,0 +1,229 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdColorSetupController_h
+#define mvdColorSetupController_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+//
+#include "mvdAbstractModelController.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class ColorSetupWidget;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ColorSetupController
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Color-setup widget controller for VectorImageModel objects.
+ */
+class OTBMonteverdiGUI_EXPORT ColorSetupController :
+    public AbstractModelController
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param widget Controlled widget.
+   * \param parent Parent QObject of this QObject.
+   */
+  ColorSetupController( ColorSetupWidget* widget, QObject* p =NULL );
+
+  /**
+   * \brief Destructor.
+   */
+  ~ColorSetupController() ITK_OVERRIDE;
+
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   * \brief Signal emitted when the band-index of a RGB channel has
+   * been changed. This signal is used to forward events to other
+   * controllers such as ColorDynamicsController.
+   *
+   * \param channel The RGB channel for which the band-index has changed.
+   * \param band The new band-index of the RGB channel.
+   */
+  void RgbChannelIndexChanged( RgbwChannel channel, int band );
+
+  /**
+   * \brief Signal emitted when the band-index of a white (gray)
+   * channel has been changed. This signal is used to forward events
+   * to other controllers such as ColorDynamicsController.
+   *
+   * \param band The new band-index of the white (gray) channel.
+   */
+  void GrayChannelIndexChanged( int band );
+
+  /**
+   * \brief Signal emitted when the grayscale-mode activation-state
+   * has changed. This signal is used to forward events to other
+   * controllers such as ColorDynamicsController.
+   *
+   * \param activated The new grayscale-mode activation-state.
+   */
+  void GrayscaleActivated( bool activated );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   * \brief Reset current band-index to default values for given RGB
+   * channels.
+   *
+   * \param channels Given channels for which to reset current-band
+   * index. \see RgbBound() for valid values.
+   */
+  void ResetIndices( RgbwChannel channels );
+
+  /**
+   */
+  void ResetAlpha();
+
+  //
+  // AbstractModelController methods.
+
+  void Connect( AbstractModel* ) ITK_OVERRIDE;
+
+  void ClearWidget() ITK_OVERRIDE;
+
+  void virtual_ResetWidget( bool ) ITK_OVERRIDE;
+
+  void Disconnect( AbstractModel* ) ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   * \brief Slot called when the current index of a RGB channel of the
+   * controlled widget has changed.
+   *
+   * \param channel The RGB video-channel for which the current
+   * band-index has changed.
+   *
+   * \param index The new band-index of the RGB video-channel.
+   */
+  void OnCurrentRgbIndexChanged( RgbwChannel channel, int index );
+
+  /**
+   * \brief Slot called when the current index of the white (gray)
+   * channel of the controlled widget has changed.
+   *
+   * \param index The new band-index of the white (gray)
+   * video-channel.
+   */
+  void OnCurrentGrayIndexChanged( int index );
+
+  /**
+   * \brief Slot called when the grayscale-mode has been
+   * activated/deactivated.
+   *
+   * \param activated The new activation state.
+   */
+  void OnGrayscaleActivated( bool activated );
+
+  /**
+   */
+  void OnAlphaValueChanged( double );
+
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdColorSetupController_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdColorSetupWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdColorSetupWidget.h
new file mode 100644
index 0000000..25276a2
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdColorSetupWidget.h
@@ -0,0 +1,336 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdColorSetupWidget_h
+#define mvdColorSetupWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ColorSetupWidget;
+}
+
+/**
+ * \class ColorSetupWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ */
+class OTBMonteverdiGUI_EXPORT ColorSetupWidget :
+    public QWidget
+{
+  Q_OBJECT;
+
+  /**
+   * \brief The list of (user) component names.
+   * \sa ColorSetupWidget::m_Components member.
+   */
+  Q_PROPERTY( QStringList components
+	      READ GetComponents
+	      WRITE SetComponents );
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ColorSetupWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~ColorSetupWidget() ITK_OVERRIDE;
+
+  /**
+   * \brief Set the component-name list.
+   *
+   * This sets up the content of the red, green and blue combo
+   * boxes. Each component name is prepended with its index
+   * (e.g. '<i>: NAME'), if non-empty. Otherwise, 'BAND <i>' is
+   * inserted into the combo-box.
+   *
+   * Calling SetComponents() resets the current-index of each
+   * combo-box to the first entry of the list, which causes the
+   * CurrentIndexChanged() signal to be emitted for each component.
+   *
+   * Example: The user { "Red", "Green", "Blue", "" } component-name
+   * list will be displayed as the { "0: Red", "1: Green", "2: Blue",
+   * "BAND 3" } combo-box list.
+   *
+   * \param component component-name list.
+   */
+  void SetComponents( const QStringList& component );
+
+  /**
+   * \brief Get the component-name list.
+   *
+   * Example: The user { "Red", "Green", "Blue", "" } list as it were
+   * set and not the displayed { "0: Red", "1: Green", "2: Blue",
+   * "BAND 3" } combo-box list.
+   *
+   * \return the component-name list.
+   */
+  inline
+    QStringList
+    GetComponents() const
+  {
+    return m_Components;
+  }
+
+  /**
+   * \brief Set the current (selected) index of a RGB video channel.
+   *
+   * Calling SetCurrentRgbIndex() let the CurrentRgbIndexChanged()
+   * signal to be emitted.
+   *
+   * \param channel The video channel for which to set the current
+   * index.
+   * \param index The index in the component-name list.
+   *
+   * Example: If the { "Red", "Green", "Blue", "" } component-name
+   * list has been set, index 1 set "1: Green" as the current select
+   * combo-box item.
+   */
+  void SetCurrentRgbIndex( RgbwChannel channel, int index );
+
+  /**
+   * \return the current (selected) index of a RGB video-channel in
+   * the component-name list.
+   */
+  int GetCurrentRgbIndex( RgbwChannel channel ) const;
+
+  /**
+   * \brief Enable/disable the grayscale-mode check-box.
+   *
+   * \param enabled true to enable the grayscale-mode check-box.
+   */
+  void SetGrayscaleEnabled( bool enabled );
+
+  /**
+   * \brief Activate/deactivate the gray-scale mode.
+   *
+   * \param activated true to enable the grayscale-model.
+   */
+  void SetGrayscaleActivated( bool activated );
+
+  /**
+   * \brief Set the current (selected) index of the white (gray)
+   * channel.
+   *
+   * Calling SetCurrentGrayIndex() let the CurrentGrayIndexChanged()
+   * signal to be emitted.
+   *
+   * \param index The index in the component-name list.
+   */
+  void SetCurrentGrayIndex( int index );
+
+  /**
+   * \return the current (selected) index of the white (gray) channel
+   * in the component-name list.
+   */
+  int GetCurrentGrayIndex() const;
+
+  /**
+   */
+  void SetAlpha( double );
+
+  /**
+   */
+  double GetAlpha() const;
+
+//
+// SIGNALS.
+signals:
+  /**
+   * \brief Signal emitted when the current-index of a RGB
+   * video-channel has been modified.
+   *
+   * \param channel The RGB video-channel which has been modified.
+   * \param index The curren-index in the component-list.
+   */
+  void CurrentRgbIndexChanged( RgbwChannel channel, int index );
+
+  /**
+   * \brief Signal emitted when the current-index of the white (gray)
+   * channel has been modified.
+   *
+   * \param index The curren-index in the component-list.
+   */
+  void CurrentGrayIndexChanged( int index );
+
+  /**
+   * \brief Signal emitted when the activation-state of the
+   * grayscale-mode has been modified.
+   *
+   * \param activated The new activation-state.
+   */
+  void GrayscaleActivated( bool activated );
+
+  /**
+   */
+  void AlphaValueChanged( double );
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+  /**
+   */
+  double ToAlpha( int ) const;
+
+  /**
+   */
+  int FromAlpha( double ) const;
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::ColorSetupWidget* m_UI;
+
+  /**
+   * \brief The list of (user) component names.
+   * \sa ColorSetupWidget::component Q_PROPERTY.
+   */
+  QStringList m_Components;
+
+//
+// SLOTS.
+private slots:
+  /**
+   * \brief Slot called when the current-index of the red
+   * video-channel has been modified.
+   *
+   * \param index The new current-index of the red combo-box.
+   */
+  inline
+    void
+    on_rComboBox_currentIndexChanged( int index )
+  {
+    emit CurrentRgbIndexChanged( RGBW_CHANNEL_RED, index );
+  }
+
+  /**
+   * \brief Slot called when the current-index of the green
+   * video-channel has been modified.
+   *
+   * \param index The new current-index of the green combo-box.
+   */
+  inline
+    void
+    on_gComboBox_currentIndexChanged( int index )
+  {
+    emit CurrentRgbIndexChanged( RGBW_CHANNEL_GREEN, index );
+  }
+
+  /**
+   * \brief Slot called when the current-index of the blue
+   * video-channel has been modified.
+   *
+   * \param index The new current-index of the blue combo-box.
+   */
+  inline
+    void
+    on_bComboBox_currentIndexChanged( int index )
+  {
+    emit CurrentRgbIndexChanged( RGBW_CHANNEL_BLUE, index );
+  }
+
+  /**
+   * \brief Slot called when the current-index of the white (gray)
+   * channel has been modified.
+   *
+   * \param index The new current-index of the white (gray) combo-box.
+   */
+  inline
+    void
+    on_wComboBox_currentIndexChanged( int index )
+  {
+    emit CurrentGrayIndexChanged( index );
+  }
+
+  /**
+   * \brief Slot called when the grayscale-mode is activated/deactivated.
+   *
+   * \param activated The new activation-state of the grayscale-mode.
+   */
+  inline
+    void
+    on_wCheckBox_toggled( bool activated )
+  {
+    emit GrayscaleActivated( activated );
+  }
+
+  /**
+   */
+  void on_alphaSlider_valueChanged( int );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdColorSetupWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdDoubleValidator.h b/Modules/Visualization/MonteverdiGui/include/mvdDoubleValidator.h
new file mode 100644
index 0000000..f223b3e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdDoubleValidator.h
@@ -0,0 +1,172 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdDoubleValidator_h
+#define mvdDoubleValidator_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class DoubleValidator
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiGUI_EXPORT DoubleValidator :
+    public QDoubleValidator
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  DoubleValidator( QObject* p =NULL );
+
+  /**
+   * \brief Constructor.
+   */
+  DoubleValidator( double bottom,
+		   double top,
+		   int decimals,
+		   QObject *p = 0 );
+
+  /** \brief Destructor. */
+  ~DoubleValidator() ITK_OVERRIDE;
+
+  //
+  // QDoubleValidator overloads.
+
+  void fixup( QString& input ) const ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdDoubleValidator_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdDropLineEdit.h b/Modules/Visualization/MonteverdiGui/include/mvdDropLineEdit.h
new file mode 100644
index 0000000..df69570
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdDropLineEdit.h
@@ -0,0 +1,159 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdDropLineEdit_h
+#define mvdDropLineEdit_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+// class DropLineEdit;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class DropLineEdit
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT DropLineEdit :
+    public QLineEdit
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  DropLineEdit( QWidget* p =0 );
+
+  /** \brief Constructor. */
+  DropLineEdit( const QString& contents, QWidget* p =0 );
+
+  /** \brief Destructor. */
+  ~DropLineEdit() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  void dragEnterEvent( QDragEnterEvent* event ) ITK_OVERRIDE;
+  void dragMoveEvent( QDragMoveEvent* event ) ITK_OVERRIDE;
+  void dropEvent( QDropEvent* event ) ITK_OVERRIDE;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  // Ui::DropLineEdit* m_UI;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdDropLineEdit_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdFilenameDragAndDropEventFilter.h b/Modules/Visualization/MonteverdiGui/include/mvdFilenameDragAndDropEventFilter.h
new file mode 100644
index 0000000..893b2a7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdFilenameDragAndDropEventFilter.h
@@ -0,0 +1,173 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdFilenameDragAndDropEventFilter_h
+#define mvdFilenameDragAndDropEventFilter_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractDragAndDropEventFilter.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class FilenameDragAndDropEventFilter
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT FilenameDragAndDropEventFilter :
+    public AbstractDragAndDropEventFilter
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  FilenameDragAndDropEventFilter( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~FilenameDragAndDropEventFilter() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /**
+   */
+  void FilenameDropped( const QString& filename );
+
+  /**
+   */
+  void FilenamesDropped( const QStringList & );
+
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragEnterEvent
+   */
+  bool DragEnterEvent( QObject* object, QDragEnterEvent* event ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragLeaveEvent
+   */
+  bool DragLeaveEvent( QObject* object, QDragLeaveEvent* event ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragMoveEvent
+   */
+  bool DragMoveEvent( QObject* object, QDragMoveEvent* event ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dropEvent
+   */
+  bool DropEvent( QObject* object, QDropEvent* event ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdFilenameDragAndDropEventFilter_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdGui.h b/Modules/Visualization/MonteverdiGui/include/mvdGui.h
new file mode 100644
index 0000000..821e202
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdGui.h
@@ -0,0 +1,189 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdGui_h
+#define mvdGui_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+//
+// Internal classes pre-declaration.
+namespace mvd
+{
+} // end namespace 'mvd'
+
+
+/*****************************************************************************/
+/* CONSTANTS SECTION                                                         */
+
+/**
+ */
+namespace mvd
+{
+
+/**
+ */
+extern const int MOUSE_WHEEL_STEP_DEGREES;
+
+/**
+ */
+extern const int MOUSE_WHEEL_STEP_FACTOR;
+
+} // end of namespace 'mvd'.
+
+/*****************************************************************************/
+/* TYPE DEFINITION SECTION                                                   */
+
+namespace mvd
+{
+
+/**
+ */
+enum Resolution
+{
+  RESOLUTION_NONE = -1,
+  //
+  RESOLUTION_NEAREST = 0,
+  RESOLUTION_LOWER,
+  RESOLUTION_UPPER,
+  //
+  RESOLUTION_COUNT,
+  //
+  RESOLUTION_DEFAULT = RESOLUTION_NEAREST,
+};
+
+/**
+ * Constant naming effect values.
+ */
+OTBMonteverdiGUI_EXPORT
+extern
+char const * const
+RESOLUTION_NAMES[ RESOLUTION_COUNT ];
+
+/**
+ */
+enum TileSize
+{
+  TILE_SIZE_NONE = -1,
+  //
+  TILE_SIZE_64 = 0,
+  TILE_SIZE_128,
+  TILE_SIZE_256,
+  TILE_SIZE_512,
+  //
+  TILE_SIZE_COUNT,
+  //
+  TILE_SIZE_DEFAULT = TILE_SIZE_256,
+};
+
+/**
+ * Constant naming effect values.
+ */
+OTBMonteverdiGUI_EXPORT
+extern
+char const * const
+TILE_SIZE_NAMES[ TILE_SIZE_COUNT ];
+
+/**
+ */
+OTBMonteverdiGUI_EXPORT
+extern
+int
+TILE_SIZE_VALUE[ TILE_SIZE_COUNT ];
+
+/**
+ */
+enum ZoomType
+{
+  ZOOM_TYPE_NONE = -1,
+  //
+  ZOOM_TYPE_EXTENT,
+  ZOOM_TYPE_FULL,
+  ZOOM_TYPE_LAYER,
+  //
+  ZOOM_TYPE_COUNT
+};
+
+} // End of namespace 'mvd'.
+
+
+/*****************************************************************************/
+/* COMMON DECLARATION SECTION                                                */
+
+namespace mvd
+{
+
+/**
+ */
+OTBMonteverdiGUI_EXPORT
+void
+AddItemsInto( QComboBox * comboBox,
+	      const char * context,
+	      char const * const names[],
+	      size_t count );
+/**
+ */
+QMessageBox & CustomizeMessageBox( QMessageBox & messageBox,
+                                   QWidget * widget );
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'.
+
+#endif // mvdGui_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdHistogramController.h b/Modules/Visualization/MonteverdiGui/include/mvdHistogramController.h
new file mode 100644
index 0000000..f16157b
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdHistogramController.h
@@ -0,0 +1,201 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdHistogramController_h
+#define mvdHistogramController_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+//
+#include "mvdAbstractModelController.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class HistogramWidget;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class HistogramController
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Color-setup widget controller for VectorImageModel objects.
+ */
+class OTBMonteverdiGUI_EXPORT HistogramController :
+    public AbstractModelController
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param widget Controlled widget.
+   * \param parent Parent QObject of this QObject.
+   */
+  HistogramController( HistogramWidget* widget, QObject* p =NULL );
+
+  /**
+   * \brief Destructor.
+   */
+  ~HistogramController() ITK_OVERRIDE;
+
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   * \brief
+   */
+  void ResetWidget( RgbwChannel channel );
+
+  //
+  // AbstractModelController methods.
+
+  void Connect( AbstractModel* ) ITK_OVERRIDE;
+
+  void ClearWidget() ITK_OVERRIDE;
+
+  void virtual_ResetWidget( bool = false ) ITK_OVERRIDE;
+
+  void Disconnect( AbstractModel* ) ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   * \brief Slot called when the band-index of a RGB channel has
+   * changed.
+   *
+   * \param channel The RGB channel for which the band-index has changed.
+   * \param band The new band-index of the RGB channel.
+   */
+  void OnRgbChannelIndexChanged( RgbwChannel channel, int band );
+
+  /**
+   * \brief Slot called when the band-index of the white (gray)
+   * channel has changed.
+   *
+   * \param band The new band-index of the white (gray) channel.
+   */
+  void OnGrayChannelIndexChanged( int band );
+
+  /**
+   * \brief Slot called when the activation-state of the
+   * grayscale-mode has changed.
+   *
+   * \param activated The new grayscale-mode activation state.
+   */
+  void OnGrayscaleActivated( bool activated );
+
+  /**
+   * \brief
+   */
+  void OnLowIntensityChanged( RgbwChannel channel, double value, bool refresh );
+
+  /**
+   * \brief
+   */
+  void OnHighIntensityChanged( RgbwChannel channel, double value, bool refresh );
+
+  /**
+   */
+  void OnHistogramRefreshed();
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdHistogramController_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdHistogramPlotPicker.h b/Modules/Visualization/MonteverdiGui/include/mvdHistogramPlotPicker.h
new file mode 100644
index 0000000..baf8809
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdHistogramPlotPicker.h
@@ -0,0 +1,224 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdHistogramPlotPicker_h
+#define mvdHistogramPlotPicker_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+//
+#include <qwt_plot_picker.h>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+#include "mvdTypes.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+class QwtPlotCanvas;
+class QwtPlotCurve;
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class HistogramPlotPicker
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT HistogramPlotPicker :
+    public QwtPlotPicker
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types and constants.
+public:
+
+  /**
+   * \brief
+   */
+  typedef std::vector< QwtPlotCurve* > PlotCurveVector;
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  HistogramPlotPicker( const PlotCurveVector& curves, QwtPlotCanvas* canvas );
+
+  /** \brief Constructor. */
+  HistogramPlotPicker( const PlotCurveVector& curves,
+		       int xAxis,
+		       int yAxis,
+		       QwtPlotCanvas* canvas );
+
+  /** \brief Constructor. */
+  HistogramPlotPicker( const PlotCurveVector& curves,
+		       int xAxis,
+		       int yAxis,
+		       DisplayMode trackerMode,
+		       QwtPlotCanvas* canvas );
+
+  /** \brief Destructor. */
+  ~HistogramPlotPicker() ITK_OVERRIDE;
+
+  /**
+   */
+  void SetRubberBandPen( RgbwChannel channel, const QPen& pen );
+
+  /**
+   */
+  void SetGrayscaleActivated( bool activated );
+
+  //
+  // QwtPlotPicker methods.
+
+  void drawRubberBand( QPainter* painter ) const ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // QwtPlotPicker methods.
+
+  using QwtPlotPicker::trackerText;
+
+  QwtText trackerText( const QwtDoublePoint & ) const ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  double Find( const QwtPlotCurve* curve, double x ) const;
+
+  /**
+   */
+  CountType Find( const QwtPlotCurve* curve,
+		  double x,
+		  double& xmin,
+		  double& xmax,
+		  double& y ) const;
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief
+   */
+  static const CountType CURVE_COUNT = 4;
+
+  /**
+   * \brief
+   */
+  PlotCurveVector m_PlotCurves;
+
+  /**
+   */
+  QPen m_RubberBandPens[ CURVE_COUNT ];
+
+  /**
+   */
+  bool m_IsGrayscaleActivated : 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdHistogramPlotPicker_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdHistogramWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdHistogramWidget.h
new file mode 100644
index 0000000..bd11488
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdHistogramWidget.h
@@ -0,0 +1,353 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdHistogramWidget_h
+#define mvdHistogramWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// Qwt includes.
+#include <qwt_double_rect.h>
+#include <qwt_polygon.h>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+class QwtPlot;
+class QwtPlotGrid;
+class QwtPlotCurve;
+class QwtPlotMagnifier;
+class QwtPlotMarker;
+class QwtPlotPanner;
+// class QwtPlotZoomer;
+
+namespace mvd
+{
+
+class HistogramPlotPicker;
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class HistogramWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class HistogramWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT HistogramWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public constants
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  HistogramWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~HistogramWidget() ITK_OVERRIDE;
+
+  /**
+   * \brief
+   */
+  void SetBounds( RgbwChannel channel,
+		  double xMin, double xMax,
+		  double yMin, double yMax );
+
+  /**
+   * \brief
+   */
+  void SetData( RgbwChannel channel,
+		double * const x,
+		double * const y,
+		size_t size,
+		double xMin, double yMin,
+		double xMax, double yMax );
+
+  /**
+   */
+  void SetLowMarker( RgbwChannel channel, double low );
+
+  /**
+   */
+  void SetHighMarker( RgbwChannel channel, double high );
+
+  /**
+   * \brief
+   */
+  void SetGrayscaleActivated( bool activated );
+
+  /**
+   * \brief
+   */
+  // bool IsGrayscaleActivated() const;
+
+  /**
+   * \brief
+   */
+  void RefreshScale( bool iqr );
+
+  /**
+   */
+  void Clear();
+
+  /**
+   */
+  void SetPrecision( double );
+
+  /**
+   */
+  double GetPrecision() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+  /**
+   * \brief
+   */
+  void Replot();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+  struct Bounds
+  {
+    Bounds( double xMin =0.0, double xMax =1.0,
+	    double yMin =0.0, double yMax =1.0,
+	    double qMin =0.0, double qMax =1.0 ) :
+      m_XMin( xMin ),
+      m_XMax( xMax ),
+      m_YMin( yMin ),
+      m_YMax( yMax ),
+      m_QMin( qMin ),
+      m_QMax( qMax )
+    {
+    }
+
+    double m_XMin;
+    double m_XMax;
+
+    double m_YMin;
+    double m_YMax;
+
+    double m_QMin;
+    double m_QMax;
+  };
+
+//
+// Private methods.
+private:
+  /**
+   */
+  void UpdateCurvesVisibility( CountType index );
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief
+   */
+  static const CountType CURVE_COUNT = 4;
+
+  /**
+   */
+  static const char* CURVE_NAMES[ HistogramWidget::CURVE_COUNT ];
+
+  /**
+   */
+  static const QColor CURVE_COLORS[ HistogramWidget::CURVE_COUNT ];
+
+  /**
+   */
+  static const QColor BAR_COLORS[ HistogramWidget::CURVE_COUNT ];
+
+  /**
+   */
+  static const QColor MARKER_COLORS[ HistogramWidget::CURVE_COUNT ];
+
+  /**
+   */
+  static const QColor RUBBER_BAND_COLORS[ HistogramWidget::CURVE_COUNT ];
+
+  /**
+   * \brief uic generated.
+   */
+  Ui::HistogramWidget* m_UI;
+
+  /**
+   */
+  QwtPlotGrid* m_PlotGrid;
+
+  /**
+   */
+  HistogramPlotPicker* m_PlotPicker;
+
+  /**
+   */
+  // QwtPlotZoomer* m_PlotZoomer;
+
+  /**
+   */
+  QwtPlotMagnifier* m_PlotMagnifier;
+
+  /**
+   */
+  QwtPlotPanner* m_PlotPanner;
+
+  /**
+   * \brief
+   */
+  QwtPlotCurve* m_PlotCurves[ CURVE_COUNT ];
+
+  /**
+   */
+  QwtPlotMarker* m_LowPlotMarkers[ CURVE_COUNT ];
+
+  /**
+   */
+  QwtPlotMarker* m_HighPlotMarkers[ CURVE_COUNT ];
+
+  /**
+   */
+  Bounds m_Bounds[ CURVE_COUNT ];
+
+  /**
+   */
+  double m_Precision;
+
+  /**
+   */
+  bool m_IsGrayscaleActivated;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void on_zoom1Button_clicked();
+
+  /**
+   */
+  void on_zoomQButton_clicked();
+
+  /**
+   */
+  void on_channelComboBox_currentIndexChanged( int index );
+
+  /**
+   */
+  void OnAppended( const QwtDoublePoint& pos );
+  void OnAppended( const QPoint& pos );
+
+  void OnChanged( const QwtPolygon& pa );
+
+  void OnMoved( const QwtDoublePoint&pos );
+  void OnMoved( const QPoint& pos );
+
+  void OnSelected( const QwtDoublePoint& pos );
+  void OnSelected( const QwtDoubleRect& rect );
+  void OnSelected( const QwtPolygon& pa );
+  void OnSelected( const QwtArray< QwtDoublePoint >& pa );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdHistogramWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdI18nApplication.h b/Modules/Visualization/MonteverdiGui/include/mvdI18nApplication.h
new file mode 100644
index 0000000..162e97c
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdI18nApplication.h
@@ -0,0 +1,198 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdI18nApplication_h
+#define mvdI18nApplication_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdI18nCoreApplication.h"
+
+//
+// Macros.
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+
+//
+// Classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class I18nApplication
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief The MVD2 application (which is different from
+ * QApplication).
+ *
+ * I18nApplication do not derive from QApplication to prevent a dread
+ * diamong multiple inheritance scheme which could not be resolved
+ * using virtual inheritance (because Qt is not designed for).
+ *
+ *
+ * \see I18nCoreApplication.
+ */
+class OTBMonteverdiGUI_EXPORT I18nApplication
+  : public I18nCoreApplication
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   *
+   * \param qtApp The parent Qt application of this MVD2 application.
+   */
+  I18nApplication( QApplication* qtApp );
+
+  /** \brief Destructor. */
+  ~I18nApplication() ITK_OVERRIDE;
+
+  //
+  // APPLICATION SINGLETON.
+  //
+
+  /**
+   * \brief Get the singleton instance of application as a
+   * I18Application pointer.
+   *
+   * \return The singleton instance of I18nApplication.
+   */
+  inline static I18nApplication* Instance();
+
+  /**
+   * \brief Get the singleton constant instance of application as a
+   * I18Application pointer.
+   *
+   * \return The singleton constant instance of I18nApplication.
+   */
+  inline static const I18nApplication* ConstInstance();
+
+//
+// Public attributes.
+public:
+
+  /*-[ PUBLIC SLOTS SECTION ]-----------------------------------------------**/
+
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  void virtual_InitializeCore() ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// SLOTS
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+I18nApplication*
+I18nApplication
+::Instance()
+{
+  return I18nCoreApplication::Instance< I18nApplication >();
+}
+
+/*****************************************************************************/
+const I18nApplication*
+I18nApplication
+::ConstInstance()
+{
+  return I18nCoreApplication::ConstInstance< I18nApplication >();
+}
+
+} // end namespace 'mvd'
+
+#endif // I18nApplication_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdI18nMainWindow.h b/Modules/Visualization/MonteverdiGui/include/mvdI18nMainWindow.h
new file mode 100644
index 0000000..6d2d8c5
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdI18nMainWindow.h
@@ -0,0 +1,399 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdI18nMainWindow_h
+#define mvdI18nMainWindow_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External class pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal class pre-declaration.
+class AbstractModel;
+class AbstractModelController;
+class AbstractWorker;
+class DatasetModel;
+class VectorImageModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class I18nMainWindow
+ *
+ * \ingroup OTBMonteverdiGUI
+*
+ * \brief Main-window widget base for the i18n application.
+ */
+class OTBMonteverdiGUI_EXPORT I18nMainWindow
+  : public QMainWindow
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  enum DockLayout
+  {
+    DOCK_LAYOUT_NONE = 0,
+    DOCK_LAYOUT_FLOATING = 1,
+    DOCK_LAYOUT_SCROLLABLE = 2,
+  };
+
+  typedef QFlags< DockLayout > DockLayoutFlags;
+
+//
+// Public methods.
+public:
+  /** \brief Destructor. */
+  ~I18nMainWindow() ITK_OVERRIDE;
+
+  /**
+   */
+  void Initialize();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /** \brief Constructor. */
+  I18nMainWindow( QWidget* Parent =0, Qt::WindowFlags flags =0 );
+
+  /**
+   */
+  QDockWidget*
+    AddWidgetToDock( QWidget* widget,
+		     const QString& dockName,
+		     const QString& dockTitle,
+		     Qt::DockWidgetArea dockArea,
+		     DockLayoutFlags flags = DOCK_LAYOUT_NONE );
+
+  /**
+   */
+  template< typename TWidget, typename TDockWidget >
+    inline
+    TDockWidget*
+    AddDockWidget( const QString& dockName,
+		   const QString& dockTitle,
+		   Qt::DockWidgetArea dockArea,
+		   DockLayoutFlags flags = DOCK_LAYOUT_NONE );
+
+  /**
+   */
+  template< typename TWidget, typename TController, typename TDockWidget >
+    inline
+    TDockWidget*
+    AddDockWidget( const QString& dockName,
+		   const QString& dockTitle,
+		   Qt::DockWidgetArea dockArea,
+		   DockLayoutFlags flags = DOCK_LAYOUT_NONE );
+  /**
+   */
+  const AbstractModelController *
+    GetController( const QDockWidget * ) const;
+  /**
+   */
+  AbstractModelController *
+    GetController( const QDockWidget * );
+
+  /**
+   * \brief Assign model to the controller which is child of given
+   * dock-widget.
+   *
+   * \param dock The dock-widget which is parent of the controller to
+   * assign model to.
+   *
+   * \param model The model to assign to the controller.
+   */
+  inline void SetControllerModel( QDockWidget* dock, AbstractModel* model );
+
+  /**
+   */
+  VectorImageModel *
+    ImportImage( const QString & filename,
+                 int width,
+                 int height );
+
+  /**
+   */
+  bool BuildGDALOverviews( const QStringList & filenames );
+
+  /**
+   */
+  void SaveLayout( int version ) const;
+
+  /**
+   */
+  bool RestoreLayout( int version );
+
+  //
+  // QMainWindow methods.
+
+  void closeEvent( QCloseEvent* event ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PROTECTED SLOTS SECTION ]---------------------------------------------*/
+
+//
+// Protected slots.
+protected slots:
+
+  /**
+   */
+  virtual void OnAboutToChangeModel( const AbstractModel* ) =0;
+
+  /**
+   */
+  virtual void OnModelChanged( AbstractModel* ) =0;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private nested classes.
+private:
+
+
+//
+// Private methods.
+private:
+  /**
+   */
+  QObject * Import( AbstractWorker * );
+
+  /**
+   */
+  virtual void virtual_SetupUI() =0;
+
+  /**
+   */
+  virtual void virtual_ConnectUI() =0;
+
+  /**
+   */
+  virtual void virtual_InitializeUI();
+
+  /**
+   */
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Private slots.
+private slots:
+
+  /**
+   * \brief Qt auto-connected slot which is called when File/Quit menu
+   * action is activated.
+   */
+  void on_action_Quit_triggered();
+
+  /**
+   * \brief Qt auto-connected slot which is called when Help/About
+   * menu action is activated.
+   */
+  virtual void on_action_About_triggered();
+
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractModelController.h"
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const AbstractModelController *
+I18nMainWindow
+::GetController( const QDockWidget * dock ) const
+{
+  assert( dock!=NULL );
+
+  return dock->findChild< const AbstractModelController * >();
+}
+
+/*****************************************************************************/
+inline
+AbstractModelController *
+I18nMainWindow
+::GetController( const QDockWidget * dock )
+{
+  assert( dock!=NULL );
+
+  return dock->findChild< AbstractModelController * >();
+}
+
+/*****************************************************************************/
+inline
+void
+I18nMainWindow
+::SetControllerModel( QDockWidget* dock, AbstractModel* model )
+{
+  assert( dock );
+
+  AbstractModelController* controller =
+    dock->findChild< AbstractModelController* >();
+
+  assert( controller!=NULL );
+
+  controller->SetModel( model );
+}
+
+/*****************************************************************************/
+template< typename TWidget, typename TDockWidget >
+inline
+TDockWidget*
+I18nMainWindow
+::AddDockWidget( const QString & dockName,
+		 const QString & dockTitle,
+		 Qt::DockWidgetArea dockArea,
+		 DockLayoutFlags flags )
+{
+  TWidget * widget = new TWidget( this );
+
+  TDockWidget * dockWidget =
+    AddWidgetToDock(
+      widget,
+      dockName,
+      dockTitle,
+      dockArea,
+      flags
+    );
+
+  return dockWidget;
+}
+
+/*****************************************************************************/
+template< typename TWidget, typename TController, typename TDockWidget >
+inline
+TDockWidget*
+I18nMainWindow
+::AddDockWidget( const QString & dockName,
+		 const QString & dockTitle,
+		 Qt::DockWidgetArea dockArea,
+		 DockLayoutFlags flags )
+{
+  TWidget * widget = new TWidget( this );
+
+  QWidget * pannel = widget;
+
+  if( flags.testFlag( DOCK_LAYOUT_SCROLLABLE ) )
+    {
+    QScrollArea * scrollArea = new QScrollArea( this );
+
+    scrollArea->setWidgetResizable( true );
+
+    scrollArea->setWidget( widget );
+
+    pannel = scrollArea;
+    }
+
+
+  TDockWidget * dockWidget =
+    AddWidgetToDock(
+      pannel,
+      dockName,
+      dockTitle,
+      dockArea,
+      flags
+    );
+
+  new TController(
+    // wraps:
+    widget,
+    // as chid of:
+    dockWidget
+  );
+
+  return dockWidget;
+}
+
+} // end namespace 'mvd'
+
+#endif // I18nMainWindow_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImageViewManipulator.h b/Modules/Visualization/MonteverdiGui/include/mvdImageViewManipulator.h
new file mode 100644
index 0000000..a564f07
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImageViewManipulator.h
@@ -0,0 +1,475 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageViewManipulator_h
+#define mvdImageViewManipulator_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cmath>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbViewSettings.h"
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+#include "mvdAbstractImageViewManipulator.h"
+#include "mvdImageViewRenderer.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImageViewManipulator
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ *  \brief TODO.
+ */
+class OTBMonteverdiGUI_EXPORT ImageViewManipulator :
+    public AbstractImageViewManipulator
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Constants
+public:
+  /**
+   */
+  static const double DEFAULT_DELTA;
+  /**
+   */
+  static const int DEFAULT_GRANULARITY;
+  /**
+   */
+  static const int DEFAULT_ALPHA_GRANULARITY;
+  /**
+   */
+  static const double DEFAULT_DYNAMICS_SHIFT_GRANULARITY;
+  /**
+   */
+  static const int DEFAULT_SCROLL_GRANULARITY;
+  /**
+   */
+  static const int DEFAULT_ZOOM_GRANULARITY;
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+  ImageViewManipulator( const otb::ViewSettings::Pointer& viewSettings,
+                        QObject* p =NULL );
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+  ImageViewManipulator( QObject* p =NULL );
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+
+  /** \brief Destructor. */
+  ~ImageViewManipulator() ITK_OVERRIDE;
+
+  //
+  // AbstractImageViewManipulator overloads.
+  //
+
+  //
+  // Accessors.
+
+  void SetViewportSize( int width, int height ) ITK_OVERRIDE;
+
+  SizeType GetViewportSize() const ITK_OVERRIDE;
+
+  void SetOrigin( const PointType& origin ) ITK_OVERRIDE;
+
+  PointType GetOrigin() const ITK_OVERRIDE;
+
+  void SetSpacing( const SpacingType& spacing ) ITK_OVERRIDE;
+
+  SpacingType GetSpacing() const ITK_OVERRIDE;
+
+  void SetNativeSpacing( const SpacingType& ) ITK_OVERRIDE;
+
+  void SetWkt( const std::string& wkt ) ITK_OVERRIDE;
+
+  void SetKeywordList(
+    const DefaultImageType::ImageKeywordlistType& kwl
+  ) ITK_OVERRIDE;
+
+  PointType GetCenter() const ITK_OVERRIDE;
+
+  ZoomType GetFixedZoomType() const ITK_OVERRIDE;
+
+  //
+  // Controls.
+
+  
+    void
+    SetupRenderingContext(
+      AbstractImageViewRenderer::RenderingContext * const ) const ITK_OVERRIDE;
+
+  void ZoomIn() ITK_OVERRIDE;
+
+  void ZoomOut() ITK_OVERRIDE;
+
+  const PointType& Transform( PointType&, const QPoint& ) const ITK_OVERRIDE;
+
+  void ResetViewport() ITK_OVERRIDE;
+
+  //
+  // Events.
+
+  void MouseMoveEvent( QMouseEvent* event ) ITK_OVERRIDE;
+
+  void MousePressEvent( QMouseEvent* event ) ITK_OVERRIDE;
+
+  void MouseReleaseEvent( QMouseEvent* event ) ITK_OVERRIDE;
+
+  void MouseDoubleClickEvent( QMouseEvent * ) ITK_OVERRIDE;
+
+  void WheelEvent( QWheelEvent* event) ITK_OVERRIDE;
+
+  void ResizeEvent( QResizeEvent* event ) ITK_OVERRIDE;
+
+  void KeyPressEvent( QKeyEvent* event ) ITK_OVERRIDE;
+
+  void KeyReleaseEvent( QKeyEvent* event ) ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]-----------------------------------------------**/
+
+//
+// Public SLOTS.
+public slots:
+
+  //
+  // AbstractImageViewManipulator overloads.
+
+  void CenterOn( const PointType& point ) ITK_OVERRIDE;
+
+  void ZoomTo( double scale ) ITK_OVERRIDE;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void RaiseLayerRequested();
+  /**
+   */
+  void LowerLayerRequested();
+  /**
+   */
+  void LayerToTopRequested();
+  /**
+   */
+  void LayerToBottomRequested();
+  /**
+   */
+  void SelectNextLayerRequested();
+  /**
+   */
+  void SelectPreviousLayerRequested();
+  /**
+   */
+  void SelectFirstLayerRequested();
+  /**
+   */
+  void SelectLastLayerRequested();
+  /**
+   */
+  void DeleteAllRequested();
+  /**
+   */
+  // TODO: Rename signal into DeleteLayerRequested().
+  void DeleteSelectedRequested();
+  /**
+   */
+  void ToggleLayerVisibilityRequested( bool );
+  /**
+   */
+  void RotateLayersRequested( int );
+  /**
+   */
+  void ZoomToFullResolutionRequested();
+  /**
+   */
+  void ZoomToLayerExtentRequested();
+  /**
+   */
+  void ZoomToFullExtentRequested();
+
+  /**
+   */
+  void ShiftAlphaRequested( double );
+  /**
+   */
+  void UpdateGammaRequested( double );
+  /**
+   */
+  void ResizeShaderRequested( double );
+  /**
+   */
+  void ReparamShaderRequested( double );
+  /**
+   */
+  void ShiftDynamicsRequested( double );
+  /**
+   */
+  void ScaleDynamicsRequested( double );
+  /**
+   */
+  void ResetQuantilesRequested( bool );
+  /**
+   */
+  void ShaderEffectRequested( Effect );
+  /**
+   */
+  void ApplyAllRequested();
+  /**
+   */
+  void SetReferenceRequested();
+  /**
+   */
+  void TakeScreenshotRequested( bool isQuickMode );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+  /**
+   */
+  static PointType Translate( const QPoint& vector,
+                              const PointType& origin,
+                              const SpacingType& spacing );
+
+//
+// Protected attributes.
+protected:
+  /**
+   */
+  QPoint m_MousePressPosition;
+  /**
+   */
+  otb::ViewSettings::Pointer m_ViewSettings;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+  /**
+   */
+  template< typename T1, typename T2, typename T3, typename T4 >
+    inline static
+    double Factor( T1 wheel,
+		   T2 degrees,
+		   T3 delta,
+		   T4 granularity );
+  /**
+   */
+  template< typename T1, typename T2 >
+    inline static
+    double Factor( T1 wheel,
+		   T2 degrees );
+
+  /**
+   */
+  void Translate( const QPoint& vector );
+  /**
+   */
+  void Scale( const QPoint& center, int degrees, PointType* centerPoint =NULL );
+
+  /**
+   */
+  // inline void SetRenderMode( const QInputEvent* event );
+  /**
+   */
+  inline void SetFastRenderMode( bool isEnabled );
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  QTimer * m_Timer;
+  /**
+   */
+  SpacingType m_NativeSpacing;
+  /**
+   */
+  otb::ViewSettings::PointType m_MousePressOrigin;
+  /**
+   */
+  AbstractImageViewRenderer::RenderingContext::RenderMode m_RenderMode;
+  /**
+   */
+  double m_ZoomFactor;
+  /**
+   */
+  int m_AlphaGranularity;
+  /**
+   */
+  double m_DynamicsShiftGranularity;
+  /**
+   */
+  int m_ScrollGranularity;
+  /**
+   */
+  int m_ZoomGranularity;
+  /**
+   */
+  bool m_IsMouseDragging : 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void OnTimeout();
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+template< typename T1, typename T2, typename T3, typename T4 >
+inline
+double
+ImageViewManipulator
+::Factor( T1 wheel, T2 degrees, T3 delta, T4 granularity )
+{
+  // qDebug() << "wheel:" << wheel;
+  // qDebug() << "degrees:" << degrees;
+  // qDebug() << "delta:" << delta;
+  // qDebug() << "granularity:" << granularity;
+
+  if( abs( granularity )<=std::numeric_limits< T1 >::min() )
+    granularity = 1;
+
+  return
+    pow(
+      ( 1.0 + static_cast< double >( delta ) ),
+      static_cast< double >( wheel ) /
+      ( static_cast< double >( granularity ) * static_cast< double >( degrees ) )
+    );
+}
+
+/*****************************************************************************/
+template< typename T1, typename T2 >
+inline
+double
+ImageViewManipulator
+::Factor( T1 wheel, T2 degrees )
+{
+  return
+    ImageViewManipulator::Factor(
+      wheel,
+      degrees,
+      ImageViewManipulator::DEFAULT_DELTA,
+      ImageViewManipulator::DEFAULT_GRANULARITY
+    );
+}
+
+/*****************************************************************************/
+/*
+inline
+void
+ImageViewManipulator
+::SetRenderMode( const QInputEvent* event )
+{
+  m_RenderMode =
+    ( event!=NULL &&
+      ( event->modifiers() & Qt::ControlModifier )==Qt::ControlModifier
+    )
+    ? AbstractImageViewRenderer::RenderingContext::RENDER_MODE_LIGHT
+    : AbstractImageViewRenderer::RenderingContext::RENDER_MODE_FULL;
+
+  qDebug() << "Render-mode:" << m_RenderMode;
+}
+*/
+
+/*****************************************************************************/
+inline
+void
+ImageViewManipulator
+::SetFastRenderMode( bool isEnabled )
+{
+  m_RenderMode =
+    isEnabled
+    ? AbstractImageViewRenderer::RenderingContext::RENDER_MODE_LIGHT
+    : AbstractImageViewRenderer::RenderingContext::RENDER_MODE_FULL;
+
+  // qDebug() << "Render-mode:" << m_RenderMode;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdImageViewManipulator_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h b/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h
new file mode 100644
index 0000000..4167861
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImageViewRenderer.h
@@ -0,0 +1,365 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageViewRenderer_h
+#define mvdImageViewRenderer_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+#define USE_VIEW_SETTINGS_SIDE_EFFECT 1
+//
+#define USE_REMOTE_DESKTOP_DISABLED_RENDERING ((defined( OTB_DEBUG ) && 0) || 0)
+//
+#define DISABLE_QUICKLOOK_VIEW ( ( defined( OTB_DEBUG ) && 0 ) || 0 )
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGlActor.h"
+#include "otbGlView.h"
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractImageViewRenderer.h"
+#include "mvdGui.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace otb
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImageViewRenderer
+ *
+ * \ingroup OTBMonteverdiGUI
+ */
+class OTBMonteverdiGUI_EXPORT ImageViewRenderer :
+    public AbstractImageViewRenderer
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+  /**
+   */
+  struct RenderingContext :
+    public AbstractImageViewRenderer::RenderingContext
+  {
+    /**
+     */
+    RenderingContext();
+
+    /**
+     */
+    ~RenderingContext() ITK_OVERRIDE;
+
+    /**
+     */
+    Resolution m_Resolution;
+
+    /**
+     */
+    int m_TileSize;
+
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+    /**
+     */
+    otb::ViewSettings::Pointer m_ViewSettings;
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+  };
+
+//
+// Public methods.
+public:
+  /** Constructor */
+  ImageViewRenderer( QObject* p = NULL );
+
+  /** Destructor */
+  ~ImageViewRenderer() ITK_OVERRIDE;
+
+  /**
+   */
+  bool CheckGLCapabilities( int * ) ITK_OVERRIDE;
+
+  /**
+   */
+  inline const otb::ViewSettings::Pointer GetViewSettings() const;
+  /**
+   */
+  inline otb::ViewSettings::Pointer GetViewSettings();
+
+  //
+  // AbstractImageViewRenderer overloads.
+
+  bool GetLayerDynamics( const StackedLayerModel::KeyType & key,
+				 ParametersType & params,
+				 bool isGlobal ) const ITK_OVERRIDE;
+
+  const AbstractLayerModel* GetReferenceModel() const ITK_OVERRIDE;
+
+  AbstractLayerModel * GetReferenceModel() ITK_OVERRIDE;
+
+  void GetLayerExtent( const StackedLayerModel::KeyType & key,
+                               PointType& origin,
+                               PointType& extent ) const ITK_OVERRIDE;
+
+  void GetReferenceExtent( PointType& origin,
+                                   PointType& extent ) const ITK_OVERRIDE;
+
+  void GetViewExtent( PointType& origin,
+                              PointType& extent ) const ITK_OVERRIDE;
+
+  
+  AbstractImageViewRenderer::RenderingContext* NewRenderingContext() const ITK_OVERRIDE;
+
+  void InitializeGL() ITK_OVERRIDE;
+
+  void ResizeGL( int width, int height ) ITK_OVERRIDE;
+
+  
+  void PaintGL( const AbstractImageViewRenderer::RenderingContext* context ) ITK_OVERRIDE;
+
+  void Pick( const PointType & view,
+                     PixelInfo::Vector & pixels ) const ITK_OVERRIDE;
+
+  void GetResolutions( PixelInfo::Vector & pixels ) const ITK_OVERRIDE;
+
+  bool TransformToView( PointType & point,
+				const StackedLayerModel::KeyType &,
+				const IndexType &,
+				bool isPhysical ) const ITK_OVERRIDE;
+
+  void SaveScreenshot( const QString & ) const ITK_OVERRIDE;
+
+  bool
+    Reproject( PointType & center,
+               SpacingType & spacing,
+               const PointType & vcenter,
+               const SpacingType & vspacing ) const;
+
+  bool IsEffectsEnabled() const ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+// public slots
+public slots:
+  void UpdatePixelInfo( const QPoint & screen,
+				const PointType & view,
+				const PixelInfo::Vector & pixels ) ITK_OVERRIDE;
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+  void ClearProjectionRequired();
+  void SetProjectionRequired();
+  void UpdateProjectionRequired();
+  void ResetViewport();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+  /**
+   */
+  inline otb::GlActor::Pointer GetReferenceActor();
+  /**
+   */
+  template< typename T >
+    inline typename T::Pointer GetReferenceActor();
+  /**
+   */
+  template< typename T >
+    inline typename T::ConstPointer GetReferenceActor() const;
+  /**
+   */
+  virtual
+  void UpdateActors( const AbstractImageViewRenderer::RenderingContext * );
+
+//
+// Protected attributes.
+protected:
+  /**
+   */
+  otb::GlView::Pointer m_GlView;
+  /**
+   */
+  bool m_EffectsEnabled: 1;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types
+private:
+  /**
+   */
+  typedef
+    std::pair< AbstractLayerModel *, otb::GlActor::Pointer >
+    ModelActorPair;
+
+//
+// Private methods.
+private:
+
+  virtual void virtual_ClearProjection() {};
+  virtual void virtual_SetProjection() {};
+  virtual void virtual_UpdateProjection() {};
+
+  //
+  // AbstractImageViewRenderer overloads.
+
+  void virtual_UpdateScene() ITK_OVERRIDE;
+  void virtual_RefreshScene() ITK_OVERRIDE;
+
+  bool virtual_ZoomToRegion( const PointType & origin,
+				     const PointType & extent,
+				     PointType & center,
+				     SpacingType & spacing ) const ITK_OVERRIDE;
+
+  bool virtual_ZoomToExtent( PointType & center, SpacingType & spacing ) const ITK_OVERRIDE;
+
+  bool virtual_ZoomToLayer( const StackedLayerModel::KeyType & key,
+				    PointType & center,
+				    SpacingType & spacing ) const ITK_OVERRIDE;
+
+  bool virtual_ZoomToFull( const StackedLayerModel::KeyType & key,
+				   PointType & center,
+				   SpacingType & spacing ) const ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  ModelActorPair m_ReferencePair;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// SLOTS.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const otb::ViewSettings::Pointer
+ImageViewRenderer
+::GetViewSettings() const
+{
+  assert( !m_GlView.IsNull() );
+
+  return m_GlView->GetSettings();
+}
+
+/*****************************************************************************/
+inline
+otb::ViewSettings::Pointer
+ImageViewRenderer
+::GetViewSettings()
+{
+  assert( !m_GlView.IsNull() );
+
+  return m_GlView->GetSettings();
+}
+
+/*****************************************************************************/
+inline
+otb::GlActor::Pointer
+ImageViewRenderer
+::GetReferenceActor()
+{
+  return m_ReferencePair.second;
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+typename T::Pointer
+ImageViewRenderer
+::GetReferenceActor()
+{
+  return otb::DynamicCast< T >( m_ReferencePair.second );
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+typename T::ConstPointer
+ImageViewRenderer
+::GetReferenceActor() const
+{
+  return otb::DynamicCast< const T >( m_ReferencePair.second );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdImageViewRenderer_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h
new file mode 100644
index 0000000..add78b1
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImageViewWidget.h
@@ -0,0 +1,500 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImageViewWidget_h
+#define mvdImageViewWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+#include <QtOpenGL>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+#include "mvdAbstractImageViewRenderer.h"
+#include "mvdGui.h"
+
+
+#define USE_XP_REGION_OPTIM 0
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractImageViewManipulator;
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class ImageViewWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ */
+class OTBMonteverdiGUI_EXPORT ImageViewWidget :
+    public QGLWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ImageViewWidget( AbstractImageViewManipulator* manipulator,
+                   AbstractImageViewRenderer* renderer,
+                   QWidget* p =NULL,
+                   const QGLWidget* shareWidget =NULL,
+                   Qt::WindowFlags f =0 );
+
+  /** \brief Constructor. */
+  ImageViewWidget( AbstractImageViewManipulator* manipulator,
+                   AbstractImageViewRenderer* renderer,
+                   QGLContext* context,
+                   QWidget* p =NULL,
+                   const QGLWidget* shareWidget =NULL,
+                   Qt::WindowFlags f =0 );
+
+  /** \brief Constructor. */
+  ImageViewWidget( AbstractImageViewManipulator* manipulator,
+                   AbstractImageViewRenderer* renderer,
+                   const QGLFormat& format,
+                   QWidget* p =NULL,
+                   const QGLWidget *shareWidget =NULL,
+                   Qt::WindowFlags f =0 );
+
+  /** \brief Destructor. */
+  ~ImageViewWidget() ITK_OVERRIDE;
+
+  /**
+   */
+  void SetLayerStack( StackedLayerModel * stackedLayerModel,
+                      const PointType& center,
+                      double scale );
+
+  /**
+   */
+  void SetLayerStack( StackedLayerModel * );
+
+  /**
+   */
+  inline const StackedLayerModel * GetLayerStack() const;
+
+  /**
+   */
+  inline StackedLayerModel * GetLayerStack();
+
+  /**
+   * \brief Access the abstract view-manipualtor of this image-view.
+   *
+   * \return A pointer to the abstract view-manipulator of this image-view.
+   */
+  inline const AbstractImageViewManipulator* GetManipulator() const;
+
+  /**
+   * \brief Access the abstract model-renderer of this image-view.
+   *
+   * \return A pointer to the abstract model-renderer of this image-view.
+   */
+  inline const AbstractImageViewRenderer * GetRenderer() const;
+  inline AbstractImageViewRenderer * GetRenderer();
+
+  /**
+   */
+  bool SetBypassRenderingEnabled( bool );
+  /**
+   */
+  bool IsBypassRenderingEnabled() const;
+  /**
+   */
+  void SetPickingEnabled( bool );
+
+  /**
+   * This allows to set the fallback behaviour for picking
+   */
+  void SetPickingDefaultStatus( bool );
+  /**
+   */
+  bool IsPickingEnabled() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+  /**
+   */
+  void UpdateScene();
+  /**
+   */
+  void CenterOnSelected( const IndexType& index );
+  /**
+   */
+  void CenterOn( const PointType& center, double scale );
+  /**
+   */
+  void SaveScreenshot( bool );
+  /**
+   */
+  void ZoomToExtent();
+  /**
+   */
+  void ZoomToFullResolution();
+  /**
+   */
+  void ZoomToLayerExtent();
+  /**
+   */
+  void ZoomIn();
+  /**
+   */
+  void ZoomOut();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+  /**
+   */
+  void PhysicalCursorPositionChanged( const QPoint & screen,
+                                      const PointType & view,
+                                      const PointType & physical,
+                                      const DefaultImageType::PixelType & );
+
+  /**
+   */
+  void PixelInfoChanged( const QPoint & screen,
+			 const PointType & view,
+			 const PixelInfo::Vector & pixels );
+
+  /**
+   */
+  void ReferenceActorShaderModeChanged(const std::string & mode);
+  /**
+   */
+  void CenterRoiRequested( const PointType& center );
+  /**
+   */
+  void RoiChanged( const PointType& origin,
+                   const SizeType& size,
+                   const SpacingType& spacing,
+                   const PointType& center );
+  /**
+   */
+  void RoiChanged( const PointType& center, double sx, double sy );
+  /**
+   */
+  void CenterChanged( const PointType& center );
+  /**
+   */
+  void ScaleChanged( double sx, double sy );
+  /**
+   */
+  void ModelUpdated();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // Qt overloads.
+
+  void initializeGL() ITK_OVERRIDE;
+  void resizeGL( int widgth, int height ) ITK_OVERRIDE;
+  void paintGL() ITK_OVERRIDE;
+
+  void mouseMoveEvent( QMouseEvent* event ) ITK_OVERRIDE;
+  void mouseReleaseEvent( QMouseEvent* event ) ITK_OVERRIDE;
+  void mousePressEvent( QMouseEvent* event ) ITK_OVERRIDE;
+  void mouseDoubleClickEvent( QMouseEvent * event ) ITK_OVERRIDE;
+
+  void wheelEvent( QWheelEvent* event) ITK_OVERRIDE;
+
+  void keyPressEvent( QKeyEvent* event ) ITK_OVERRIDE;
+  void keyReleaseEvent( QKeyEvent* event ) ITK_OVERRIDE;
+
+  void resizeEvent( QResizeEvent* event ) ITK_OVERRIDE;
+
+
+//
+// Protected attributes.
+protected:
+  /**
+   */
+  bool m_IsPickingEnabled : 1;
+  bool m_PickingDefaultStatus : 1;
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+  /** Construction code (factorizes constructors initializations). */
+  void Initialize( AbstractImageViewManipulator* manipulator,
+                   AbstractImageViewRenderer* renderer );
+
+  /**
+   */
+  void ListGlVersions() const;
+
+  /**
+   */
+  void Center( const PointType& point, double sx, double sy );
+
+  /**
+   */
+  void Center( ZoomType zoom =ZOOM_TYPE_NONE );
+
+  /**
+   */
+  void Connect( AbstractLayerModel * );
+
+  /**
+   */
+  void Disconnect( AbstractLayerModel * );
+
+  /**
+   */
+  bool ApplyFixedZoomType();
+
+//
+// Private attributes.
+private:
+  /** Event handler pointer */
+  AbstractImageViewManipulator* m_Manipulator;
+
+  /** Model Renderer pointer */
+  AbstractImageViewRenderer* m_Renderer;
+
+  /** */
+#if USE_XP_REGION_OPTIM
+  PointType m_Position;
+#endif // USE_XP_REGION_OPTIM
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+private slots:
+  /**
+   */
+  void OnRoiChanged( const PointType&,
+                     const SizeType&,
+                     const SpacingType&,
+                     const PointType& );
+  /**
+   */
+  void OnSelectFirstLayerRequested();
+  /**
+   */
+  void OnSelectLastLayerRequested();
+  /**
+   */
+  void OnSelectPreviousLayerRequested();
+  /**
+   */
+  void OnSelectNextLayerRequested();
+  /**
+   */
+  void OnLowerLayerRequested();
+  /**
+   */
+  void OnRaiseLayerRequested();
+  /**
+   */
+  void OnDeleteAllRequested();
+  /**
+   */
+  void OnDeleteSelectedRequested();
+  /**
+   */
+  void OnReferenceChanged( size_t );
+  /**
+   */
+  void OnClearProjectionRequired();
+  /**
+   */
+  void OnSetProjectionRequired();
+  /**
+   */
+  void OnUpdateProjectionRequired();
+  /**
+   */
+  void OnLayerAdded( size_t );
+  /**
+   */
+  void OnLayerAboutToBeDeleted( size_t );
+  /**
+   */
+  void OnToggleLayerVisibilityRequested( bool );
+  /**
+   */
+  void OnResizeShaderRequested( double );
+  /**
+   */
+  void OnReparamShaderRequested( double );
+  /**
+   */
+  void OnShiftAlphaRequested( double );
+  /**
+   */
+  void OnUpdateGammaRequested( double );
+  /**
+   */
+  void OnShiftDynamicsRequested( double );
+  /**
+   */
+  void OnScaleDynamicsRequested( double );
+  /**
+   */
+  void OnResetQuantilesRequested( bool );
+  /**
+   */
+  void OnShaderEffectRequested( Effect );
+  /**
+   */
+  void OnApplyAllRequested();
+  /**
+   */
+  void OnSetReferenceRequested();
+  /**
+   */
+  void OnContentChanged();
+  /**
+   */
+  void OnContentReset();
+  /**
+   */
+  void OnRefreshViewRequested();
+  /**
+   */
+  void OnResetViewport();
+};
+
+}// end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdHistogramModel.h"
+#include "mvdAbstractImageViewManipulator.h"
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+const AbstractImageViewManipulator*
+ImageViewWidget
+::GetManipulator() const
+{
+  return m_Manipulator;
+}
+
+/*****************************************************************************/
+inline
+const AbstractImageViewRenderer*
+ImageViewWidget
+::GetRenderer() const
+{
+  return m_Renderer;
+}
+
+/*****************************************************************************/
+inline
+AbstractImageViewRenderer*
+ImageViewWidget
+::GetRenderer()
+{
+  return m_Renderer;
+}
+
+/*****************************************************************************/
+inline
+const StackedLayerModel *
+ImageViewWidget
+::GetLayerStack() const
+{
+  assert( m_Renderer!=NULL );
+
+  return m_Renderer->GetLayerStack();
+}
+
+/*****************************************************************************/
+inline
+StackedLayerModel *
+ImageViewWidget
+::GetLayerStack()
+{
+  assert( m_Renderer!=NULL );
+
+  return m_Renderer->GetLayerStack();
+}
+
+} // End of namespace 'mvd'
+
+#endif // mvdImageViewWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h b/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h
new file mode 100644
index 0000000..e887e4d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImportImagesDialog.h
@@ -0,0 +1,208 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImportImagesDialog_h
+#define mvdImportImagesDialog_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGDALOverviewsBuilder.h"
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ImportImagesDialog;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImportImagesDialog
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT ImportImagesDialog :
+    public QDialog
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Private types.
+public:
+  typedef std::vector< otb::GDALOverviewsBuilder::Pointer > GDALOverviewsBuilderVector;
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ImportImagesDialog( const QStringList & filename,
+		      QWidget * p =NULL,
+		      Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~ImportImagesDialog() ITK_OVERRIDE;
+
+  /**
+   */
+  int GetEffectiveCount() const;
+
+  /**
+   */
+  const GDALOverviewsBuilderVector & GetGDALOverviewsBuilders() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types
+private:
+
+//
+// Private methods.
+private:
+  /**
+   */
+  const otb::GDALOverviewsBuilder::Pointer & GetBuilder( const QModelIndex & ) const;
+  /**
+   */
+  void SetFilenames( const QStringList & );
+  /**
+   */
+  void SetHeaders();
+  /**
+   */
+  void UpdateFileSize( size_t row );
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::ImportImagesDialog * m_UI;
+
+  /**
+   */
+  QPushButton * m_IgnoreButton;
+
+  /**
+   */
+  GDALOverviewsBuilderVector m_GDALOverviewsBuilders;
+
+  /**
+   */
+  int m_EffectiveCount;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  void on_buttonBox_clicked( QAbstractButton * );
+
+  void on_pyramidWidget_BaseValueChanged( int );
+  void on_pyramidWidget_LevelsValueChanged( int );
+  void on_pyramidWidget_SizeValueChanged( int );
+
+  /**
+   */
+  void OnCurrentChanged( const QModelIndex & , const QModelIndex & );
+  /**
+   */
+  void OnItemChanged( QStandardItem * );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdImportImagesDialog_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdImportSubDatasetDialog.h b/Modules/Visualization/MonteverdiGui/include/mvdImportSubDatasetDialog.h
new file mode 100644
index 0000000..2c85630
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdImportSubDatasetDialog.h
@@ -0,0 +1,204 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdImportSubDatasetDialog_h
+#define mvdImportSubDatasetDialog_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ImportSubDatasetDialog;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ImportSubDatasetDialog
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT ImportSubDatasetDialog :
+    public QDialog
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ImportSubDatasetDialog( const QString & filename,
+		     QWidget* p = NULL,
+		     Qt::WindowFlags flags = 0 );
+
+  /** \brief Destructor. */
+  ~ImportSubDatasetDialog() ITK_OVERRIDE;
+
+  /**
+   */
+  void GetSubDatasets( IntVector & ) const;
+
+  /**
+   */
+  bool HasSubDatasets() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  void Setup( const QString & filename );
+
+  /**
+   */
+  void SetSubDatasetsCheckState( Qt::CheckState );
+
+//
+// Private types.
+private:
+  enum DatasetColumns
+  {
+    DATASET_COLUMN_INDEX = 0,
+    DATASET_COLUMN_DESC,
+    DATASET_COLUMN_NAME,
+    //
+    DATASET_COLUMN_COUNT
+  };
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  static char const * const DATASET_COLUMN_NAMES[ DATASET_COLUMN_COUNT ];
+
+  /**
+   * \brief uic generated.
+   */
+  Ui::ImportSubDatasetDialog * m_UI;
+
+  /**
+   */
+  bool m_HasSubDatasets : 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void on_allButton_clicked();
+  /**
+   */
+  void on_invertButton_clicked();
+  /**
+   */
+  void on_noneButton_clicked();
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdImportSubDatasetDialog_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdKeymapDialog.h b/Modules/Visualization/MonteverdiGui/include/mvdKeymapDialog.h
new file mode 100644
index 0000000..c6942bf
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdKeymapDialog.h
@@ -0,0 +1,111 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdKeymapDialog_h
+#define mvdKeymapDialog_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class KeymapDialog;
+}
+
+/** \class KeymapDialog
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ */
+class OTBMonteverdiGUI_EXPORT KeymapDialog :
+    public QDialog
+{
+  Q_OBJECT;
+
+//
+// Public methods.
+public:
+
+  /** Constructor */
+  KeymapDialog( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** Destructor */
+  ~KeymapDialog() ITK_OVERRIDE;
+
+//
+// SIGNALS.
+signals:
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  Ui::KeymapDialog* m_UI;
+
+//
+// SLOTS.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+#endif // mvdKeymapDialog_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h
new file mode 100644
index 0000000..24b0cf5
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackController.h
@@ -0,0 +1,207 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdLayerStackController_h
+#define mvdLayerStackController_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractModelController.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractLayerModel;
+class LayerStackWidget;
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class LayerStackController
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiGUI_EXPORT LayerStackController :
+    public AbstractModelController
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  LayerStackController( LayerStackWidget * widget, QObject * p =NULL );
+
+  /** \brief Destructor. */
+  ~LayerStackController() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void ApplyAllRequested();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+  /**
+   */
+  void UpdateButtonsState();
+
+  //
+  // AbstractModelController overloads.
+
+  /**
+   */
+  void Connect( AbstractModel * ) ITK_OVERRIDE;
+
+  /**
+   */
+  void Disconnect( AbstractModel * ) ITK_OVERRIDE;
+
+  /**
+   */
+  void ClearWidget() ITK_OVERRIDE;
+
+  /**
+   */
+  void virtual_ResetWidget( bool ) ITK_OVERRIDE;
+
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void OnCurrentChanged( int );
+  /**
+   */
+  void OnSelectionChanged( int );
+  /**
+   */
+  void OnStackedLayerCurrentChanged( size_t );
+  /**
+   */
+  void OnProjectionButtonClicked();
+  /**
+   */
+  void OnStackedLayerContentChanged();
+  /**
+   */
+  void OnStackedLayerContentReset();
+  /**
+   */
+  void OnCopyLayerRequested( const AbstractLayerModel * );
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdLayerStackController_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackItemModel.h b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackItemModel.h
new file mode 100644
index 0000000..3ae6c2d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackItemModel.h
@@ -0,0 +1,340 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdLayerStackItemModel_h
+#define mvdLayerStackItemModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class AbstractImageModel;
+class AbstractLayerModel;
+class StackedLayerModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class LayerStackItemModel
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OTBMonteverdiGUI_EXPORT LayerStackItemModel :
+    public QAbstractItemModel
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+  enum Columns
+  {
+    COLUMN_NONE = -1,
+    //
+    COLUMN_PROJ = 0,
+    COLUMN_RESOLUTION,
+    COLUMN_NAME,
+    COLUMN_EFFECT,
+    COLUMN_I,
+    COLUMN_J,
+    COLUMN_R,
+    COLUMN_G,
+    COLUMN_B,
+    COLUMN_X,
+    COLUMN_Y,
+    //
+    COLUMN_COUNT,
+  };
+
+  /*
+  enum ItemRole
+  {
+    ITEM_ROLE_INDEX = Qt::UserRole + 1
+    ITEM_ROLE_NAME,
+    ITEM_ROLE_I,
+    ITEM_ROLE_J,
+    ITEM_ROLE_R,
+    ITEM_ROLE_G,
+    ITEM_ROLE_B,
+    ITEM_ROLE_X,
+    ITEM_ROLE_Y,
+    //
+    ITEM_ROLE_NONE,
+    //
+    ITEM_ROLE_COUNT = ITEM_ROLE_NONE - Qt::UserRole,
+  };
+  */
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  LayerStackItemModel( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~LayerStackItemModel() ITK_OVERRIDE;
+
+  /**
+   */
+  static const AbstractLayerModel * GetLayer( const QModelIndex & );
+
+  /**
+   */
+  void SetStack( StackedLayerModel * );
+
+  //
+  // QAbstractItemModel overloads.
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#columnCount
+   */
+  int columnCount( const QModelIndex & p = QModelIndex() ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#data
+   */
+  
+    QVariant
+    data( const QModelIndex & index, int role = Qt::DisplayRole ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#dropMimeData
+   */
+  
+    bool
+    dropMimeData( const QMimeData * data,
+                  Qt::DropAction action,
+                  int row,
+                  int column,
+                  const QModelIndex & p ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#flags
+   */
+  Qt::ItemFlags flags( const QModelIndex & index ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#hasChildren
+   */
+  bool hasChildren( const QModelIndex & p = QModelIndex() ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#headerData
+   */
+  QVariant headerData( int section,
+                               Qt::Orientation orientation,
+                               int role = Qt::DisplayRole ) const ITK_OVERRIDE;
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#index
+   */
+  
+    QModelIndex
+    index( int row,
+           int column,
+           const QModelIndex & p = QModelIndex() ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#insertRows
+   */
+  
+    bool
+    insertRows( int row,
+                int count,
+                const QModelIndex & p = QModelIndex() ) ITK_OVERRIDE;
+
+  /**
+   * \see http://doc.qt.io/qt-4.8/qabstractitemmodel.html#mimeData
+   */
+  QMimeData * mimeData( const QModelIndexList & indexes ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://doc.qt.io/qt-4.8/qabstractitemmodel.html#mimeTypes
+   */
+  QStringList mimeTypes() const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#parent
+   */
+  QModelIndex parent( const QModelIndex & index ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#removeRows
+   */
+  
+    bool
+    removeRows( int row,
+                int count,
+                const QModelIndex & p = QModelIndex() ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#rowCount
+   */
+  int rowCount( const QModelIndex & p = QModelIndex() ) const ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#setData
+   */
+  
+    bool
+    setData( const QModelIndex & index,
+             const QVariant & value,
+             int role = Qt::EditRole ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#supportedDropActions
+   */
+  Qt::DropActions supportedDropActions() const ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  void Connect( AbstractLayerModel * );
+
+  /**
+   */
+  void Disconnect( AbstractLayerModel * );
+
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  StackedLayerModel * m_StackedLayerModel;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  // void OnContentAboutToBeChanged();
+  // void OnContentChanged();
+  // void OnModelAboutToBeReset();
+  // void OnModelReset();
+  void OnLayerAboutToBeDeleted( size_t );
+  void OnLayerAdded( size_t );
+  void OnLayerDeleted( size_t );
+  void OnLayerVisibilityChanged( AbstractLayerModel *, bool );
+  void OnReferenceChanged( size_t );
+  void OnPixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & );
+  void OnImageSettingsUpdated( AbstractImageModel * );
+  void OnResolutionsChanged( const PixelInfo::Vector & );
+};
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdLayerStackItemModel_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h
new file mode 100644
index 0000000..ae0a08d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdLayerStackWidget.h
@@ -0,0 +1,249 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdLayerStackWidget_h
+#define mvdLayerStackWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+class AbstractLayerModel;
+class LayerStackItemModel;
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class LayerStackWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class LayerStackWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT LayerStackWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  LayerStackWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~LayerStackWidget() ITK_OVERRIDE;
+
+  /**
+   */
+  const LayerStackItemModel * GetItemModel() const;
+
+  /**
+   */
+  LayerStackItemModel * GetItemModel();
+
+  /**
+   */
+  void SetCurrent( int );
+
+  /**
+   */
+  void SetApplyEnabled( bool );
+
+  /**
+   */
+  void SetDeleteEnabled( bool );
+
+  /**
+   */
+  void SetMoveEnabled( bool );
+
+  /**
+   */
+  void SetProjectionEnabled( bool );
+
+  /**
+   */
+  void SetReloadEnabled( bool );
+
+  /**
+   */
+  void InstallEventFilter( QObject * filter );
+
+  //
+  // QObject overloads.
+  //
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qobject.html#eventFilter
+   */
+  bool eventFilter( QObject * watched, QEvent * event ) ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void CurrentChanged( int );
+  /**
+   */
+  void SelectionChanged( int );
+  /**
+   */
+  void TopButtonClicked();
+  /**
+   */
+  void BottomButtonClicked();
+  /**
+   */
+  void UpButtonClicked();
+  /**
+   */
+  void DownButtonClicked();
+  /**
+   */
+  void DeleteLayerRequested();
+  /**
+   */
+  void DeleteAllLayersRequested();
+  /**
+   */
+  void RotateLayersRequested( int );
+  /**
+   */
+  void ProjectionButtonClicked();
+  /**
+   */
+  void ApplyButtonClicked();
+  /**
+   */
+  void CopyLayerRequested( const AbstractLayerModel * );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qabstractitemview.html#dropEvent
+   */
+  // virtual void dopEvent( QDropEvent * event );
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::LayerStackWidget * m_UI;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qitemselectionmodel.html#currentRowChanged
+   */
+  void OnCurrentRowChanged( const QModelIndex &, const QModelIndex & );
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qitemselectionmodel.html#selectionChanged
+   */
+  void OnSelectionChanged( const QItemSelection & selected,
+                           const QItemSelection & deselected );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdLayerStackWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdMainWindowTitleLoader.h b/Modules/Visualization/MonteverdiGui/include/mvdMainWindowTitleLoader.h
new file mode 100644
index 0000000..8a23aa3
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdMainWindowTitleLoader.h
@@ -0,0 +1,97 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMainWindowTitleLoader_h
+#define mvdMainWindowTitleLoader_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal class pre-declaration.
+class VectorImageModel;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class MainWindowTitleLoader
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Imports an image into a Monteverdi dataset
+ *
+ * This class is used to deport the dataset creation
+ * in a separate thread
+ */
+class OTBMonteverdiGUI_EXPORT MainWindowTitleLoader : public QObject
+{
+    Q_OBJECT;
+
+public:
+  /** \brief Constructor */
+  MainWindowTitleLoader(VectorImageModel* model);
+
+public slots:
+  /** \brief Trigger the dataset creation */
+  void LoadTitle();
+
+signals:
+  /** \brief Triggered after model is ready */
+  void TitleLoaded( const QString& );
+
+  /** \brief Triggered when processing is finished */
+  void Finished();
+
+private:
+
+  VectorImageModel* m_Model;
+};
+
+} // end namespace 'mvd'
+
+#endif // mvdImageModel_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdMultiResolutionPyramidWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdMultiResolutionPyramidWidget.h
new file mode 100644
index 0000000..9ff9591
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdMultiResolutionPyramidWidget.h
@@ -0,0 +1,178 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMultiResolutionPyramidWidget_h
+#define mvdMultiResolutionPyramidWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGDALOverviewsBuilder.h"
+#include "OTBMonteverdiGUIExport.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class MultiResolutionPyramidWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class MultiResolutionPyramidWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT MultiResolutionPyramidWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  MultiResolutionPyramidWidget( QWidget * p =NULL,
+				Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~MultiResolutionPyramidWidget() ITK_OVERRIDE;
+
+  /**
+   */
+  void SetBuilder( const otb::GDALOverviewsBuilder::Pointer & );
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  void BaseValueChanged( int );
+  void LevelsValueChanged( int );
+  void SizeValueChanged( int );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+  /**
+   */
+  void ClearResolutions();
+  /**
+   */
+  void UpdateResolutions();
+  /**
+   */
+  void UpdateSize();
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::MultiResolutionPyramidWidget * m_UI;
+  /**
+   */
+  otb::GDALOverviewsBuilder::Pointer m_GDALOverviewsBuilder;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  void on_baseSpinBox_valueChanged( int );
+  void on_levelsSpinBox_valueChanged( int );
+  void on_sizeSpinBox_valueChanged( int );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdMultiResolutionPyramidWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdMyWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdMyWidget.h
new file mode 100644
index 0000000..97866cc
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdMyWidget.h
@@ -0,0 +1,152 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdMyWidget_h
+#define mvdMyWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class MyWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class MyWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT MyWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  MyWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  virtual ~MyWidget();
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::MyWidget* m_UI;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdMyWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdOTBApplicationsModel.h b/Modules/Visualization/MonteverdiGui/include/mvdOTBApplicationsModel.h
new file mode 100644
index 0000000..af2eb95
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdOTBApplicationsModel.h
@@ -0,0 +1,218 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdOTBApplicationsModel_h
+#define mvdOTBApplicationsModel_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdAbstractModel.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+class ApplicationsBrowser;
+class ApplicationLauncher;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/** \class OTBApplicationsModel
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ */
+class OTBMonteverdiGUI_EXPORT OTBApplicationsModel :
+    public AbstractModel
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  OTBApplicationsModel( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~OTBApplicationsModel() ITK_OVERRIDE;
+
+  /** \brief Fill Widget Tree */
+  void FillTree();
+
+  /**
+   */
+  inline const ApplicationsBrowser* GetBrowser() const;
+
+  /**
+   */
+  inline ApplicationsBrowser* GetBrowser();
+
+  /**
+   */
+  inline const ApplicationLauncher* GetLauncher() const;
+
+  /**
+   */
+  inline ApplicationLauncher* GetLauncher();
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // AbstractModel methods.
+
+  void virtual_BuildModel( void* context =NULL ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /**
+   */
+  ApplicationsBrowser* m_ApplicationsBrowser;
+
+  /**
+   */
+  ApplicationLauncher* m_ApplicationLauncher;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Monteverdi deferred includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*****************************************************************************/
+inline
+const ApplicationsBrowser*
+OTBApplicationsModel
+::GetBrowser() const
+{
+  return m_ApplicationsBrowser;
+}
+
+/*****************************************************************************/
+inline
+ApplicationsBrowser*
+OTBApplicationsModel
+::GetBrowser()
+{
+  return m_ApplicationsBrowser;
+}
+/*****************************************************************************/
+inline
+const ApplicationLauncher*
+OTBApplicationsModel
+::GetLauncher() const
+{
+  return m_ApplicationLauncher;
+}
+
+/*****************************************************************************/
+inline
+ApplicationLauncher*
+OTBApplicationsModel
+::GetLauncher()
+{
+  return m_ApplicationLauncher;
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdOTBApplicationsModel_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h
new file mode 100644
index 0000000..e7c7430
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h
@@ -0,0 +1,186 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdPixelDescriptionWidget_h
+#define mvdPixelDescriptionWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class PixelDescriptionWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class PixelDescriptionWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget to show current pixel under cursor description
+ */
+class OTBMonteverdiGUI_EXPORT PixelDescriptionWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  PixelDescriptionWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~PixelDescriptionWidget() ITK_OVERRIDE;
+
+  /** Get TreeWidget */
+  QTreeWidget * GetDescriptionTree();
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  void OnCurrentPhysicalUpdated(const QStringList&);
+
+  void OnCurrentGeographicUpdated(const QStringList& /*currentGeo const QString &*/);
+
+  void OnCurrentPixelValueUpdated(const VectorImageType::PixelType &,
+                                  const QStringList& bandNames);
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  void SetupUI();
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::PixelDescriptionWidget* m_UI;
+
+  // /**
+  //  * \brief map storing applications and its tags
+  //  */
+  // ApplicationsTagContainer m_AppTags;
+
+  // /**
+  //  * \brief map storing applications docName and appName association
+  //  */
+  // ApplicationDocNameToNameMap m_AppsDocNameToNameMap;
+
+  /**
+   * \brief text to search in the widget tree
+   */
+  QString                  m_SearchText;
+
+  /**
+   * \brief Root items
+   */
+  QTreeWidgetItem*    m_CartographicRootItem;
+  QTreeWidgetItem*    m_GeographicRootItem;
+  QTreeWidgetItem*    m_PixelValueRootItem;
+
+   /**
+   * \brief child items
+   */
+  QTreeWidgetItem*    m_CartographicItem;
+  QTreeWidgetItem*    m_GeographicItem;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+} // end namespace 'mvd'
+
+#endif // mvdPixelDescriptionWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h
new file mode 100644
index 0000000..831f7ec
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h
@@ -0,0 +1,737 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdQtWidgetParameterInitializers_h
+#define mvdQtWidgetParameterInitializers_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "otbMacro.h"
+#include "otbQtFileSelectionWidget.h"
+#include "otbWrapperQtWidgetInputFilenameParameter.h"
+#include "otbWrapperQtWidgetInputFilenameListParameter.h"
+#include "otbWrapperQtWidgetInputImageParameter.h"
+#include "otbWrapperQtWidgetInputImageListParameter.h"
+#include "otbWrapperQtWidgetInputProcessXMLParameter.h"
+#include "otbWrapperQtWidgetInputVectorDataParameter.h"
+#include "otbWrapperQtWidgetInputVectorDataListParameter.h"
+#include "otbWrapperQtWidgetOutputFilenameParameter.h"
+#include "otbWrapperQtWidgetOutputImageParameter.h"
+#include "otbWrapperQtWidgetOutputProcessXMLParameter.h"
+#include "otbWrapperQtWidgetOutputVectorDataParameter.h"
+#include "otbWrapperQtWidgetParameterFactory.h"
+#endif //tag=QT4-boost-compatibility
+
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+namespace Wrapper
+{
+
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* FUNCTIONS DEFINITION SECTION                                              */
+
+/**
+ */
+template< typename W >
+void
+SetupForFilenameDrop( W* widget, const char* text =NULL );
+
+/**
+ */
+template< typename W >
+void
+SetupOutputFilename( W* widget,
+                     const QDir& dir,
+                     const QString& prefix,
+                     const QString& extension );
+
+/**
+ */
+template< typename W >
+void
+SetupOutputFilename( W * widget,
+                     const QDir & =QDir::current() );
+
+/**
+ */
+template< typename F >
+inline void SetupWidget( QWidget * widget, const F& functor );
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class FileSelectionInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class FileSelectionInitializer : public std::unary_function<
+  otb::Wrapper::QtFileSelectionWidget*,
+  void
+  >
+{
+public:
+  inline FileSelectionInitializer();
+  inline result_type operator () ( argument_type widget ) const;
+};
+
+/**
+ * \class InputImageInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputImageInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputImageParameter*,
+  void
+  >
+{
+public:
+  inline InputImageInitializer();
+  inline result_type operator () ( argument_type widget ) const;
+};
+
+/**
+ * \class InputImageListInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputImageListInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputImageListParameter*,
+  void
+  >
+{
+public:
+  inline InputImageListInitializer( QWidget * view );
+
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+  QWidget * m_View;
+};
+
+/**
+ * \class InputVectorDataInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputVectorDataInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputVectorDataParameter*,
+  void >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+};
+
+/**
+ * \class InputVectorDataListInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputVectorDataListInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputVectorDataListParameter*,
+  void >
+{
+public:
+  inline InputVectorDataListInitializer( QWidget * view );
+
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+  QWidget * m_View;
+};
+
+/**
+ * \class InputFilenameInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputFilenameInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputFilenameParameter*,
+  void >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+};
+
+/**
+ * \class InputFilenameListInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputFilenameListInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputFilenameListParameter*,
+  void >
+{
+public:
+  inline InputFilenameListInitializer( QWidget * view );
+
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+  QWidget * m_View;
+};
+
+/**
+ * \class InputProcessXMLInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class InputProcessXMLInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetInputProcessXMLParameter *,
+  void >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+};
+
+/**
+ * \class OutputImageInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OutputImageInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetOutputImageParameter*,
+  void
+  >
+{
+public:
+  inline OutputImageInitializer( const QString & prefix );
+
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+  QString m_Prefix;
+};
+
+/**
+ * \class OutputVectorDataInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OutputVectorDataInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetOutputVectorDataParameter*,
+  void
+  >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+};
+
+/**
+ * \class OutputFilenameInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OutputFilenameInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetOutputFilenameParameter*,
+  void
+  >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+};
+
+/**
+ * \class OutputProcessXMLInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class OutputProcessXMLInitializer : public std::unary_function<
+  otb::Wrapper::QtWidgetOutputProcessXMLParameter *,
+  void
+  >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+
+private:
+};
+
+/**
+ * \class ToolTipInitializer
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+class ToolTipInitializer : public std::unary_function< QWidget*, void >
+{
+public:
+  inline result_type operator () ( argument_type widget ) const;
+};
+
+} // end namespace 'Wrapper'.
+
+} // end namespace 'mvd'.
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdI18nCoreApplication.h"
+#include "mvdFilenameDragAndDropEventFilter.h"
+#endif //tag=QT4-boost-compatibility
+
+namespace mvd
+{
+
+namespace Wrapper
+{
+
+/*****************************************************************************/
+inline
+FileSelectionInitializer
+::FileSelectionInitializer()
+{
+}
+
+/*****************************************************************************/
+inline
+FileSelectionInitializer::result_type
+FileSelectionInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+}
+
+/*****************************************************************************/
+inline
+InputImageInitializer
+::InputImageInitializer()
+{
+}
+
+/*****************************************************************************/
+inline
+InputImageInitializer::result_type
+InputImageInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+}
+
+/*****************************************************************************/
+inline
+InputImageListInitializer
+::InputImageListInitializer( QWidget * view ) :
+  m_View( view )
+{
+}
+
+/*****************************************************************************/
+inline
+InputImageListInitializer::result_type
+InputImageListInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  QObject::connect(
+    widget, SIGNAL( FileSelectionWidgetAdded( QWidget * ) ),
+    m_View, SLOT( OnFileSelectionWidgetAdded0( QWidget * ) )
+  );
+
+  SetupWidget( widget, FileSelectionInitializer() );
+}
+
+/*****************************************************************************/
+inline
+InputFilenameInitializer::result_type
+InputFilenameInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+}
+
+/*****************************************************************************/
+inline
+InputFilenameListInitializer
+::InputFilenameListInitializer( QWidget * view ) :
+  m_View( view )
+{
+}
+
+/*****************************************************************************/
+inline
+InputFilenameListInitializer::result_type
+InputFilenameListInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  QObject::connect(
+    widget, SIGNAL( FileSelectionWidgetAdded( QWidget * ) ),
+    m_View, SLOT( OnFileSelectionWidgetAdded0( QWidget * ) )
+  );
+
+  SetupWidget( widget, FileSelectionInitializer() );
+}
+
+/*****************************************************************************/
+inline
+InputVectorDataInitializer::result_type
+InputVectorDataInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+}
+
+/*****************************************************************************/
+inline
+InputVectorDataListInitializer
+::InputVectorDataListInitializer( QWidget * view ) :
+  m_View( view )
+{
+}
+
+/*****************************************************************************/
+inline
+InputVectorDataListInitializer::result_type
+InputVectorDataListInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  QObject::connect(
+    widget, SIGNAL( FileSelectionWidgetAdded( QWidget * ) ),
+    m_View, SLOT( OnFileSelectionWidgetAdded0( QWidget * ) )
+  );
+
+  SetupWidget( widget, FileSelectionInitializer() );
+}
+
+/*****************************************************************************/
+inline
+InputProcessXMLInitializer::result_type
+InputProcessXMLInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+}
+
+/*****************************************************************************/
+inline
+ToolTipInitializer::result_type
+ToolTipInitializer
+::operator () ( argument_type otbUseInDebug( widget ) ) const
+{
+#if defined( OTB_DEBUG )
+  assert( widget!=NULL );
+
+  widget->setToolTip(
+    widget->toolTip() +
+    "\n(" +
+    widget->metaObject()->className() +
+    ")"
+  );
+
+#endif // defined( OTB_DEBUG )
+}
+
+/*****************************************************************************/
+inline
+OutputImageInitializer
+::OutputImageInitializer( const QString& prefix ) :
+  m_Prefix( prefix )
+{
+}
+
+/*****************************************************************************/
+inline
+OutputImageInitializer::result_type
+OutputImageInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+  assert( I18nCoreApplication::ConstInstance()!=NULL );
+
+  if( m_Prefix.isEmpty() )
+    {
+    SetupForFilenameDrop( widget, "You can drop filename here." );
+
+    assert( qApp!=NULL );
+    assert( !qApp->arguments().empty() );
+
+    SetupOutputFilename( widget );
+    }
+  else
+    SetupOutputFilename(
+      widget,
+      I18nCoreApplication::ConstInstance()->GetResultsDir(),
+      m_Prefix,
+      ".tif"
+    );
+}
+
+/*****************************************************************************/
+inline
+OutputVectorDataInitializer::result_type
+OutputVectorDataInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+
+  assert( qApp!=NULL );
+  assert( !qApp->arguments().empty() );
+
+  SetupOutputFilename( widget );
+}
+
+/*****************************************************************************/
+inline
+OutputFilenameInitializer::result_type
+OutputFilenameInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+
+  assert( qApp!=NULL );
+  assert( !qApp->arguments().empty() );
+
+  SetupOutputFilename( widget );
+}
+
+/*****************************************************************************/
+inline
+OutputProcessXMLInitializer::result_type
+OutputProcessXMLInitializer
+::operator () ( argument_type widget ) const
+{
+  assert( widget!=NULL );
+
+  SetupForFilenameDrop( widget, "You can drop filename here." );
+
+  assert( qApp!=NULL );
+  assert( !qApp->arguments().empty() );
+
+  // MANTIS-1103
+  // {
+  // SetupOutputFilename( widget );
+  // }
+}
+
+/*****************************************************************************/
+template< typename W >
+void
+SetupForFilenameDrop( W* widget, const char* text )
+{
+  assert( widget!=NULL );
+
+  QLineEdit * lineEdit = widget->GetInput();
+
+  //
+  // Setup widget.
+  bool signalsBlocked = lineEdit->blockSignals( true );
+  {
+  if( text!=NULL )
+    {
+    lineEdit->setPlaceholderText(
+      QCoreApplication::translate(
+        "mvd::Wrapper::QtWidgetView",
+        text
+      )
+    );
+    }
+
+  // lineEdit->setReadOnly( true );
+
+  lineEdit->setToolTip(
+    lineEdit->toolTip() +
+    "\n" +
+    QCoreApplication::translate(
+      "mvd::Wrapper::QtWidgetView",
+      "You can drag filename from file-manager and drop it here."
+    )
+  );
+  }
+  lineEdit->blockSignals( signalsBlocked );
+
+
+  //
+  // Install event-filters.
+
+  QObject* eventFilter = new FilenameDragAndDropEventFilter( lineEdit );
+
+  lineEdit->installEventFilter( eventFilter );
+
+  QObject::connect(
+    eventFilter,
+    SIGNAL( FilenameDropped( const QString& ) ),
+    // to:
+    lineEdit,
+    SLOT( setText( const QString& ) )
+  );
+}
+
+/*****************************************************************************/
+template< typename W >
+void
+SetupOutputFilename( W* widget,
+                     const QDir& dir,
+                     const QString& prefix,
+                     const QString& extension )
+{
+  QString id( QUuid::createUuid().toString() );
+
+  id.replace( QRegExp( "[\\{|\\}]" ), "" );
+
+  if( prefix!=NULL )
+    id.prepend( "_" );
+
+  widget->SetFileName(
+    dir.absoluteFilePath( prefix + id + extension )
+  );
+
+  widget->UpdateGUI();
+}
+
+/*****************************************************************************/
+template< typename W >
+void
+SetupOutputFilename( W * widget,
+                     const QDir & dir )
+{
+  widget->SetFileName( dir.path() );
+
+  widget->UpdateGUI();
+}
+
+/*******************************************************************************/
+template< typename F >
+inline
+void
+SetupWidget( QWidget * widget, const F & functor )
+{
+  typedef typename F::argument_type Widget;
+  typedef QList< Widget > WidgetList;
+
+  WidgetList list( widget->findChildren< Widget >() );
+
+  for( typename WidgetList::iterator it( list.begin() );
+       it!=list.end();
+       ++it )
+    {
+    functor( *it );
+    }
+}
+
+} // end namespace 'Wrapper'.
+
+} // end namespace 'mvd'
+
+#endif // mvdQtWidgetParameterInitializers_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h
new file mode 100644
index 0000000..417ebf0
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h
@@ -0,0 +1,324 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdWrapperQtWidgetView_h
+#define mvdWrapperQtWidgetView_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "ConfigureMonteverdi.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "otbWrapperApplication.h"
+#include "otbWrapperQtWidgetModel.h"
+#endif //tag=QT4-boost-compatibility
+#include "OTBMonteverdiGUIExport.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
+#include "mvdTypes.h"
+#endif //tag=QT4-boost-compatibility
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+namespace Wrapper
+{
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ApplicationLauncher
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief WIP.
+ */
+
+class OTBMonteverdiGUI_EXPORT QtWidgetView :
+    public QWidget
+{
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT
+
+  Q_PROPERTY( bool isClosable
+	      READ IsClosable
+	      WRITE SetClosable );
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   */
+  static char const * const OBJECT_NAME;
+
+  /** \brief Constructor. */
+  QtWidgetView( const otb::Wrapper::Application::Pointer & otbApp,
+		QWidget* p =0,
+		Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~QtWidgetView() ITK_OVERRIDE;
+
+  /** \brief Gui Creation. */
+  void CreateGui();
+
+  /** \brief Model Accessor */
+  inline otb::Wrapper::QtWidgetModel* GetModel()
+  {
+    return m_Model;
+  }
+
+  /**
+   * \return The OTB-application pointer of this view.
+   */
+  otb::Wrapper::Application::ConstPointer GetApplication() const
+  {
+    return otb::ConstCast< otb::Wrapper::Application >(
+      m_Application
+    );
+  }
+
+  /**
+   */
+  inline bool IsClosable() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  void QuitSignal();
+
+  void OTBApplicationOutputImageChanged( const QString &, const QString &);
+
+  void ExecuteAndWriteOutput();
+
+  void ExecutionDone( int nbOutputs );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // QWidget overloads.
+
+  void closeEvent( QCloseEvent * event ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+  QtWidgetView(const QtWidgetView&); //purposely not implemented
+  void operator=(const QtWidgetView&); //purposely not implemented
+
+  QWidget* CreateFooter();
+
+  QWidget* CreateInputWidgets();
+
+  QWidget* CreateDoc();
+
+  /**
+   */
+  void SetupParameterWidgets( QWidget* widget );
+
+  /**
+   */
+  void SetupFileSelectionWidget( QWidget * );
+
+//
+// Private attributes.
+
+private:
+
+  otb::Wrapper::Application::Pointer m_Application;
+  otb::Wrapper::QtWidgetModel* m_Model;
+
+  QPushButton* m_ExecButton;
+  QPushButton* m_QuitButton;
+  QLabel* m_Message;
+
+  bool m_IsClosable : 1;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+
+  // slot in charge of emitting a signal to the catalogue mainWindow.
+  // when received, the main application need to get the output
+  // image filename{s} set by the user in this OTB application (if any).
+  void OnApplicationExecutionDone( int );
+
+  void UpdateMessageAfterApplicationReady(bool val);
+
+  /**
+   */
+  void OnExecButtonClicked();
+
+  /**
+   */
+  inline void OnProgressReportBegin();
+
+  /**
+   */
+  inline void OnProgressReportEnd( int status );
+
+  /**
+   */
+  void OnExceptionRaised( QString what );
+
+  /**
+   */
+  inline void SetClosable( bool );
+
+  /**
+   */
+  inline void OnFileSelectionWidgetAdded0( QWidget * );
+
+  /**
+   */
+  inline void OnFileSelectionWidgetAdded1( QWidget * );
+};
+
+} // end namespace 'Wrapper'
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+namespace Wrapper
+{
+
+/*****************************************************************************/
+inline
+bool
+QtWidgetView
+::IsClosable() const
+{
+  return m_IsClosable;
+}
+
+/*****************************************************************************/
+inline
+void
+QtWidgetView
+::SetClosable( bool enabled )
+{
+  m_IsClosable = enabled;
+
+  setEnabled( true );
+
+  if( m_QuitButton!=NULL )
+    m_QuitButton->setEnabled( m_IsClosable );
+}
+
+/*******************************************************************************/
+inline
+void
+QtWidgetView
+::OnProgressReportBegin()
+{
+  SetClosable( false );
+}
+
+/*******************************************************************************/
+inline
+void
+QtWidgetView
+::OnProgressReportEnd( int )
+{
+  SetClosable( true );
+}
+
+/*******************************************************************************/
+inline
+void
+QtWidgetView
+::OnFileSelectionWidgetAdded0( QWidget * widget )
+{
+  SetupFileSelectionWidget( widget );
+}
+
+/*******************************************************************************/
+inline
+void
+QtWidgetView
+::OnFileSelectionWidgetAdded1( QWidget * widget )
+{
+  SetupFileSelectionWidget( widget );
+}
+
+} // end namespace 'Wrapper'
+
+} // end namespace 'mvd'
+
+#endif
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQuicklookViewManipulator.h b/Modules/Visualization/MonteverdiGui/include/mvdQuicklookViewManipulator.h
new file mode 100644
index 0000000..36feefe
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdQuicklookViewManipulator.h
@@ -0,0 +1,197 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdQuicklookViewManipulator_h
+#define mvdQuicklookViewManipulator_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdImageViewManipulator.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class QuicklookViewManipulator
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ *  \brief TODO.
+ */
+class OTBMonteverdiGUI_EXPORT QuicklookViewManipulator :
+    public ImageViewManipulator
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+  QuicklookViewManipulator( const otb::ViewSettings::Pointer& viewSettings,
+                            QObject* p =NULL );
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+  QuicklookViewManipulator( QObject* p =NULL );
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+
+  /** \brief Destructor. */
+  ~QuicklookViewManipulator() ITK_OVERRIDE;
+
+  //
+  // ImageViewManipulator overloads.
+
+  ZoomType GetFixedZoomType() const ITK_OVERRIDE;
+
+  
+    void
+    SetupRenderingContext(
+      AbstractImageViewRenderer::RenderingContext * const ) const ITK_OVERRIDE;
+
+
+  void MousePressEvent( QMouseEvent* event ) ITK_OVERRIDE;
+
+  void MouseMoveEvent( QMouseEvent* event ) ITK_OVERRIDE;
+
+  // virtual void MousePressEvent( QMouseEvent* event );
+
+  // virtual void MouseReleaseEvent( QMouseEvent* event );
+
+  void MouseDoubleClickEvent( QMouseEvent * ) ITK_OVERRIDE {};
+
+  void WheelEvent( QWheelEvent* event) ITK_OVERRIDE;
+
+  void ResizeEvent( QResizeEvent * event ) ITK_OVERRIDE;
+
+  void KeyPressEvent( QKeyEvent* event ) ITK_OVERRIDE;
+
+  void KeyReleaseEvent( QKeyEvent* event ) ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]-----------------------------------------------**/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  PointType m_RoiOrigin;
+  /**
+   */
+  SpacingType m_RoiSpacing;
+  /**
+   */
+  SizeType m_RoiSize;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void OnRoiChanged( const PointType& origin,
+                     const SizeType& size,
+                     const SpacingType& spacing,
+                     const PointType& center );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdQuicklookViewManipulator_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQuicklookViewRenderer.h b/Modules/Visualization/MonteverdiGui/include/mvdQuicklookViewRenderer.h
new file mode 100644
index 0000000..b633836
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdQuicklookViewRenderer.h
@@ -0,0 +1,203 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdQuicklookViewRenderer_h
+#define mvdQuicklookViewRenderer_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtCore>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGlROIActor.h"
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdImageViewRenderer.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace otb
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class QuicklookViewRenderer
+ *
+ * \ingroup OTBMonteverdiGUI
+ */
+class OTBMonteverdiGUI_EXPORT QuicklookViewRenderer :
+    public ImageViewRenderer
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+  /**
+   */
+  struct RenderingContext :
+    public ImageViewRenderer::RenderingContext
+  {
+    /**
+     */
+    inline
+    RenderingContext() :
+      ImageViewRenderer::RenderingContext(),
+      m_RoiOrigin(),
+      m_RoiExtent()
+    {
+      m_RoiOrigin.Fill( 0 );
+      m_RoiOrigin.Fill( 0 );
+    }
+
+    ~RenderingContext() ITK_OVERRIDE {}
+
+    PointType m_RoiOrigin;
+    PointType m_RoiExtent;
+  };
+
+//
+// Public methods.
+public:
+  /** Constructor */
+  QuicklookViewRenderer( QObject* p = NULL );
+
+  /** Destructor */
+  ~QuicklookViewRenderer() ITK_OVERRIDE;
+
+  //
+  // ImageViewRenderer overloads.
+
+  
+  AbstractImageViewRenderer::RenderingContext* NewRenderingContext() const ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+// public slots
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// SIGNALS.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // ImageViewRenderer overloads.
+
+  
+  void UpdateActors( const AbstractImageViewRenderer::RenderingContext* c ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types
+private:
+
+//
+// Private methods.
+private:
+
+  void SetWktAndKwl();
+
+  //
+  // ImageViewRenderer methods.
+  void virtual_SetProjection() ITK_OVERRIDE;
+  void virtual_UpdateProjection() ITK_OVERRIDE;
+
+  //
+  // AbstractImageViewRenderer overloads.
+  // TODO: Move virtual_*Scene() methods to protected section.
+  void virtual_FinishScene() ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  otb::GlROIActor::Pointer m_GlRoiActor;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// SLOTS.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdQuicklookViewRenderer_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdSearchableTreeWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdSearchableTreeWidget.h
new file mode 100644
index 0000000..3d33283
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdSearchableTreeWidget.h
@@ -0,0 +1,189 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdSearchableTreeWidget_h
+#define mvdSearchableTreeWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+// #include "mvdTypes.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class SearchableTreeWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class SearchableTreeWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Database content browser. Presents:
+ * - Cached datasets.
+ */
+class OTBMonteverdiGUI_EXPORT SearchableTreeWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  SearchableTreeWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~SearchableTreeWidget() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private types.
+private:
+  /**
+   * \brief List of dataset item names displayed under the 'dataset'
+   * root item.
+   */
+  QList< QTreeWidgetItem* > TreeWidgetItemList;
+
+//
+// Private methods.
+private:
+  /**
+   * \brief Setup UI sub-items.
+   */
+  void SetupUI();
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::SearchableTreeWidget* m_UI;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+
+  /**
+   * \brief Slot called when the current item of the QWidgetTree has
+   * changed.
+   *
+   * \param current The newly selected DatasetTreeWidgetItem.
+   * \param previous The previously selected QTreeWidgetItem.
+   */
+  /*
+  void on_databaseTreeWidget_currentItemChanged( QTreeWidgetItem* current,
+						 QTreeWidgetItem* previous );
+  */
+
+  /**
+   */
+  // void on_searchLineEdit_textChanged( const QString& text );
+
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdSearchableTreeWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h
new file mode 100644
index 0000000..640131d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdShaderWidget.h
@@ -0,0 +1,170 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdShaderWidget_h
+#define mvdShaderWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdImageSettingsInterface.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class ShaderWidget;
+};
+
+class ImageSettings;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class ShaderWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT ShaderWidget :
+  public QWidget,
+  public ImageSettingsInterface
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  ShaderWidget( QWidget * p =NULL,
+		Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~ShaderWidget() ITK_OVERRIDE;
+
+  /**
+   */
+  void SetGLSLEnabled( bool );
+  /**
+   */
+  void SetGLSL140Enabled( bool );
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  void SettingsChanged();
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+  /** */
+  void virtual_SetSettings( ImageSettings * ) ITK_OVERRIDE;
+
+//
+// Private attributes.
+private:
+  /**
+   * \brief uic generated.
+   */
+  Ui::ShaderWidget * m_UI;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  void on_effectComboBox_currentIndexChanged( const QString & );
+  void on_sizeSpinBox_valueChanged( int );
+  void on_valueLineEdit_editingFinished();
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdShaderWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdStatusBarWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdStatusBarWidget.h
new file mode 100644
index 0000000..e287ee7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdStatusBarWidget.h
@@ -0,0 +1,205 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdStatusBarWidget_h
+#define mvdStatusBarWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTypes.h"
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+class StatusBarWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class StatusBarWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Status Bar widget
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT StatusBarWidget :
+    public QWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  StatusBarWidget( QWidget* p =NULL, Qt::WindowFlags flags =0 );
+
+  /** \brief Destructor. */
+  ~StatusBarWidget() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /**
+   */
+  void SetPixelIndex( const IndexType &, bool isInside );
+
+  /**
+   */
+  void SetText( const QString & );
+
+  /**
+   */
+  void SetScale( double sx, double sy );
+
+  /**
+   */
+  void SetGLSLEnabled( bool );
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+  /**
+   */
+  void ScaleChanged( double );
+  /**
+   */
+  void PixelIndexChanged( const IndexType & );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+  /**
+   */
+  static QString ZoomLevel( double scale );
+
+//
+// Private attributes.
+private:
+
+  /**
+   * \brief uic generated.
+   */
+  Ui::StatusBarWidget * m_UI;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  // void SetPixelIndexText( const QString& );
+  /**
+   */
+  void on_scaleLineEdit_editingFinished();
+  /**
+   */
+  void on_pixelIndexLineEdit_returnPressed();
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+
+namespace mvd
+{
+
+} // end namespace 'mvd'
+
+#endif // mvdStatusBarWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdTaskProgressDialog.h b/Modules/Visualization/MonteverdiGui/include/mvdTaskProgressDialog.h
new file mode 100644
index 0000000..0bb0379
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdTaskProgressDialog.h
@@ -0,0 +1,204 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdTaskProgressDialog_h
+#define mvdTaskProgressDialog_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+class BackgroundTask;
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class TaskProgressDialog
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT TaskProgressDialog :
+    public QProgressDialog
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   */
+  TaskProgressDialog( BackgroundTask* task,
+		      QWidget* p =NULL,
+		      Qt::WindowFlags flags =0 );
+
+  /**
+   * \brief Destructor.
+   */
+  ~TaskProgressDialog() ITK_OVERRIDE;
+
+  /**
+   */
+  int Exec();
+
+  /**
+   */
+  inline QObject * GetObject() const;
+
+  /**
+   */
+  template< typename T >
+    inline
+    T* GetObject() const;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+  // Mask Qt native dialogue exec to be replaced by custom Exec()
+  // method. Reason: QDialog::exec() is not virtual.
+  using QProgressDialog::exec;
+
+//
+// Private attributes.
+private:
+  /**
+   */
+  BackgroundTask* m_BackgroundTask;
+  /**
+   */
+  QObject* m_Object;
+  /**
+   */
+  std::exception m_Exception;
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+  /**
+   */
+  void OnDone( QObject* result );
+  /**
+   */
+  void OnExceptionRaised( QString what );
+  /**
+   */
+  void OnObjectDestroyed( QObject* object );
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+/*****************************************************************************/
+inline
+QObject *
+TaskProgressDialog
+::GetObject() const
+{
+  return m_Object;
+}
+
+/*****************************************************************************/
+template< typename T >
+inline
+T*
+TaskProgressDialog
+::GetObject() const
+{
+  return qobject_cast< T* >( m_Object );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdTaskProgressDialog_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdTreeWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdTreeWidget.h
new file mode 100644
index 0000000..97fdc1d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdTreeWidget.h
@@ -0,0 +1,223 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdTreeWidget_h
+#define mvdTreeWidget_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+#define USE_CUSTOM_MIME_DATA 1
+
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+/*****************************************************************************/
+/* FUNCTIONS DEFINITION SECTION                                              */
+
+/**
+ */
+QMimeData*
+EncodeMimeData( QMimeData* mimeData, const QList< QTreeWidgetItem* >& items );
+
+/**
+ */
+int
+DecodeMimeData( QList< QTreeWidgetItem* >& items, const QMimeData* mimeData );
+
+//
+// Internal classes pre-declaration.
+namespace Ui
+{
+//class TreeWidget;
+};
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class TreeWidget
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT TreeWidget :
+    public QTreeWidget
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types and constants.
+public:
+  /**
+   */
+  static const char* ITEM_MIME_TYPE;
+
+  /**
+   */
+  typedef QList< QTreeWidgetItem* > QTreeWidgetItemList;
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  TreeWidget( QWidget* p =NULL );
+
+  /** \brief Destructor. */
+  ~TreeWidget() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /**
+   */
+  void ItemMoved( QTreeWidgetItem * item, QTreeWidgetItem * target );
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  //
+  // QTreeWidget overloads.
+
+  QStringList mimeTypes() const ITK_OVERRIDE;
+
+  QMimeData* mimeData( const QList< QTreeWidgetItem* > items ) const ITK_OVERRIDE;
+
+  void dragEnterEvent( QDragEnterEvent* event ) ITK_OVERRIDE;
+  void dragMoveEvent( QDragMoveEvent* event ) ITK_OVERRIDE;
+  void dragLeaveEvent( QDragLeaveEvent* event ) ITK_OVERRIDE;
+  void dropEvent( QDropEvent* event ) ITK_OVERRIDE;
+
+  Qt::DropActions supportedDropActions() const ITK_OVERRIDE;
+  void startDrag( Qt::DropActions supportedActions ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+
+/*****************************************************************************/
+/* GLOBAL FUNCTIONS DECLARATION                                              */
+
+#if USE_CUSTOM_MIME_DATA
+
+//
+// Declare Qt tree-widget item pointer types so they can be wrapped by
+// QVariant.
+Q_DECLARE_METATYPE( QTreeWidgetItem* );
+
+
+#define TREE_WIDGET_ITEM_USE_STREAM_OPERATORS 1
+
+#if TREE_WIDGET_ITEM_USE_STREAM_OPERATORS
+
+/**
+ */
+QDataStream&
+operator << ( QDataStream& out, QTreeWidgetItem const * item );
+
+/**
+ */
+QDataStream&
+operator >>( QDataStream& in, QTreeWidgetItem * & item );
+
+#endif // !DATASTREAM_USE_TEMPLATE_OPERATORS
+
+#endif // USE_CUSTOM_MIME_DATA
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdTreeWidget_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdTreeWidgetItem.h b/Modules/Visualization/MonteverdiGui/include/mvdTreeWidgetItem.h
new file mode 100644
index 0000000..4b70058
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdTreeWidgetItem.h
@@ -0,0 +1,268 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdTreeWidgetItem_h
+#define mvdTreeWidgetItem_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+class TreeWidgetItem;
+
+//
+// Functions declarations.
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class TreeWidgetItem
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief
+ */
+class OTBMonteverdiGUI_EXPORT TreeWidgetItem :
+    public QTreeWidgetItem // not a QObject
+{
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public types.
+public:
+  enum ColumnIndex
+  {
+    COLUMN_INDEX_TEXT = 0,
+    COLUMN_INDEX_ID = 1,
+    COLUMN_INDEX_HASH = 2,
+  };
+
+  enum ItemType
+  {
+    ITEM_TYPE_NONE = QTreeWidgetItem::UserType,
+    ITEM_TYPE_NODE = QTreeWidgetItem::UserType + 1,
+    ITEM_TYPE_LEAF = QTreeWidgetItem::UserType + 2,
+  };
+
+  enum ItemRole
+  {
+    ITEM_ROLE_ID = Qt::UserRole + 1,
+  };
+
+//
+// Public methods.
+public:
+
+  /**
+   * \brief Constructor.
+   */
+  TreeWidgetItem( QTreeWidgetItem* p =NULL,
+                  const QString& text =QString(),
+                  const QVariant& id =QVariant(),
+                  const QStringList& columns = QStringList(),
+                  TreeWidgetItem::ItemType type =TreeWidgetItem::ITEM_TYPE_LEAF );
+
+  /**
+   * \brief Destructor.
+   */
+  ~TreeWidgetItem() ITK_OVERRIDE;
+
+  /**
+   */
+  inline TreeWidgetItem::ItemType GetType() const;
+
+  /**
+   */
+  inline QVariant GetId() const;
+
+  /**
+   */
+  inline QString GetText() const;
+
+  /**
+   * \brief Get the datasetID
+   */
+  inline QString GetHash() const;
+
+  //
+  // QTreeWidgetItem overloads.
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qtreewidgetitem.html#clone
+   */
+  QTreeWidgetItem* clone() const ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Protected attributes.
+protected:
+
+//
+// Private methods.
+private:
+
+  /**
+   */
+  static const int m_MetaTypeId;
+  /**
+   */
+  static const int m_PointerMetaTypeId;
+  /**
+   */
+  static const int m_ConstPointerMetaTypeId;
+
+  /**
+   */
+  inline void SetId( const QVariant& id );
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+
+};
+
+} // end namespace 'mvd'
+
+/*
+//
+// Declare TreeWidgetItem meta-type so it can be used for drag-and-drop
+// operations.
+Q_DECLARE_METATYPE( mvd::TreeWidgetItem );
+*/
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+
+/*****************************************************************************/
+inline
+TreeWidgetItem::ItemType
+TreeWidgetItem
+::GetType() const
+{
+  return
+    type() < QTreeWidgetItem::UserType
+    ? TreeWidgetItem::ITEM_TYPE_NONE
+    : TreeWidgetItem::ItemType( type() );
+}
+
+/*****************************************************************************/
+inline
+QVariant
+TreeWidgetItem
+::GetId() const
+{
+  return data( COLUMN_INDEX_ID, TreeWidgetItem::ITEM_ROLE_ID );
+}
+
+/*****************************************************************************/
+inline
+void
+TreeWidgetItem
+::SetId( const QVariant& id )
+{
+  setData( COLUMN_INDEX_ID, TreeWidgetItem::ITEM_ROLE_ID, id );
+  setText( COLUMN_INDEX_ID, id.toString() );
+}
+
+/*****************************************************************************/
+inline
+QString
+TreeWidgetItem
+::GetText() const
+{
+  return text( COLUMN_INDEX_TEXT );
+}
+
+/*****************************************************************************/
+inline
+QString
+TreeWidgetItem
+::GetHash() const
+{
+  return text( COLUMN_INDEX_HASH );
+}
+
+} // end namespace 'mvd'
+
+#endif // mvdTreeWidgetItem_h
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdTreeWidgetItemDragAndDropEventFilter.h b/Modules/Visualization/MonteverdiGui/include/mvdTreeWidgetItemDragAndDropEventFilter.h
new file mode 100644
index 0000000..c3c798a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/include/mvdTreeWidgetItemDragAndDropEventFilter.h
@@ -0,0 +1,169 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 mvdTreeWidgetItemDragAndDropEventFilter_h
+#define mvdTreeWidgetItemDragAndDropEventFilter_h
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "OTBMonteverdiGUIExport.h"
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractDragAndDropEventFilter.h"
+
+/*****************************************************************************/
+/* PRE-DECLARATION SECTION                                                   */
+
+//
+// External classes pre-declaration.
+namespace
+{
+}
+
+namespace mvd
+{
+
+//
+// Internal classes pre-declaration.
+
+
+/*****************************************************************************/
+/* CLASS DEFINITION SECTION                                                  */
+
+/**
+ * \class TreeWidgetItemDragAndDropEventFilter
+ *
+ * \ingroup OTBMonteverdiGUI
+ *
+ * \brief Widget template skeleton to copy-paste when adding a new
+ * widget class.
+ */
+class OTBMonteverdiGUI_EXPORT TreeWidgetItemDragAndDropEventFilter :
+    public AbstractDragAndDropEventFilter
+{
+
+  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
+
+  Q_OBJECT;
+
+  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
+
+//
+// Public methods.
+public:
+
+  /** \brief Constructor. */
+  TreeWidgetItemDragAndDropEventFilter( QObject* p =NULL );
+
+  /** \brief Destructor. */
+  ~TreeWidgetItemDragAndDropEventFilter() ITK_OVERRIDE;
+
+  /*-[ PUBLIC SLOTS SECTION ]------------------------------------------------*/
+
+//
+// Public SLOTS.
+public slots:
+
+  /*-[ SIGNALS SECTION ]-----------------------------------------------------*/
+
+//
+// Signals.
+signals:
+
+  /**
+   */
+  void ItemDropped( QTreeWidgetItem* item );
+
+
+  /*-[ PROTECTED SECTION ]---------------------------------------------------*/
+
+//
+// Protected methods.
+protected:
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragEnterEvent
+   */
+  bool DragEnterEvent( QObject* object, QDragEnterEvent* event ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragLeaveEvent
+   */
+  bool DragLeaveEvent( QObject* object, QDragLeaveEvent* event ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dragMoveEvent
+   */
+  bool DragMoveEvent( QObject* object, QDragMoveEvent* event ) ITK_OVERRIDE;
+
+  /**
+   * \see http://qt-project.org/doc/qt-4.8/qwidget.html#dropEvent
+   */
+  bool DropEvent( QObject* object, QDropEvent* event ) ITK_OVERRIDE;
+
+//
+// Protected attributes.
+protected:
+
+  /*-[ PRIVATE SECTION ]-----------------------------------------------------*/
+
+//
+// Private methods.
+private:
+
+//
+// Private attributes.
+private:
+
+  /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/
+
+//
+// Slots.
+private slots:
+};
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* INLINE SECTION                                                            */
+
+namespace mvd
+{
+} // end namespace 'mvd'
+
+#endif // mvdTreeWidgetItemDragAndDropEventFilter_h
diff --git a/Modules/Visualization/MonteverdiGui/otb-module.cmake b/Modules/Visualization/MonteverdiGui/otb-module.cmake
new file mode 100644
index 0000000..e904301
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/otb-module.cmake
@@ -0,0 +1,23 @@
+set(DOCUMENTATION
+  "This module provides MonteverdiGui, the GUI library of the Monteverdi applications."
+  )
+
+otb_module( OTBMonteverdiGUI
+  ENABLE_SHARED
+  DEPENDS
+    OTBCommon
+    OTBIce
+    OTBIOGDAL
+    OTBMonteverdiCore
+    OTBQt4
+    OTBQwt
+
+  OPTIONAL_DEPENDS
+    OTBQtWidget
+
+  TEST_DEPENDS
+    OTBTestKernel
+
+  DESCRIPTION
+  "${DOCUMENTATION}"
+  )
diff --git a/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt
new file mode 100644
index 0000000..b61d295
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/CMakeLists.txt
@@ -0,0 +1,182 @@
+#############################################################################
+set( OTBMonteverdiGUI_SRCS
+  mvdAboutDialog.cxx
+  mvdAbstractDragAndDropEventFilter.cxx
+  mvdAbstractModelController.cxx
+  mvdColorBandDynamicsWidget.cxx
+  mvdColorDynamicsController.cxx
+  mvdColorDynamicsWidget.cxx
+  mvdColorSetupController.cxx
+  mvdColorSetupWidget.cxx
+  mvdDoubleValidator.cxx
+  mvdDropLineEdit.cxx
+  mvdFilenameDragAndDropEventFilter.cxx
+  mvdGui.cxx
+  mvdHistogramController.cxx
+  mvdHistogramPlotPicker.cxx
+  mvdHistogramWidget.cxx
+  mvdI18nApplication.cxx
+  mvdI18nMainWindow.cxx
+  mvdImageViewRenderer.cxx
+  mvdImageViewManipulator.cxx
+  mvdImageViewWidget.cxx
+  mvdImportImagesDialog.cxx
+  mvdImportSubDatasetDialog.cxx
+  mvdKeymapDialog.cxx
+  mvdLayerStackController.cxx
+  mvdLayerStackItemModel.cxx
+  mvdLayerStackWidget.cxx
+  mvdMainWindowTitleLoader.cxx
+  mvdMultiResolutionPyramidWidget.cxx
+  #mvdMyWidget.cxx
+  mvdPixelDescriptionWidget.cxx
+  mvdQuicklookViewManipulator.cxx
+  mvdQuicklookViewRenderer.cxx
+  mvdSearchableTreeWidget.cxx
+  mvdShaderWidget.cxx
+  mvdStatusBarWidget.cxx
+  mvdTaskProgressDialog.cxx
+  mvdTreeWidget.cxx
+  mvdTreeWidgetItem.cxx
+  mvdTreeWidgetItemDragAndDropEventFilter.cxx
+ )
+
+#############################################################################
+set( OTBMonteverdiGUI_HEADERS_MOC
+  ../include/mvdAboutDialog.h
+  ../include/mvdAbstractDragAndDropEventFilter.h
+  ../include/mvdAbstractImageViewManipulator.h
+  ../include/mvdAbstractImageViewRenderer.h
+  ../include/mvdAbstractModelController.h
+  ../include/mvdColorBandDynamicsWidget.h
+  ../include/mvdColorDynamicsController.h
+  ../include/mvdColorDynamicsWidget.h
+  ../include/mvdColorSetupController.h
+  ../include/mvdColorSetupWidget.h
+  #../include/mvdDatabaseBrowserController.h
+  #../include/mvdDatabaseBrowserWidget.h
+  #../include/mvdDatabaseBrowserWidgetTest.h
+  #../include/mvdDatabaseTreeWidget.h
+  #../include/mvdDatasetCreationProgressDialog.h
+  #../include/mvdDatasetDragAndDropEventFilter.h
+  #../include/mvdDatasetPropertiesController.h
+  #../include/mvdDatasetPropertiesWidget.h
+  ../include/mvdDoubleValidator.h
+  ../include/mvdDropLineEdit.h
+  ../include/mvdFilenameDragAndDropEventFilter.h
+  #mvdGui.h
+  ../include/mvdHistogramController.h
+  ../include/mvdHistogramPlotPicker.h
+  ../include/mvdHistogramWidget.h
+  ../include/mvdI18nApplication.h
+  ../include/mvdI18nMainWindow.h
+  ../include/mvdImageViewManipulator.h
+  ../include/mvdImageViewRenderer.h
+  ../include/mvdImageViewWidget.h
+  ../include/mvdImportImagesDialog.h
+  ../include/mvdImportSubDatasetDialog.h
+  ../include/mvdKeymapDialog.h
+  ../include/mvdLayerStackController.h
+  ../include/mvdLayerStackItemModel.h
+  ../include/mvdLayerStackWidget.h
+  ../include/mvdMainWindowTitleLoader.h
+  ../include/mvdMultiResolutionPyramidWidget.h
+  #mvdMyWidget.h
+  ../include/mvdPixelDescriptionWidget.h
+  ../include/mvdQuicklookViewManipulator.h
+  ../include/mvdQuicklookViewRenderer.h
+  ../include/mvdSearchableTreeWidget.h
+  ../include/mvdStatusBarWidget.h
+  ../include/mvdTaskProgressDialog.h
+  ../include/mvdTreeWidget.h
+  #mvdTreeWidgetItem.h
+  ../include/mvdTreeWidgetItemDragAndDropEventFilter.h
+  ../include/mvdShaderWidget.h
+)
+
+#############################################################################
+set( OTBMonteverdiGUI_FORMS
+  mvdAboutDialog.ui
+  mvdColorBandDynamicsWidget.ui
+  mvdColorDynamicsWidget.ui
+  mvdColorSetupWidget.ui
+  #mvdDatabaseBrowserWidget.ui
+  #mvdDatabaseBrowserWidgetTest.ui
+  #mvdDatasetCreationProgressDialog.ui
+  #mvdDatasetPropertiesWidget.ui
+  mvdHistogramWidget.ui
+  mvdImportImagesDialog.ui
+  mvdImportSubDatasetDialog.ui
+  mvdKeymapDialog.ui
+  mvdLayerStackWidget.ui
+  mvdMultiResolutionPyramidWidget.ui
+  #mvdMyWidget.ui
+  mvdPixelDescriptionWidget.ui
+  mvdSearchableTreeWidget.ui
+  mvdShaderWidget.ui
+  mvdStatusBarWidget.ui
+  mvdVideoColorToolBox.ui
+)
+
+#############################################################################
+set( OTBMonteverdiGUI_RESOURCES
+  # mvdIcons.qrc
+)
+
+#############################################################################
+if( OTBQtWidget_ENABLED )
+  list( APPEND OTBMonteverdiGUI_SRCS
+    mvdApplicationLauncher.cxx
+    mvdApplicationsToolBox.cxx
+    mvdApplicationsToolBoxController.cxx
+    mvdOTBApplicationsModel.cxx
+    mvdQtWidgetView.cxx
+  )
+
+  list( APPEND OTBMonteverdiGUI_HEADERS_MOC
+    ../include/mvdApplicationLauncher.h
+    ../include/mvdApplicationsToolBox.h
+    ../include/mvdApplicationsToolBoxController.h
+    ../include/mvdOTBApplicationsModel.h
+    ../include/mvdQtWidgetView.h
+    )
+
+  list( APPEND OTBMonteverdiGUI_FORMS
+    mvdApplicationsToolBox.ui
+    )
+
+  list( APPEND OTBMonteverdiGUI_RESOURCES
+    # mvdApplicationsToolBox.qrc
+    )
+endif()
+
+#############################################################################
+qt4_wrap_cpp( OTBMonteverdiGUI_SRC_MOC ${OTBMonteverdiGUI_HEADERS_MOC} )
+qt4_wrap_ui( OTBMonteverdiGUI_FORMS_HEADERS ${OTBMonteverdiGUI_FORMS} )
+qt4_add_resources( OTBMonteverdiGUI_RESOURCES_RCC ${OTBMonteverdiGUI_RESOURCES} )
+
+#############################################################################
+add_to_qt4_i18n_sources( ${OTBMonteverdiGUI_SRCS} )
+add_to_qt4_i18n_headers( "../include" ${OTBMonteverdiGUI_SRCS} )
+add_to_qt4_i18n_forms( ${OTBMonteverdiGUI_FORMS} )
+
+#############################################################################
+add_library( OTBMonteverdiGUI
+  ${OTBMonteverdiGUI_SRCS}
+  ${OTBMonteverdiGUI_FORMS_HEADERS}
+  ${OTBMonteverdiGUI_SRC_MOC}
+  ${OTBMonteverdiGUI_RESOURCES_RCC}
+)
+
+#############################################################################
+target_link_libraries( OTBMonteverdiGUI
+  ${OTBCommon_LIBRARIES}
+  ${OTBIce_LIBRARIES}
+  ${OTBIOGDAL_LIBRARIES}
+  ${OTBMonteverdiCore_LIBRARIES}
+  ${OTBQtWidget_LIBRARIES}
+  ${OTBQwt_LIBRARIES}
+  )
+
+#############################################################################
+otb_module_target( OTBMonteverdiGUI )
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdAboutDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdAboutDialog.cxx
new file mode 100644
index 0000000..8f9fff1
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdAboutDialog.cxx
@@ -0,0 +1,75 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAboutDialog.h"
+#include "ui_mvdAboutDialog.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::AboutDialog
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*******************************************************************************/
+AboutDialog
+::AboutDialog( QWidget* p, Qt::WindowFlags flags ) :
+  QDialog( p, flags ),
+  m_UI( new mvd::Ui::AboutDialog() )
+{
+  m_UI->setupUi( this );
+
+  m_UI->m_ProjectLabel->setText( qApp->applicationName() );
+  m_UI->m_VersionLabel->setText( qApp->applicationVersion() );
+}
+
+/*******************************************************************************/
+AboutDialog
+::~AboutDialog()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdAboutDialog.ui b/Modules/Visualization/MonteverdiGui/src/mvdAboutDialog.ui
new file mode 100644
index 0000000..3affacf
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdAboutDialog.ui
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::AboutDialog</class>
+ <widget class="QDialog" name="mvd::AboutDialog">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>464</width>
+    <height>487</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>About...</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLabel" name="m_ProjectLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Monteverdi</string>
+         </property>
+         <property name="scaledContents">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="m_VersionLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="font">
+          <font>
+           <italic>true</italic>
+          </font>
+         </property>
+         <property name="text">
+          <string>OTB version M.m.pl (codename)</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="m_CopyrightLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::NoFrame</enum>
+       </property>
+       <property name="text">
+        <string><br /><p>Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.</p><p>See Copyright.txt for details.</p><br /><p>Monteverdi is distributed under the CeCILL licence version 2. See</p><p>Licence_CeCILL_V2-en.txt or</p><p><a href="http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt">http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt</a> for more details.</p&g [...]
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="m_CloseButton">
+         <property name="text">
+          <string>&Close</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>m_CloseButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>m_CloseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>mvd::AboutDialog</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>359</x>
+     <y>398</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>206</x>
+     <y>211</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdAbstractDragAndDropEventFilter.cxx b/Modules/Visualization/MonteverdiGui/src/mvdAbstractDragAndDropEventFilter.cxx
new file mode 100644
index 0000000..5d454ac
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdAbstractDragAndDropEventFilter.cxx
@@ -0,0 +1,111 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAbstractDragAndDropEventFilter.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::AbstractDragAndDropEventFilter
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+AbstractDragAndDropEventFilter
+::AbstractDragAndDropEventFilter( QObject* p  ) :
+  QObject( p )
+{
+}
+
+/*****************************************************************************/
+AbstractDragAndDropEventFilter
+::~AbstractDragAndDropEventFilter()
+{
+}
+
+/*****************************************************************************/
+bool
+AbstractDragAndDropEventFilter
+::eventFilter( QObject* object, QEvent* e )
+{
+  switch( e->type() )
+    {
+    case QEvent::DragEnter:
+      return DragEnterEvent( object, dynamic_cast< QDragEnterEvent* >( e ) );
+      break;
+
+    case QEvent::DragMove:
+      return DragMoveEvent( object, dynamic_cast< QDragMoveEvent* >( e ) );
+      break;
+
+    case QEvent::DragLeave:
+      return DragLeaveEvent( object, dynamic_cast< QDragLeaveEvent* >( e ) );
+      break;
+
+    case QEvent::Drop:
+      return DropEvent( object, dynamic_cast< QDropEvent* >( e ) );
+      break;
+
+    default:
+      break;
+    }
+
+  return QObject::eventFilter( object, e );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdAbstractModelController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdAbstractModelController.cxx
new file mode 100644
index 0000000..61426f5
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdAbstractModelController.cxx
@@ -0,0 +1,223 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdAbstractModelController.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::AbstractModelController
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*******************************************************************************/
+AbstractModelController
+::AbstractModelController( QWidget* widget, QObject* p ):
+  QObject( p ),
+  m_Widget( widget ),
+  m_Model( NULL )
+{
+  assert( widget!=NULL );
+
+  QObject::connect(
+    this, SIGNAL( destroyed( QObject* ) ),
+    this, SLOT( OnDestroyed( QObject* ) )
+  );
+
+  QObject::connect(
+    widget, SIGNAL( destroyed( QObject* ) ),
+    this, SLOT( OnDestroyed( QObject* ) )
+  );
+}
+
+/*******************************************************************************/
+AbstractModelController
+::~AbstractModelController()
+{
+  /*
+  assert( m_Model==NULL && "AbstractModelController::m_Model should be
+  disconnected before destroying controller instance." );
+  */
+}
+
+/*****************************************************************************/
+void
+AbstractModelController
+::SetModel( AbstractModel* model )
+{
+  // Disconnect previously connected model and signal listeners.
+  private_Disconnect( m_Model );
+
+  // Disable GUI widget while there is no model.
+  GetWidget()->setEnabled( false );
+
+  // Clear widget from previous values.
+  private_ClearWidget();
+
+  // Forget previously disconnected model before new model is
+  // connected. This is done in order to stay in a consistent internal
+  // state whenever the connection is aborted (e.g. by an exception).
+  m_Model = NULL;
+
+  // Connect new model and signal listeners.
+  private_Connect( model );
+
+  // Remember newly connected model.
+  m_Model = model;
+
+  // Enable GUI widget when there is a model.
+  if( m_Model!=NULL )
+    {
+    virtual_ResetWidget( true );
+
+    GetWidget()->setEnabled( true );
+    }
+}
+
+/*****************************************************************************/
+void
+AbstractModelController
+::private_Connect( AbstractModel* model )
+{
+  if( model==NULL )
+    return;
+
+  emit AboutToConnectModel( model );
+
+  QObject::connect(
+    model, SIGNAL( destroyed( QObject* ) ),
+    this, SLOT( OnDestroyed( QObject* ) )
+  );
+
+  Connect( model );
+
+  emit ModelConnected( model );
+}
+
+/*****************************************************************************/
+void
+AbstractModelController
+::private_Disconnect( AbstractModel* model )
+{
+  if( model==NULL )
+    return;
+
+  emit AboutToDisconnectModel( model );
+
+  Disconnect( model );
+
+  QObject::disconnect(
+    model, SIGNAL( destroyed( QObject* ) ),
+    this, SLOT( OnDestroyed( QObject* ) )
+  );
+
+  emit ModelDisconnected( model );
+}
+
+/*****************************************************************************/
+void
+AbstractModelController
+::private_ClearWidget()
+{
+  // Reset UI from model.
+  ClearWidget();
+}
+
+/*****************************************************************************/
+void
+AbstractModelController
+::ResetWidget()
+{
+  // Reset UI from model.
+  virtual_ResetWidget( false );
+
+#if 0
+  // Signal model has been updated.
+  // When resetting widget, data is read from model and set into
+  // widget so, there's no need to signal back model update.
+  emit ModelUpdated();
+#endif
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+AbstractModelController
+::RefreshWidget()
+{
+}
+
+/*******************************************************************************/
+void
+AbstractModelController
+::OnDestroyed( QObject* object )
+{
+  assert( object!=NULL );
+
+  if( object==m_Widget )
+    {
+    // qDebug() << "Disconnect (widget) on destroy.";
+
+    // When wrapped widget is destroyed, auto-destroy controller which
+    // has no other reason to live than to wrap the widget.
+    //
+    // N.B.: Qt will automatically disconnect all signals from deleted
+    // object.
+    deleteLater();
+    }
+  else if( object==m_Model )
+    {
+#if 0
+    qDebug() << "Disconnect (model" << object << ") on destroy.";
+
+    // When model is destroyed, safely disconnect-it from controller
+    // if no previous call to SetModel( NULL ) has been made from
+    // client.
+    //
+    // N.B.: This is quite equivalent to SetModel( NULL ) but is
+    // quite bit faster.
+    private_Disconnect( m_Model );
+#endif
+    }
+}
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx
new file mode 100644
index 0000000..1d57992
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx
@@ -0,0 +1,276 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdApplicationLauncher.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbWrapperApplicationRegistry.h"
+#include "otbWrapperApplication.h"
+ 
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdI18nCoreApplication.h"
+//#include "mvdTextStream.h"
+#include "mvdQtWidgetView.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ApplicationLauncher
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ApplicationLauncher
+::ApplicationLauncher( QObject* p ) :
+  QObject( p )
+{
+}
+
+/*******************************************************************************/
+ApplicationLauncher
+::~ApplicationLauncher()
+{
+}
+
+/*******************************************************************************/
+Wrapper::QtWidgetView *
+ApplicationLauncher
+::NewOtbApplicationWidget( const QString & appName,
+			   bool isStandalone,
+			   QWidget * p,
+			   Qt::WindowFlags flags ) const
+{
+  // Create module
+  otb::Wrapper::Application::Pointer otbApp(
+    otb::Wrapper::ApplicationRegistry::CreateApplication(
+      ToStdString( appName )
+    )
+  );
+
+  if( otbApp.IsNull() )
+    {
+    throw std::runtime_error(
+      ToStdString(
+	tr( "Failed to instantiate OTB-application '%1'." )
+	.arg( appName )
+      )
+    );
+    }
+
+  if( !isStandalone )
+    {
+    // Search for elev parameters
+    typedef std::vector< std::string > ParametersKeys;
+    const ParametersKeys parameters( otbApp->GetParametersKeys() );
+
+    // Little flag structure with bool operator to optimize look
+    // scanning parameter keys.
+    struct Flags
+    {
+      Flags() :
+        m_HasDem( false ),
+        m_HasGeoid( false )
+      {
+      }
+
+      inline operator bool () const
+      {
+        return m_HasDem && m_HasGeoid;
+      }
+
+      bool m_HasDem : 1;
+      bool m_HasGeoid : 1;
+    };
+
+    Flags found;
+
+    for( ParametersKeys::const_iterator it( parameters.begin() );
+         it!=parameters.end() && !found;
+         ++it )
+      {
+      std::size_t lastDot = it->find_last_of('.');
+
+      assert( I18nCoreApplication::ConstInstance()!=NULL );
+      const I18nCoreApplication* i18nApp = I18nCoreApplication::ConstInstance();
+
+      if( lastDot != std::string::npos )
+        {
+        std::string lastKey(
+          it->substr( lastDot + 1, it->size() - lastDot - 1 )
+        );
+
+        if( lastKey=="dem" )
+          {
+          found.m_HasDem = true;
+
+          if( i18nApp->HasSettingsKey(
+                I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE ) &&
+              i18nApp->RetrieveSettingsKey(
+                I18nCoreApplication::SETTINGS_KEY_SRTM_DIR_ACTIVE ).toBool() )
+            {
+            otbApp->EnableParameter( *it );
+            otbApp->SetParameterString(
+              *it,
+              ToStdString(
+                i18nApp->RetrieveSettingsKey(
+                  I18nCoreApplication::SETTINGS_KEY_SRTM_DIR
+                )
+                .toString()
+              )
+            );
+            }
+          }
+        else if( lastKey=="geoid" )
+          {
+          found.m_HasGeoid = true;
+
+          if( i18nApp->HasSettingsKey(
+                I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE ) &&
+              i18nApp->RetrieveSettingsKey(
+                I18nCoreApplication::SETTINGS_KEY_GEOID_PATH_ACTIVE )
+              .toBool() )
+            {
+            otbApp->EnableParameter( *it );
+
+            otbApp->SetParameterString(
+              *it,
+              ToStdString(
+                i18nApp->RetrieveSettingsKey(
+                  I18nCoreApplication::SETTINGS_KEY_GEOID_PATH
+                )
+                .toString()
+              )
+            );
+            }
+          }
+        }
+      }
+    }
+
+  // Create GUI based on module
+  Wrapper::QtWidgetView * gui =
+    new Wrapper::QtWidgetView( otbApp, p, flags );
+
+  gui->CreateGui();
+
+  return gui;
+}
+/*******************************************************************************/
+QWidget * 
+ApplicationLauncher
+::NewOtbApplicationWindow( const QString & appName,
+			   bool isStandalone,
+			   QWidget * p,
+			   Qt::WindowFlags flags  ) const
+{
+#if 0
+  Wrapper::QtWidgetView * appWidget =
+    ApplicationLauncher::NewOtbApplicationWidget( appName, isStandalone );
+
+  assert( appWidget!=NULL );
+  assert( appWidget->GetApplication() );
+
+  QMainWindow * mainWindow = new QMainWindow( p, flags );
+
+  mainWindow->setWindowTitle(
+    QString( "%1 (OTB-" OTB_VERSION_STRING ")" )
+    .arg( appWidget->GetApplication()->GetDocName() )
+  );
+
+  mainWindow->setWindowIcon( QIcon( ":/otb_small.png" ) );
+ 
+  mainWindow->setCentralWidget( appWidget );
+
+  // Connect OTB-app widget quit signal, to the mainWindow close slot.
+  QObject::connect(
+    appWidget,
+    SIGNAL( QuitSignal() ),
+    // to:
+    mainWindow,
+    SLOT( close() )
+  );
+
+  return mainWindow;
+
+#else
+  Wrapper::QtWidgetView * appWidget =
+    ApplicationLauncher::NewOtbApplicationWidget(
+      appName,
+      isStandalone,
+      p,
+      flags | Qt::Window
+    );
+
+  assert( appWidget!=NULL );
+  assert( appWidget->GetApplication() );
+
+  appWidget->setWindowTitle(
+    QString( "%1 (OTB-" OTB_VERSION_STRING ")" )
+    .arg( appWidget->GetApplication()->GetDocName() )
+  );
+
+  appWidget->setWindowIcon( QIcon( ":/icons/process" ) );
+ 
+  QObject::connect(
+    appWidget,
+    SIGNAL( QuitSignal() ),
+    // to:
+    appWidget,
+    SLOT( close() )
+  );
+
+  return appWidget;
+#endif
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx
new file mode 100644
index 0000000..954c14e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx
@@ -0,0 +1,384 @@
+ /*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdApplicationsToolBox.h"
+#include "ui_mvdApplicationsToolBox.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ApplicationsToolBox
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+enum COLUMN
+{
+  COLUMN_NAME = 0,
+  COLUMN_TITLE,
+  //
+  COLUMN_COUNT,
+};
+
+enum ItemType
+{
+  ITEM_TYPE_ROOT = 0,
+  ITEM_TYPE_TAG,
+  ITEM_TYPE_APPLICATION,
+  //
+  TYPE_COUNT,
+};
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ApplicationsToolBox
+::ApplicationsToolBox( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::ApplicationsToolBox() ),
+  m_AppTags(),
+  m_AppsDocNameToNameMap(),
+  m_SearchText()
+{
+  m_UI->setupUi( this );
+
+  //
+  // connect search box changed
+  QObject::connect(m_UI->m_SearchLine,
+                   SIGNAL( textChanged(const QString &) ),
+                   this,
+                   SLOT( OnSearchBoxChanged(const QString &) )
+    );
+
+  //
+  // connect double click on the tree Widget
+  QObject::connect( m_UI->m_AlgorithmsTree,
+                   SIGNAL( itemDoubleClicked(QTreeWidgetItem* ,int) ),
+                   this,
+                   SLOT( OnAlgorithmTreeDoubleClick(QTreeWidgetItem* ,int) )
+    );
+
+  // put a place holder text in search area
+#if (QT_VERSION >= 0x407000)
+  m_UI->m_SearchLine->setPlaceholderText( tr("Search Application ...") );
+#endif
+}
+
+/*******************************************************************************/
+ApplicationsToolBox
+::~ApplicationsToolBox()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+// QTreeWidget *
+// ApplicationsToolBox
+// ::GetAlgorithmsTree()
+// {
+//   return m_UI->m_AlgorithmsTree;
+// }
+
+/*******************************************************************************/
+void
+ApplicationsToolBox
+::FillTreeUsingTags()
+{
+  assert( m_UI->m_AlgorithmsTree!=NULL );
+
+  //
+  // clear algorithms tree
+  m_UI->m_AlgorithmsTree->clear();
+
+  if( m_AppTags.empty() )
+    return;
+
+  // 
+  // main item (title)
+#if USE_ALGORITHM_ROOT_NODE
+  QTreeWidgetItem * mainItem =
+    new QTreeWidgetItem( m_UI->m_AlgorithmsTree, ITEM_TYPE_ROOT );
+
+  mainItem->setText( COLUMN_NAME, tr( "Orfeo Toolbox Algorithms" ) );
+  mainItem->setExpanded( !m_SearchText.isEmpty() );
+  mainItem->setFlags( Qt::NoItemFlags | Qt::ItemIsEnabled );
+#endif // USE_ALGORITHME_ROOT_NODE
+
+  QString search( m_SearchText.simplified() );
+
+  // 
+  // iterate on map: key as high-level item / algorithms as lower-level items
+  for( ApplicationsTagContainer::const_iterator itTag( m_AppTags.begin() );
+       itTag!=m_AppTags.end();
+       ++itTag )
+    {
+    //
+    // current Doctag name
+    QString  qcurrentTag( (*itTag).first.c_str() );
+
+    // If a current tag applicaton name match the searchText, add the
+    // tag as an item to the tree
+    if (m_SearchText.isEmpty() ||  
+	IsSearchTextMatchAnyAlgorithm( qcurrentTag, search ) || 
+	qcurrentTag.contains( search, Qt::CaseInsensitive ) )
+      {
+      //
+      // step #1 ->  DocTag is a main item
+      QTreeWidgetItem * cmainItem =
+	new QTreeWidgetItem(
+#if USE_ALGORITHM_ROOT_NODE
+	  mainItem,
+#else // USE_ALGORITHM_ROOT_NODE
+	  m_UI->m_AlgorithmsTree,
+#endif // USE_ALGORITHM_ROOT_NODE
+	  ITEM_TYPE_TAG
+	);
+
+      cmainItem->setText( COLUMN_NAME, qcurrentTag );
+      cmainItem->setExpanded( !m_SearchText.isEmpty() );
+      cmainItem->setFlags( Qt::NoItemFlags | Qt::ItemIsEnabled );
+
+      //
+      // add category icon
+      cmainItem->setIcon( COLUMN_NAME, QIcon( ":/icons/otb" ) );
+
+      //
+      // step #2 -> Add algorithms name if matching the search label
+      for( StringVector::const_iterator itApps( itTag->second.begin() );
+	   itApps != itTag->second.end();
+	   ++itApps )
+	{
+	// get current app name
+	QString  name( itApps->c_str() );
+
+	//  get current app DocName
+	QString title(
+	  GetApplicationDocNameByApplicationName( name )
+	);
+
+	assert( !name.isEmpty() );
+	assert( !title.isEmpty() );
+
+	// does the current algorithm DocName match the search text
+	if ( m_SearchText.isEmpty() ||
+	     title.contains( search, Qt::CaseInsensitive ) ||
+	     name.contains( search, Qt::CaseInsensitive ) )
+	  {
+	  // 
+	  // set current application name as secondary item
+	  QTreeWidgetItem * secItem =
+	    new QTreeWidgetItem( cmainItem, ITEM_TYPE_APPLICATION );
+
+	  secItem->setText( COLUMN_NAME, name );
+	  secItem->setText( COLUMN_TITLE, title );
+
+	  secItem->setToolTip( COLUMN_NAME, title );
+
+	  secItem->setIcon( COLUMN_NAME, QIcon( ":/icons/process" ) );
+	  }
+	}
+      }
+    }
+
+  // Expand algorithms tree by default
+  m_UI->m_AlgorithmsTree->expandAll();
+
+  m_UI->m_AlgorithmsTree->resizeColumnToContents( COLUMN_NAME );
+  m_UI->m_AlgorithmsTree->resizeColumnToContents( COLUMN_TITLE );
+}
+
+/*******************************************************************************/
+bool
+ApplicationsToolBox
+::IsSearchTextMatchAnyAlgorithm( const QString & tagName, const QString & search )
+{
+  // find the pair corresponding to the tagName
+  ApplicationsTagContainer::const_iterator itTag(
+    m_AppTags.find(
+      ToStdString( tagName )
+    )
+  );
+
+  if( itTag==m_AppTags.end() )
+    return false;
+
+  for( StringVector::const_iterator itApps( itTag->second.begin() );
+       itApps != itTag->second.end();
+       ++itApps )
+    {
+    QString name( FromStdString( *itApps ) );
+
+    if( name.contains( search, Qt::CaseInsensitive ) ||
+	GetApplicationDocNameByApplicationName( name )
+	.contains( search, Qt::CaseInsensitive ) )
+      return true;
+    }
+
+  return false;
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBox
+::LaunchApplication( const QString& appName )
+{
+  assert( !appName.isEmpty() );
+
+  emit ApplicationToLaunchSelected(
+    appName,
+    GetApplicationDocNameByApplicationName( appName )
+  );
+}
+
+/*******************************************************************************/
+QString
+ApplicationsToolBox
+::GetApplicationDocNameByApplicationName( const QString & appName )
+{
+  QString docName("");
+
+  // find the pair corresponding to the tagName
+  ApplicationDocNameToNameMap::const_iterator itDocNames = m_AppsDocNameToNameMap.begin();
+
+  while( itDocNames != m_AppsDocNameToNameMap.end() )
+    {
+    // retrieve the appName in the map
+    if ( appName == QString( (*itDocNames).second.c_str() ) )
+      {
+      //
+      // return the relative docName
+      return QString ( (*itDocNames).first.c_str() );
+      }
+
+    ++itDocNames;
+    }
+
+  return docName;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+ApplicationsToolBox
+::OnAvailableApplicationsTagsChanged(const ApplicationsTagContainer& appsTags, 
+                                     const ApplicationDocNameToNameMap& docNameToNameMap)
+{
+  // rememeber the map
+  m_AppTags = appsTags;
+
+  // remember the OTB applications  docName <-> Name association
+  m_AppsDocNameToNameMap = docNameToNameMap;
+
+  // fill the tree with the application
+  FillTreeUsingTags();  
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBox
+::OnSearchBoxChanged(const QString & search)
+{
+  //
+  // get the search text
+  m_SearchText = search;
+  
+  // fill the tree with the application
+  FillTreeUsingTags();
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBox
+::OnAlgorithmTreeDoubleClick( QTreeWidgetItem * item , int column )
+{
+  // qDebug() << item << column;
+
+  if( item->type()!=ITEM_TYPE_APPLICATION )
+    return;
+
+  QString text( item->text( column ) );
+
+  if( text.isEmpty() )
+    return;
+
+  switch( column )
+    {
+    case COLUMN_NAME:
+      break;
+
+    case COLUMN_TITLE:
+      {
+      ApplicationDocNameToNameMap::const_iterator it(
+	m_AppsDocNameToNameMap.find(
+	  ToStdString( text )
+	)
+      );
+
+      assert( it!=m_AppsDocNameToNameMap.end() );
+
+      assert( it->second.empty() );
+
+      text = FromStdString( it->second );
+      }
+      break;
+
+    default:
+      assert( false && "Unexpected enum value." );
+      break;
+    }
+
+  LaunchApplication( text );
+}
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.qrc b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.qrc
new file mode 100644
index 0000000..4d025da
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.qrc
@@ -0,0 +1,7 @@
+<RCC>
+  <qresource prefix="/images">
+    <file alias="process_icon">../../../../Utilities/Data/Icons/alg.png</file>      
+    <file alias="otb_icon">../../../../Utilities/Data/Icons/monteverdi-32x32.png</file>      
+  </qresource>
+</RCC>
+
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui
new file mode 100644
index 0000000..5121277
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ApplicationsToolBox</class>
+ <widget class="QWidget" name="mvd::ApplicationsToolBox">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>363</width>
+    <height>116</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>OTB Applications</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="margin">
+    <number>3</number>
+   </property>
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QLineEdit" name="m_SearchLine"/>
+   </item>
+   <item row="1" column="0">
+    <widget class="QTreeWidget" name="m_AlgorithmsTree">
+     <property name="contextMenuPolicy">
+      <enum>Qt::CustomContextMenu</enum>
+     </property>
+     <property name="headerHidden">
+      <bool>false</bool>
+     </property>
+     <attribute name="headerVisible">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="headerCascadingSectionResizes">
+      <bool>true</bool>
+     </attribute>
+     <column>
+      <property name="text">
+       <string notr="true">Name</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Title</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx
new file mode 100644
index 0000000..b0aba90
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx
@@ -0,0 +1,171 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdApplicationsToolBoxController.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+//
+#include "mvdTypes.h"
+//
+#include "mvdApplicationsToolBox.h"
+//
+#include "mvdApplicationLauncher.h"
+#include "mvdApplicationsBrowser.h"
+#include "mvdOTBApplicationsModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ApplicationsToolBoxController
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ApplicationsToolBoxController
+::ApplicationsToolBoxController( ApplicationsToolBox* widget, QObject* p ) :
+  AbstractModelController( widget, p )
+{
+}
+
+/*******************************************************************************/
+ApplicationsToolBoxController
+::~ApplicationsToolBoxController()
+{
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBoxController
+::Connect( AbstractModel* model )
+{
+  //
+  // Access widget
+  ApplicationsToolBox* widget = GetWidget< ApplicationsToolBox >();
+
+  //
+  // Access model.
+  OTBApplicationsModel* appModel = qobject_cast< OTBApplicationsModel* >(model);
+  assert( appModel!=NULL );
+
+  //
+  // connections
+  QObject::connect(
+    appModel->GetBrowser(), 
+    SIGNAL(
+      AvailableApplicationsTagsChanged( const ApplicationsTagContainer&, 
+                                        const ApplicationDocNameToNameMap& ) ),
+    widget,
+    SLOT(
+      OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer&, 
+                                          const ApplicationDocNameToNameMap& ) )
+  );
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBoxController
+::Disconnect( AbstractModel* model )
+{
+  //
+  // Access widget
+  ApplicationsToolBox* widget = GetWidget< ApplicationsToolBox >();
+
+  //
+  // Access model.
+  OTBApplicationsModel* appModel = qobject_cast< OTBApplicationsModel* >(model);
+  assert( appModel!=NULL );
+
+  //
+  // disconnect app browser
+  QObject::disconnect(
+    appModel->GetBrowser(),
+    SIGNAL(
+      AvailableApplicationsTagsChanged( const ApplicationsTagContainer&, 
+                                        const ApplicationDocNameToNameMap& ) ),
+    widget,
+    SLOT(
+      OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer&, 
+                                          const ApplicationDocNameToNameMap& ) )
+    );
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBoxController
+::ClearWidget()
+{
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBoxController
+::virtual_ResetWidget( bool )
+{
+  // Reset widget.
+  ResetDatasetTree();
+
+  // NOTE : no signal to emit here. Done in the class ApplicationsBrowser
+  // aggregated in the model
+}
+
+/*******************************************************************************/
+void
+ApplicationsToolBoxController
+::ResetDatasetTree()
+{
+  //
+  // Access model.
+  OTBApplicationsModel* model = GetModel< OTBApplicationsModel >();
+  assert( model!=NULL );
+
+  // 
+  // Fill the widget. It also reset the datatree before filling the
+  // tree...
+  model->FillTree();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.cxx
new file mode 100644
index 0000000..b21865f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.cxx
@@ -0,0 +1,394 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdColorBandDynamicsWidget.h"
+#include "ui_mvdColorBandDynamicsWidget.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdDoubleValidator.h"
+
+// Used for QString::number() calls. By default, QString::number()
+// uses a 6 digit precision.
+#define MAX_SIGNIFICANT_DIGITS 17
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ColorBandDynamicsWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*******************************************************************************/
+ColorBandDynamicsWidget
+::ColorBandDynamicsWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::ColorBandDynamicsWidget() ),
+  m_LowIntensityValidator( NULL ),
+  m_HighIntensityValidator( NULL ),
+  m_Channel( RGBW_CHANNEL_RGB )
+{
+  m_UI->setupUi( this );
+
+  m_LowIntensityValidator = new DoubleValidator( m_UI->lowIntensityLineEdit );
+  m_UI->lowIntensityLineEdit->setValidator( m_LowIntensityValidator );
+
+  m_HighIntensityValidator = new DoubleValidator( m_UI->highIntensityLineEdit );
+  m_UI->highIntensityLineEdit->setValidator( m_HighIntensityValidator );
+}
+
+/*******************************************************************************/
+ColorBandDynamicsWidget
+::~ColorBandDynamicsWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+double
+ColorBandDynamicsWidget
+::GetMinIntensity() const
+{
+  return m_UI->lowIntensityLineEdit->text().toDouble();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetMinIntensity( double value )
+{
+  m_LowIntensityValidator->setBottom( value );
+  m_HighIntensityValidator->setBottom( value );
+}
+
+/*****************************************************************************/
+double
+ColorBandDynamicsWidget
+::GetMaxIntensity() const
+{
+  return m_LowIntensityValidator->bottom();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetMaxIntensity( double value )
+{
+  m_LowIntensityValidator->setTop( value );
+  m_HighIntensityValidator->setTop( value );
+}
+
+/*****************************************************************************/
+double
+ColorBandDynamicsWidget
+::GetLowIntensity() const
+{
+  return m_HighIntensityValidator->top();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetLowIntensity( double value )
+{
+  // qDebug() << this << "::SetLowIntensity(" << value << ")";
+
+  QString number(
+    QString::number( value, 'g', MAX_SIGNIFICANT_DIGITS )
+  );
+
+  assert( !number.isEmpty() );
+
+  m_UI->lowIntensityLineEdit->setText( number );
+
+  m_UI->lowIntensityLineEdit->setCursorPosition( 0 );
+}
+
+/*****************************************************************************/
+double
+ColorBandDynamicsWidget
+::GetHighIntensity() const
+{
+  return m_UI->highIntensityLineEdit->text().toDouble();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetHighIntensity( double value )
+{
+  // qDebug() << this << "::SetHighIntensity(" << value << ")";
+
+  QString number(
+    QString::number( value, 'g', MAX_SIGNIFICANT_DIGITS )
+  );
+
+  assert( !number.isEmpty() );
+
+  m_UI->highIntensityLineEdit->setText( number );
+
+  m_UI->highIntensityLineEdit->setCursorPosition( 0 );
+}
+
+/*****************************************************************************/
+double
+ColorBandDynamicsWidget
+::GetLowQuantile() const
+{
+  return m_UI->lowQuantileSpinBox->value();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetLowQuantile( double value )
+{
+  m_UI->lowQuantileSpinBox->setValue( value );
+}
+
+/*****************************************************************************/
+double
+ColorBandDynamicsWidget
+::GetHighQuantile() const
+{
+  return m_UI->highQuantileSpinBox->value();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetHighQuantile( double value )
+{
+  m_UI->highQuantileSpinBox->setValue( value );
+}
+
+/*****************************************************************************/
+bool
+ColorBandDynamicsWidget
+::IsBounded() const
+{
+  return m_UI->linkButton->isChecked();
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetBounded( bool enabled )
+{
+  return m_UI->linkButton->setChecked( enabled );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetLinkButtonEnabled( bool enabled )
+{
+  return m_UI->linkButton->setEnabled( enabled );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetDefaultsButtonEnabled( bool enabled )
+{
+  return m_UI->defaultsButton->setEnabled( enabled );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::SetChannelLabel( RgbwChannel channel )
+{
+  m_Channel = channel;
+  
+  m_UI->rLabel->setVisible(
+    channel==RGBW_CHANNEL_RED ||
+    channel==RGBW_CHANNEL_RGB ||
+    channel==RGBW_CHANNEL_ALL
+  );
+
+  m_UI->gLabel->setVisible(
+    channel==RGBW_CHANNEL_GREEN ||
+    channel==RGBW_CHANNEL_RGB ||
+    channel==RGBW_CHANNEL_ALL
+  );
+
+  m_UI->bLabel->setVisible(
+    channel==RGBW_CHANNEL_BLUE ||
+    channel==RGBW_CHANNEL_RGB ||
+    channel==RGBW_CHANNEL_ALL
+  );
+
+  m_UI->wLabel->setVisible( channel==RGBW_CHANNEL_WHITE );
+
+  m_UI->applyAllButton->setEnabled(
+    channel==RGBW_CHANNEL_RED ||
+    channel==RGBW_CHANNEL_GREEN ||
+    channel==RGBW_CHANNEL_BLUE ||
+    channel==RGBW_CHANNEL_RGB
+  );
+}
+
+/*****************************************************************************/
+RgbwChannel
+ColorBandDynamicsWidget
+::GetChannelLabel() const
+{
+  return m_Channel;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_lowIntensityLineEdit_editingFinished()
+{
+  // qDebug() << this << "::on_lowIntensityLineEdit_editingFinished()";
+
+  assert( m_UI!=NULL );
+  assert( m_UI->lowIntensityLineEdit!=NULL );
+
+  bool isOk = true;
+  double value = m_UI->lowIntensityLineEdit->text().toDouble( &isOk );
+
+  if( !isOk )
+    {
+#if 0
+    throw std::invalid_argument(
+      ToStdString( tr( "Invalid argument '%1'." ).arg( text ) )
+    );
+#else
+    return;
+#endif
+    }
+
+  emit LowIntensityChanged( m_Channel, value );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_highIntensityLineEdit_editingFinished()
+{
+  // qDebug() << this << "::on_highIntensityLineEdit_editingFinished()";
+
+  assert( m_UI!=NULL );
+  assert( m_UI->highIntensityLineEdit!=NULL );
+
+  bool isOk = true;
+  double value = m_UI->highIntensityLineEdit->text().toDouble( &isOk );
+
+  if( !isOk )
+    {
+#if 0
+    throw std::invalid_argument(
+      ToStdString( tr( "Invalid argument '%1'." ).arg( text ) )
+    );
+#else
+    return;
+#endif
+    }
+
+  emit HighIntensityChanged( m_Channel, value );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_lowQuantileSpinBox_valueChanged( double value )
+{
+  emit LowQuantileChanged( m_Channel, value );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_highQuantileSpinBox_valueChanged( double value )
+{
+  emit HighQuantileChanged( m_Channel, value );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_minMaxButton_clicked()
+{
+  emit ResetIntensityClicked( m_Channel );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_defaultsButton_clicked()
+{
+  emit ResetQuantileClicked( m_Channel );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_applyAllButton_clicked()
+{
+  emit ApplyAllClicked(
+    m_Channel,
+    m_UI->lowQuantileSpinBox->value(),
+    m_UI->highQuantileSpinBox->value()
+  );
+}
+
+/*****************************************************************************/
+void
+ColorBandDynamicsWidget
+::on_linkButton_toggled( bool checked )
+{
+  /*
+  if( checked )
+    {
+    QString text( m_UI->lowIntensityLineEdit->text() );
+    m_LowIntensityValidator->fixup( text );
+    m_UI->lowIntensityLineEdit->setText( text );
+
+    text = m_UI->lowIntensityLineEdit->text();
+    m_HighIntensityValidator->fixup( text );
+    m_UI->highIntensityLineEdit->setText( text );
+    }
+  */
+
+  emit LinkToggled( m_Channel, checked );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui
new file mode 100644
index 0000000..dd697cc
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorBandDynamicsWidget.ui
@@ -0,0 +1,464 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ColorBandDynamicsWidget</class>
+ <widget class="QWidget" name="mvd::ColorBandDynamicsWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>270</width>
+    <height>88</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="sizeConstraint">
+    <enum>QLayout::SetDefaultConstraint</enum>
+   </property>
+   <property name="margin">
+    <number>3</number>
+   </property>
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <item row="0" column="2">
+    <widget class="QLabel" name="lowLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Low</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="3">
+    <widget class="QLabel" name="highLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>High</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QLabel" name="quantileLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Quantile percentile.</string>
+     </property>
+     <property name="text">
+      <string>Q:</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QLabel" name="intensityLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Pixel value on band.</string>
+     </property>
+     <property name="text">
+      <string>V:</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
+    <widget class="QDoubleSpinBox" name="highQuantileSpinBox">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Percentage of the band histogram ending clipped to obtain higher intensity threshold.</string>
+     </property>
+     <property name="frame">
+      <bool>true</bool>
+     </property>
+     <property name="suffix">
+      <string>%</string>
+     </property>
+     <property name="maximum">
+      <double>100.000000000000000</double>
+     </property>
+     <property name="singleStep">
+      <double>0.100000000000000</double>
+     </property>
+     <property name="value">
+      <double>2.000000000000000</double>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="3">
+    <widget class="QLineEdit" name="highIntensityLineEdit">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>60</width>
+       <height>0</height>
+      </size>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0" colspan="2">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <property name="sizeConstraint">
+      <enum>QLayout::SetDefaultConstraint</enum>
+     </property>
+     <item>
+      <widget class="QLabel" name="rLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Red channel.</string>
+       </property>
+       <property name="text">
+        <string><span style="color:#000000;background-color:#FF4444">&nbsp;<b>R</b>&nbsp;</span></string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="gLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Green channel.</string>
+       </property>
+       <property name="text">
+        <string><span style="color:#000000;background-color:#44FF44">&nbsp;<b>G</b>&nbsp;</span></string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="bLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Blue channel.</string>
+       </property>
+       <property name="text">
+        <string><span style="color:#CCCCCC;background-color:#4444FF">&nbsp;<b>B</b>&nbsp;</span></string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="wLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>White (gray) channel.</string>
+       </property>
+       <property name="text">
+        <string><span style="color:#EEEEEE;background-color:#111111">&nbsp;<b>W</b>&nbsp;</span></string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="2" column="2">
+    <widget class="QDoubleSpinBox" name="lowQuantileSpinBox">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Percentage of the band histogram beginning clipped to obtain lower intensity threshold.</string>
+     </property>
+     <property name="frame">
+      <bool>true</bool>
+     </property>
+     <property name="suffix">
+      <string>%</string>
+     </property>
+     <property name="maximum">
+      <double>100.000000000000000</double>
+     </property>
+     <property name="singleStep">
+      <double>0.100000000000000</double>
+     </property>
+     <property name="value">
+      <double>2.000000000000000</double>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" rowspan="2">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <property name="sizeConstraint">
+      <enum>QLayout::SetDefaultConstraint</enum>
+     </property>
+     <item>
+      <widget class="QLabel" name="linkLabel">
+       <property name="text">
+        <string><p>&lceil;</p></string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="linkButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="font">
+        <font>
+         <kerning>true</kerning>
+        </font>
+       </property>
+       <property name="autoFillBackground">
+        <bool>false</bool>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset>
+         <normaloff>:/icons/Utilities/Data/Icons/unlocked.png</normaloff>
+         <normalon>:/icons/Utilities/Data/Icons/locked.png</normalon>:/icons/Utilities/Data/Icons/unlocked.png</iconset>
+       </property>
+       <property name="iconSize">
+        <size>
+         <width>12</width>
+         <height>12</height>
+        </size>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="0" column="4">
+    <widget class="QToolButton" name="applyAllButton">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Apply quantiles to all channels.</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="icon">
+      <iconset>
+       <normaloff>:/icons/Data/Icons/execute.png</normaloff>:/icons/Data/Icons/execute.png</iconset>
+     </property>
+     <property name="iconSize">
+      <size>
+       <width>16</width>
+       <height>16</height>
+      </size>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="4">
+    <widget class="QToolButton" name="minMaxButton">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Set the intensity low and high thresholds to the minimum and maximum values of the current band.</string>
+     </property>
+     <property name="text">
+      <string>min/Max</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="4">
+    <widget class="QToolButton" name="defaultsButton">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Reset to default quantiles.</string>
+     </property>
+     <property name="text">
+      <string>2%</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="2">
+    <widget class="QLineEdit" name="lowIntensityLineEdit">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>60</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="frame">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>lowQuantileSpinBox</tabstop>
+  <tabstop>highQuantileSpinBox</tabstop>
+  <tabstop>lowIntensityLineEdit</tabstop>
+  <tabstop>highIntensityLineEdit</tabstop>
+  <tabstop>applyAllButton</tabstop>
+  <tabstop>minMaxButton</tabstop>
+  <tabstop>defaultsButton</tabstop>
+ </tabstops>
+ <resources>
+  <include location="mvdIcons.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>linkButton</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>lowQuantileSpinBox</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>19</x>
+     <y>70</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>107</x>
+     <y>71</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>linkButton</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>highQuantileSpinBox</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>19</x>
+     <y>70</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>174</x>
+     <y>71</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsController.cxx
new file mode 100644
index 0000000..7184418
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsController.cxx
@@ -0,0 +1,1467 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdColorDynamicsController.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdVectorImageModel.h"
+#include "mvdColorDynamicsWidget.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ColorDynamicsController
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+ColorDynamicsController
+::ColorDynamicsController( ColorDynamicsWidget* widget, QObject* p ) :
+  AbstractModelController( widget, p )
+{
+}
+
+/*****************************************************************************/
+ColorDynamicsController
+::~ColorDynamicsController()
+{
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::Connect( AbstractModel* model )
+{
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+
+  //
+  // Connect GUI to controller.
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( LowQuantileChanged( RgbwChannel, double ) ),
+    // to:
+    this,
+    SLOT( OnLowQuantileChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( HighQuantileChanged( RgbwChannel, double ) ),
+    // to:
+    this,
+    SLOT( OnHighQuantileChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( LowIntensityChanged( RgbwChannel, double ) ),
+    // to:
+    this,
+    SLOT( OnLowIntensityChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( HighIntensityChanged( RgbwChannel, double ) ),
+    // to:
+    this,
+    SLOT( OnHighIntensityChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( ResetQuantileClicked( RgbwChannel ) ),
+    // to:
+    this,
+    SLOT( OnResetQuantileClicked( RgbwChannel ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( ResetIntensityClicked( RgbwChannel ) ),
+    // to:
+    this,
+    SLOT( OnResetIntensityClicked( RgbwChannel  ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( ApplyAllClicked( RgbwChannel, double, double ) ),
+    // to:
+    this,
+    SLOT( OnApplyAllClicked( RgbwChannel, double, double  ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( LinkToggled( RgbwChannel, bool ) ),
+    // to:
+    this,
+    SLOT( OnLinkToggled( RgbwChannel, bool  ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( NoDataFlagToggled( bool ) ),
+    // to:
+    this,
+    SLOT( OnNoDataFlagToggled( bool ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( NoDataValueChanged( double ) ),
+    // to:
+    this,
+    SLOT( OnNoDataValueChanged( double ) )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL( NoDataButtonPressed() ),
+    // to:
+    this,
+    SLOT( RefreshHistogram() )
+  );
+
+  QObject::connect(
+    colorDynamicsWidget,
+    SIGNAL(GammaValueChanged( double ) ),
+    // to:
+    this,
+    SLOT( OnGammaValueChanged( double ))
+    );
+
+  //
+  // Connect controller to model.
+  QObject::connect(
+    this, SIGNAL( ModelUpdated() ),
+    // to:
+    model, SLOT( OnModelUpdated() )
+  );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::virtual_ResetWidget( bool isSettingModel )
+{
+  //
+  // Reset color-dynamics widget mode (grayscale/RGB).
+  assert( GetModel()!=NULL && GetModel()==GetModel< VectorImageModel >() );
+  const VectorImageModel* model = GetModel< VectorImageModel >();
+
+  assert( GetWidget()!=NULL &&
+	  GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  ColorDynamicsWidget* widget = GetWidget< ColorDynamicsWidget >();
+
+  widget->SetGrayscaleActivated( model->GetSettings().IsGrayscaleActivated() );
+
+  RgbwChannel channels = RGBW_CHANNEL_ALL;
+    /*
+    model->GetSettings().IsGrayscaleActivated()
+    ? RGBW_CHANNEL_WHITE
+    : RGBW_CHANNEL_RGB;
+    */
+
+  //
+  // Reset color-dynamics widget.
+
+  // Set constrained editing ON/OFF.
+  // (must be called before settings intensity/quantiles)
+  SetBoundsEnabled( channels, isSettingModel );
+
+  // Set ranges.
+  ResetIntensityRanges( channels );
+
+  // Set intensities based on applied quantiles (restoring
+  // dataset-descriptor settings).
+  SetIntensities( channels );
+
+  // Setup no-data state.
+  SetNoData();
+  SetGamma();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::ClearWidget()
+{
+  // qDebug() << this << "::ClearWidget()";
+
+  assert( GetWidget()!=NULL &&
+	  GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  ColorDynamicsWidget* widget = GetWidget< ColorDynamicsWidget >();
+
+  widget->SetGrayscaleActivated( true );
+
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, RGBW_CHANNEL_ALL ) )
+    return;
+
+  // Block this controller's signals to prevent display refreshes
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      widget->GetChannel( channel );
+
+
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    colorBandDynWgt->SetBounded( true );
+    colorBandDynWgt->SetLinkButtonEnabled( true );
+
+    colorBandDynWgt->SetMinIntensity( 0.0 );
+    colorBandDynWgt->SetMaxIntensity( 1.0 );
+
+    colorBandDynWgt->SetLowIntensity( 0.0 );
+    colorBandDynWgt->SetHighIntensity( 1.0 );
+
+    colorBandDynWgt->SetLowQuantile( 2.0 );
+    colorBandDynWgt->SetHighQuantile( 2.0 );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::Disconnect( AbstractModel* model )
+{
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+
+  //
+  // Disconnect controller to model.
+  QObject::disconnect(
+    this, SIGNAL( ModelUpdated() ),
+    // to:
+    model, SLOT( OnModelUpdated() )
+  );
+
+  //
+  // Disconnect GUI from controller.
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( LowQuantileChanged( RgbwChannel, double ) ),
+    // from:
+    this,
+    SLOT( OnLowQuantileChanged( RgbwChannel, double ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( HighQuantileChanged( RgbwChannel, double ) ),
+    // from:
+    this,
+    SLOT( OnHighQuantileChanged( RgbwChannel, double ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( LowIntensityChanged( RgbwChannel, double ) ),
+    // from:
+    this,
+    SLOT( OnLowIntensityChanged( RgbwChannel, double ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( HighIntensityChanged( RgbwChannel, double ) ),
+    // from:
+    this,
+    SLOT( OnHighIntensityChanged( RgbwChannel, double ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( ResetQuantileClicked( RgbwChannel ) ),
+    // from:
+    this,
+    SLOT( OnResetQuantileClicked( RgbwChannel ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( ResetIntensityClicked( RgbwChannel ) ),
+    // from:
+    this,
+    SLOT( OnResetIntensityClicked( RgbwChannel  ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( ApplyAllClicked( RgbwChannel, double, double ) ),
+    // from:
+    this,
+    SLOT( OnApplyAllClicked( RgbwChannel, double, double  ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( LinkToggled( RgbwChannel, bool ) ),
+    // to:
+    this,
+    SLOT( OnLinkToggled( RgbwChannel, bool  ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( NoDataFlagToggled( bool ) ),
+    // to:
+    this,
+    SLOT( OnNoDataFlagToggled( bool ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( NoDataValueChanged( double ) ),
+    // to:
+    this,
+    SLOT( OnNoDataValueChanged( double ) )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( NoDataButtonPressed() ),
+    // to:
+    this,
+    SLOT( RefreshHistogram() )
+  );
+
+  QObject::disconnect(
+    colorDynamicsWidget,
+    SIGNAL( GammaValueChanged( double ) ),
+    // to:
+    this,
+    SLOT( OnGammaValueChanged( double ) )
+    );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::ResetIntensityRanges( RgbwChannel channels )
+{
+  // Trace.
+  // qDebug()
+  //   << this
+  //   << "::ResetIntensityRanges(" << RGBW_CHANNEL_NAMES[ channels ] << ")";
+
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+
+  //
+  // Access image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  //
+  // Access histogram from generic image-model.
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  // if( !histogramModel->IsValid() )
+  //   return;
+
+  // Get min/max pixels.
+  DefaultImageType::PixelType minPx( histogramModel->GetMinPixel() );
+  DefaultImageType::PixelType maxPx( histogramModel->GetMaxPixel() );
+
+  // Get image rengering settings.
+  const VectorImageSettings & settings = imageModel->GetSettings();
+
+  // Block this controller's signals to prevent display refreshes
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynamicsWidget->GetChannel( channel );
+
+    assert(
+      std::numeric_limits< DefaultImageType::PixelType::ValueType >::has_infinity
+    );
+
+    DefaultImageType::PixelType::ValueType min(
+      -std::numeric_limits< DefaultImageType::PixelType::ValueType >::infinity()
+    );
+    DefaultImageType::PixelType::ValueType max(
+      +std::numeric_limits< DefaultImageType::PixelType::ValueType >::infinity()
+    );
+
+    if( colorBandDynWgt->IsBounded() )
+      {
+      min = minPx[ settings.GetRgbwChannel( channel ) ];
+      max = maxPx[ settings.GetRgbwChannel( channel ) ];
+      }
+
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // Set min/max intensity bounds.
+    colorBandDynWgt->SetMinIntensity( min );
+    colorBandDynWgt->SetMaxIntensity( max );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::ResetIntensities( RgbwChannel channels )
+{
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+
+  //
+  // Access image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  //
+  // Access histogram from generic image-model.
+  const HistogramModel* histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  // Get min/max pixels.
+  DefaultImageType::PixelType minPx( histogramModel->GetMinPixel() );
+  DefaultImageType::PixelType maxPx( histogramModel->GetMaxPixel() );
+
+  // Get image rengering settings.
+  const VectorImageSettings & settings = imageModel->GetSettings();
+
+  // Assign values to controlled widget.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynamicsWidget->GetChannel( channel );
+
+    DefaultImageType::PixelType::ValueType min(
+      minPx[ settings.GetRgbwChannel( channel ) ]
+    );
+
+    DefaultImageType::PixelType::ValueType max(
+      maxPx[ settings.GetRgbwChannel( channel ) ]
+    );
+
+    // Block this controller's signals to prevent display refreshes
+    // but let let widget(s) signal their changes so linked values
+    // will be correctly updated.
+    bool thisSignalsBlocks = this->blockSignals( true );
+    {
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // Set low & high intensities.
+    colorBandDynWgt->SetLowIntensity( min );
+    OnLowIntensityChanged( channel, min );
+
+    colorBandDynWgt->SetHighIntensity( max );
+    OnHighIntensityChanged( channel, max );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+    this->blockSignals( thisSignalsBlocks );
+
+    emit LowIntensityChanged( channel, min, false );
+    emit HighIntensityChanged( channel, max, false );
+    }
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::SetIntensities( RgbwChannel channels )
+{
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+
+  //
+  // Access image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Get image rengering settings.
+  const VectorImageSettings & settings = imageModel->GetSettings();
+
+
+  // Assign values to controlled widget.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynamicsWidget->GetChannel( channel );
+
+    ParametersType::ValueType low = settings.GetLowIntensity( channel );
+    ParametersType::ValueType hi = settings.GetHighIntensity( channel );
+
+    // Block this controller's signals to prevent display refreshes
+    // but let let widget(s) signal their changes so linked values
+    // will be correctly updated.
+    bool thisSignalsBlocked = this->blockSignals( true );
+    {
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // Set low & high intensities.
+    colorBandDynWgt->SetLowIntensity( low );
+    OnLowIntensityChanged( channel, low );
+
+    colorBandDynWgt->SetHighIntensity( hi );
+    OnHighIntensityChanged( channel, hi );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+    this->blockSignals( thisSignalsBlocked );
+
+    emit LowIntensityChanged( channel, low, true );
+    emit HighIntensityChanged( channel, hi, true );
+    }
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::SetNoData()
+{
+  assert( GetModel()==GetModel< VectorImageModel >() );
+  const VectorImageModel* imageModel = GetModel< VectorImageModel >();
+
+  if( imageModel==NULL )
+    return;
+
+  const ImageProperties* imageProperties = imageModel->GetProperties();
+  assert( imageProperties!=NULL );
+
+  assert( GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  ColorDynamicsWidget* widget = GetWidget< ColorDynamicsWidget >();
+  assert( widget!=NULL );
+
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  bool widgetSignalsBlocked = widget->blockSignals( true );
+  {
+  widget->SetNoDataButtonChecked( true );
+  widget->SetNoDataChecked( imageProperties->IsNoDataEnabled() );
+  widget->SetNoDataValue( imageProperties->GetNoData() );
+  }
+  widget->blockSignals( widgetSignalsBlocked );
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::SetGamma()
+{
+  assert( GetModel()==GetModel< VectorImageModel >() );
+  const VectorImageModel* imageModel = GetModel< VectorImageModel >();
+
+  if( imageModel==NULL )
+    return;
+
+  assert( GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  ColorDynamicsWidget* widget = GetWidget< ColorDynamicsWidget >();
+  assert( widget!=NULL );
+
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  bool widgetSignalsBlocked = widget->blockSignals( true );
+  {
+  widget->SetGamma( imageModel->GetSettings().GetGamma() );
+  }
+  widget->blockSignals( widgetSignalsBlocked );
+  }
+  this->blockSignals( thisSignalsBlocked );  
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::SetBoundsEnabled( RgbwChannel channels, bool isSettingModel )
+{
+  // qDebug()
+  //   << this
+  //   << "::SetBoundsEnabled(" << channels << "," << isSettingModel << ")";
+
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorDynamicsWidget * colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynamicsWidget!=NULL );
+
+  //
+  // Access image-model.
+  const VectorImageModel * imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  //
+  // Access histogram-model.
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  bool hasValidHistogram =
+    histogramModel->IsValid() &&
+    !histogramModel->IsMonoValue();
+
+  // Block this controller's signals to prevent display refreshed
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  // Assign values to controlled widget.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget * colorBandDynWgt =
+      colorDynamicsWidget->GetChannel( channel );
+
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // MANTIS-1144:
+    //
+    // SetBoundsEnabled() must keep track of previous state because it
+    // is also called (circular loop) when editing quantile and/or
+    // intensity is finished.
+    //
+    // {
+    colorBandDynWgt->SetBounded(
+      ( !isSettingModel
+	? colorBandDynWgt->IsBounded()
+	: true
+      ) &&
+      hasValidHistogram
+    );
+    // }
+    colorBandDynWgt->SetLinkButtonEnabled( hasValidHistogram );
+    colorBandDynWgt->SetDefaultsButtonEnabled( hasValidHistogram );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::ResetQuantiles( RgbwChannel channels )
+{
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynamicsWidget!=NULL );
+
+  // Block this controller's signals to prevent display refreshed
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  // Assign values to controlled widget.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget * colorBandDynWgt =
+      colorDynamicsWidget->GetChannel( channel );
+
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    colorBandDynWgt->SetLowQuantile( 2.0 );
+    OnLowQuantileChanged( channel, 2.0 );
+
+    colorBandDynWgt->SetHighQuantile( 2.0 );
+    OnHighQuantileChanged( channel, 2.0 );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::RestoreQuantiles( RgbwChannel channels )
+{
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorDynamicsWidget* colorDynamicsWidget = GetWidget< ColorDynamicsWidget >();
+
+
+  // Block this controller's signals to prevent display refreshed
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  // Assign values to controlled widget.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynamicsWidget->GetChannel( channel );
+
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    OnLowQuantileChanged( channel, colorBandDynWgt->GetLowQuantile() );
+    OnHighQuantileChanged( channel, colorBandDynWgt->GetHighQuantile() );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+    }
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::RefreshHistogram()
+{  
+  // Trace.
+  // qDebug()
+  //   << this
+  //   << "::RefreshHistogram()";
+
+  // Get image-model.
+  assert( GetModel()==GetModel< VectorImageModel>() );
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Refresh histogram-model.
+  imageModel->RefreshHistogram();
+
+  // Refresh color-dynamics.
+  {
+    assert( imageModel->GetHistogramModel()!=NULL );
+
+    SetBoundsEnabled( RGBW_CHANNEL_ALL, true );
+
+    if( imageModel->GetHistogramModel()->IsValid() )
+      ResetQuantiles( RGBW_CHANNEL_ALL );
+    else
+      ResetIntensities( RGBW_CHANNEL_ALL );
+  }
+
+  // Signal histogram has been refreshed.
+  emit HistogramRefreshed();
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnRgbChannelIndexChanged( RgbwChannel channel, int )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnRgbChannelIndexChanged("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << ", " << band <<
+  //   ")";
+
+  //
+  // Reset color-dynamics widget.
+  ResetQuantiles( channel );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnGrayChannelIndexChanged( int )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnGrayChannelIndexChanged(" << band << ")";
+
+  //
+  // Reset color-dynamics widget.
+  ResetQuantiles( RGBW_CHANNEL_WHITE );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsController
+::OnGrayscaleActivated( bool activated )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnGrayscaleActivated(" << activated << ")";
+
+  //
+  // Toggle grayscale-mode activation-state of controlled widget.
+  GetWidget< ColorDynamicsWidget >()->SetGrayscaleActivated( activated );
+
+  //
+  // Reset color-dynamics widget.
+  ResetQuantiles(
+    activated
+    ? RGBW_CHANNEL_WHITE
+    : RGBW_CHANNEL_RGB
+  );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnLowQuantileChanged( RgbwChannel channel, double value )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnLowQuantileChanged("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << ", " << value
+  //   << ")";
+
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  if( !histogramModel->IsValid() )
+    return;
+
+  // Reference settings.
+  VectorImageSettings & settings = imageModel->GetSettings();
+
+  // Get color-dynamics widgets.
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt!=NULL );
+
+  // Update quantile intensity in model.
+  for( CountType i=begin; i<end; ++i )
+    {
+    // RGB/W Channel.
+    RgbwChannel chan = static_cast< RgbwChannel >( i );
+
+    // Calculate quantile intensity.
+    HistogramModel::MeasurementType intensity =
+      histogramModel->Quantile(
+	settings.GetRgbwChannel( chan ),
+	0.01 * value,
+	BOUND_LOWER
+      );
+
+    // Set intensity.
+    settings.SetLowIntensity( chan, intensity );
+
+    // Access color-band widget.
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynWgt->GetChannel( chan );
+
+    // check pointer.
+    assert( colorBandDynWgt!=NULL );
+
+    // Block widget signals to prevent recursive signal/slot loops.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // Refresh low-intensity display.
+    colorBandDynWgt->SetLowIntensity( intensity );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+
+    emit LowIntensityChanged( chan, intensity, true );
+    }
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnHighQuantileChanged( RgbwChannel channel, double value )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnHighQuantileChanged("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << ", " << value
+  //   << ")";
+
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  if( !histogramModel->IsValid() )
+    return;
+
+  // Reference settings.
+  VectorImageSettings & settings = imageModel->GetSettings();
+
+  // Get color-dynamics widgets.
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt!=NULL );
+
+  // Update quantile intensity in model.
+  for( CountType i=begin; i<end; ++i )
+    {
+    // RGB/W Channel.
+    RgbwChannel chan = static_cast< RgbwChannel >( i );
+
+    // Calculate quantile intensity.
+    HistogramModel::MeasurementType intensity =
+      histogramModel->Quantile(
+	settings.GetRgbwChannel( chan ),
+	0.01 * value,
+	BOUND_UPPER
+      );
+
+    // Set intensity.
+    settings.SetHighIntensity( chan, intensity );
+
+    // Access color-band widget.
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynWgt->GetChannel( chan );
+
+    // check pointer.
+    assert( colorBandDynWgt!=NULL );
+
+    // Block widget signals to prevent recursive signal/slot loops.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // Refresh high-intensity display.
+    colorBandDynWgt->SetHighIntensity( intensity );
+    }
+    widgetSignalsBlocked = colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+
+    emit HighIntensityChanged( chan, intensity, true );
+    }
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnLowIntensityChanged( RgbwChannel channel, double value )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnLowIntensityChanged("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << ", " << value
+  //   << ")";
+
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  // if( !histogramModel->IsValid() )
+  //   return;
+
+  // Get color-dynamics widgets.
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt );
+
+  // Update parameter value.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel chan = static_cast< RgbwChannel >( i );
+
+    imageModel->GetSettings().SetLowIntensity( chan, value );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynWgt->GetChannel( chan );
+
+    if( colorBandDynWgt->IsBounded() && histogramModel->IsValid() )
+      {
+      // Block widget signals to prevent recursive signal/slot loops.
+      bool wgtSignalsBlocked = colorBandDynWgt->blockSignals( true );
+      {
+      // Refresh quantile display.
+      colorBandDynWgt->SetLowQuantile(
+	100.0 * histogramModel->Percentile(
+	  imageModel->GetSettings().GetRgbwChannel( chan ),
+	  value,
+	  BOUND_LOWER )
+      );
+      }
+      wgtSignalsBlocked = colorBandDynWgt->blockSignals( wgtSignalsBlocked );
+      }
+
+    emit LowIntensityChanged( chan, value, true );
+    }
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnHighIntensityChanged( RgbwChannel channel, double value )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnHighIntensityChanged("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << ", " << value
+  //   << ")";
+
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = -1;
+  CountType end = -1;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  // if( !histogramModel->IsValid() )
+  //   return;
+
+  // Get color-dynamics widgets.
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt );
+
+  // Update parameter value.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel chan = static_cast< RgbwChannel >( i );
+
+    imageModel->GetSettings().SetHighIntensity( chan, value );
+
+    ColorBandDynamicsWidget* colorBandDynWgt =
+      colorDynWgt->GetChannel( chan );
+
+    if( colorBandDynWgt->IsBounded() && histogramModel->IsValid() )
+      {
+      // Block widget signals to prevent recursive signal/slot loops.
+      bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+      {
+      // Refresh quantile display.
+      colorBandDynWgt->SetHighQuantile(
+	100.0 * imageModel->GetHistogramModel()->Percentile(
+	  imageModel->GetSettings().GetRgbwChannel( chan ),
+	  value,
+	  BOUND_UPPER
+	)
+      );
+      }
+      colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+      }
+
+    emit HighIntensityChanged( chan, value, true );
+    }
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnResetIntensityClicked( RgbwChannel channel )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnResetIntensityClicked(" << RGBW_CHANNEL_NAMES[ channel ] << ")";
+
+  ResetIntensities( channel );
+
+  // Emit signal to force histogram refresh.
+  emit HistogramRefreshed();
+
+  // Now, emit this controller's signal to cause display refresh.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnResetQuantileClicked( RgbwChannel channel )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnResetQuantileChanged(" << RGBW_CHANNEL_NAMES[ channel ] << ")";
+
+  ResetQuantiles( channel );
+
+  // Emit signal to force histogram refresh.
+  emit HistogramRefreshed();
+
+  // Now, emit this controller's signal to cause display refresh.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnApplyAllClicked( RgbwChannel, double low, double high )
+{  
+  // qDebug()
+  //   << this
+  //   << "::OnApplyAllChanged("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << "," << low << "," << high << ")";
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  const HistogramModel * histogramModel = imageModel->GetHistogramModel();
+  assert( histogramModel!=NULL );
+
+  if( !histogramModel->IsValid() )
+    return;
+
+  // Reference settings.
+  VectorImageSettings & settings = imageModel->GetSettings();
+
+  CountType begin;
+  CountType end;
+
+  if( !RgbBounds(
+	begin, end,
+	settings.IsGrayscaleActivated()
+	? RGBW_CHANNEL_WHITE
+	: RGBW_CHANNEL_RGB ) )
+    return;
+
+  // Get color-dynamics widgets.
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt!=NULL );
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel chan = static_cast< RgbwChannel >( i );
+
+    VectorImageSettings::ChannelVector::value_type band(
+      settings.GetRgbwChannel( chan )
+    );
+
+    HistogramModel::MeasurementType lintensity =
+      histogramModel->Quantile(
+        band,
+        0.01 * low,
+        BOUND_LOWER
+    );
+
+    // Calculate quantile intensity.
+    HistogramModel::MeasurementType uintensity =
+      histogramModel->Quantile(
+        band,
+        0.01 * high,
+        BOUND_UPPER
+    );
+
+    // Update quantile intensity in model.
+    settings.SetLowIntensity( chan, lintensity );
+    settings.SetHighIntensity( chan, uintensity );
+
+    ColorBandDynamicsWidget* colorBandDynWgt = colorDynWgt->GetChannel( chan );
+    assert( colorBandDynWgt!=NULL );
+
+    // Block widget signals to prevent recursive signal/slot loops.
+    bool widgetSignalsBlocked = colorBandDynWgt->blockSignals( true );
+    {
+    // Refresh intensities display.
+    // TODO: Remove SetLow/HighIntensity(): overwrite by SetLow/HighQuantiles().
+    colorBandDynWgt->SetHighIntensity( uintensity );
+    colorBandDynWgt->SetLowIntensity( lintensity );
+
+    // Regresh quantile display.
+    colorBandDynWgt->SetLowQuantile( low );
+    colorBandDynWgt->SetHighQuantile( high );
+    }
+    colorBandDynWgt->blockSignals( widgetSignalsBlocked );
+
+    emit LowIntensityChanged( chan, lintensity, false );
+    emit HighIntensityChanged( chan, uintensity, false );
+    }
+
+  // Force histogram refresh.
+  emit HistogramRefreshed();
+
+  // Now, emit this controller's signal to cause display refresh.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnNoDataFlagToggled( bool enabled )
+{  
+  // Trace.
+  // qDebug()
+  //   << this
+  //   << "::OnNoDataFlagToggled(" << enabled << ")";
+
+  // Get image-model.
+  assert( GetModel()==GetModel< VectorImageModel>() );
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Reference settings.
+  ImageProperties* properties = imageModel->GetProperties();
+
+  // Get color-dynamics widgets.
+  assert( GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt!=NULL );
+
+  // Store property.
+  // properties->SetNoDataEnabled( colorDynWgt->IsNoDataChecked() );
+  properties->SetNoDataEnabled( enabled );
+
+  //
+  colorDynWgt->SetNoDataButtonChecked( false );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnNoDataValueChanged( double value )
+{  
+  // Trace.
+  // qDebug()
+  //   << this
+  //   << "::OnNoDataValueChanged(" << value << ")";
+
+  // Get image-model.
+  assert( GetModel()==GetModel< VectorImageModel>() );
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Reference settings.
+  ImageProperties* properties = imageModel->GetProperties();
+
+  // Get color-dynamics widgets.
+  assert( GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  ColorDynamicsWidget* colorDynWgt = GetWidget< ColorDynamicsWidget >();
+  assert( colorDynWgt!=NULL );
+
+  // Store property.
+  // properties->SetNoData( colorDynWgt->GetNoDataValue() );
+  properties->SetNoData( value );
+
+  //
+  colorDynWgt->SetNoDataButtonChecked( false );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnLinkToggled( RgbwChannel channel, bool checked )
+{
+  // Trace.
+  // qDebug()
+  //   << this
+  //   << "::OnLinkToggled("
+  //   << RGBW_CHANNEL_NAMES[ channel ] << ", " << checked
+  //   << ")";
+
+  ResetIntensityRanges( channel );
+
+  if( checked )
+    {
+    RestoreQuantiles( channel );
+
+    emit ModelUpdated();
+    }
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsController
+::OnGammaValueChanged( double value )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnGammaValueChanged("
+  //   << value
+  //   <<")";
+
+  // Get image-model.
+  assert( GetModel()==GetModel< VectorImageModel>() );
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Get widget.
+  // assert( GetWidget()==GetWidget< ColorDynamicsWidget >() );
+  // ColorDynamicsWidget* widget = GetWidget< ColorDynamicsWidget >();
+  // assert( widget!=NULL );
+
+  // Store gamma into settings.
+  // imageModel->GetSettings().SetGamma( widget->GetGamma() );
+  imageModel->GetSettings().SetGamma( value );
+
+  // Emit refresh signal.
+  emit ModelUpdated();
+}
+
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx
new file mode 100644
index 0000000..4b3c384
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.cxx
@@ -0,0 +1,457 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdColorDynamicsWidget.h"
+#include "ui_mvdColorDynamicsWidget.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ColorDynamicsWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+const char*
+ColorDynamicsWidget::COLOR_BAND_DYNAMICS_WIDGET_NAMES[] = {
+  "redWidget",
+  "greenWidget",
+  "blueWidget",
+  "whiteWidget"
+};
+
+const double GAMMA_FACTOR = -0.25;
+const double GAMMA_POWER = 1.1;
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+
+/*****************************************************************************/
+ColorDynamicsWidget
+::ColorDynamicsWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::ColorDynamicsWidget() ),
+  m_NoDataValidator( NULL ),
+  m_IsGrayscaleActivated( false )
+{
+  //
+  // Qt setup.
+  m_UI->setupUi( this );
+
+  //
+  // Colors.
+  CountType begin;
+  CountType end;
+
+  RgbwBounds( begin, end, RGBW_CHANNEL_ALL );
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel( static_cast< RgbwChannel >( i ) );
+
+    ConnectChild( GetChannel( channel ), channel );
+    }
+
+  SetGrayscaleActivated( false );
+
+  //
+  // No-data.
+  m_NoDataValidator = new QDoubleValidator( m_UI->noDataLineEdit );
+
+  m_UI->noDataLineEdit->setValidator( m_NoDataValidator );
+}
+
+/*******************************************************************************/
+ColorDynamicsWidget
+::~ColorDynamicsWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsWidget
+::SetGrayscaleActivated( bool activated )
+{
+  m_IsGrayscaleActivated = activated;
+
+  //
+  // First, force WHITE channel to be invisible.
+  //
+  // Cause: prevent layout re-calculation to be resized taking RGB+W
+  // into account when switching from grayscale-mode activated to
+  // non-activated.
+  if( !activated )
+    {
+    GetChannel( RGBW_CHANNEL_WHITE )->setVisible( false );
+    }
+
+  //
+  // Then, show/hide relevant components.
+  CountType begin;
+  CountType end;
+
+  RgbwBounds( begin, end, RGBW_CHANNEL_RGB );
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel( static_cast< RgbwChannel >( i ) );
+
+    GetChannel( channel )->setVisible( !activated );
+    }
+
+  GetChannel( RGBW_CHANNEL_WHITE )->setVisible( activated );
+
+  m_UI->bwLine->setVisible( false );
+  m_UI->rgLine->setVisible( !activated );
+  m_UI->gbLine->setVisible( !activated );
+}
+
+/*******************************************************************************/
+bool
+ColorDynamicsWidget
+::IsNoDataChecked() const
+{
+  return m_UI->noDataCheckBox->isChecked();
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetNoDataChecked( bool checked )
+{
+  m_UI->noDataCheckBox->setChecked( checked );
+}
+
+/*******************************************************************************/
+double
+ColorDynamicsWidget
+::GetNoDataValue() const
+{
+  bool isOk = true;
+  double value = m_UI->noDataLineEdit->text().toDouble( &isOk );
+
+  if( !isOk )
+    {
+    }
+
+  return value;
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetNoDataValue( double value )
+{
+  QString number(
+    QString::number( value, 'g', m_NoDataValidator->decimals() ) );
+
+  m_UI->noDataLineEdit->setText( number );
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetGamma( double value )
+{
+  int gamma =
+    itk::Math::Round< int, double >(
+      vcl_log( value ) / (GAMMA_FACTOR * vcl_log( GAMMA_POWER ) )
+    );
+
+  int min = GetMinGamma();
+
+  if( gamma<min )
+    gamma = min;
+
+  int max = GetMaxGamma();
+
+  if( gamma>max )
+    gamma = max;
+
+  // qDebug() << "::SetGamma(" << value << "): " << gamma;
+
+  SetGammaCursorPosition( gamma );
+}
+
+/*******************************************************************************/
+double
+ColorDynamicsWidget
+::GetGamma() const
+{
+  // qDebug() <<
+  //   "::GetGamma(" << GetGammaCursorPosition() << "): " <<
+  //   vcl_pow(
+  //     GAMMA_POWER,
+  //     GAMMA_FACTOR * static_cast< double >( GetGammaCursorPosition() )
+  //   );
+
+  return
+    vcl_pow(
+      GAMMA_POWER,
+      GAMMA_FACTOR * static_cast< double >( GetGammaCursorPosition() )
+    );
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetGammaCursorPosition( int value )
+{
+  m_UI->gammaSlider->setValue( value );
+}
+
+/*******************************************************************************/
+int
+ColorDynamicsWidget
+::GetGammaCursorPosition() const
+{
+  return m_UI->gammaSlider->value();
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetMinGamma( int value )
+{
+  m_UI->gammaSlider->setMinimum( value );
+}
+
+/*******************************************************************************/
+int 
+ColorDynamicsWidget
+::GetMinGamma() const
+{
+  return m_UI->gammaSlider->minimum();
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetMaxGamma( int value )
+{
+  m_UI->gammaSlider->setMaximum( value );
+}
+
+/*******************************************************************************/
+int 
+ColorDynamicsWidget
+::GetMaxGamma() const
+{
+  return m_UI->gammaSlider->maximum();
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::SetGammaStep( int value )
+{
+  m_UI->gammaSlider->setPageStep( value );
+}
+
+/*******************************************************************************/
+int 
+ColorDynamicsWidget
+::GetGammaStep() const
+{
+  return m_UI->gammaSlider->pageStep();
+}
+
+/*******************************************************************************/
+void
+ColorDynamicsWidget
+::ConnectChild( ColorBandDynamicsWidget* child, RgbwChannel channel )
+{
+  child->SetChannelLabel( channel );
+
+  //
+  // Concentrate and forward signals of each channels.
+  QObject::connect(
+    child,
+    SIGNAL( LowQuantileChanged( RgbwChannel, double ) ),
+    // TO:
+    this,
+    SIGNAL( LowQuantileChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( HighQuantileChanged( RgbwChannel, double ) ),
+    // TO:
+    this,
+    SIGNAL( HighQuantileChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( LowIntensityChanged( RgbwChannel, double ) ),
+    // TO:
+    this,
+    SIGNAL( LowIntensityChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( HighIntensityChanged( RgbwChannel, double ) ),
+    // TO:
+    this,
+    SIGNAL( HighIntensityChanged( RgbwChannel, double ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( ResetQuantileClicked( RgbwChannel ) ),
+    // TO:
+    this,
+    SIGNAL( ResetQuantileClicked( RgbwChannel ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( ResetIntensityClicked( RgbwChannel ) ),
+    // TO:
+    this,
+    SIGNAL( ResetIntensityClicked( RgbwChannel  ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( ApplyAllClicked( RgbwChannel, double, double ) ),
+    // TO:
+    this,
+    SIGNAL( ApplyAllClicked( RgbwChannel, double, double ) )
+  );
+
+  QObject::connect(
+    child,
+    SIGNAL( LinkToggled( RgbwChannel, bool ) ),
+    // TO:
+    this,
+    SIGNAL( LinkToggled( RgbwChannel, bool ) )
+  );
+}
+
+/*****************************************************************************/
+/* PUBLIC SLOTS                                                              */
+/*****************************************************************************/
+void
+ColorDynamicsWidget
+::SetNoDataButtonChecked( bool checked )
+{
+  if( checked )
+    {
+    m_UI->noDataButton->setEnabled( false );
+    m_UI->noDataButton->setChecked( true );
+    // m_UI->noDataButton->setText( tr( "Done" ) );
+    }
+  else
+    {
+    m_UI->noDataButton->setEnabled( true );
+    m_UI->noDataButton->setChecked( false );
+    // m_UI->noDataButton->setText( tr( "GO" ) );
+    }
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*****************************************************************************/
+void
+ColorDynamicsWidget
+::on_noDataCheckBox_toggled( bool enabled )
+{
+  emit NoDataFlagToggled( enabled );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsWidget
+::on_noDataLineEdit_textChanged( const QString& text )
+{
+  bool isOk = true;
+  double value = text.toDouble( &isOk );
+
+  if( !isOk )
+    {
+    }
+
+  emit NoDataValueChanged( value );
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsWidget
+::on_noDataButton_toggled( bool checked )
+{
+  bool thisSB = this->blockSignals( true );
+  {
+  bool uiSB = m_UI->noDataButton->blockSignals( true );
+  {
+  SetNoDataButtonChecked( checked ); 
+  }
+  m_UI->noDataButton->blockSignals( uiSB );
+  }
+  this->blockSignals( thisSB );
+
+  if( checked )
+    {
+    emit NoDataButtonPressed();
+    }
+}
+
+/*****************************************************************************/
+void
+ColorDynamicsWidget
+::on_gammaSlider_valueChanged( int value )
+{
+  emit GammaCursorPositionChanged( value );
+
+  emit GammaValueChanged( GetGamma() );
+
+  //Display Gamma value as a tooltip when value changed 
+  QToolTip::showText(mapToGlobal(m_UI->gammaSlider->pos()),tr("Gamma: ") % QString::number(GetGamma()) );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui
new file mode 100644
index 0000000..be9da91
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorDynamicsWidget.ui
@@ -0,0 +1,329 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ColorDynamicsWidget</class>
+ <widget class="QWidget" name="mvd::ColorDynamicsWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>221</width>
+    <height>175</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QFrame" name="noDataFrame">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::Panel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout_2">
+      <property name="spacing">
+       <number>1</number>
+      </property>
+      <property name="sizeConstraint">
+       <enum>QLayout::SetDefaultConstraint</enum>
+      </property>
+      <property name="leftMargin">
+       <number>6</number>
+      </property>
+      <property name="topMargin">
+       <number>1</number>
+      </property>
+      <property name="rightMargin">
+       <number>1</number>
+      </property>
+      <property name="bottomMargin">
+       <number>1</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="noDataLabel">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>No data: </string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="noDataCheckBox">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLineEdit" name="noDataLineEdit">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QToolButton" name="noDataButton">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
+        <property name="text">
+         <string>Apply</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QFrame" name="gammaFrame">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::Panel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QLabel" name="gammaLabel">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>Gamma:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QSlider" name="gammaSlider">
+        <property name="minimum">
+         <number>-50</number>
+        </property>
+        <property name="maximum">
+         <number>100</number>
+        </property>
+        <property name="singleStep">
+         <number>1</number>
+        </property>
+        <property name="pageStep">
+         <number>1</number>
+        </property>
+        <property name="value">
+         <number>0</number>
+        </property>
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QFrame" name="colorFrame">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="spacing">
+       <number>1</number>
+      </property>
+      <property name="sizeConstraint">
+       <enum>QLayout::SetDefaultConstraint</enum>
+      </property>
+      <property name="margin">
+       <number>1</number>
+      </property>
+      <item>
+       <widget class="ColorBandDynamicsWidget" name="redWidget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="baseSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="Line" name="rgLine">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="ColorBandDynamicsWidget" name="greenWidget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="Line" name="gbLine">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="ColorBandDynamicsWidget" name="blueWidget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="Line" name="bwLine">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="ColorBandDynamicsWidget" name="whiteWidget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ColorBandDynamicsWidget</class>
+   <extends>QWidget</extends>
+   <header>mvdColorBandDynamicsWidget.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <tabstops>
+  <tabstop>noDataCheckBox</tabstop>
+  <tabstop>noDataLineEdit</tabstop>
+  <tabstop>noDataButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>noDataCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>noDataLineEdit</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>49</x>
+     <y>23</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>100</x>
+     <y>24</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorSetupController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupController.cxx
new file mode 100644
index 0000000..62d9b5e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupController.cxx
@@ -0,0 +1,438 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdColorSetupController.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdVectorImageModel.h"
+#include "mvdColorSetupWidget.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ColorSetupController
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ColorSetupController
+::ColorSetupController( ColorSetupWidget* widget, QObject* p ) :
+  AbstractModelController( widget, p )
+{
+}
+
+/*******************************************************************************/
+ColorSetupController
+::~ColorSetupController()
+{
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::Connect( AbstractModel* model )
+{
+  ColorSetupWidget* colorSetupWidget = GetWidget< ColorSetupWidget >();
+
+  //
+  // Connect GUI to controller.
+  QObject::connect(
+    colorSetupWidget,
+    SIGNAL( CurrentRgbIndexChanged( RgbwChannel, int ) ),
+    // to:
+    this,
+    SLOT( OnCurrentRgbIndexChanged( RgbwChannel, int ) )
+  );
+
+  QObject::connect(
+    colorSetupWidget,
+    SIGNAL( CurrentGrayIndexChanged( int ) ),
+    // to:
+    this,
+    SLOT( OnCurrentGrayIndexChanged( int ) )
+  );
+
+  QObject::connect(
+    colorSetupWidget,
+    SIGNAL( GrayscaleActivated( bool ) ),
+    // to:
+    this,
+    SLOT( OnGrayscaleActivated( bool ) )
+  );
+
+  QObject::connect(
+    colorSetupWidget,
+    SIGNAL( AlphaValueChanged( double ) ),
+    // to:
+    this,
+    SLOT( OnAlphaValueChanged( double ) )
+  );
+
+  //
+  // Connect controller to model.
+  QObject::connect(
+    this, SIGNAL( ModelUpdated() ),
+    // to:
+    model, SLOT( OnModelUpdated() )
+  );
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::Disconnect( AbstractModel* model )
+{
+  ColorSetupWidget* colorSetupWidget = GetWidget< ColorSetupWidget >();
+
+  //
+  // Disconnect controller to model.
+  QObject::disconnect(
+    this, SIGNAL( ModelUpdated() ),
+    // from:
+    model, SLOT( OnModelUpdated() )
+  );
+
+  //
+  // Disconnect GUI from controller.
+  QObject::disconnect(
+    colorSetupWidget,
+    SIGNAL( CurrentRgbIndexChanged( RgbwChannel, int ) ),
+    // from:
+    this,
+    SLOT( OnCurrentRgbIndexChanged( RgbwChannel, int ) )
+  );
+
+  QObject::disconnect(
+    colorSetupWidget,
+    SIGNAL( CurrentGrayIndexChanged( int ) ),
+    // from:
+    this,
+    SLOT( OnCurrentGrayIndexChanged( int ) )
+  );
+
+  QObject::disconnect(
+    colorSetupWidget,
+    SIGNAL( GrayscaleActivated( bool ) ),
+    // from:
+    this,
+    SLOT( OnGrayscaleActivated( bool ) )
+  );
+
+  QObject::disconnect(
+    colorSetupWidget,
+    SIGNAL( AlphaValueChanged( double ) ),
+    // from:
+    this,
+    SLOT( OnAlphaValueChanged( double ) )
+  );
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::ClearWidget()
+{
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !mvd::RgbwBounds( begin, end, RGBW_CHANNEL_ALL ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorSetupWidget* colorSetupWidget = GetWidget< ColorSetupWidget >();
+
+  // Block this controller's signals to prevent display refreshes
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+  // Block widget's signals...
+  //...but force call to valueChanged() slot to force refresh.
+  bool widgetSignalsBlocked = colorSetupWidget->blockSignals( true );
+  {
+  // Reset list of component names.
+  colorSetupWidget->SetComponents( QStringList( tr( "BAND 0" ) ) );
+
+  //
+  // RGBW-mode.
+
+  // Reset current-indices of RGB channels widgets.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    // Set current-index of channel.
+    colorSetupWidget->SetCurrentRgbIndex( channel, 0 );
+    }
+
+  //
+  // Grayscale-mode.
+  colorSetupWidget->SetGrayscaleActivated( true );
+
+  // Allow user-selectable grayscale-mode.
+  colorSetupWidget->SetGrayscaleEnabled( false );
+
+  // Set current-index of white (gray).
+  colorSetupWidget->SetCurrentGrayIndex( 0 );
+
+  //
+  // Alpha
+  colorSetupWidget->SetAlpha( 1.0 );
+  }
+  colorSetupWidget->blockSignals( widgetSignalsBlocked );
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::virtual_ResetWidget( bool )
+{
+  // Reset color-setup widget.
+  ResetIndices( RGBW_CHANNEL_RGB );
+
+  // Reset alpha.
+  ResetAlpha();
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::ResetIndices( RgbwChannel channels )
+{
+  //
+  // Calculate loop bounds. Return if nothing to do.
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !mvd::RgbBounds( begin, end, channels ) )
+    return;
+
+  //
+  // Access color-dynamics widget.
+  ColorSetupWidget* colorSetupWidget = GetWidget< ColorSetupWidget >();
+
+  //
+  // Access image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Block this controller's signals to prevent display refreshes
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+  bool widgetSignalsBlocked = colorSetupWidget->blockSignals( true );
+  {
+  // Reset list of component names.
+  colorSetupWidget->SetComponents( imageModel->GetBandNames( true ) );
+
+  //
+  // RGB-mode.
+
+  // Reset current-indices of RGB channels widgets.
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+    VectorImageSettings::ChannelVector::value_type band =
+      imageModel->GetSettings().GetRgbChannel( i );
+
+    // Set current-index of channel.
+    colorSetupWidget->SetCurrentRgbIndex( channel, band );
+#if 0
+    OnCurrentRgbIndexChanged( channel, band );
+#endif
+    }
+
+  //
+  // Grayscale-mode.
+  if( channels==RGBW_CHANNEL_RGB )
+    {
+    // Activated grayscale-mode.
+    colorSetupWidget->SetGrayscaleActivated(
+      imageModel->GetSettings().IsGrayscaleActivated()
+    );
+
+    // Allow user-selectable grayscale-mode.
+    colorSetupWidget->SetGrayscaleEnabled( imageModel->GetNbComponents()>1 );
+
+    // Set current-index of white (gray).
+    colorSetupWidget->SetCurrentGrayIndex(
+      imageModel->GetSettings().GetGrayChannel()
+    );
+    }
+  }
+  colorSetupWidget->blockSignals( widgetSignalsBlocked );
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::ResetAlpha()
+{
+
+  //
+  // Access color-dynamics widget.
+  ColorSetupWidget* colorSetupWidget = GetWidget< ColorSetupWidget >();
+
+  //
+  // Access image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Block this controller's signals to prevent display refreshes
+  // but let let widget(s) signal their changes so linked values
+  // will be correctly updated.
+  bool thisSignalsBlocked = this->blockSignals( true );
+  {
+    // Block widget's signals...
+    //...but force call to valueChanged() slot to force refresh.
+  bool widgetSignalsBlocked = colorSetupWidget->blockSignals( true );
+  {
+  colorSetupWidget->SetAlpha( imageModel->GetSettings().GetAlpha() );
+  }
+  colorSetupWidget->blockSignals( widgetSignalsBlocked );
+  }
+  this->blockSignals( thisSignalsBlocked );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+ColorSetupController
+::OnCurrentRgbIndexChanged( RgbwChannel channel, int index )
+{
+  /*
+  qDebug()
+    << this
+    << "::OnCurrentRgbIndexChanged("
+    << RGBW_CHANNEL_NAMES[ channel ] << ", " << index
+    << ")";
+  */
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Update channel index.
+  imageModel->GetSettings().SetRgbChannel( channel, index );
+
+  // Signal band-index of RGB channel has changed to other
+  // controllers.
+  emit RgbChannelIndexChanged( channel, index );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::OnCurrentGrayIndexChanged( int index )
+{
+  // qDebug() << this << "::OnCurrentGrayIndexChanged(" << index << ")";
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Update channel indices.
+  imageModel->GetSettings().SetGrayChannel( index );
+
+  // Signal band-index of gray channel has changed to other
+  // controllers.
+  emit GrayChannelIndexChanged( index );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::OnGrayscaleActivated( bool activated )
+{
+  // qDebug() << this << "::OnGrayscaleActivated(" << activated << ")";
+
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Change grayscale-mode activation state.
+  imageModel->GetSettings().SetGrayscaleActivated( activated );
+
+  // Signal grayscale-mode activation-state has changed to other
+  // controllers.
+  emit GrayscaleActivated( activated );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+/*******************************************************************************/
+void
+ColorSetupController
+::OnAlphaValueChanged( double alpha )
+{
+  // Get image-model.
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  // Change grayscale-mode activation state.
+  imageModel->GetSettings().SetAlpha( alpha );
+
+  // Signal model has been updated.
+  emit ModelUpdated();
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.cxx
new file mode 100644
index 0000000..54897fc
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.cxx
@@ -0,0 +1,257 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdColorSetupWidget.h"
+#include "ui_mvdColorSetupWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::ColorSetupWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+
+/**
+ */
+const char* QCOMBOBOX_NAMES[] = {
+  "rComboBox",
+  "gComboBox",
+  "bComboBox",
+  "wComboBox"
+};
+
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ColorSetupWidget
+::ColorSetupWidget( QWidget* p, Qt::WindowFlags flags ) :
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::ColorSetupWidget() )
+{
+  m_UI->setupUi( this );
+}
+
+/*******************************************************************************/
+ColorSetupWidget
+::~ColorSetupWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+void
+ColorSetupWidget
+::SetComponents( const QStringList& components )
+{
+  m_Components = components;
+
+  m_UI->rComboBox->clear();
+  m_UI->gComboBox->clear();
+  m_UI->bComboBox->clear();
+  m_UI->wComboBox->clear();
+
+  QStringList itemTexts( components );
+
+  // TODO: Move to mvd::core::AbstractImageModel (see ENHANCED_BAND_NAMES[]).
+  for( int i=0;
+       i<itemTexts.size();
+       ++ i )
+    {
+    if( itemTexts[ i ].isEmpty() )
+      {
+      itemTexts[ i ] = tr( "BAND %1" ).arg( i+1 );
+      }
+    else
+      {
+      itemTexts[ i ].prepend( QString( "%1: " ).arg( i+1 ) );
+      }
+    }
+
+  m_UI->rComboBox->addItems( itemTexts );
+  m_UI->gComboBox->addItems( itemTexts );
+  m_UI->bComboBox->addItems( itemTexts );
+  m_UI->wComboBox->addItems( itemTexts );
+
+  // Black screen.
+  m_UI->rComboBox->setCurrentIndex( 0 );
+  m_UI->gComboBox->setCurrentIndex( 0 );
+  m_UI->bComboBox->setCurrentIndex( 0 );
+  m_UI->wComboBox->setCurrentIndex( 0 );
+}
+
+/*******************************************************************************/
+void
+ColorSetupWidget
+::SetCurrentRgbIndex( RgbwChannel channel, int index )
+{
+  QComboBox* comboBox = findChild< QComboBox* >( QCOMBOBOX_NAMES[ channel ] );
+
+  comboBox->setCurrentIndex( index );
+}
+
+/*******************************************************************************/
+int
+ColorSetupWidget
+::GetCurrentRgbIndex( RgbwChannel channel ) const
+{
+  QComboBox* comboBox = findChild< QComboBox* >( QCOMBOBOX_NAMES[ channel ] );
+
+  return comboBox->currentIndex();
+}
+
+/*****************************************************************************/
+void
+ColorSetupWidget
+::SetGrayscaleEnabled( bool enable )
+{
+  m_UI->wCheckBox->setEnabled( enable );
+}
+
+/*****************************************************************************/
+void
+ColorSetupWidget
+::SetGrayscaleActivated( bool activated )
+{
+  m_UI->wCheckBox->setChecked( activated );
+}
+
+/*******************************************************************************/
+void
+ColorSetupWidget
+::SetCurrentGrayIndex( int index )
+{
+  m_UI->wComboBox->setCurrentIndex( index );
+}
+
+/*******************************************************************************/
+int
+ColorSetupWidget
+::GetCurrentGrayIndex() const
+{
+  return m_UI->wComboBox->currentIndex();
+}
+
+/*****************************************************************************/
+void
+ColorSetupWidget
+::SetAlpha( double value )
+{
+  assert( m_UI!=NULL );
+
+  m_UI->alphaSlider->setValue( FromAlpha( value ) );
+}
+
+/*****************************************************************************/
+double
+ColorSetupWidget
+::GetAlpha() const
+{
+  assert( m_UI!=NULL );
+
+  return ToAlpha( m_UI->alphaSlider->value() );
+}
+
+/*****************************************************************************/
+double
+ColorSetupWidget
+::ToAlpha( int value ) const
+{
+  assert( m_UI!=NULL );
+
+  return
+    static_cast< double >( value - m_UI->alphaSlider->minimum() ) /
+    static_cast< double >( m_UI->alphaSlider->maximum() - m_UI->alphaSlider->minimum() );
+}
+
+/*******************************************************************************/
+int
+ColorSetupWidget
+::FromAlpha( double alpha ) const
+{
+  assert( m_UI!=NULL );
+
+  if( alpha>=1.0 )
+    alpha = m_UI->alphaSlider->maximum();
+
+  else if( alpha<=0.0 )
+    alpha = m_UI->alphaSlider->minimum();
+
+  else
+    alpha =
+      static_cast< double >( m_UI->alphaSlider->minimum() ) +
+      alpha * static_cast< double >( m_UI->alphaSlider->maximum() -
+                                     m_UI->alphaSlider->minimum() );
+
+  return static_cast< int >( alpha );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+ColorSetupWidget
+::on_alphaSlider_valueChanged( int value )
+{
+  // qDebug() << "on_alphaSlider_valueChanged(" << value << ")";
+
+  emit AlphaValueChanged( ToAlpha( value ) );
+}
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui
new file mode 100644
index 0000000..2bed58e
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdColorSetupWidget.ui
@@ -0,0 +1,593 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ColorSetupWidget</class>
+ <widget class="QWidget" name="mvd::ColorSetupWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>145</width>
+    <height>195</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <property name="margin">
+    <number>1</number>
+   </property>
+   <property name="spacing">
+    <number>1</number>
+   </property>
+   <item row="3" column="0">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="0" column="0">
+    <layout class="QGridLayout" name="gridLayout">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item row="4" column="0">
+      <layout class="QHBoxLayout" name="wHorizontalLayout">
+       <property name="spacing">
+        <number>1</number>
+       </property>
+       <property name="sizeConstraint">
+        <enum>QLayout::SetMaximumSize</enum>
+       </property>
+       <item>
+        <widget class="QLabel" name="wLabel">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="toolTip">
+          <string>White (gray) channel.</string>
+         </property>
+         <property name="text">
+          <string><span style="color:#EEEEEE;background-color:#111111">&nbsp;<b>W</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="wLeftArrow">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string><span><b>&larr;</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="4" column="1">
+      <widget class="QComboBox" name="wComboBox">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <item>
+        <property name="text">
+         <string>BAND 0</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 1</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 2</string>
+        </property>
+       </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">
+      <layout class="QHBoxLayout" name="rHorizontalLayout">
+       <property name="spacing">
+        <number>1</number>
+       </property>
+       <property name="sizeConstraint">
+        <enum>QLayout::SetMaximumSize</enum>
+       </property>
+       <item>
+        <widget class="QLabel" name="rLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="toolTip">
+          <string>Red channel.</string>
+         </property>
+         <property name="text">
+          <string><span style="color:#000000;background-color:#FF4444">&nbsp;<b>R</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="rLeftArrow">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string><span><b>&larr;</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="1" column="1">
+      <widget class="QComboBox" name="rComboBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <item>
+        <property name="text">
+         <string>BAND 0</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 1</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 2</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <layout class="QHBoxLayout" name="gHorizontalLayout">
+       <property name="spacing">
+        <number>1</number>
+       </property>
+       <property name="sizeConstraint">
+        <enum>QLayout::SetMaximumSize</enum>
+       </property>
+       <item>
+        <widget class="QLabel" name="gLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="toolTip">
+          <string>Green channel.</string>
+         </property>
+         <property name="text">
+          <string><span style="color:#000000;background-color:#44FF44">&nbsp;<b>G</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="gLeftArrow">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string><span><b>&larr;</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="2" column="1">
+      <widget class="QComboBox" name="gComboBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <item>
+        <property name="text">
+         <string>BAND 0</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 1</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 2</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+     <item row="3" column="0">
+      <layout class="QHBoxLayout" name="bHorizontalLayout">
+       <property name="spacing">
+        <number>1</number>
+       </property>
+       <property name="sizeConstraint">
+        <enum>QLayout::SetMaximumSize</enum>
+       </property>
+       <item>
+        <widget class="QLabel" name="bLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="toolTip">
+          <string>Blue channel.</string>
+         </property>
+         <property name="text">
+          <string><span style="color:#CCCCCC;background-color:#4444FF">&nbsp;<b>B</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="bLeftArrow">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string><span><b>&larr;</b>&nbsp;</span></string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="3" column="1">
+      <widget class="QComboBox" name="bComboBox">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <item>
+        <property name="text">
+         <string>BAND 0</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 1</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>BAND 2</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+     <item row="4" column="2">
+      <widget class="QCheckBox" name="wCheckBox">
+       <property name="toolTip">
+        <string>Enable/disable gray-scale mode.</string>
+       </property>
+       <property name="statusTip">
+        <string/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="2" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="alphaLabel">
+       <property name="text">
+        <string>Alpha:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSlider" name="alphaSlider">
+       <property name="maximum">
+        <number>10000</number>
+       </property>
+       <property name="pageStep">
+        <number>500</number>
+       </property>
+       <property name="value">
+        <number>10000</number>
+       </property>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="tickPosition">
+        <enum>QSlider::TicksBothSides</enum>
+       </property>
+       <property name="tickInterval">
+        <number>1000</number>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="Line" name="line">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>rComboBox</tabstop>
+  <tabstop>gComboBox</tabstop>
+  <tabstop>bComboBox</tabstop>
+  <tabstop>wCheckBox</tabstop>
+  <tabstop>wComboBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>wComboBox</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>95</x>
+     <y>162</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>wLeftArrow</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>41</x>
+     <y>162</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>wLabel</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>19</x>
+     <y>162</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>bLabel</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>18</x>
+     <y>129</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>bLeftArrow</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>40</x>
+     <y>129</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>bComboBox</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>95</x>
+     <y>129</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>gLabel</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>19</x>
+     <y>96</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>gLeftArrow</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>41</x>
+     <y>96</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>gComboBox</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>95</x>
+     <y>96</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>rLabel</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>18</x>
+     <y>63</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>rLeftArrow</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>40</x>
+     <y>63</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>wCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>rComboBox</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>150</x>
+     <y>161</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>95</x>
+     <y>63</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdDoubleValidator.cxx b/Modules/Visualization/MonteverdiGui/src/mvdDoubleValidator.cxx
new file mode 100644
index 0000000..890d96c
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdDoubleValidator.cxx
@@ -0,0 +1,115 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdDoubleValidator.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::DoubleValidator
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+DoubleValidator
+::DoubleValidator( QObject* p ) :
+  QDoubleValidator( p )
+{
+}
+
+/*******************************************************************************/
+DoubleValidator
+::DoubleValidator( double bottomVal, double topVal, int decim, QObject* p ) :
+  QDoubleValidator( bottomVal, topVal, decim, p )
+{
+}
+
+/*******************************************************************************/
+DoubleValidator
+::~DoubleValidator()
+{
+}
+
+/*******************************************************************************/
+void
+DoubleValidator
+::fixup( QString& input ) const
+{
+  int pos = input.length();
+
+  if( validate( input, pos )!=QValidator::Intermediate )
+    return;
+
+  bool isOk;
+  double value = input.toDouble( &isOk );
+
+  if( !isOk )
+    {
+    }
+
+  if( value<bottom() )
+    input = QString::number( bottom(), 'g', decimals() );
+
+  else if( value>top() )
+    input = QString::number( top(), 'g', decimals() );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdDropLineEdit.cxx b/Modules/Visualization/MonteverdiGui/src/mvdDropLineEdit.cxx
new file mode 100644
index 0000000..c328d6f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdDropLineEdit.cxx
@@ -0,0 +1,160 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdDropLineEdit.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::DropLineEdit
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+DropLineEdit
+::DropLineEdit( QWidget* p ) :
+  QLineEdit( p )
+{
+  setReadOnly( true );
+  setAcceptDrops( true );
+}
+
+/*******************************************************************************/
+DropLineEdit
+::DropLineEdit( const QString& contents, QWidget* p ) :
+  QLineEdit( contents, p )
+{
+  setReadOnly( true );
+  setAcceptDrops( true );
+}
+
+/*******************************************************************************/
+DropLineEdit
+::~DropLineEdit()
+{
+}
+
+/*******************************************************************************/
+void
+DropLineEdit
+::dragEnterEvent( QDragEnterEvent* e )
+{
+  assert( e!=NULL );
+
+  // Accepts all proposed actions: check will be made in
+  // dragMoveEvent().
+  e->acceptProposedAction();
+}
+
+/*******************************************************************************/
+void 
+DropLineEdit
+::dragMoveEvent( QDragMoveEvent* e )
+{
+  assert( e!=NULL );
+
+  /*
+  if( ( e->mimeData()->hasText() &&
+	QUrl( e->mimeData()->text() ).isLocalFile() ) ||
+      ( e->mimeData()->hasFormat(
+	"application/x-qabstractitemmodeldatalist" ) ) )
+  */
+  if( e->mimeData()->hasText() ||
+      e->mimeData()->hasFormat(
+	"application/x-qabstractitemmodeldatalist" ) )
+    {
+    e->acceptProposedAction();
+    }
+  else
+    {
+    e->ignore();
+    }
+}
+
+/*******************************************************************************/
+void
+DropLineEdit
+::dropEvent( QDropEvent *e )
+{
+  assert( e!=NULL );
+
+  if( e->mimeData()->hasText() )
+    {
+    QUrl url( e->mimeData()->text() );
+
+    /*
+    if( url.isLocalFile() )
+      {
+    */
+    setText( url.toLocalFile() );
+    /*
+      }
+    */
+    }
+  else if( e->mimeData()->hasFormat(
+	     "application/x-qabstractitemmodeldatalist" ) )
+    {
+    // TODO: use  simpler mime type
+    setText(
+      e->mimeData()->data( "application/x-qabstractitemmodeldatalist" )
+    );
+    }
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdFilenameDragAndDropEventFilter.cxx b/Modules/Visualization/MonteverdiGui/src/mvdFilenameDragAndDropEventFilter.cxx
new file mode 100644
index 0000000..d19b413
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdFilenameDragAndDropEventFilter.cxx
@@ -0,0 +1,208 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdFilenameDragAndDropEventFilter.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::FilenameDragAndDropEventFilter
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+FilenameDragAndDropEventFilter
+::FilenameDragAndDropEventFilter( QObject* p  ) :
+  AbstractDragAndDropEventFilter( p )
+{
+}
+
+/*****************************************************************************/
+FilenameDragAndDropEventFilter
+::~FilenameDragAndDropEventFilter()
+{
+}
+
+/*****************************************************************************/
+bool
+FilenameDragAndDropEventFilter
+::DragEnterEvent( QObject * watched, QDragEnterEvent* e )
+{
+  // qDebug() << this << "::DragEnterEvent(" << object << "," << e << ")";
+  // qDebug() << e->mimeData()->formats();
+
+  //
+  // Bypass event its MIME data does not contain any URL(s).
+  if( !e->mimeData()->hasUrls() )
+    return false;
+
+  //
+  // Bypass event if MIME data URL(s) are not all local filenames.
+  typedef QList< QUrl > QUrlList;
+
+  QUrlList urls( e->mimeData()->urls() );
+
+  for( QUrlList::const_iterator it( urls.begin() );
+       it!=urls.end();
+       ++it )
+    {
+    // qDebug() << *it;
+    // qDebug() << it->scheme()
+    // 	     << it->scheme().compare( "file", Qt::CaseInsensitive );
+
+    if(
+#if QT_VERSION < QT_VERSION_CHECK( 4, 8, 0 )
+      it->scheme().compare( "file", Qt::CaseInsensitive )!=0
+#else // QT_VERSION < QT_VERSION_CHECK( 4, 8, 0 )
+      !it->isLocalFile()
+#endif  // QT_VERSION < QT_VERSION_CHECK( 4, 8, 0 )
+      || e->source()==watched
+    )
+      {
+      return false;
+      }
+    }
+
+  //
+  // Accept event if its MIME data contains some URL(s) and they are
+  // all local filenames.
+  e->acceptProposedAction();
+
+  //
+  // Eatup event.
+  return true;
+}
+
+/*****************************************************************************/
+bool
+FilenameDragAndDropEventFilter
+::DragLeaveEvent( QObject * /* object */, QDragLeaveEvent * /* e */ )
+{
+  // qDebug() << this << "::DragLeaveEvent(" << object << "," << event << ")";
+
+  //
+  // Nothing to do: bypass event & let default behaviour occur.
+  return false;
+}
+
+/*****************************************************************************/
+bool
+FilenameDragAndDropEventFilter
+::DragMoveEvent( QObject *, QDragMoveEvent * )
+{
+  // qDebug() << this << "::DragMoveEvent(" << object << "," << event << ");";
+
+  // Nothing to do: bypass event & let default behaviour occur.
+  return false;
+}
+
+/*****************************************************************************/
+bool
+FilenameDragAndDropEventFilter
+::DropEvent( QObject * watched, QDropEvent * e )
+{
+  // qDebug() << this << "::DropEvent(" << object << "," << e << ")";
+
+  assert( e!=NULL );
+  assert( e->mimeData()!=NULL );
+
+  //
+  // Bypass event its MIME data does not contain not URL(s).
+  if( !e->mimeData()->hasUrls() )
+    return false;
+
+  //
+  // Bypass event if MIME data URL(s) are not all local filenames.
+  typedef QList< QUrl > QUrlList;
+
+  QUrlList urls( e->mimeData()->urls() );
+
+  QStringList filenames;
+
+  for( QUrlList::const_iterator it( urls.begin() );
+       it!=urls.end();
+       ++it )
+    {
+#if QT_VERSION < QT_VERSION_CHECK( 4, 8, 0 )
+    if( it->scheme().compare( "file", Qt::CaseInsensitive )==0 )
+#else // QT_VERSION < QT_VERSION_CHECK( 4, 8, 0 )
+    if( it->isLocalFile() )
+#endif  // QT_VERSION < QT_VERSION_CHECK( 4, 8, 0 )
+      {
+      if( e->source()!=watched )
+	{
+	filenames.push_back( it->toLocalFile() );
+
+	emit FilenameDropped( filenames.back() );
+	}
+      }
+    else
+      {
+      qWarning() << "Dropped URL is not a local filename:" << *it;
+      }
+    }
+ 
+  emit FilenamesDropped( filenames );
+
+  //
+  // Eatup event.
+  return true;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdGui.cxx b/Modules/Visualization/MonteverdiGui/src/mvdGui.cxx
new file mode 100644
index 0000000..e67cfc8
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdGui.cxx
@@ -0,0 +1,144 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdGui.h"
+
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::Gui
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+const int MOUSE_WHEEL_STEP_DEGREES = 15;
+const int MOUSE_WHEEL_STEP_FACTOR = 8;
+
+char const * const
+RESOLUTION_NAMES[ RESOLUTION_COUNT ] =
+{
+  // QT_TRANSLATE_NOOP( "mvd", "None" ),
+  QT_TRANSLATE_NOOP( "mvd", "Nearest" ),
+  QT_TRANSLATE_NOOP( "mvd", "Lower bound" ),
+  QT_TRANSLATE_NOOP( "mvd", "Upper bound" ),
+};
+
+char const * const
+TILE_SIZE_NAMES[ TILE_SIZE_COUNT ] =
+{
+  // QT_TRANSLATE_NOOP( "mvd", "None" ),
+  QT_TRANSLATE_NOOP( "mvd", "64" ),
+  QT_TRANSLATE_NOOP( "mvd", "128" ),
+  QT_TRANSLATE_NOOP( "mvd", "256" ),
+  QT_TRANSLATE_NOOP( "mvd", "512" ),
+};
+
+int
+TILE_SIZE_VALUE[ TILE_SIZE_COUNT ] =
+{
+  64, 128, 256, 512,
+};
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+void
+AddItemsInto( QComboBox * comboBox,
+	      const char * context,
+	      char const * const names[],
+	      size_t count )
+{
+  assert( comboBox!=NULL );
+  assert( names!=NULL );
+
+  for( size_t i=0; i<count; ++i )
+    comboBox->addItem(
+      qApp->translate(
+	context,
+	names[ i ] )
+    );
+}
+
+/*****************************************************************************/
+QMessageBox &
+CustomizeMessageBox( QMessageBox & messageBox,
+                     QWidget * widget )
+{
+  assert( widget!=NULL );
+
+  assert(
+    messageBox.layout()==qobject_cast< QGridLayout * >( messageBox.layout() )
+  );
+
+  QGridLayout * gridLayout =
+    qobject_cast< QGridLayout * >( messageBox.layout() );
+  assert( gridLayout!=NULL );
+
+  /*
+  qDebug() << layout;
+  qDebug() << layout->itemAt( layout->count() - 2 )->widget()->layout();
+  qDebug() << layout->itemAt( layout->count() - 1 )->widget()->layout();
+  */
+
+  // Add custom widget into message-box layout.
+  gridLayout->addWidget( widget, 1, 1 );
+
+  // Return input message-box to chain function calls, if needed.
+  return messageBox;
+}
+
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdHistogramController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdHistogramController.cxx
new file mode 100644
index 0000000..888a54a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdHistogramController.cxx
@@ -0,0 +1,279 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdHistogramController.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdVectorImageModel.h"
+#include "mvdHistogramWidget.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::HistogramController
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+HistogramController
+::HistogramController( HistogramWidget* widget, QObject* p ) :
+  AbstractModelController( widget, p )
+{
+}
+
+/*******************************************************************************/
+HistogramController
+::~HistogramController()
+{
+}
+
+/*******************************************************************************/
+void
+HistogramController
+::Connect( AbstractModel * )
+{
+  // HistogramWidget* widget = GetWidget< HistogramWidget >();
+
+  //
+  // Connect GUI to controller.
+
+  //
+  // Connect controller to model.
+}
+
+/*******************************************************************************/
+void
+HistogramController
+::Disconnect( AbstractModel * )
+{
+  // HistogramWidget* widget = GetWidget< HistogramWidget >();
+
+  //
+  // Disconnect controller to model.
+
+  //
+  // Disconnect GUI from controller.
+}
+
+/*******************************************************************************/
+void
+HistogramController
+::ClearWidget()
+{
+  assert( GetWidget()==GetWidget< HistogramWidget >() );
+  HistogramWidget* widget = GetWidget< HistogramWidget >();
+  assert( widget!=NULL );
+
+  widget->Clear();
+}
+
+/*******************************************************************************/
+void
+HistogramController
+::virtual_ResetWidget( bool )
+{
+  ResetWidget( RGBW_CHANNEL_ALL );
+}
+
+/*******************************************************************************/
+void
+HistogramController
+::ResetWidget( RgbwChannel channel )
+{
+  assert( GetModel()==GetModel< VectorImageModel >() );
+  VectorImageModel* imageModel = GetModel< VectorImageModel >();
+  assert( imageModel!=NULL );
+
+  HistogramModel* model = imageModel->GetHistogramModel();
+  assert( model!=NULL );
+
+  if( !model->IsValid() )
+    return;
+
+  assert( GetWidget()==GetWidget< HistogramWidget >() );
+  HistogramWidget* widget = GetWidget< HistogramWidget >();
+  assert( widget!=NULL );
+
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  const VectorImageSettings & settings = imageModel->GetSettings();
+
+  widget->SetGrayscaleActivated( settings.IsGrayscaleActivated() );
+
+  assert( std::numeric_limits< double >::has_quiet_NaN );
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    RgbwChannel chan = static_cast< RgbwChannel >( i );
+
+    VectorImageSettings::ChannelVector::value_type band =
+      settings.GetRgbwChannel( chan );
+
+    size_t size = model->GetDataCount( band );
+
+    double* x = new double[ size ];
+    double* y = new double[ size ];
+
+    double xMin = std::numeric_limits< double >::quiet_NaN();
+    double yMin = std::numeric_limits< double >::quiet_NaN();
+    double xMax = std::numeric_limits< double >::quiet_NaN();
+    double yMax = std::numeric_limits< double >::quiet_NaN();
+
+    model->GetData( band, x, y, xMin, xMax, yMin, yMax );
+
+    widget->SetData( chan, x, y, size, xMin, yMin, xMax, yMax );
+
+    widget->SetPrecision( HistogramModel::GetEpsilon() );
+    widget->SetLowMarker( chan, settings.GetLowIntensity( chan ) );
+    widget->SetHighMarker( chan, settings.GetHighIntensity( chan ) );
+
+    delete[] x;
+    x = NULL;
+
+    delete[] y;
+    y = NULL;
+    }
+
+  widget->RefreshScale( true );
+
+  widget->Replot();
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+HistogramController
+::OnRgbChannelIndexChanged( RgbwChannel channel, int )
+{
+  /*
+  qDebug()
+    << this
+    << "::OnRgbChannelIndexChanged("
+    << RGBW_CHANNEL_NAMES[ channel ] << ", " << band <<
+    ")";
+  */
+
+  ResetWidget( channel );
+}
+
+/*****************************************************************************/
+void
+HistogramController
+::OnGrayChannelIndexChanged( int )
+{
+  /*
+  qDebug()
+    << this
+    << "::OnGrayChannelIndexChanged(" << band << ")";
+  */
+
+  ResetWidget( RGBW_CHANNEL_WHITE );
+}
+
+/*****************************************************************************/
+void
+HistogramController
+::OnGrayscaleActivated( bool activated )
+{
+  /*
+  qDebug()
+    << this
+    << "::OnGrayscaleActivated(" << activated << ")";
+  */
+
+  assert( GetWidget()==GetWidget< HistogramWidget >() );
+  HistogramWidget* widget = GetWidget< HistogramWidget >();
+  assert( widget!=NULL );
+
+  widget->SetGrayscaleActivated( activated );
+
+  widget->RefreshScale( true );
+  widget->Replot();
+}
+
+/*****************************************************************************/
+void
+HistogramController
+::OnLowIntensityChanged( RgbwChannel channel, double value, bool refresh )
+{
+  assert( GetWidget()==GetWidget< HistogramWidget >() );
+  HistogramWidget* widget = GetWidget< HistogramWidget >();
+  assert( widget!=NULL );
+
+  widget->SetLowMarker( channel, value );
+
+  if( refresh )
+    widget->Replot();
+}
+
+/*****************************************************************************/
+void
+HistogramController
+::OnHighIntensityChanged( RgbwChannel channel, double value, bool refresh )
+{
+  assert( GetWidget()==GetWidget< HistogramWidget >() );
+  HistogramWidget* widget = GetWidget< HistogramWidget >();
+  assert( widget!=NULL );
+
+  widget->SetHighMarker( channel, value );
+
+  if( refresh )
+    widget->Replot();
+}
+
+/*****************************************************************************/
+void
+HistogramController
+::OnHistogramRefreshed()
+{
+  ResetWidget( RGBW_CHANNEL_ALL );
+}
+
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdHistogramPlotPicker.cxx b/Modules/Visualization/MonteverdiGui/src/mvdHistogramPlotPicker.cxx
new file mode 100644
index 0000000..38e0cfb
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdHistogramPlotPicker.cxx
@@ -0,0 +1,437 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdHistogramPlotPicker.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// Qwt includes.
+#include <qwt_plot_curve.h>
+#include <qwt_data.h>
+#include <qwt_painter.h>
+#include <qwt_plot.h>
+#include <qwt_text.h>
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdHistogramWidget.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::HistogramPlotPicker
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+HistogramPlotPicker
+::HistogramPlotPicker( const PlotCurveVector& curves, QwtPlotCanvas* can ) :
+  QwtPlotPicker( can ),
+  m_PlotCurves( curves ),
+  m_RubberBandPens(),
+  m_IsGrayscaleActivated( false )
+{
+  assert( m_PlotCurves.size()==HistogramPlotPicker::CURVE_COUNT );
+
+  setSelectionFlags( QwtPicker::PointSelection );
+  setRubberBand( QwtPicker::UserRubberBand );
+}
+
+/*******************************************************************************/
+HistogramPlotPicker
+::HistogramPlotPicker( const PlotCurveVector& curves,
+		       int xA,
+		       int yA,
+		       QwtPlotCanvas* can ) :
+  QwtPlotPicker( xA, yA, can ),
+  m_PlotCurves( curves ),
+  m_RubberBandPens(),
+  m_IsGrayscaleActivated( false )
+
+{
+  assert( m_PlotCurves.size()==HistogramPlotPicker::CURVE_COUNT );
+
+  setSelectionFlags( QwtPicker::PointSelection );
+  setRubberBand( QwtPicker::UserRubberBand );
+}
+
+/*******************************************************************************/
+HistogramPlotPicker
+::HistogramPlotPicker( const PlotCurveVector& curves,
+		       int xA,
+		       int yA,
+		       DisplayMode tracker,
+		       QwtPlotCanvas* can ) :
+  QwtPlotPicker(
+    xA,
+    yA,
+    QwtPicker::PointSelection,
+    QwtPicker::UserRubberBand,
+    tracker,
+    can ),
+  m_PlotCurves( curves ),
+  m_RubberBandPens(),
+  m_IsGrayscaleActivated( false )
+{
+  assert( m_PlotCurves.size()==HistogramPlotPicker::CURVE_COUNT );
+}
+
+/*******************************************************************************/
+HistogramPlotPicker
+::~HistogramPlotPicker()
+{
+}
+
+/*******************************************************************************/
+void
+HistogramPlotPicker
+::SetRubberBandPen( RgbwChannel channel, const QPen& pen )
+{
+  CountType start = 0;
+  CountType stop = 0;
+
+  if( !RgbwBounds( start, stop, channel ) )
+    return;
+
+  for( CountType i=start; i<stop; ++i )
+    {
+    m_RubberBandPens[ i ] = pen;
+    }
+}
+
+/*******************************************************************************/
+void
+HistogramPlotPicker
+::SetGrayscaleActivated( bool activated )
+{
+  m_IsGrayscaleActivated = activated;
+}
+
+/*******************************************************************************/
+void
+HistogramPlotPicker
+::drawRubberBand( QPainter* painter ) const
+{
+  assert( painter!=NULL );
+
+  if( rubberBand()!=QwtPicker::UserRubberBand )
+    {
+    QwtPlotPicker::drawRubberBand( painter );
+    return;
+    }
+
+  if( !isActive() ||
+      rubberBand()==QwtPicker::NoRubberBand ||
+      rubberBandPen().style()==Qt::NoPen )
+    return;
+
+  const QwtPolygon& pa = selection();
+
+  if( rubberBand()==QwtPicker::UserRubberBand &&
+      ( selectionFlags() & PointSelection ) &&
+      selection().count() >= 1 )
+    {
+    const QRect& rect = pickRect();
+    const QPoint& pos = pa[ 0 ];
+   
+    QwtPainter::drawLine(
+      painter,
+      pos.x(), rect.bottom(),
+      pos.x(), rect.top()
+    );
+
+    CountType start = 0;
+    CountType stop = 0;
+
+    if( !RgbwBounds( start, stop, RGBW_CHANNEL_ALL ) )
+      return;
+
+    QwtDoublePoint p( invTransform( pos ) );
+
+    for( CountType i=start; i<stop; ++i )
+      if( m_PlotCurves[ i ]->isVisible() )
+	{
+	// RgbwChannel channel = static_cast< RgbwChannel >( i );
+
+	p.setY( Find( m_PlotCurves[ i ], p.x() ) );
+	QPoint pos2( transform( p ) );
+
+	/*
+	  QPen pen( m_RubberBandPens[ i ] );
+	  painter->setPen( rubberBandPen() );
+	*/
+
+	QwtPainter::drawLine(
+	  painter,
+	  rect.left(), pos2.y(),
+	  rect.right(), pos2.y()
+	);
+
+	// painter->setPen( pen );
+	}
+    }
+}
+
+/*******************************************************************************/
+QwtText
+HistogramPlotPicker
+::trackerText( const QwtDoublePoint& point ) const
+{
+  if( rubberBand()!=QwtPicker::UserRubberBand )
+    return QwtPlotPicker::trackerText( point );
+
+  if( !isActive() )
+    return QwtText(
+      QString().sprintf(
+      "%.4f, %.4f",
+      point.x(), point.y()
+      )
+    );
+
+  QString text;
+  text.sprintf( "%.4f", point.x() );
+
+  CountType start = 0;
+  CountType stop = 0;
+
+  if( RgbwBounds( start, stop, RGBW_CHANNEL_ALL ) )
+    for( CountType i=start; i<stop; ++i )
+      if( m_PlotCurves[ i ]->isVisible() )
+	{
+	double c0 = 0.0;
+	double c1 = 0.0;
+	double cf = 0.0;
+
+	Find( m_PlotCurves[ i ], point.x(), c0, c1, cf );
+
+	text.append(
+	  QString().sprintf(
+	    "\n[%.4f; %.4f[, %.0f",
+	    c0, c1, cf
+	  )
+	);
+	}
+
+  return text;
+}
+
+/*******************************************************************************/
+double
+HistogramPlotPicker
+::Find( const QwtPlotCurve* curve, double x ) const
+{
+  const QwtData& data = curve->data();
+
+/*
+#if HISTOGRAM_CURVE_TYPE==0
+  assert( false && "Not yet implemented!" );
+
+#elif HISTOGRAM_CURVE_TYPE==1
+  assert( false && "Not yet implemented!" );
+
+#elif HISTOGRAM_CURVE_TYPE==2
+*/
+
+  assert( data.size() % 4 == 0 );
+
+  CountType steps = 0;
+
+  if( data.size()==0 )
+    return -1.0;
+
+  CountType i0 = 0;
+  CountType i1 = data.size() / 4 - 1;
+
+  // assert( x>=data.x( 4 * i0 ) && x<=data.x( 4 * i1 + 3 ) );
+  if( x<data.x( 4 * i0 ) || x>data.x( 4 * i1 + 3 ) )
+    return -1.0;
+
+  while( i0!=i1 )
+    {
+    assert( data.x( 4 * i0 )==data.x( 4 * i0 + 1 ) );
+    assert( data.x( 4 * i0 + 2 )==data.x( 4 * i0 + 3 ) );
+    assert( data.y( 4 * i0 + 1 )==data.y( 4 * i0 + 2 ) );
+    assert( data.y( 4 * i0 )==data.y( 4 * i0 + 3 ) );
+
+    assert( data.x( 4 * i1 )==data.x( 4 * i1 + 1 ) );
+    assert( data.x( 4 * i1 + 2 )==data.x( 4 * i1 + 3 ) );
+    assert( data.y( 4 * i1 + 1 )==data.y( 4 * i1 + 2 ) );
+    assert( data.y( 4 * i1 )==data.y( 4 * i1 + 3 ) );
+
+    CountType i = (i0 + i1 + 1) / 2;
+
+#if 0
+    qDebug()
+      << i0 << " (" << data.x( 4*i0 ) << ", " << data.x( 4*i0+2 ) << ") "
+      << i << " (" << data.x( 4*i ) << ", " << data.x( 4*i+2 ) << ") "
+      << i1 << " (" << data.x( 4*i1 ) << ", " << data.x( 4*i1+2 ) << ")";
+#endif
+
+    if( x<data.x( 4 * i ) )
+      i1 = i - 1;
+    else
+      i0 = i;
+
+    ++ steps;
+    }
+
+  assert( x>=data.x( 4 * i0 ) && x<=data.x( 4 * i0 + 2 ) );
+  assert( x>=data.x( 4 * i0 + 1 ) && x<=data.x( 4 * i0 + 3 ) );
+
+#if 0
+  qDebug()
+    << steps << ":"
+    << x << "in [" << data.x( 4 * i0 ) << "; " << data.x( 4 * i0 + 2 ) << "] ->"
+    << data.y( 4 * i0 + 1 );
+#endif
+
+  return data.y( 4 * i0 + 1 );
+
+/*
+#else
+  assert( false && "Unknown HISTOGRAM_CURVE_TYPE value" );
+
+#endif
+*/
+}
+
+/*******************************************************************************/
+CountType
+HistogramPlotPicker
+::Find( const QwtPlotCurve* curve,
+	double x,
+	double& xmin,
+	double& xmax,
+	double& y ) const
+{
+  const QwtData& data = curve->data();
+
+/*
+#if HISTOGRAM_CURVE_TYPE==0
+  assert( false && "Not yet implemented!" );
+
+#elif HISTOGRAM_CURVE_TYPE==1
+  assert( false && "Not yet implemented!" );
+
+#elif HISTOGRAM_CURVE_TYPE==2
+*/
+
+  assert( data.size() % 4 == 0 );
+
+  CountType steps = 0;
+
+  if( data.size()==0 )
+    return 0;
+
+  CountType i0 = 0;
+  CountType i1 = data.size() / 4 - 1;
+
+  if( x<data.x( 4 * i0 ) || x>data.x( 4 * i1 + 3 ) )
+    return 0;
+
+  while( i0!=i1 )
+    {
+    assert( data.x( 4 * i0 )==data.x( 4 * i0 + 1 ) );
+    assert( data.x( 4 * i0 + 2 )==data.x( 4 * i0 + 3 ) );
+    assert( data.y( 4 * i0 + 1 )==data.y( 4 * i0 + 2 ) );
+    assert( data.y( 4 * i0 )==data.y( 4 * i0 + 3 ) );
+
+    assert( data.x( 4 * i1 )==data.x( 4 * i1 + 1 ) );
+    assert( data.x( 4 * i1 + 2 )==data.x( 4 * i1 + 3 ) );
+    assert( data.y( 4 * i1 + 1 )==data.y( 4 * i1 + 2 ) );
+    assert( data.y( 4 * i1 )==data.y( 4 * i1 + 3 ) );
+
+    CountType i = (i0 + i1 + 1) / 2;
+
+#if 0
+    qDebug()
+      << i0 << " (" << data.x( 4*i0 ) << ", " << data.x( 4*i0+2 ) << ") "
+      << i << " (" << data.x( 4*i ) << ", " << data.x( 4*i+2 ) << ") "
+      << i1 << " (" << data.x( 4*i1 ) << ", " << data.x( 4*i1+2 ) << ")";
+#endif
+
+    if( x<data.x( 4 * i ) )
+      i1 = i - 1;
+    else
+      i0 = i;
+
+    ++ steps;
+    }
+
+  assert( x>=data.x( 4 * i0 ) && x<=data.x( 4 * i0 + 2 ) );
+  assert( x>=data.x( 4 * i0 + 1 ) && x<=data.x( 4 * i0 + 3 ) );
+
+#if 0
+  qDebug()
+    << steps << ":"
+    << x << "in [" << data.x( 4 * i0 ) << "; " << data.x( 4 * i0 + 2 ) << "] ->"
+    << data.y( 4 * i0 + 1 );
+#endif
+
+  xmin = data.x( 4 * i0 );
+  xmax = data.x( 4 * i0 + 2 );
+  y = data.y( 4 * i0 + 1 );
+
+  return steps;
+
+/*
+#else
+  assert( false && "Unknown HISTOGRAM_CURVE_TYPE value" );
+
+#endif
+*/
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.cxx
new file mode 100644
index 0000000..8a83841
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.cxx
@@ -0,0 +1,770 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdHistogramWidget.h"
+#include "ui_mvdHistogramWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// Qwt includes
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wshadow"
+#include <qwt_plot_curve.h>
+#include <qwt_plot_grid.h>
+#include <qwt_plot_magnifier.h>
+#include <qwt_plot_marker.h>
+#include <qwt_plot_panner.h>
+// #include <qwt_plot_zoomer.h>
+#include <qwt_scale_engine.h>
+#pragma GCC diagnostic pop
+#else
+#include <qwt_plot_curve.h>
+#include <qwt_plot_grid.h>
+#include <qwt_plot_magnifier.h>
+#include <qwt_plot_marker.h>
+#include <qwt_plot_panner.h>
+// #include <qwt_plot_zoomer.h>
+#include <qwt_scale_engine.h>
+#endif
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdHistogramPlotPicker.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::HistogramWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+#define PRECISION_MARGIN 4
+
+/**
+ * \brief Array of enhanced band names that OTB can return.
+ *
+ * It is defined (statically) as a constant for translation purposes.
+ */
+const char*
+HistogramWidget::CURVE_NAMES[ HistogramWidget::CURVE_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::HistogramWidget", "Red" ),
+  QT_TRANSLATE_NOOP( "mvd::HistogramWidget", "Green" ),
+  QT_TRANSLATE_NOOP( "mvd::HistogramWidget", "Blue" ),
+  QT_TRANSLATE_NOOP( "mvd::HistogramWidget", "Gray" ), 
+};
+
+const QColor
+HistogramWidget::CURVE_COLORS[ HistogramWidget::CURVE_COUNT ] =
+{
+  QColor( 0xFF, 0x44, 0x44/*, 0x66*/ ),
+  QColor( 0x44, 0xFF, 0x44/*, 0x66*/ ),
+  QColor( 0x44, 0x44, 0xFF/*, 0x66*/ ),
+  QColor( 0xBB, 0xBB, 0xBB/*, 0x66*/ ),
+};
+
+const QColor
+HistogramWidget::BAR_COLORS[ HistogramWidget::CURVE_COUNT ] =
+{
+  QColor( 0xFF, 0x44, 0x44, 0x66 ),
+  QColor( 0x44, 0xFF, 0x44, 0x66 ),
+  QColor( 0x44, 0x44, 0xFF, 0x66 ),
+  QColor( 0xBB, 0xBB, 0xBB, 0x66 ),
+};
+
+const QColor
+HistogramWidget::MARKER_COLORS[ HistogramWidget::CURVE_COUNT ] =
+{
+  QColor( 0xFF, 0x77, 0x77/*, 0x00*/ ),
+  QColor( 0x77, 0xFF, 0x77/*, 0x77*/ ),
+  QColor( 0x77, 0x77, 0xFF/*, 0x00*/ ),
+  QColor( 0xFF, 0xFF, 0xFF/*, 0x00*/ ),
+};
+
+const QColor
+HistogramWidget::RUBBER_BAND_COLORS[ HistogramWidget::CURVE_COUNT ] =
+{
+  QColor( 0xFF, 0x77, 0x77/*, 0xAA */ ),
+  QColor( 0x77, 0xFF, 0x77/*, 0xAA */ ),
+  QColor( 0x77, 0x77, 0xFF/*, 0xAA */ ),
+  QColor( 0xFF, 0xFF, 0xFF/*, 0xAA */ ),
+};
+
+namespace
+{
+const QColor CANVAS_BACKGROUND( 0x33, 0x33, 0x33 );
+const QColor GRID_MAJ_PEN_COLOR( 0x66, 0x66, 0x66 );
+const QColor GRID_MIN_PEN_COLOR( 0x44, 0x44, 0x44 );
+const QColor RUBBER_BAND_COLOR( 0xFF, 0xFF, 0x00, 0xAA );
+}
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+HistogramWidget
+::HistogramWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::HistogramWidget() ),
+  m_PlotGrid( NULL ),
+  m_PlotPicker( NULL ),
+  // m_PlotZoomer( NULL ),
+  m_PlotMagnifier( NULL ),
+  m_PlotPanner( NULL ),
+  // m_PlotCurves(),
+  // m_LowPlotMarkers(),
+  // m_HighPlotMarkers(),
+  m_Bounds(),
+  m_Precision( 0.0 ),
+  m_IsGrayscaleActivated( false )
+{
+  m_UI->setupUi( this );
+
+  m_UI->histogramPlot->setCanvasBackground( CANVAS_BACKGROUND  );
+
+
+  //
+  // GRID.
+
+  m_PlotGrid = new QwtPlotGrid();
+  m_PlotGrid->attach( m_UI->histogramPlot );
+
+  m_PlotGrid->setMajPen( GRID_MAJ_PEN_COLOR );
+  m_PlotGrid->setMinPen( GRID_MIN_PEN_COLOR );
+
+  //
+  // ZOOMER.
+  /*
+  m_PlotZoomer = new QwtPlotZoomer( m_UI->histogramPlot->canvas() );
+  m_PlotZoomer->setTrackerMode( QwtPicker::AlwaysOff );
+  m_PlotZoomer->setSelectionFlags(
+    QwtPicker::RectSelection |
+    QwtPicker::DragSelection );
+  m_PlotZoomer->setRubberBandPen( QPen( QColor( 0xFF, 0x44, 0xFF ) ) );
+  m_PlotZoomer->setTrackerPen( QPen( QColor( 0xFF, 0x44, 0xFF ) ) );
+  */
+  m_PlotMagnifier = new QwtPlotMagnifier( m_UI->histogramPlot->canvas() );
+  m_PlotMagnifier->setAxisEnabled( QwtPlot::yLeft, false );
+  m_PlotMagnifier->setWheelFactor( 1.0 / m_PlotMagnifier->wheelFactor() );
+  m_PlotMagnifier->setMouseButton( Qt::MidButton );
+  // m_PlotMagnifier->setZoomInKey( Qt::Key_Plus, Qt::NoModifier );
+  // m_PlotMagnifier->setZoomOutKey( Qt::Key_Minus, Qt::NoModifier );
+
+  m_PlotPanner = new QwtPlotPanner( m_UI->histogramPlot->canvas() );
+  // m_PlotPanner->setAxisEnabled( QwtPlot::yLeft, false );
+  m_PlotPanner->setMouseButton( Qt::RightButton );
+  m_PlotPanner->setOrientations( Qt::Horizontal );
+
+  //
+  // CURVES.
+
+  HistogramPlotPicker::PlotCurveVector curves( HistogramWidget::CURVE_COUNT );
+
+  for( CountType i=0; i<HistogramWidget::CURVE_COUNT; ++i )
+    {
+    //
+    // Curve
+
+    curves[ i ] =
+    m_PlotCurves[ i ] =
+      new QwtPlotCurve( tr( HistogramWidget::CURVE_NAMES[ i ] ) );
+
+#if HISTOGRAM_CURVE_TYPE==0
+
+#elif HISTOGRAM_CURVE_TYPE==1
+    m_PlotCurves[ i ]->setStyle( QwtPlotCurve::Steps );
+
+#elif HISTOGRAM_CURVE_TYPE==2
+
+#else
+#endif
+
+    m_PlotCurves[ i ]->setPen( QPen( CURVE_COLORS[ i ] ) );
+    m_PlotCurves[ i ]->setBrush( QBrush( BAR_COLORS[ i ] ) );
+
+    m_PlotCurves[ i ]->attach( m_UI->histogramPlot );
+
+    //
+    // Markers
+
+    m_LowPlotMarkers[ i ] = new QwtPlotMarker();
+    m_LowPlotMarkers[ i ]->setLineStyle( QwtPlotMarker::VLine );
+    m_LowPlotMarkers[ i ]->setLinePen(
+      QPen( HistogramWidget::MARKER_COLORS[ i ] )
+    );
+    m_LowPlotMarkers[ i ]->attach( m_UI->histogramPlot );
+
+    m_HighPlotMarkers[ i ] = new QwtPlotMarker();
+    m_HighPlotMarkers[ i ]->setLineStyle( QwtPlotMarker::VLine );
+    m_HighPlotMarkers[ i ]->setLinePen(
+      QPen( HistogramWidget::MARKER_COLORS[ i ] )
+    );
+    m_HighPlotMarkers[ i ]->attach( m_UI->histogramPlot );
+    }
+
+  //
+  // PICKER.
+
+  m_PlotPicker =
+    new HistogramPlotPicker( curves, m_UI->histogramPlot->canvas() );
+  m_PlotPicker->setTrackerMode( QwtPicker::ActiveOnly );
+  m_PlotPicker->setRubberBandPen( RUBBER_BAND_COLOR );
+  m_PlotPicker->setTrackerPen( QColor( Qt::yellow ) );
+
+  for( CountType i=0; i<HistogramWidget::CURVE_COUNT; ++i )
+    {
+    m_PlotPicker->SetRubberBandPen(
+      static_cast< RgbwChannel >( i ),
+      QPen( HistogramWidget::RUBBER_BAND_COLORS[ i ] )
+    );
+    }
+
+  //
+  // CONNECTIONS.
+
+  //
+  //
+  QObject::connect(
+    m_PlotPicker, SIGNAL( appended( const QwtDoublePoint& ) ),
+    this, SLOT( OnAppended( const QwtDoublePoint& ) )
+  );
+  QObject::connect(
+    m_PlotPicker, SIGNAL( appended( const QPoint& ) ),
+    this, SLOT( OnAppended( const QPoint& ) )
+  );
+  //
+  QObject::connect(
+    m_PlotPicker, SIGNAL( changed( const QwtPolygon& ) ),
+    this, SLOT( OnChanged( const QwtPolygon& ) )
+  );
+  //
+  QObject::connect(
+    m_PlotPicker, SIGNAL( selected( const QwtDoublePoint& ) ),
+    this, SLOT( OnSelected( const QwtDoublePoint& ) )
+  );
+  QObject::connect(
+    m_PlotPicker, SIGNAL( selected( const QwtDoubleRect& ) ),
+    this, SLOT( OnSelected( const QwtDoubleRect& ) )
+  );
+  QObject::connect(
+    m_PlotPicker, SIGNAL( selected( const QwtPolygon& ) ),
+    this, SLOT( OnSelected( const QwtPolygon& ) )
+  );
+  QObject::connect(
+    m_PlotPicker, SIGNAL( selected( const QwtArray< QwtDoublePoint >& ) ),
+    this, SLOT( OnSelected( const QwtArray< QwtDoublePoint >& ) )
+  );
+}
+
+/*******************************************************************************/
+HistogramWidget
+::~HistogramWidget()
+{
+  delete m_PlotPicker;
+  m_PlotPicker = NULL;
+
+  for( CountType i=0; i<HistogramWidget::CURVE_COUNT; ++i )
+    {
+    delete m_PlotCurves[ i ];
+    m_PlotCurves[ i ] = NULL;
+
+    delete m_LowPlotMarkers[ i ];
+    m_LowPlotMarkers[ i ] = NULL;
+
+    delete m_HighPlotMarkers[ i ];
+    m_HighPlotMarkers[ i ] = NULL;
+    }
+
+  delete m_PlotPanner;
+  m_PlotPanner = NULL;
+
+  delete m_PlotMagnifier;
+  m_PlotMagnifier = NULL;
+
+  /*
+  delete m_PlotZoomer;
+  m_PlotZoomer = NULL;
+  */
+
+  delete m_PlotGrid;
+  m_PlotGrid = NULL;
+
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::SetPrecision( double p )
+{
+  m_Precision = p;
+}
+
+/*******************************************************************************/
+double
+HistogramWidget
+::GetPrecision() const
+{
+  return m_Precision;
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::SetBounds( RgbwChannel channel,
+	     double xMin, double xMax,
+	     double yMin, double yMax )
+{
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    m_Bounds[ i ].m_XMin = xMin;
+    m_Bounds[ i ].m_XMax = xMax;
+
+    m_Bounds[ i ].m_YMin = yMin;
+    m_Bounds[ i ].m_YMax = yMax;
+    }
+
+  // RefreshScale();
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::SetData( RgbwChannel channel,
+	   double * const xVal, double * const yVal, size_t sizeVal,
+	   double xMin, double yMin,
+	   double xMax, double yMax )
+{
+  assert( ( xVal==NULL && yVal==NULL && sizeVal==0 ) ||
+	  ( xVal!=NULL && yVal!=NULL && sizeVal!=0 ) );
+
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    assert( i<HistogramWidget::CURVE_COUNT );
+    assert( m_PlotCurves[ i ]!=NULL );
+
+    m_PlotCurves[ i ]->setData( xVal, yVal, sizeVal );
+
+    if( xVal==NULL && yVal==NULL )
+      m_PlotCurves[ i ]->setVisible( false );
+
+    /*
+    qDebug()
+      << RGBW_CHANNEL_NAMES[ i ]
+      << "[" << xMin << "; " << xMax << "]"
+      << "xVal [" << yMin << "; " << yMax << "]";
+    */
+
+    m_Bounds[ i ].m_XMin = xMin;
+    m_Bounds[ i ].m_XMax = xMax;
+
+    m_Bounds[ i ].m_YMin = yMin;
+    m_Bounds[ i ].m_YMax = yMax;
+    }
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::SetLowMarker( RgbwChannel channel,
+		double low )
+{
+  /*
+  qDebug()
+    << this << "::SetLowMarker("
+    << RGBW_CHANNEL_NAMES[ channel ] << ", " << low << ")";
+  */
+
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    m_LowPlotMarkers[ i ]->setXValue( low );
+
+    m_Bounds[ i ].m_QMin = low;
+    }
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::SetHighMarker( RgbwChannel channel,
+		 double high )
+{
+  /*
+  qDebug()
+    << this << "::SetLowMarker("
+    << RGBW_CHANNEL_NAMES[ channel ] << ", " << high << ")";
+  */
+
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, channel ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    m_HighPlotMarkers[ i ]->setXValue( high );
+
+    m_Bounds[ i ].m_QMax = high;
+    }
+}
+
+/*****************************************************************************/
+void
+HistogramWidget
+::SetGrayscaleActivated( bool activated )
+{
+  m_IsGrayscaleActivated = activated;
+
+  /*
+  for( CountType i=0; i<HistogramWidget::CURVE_COUNT; ++i )
+    {
+    bool isVisible = 
+      i<RGBW_CHANNEL_WHITE
+      ? !activated
+      : activated;
+
+    m_PlotCurves[ i ]->setVisible( isVisible );
+
+    m_LowPlotMarkers[ i ]->setVisible( isVisible );
+    m_HighPlotMarkers[ i ]->setVisible( isVisible );
+    }
+  */
+
+  m_UI->channelComboBox->setEnabled( !activated );
+
+  bool areSignalsBlocked = m_UI->channelComboBox->blockSignals( true );
+  {
+  m_UI->channelComboBox->setItemText(
+    3,
+    activated
+    ? tr( "White" )
+    : tr( "RGB" )
+  );
+  m_UI->channelComboBox->setCurrentIndex( 3 );
+  UpdateCurvesVisibility( 3 );
+  }
+  m_UI->channelComboBox->blockSignals( areSignalsBlocked );
+  m_PlotPicker->SetGrayscaleActivated( activated );
+}
+
+/*****************************************************************************/
+/*
+bool
+HistogramWidget
+::IsGrayscaleActivated() const
+{
+  assert( m_PlotCurves[ RGBW_CHANNEL_WHITE ]!=NULL );
+
+  return m_PlotCurves[ RGBW_CHANNEL_WHITE ]->isVisible();
+}
+*/
+
+/*******************************************************************************/
+void
+HistogramWidget
+::Replot()
+{
+  // RefreshScale( true );
+
+  m_UI->histogramPlot->replot();
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::UpdateCurvesVisibility( CountType index )
+{
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, RGBW_CHANNEL_ALL ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    bool isCurveVisible =
+      m_IsGrayscaleActivated
+      ? i==RGBW_CHANNEL_WHITE
+      : ( index==RGBW_CHANNEL_WHITE
+	  ? i<RGBW_CHANNEL_WHITE
+	  : i==index ); 
+
+    assert( i<HistogramWidget::CURVE_COUNT );
+
+    m_PlotCurves[ i ]->setVisible( isCurveVisible );
+    m_LowPlotMarkers[ i ]->setVisible( isCurveVisible );
+    m_HighPlotMarkers[ i ]->setVisible( isCurveVisible );
+    }
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::RefreshScale( bool iqr )
+{
+  assert( std::numeric_limits< double >::has_infinity );
+
+  double xMin = +std::numeric_limits< double >::infinity();
+  double xMax = -std::numeric_limits< double >::infinity();
+
+  double yMin = +std::numeric_limits< double >::infinity();
+  double yMax = -std::numeric_limits< double >::infinity();
+
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, RGBW_CHANNEL_ALL ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    if( iqr )
+      {
+      if( m_Bounds[ i ].m_QMin<xMin )
+	xMin = m_Bounds[ i ].m_QMin;
+
+      if( m_Bounds[ i ].m_QMax>xMax )
+	xMax = m_Bounds[ i ].m_QMax;
+      }
+    else
+      {
+      if( m_Bounds[ i ].m_XMin<xMin )
+	xMin = m_Bounds[ i ].m_XMin;
+
+      if( m_Bounds[ i ].m_XMax>xMax )
+	xMax = m_Bounds[ i ].m_XMax;
+      }
+
+    if( m_Bounds[ i ].m_YMin<yMin )
+      yMin = m_Bounds[ i ].m_YMin;
+
+    if( m_Bounds[ i ].m_YMax>yMax )
+      yMax = m_Bounds[ i ].m_YMax;
+    }
+
+  if( xMin==xMax )
+    {
+    double epsilon = PRECISION_MARGIN * m_Precision;
+
+    if( xMin >= std::numeric_limits< double >::min() + epsilon )
+      xMin -= epsilon;
+
+    if( xMax <= std::numeric_limits< double >::max() - epsilon )
+      xMax += epsilon;
+    }
+
+  // qDebug()
+  //   << "[" << xMin << "; " << xMax << "]"
+  //   << "x [" << yMin << "; " << yMax << "]";
+
+  m_UI->histogramPlot->setAxisScale( QwtPlot::xBottom, xMin, xMax );
+  m_UI->histogramPlot->setAxisScale( QwtPlot::yLeft, yMin, yMax );
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::Clear()
+{
+  CountType begin = 0;
+  CountType end = 0;
+
+  if( !RgbwBounds( begin, end, RGBW_CHANNEL_ALL ) )
+    return;
+
+  for( CountType i=begin; i<end; ++i )
+    {
+    m_PlotCurves[ i ]->setVisible( false );
+    m_LowPlotMarkers[ i ]->setVisible( false );
+    m_HighPlotMarkers[ i ]->setVisible( false );
+    /*
+    qDebug()
+      << RGBW_CHANNEL_NAMES[ i ]
+      << "[" << xMin << "; " << xMax << "]"
+      << "x [" << yMin << "; " << yMax << "]";
+    */
+
+    m_Bounds[ i ].m_XMin = 0.0;
+    m_Bounds[ i ].m_XMax = 1000.0;
+
+    m_Bounds[ i ].m_YMin = 0.0;
+    m_Bounds[ i ].m_YMax = 1000.0;
+
+    m_Bounds[ i ].m_QMin = 0.0;
+    m_Bounds[ i ].m_QMax = 1000.0;
+    }
+
+  RefreshScale( false );
+
+  Replot();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+HistogramWidget
+::on_zoom1Button_clicked()
+{
+  RefreshScale( false );
+  Replot();
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::on_zoomQButton_clicked()
+{
+  RefreshScale( true );
+  Replot();
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::on_channelComboBox_currentIndexChanged( int /*index*/ )
+{
+  UpdateCurvesVisibility( m_UI->channelComboBox->currentIndex() );
+
+  Replot();
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnAppended( const QwtDoublePoint & )
+{
+  // qDebug() << this << "::OnAppended(" << pos.x() << ", " << pos.y() << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnAppended( const QPoint & )
+{
+  // qDebug() << this << "::OnAppended(" << pos << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnChanged( const QwtPolygon & )
+{
+  // qDebug() << this << "::OnChanged(" << pa << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnMoved( const QwtDoublePoint & )
+{
+  // qDebug() << this << "::OnMoved(" << pos.x() << ", " << pos.y() << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnMoved( const QPoint & )
+{
+  // qDebug() << this << "::OnMoved(" << pos << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnSelected( const QwtDoublePoint & )
+{
+  // qDebug() << this << "::OnSelected(" << pos.x() << ", " << pos.y() << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnSelected( const QwtDoubleRect & )
+{
+  // qDebug() << this << "::OnSelected(" << rect.x() << ", " << rect.y() << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnSelected( const QwtPolygon & )
+{
+  // qDebug() << this << "::OnSelected(" << pa << ")";
+}
+
+/*******************************************************************************/
+void
+HistogramWidget
+::OnSelected( const QwtArray< QwtDoublePoint > & )
+{
+  // qDebug() << this << "::OnSelected(" << pa << ")";
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui
new file mode 100644
index 0000000..b66d978
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdHistogramWidget.ui
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::HistogramWidget</class>
+ <widget class="QWidget" name="mvd::HistogramWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>218</width>
+    <height>158</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QToolButton" name="zoom1Button">
+       <property name="toolTip">
+        <string>Zoom to full intensity range.</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_ZoomFull_Icon</normaloff>:/icons/action_ZoomFull_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="zoomQButton">
+       <property name="toolTip">
+        <string>Zoom to quantile ranges.</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_ZoomExtent_Icon</normaloff>:/icons/action_ZoomExtent_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QComboBox" name="channelComboBox">
+       <property name="toolTip">
+        <string>Select channel(s) to display.</string>
+       </property>
+       <item>
+        <property name="text">
+         <string>Red</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>Green</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>Blue</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>RGB</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QwtPlot" name="histogramPlot">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>200</width>
+       <height>100</height>
+      </size>
+     </property>
+     <property name="toolTip">
+      <string>Histogram estimated on Quicklook.</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>QwtPlot</class>
+   <extends>QFrame</extends>
+   <header>qwt_plot.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="../../Application/Monteverdi/mvdMainWindow.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdI18nApplication.cxx b/Modules/Visualization/MonteverdiGui/src/mvdI18nApplication.cxx
new file mode 100644
index 0000000..d11d3a7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdI18nApplication.cxx
@@ -0,0 +1,86 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdI18nApplication.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGlView.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::I18nApplication
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+I18nApplication
+::I18nApplication( QApplication* qtApp ) :
+  I18nCoreApplication( qtApp )
+{
+}
+
+/*******************************************************************************/
+I18nApplication
+::~I18nApplication()
+{
+}
+
+/*******************************************************************************/
+void
+I18nApplication
+::virtual_InitializeCore()
+{
+#ifndef Q_WS_MAC
+    qApp->setWindowIcon( QIcon( QLatin1String( ":/images/application_icon" ) ) );
+#endif
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx b/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx
new file mode 100644
index 0000000..3aad408
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdI18nMainWindow.cxx
@@ -0,0 +1,346 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  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 "mvdI18nMainWindow.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtGui>
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbSystem.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdBackgroundTask.h"
+#include "mvdImageImporter.h"
+#include "mvdOverviewBuilder.h"
+#include "mvdVectorImageModel.h"
+#include "mvdAboutDialog.h"
+#include "mvdI18nApplication.h"
+#include "mvdImportImagesDialog.h"
+#include "mvdTaskProgressDialog.h"
+
+namespace mvd
+{
+  
+/*
+  TRANSLATOR mvd::I18nMainWindow
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+I18nMainWindow
+::I18nMainWindow( QWidget* p, Qt::WindowFlags flags ) :
+  QMainWindow( p, flags )
+{
+}
+
+/*****************************************************************************/
+I18nMainWindow
+::~I18nMainWindow()
+{
+}
+
+/*****************************************************************************/
+void
+I18nMainWindow
+::Initialize()
+{
+  /*
+  // Default setup.
+  setObjectName( "mvd::I18nMainWindow" );
+  setWindowTitle( PROJECT_NAME );
+  */
+
+  virtual_SetupUI();
+
+  // Connect Appllication and MainWindow when selected model is about
+  // to change.
+  QObject::connect(
+    I18nApplication::Instance(),
+    SIGNAL( AboutToChangeModel( const AbstractModel* ) ),
+    this,
+    SLOT( OnAboutToChangeModel( const AbstractModel* ) )
+  );
+
+  // Connect Application and MainWindow when selected model has been
+  // changed.
+  QObject::connect(
+    I18nApplication::Instance(),
+    SIGNAL( ModelChanged( AbstractModel* ) ),
+    this,
+    SLOT( OnModelChanged( AbstractModel* ) )
+  );
+
+  virtual_ConnectUI();
+
+  virtual_InitializeUI();
+}
+
+/*****************************************************************************/
+QDockWidget*
+I18nMainWindow
+::AddWidgetToDock( QWidget* widget,
+                   const QString& dockName,
+                   const QString& dockTitle,
+                   Qt::DockWidgetArea dockArea,
+                   DockLayoutFlags flags )
+{
+  // New dock.
+  QDockWidget* dockWidget = new QDockWidget( dockTitle, this );
+
+  // You can use findChild( dockName ) to get dock-widget.
+  dockWidget->setObjectName( dockName );
+  dockWidget->setWidget( widget );
+
+  // Features.
+  dockWidget->setFloating( flags.testFlag( DOCK_LAYOUT_FLOATING ) );
+  dockWidget->setFeatures(
+    QDockWidget::DockWidgetMovable |
+    QDockWidget::DockWidgetFloatable |
+    QDockWidget::DockWidgetClosable
+  );
+
+  // dockWidget->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
+
+  // dockWidget->adjustSize();
+
+  // Add dock.
+  addDockWidget( dockArea, dockWidget );
+
+  //
+  return dockWidget;
+}
+
+/*****************************************************************************/
+VectorImageModel *
+I18nMainWindow
+::ImportImage( const QString& filename,
+               int widthVal,
+               int heightVal )
+{
+  return
+    QObjectCast< VectorImageModel * >(
+      Import(
+        // New dataset-importer worker.
+        // It will be auto-deleted by background-task.
+        new ImageImporter(
+          filename,
+          widthVal, heightVal
+        )
+      ),
+      "QObject is not a VectorImageModel."
+    );
+}
+
+/*****************************************************************************/
+bool
+I18nMainWindow
+::BuildGDALOverviews( const QStringList & filenames )
+{
+  ImportImagesDialog * importDialog = new ImportImagesDialog( filenames, this );
+
+  if( importDialog->GetEffectiveCount()<1 )
+    return true;
+
+  int result = importDialog->exec();
+
+  if( result== QDialog::Rejected )
+    return false;
+
+  if( result==QDialog::Accepted )
+    {
+    // AbstractWorker will be automatically deleted by BackgroundTask in
+    // ::Import().
+    OverviewBuilder * builder =
+      new OverviewBuilder(
+	importDialog->GetGDALOverviewsBuilders()
+      );
+
+    delete importDialog;
+    importDialog = NULL;
+
+    Import( builder );
+    }
+
+  return true;
+}
+
+/*****************************************************************************/
+QObject *
+I18nMainWindow
+::Import( AbstractWorker * importer )
+{
+  assert( importer );
+
+  //
+  // Background task.
+
+  // New background-task running worker.
+  // Will be self auto-deleted when worker has finished.
+  BackgroundTask* task = new BackgroundTask( importer, false, this );
+
+  //
+  // Progress dialog.
+  TaskProgressDialog progress(
+    task,
+    this,
+    Qt::CustomizeWindowHint | Qt::WindowTitleHint
+  );
+
+  progress.setWindowModality( Qt::WindowModal );
+  progress.setAutoReset( false );
+  progress.setAutoClose( false );
+  progress.setCancelButton( NULL );
+  progress.setMinimumDuration( 0 );
+
+  //
+  // Result.
+  int button = progress.Exec();
+
+  // MANTIS-921 (synchronize deletion of BackgroungTask).
+  task->wait();
+  delete task;
+  task = NULL;
+
+  // MANTIS-921 (then, process result).
+  if( button!=QDialog::Accepted )
+    {
+    assert( progress.GetObject()==NULL );
+
+    return NULL;
+    }
+
+  // qDebug() << "object:" << progress.GetObject< DatasetModel >();
+
+  // assert( progress.GetObject()!=NULL );
+
+  return progress.GetObject();
+}
+
+/*****************************************************************************/
+void
+I18nMainWindow
+::closeEvent( QCloseEvent * e )
+{
+  QMainWindow::closeEvent( e );
+}
+
+/*****************************************************************************/
+void
+I18nMainWindow
+::virtual_InitializeUI()
+{
+  // Change to NULL model to force emitting GUI signals when GUI is
+  // instantiated. So, GUI will be initialized and controller-widgets
+  // disabled.
+  I18nApplication::Instance()->SetModel( NULL );
+}
+
+/*****************************************************************************/
+void
+I18nMainWindow
+::SaveLayout( int version ) const
+{
+  // qDebug() << this << "::SaveLayout()";
+
+  assert( I18nCoreApplication::Instance()!=NULL );
+
+  QString name( objectName() );
+
+  I18nCoreApplication::Instance()
+    ->StoreSettingsKey( name + "Geometry", saveGeometry() );
+
+  I18nCoreApplication::Instance()
+    ->StoreSettingsKey( name + "State", saveState( version ) );
+}
+
+/*****************************************************************************/
+bool
+I18nMainWindow
+::RestoreLayout( int version )
+{
+  // qDebug() << this << "::RestoreLayout()";
+
+  I18nCoreApplication * application = I18nCoreApplication::Instance();
+  assert( application!=NULL );
+
+  QString name( objectName() );
+  assert( !name.isEmpty() );
+
+  if( !restoreGeometry(
+	application->RetrieveSettingsKey( name + "Geometry" ).toByteArray() ) )
+    return false;
+
+  return
+    restoreState(
+      application->RetrieveSettingsKey( name + "State" ).toByteArray(),
+      version
+    );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+I18nMainWindow
+::on_action_Quit_triggered()
+{
+  close();
+}
+
+/*****************************************************************************/
+void
+I18nMainWindow
+::on_action_About_triggered()
+{
+  AboutDialog aboutDialog( this );
+
+  aboutDialog.exec();
+}
+
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc b/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc
new file mode 100644
index 0000000..835ed71
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdIcons.qrc
@@ -0,0 +1,7 @@
+<RCC>
+  <qresource prefix="/">
+    <file>../../../../Utilities/Data/Icons/execute.png</file>
+    <file>../../../../Utilities/Data/Icons/locked.png</file>
+    <file>../../../../Utilities/Data/Icons/unlocked.png</file>
+  </qresource>
+</RCC>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImageViewManipulator.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImageViewManipulator.cxx
new file mode 100644
index 0000000..4358dfd
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImageViewManipulator.cxx
@@ -0,0 +1,1029 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageViewManipulator.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdGui.h"
+#include "mvdImageViewRenderer.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageViewManipulator
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+const int ImageViewManipulator::DEFAULT_GRANULARITY = 1;
+const int ImageViewManipulator::DEFAULT_ALPHA_GRANULARITY = 10;
+const double ImageViewManipulator::DEFAULT_DYNAMICS_SHIFT_GRANULARITY = 0.01;
+const int ImageViewManipulator::DEFAULT_SCROLL_GRANULARITY = 4;
+const int ImageViewManipulator::DEFAULT_ZOOM_GRANULARITY = 2;
+
+const double ImageViewManipulator::DEFAULT_DELTA = 0.1;
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+
+ImageViewManipulator
+::ImageViewManipulator( const otb::ViewSettings::Pointer& viewSettings,
+                        QObject* p ) :
+  AbstractImageViewManipulator( p ),
+  m_MousePressPosition(),
+  m_ViewSettings( viewSettings ),
+  m_Timer( NULL ),
+  m_NativeSpacing(),
+  m_MousePressOrigin(),
+  m_RenderMode( AbstractImageViewRenderer::RenderingContext::RENDER_MODE_FULL ),
+  m_ZoomFactor( 1.0 ),
+  m_AlphaGranularity( ImageViewManipulator::DEFAULT_ALPHA_GRANULARITY ),
+  m_DynamicsShiftGranularity( ImageViewManipulator::DEFAULT_DYNAMICS_SHIFT_GRANULARITY ),
+  m_ScrollGranularity( ImageViewManipulator::DEFAULT_SCROLL_GRANULARITY ),
+  m_ZoomGranularity( ImageViewManipulator::DEFAULT_ZOOM_GRANULARITY ),
+  m_IsMouseDragging( false )
+{
+  m_NativeSpacing.Fill( 1.0 );
+}
+
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+
+ImageViewManipulator
+::ImageViewManipulator( QObject* p ) :
+  AbstractImageViewManipulator( p ),
+  m_MousePressPosition(),
+  m_ViewSettings( otb::ViewSettings::New() ),
+  m_Timer( NULL ),
+  m_NativeSpacing(),
+  m_MousePressOrigin(),
+  m_RenderMode( AbstractImageViewRenderer::RenderingContext::RENDER_MODE_FULL ),
+  m_ZoomFactor( 1.0 ),
+  m_AlphaGranularity( ImageViewManipulator::DEFAULT_ALPHA_GRANULARITY ),
+  m_DynamicsShiftGranularity( ImageViewManipulator::DEFAULT_DYNAMICS_GRANULARITY ),
+  m_ScrollGranularity( ImageViewManipulator::DEFAULT_SCROLL_GRANULARITY ),
+  m_ZoomGranularity( ImageViewManipulator::DEFAULT_ZOOM_GRANULARITY ),
+  m_IsMouseDragging( false )
+{
+  m_NativeSpacing.Fill( 1.0 );
+}
+
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+
+/*****************************************************************************/
+ImageViewManipulator
+::~ImageViewManipulator()
+{
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetViewportSize( int width, int height )
+{
+  SizeType size;
+
+  size[ 0 ] = width;
+  size[ 1 ] = height;
+
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->SetViewportSize( size );
+}
+
+/******************************************************************************/
+SizeType
+ImageViewManipulator
+::GetViewportSize() const
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  return m_ViewSettings->GetViewportSize();
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetOrigin( const PointType& origin )
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->SetOrigin( origin );
+}
+
+/******************************************************************************/
+PointType
+ImageViewManipulator
+::GetOrigin() const
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  return m_ViewSettings->GetOrigin();
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetSpacing( const SpacingType& spacing )
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->SetSpacing( spacing );
+}
+
+/******************************************************************************/
+SpacingType
+ImageViewManipulator
+::GetSpacing() const
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  return m_ViewSettings->GetSpacing();
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetNativeSpacing( const SpacingType& spacing )
+{
+  m_NativeSpacing = spacing;
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetWkt( const std::string& wkt )
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->SetWkt( wkt );
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetKeywordList( const DefaultImageType::ImageKeywordlistType& kwl )
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->SetKeywordList( kwl );
+}
+
+/******************************************************************************/
+PointType
+ImageViewManipulator
+::GetCenter() const
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  return m_ViewSettings->GetViewportCenter();
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::SetupRenderingContext(
+  AbstractImageViewRenderer::RenderingContext * const c ) const
+{
+  assert(
+    c==dynamic_cast< ImageViewRenderer::RenderingContext const * >( c )
+  );
+
+  ImageViewRenderer::RenderingContext * const context =
+    dynamic_cast< ImageViewRenderer::RenderingContext * const >( c );
+
+  // Coverity-19840
+  // {
+  assert( context!=NULL );
+  // }
+
+  context->m_RenderMode =
+    m_IsMouseDragging
+    ? AbstractImageViewRenderer::RenderingContext::RENDER_MODE_LIGHT
+    : m_RenderMode;
+
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+  context->m_ViewSettings->SetOrigin( m_ViewSettings->GetOrigin() );
+  context->m_ViewSettings->SetSpacing( m_ViewSettings->GetSpacing() );
+  context->m_ViewSettings->SetViewportSize( m_ViewSettings->GetViewportSize() );
+  context->m_ViewSettings->SetWkt( m_ViewSettings->GetWkt() );
+  context->m_ViewSettings->SetKeywordList( m_ViewSettings->GetKeywordList() );
+  context->m_ViewSettings->SetUseProjection( m_ViewSettings->GetUseProjection() );
+  context->m_ViewSettings->SetGeometryChanged(
+    m_ViewSettings->GetGeometryChanged()
+  );
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::CenterOn( const PointType& point )
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->Center( point );
+
+  emit RoiChanged( GetOrigin(), GetViewportSize(), GetSpacing(), point );
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::ZoomTo( double scale )
+{
+  // qDebug() << this << "::ZoomTo(" << scale << ")";
+
+  assert( scale!=0.0 );
+
+  assert( !m_ViewSettings.IsNull() );
+
+  // Remember center of viewport.
+  otb::ViewSettings::PointType center( m_ViewSettings->GetViewportCenter() );
+
+  // Calculate spacing based on scale.
+#if 0
+  otb::ViewSettings::SpacingType spacing( m_ViewSettings->GetSpacing() );
+
+  spacing[ 0 ] = ( spacing[ 0 ]>0.0 ? 1.0 : -1.0 ) / scale;
+  spacing[ 1 ] = ( spacing[ 1 ]>0.0 ? 1.0 : -1.0 ) / scale;
+#else
+  otb::ViewSettings::SpacingType spacing( m_NativeSpacing );
+
+  // Here, zoom to arbitrary scale-factor relative to
+  // viewport spacing.
+  //
+  // If viewport spacing has previously been set to
+  // image-spacing, it zooms to arbitrary scale-factor.
+  //
+  // This is especially useful to set user-arbitrary scale level
+  // such as when editing scale-level in status-bar.
+  spacing[ 0 ] /= scale;
+  spacing[ 1 ] /= scale;
+#endif
+
+  // Change spacing and center.
+  m_ViewSettings->SetSpacing( spacing );
+  m_ViewSettings->Center( center );
+
+  // Emit ROI changed.
+  emit RoiChanged( GetOrigin(), GetViewportSize(), GetSpacing(), center );
+
+  // emit RenderingContextChanged(center,GetSpacing()[0]);
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::ZoomIn()
+{
+  otb::ViewSettings::SizeType size( GetViewportSize() );
+
+  PointType point;
+
+  Scale(
+    QPoint( size[ 0 ] / 2, size[ 1 ] / 2 ),
+    m_ZoomGranularity * MOUSE_WHEEL_STEP_DEGREES,
+    &point
+  );
+
+  emit RoiChanged( GetOrigin(), GetViewportSize(), GetSpacing(), point );
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::ZoomOut()
+{
+  otb::ViewSettings::SizeType size( GetViewportSize() );
+
+  PointType point;
+
+  Scale(
+    QPoint( size[ 0 ] / 2, size[ 1 ] / 2 ),
+    -m_ZoomGranularity * MOUSE_WHEEL_STEP_DEGREES,
+    &point
+  );
+
+  emit RoiChanged( GetOrigin(), GetViewportSize(), GetSpacing(), point );
+}
+
+/******************************************************************************/
+const PointType&
+ImageViewManipulator
+::Transform( PointType& viewport, const QPoint& screen ) const
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  m_ViewSettings->ScreenToViewPortTransform(
+    static_cast< double >( screen.x() ),
+    static_cast< double >( screen.y() ),
+    viewport[ 0 ],
+    viewport[ 1 ]
+  );
+
+  return viewport;
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::ResetViewport()
+{
+  assert( !m_ViewSettings.IsNull() );
+
+  otb::ViewSettings::SizeType size( m_ViewSettings->GetViewportSize() );
+
+  m_ViewSettings->Reset();
+
+  m_ViewSettings->SetViewportSize( size );
+
+  m_NativeSpacing.Fill( 1.0 );
+  m_ZoomFactor = 1.0;
+
+  emit RoiChanged(
+    GetOrigin(),
+    GetViewportSize(),
+    GetSpacing(),
+    m_ViewSettings->GetViewportCenter()
+  );
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::MousePressEvent( QMouseEvent* e )
+{
+
+  // qDebug() << this << "::MousePressEvent(" << e << ")";
+
+  assert( e!=NULL );
+
+  switch( e->button() )
+    {
+    case Qt::NoButton:
+      break;
+
+    case Qt::LeftButton:
+      m_MousePressPosition = e->pos();
+      m_MousePressOrigin = m_ViewSettings->GetOrigin();
+      m_IsMouseDragging = true;
+      break;
+
+    case Qt::RightButton:
+      emit ToggleLayerVisibilityRequested( false );
+      break;
+
+    case Qt::MidButton:
+      break;
+
+    case Qt::XButton1:
+      break;
+
+    case Qt::XButton2:
+      break;
+
+    default:
+      assert( false && "Unhandled Qt::MouseButton." );
+      break;
+    }
+
+  /*
+    Qt::NoModifier	0x00000000	No modifier key is pressed.
+    Qt::ShiftModifier	0x02000000	A Shift key on the keyboard is pressed.
+    Qt::ControlModifier	0x04000000	A Ctrl key on the keyboard is pressed.
+    Qt::AltModifier	0x08000000	An Alt key on the keyboard is pressed.
+    Qt::MetaModifier	0x10000000	A Meta key on the keyboard is pressed.
+    Qt::KeypadModifier	0x20000000	A keypad button is pressed.
+    Qt::GroupSwitchModifier
+  */
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::MouseMoveEvent( QMouseEvent* e )
+{
+  // qDebug() << this << "::MouseMoveEvent(" << e << ")";
+
+  assert( e!=NULL );
+
+  /*
+  qDebug() << "------------------------------------------------";
+
+  qDebug() << this << ":" << e;
+  */
+
+  Qt::MouseButtons buttons = e->buttons();
+  Qt::KeyboardModifiers modifiers = e->modifiers();
+
+  if( buttons==Qt::LeftButton &&
+      ( modifiers==Qt::NoModifier || modifiers== Qt::ControlModifier ) )
+    {
+    // Cursor moves from press position to current position;
+    // Image moves the same direction, so apply the negative translation.
+    Translate( m_MousePressPosition - e->pos() );
+
+    m_MousePressPosition = e->pos();
+
+    emit RefreshViewRequested();
+
+    emit RoiChanged(
+      GetOrigin(),
+      GetViewportSize(),
+      GetSpacing(),
+      m_ViewSettings->GetViewportCenter()
+    );
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::MouseReleaseEvent( QMouseEvent* e)
+{
+  // qDebug() << this << "::MouseReleaseEvent(" << e << ")";
+
+  assert( e!=NULL );
+
+  /*
+  qDebug() << this << ":" << e;
+  */
+
+  /*
+  Qt::MouseButtons buttons = e->buttons();
+  Qt::KeyboardModifiers modifiers = e->modifiers();
+  */
+  // PointType center;
+
+  switch( e->button() )
+    {
+    case Qt::NoButton:
+      break;
+
+    case Qt::LeftButton:
+      m_MousePressPosition = QPoint();
+      m_MousePressOrigin = PointType();
+      m_IsMouseDragging = false;
+
+      emit RefreshViewRequested();
+      break;
+
+    case Qt::RightButton:
+      emit ToggleLayerVisibilityRequested( true );
+      break;
+
+    case Qt::MidButton:
+      break;
+
+    case Qt::XButton1:
+      break;
+
+    case Qt::XButton2:
+      break;
+
+    default:
+      assert( false && "Unhandled Qt::MouseButton." );
+      break;
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::MouseDoubleClickEvent( QMouseEvent * e )
+{
+  // qDebug() << this << "::MouseDoubleClickEvent(" << e << ")";
+
+  assert( e!=NULL );
+
+  if( e->button()==Qt::LeftButton && e->modifiers()==Qt::NoModifier )
+    {
+    PointType center;
+
+    assert( !m_ViewSettings.IsNull() );
+
+    const QPoint & p = e->pos();
+
+    m_ViewSettings->ScreenToViewPortTransform( p.x(), p.y(), center[ 0 ], center[ 1 ] );
+
+    CenterOn( center );
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+#if USE_VIEW_SETTINGS_SIDE_EFFECT 
+::ResizeEvent( QResizeEvent * )
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+::ResizeEvent( QResizeEvent * e )
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+{
+  // assert( e!=NULL );
+
+  // qDebug() << this << "::ResizeEvent(" << e << ")";
+
+  /*
+  qDebug() << m_ViewSettings.GetPointer();
+
+  otb::ViewSettings::SizeType size( m_ViewSettings->GetViewportSize() );
+
+  qDebug() << size[ 0 ] << "," << size[ 1 ] << "\t" << e->size();
+  */
+
+#if USE_VIEW_SETTINGS_SIDE_EFFECT 
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+  assert( e!=NULL );
+
+  SetViewportSize( e->size().width(), e->size().height() );
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::WheelEvent( QWheelEvent * e )
+{
+  assert( e!=NULL );
+
+  Qt::MouseButtons buttons = e->buttons();
+  Qt::KeyboardModifiers modifiers = e->modifiers();
+
+  if( buttons!=Qt::NoButton )
+    return;
+
+  // Delta is rotation distance in number of 8th of degrees (see
+  // http://qt-project.org/doc/qt-4.8/qwheelevent.html#delta).
+  assert( e->delta()!=0 );
+  int degrees = e->delta() / MOUSE_WHEEL_STEP_FACTOR;
+
+  if( modifiers==Qt::ControlModifier )
+    emit RotateLayersRequested(
+      e->delta() / (MOUSE_WHEEL_STEP_FACTOR * MOUSE_WHEEL_STEP_DEGREES)
+    );
+  //
+  else if( modifiers==Qt::MetaModifier )
+    {
+    // qDebug() << "META+Wheel" << e->delta();
+
+    emit ShiftAlphaRequested(
+      static_cast< double >(
+	m_AlphaGranularity * e->delta() /
+	( MOUSE_WHEEL_STEP_FACTOR * MOUSE_WHEEL_STEP_DEGREES )
+      ) / 100.0
+    );
+    }
+  else if( modifiers==(Qt::MetaModifier | Qt::ShiftModifier) )
+    {
+    // qDebug() << "META+SHIFT+Wheel" << e->delta();
+
+    emit UpdateGammaRequested(
+      ImageViewManipulator::Factor(
+    	degrees,
+    	MOUSE_WHEEL_STEP_DEGREES
+      )
+    );
+    }
+  //
+  else if( modifiers==Qt::AltModifier )
+    {
+    // qDebug() << "ALT+Wheel" << e->delta();
+
+    emit ResizeShaderRequested(
+      ImageViewManipulator::Factor(
+	degrees,
+	MOUSE_WHEEL_STEP_DEGREES
+      )
+    );
+    }
+  else if( modifiers==(Qt::AltModifier | Qt::ShiftModifier) )
+    {
+    // qDebug() << "ALT+SHIFT+Wheel" << e->delta();
+
+    emit ReparamShaderRequested(
+      ImageViewManipulator::Factor(
+	degrees,
+	MOUSE_WHEEL_STEP_DEGREES
+      )
+    );
+    }
+  //
+  else if( modifiers==(Qt::ControlModifier | Qt::AltModifier) )
+    {
+    // qDebug() << "CTRL+ALT+Wheel" << e->delta();
+
+    emit ShiftDynamicsRequested(
+      m_DynamicsShiftGranularity *
+      static_cast< double >(
+	e->delta() /
+	( MOUSE_WHEEL_STEP_FACTOR * MOUSE_WHEEL_STEP_DEGREES )
+      )
+    );
+    }
+  else if( modifiers==(Qt::ControlModifier | Qt::AltModifier | Qt::ShiftModifier) )
+    {
+    // qDebug() << "CTRL+ALT+SHIFT+Wheel" << e->delta();
+
+    emit ScaleDynamicsRequested(
+      ImageViewManipulator::Factor(
+	degrees,
+	MOUSE_WHEEL_STEP_DEGREES
+      )
+    );
+    }
+  //
+  else if( modifiers==Qt::NoModifier )
+    {
+    if( m_Timer==NULL )
+      {
+      m_Timer = new QTimer();
+
+      QObject::connect(
+	m_Timer,
+	SIGNAL( timeout() ), 
+	// to:
+	this,
+	SLOT( OnTimeout() )
+      );
+      }
+
+    m_Timer->start( 500 );
+
+    SetFastRenderMode( true );
+
+    PointType point;
+
+    Scale( e->pos(), degrees, &point );
+
+    emit RefreshViewRequested();
+
+    emit RoiChanged( GetOrigin(), GetViewportSize(), GetSpacing(), point );
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::KeyPressEvent( QKeyEvent* e )
+{
+  assert( e!=NULL );
+
+  // qDebug() << this << "::KeyPressEvent(" << e << ")";
+
+  QPoint vector( 0, 0 );
+  int steps = 0;
+
+  int key = e->key();
+  Qt::KeyboardModifiers modifiers = e->modifiers();
+
+  switch( key )
+    {
+    case Qt::Key_Up:
+      vector.setY( -1 );
+      break;
+
+    case Qt::Key_Down:
+      vector.setY( +1 );
+      break;
+
+    case Qt::Key_Left:
+      vector.setX( -1 );
+      break;
+
+    case Qt::Key_Right:
+      vector.setX( +1 );
+      break;
+
+    case Qt::Key_Plus:
+      steps = m_ZoomGranularity;
+      break;
+
+    case Qt::Key_Minus:
+      steps = -m_ZoomGranularity;
+      break;
+
+    case Qt::Key_PageUp:
+      if( e->modifiers()==Qt::ShiftModifier )
+	emit LayerToTopRequested();
+      else
+	emit RaiseLayerRequested();
+      break;
+
+    case Qt::Key_PageDown:
+      if( e->modifiers()==Qt::ShiftModifier )
+	emit LayerToBottomRequested();
+      else
+	emit LowerLayerRequested();
+      break;
+
+    case Qt::Key_Home:
+      if( e->modifiers()==Qt::ShiftModifier )
+	emit SelectFirstLayerRequested();
+      else
+	emit SelectPreviousLayerRequested();
+      break;
+
+    case Qt::Key_End:
+      if( e->modifiers()==Qt::ShiftModifier )
+	emit SelectLastLayerRequested();
+      else
+	emit SelectNextLayerRequested();
+      break;
+
+    case Qt::Key_Delete:
+      if( modifiers.testFlag( Qt::ShiftModifier ) )
+        emit DeleteAllRequested();
+      else
+        emit DeleteSelectedRequested();
+      break;
+
+    case Qt::Key_1:
+      emit ZoomToFullResolutionRequested();
+      break;
+
+    case Qt::Key_2:
+      emit ZoomToLayerExtentRequested();
+      break;
+
+    case Qt::Key_3:
+      emit ZoomToFullExtentRequested();
+      break;
+
+    case Qt::Key_A:
+      emit ApplyAllRequested();
+      break;
+
+    case Qt::Key_C:
+      emit ShaderEffectRequested( EFFECT_CHESSBOARD );
+      break;
+
+    case Qt::Key_G:
+      emit ShaderEffectRequested( EFFECT_GRADIENT );
+      break;
+
+    case Qt::Key_D:
+      emit ShaderEffectRequested( EFFECT_LOCAL_CONTRAST );
+      break;
+
+    case Qt::Key_H:
+      emit ShaderEffectRequested( EFFECT_SWIPE_H );
+      break;
+
+    case Qt::Key_N:
+      emit ShaderEffectRequested( EFFECT_NORMAL );
+      break;
+
+    case Qt::Key_P:
+      if( modifiers.testFlag( Qt::ControlModifier ) )
+	emit TakeScreenshotRequested( modifiers.testFlag( Qt::ShiftModifier )  );
+      else
+	emit SetReferenceRequested();
+      break;
+
+    case Qt::Key_Q:
+      emit ResetQuantilesRequested( modifiers.testFlag( Qt::ShiftModifier ) );
+      break;
+
+    case Qt::Key_S:
+      emit ShaderEffectRequested( EFFECT_SPECTRAL_ANGLE );
+      break;
+
+    case Qt::Key_T:
+      emit ShaderEffectRequested( EFFECT_LOCAL_TRANSLUCENCY );
+      break;
+
+    case Qt::Key_V:
+      emit ShaderEffectRequested( EFFECT_SWIPE_V );
+      break;
+
+    default:
+      break;
+    }
+
+  assert( !m_ViewSettings.IsNull() );
+
+  bool needsRefresh = false;
+
+  //
+  // Translate
+
+  if( !vector.isNull() )
+    {
+    otb::ViewSettings::SizeType size( m_ViewSettings->GetViewportSize() );
+
+    if( modifiers==Qt::NoModifier )
+      {
+      size[ 0 ] /= m_ScrollGranularity;
+      size[ 1 ] /= m_ScrollGranularity;
+      }
+    else if( modifiers==Qt::ControlModifier )
+      {
+      size[ 0 ] /= m_ScrollGranularity * 2;
+      size[ 1 ] /= m_ScrollGranularity * 2;
+      }
+
+    vector.rx() *= size[ 0 ];
+    vector.ry() *= size[ 1 ];
+
+    Translate( vector );
+
+    needsRefresh = true;
+    }
+
+  //
+  // Scale
+
+  if( steps!=0 )
+    {
+    // Qt::ControlModifier doest not work with keypard Qt::Key_Plus/Minus keys.
+
+    otb::ViewSettings::SizeType size( m_ViewSettings->GetViewportSize() );
+
+    Scale(
+      QPoint( size[ 0 ] / 2.0, size[ 1 ] / 2.0 ),
+      steps * MOUSE_WHEEL_STEP_DEGREES
+    );
+
+    needsRefresh = true;
+    }
+
+  //
+  // Refresh
+  if( needsRefresh )
+    {
+    emit RefreshViewRequested();
+
+    emit RoiChanged(
+      GetOrigin(),
+      GetViewportSize(),
+      GetSpacing(),
+      m_ViewSettings->GetViewportCenter()
+    );
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::KeyReleaseEvent( QKeyEvent * )
+{
+  // assert( e!=NULL );
+
+  // qDebug() << this << "::KeyPressEvent(" << e << ")";
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::Translate( const QPoint& vector )
+{
+  // qDebug() << this << "::Translate(" << vector << ")";
+
+  m_ViewSettings->SetOrigin(
+    ImageViewManipulator::Translate(
+      vector,
+      m_ViewSettings->GetOrigin(),
+      m_ViewSettings->GetSpacing()
+    )
+  );
+}
+
+/******************************************************************************/
+PointType
+ImageViewManipulator
+::Translate( const QPoint& vector,
+             const PointType& origin,
+             const SpacingType& spacing )
+{
+  // qDebug() << this << "::Translate(...)";
+
+  otb::ViewSettings::PointType origin2( origin );
+
+  origin2[ 0 ] += static_cast< double >( vector.x() ) * spacing[ 0 ];
+  origin2[ 1 ] += static_cast< double >( vector.y() ) * spacing[ 1 ];
+
+  /*
+    qDebug()
+    << "(" << m_MousePressOrigin[ 0 ] << "," << m_MousePressOrigin[ 1 ] << ")"
+    << "(" << spacing[ 0 ] << "," << spacing[ 1 ] << ")"
+    << "(" << origin[ 0 ] << "," << origin[ 1 ] << ")";
+  */
+
+  return origin2;
+}
+
+/******************************************************************************/
+void
+ImageViewManipulator
+::Scale( const QPoint& center, int degrees, PointType* centerPoint )
+{
+  assert( degrees!=0 );
+
+  if( degrees==0 )
+    return;
+
+  otb::ViewSettings::PointType point;
+
+  Transform( point, center );
+
+  if( centerPoint!=NULL )
+    *centerPoint = point;
+
+  // See http://qt-project.org/doc/qt-4.8/qwheelevent.html#delta .
+  assert( m_ZoomGranularity!=0 );
+
+  int granularity = m_ZoomGranularity;
+
+  if( granularity==0 )
+    granularity = 1;
+
+  double factor = pow(
+    2.0,
+    -static_cast< double >( degrees ) /
+    static_cast< double >( granularity * MOUSE_WHEEL_STEP_DEGREES )
+  );
+
+  m_ZoomFactor *= factor;
+
+  /*
+  qDebug()
+    << "(" << point[ 0 ] << "," << point[ 1 ] << ")"
+    << "g:" << granularity
+    << "d:" << degrees
+    << "s:" << (static_cast< double >( degrees ) / 15.0)
+    << "f:" << factor
+    << "z:" << m_ZoomFactor;
+  */
+
+  m_ViewSettings->Zoom( point, factor );
+}
+
+/*****************************************************************************/
+ZoomType
+ImageViewManipulator
+::GetFixedZoomType() const
+{
+  return ZOOM_TYPE_NONE;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+ImageViewManipulator
+::OnTimeout()
+{
+  assert( m_Timer!=NULL );
+
+  SetFastRenderMode( false );
+
+  emit RefreshViewRequested();
+
+  delete m_Timer;
+  m_Timer = NULL;
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx
new file mode 100644
index 0000000..fa1d936
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImageViewRenderer.cxx
@@ -0,0 +1,1296 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageViewRenderer.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtOpenGL>
+
+//
+// System includes (sorted by alphabetic order)
+// necessary for the opengl variables and methods
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbStandardShader.h"
+#include "otbGlImageActor.h"
+#include "otbGlVersionChecker.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractLayerModel.h"
+#include "mvdAlgorithm.h"
+#include "mvdI18nCoreApplication.h"
+#include "mvdTypes.h"
+#include "mvdVectorImageModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageViewRenderer
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+ImageViewRenderer::RenderingContext
+::RenderingContext() :
+  AbstractImageViewRenderer::RenderingContext(),
+  m_Resolution( RESOLUTION_NEAREST ),
+  m_TileSize( 256 )
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+  ,m_ViewSettings()
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+{
+  assert( I18nCoreApplication::ConstInstance()!=NULL );
+
+  //
+  // Rendering settings.
+  {
+  QVariant value(
+    I18nCoreApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_RESOLUTION
+    )
+  );
+
+  m_Resolution =
+    !value.isValid()
+    ? RESOLUTION_DEFAULT
+    : static_cast< Resolution >( value.toInt() );
+  }
+
+  {
+  QVariant value(
+    I18nCoreApplication::Instance()->RetrieveSettingsKey(
+      I18nCoreApplication::SETTINGS_KEY_TILE_SIZE
+    )
+  );
+
+  m_TileSize =
+    !value.isValid()
+    ? TILE_SIZE_VALUE[ TILE_SIZE_DEFAULT ]
+    : value.toInt();
+  }
+}
+
+/*****************************************************************************/
+ImageViewRenderer::RenderingContext
+::~RenderingContext()
+{
+}
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+ImageViewRenderer
+::ImageViewRenderer( QObject* p ) :
+  AbstractImageViewRenderer( p ),
+  m_GlView( otb::GlView::New() ),
+  m_EffectsEnabled( true )
+#ifdef _WIN32
+#else // _WIN32
+  ,  m_ReferencePair( NULL, otb::GlActor::Pointer() )
+#endif // _WIN32
+  // m_ModelActorPairs(),
+{
+#ifdef _WIN32
+  m_ReferencePair.first = NULL;
+  // m_ReferencePair.second is initialized by otb::GlActor::Pointer default constructor.
+#else // _WIN32
+#endif // _WIN32
+}
+
+/*****************************************************************************/
+ImageViewRenderer
+::~ImageViewRenderer()
+{
+}
+
+/*****************************************************************************/
+bool
+ImageViewRenderer
+::CheckGLCapabilities( int * glsl140 )
+{
+#if USE_REMOTE_DESKTOP_DISABLED_RENDERING
+  return true;
+
+#else // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+
+  //
+  // Trace required OpenGL and GLSL versions.
+  qWarning() <<
+    ToStdString(
+      tr( "Required OpenGL version '%1' with GLSL version '%2'." )
+      .arg( otb::GlVersionChecker::REQUIRED_GL_VERSION )
+      .arg( otb::GlVersionChecker::REQUIRED_GLSL_VERSION )
+    ).c_str();
+
+  //
+  // Get and check OpenGL and GLSL versions.
+
+  const char * glVersion = NULL;
+  const char * glslVersion = NULL;
+
+  bool isOk = false;
+
+  try
+    {
+    isOk = otb::GlVersionChecker::CheckGLCapabilities( glVersion, glslVersion );
+
+    if( glsl140!=NULL )
+      *glsl140 = otb::GlVersionChecker::VerCmp( glslVersion, "1.40" );
+
+    //
+    // Trace runtime OpenGL and GLSL versions.
+    qWarning() <<
+    ToStdString(
+      tr( "Runtime OpenGL version '%1' with GLSL version '%2'." )
+      .arg( glVersion )
+      .arg( glslVersion )
+    ).c_str();
+    }
+  catch( std::exception& exc )
+    {
+    QMessageBox::critical(
+      qobject_cast< QWidget* >( parent() ),
+      tr( "Critical error!"),
+      ToQString( exc.what() )
+    );
+    }
+
+  //
+  // Set GLSL effects state.
+  SetGLSLEnabled( isOk );
+
+  //
+  // Return if check has succeeded.
+  if( isOk )
+    return true;
+
+  //
+  // Construct message.
+  QString message(
+    tr( "Current OpenGL version is '%1' supporting OpenGL Shading-Language (GLSL) version '%2'.\nTo run at best performances, this application needs, at least, OpenGL version '%3' with GLSL version '%4'.\nThe application will automatically switch to a rendering mode which does not make use of OpenGL shaders and GLSL.\nIf you are running this application under some remote-desktop service, runtime OpenGL and GLSL versions may differ from those running directly on remote platform." )
+    .arg( glVersion )
+    .arg( glslVersion )
+    .arg( otb::GlVersionChecker::REQUIRED_GL_VERSION )
+    .arg( otb::GlVersionChecker::REQUIRED_GLSL_VERSION )
+  );
+
+  //
+  // Warn user is check has failed.
+  qWarning() << ToStdString( message ).c_str();
+
+#if 0
+  QMessageBox::critical(
+    qobject_cast< QWidget* >( parent() ),
+    tr( "Critical error!" ),
+    message
+  );
+#endif
+
+  //
+  // KO.
+  return false;
+
+#endif // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+}
+
+/*****************************************************************************/
+AbstractImageViewRenderer::RenderingContext*
+ImageViewRenderer
+::NewRenderingContext() const
+{
+  RenderingContext* context = new ImageViewRenderer::RenderingContext();
+
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+#else
+  assert( !m_GlView.IsNull() );
+
+  //
+  // Share otb::GlViewRendering settings with manipulator using
+  // RenderingContext. Manipulator can then setup otb::ViewSettings
+  // directly by side-effect.
+  context->m_ViewSettings = m_GlView->GetSettings();
+#endif
+
+  return context;
+}
+
+/*****************************************************************************/
+const AbstractLayerModel *
+ImageViewRenderer
+::GetReferenceModel() const
+{
+  return m_ReferencePair.first;
+}
+
+/*****************************************************************************/
+AbstractLayerModel*
+ImageViewRenderer
+::GetReferenceModel()
+{
+  return m_ReferencePair.first;
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::GetLayerExtent( const StackedLayerModel::KeyType & key,
+                  PointType & origin,
+                  PointType & extent  ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  otb::GlActor::Pointer actor( m_GlView->GetActor( key ) );
+
+  if( actor.IsNull() )
+    {
+    origin[ 0 ] = origin[ 1 ] = 0;
+
+    extent[ 0 ] = extent[ 1 ] = 0;
+
+    return;
+    }
+
+  actor->GetExtent( origin[ 0 ], origin[ 1 ], extent[ 0 ], extent[ 1 ] );
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::GetReferenceExtent( PointType& origin, PointType& extent  ) const
+{
+  assert( GetLayerStack()!=NULL );
+
+  GetLayerExtent(
+    GetLayerStack()->GetKey( GetLayerStack()->GetReferenceIndex() ),
+    origin,
+    extent
+  );
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::GetViewExtent( PointType & origin, PointType & extent ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  m_GlView->GetExtent( origin, extent );
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::InitializeGL()
+{
+  assert( !m_GlView.IsNull() );
+
+  //
+  // WARNING: This call to otb::GlView::Initialize() allocates a new
+  // otb::ViewSettings() instance. So, the shared pointer between
+  // renderer and manipulator may be unshated depending on order of
+  // calls.
+  //
+  m_GlView->Initialize( 0, 0 );
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::ResizeGL( int width, int height )
+{
+  // qDebug() << this << "::ResizeGL(" << width << "," << height << ")";
+
+  assert( !m_GlView.IsNull() );
+
+  // qDebug() << m_GlView.GetPointer();
+
+  m_GlView->Resize( width, height );
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::PaintGL( const AbstractImageViewRenderer::RenderingContext* c )
+{
+  assert( !m_GlView.IsNull() );
+
+  // qDebug() << this << "::PaintGL(" << c << ")";
+
+  // qDebug() << m_GlView.GetPointer();
+
+#if USE_REMOTE_DESKTOP_DISABLED_RENDERING && 0
+
+#else // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+  //
+  // Apply VectorImageSettings to otb::GlImageActor.
+  UpdateActors( c );
+
+  //
+  // Bypass rendering if needed.
+  if( IsBypassRenderingEnabled() )
+    {
+    // qDebug() << "}\n";
+
+    return;
+    }
+
+  // qDebug() << m_GlView.GetPointer() << "::BeforeRendering()";
+  // qDebug() << "{";
+
+  //
+  // Pre-render scene.
+  m_GlView->BeforeRendering();
+  {
+  //
+  // Render scene.
+  switch( c->m_RenderMode )
+    {
+    case RenderingContext::RENDER_MODE_LIGHT:
+      // qDebug() << "otb::GlView::LightRender()";
+      m_GlView->LightRender();
+      break;
+
+    case RenderingContext::RENDER_MODE_FULL:
+      // qDebug() << "otb::GlView::HeavyRender()";
+      m_GlView->HeavyRender();
+      break;
+
+    default:
+      assert( false && "Unhandled RenderingContext::RenderModel value!" );
+      break;
+    }
+  }
+  //
+  // Post-render scene.
+  m_GlView->AfterRendering();
+
+  // qDebug() << "}";
+  // qDebug() << m_GlView.GetPointer() << "::AfterRendering()";
+
+#endif // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::Pick( const PointType & ptView,
+	PixelInfo::Vector & pixels ) const
+{
+  // qDebug()
+  //   << this << "::Pick("
+  //   << ptView[ 0 ] << "," << ptView[ 1 ]
+  //   << ")";
+
+  assert( !m_GlView.IsNull() );
+
+  //
+  // Get actor keys.
+  otb::GlView::StringVectorType keys( m_GlView->GetRenderingOrder() );
+
+  // Prepare picked pixels container.
+  pixels.resize( keys.size() );
+
+  // Pick each layer.
+  size_t i = 0;
+
+  for( otb::GlView::StringVectorType::const_iterator it( keys.begin() );
+       it != keys.end();
+       ++ it, ++ i )
+    {
+    // Register layer key.
+    pixels[ i ].m_Key = *it;
+
+    // Get actor.
+    otb::GlActor::Pointer actor( m_GlView->GetActor( *it ) );
+    assert( !actor.IsNull() );
+
+    // Get geo-interface.
+    const otb::GeoInterface * geoInterface =
+      dynamic_cast< const otb::GeoInterface * >( actor.GetPointer() );
+
+    // If geo-interface...
+    if( geoInterface!=NULL )
+      {
+      // ...compute physical point.
+      pixels[ i ].m_HasPoint =
+	geoInterface->TransformFromViewport( pixels[ i ].m_Point, ptView, true );
+      }
+    else
+      {
+      pixels[ i ].m_HasPoint = false;
+      pixels[ i ].m_Point = PointType();
+      }
+
+    // If image-actor...
+    otb::GlImageActor::Pointer imageActor( otb::DynamicCast< otb::GlImageActor >( actor ) );
+
+    if( !imageActor.IsNull() )
+      {
+      // ...get pixel and it's index...
+      pixels[ i ].m_HasIndex =
+      pixels[ i ].m_HasPixel =
+	imageActor->GetPixel(
+	  pixels[ i ].m_Point,
+	  pixels[ i ].m_Pixel,
+	  pixels[ i ].m_Index
+	);
+
+      // ...and get resolutions.
+      pixels[ i ].m_HasResolution = true;
+      pixels[ i ].m_Resolution = imageActor->GetCurrentResolution();
+      }
+    }
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::GetResolutions( PixelInfo::Vector & pixels ) const
+{
+  // qDebug() << this << "::GetResolutions()";
+
+  assert( !m_GlView.IsNull() );
+
+  //
+  // Get actor keys.
+  otb::GlView::StringVectorType keys( m_GlView->GetRenderingOrder() );
+
+  if( keys.empty() )
+    return;
+
+  // Resize pixels container, if needed.
+  if( keys.size()!=pixels.size() )
+    pixels.resize( keys.size() );
+
+  // Pick each layer.
+  size_t i = 0;
+
+  for( otb::GlView::StringVectorType::const_iterator it( keys.begin() );
+       it != keys.end();
+       ++ it, ++ i )
+    {
+    // Check layer key.
+    pixels[ i ].m_Key = *it;
+
+    // Get actor.
+    otb::GlActor::Pointer actor( m_GlView->GetActor( *it ) );
+    assert( !actor.IsNull() );
+
+    // If image-actor...
+    otb::GlImageActor::Pointer imageActor( otb::DynamicCast< otb::GlImageActor >( actor ) );
+
+    if( !imageActor.IsNull() )
+      {
+      pixels[ i ].m_HasResolution = true;
+      pixels[ i ].m_Resolution = imageActor->GetCurrentResolution();
+      }
+    else
+      {
+      pixels[ i ].m_HasResolution = false;
+      }
+    }
+}
+
+/*****************************************************************************/
+bool
+ImageViewRenderer
+::TransformToView( PointType & point,
+		   const StackedLayerModel::KeyType & key,
+		   const IndexType & index,
+		   bool isPhysical ) const
+{
+  assert( !m_GlView.IsNull() );
+  assert( !key.empty() );
+
+  otb::GlActor::Pointer actor( m_GlView->GetActor( key ) );
+  assert( !actor.IsNull() );
+
+  const otb::GeoInterface * geo =
+    dynamic_cast< const otb::GeoInterface * >( actor.GetPointer() );
+
+  if( geo==NULL )
+    return false;
+
+  point[ 0 ] = static_cast< double >( index[ 0 ] );
+  point[ 1 ] = static_cast< double >( index[ 1 ] );
+
+  return geo->TransformToViewport( point, point, isPhysical );
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::UpdateActors( const AbstractImageViewRenderer::RenderingContext * context )
+{
+  // qDebug() << this << "::virtual_UpdateActors()";
+
+  assert( !m_GlView.IsNull() );
+  assert( context!=NULL );
+
+  StackedLayerModel * stackedLayerModel = GetLayerStack();
+
+  if( stackedLayerModel==NULL )
+    return;
+
+  for( StackedLayerModel::ConstIterator it( stackedLayerModel->Begin() );
+       it!=stackedLayerModel->End();
+       ++it )
+    {
+    assert( !it->first.empty() );
+    assert( it->second!=NULL );
+
+    if( m_GlView->ContainsActor( it->first ) )
+      {
+      if( it->second->inherits( VectorImageModel::staticMetaObject.className() ) )
+        {
+        //
+        // Get vector image-model.
+        VectorImageModel * vectorImageModel =
+          dynamic_cast< VectorImageModel * >( it->second );
+
+        assert( vectorImageModel!=NULL );
+
+        //
+        // Get vector image-model data.
+        const VectorImageSettings & settings =
+          vectorImageModel->GetSettings();
+
+        const ImageProperties * properties =
+          vectorImageModel->GetProperties();
+
+        //
+        // Get GL image-actor.
+        assert(
+          m_GlView->GetActor( it->first )==
+          otb::DynamicCast< otb::GlImageActor >(
+            m_GlView->GetActor( it->first )
+          )
+        );
+
+        otb::GlImageActor::Pointer imageActor(
+          otb::DynamicCast< otb::GlImageActor >(
+            m_GlView->GetActor( it->first )
+          )
+        );
+        assert( !imageActor.IsNull() );
+
+	//
+	// Apply rendering parameters.
+	{
+	const RenderingContext * ctxt = static_cast< const RenderingContext * >( context );
+
+	// Resolution
+	switch( ctxt->m_Resolution )
+	  {
+	  case RESOLUTION_NEAREST:
+	    imageActor->SetResolutionAlgorithm(
+	      otb::GlImageActor::ResolutionAlgorithm::Nearest
+	    );
+	    break;
+
+	  case RESOLUTION_LOWER:
+	    imageActor->SetResolutionAlgorithm(
+	      otb::GlImageActor::ResolutionAlgorithm::Nearest_Lower
+	    );
+	    break;
+
+	  case RESOLUTION_UPPER:
+	    imageActor->SetResolutionAlgorithm(
+	      otb::GlImageActor::ResolutionAlgorithm::Nearest_Upper
+	    );
+	    break;
+
+	  default:
+	    assert( false && "Unexpected Resolution enum value." );
+	    break;
+	  }
+
+	// Tile-size
+	imageActor->SetTileSize( ctxt->m_TileSize );
+	}
+
+	//
+	// Apply visibility.
+        imageActor->SetVisible( vectorImageModel->IsVisible() );
+
+        //
+        // Apply color-setup.
+        VectorImageSettings::ChannelVector channels;
+
+        settings.GetSmartChannels( channels );
+
+        imageActor->SetRedIdx( channels[ RGBW_CHANNEL_RED ] + 1 );
+        imageActor->SetGreenIdx( channels[ RGBW_CHANNEL_GREEN ] + 1 );
+        imageActor->SetBlueIdx( channels[ RGBW_CHANNEL_BLUE ] + 1 );
+
+        //
+        // Apply color-dynamics.
+	otb::ImageSettings::Pointer imageSettings( imageActor->GetImageSettings() );
+	assert( !imageSettings.IsNull() );
+
+        if( settings.IsGrayscaleActivated() )
+          {
+          imageSettings->SetMinRed( settings.GetLowIntensity( RGBW_CHANNEL_WHITE ) );
+          imageSettings->SetMaxRed( settings.GetHighIntensity(RGBW_CHANNEL_WHITE  ) );
+
+          imageSettings->SetMinGreen( settings.GetLowIntensity( RGBW_CHANNEL_WHITE ) );
+          imageSettings->SetMaxGreen( settings.GetHighIntensity(RGBW_CHANNEL_WHITE ) );
+
+          imageSettings->SetMinBlue( settings.GetLowIntensity( RGBW_CHANNEL_WHITE ) );
+          imageSettings->SetMaxBlue( settings.GetHighIntensity(RGBW_CHANNEL_WHITE ) );
+          }
+        else
+          {
+          imageSettings->SetMinRed( settings.GetLowIntensity( RGBW_CHANNEL_RED ) );
+          imageSettings->SetMaxRed( settings.GetHighIntensity(RGBW_CHANNEL_RED  ) );
+
+          imageSettings->SetMinGreen( settings.GetLowIntensity( RGBW_CHANNEL_GREEN ) );
+          imageSettings->SetMaxGreen( settings.GetHighIntensity(RGBW_CHANNEL_GREEN ) );
+
+          imageSettings->SetMinBlue( settings.GetLowIntensity( RGBW_CHANNEL_BLUE ) );
+          imageSettings->SetMaxBlue( settings.GetHighIntensity(RGBW_CHANNEL_BLUE ) );
+          }
+
+	// qDebug() << this << " gamma: " << settings.GetGamma();
+
+        imageSettings->SetGamma( settings.GetGamma() );
+
+        if( properties==NULL )
+          imageSettings->SetUseNoData( false );
+
+        else
+          {
+          imageSettings->SetUseNoData( properties->IsNoDataEnabled() );
+          imageSettings->SetNoData( properties->GetNoData() );
+          }
+
+	//
+	// qDebug()
+	//   << "alpha:" << settings.GetAlpha()
+	//   << "'" << it->first.c_str() << "'";
+	imageSettings->SetAlpha( settings.GetAlpha() );
+
+	//
+	// Apply shader properties.
+        //
+        // Must use local variable to cast from T* to T::Pointer because
+        // of ITK set/get macros...
+        otb::FragmentShader::Pointer fragmentShader( imageActor->GetShader() );
+
+	if( !fragmentShader.IsNull() )
+	  {
+	  // If this point is reached, shader is not null which means
+	  // that isGLSLEnabled() is true.
+	  assert( IsGLSLEnabled() );
+
+	  otb::StandardShader::Pointer shader(
+	    otb::DynamicCast< otb::StandardShader >( fragmentShader )
+	  );
+
+	  assert( !shader.IsNull() );
+
+	  if( m_EffectsEnabled )
+	    switch( settings.GetEffect() )
+	      {
+	      case EFFECT_CHESSBOARD:
+		shader->SetShaderType( otb::SHADER_ALPHA_GRID );
+		shader->SetChessboardSize( settings.GetSize() );
+		break;
+
+	      case EFFECT_GRADIENT:
+		shader->SetShaderType( otb::SHADER_GRADIENT );
+		shader->SetRadius( settings.GetSize() );
+		break;
+
+	      case EFFECT_LOCAL_CONTRAST:
+		shader->SetShaderType( otb::SHADER_LOCAL_CONTRAST );
+		shader->SetRadius( settings.GetSize() );
+		shader->SetLocalContrastRange(
+#if 0
+		  settings.GetValue() *
+		  std::max(
+		    std::max(
+		      shader->GetMaxRed() - shader->GetMinRed(),
+		      shader->GetMaxGreen() - shader->GetMinGreen()
+		    ),
+		    shader->GetMaxBlue() - shader->GetMinBlue()
+		  )
+#else
+		  settings.GetValue()
+#endif
+		);
+		break;
+
+	      case EFFECT_LOCAL_TRANSLUCENCY:
+		shader->SetShaderType( otb::SHADER_LOCAL_ALPHA );
+		shader->SetRadius( settings.GetSize() );
+		break;
+
+	      case EFFECT_NONE:
+	      case EFFECT_NORMAL:
+		shader->SetShaderType( otb::SHADER_STANDARD );
+		break;
+
+	      case EFFECT_SPECTRAL_ANGLE:
+		shader->SetShaderType( otb::SHADER_SPECTRAL_ANGLE );
+		shader->SetRadius( settings.GetSize() );
+		shader->SetSpectralAngleRange( settings.GetValue() );
+		break;
+
+	      case EFFECT_SWIPE_H:
+		shader->SetShaderType( otb::SHADER_ALPHA_SLIDER );
+		shader->SetVerticalSlider( false );
+		break;
+
+	      case EFFECT_SWIPE_V:
+		shader->SetShaderType( otb::SHADER_ALPHA_SLIDER );
+		shader->SetVerticalSlider( true );
+		break;
+
+	      default:
+		assert( false && "Unhandled mvd::Effect value!" );
+		break;
+	      }
+	  }
+	}
+      //
+      else
+        {
+        qDebug()
+          << __FILE__ << ":" << __LINE__
+          << ": Unhandled AbstractLayerModel derived class.";
+        }
+      }
+    }
+
+  m_GlView->SetRenderingOrder( stackedLayerModel->GetKeys(), false );
+}
+
+/*******************************************************************************/
+void
+ImageViewRenderer
+::virtual_UpdateScene()
+{
+  // qDebug() << this << "::virtual_UpdateScene()";
+
+  assert( !m_GlView.IsNull() );
+
+#if DISABLE_QUICKLOOK_VIEW
+  if( objectName()=="QuicklookViewRenderer" )
+    return;
+#endif
+
+  StackedLayerModel * stackedLayerModel = GetLayerStack();
+
+
+  if( stackedLayerModel==NULL || stackedLayerModel->IsEmpty() )
+    {
+    m_GlView->ClearActors();
+
+    //
+    // 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()
+	  //   << QString( "Removing image-actor '%1'..." ).arg( it->c_str() );
+
+          m_GlView->RemoveActor( *it );
+          }
+      }
+
+
+#if USE_REMOTE_DESKTOP_DISABLED_RENDERING
+#else // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+
+    for( StackedLayerModel::ConstIterator it( stackedLayerModel->Begin() );
+         it!=stackedLayerModel->End();
+         ++it )
+      if( !m_GlView->ContainsActor( it->first ) )
+        {
+        assert( it->second!=NULL );
+
+        if( it->second->inherits( VectorImageModel::staticMetaObject.className()))
+          {
+          otb::GlImageActor::Pointer glImageActor( otb::GlImageActor::New() );
+
+          // Should all AbstractLayerModel have a ::GetFilename()
+          // method?
+          // -> Not sure: AbstractImageModel coud be derived as a
+          // in-memory image-model.
+          VectorImageModel * vectorImageModel =
+            dynamic_cast< VectorImageModel * >( it->second );
+
+	  // Coverity-19839
+	  // {
+	  assert( vectorImageModel!=NULL );
+	  // }
+
+	  // qDebug()
+	  //   << QString( "Adding image-actor from file '%1'..." )
+	  //   .arg( vectorImageModel->GetFilename() );
+
+	  // qDebug()
+	  //   << this << "\n"
+	  //   << "\tQString:" << vectorImageModel->GetFilename()
+	  //   << "\tstd::string" << QFile::encodeName( vectorImageModel->GetFilename() );
+
+	  if( IsGLSLEnabled() )
+	    {
+	    // qDebug() << "Created shader for" << FromStdString( it->first );
+
+	    glImageActor->CreateShader();
+	    }
+
+          glImageActor->Initialize(
+            QFile::encodeName(
+              vectorImageModel->GetFilename()
+            )
+	    .constData()
+          );
+
+          m_GlView->AddActor( glImageActor, it->first );
+
+          // glImageActor->SetVisible( vectorImageModel->IsVisible() );
+
+          // qDebug() <<
+	  //   QString( "Added image-actor '%1' from file '%2'" )
+	  //   .arg( FromStdString( it->first ) )
+	  //   .arg( vectorImageModel->GetFilename() );
+          }
+        else
+          {
+          assert( false && "Unhandled AbstractLayerModel derived type." );
+          }
+        }
+
+#endif // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+    }
+
+  RefreshScene();
+}
+
+/*******************************************************************************/
+void
+ImageViewRenderer
+::virtual_RefreshScene()
+{
+  // qDebug() << this << "::virtual_RefreshScene()";
+
+  //
+  // Get layer-stack.
+  StackedLayerModel * stackedLayerModel = GetLayerStack();
+
+  //
+  // Check if empty.
+  if( stackedLayerModel==NULL ||
+      stackedLayerModel->IsEmpty() )
+    {
+    m_ReferencePair.first = NULL;
+    m_ReferencePair.second = otb::GlActor::Pointer();
+
+    // virtual_ClearProjection();
+
+    // assert( !m_GlView.IsNull() );
+    // assert( m_GlView->GetSettings() );
+
+    // m_GlView->GetSettings()->SetUseProjection( false );
+
+    // emit ClearProjectionRequired();
+
+    return;
+    }
+
+  //
+  // Check if non-projected mode.
+  if( !stackedLayerModel->HasReference() )
+    {
+    m_ReferencePair.first = NULL;
+    m_ReferencePair.second = otb::GlActor::Pointer();
+
+    virtual_ClearProjection();
+
+    assert( !m_GlView.IsNull() );
+    assert( m_GlView->GetSettings() );
+
+    m_GlView->GetSettings()->SetUseProjection( false );
+
+    emit ClearProjectionRequired();
+
+    return;
+    }
+
+  //
+  // Otherwise, it's projected mode.
+  assert( !m_GlView.IsNull() );
+  assert( m_GlView->GetSettings()!=NULL );
+
+  m_GlView->GetSettings()->SetUseProjection( true );
+
+
+  //
+  // Store reference-pair.
+  ModelActorPair referencePair( m_ReferencePair );
+
+  //
+  // Remember first layer-model as projection reference.
+  m_ReferencePair.first = stackedLayerModel->GetReference();
+
+  StackedLayerModel::KeyType referenceKey(
+    stackedLayerModel->GetKey(
+      stackedLayerModel->GetReferenceIndex()
+    )
+  );
+
+#if USE_REMOTE_DESKTOP_DISABLED_RENDERING
+  m_ReferencePair.second = otb::GlActor::Pointer();
+
+#else // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+
+  //
+  // Remember reference actor.
+  {
+  otb::GlActor::Pointer glActor( m_GlView->GetActor( referenceKey ) );
+  // assert( !glActor.IsNull() );
+
+  assert( glActor==otb::DynamicCast< otb::GlImageActor >( glActor ) );
+  m_ReferencePair.second = otb::DynamicCast< otb::GlImageActor >( glActor );
+  // assert( !m_ReferencePair.second.IsNull() );
+  }
+
+  if( m_ReferencePair.first!=NULL )
+    {
+    if( referencePair.first==NULL )
+      {
+      virtual_SetProjection();
+
+      emit SetProjectionRequired();
+      }
+    else if( m_ReferencePair.first!=referencePair.first )
+      {
+      virtual_UpdateProjection();
+
+      emit UpdateProjectionRequired();
+      }
+    }
+
+#endif // USE_REMOTE_DESKTOP_DISABLED_RENDERING
+}
+
+/*****************************************************************************/
+bool
+ImageViewRenderer
+::Reproject( PointType & center,
+             SpacingType & spacing,
+             const PointType & vcenter,
+             const SpacingType & vspacing ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  const StackedLayerModel * stackedLayerModel = GetLayerStack();
+
+  if( stackedLayerModel==NULL )
+    return false;
+
+  return
+    m_GlView->ReprojectFromView(
+      center,
+      spacing,
+      stackedLayerModel->GetKey( stackedLayerModel->GetReferenceIndex() ),
+      vcenter,
+      vspacing
+    );
+}
+
+/*****************************************************************************/
+bool
+ImageViewRenderer
+::GetLayerDynamics( const StackedLayerModel::KeyType & key,
+		    ParametersType & params,
+		    bool isGlobal ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  // Get actor.
+  otb::GlImageActor::Pointer imageActor(
+    otb::DynamicCast< otb::GlImageActor >(
+      m_GlView->GetActor( key )
+    )
+  );
+
+  if( imageActor.IsNull() )
+    return false;
+
+  // Get dynamics.
+  imageActor->AutoColorAdjustment(
+    params[ 0 ], params[ 1 ],
+    params[ 2 ], params[ 3 ],
+    params[ 4 ], params[ 5 ],
+    isGlobal,
+    VectorImageModel::DEFAULT_LOD_SIZE,
+    0.02,
+    0.02
+  );
+
+  return true;
+}
+
+/*****************************************************************************/
+void
+ImageViewRenderer
+::SaveScreenshot( const QString & filename ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  m_GlView->SaveScreenshot( QFile::encodeName( filename ).constData() );
+}
+
+/*****************************************************************************/
+bool
+ImageViewRenderer
+::IsEffectsEnabled() const
+{
+    return m_EffectsEnabled;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+ImageViewRenderer
+::UpdatePixelInfo( const QPoint & screen,
+		   const PointType & /* view */,
+		   const PixelInfo::Vector & pixels )
+{
+  // qDebug()
+  //   << this << "::UpdatePixelInfo("
+  //   << screen << ", [" << view[ 0 ] << ";" << view[ 1 ]
+  //   << "] )";
+
+  assert( !m_GlView.IsNull() );
+
+  if( !m_EffectsEnabled )
+    return;
+
+  for( PixelInfo::Vector::const_iterator it( pixels.begin() );
+       it != pixels.end();
+       ++ it )
+    {
+    assert( !it->m_Key.empty() );
+
+    //
+    // Check GL-view.
+    assert( m_GlView->ContainsActor( it->m_Key ) );
+
+    //
+    // Get GL image-actor.
+    otb::GlImageActor::Pointer glImageActor(
+      otb::DynamicCast< otb::GlImageActor >(
+	m_GlView->GetActor( it->m_Key )
+      )
+    );
+
+    if( !glImageActor.IsNull() )
+      {
+      //
+      // Get image-settings.
+      otb::ImageSettings::Pointer imageSettings( glImageActor->GetImageSettings() );
+      assert( !imageSettings.IsNull() );
+
+      //
+      // Update pixel-info of shader.
+      if( it->m_HasPixel )
+	{
+	assert( it->m_Pixel.Size()>0 );
+
+	// qDebug()
+	//   << "R:" << it->m_Pixel[ 0 ]
+	//   << "G:" << it->m_Pixel[ 1 ]
+	//   << "B:" << it->m_Pixel[ 2 ];
+
+	imageSettings->SetCurrentRed( it->m_Pixel[ 0 ] );
+	imageSettings->SetCurrentGreen( it->m_Pixel[ 1 ] );
+	imageSettings->SetCurrentBlue( it->m_Pixel[ 2 ] );
+	}
+
+      //
+      // Get shader.
+      otb::FragmentShader::Pointer fshader( glImageActor->GetShader() );
+
+      if( !fshader.IsNull() )
+	{
+	otb::StandardShader::Pointer shader(
+	  otb::DynamicCast< otb::StandardShader >(
+	    fshader
+	  )
+	);
+
+	assert( !shader.IsNull() );
+
+	//
+	// Update cursor position of shader.
+	PointType p_screen;
+
+	assert( m_GlView->GetSettings()!=NULL );
+
+	p_screen[ 0 ] = screen.x();
+	p_screen[ 1 ] =
+	  m_GlView->GetSettings()->GetViewportSize()[ 1 ] - screen.y();
+
+	// qDebug()
+	//   << "otb::StandardShader::SetCenter("
+	//   << p_screen[ 0 ] << "," << p_screen[ 1 ]
+	//   << ")";
+
+	shader->SetCenter( p_screen );
+
+	if( shader->GetShaderType()==otb::SHADER_ALPHA_SLIDER )
+	  shader->SetSliderPosition(
+	    p_screen[
+	      shader->GetVerticalSlider()
+	      ? 1
+	      : 0
+	    ]
+	  );
+	}
+      }
+    }
+}
+
+/******************************************************************************/
+bool
+ImageViewRenderer
+::virtual_ZoomToRegion( const PointType & origin,
+			const PointType & extent,
+			PointType & center,
+			SpacingType & spacing ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  // Use spacing of viewport as native spacing of reference layer
+  // because it has already been set for projection.
+  //
+  // Same as of Ice-viewer.
+
+  return
+    m_GlView->ZoomToRegion(
+      origin,
+      extent,
+      m_GlView->GetSettings()->GetSpacing(),
+      center,
+      spacing
+    );
+}
+
+/******************************************************************************/
+bool
+ImageViewRenderer
+::virtual_ZoomToExtent( PointType & center, SpacingType & spacing ) const
+{
+  // qDebug() << this << "::virtual_ZoomToExtent()";
+
+  assert( !m_GlView.IsNull() );
+
+  // Use spacing of viewport as native spacing of reference layer
+  // because it has already been set for projection.
+  //
+  // Same as of Ice-viewer.
+
+  return
+    m_GlView->ZoomToExtent(
+      m_GlView->GetSettings()->GetSpacing(),
+      center,
+      spacing
+    );
+}
+
+/******************************************************************************/
+bool
+ImageViewRenderer
+::virtual_ZoomToLayer( const StackedLayerModel::KeyType & key,
+		       PointType & center,
+		       SpacingType & spacing ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  // Use spacing of viewport as native spacing of reference layer
+  // because it has already been set for projection.
+  //
+  // Same as of Ice-viewer.
+
+  return
+    m_GlView->ZoomToLayer(
+      key,
+      m_GlView->GetSettings()->GetSpacing(),
+      center,
+      spacing
+    );
+}
+
+/******************************************************************************/
+bool
+ImageViewRenderer
+::virtual_ZoomToFull( const StackedLayerModel::KeyType & key,
+		      PointType & center,
+		      SpacingType & spacing ) const
+{
+  assert( !m_GlView.IsNull() );
+
+  return m_GlView->ZoomToFull( key, center, spacing );
+}
+
+/******************************************************************************/
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx
new file mode 100644
index 0000000..6acda52
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImageViewWidget.cxx
@@ -0,0 +1,2428 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImageViewWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <exception>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdStackedLayerModel.h"
+#include "mvdVectorImageModel.h"
+#include "mvdAbstractImageViewManipulator.h"
+// See ::OnUpdateProjectionRequired()
+#include "mvdImageViewRenderer.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::ImageViewWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*******************************************************************************/
+ImageViewWidget
+::ImageViewWidget( AbstractImageViewManipulator* manipulator,
+                   AbstractImageViewRenderer* renderer,
+                   QWidget* p,
+                   const QGLWidget* shareWidget,
+                   Qt::WindowFlags flags ) :
+  QGLWidget( p, shareWidget, flags ),
+  m_IsPickingEnabled( true ),
+  m_PickingDefaultStatus( true ),
+  m_Manipulator( NULL ),
+  m_Renderer( NULL )
+#if USE_XP_REGION_OPTIM
+  ,m_Position()
+#endif // USE_XP_REGION_OPTION
+{
+  Initialize( manipulator, renderer );
+}
+
+/*******************************************************************************/
+ImageViewWidget
+::ImageViewWidget( AbstractImageViewManipulator * manipulator,
+                   AbstractImageViewRenderer * renderer,
+                   QGLContext* glcontext,
+                   QWidget* p,
+                   const QGLWidget* shareWidget,
+                   Qt::WindowFlags flags ) :
+  QGLWidget( glcontext, p, shareWidget, flags ),
+  m_Manipulator( NULL ),
+  m_Renderer( NULL )
+#if USE_XP_REGION_OPTION
+  ,m_Position()
+#endif // USE_XP_REGION_OPTION
+{
+  Initialize( manipulator, renderer );
+}
+
+/*******************************************************************************/
+ImageViewWidget
+::ImageViewWidget( AbstractImageViewManipulator * manipulator,
+                   AbstractImageViewRenderer * renderer,
+                   const QGLFormat& glformat,
+                   QWidget* p,
+                   const QGLWidget* shareWidget,
+                   Qt::WindowFlags flags ) :
+  QGLWidget( glformat, p, shareWidget, flags ),
+  m_Manipulator( NULL ),
+  m_Renderer( NULL )
+#if USE_XP_REGION_OPTION
+  ,m_Position()
+#endif // USE_XP_REGION_OPTION
+{
+  Initialize( manipulator, renderer );
+}
+
+/*******************************************************************************/
+ImageViewWidget
+::~ImageViewWidget()
+{
+  // m_Manipulator (deleted as a child of a QObjet parent).
+  // m_Renderer (deleted as a child of a QObjet parent).
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::CenterOn( const PointType & center,
+            double scale )
+{
+  Center( center, scale, scale );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::SetLayerStack( StackedLayerModel * stackedLayerModel )
+{
+  assert( m_Renderer!=NULL );
+
+  {
+  StackedLayerModel * model = m_Renderer->GetLayerStack();
+
+  if( model!=NULL )
+    {
+    for( StackedLayerModel::ConstIterator it( model->Begin() );
+         it!=model->End();
+         ++it )
+    Disconnect( it->second );
+
+    //
+    // Disconnect stacked-layer model from this image-view.
+    QObject::disconnect(
+      model,
+      SIGNAL( LayerAdded( size_t ) ),
+      // from:
+      this,
+      SLOT( OnLayerAdded( size_t ) )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( LayerAboutToBeDeleted( size_t ) ),
+      // from:
+      this,
+      SLOT( LayerAboutToBeDeleted( size_t ) )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( ReferenceChanged( size_t ) ),
+      // from:
+      this,
+      SLOT( OnReferenceChanged( size_t ) )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( ContentChanged() ),
+      // from:
+      this,
+      SLOT( OnContentChanged() )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( ContentReset() ),
+      // from:
+      this,
+      SLOT( OnContentReset() )
+    );
+
+    QObject::disconnect(
+      model,
+      SIGNAL( OrderChanged() ),
+      // from:
+      this,
+      SLOT( updateGL() )
+    );
+
+    //
+    // Disconnect layer-stack model from this widget manipulator.
+    QObject::disconnect(
+      GetManipulator(),
+      SIGNAL( RotateLayersRequested( int ) ),
+      // from:
+      model,
+      SLOT( RotateLayers( int ) )
+    );
+
+    QObject::disconnect(
+      m_Manipulator,
+      SIGNAL( LayerToTopRequested() ),
+      // from:
+      model,
+      SLOT( MoveCurrentToTop() )
+    );
+
+    QObject::disconnect(
+      m_Manipulator,
+      SIGNAL( LayerToBottomRequested() ),
+      // from:
+      model,
+      SLOT( MoveCurrentToBottom() )
+    );
+    }
+  }
+
+  // Set projection parameters of manipulator from layer data.
+  OnSetProjectionRequired();
+
+  // Insert image-models into image-view renderer.
+  m_Renderer->SetLayerStack( stackedLayerModel );
+
+  // Coverity-19846.
+  if( stackedLayerModel==NULL )
+    return;
+
+  //
+  // Connect layer-stack model to this widget manipulator.
+  QObject::connect(
+    GetManipulator(),
+    SIGNAL( RotateLayersRequested( int ) ),
+    // to:
+    stackedLayerModel,
+    SLOT( RotateLayers( int ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( LayerToTopRequested() ),
+    // to:
+    stackedLayerModel,
+    SLOT( MoveCurrentToTop() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( LayerToBottomRequested() ),
+    // to:
+    stackedLayerModel,
+    SLOT( MoveCurrentToBottom() )
+  );
+
+  //
+  // Connect stacked layer-model to image-view manipulator.
+
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( LayerAdded( size_t ) ),
+    // to:
+    this,
+    SLOT( OnLayerAdded( size_t ) )
+  );
+
+  //
+  // Connect stacked layer-model to this image-view
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( LayerAboutToBeDeleted( size_t ) ),
+    // to:
+    this,
+    SLOT( OnLayerAboutToBeDeleted( size_t ) )
+  );
+
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( OrderChanged() ),
+    // to:
+    this,
+    SLOT( updateGL() )
+  );
+
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( ContentChanged() ),
+    // to:
+    this,
+    SLOT( OnContentChanged() )
+  );
+
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( ContentReset() ),
+    // to:
+    this,
+    SLOT( OnContentReset() )
+  );
+
+  QObject::connect(
+    stackedLayerModel,
+    SIGNAL( ReferenceChanged( size_t ) ),
+    // to
+    this,
+    SLOT( OnReferenceChanged( size_t ) )
+  );
+
+  for( StackedLayerModel::ConstIterator it( stackedLayerModel->Begin() );
+       it!=stackedLayerModel->End();
+       ++it )
+    Connect( it->second );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::Initialize( AbstractImageViewManipulator* manipulator,
+	      AbstractImageViewRenderer* renderer )
+{
+  // Test OpenGL.
+  ListGlVersions();
+
+  // Accept drops
+  setAcceptDrops( true );
+  // Set focus policy so that the widget gets the focus if it is clicked
+  setMouseTracking( true );
+  setFocusPolicy( Qt::WheelFocus );
+
+
+  assert( manipulator!=NULL );
+
+  m_Manipulator = manipulator;
+  m_Manipulator->setParent( this );
+  m_Manipulator->SetViewportSize( width(), height() );
+
+
+  assert( renderer!=NULL );
+
+  m_Renderer = renderer;
+  m_Renderer->setParent( this );
+
+
+#if USE_XP_REGION_OPTION
+  m_Position[ 0 ] = m_Position[ 1 ] = 0;
+#endif // USE_XP_REGION_OPTION
+
+
+  //
+  // Manipulator -> this
+  //
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( RefreshViewRequested() ),
+    // to:
+    this,
+    SLOT( OnRefreshViewRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( CenterRoiRequested( const PointType& ) ),
+    // to:
+    this,
+    SIGNAL( CenterRoiRequested( const PointType& ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( RoiChanged(
+	      const PointType &, const SizeType &, const SpacingType &, const PointType & )
+    ),
+    // to:
+    this,
+    SIGNAL( RoiChanged(
+	      const PointType&, const SizeType&, const SpacingType&, const PointType& )
+    )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( RoiChanged(
+        const PointType &, const SizeType &, const SpacingType &, const PointType & )
+    ),
+    // to:
+    this,
+    SLOT( OnRoiChanged(
+	    const PointType &, const SizeType &, const SpacingType &, const PointType & )
+    )
+  );
+
+  QObject::connect(
+    m_Manipulator, SIGNAL( ZoomToExtentRequested() ),
+    // to:
+    this, SLOT( ZoomToExtent() )
+  );
+
+  QObject::connect(
+    m_Manipulator, SIGNAL( ZoomToFullResolutionRequested() ),
+    // to:
+    this, SLOT( ZoomToFullResolution() )
+  );
+
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( LowerLayerRequested() ),
+    // to:
+    this,
+    SLOT( OnLowerLayerRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( RaiseLayerRequested() ),
+    // to:
+    this,
+    SLOT( OnRaiseLayerRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( SelectPreviousLayerRequested() ),
+    // to:
+    this,
+    SLOT( OnSelectPreviousLayerRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( SelectNextLayerRequested() ),
+    // to:
+    this,
+    SLOT( OnSelectNextLayerRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( SelectFirstLayerRequested() ),
+    // to:
+    this,
+    SLOT( OnSelectFirstLayerRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( SelectLastLayerRequested() ),
+    // to:
+    this,
+    SLOT( OnSelectLastLayerRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( DeleteAllRequested() ),
+    // to:
+    this,
+    SLOT( OnDeleteAllRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( DeleteSelectedRequested() ),
+    // to:
+    this,
+    SLOT( OnDeleteSelectedRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ToggleLayerVisibilityRequested( bool ) ),
+    // to:
+    this,
+    SLOT( OnToggleLayerVisibilityRequested( bool ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ZoomToFullResolutionRequested() ),
+    // to:
+    this,
+    SLOT( ZoomToFullResolution() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ZoomToLayerExtentRequested() ),
+    // to:
+    this,
+    SLOT( ZoomToLayerExtent() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ZoomToExtentRequested() ),
+    // to:
+    this,
+    SLOT( ZoomToExtent() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ResizeShaderRequested( double ) ),
+    // to:
+    this,
+    SLOT( OnResizeShaderRequested( double ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ReparamShaderRequested( double ) ),
+    // to:
+    this,
+    SLOT( OnReparamShaderRequested( double ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ShiftAlphaRequested( double ) ),
+    // to:
+    this,
+    SLOT( OnShiftAlphaRequested( double ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( UpdateGammaRequested( double ) ),
+    // to:
+    this,
+    SLOT( OnUpdateGammaRequested( double ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ShiftDynamicsRequested( double ) ),
+    // to:
+    this,
+    SLOT( OnShiftDynamicsRequested( double ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ScaleDynamicsRequested( double ) ),
+    // to:
+    this,
+    SLOT( OnScaleDynamicsRequested( double ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ResetQuantilesRequested( bool ) ),
+    // to:
+    this,
+    SLOT( OnResetQuantilesRequested( bool ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ShaderEffectRequested( Effect ) ),
+    // to:
+    this,
+    SLOT( OnShaderEffectRequested( Effect ) )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( ApplyAllRequested() ),
+    // to:
+    this,
+    SLOT( OnApplyAllRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( SetReferenceRequested() ),
+    // to:
+    this,
+    SLOT( OnSetReferenceRequested() )
+  );
+
+  QObject::connect(
+    m_Manipulator,
+    SIGNAL( TakeScreenshotRequested( bool ) ),
+    // to:
+    this,
+    SLOT( SaveScreenshot( bool ) )
+  );
+
+
+  //
+  // Renderer -> this
+  //
+
+  QObject::connect(
+    m_Renderer,
+    SIGNAL( ClearProjectionRequired() ),
+    // to:
+    this,
+    SLOT( OnClearProjectionRequired() )
+  );
+
+  QObject::connect(
+    m_Renderer,
+    SIGNAL( SetProjectionRequired() ),
+    // to:
+    this,
+    SLOT( OnSetProjectionRequired() )
+  );
+
+  QObject::connect(
+    m_Renderer,
+    SIGNAL( UpdateProjectionRequired() ),
+    // to:
+    this,
+    SLOT( OnUpdateProjectionRequired() )
+  );
+
+  QObject::connect(
+    m_Renderer,
+    SIGNAL( ResetViewport() ),
+    // to:
+    this,
+    SLOT( OnResetViewport() )
+  );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::initializeGL()
+{
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::resizeGL( int w, int h )
+{
+  QGLWidget::resizeGL( w, h );
+
+  assert( m_Renderer!=NULL );
+
+  m_Renderer->ResizeGL( w, h );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::paintGL()
+{
+  QGLWidget::paintGL();
+
+  // qDebug() << this << "::paintGL()";
+
+  //
+  // Get new rendering-context.
+  assert( m_Renderer!=NULL );
+
+  AbstractImageViewRenderer::RenderingContext* c =
+    m_Renderer->NewRenderingContext();
+
+  assert( c!=NULL );
+
+  //
+  // Setup new rendering-context.
+  assert( m_Manipulator!=NULL );
+
+  m_Manipulator->SetupRenderingContext( c );
+
+  //
+  // OpenGL paint using new rendering-context.
+  m_Renderer->PaintGL( c );
+
+  //
+  // Post-rendering tasks.
+  if( !m_Renderer->IsBypassRenderingEnabled() &&
+      m_IsPickingEnabled )
+    {
+    StackedLayerModel * layerStack = GetLayerStack();
+
+    // assert( layerStack!=NULL );
+    if( layerStack!=NULL )
+      {
+      layerStack->BeginEditResolutions();
+
+      m_Renderer->GetResolutions( layerStack->PixelInfos() );
+
+      layerStack->EndEditResolutions();
+      }
+    }
+
+  //
+  // Release rendering-context.
+  delete c;
+  c = NULL;
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::mousePressEvent( QMouseEvent* e )
+{
+  assert( e!=NULL );
+
+  QGLWidget::mousePressEvent( e );
+
+  m_Manipulator->MousePressEvent( e );
+
+  // Deactivate pixel picking during drag
+  m_IsPickingEnabled = false;
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::mouseMoveEvent( QMouseEvent* e )
+{
+  assert( e!=NULL );
+
+  // qDebug() << this << "::mouseMove(" << event << ")";
+
+  // Superclass default behaviour.
+  QGLWidget::mouseMoveEvent( e );
+
+  //
+  // Get layer-stack.
+  StackedLayerModel * stackedLayerModel = GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  //
+  // Update view depending on shader status special behaviour.
+  //
+  bool isAnyEffectActive = false;
+
+  if( m_Renderer->IsEffectsEnabled() )
+    {
+    for( StackedLayerModel::ConstIterator it( stackedLayerModel->Begin() );
+	 it!=stackedLayerModel->End();
+	 ++ it )
+      {
+      assert( it->second!=NULL );
+
+      if( it->second->inherits( AbstractImageModel::staticMetaObject.className() ) )
+	{
+	VectorImageModel * imageModel = qobject_cast< VectorImageModel * >( it->second );
+	assert( imageModel!=NULL );
+
+	if( imageModel->GetSettings().GetEffect()!=EFFECT_NONE &&
+	    imageModel->GetSettings().GetEffect()!=EFFECT_NORMAL )
+	  {
+#if USE_XP_REGION_OPTIM
+	  PointType origin;
+	  PointType extent;
+
+	  m_Renderer->GetLayerExtent( it->first, origin, extent );
+
+	  if( ( origin[ 0 ]<=ptView[ 0 ] && ptView[ 0 ]<=extent[ 0 ] &&
+		origin[ 1 ]<=ptView[ 1 ] && ptView[ 1 ]<=extent[ 1 ] ) ||
+	      ( origin[ 0 ]<=m_Position[ 0 ] && m_Position[ 0 ]<=extent[ 0 ] &&
+		origin[ 1 ]<=m_Position[ 1 ] && m_Position[ 1 ]<=extent[ 1 ] ) )
+	    {
+	    qDebug() << FromStdString( it->first );
+
+	    // qDebug()
+	    //   << "x:" << origin[ 0 ] << ptView[ 0 ] << m_Position[ 0 ] << extent[ 0 ];
+
+	    // qDebug()
+	    //   << "y:" << origin[ 1 ] << ptView[ 1 ] << m_Position[ 1 ] << extent[ 1 ];
+
+	    // qDebug()
+	    //   << "x:" << ptView[ 0 ] << m_Position[ 0 ];
+
+	    // qDebug()
+	    //   << "y:" << ptView[ 1 ] << m_Position[ 1 ];
+
+#endif // USE_XP_REGION_OPTIM
+
+	    // qDebug() << "updateGL(" << in[ 0 ] << "," << in[ 1 ] << ")";
+
+	    isAnyEffectActive = true;
+
+	    break;
+	    }
+#if USE_XP_REGION_OPTIM
+	  }
+#endif // USE_XP_REGION_OPTIM
+	}
+      }
+
+#if USE_XP_REGION_OPTIM
+    m_Position = ptView;
+#endif // USE_XP_REGION_OPTION
+    }
+
+  // Delegate behaviour.
+  if( isAnyEffectActive )
+    {
+    bool bypass = m_Renderer->SetBypassRenderingEnabled( true );
+
+    m_Manipulator->MouseMoveEvent( e );
+
+    m_Renderer->SetBypassRenderingEnabled( bypass );
+    }
+
+  else
+    m_Manipulator->MouseMoveEvent( e );
+
+
+  //
+  // Pixel-picking special behaviour.
+  //
+  if( m_IsPickingEnabled )
+    {
+    // Transform coordinates from widget space to viewport space.
+    assert( m_Manipulator!=NULL );
+
+    PointType ptView;
+
+    m_Manipulator->Transform( ptView, e->pos() );
+
+    //
+    // Pick pixel of point in viewport space and return point in image
+    // space.
+    assert( m_Renderer!=NULL );
+
+    stackedLayerModel->BeginEditPixelInfo();
+
+    PixelInfo::Vector & pixels = stackedLayerModel->PixelInfos();
+
+    m_Renderer->Pick( ptView, pixels );
+
+    m_Renderer->UpdatePixelInfo( e->pos(), ptView, pixels );
+
+    stackedLayerModel->EndEditPixelInfo( e->pos(), ptView );
+
+    //
+    // Emit reference-layer pixel data.
+    emit PixelInfoChanged( e->pos(), ptView, stackedLayerModel->PixelInfos() );
+
+    if( stackedLayerModel->HasCurrent() )
+      emit PhysicalCursorPositionChanged(
+	e->pos(),
+	ptView,
+	pixels[ stackedLayerModel->GetCurrentIndex() ].m_Point,
+	pixels[ stackedLayerModel->GetCurrentIndex() ].m_Pixel );
+    else
+      emit PhysicalCursorPositionChanged(
+	e->pos(),
+	ptView,
+	PointType(),
+	DefaultImageType::PixelType()
+      );
+    }
+  else if( isAnyEffectActive )
+    {
+    // Transform coordinates from widget space to viewport space.
+    assert( m_Manipulator!=NULL );
+
+    PointType ptView;
+
+    m_Manipulator->Transform( ptView, e->pos() );
+
+    //
+    // Pick pixel of point in viewport space and return point in image
+    // space.
+    assert( m_Renderer!=NULL );
+
+    const PixelInfo::Vector & pixels = stackedLayerModel->PixelInfos();
+
+    m_Renderer->UpdatePixelInfo( e->pos(), ptView, pixels );
+    }
+
+  if( isAnyEffectActive )
+    updateGL();
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::mouseReleaseEvent( QMouseEvent* e )
+{
+  assert( e!=NULL );
+
+  QGLWidget::mouseReleaseEvent( e );
+
+  m_Manipulator->MouseReleaseEvent(e);
+
+  // Reactivate picking after drag
+  m_IsPickingEnabled = m_PickingDefaultStatus;
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::mouseDoubleClickEvent( QMouseEvent* e )
+{
+  assert( e!=NULL );
+
+  QGLWidget::mouseDoubleClickEvent( e );
+
+  m_Manipulator->MouseDoubleClickEvent( e );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::wheelEvent( QWheelEvent* e )
+{
+  assert( e!=NULL );
+
+  QGLWidget::wheelEvent( e );
+
+  m_Manipulator->WheelEvent(e);
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::resizeEvent( QResizeEvent* e )
+{
+  assert( e!=NULL );
+
+  // qDebug() << this << "::resizeEvent(" << e << ")";
+
+  // First, call superclass implementation
+  QGLWidget::resizeEvent( e );
+
+  m_Manipulator->ResizeEvent( e );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::keyPressEvent( QKeyEvent* e )
+{
+  assert( e!=NULL );
+
+  QGLWidget::keyPressEvent( e );
+
+  m_Manipulator->KeyPressEvent( e );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::keyReleaseEvent( QKeyEvent* e )
+{
+  assert( e!=NULL );
+
+  QGLWidget::keyReleaseEvent( e );
+
+  m_Manipulator->KeyReleaseEvent( e );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::ListGlVersions() const
+{
+#if QT_VERSION < QT_VERSION_CHECK( 4, 7, 0 )
+  qWarning() <<
+    tr( "Unable to list supported OpenGL versions using QGLFormat. "
+	"Qt version is %1. Please upgrade to Qt 4.7.0 or newer." )
+    .arg( qVersion() )
+    .toLatin1()
+    .constData();
+
+#else
+  qWarning() <<
+    tr( "Runtime version of OpenGL used by Qt %1: %2.%3." )
+    .arg( qVersion() )
+    .arg( format().majorVersion() )
+    .arg( format().minorVersion() )
+    .toLatin1()
+    .constData();
+
+  QGLFormat::OpenGLVersionFlags glVersionFlags(
+    QGLFormat::openGLVersionFlags()
+  );
+
+  qWarning() <<
+    tr( "Version(s) of OpenGL supported by Qt %1:" )
+    .arg( qVersion() )
+    .toLatin1()
+    .constData();
+
+  if( glVersionFlags & QGLFormat::OpenGL_Version_4_0 )
+    qWarning() << "QGLFormat::OpenGL_Version_4_0";
+
+  if( glVersionFlags & QGLFormat::OpenGL_Version_3_3 )
+    qWarning() << "- QGLFormat::OpenGL_Version_3_3";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_3_2 )
+    qWarning() << "- QGLFormat::OpenGL_Version_3_2";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_3_1 )
+    qWarning() << "- QGLFormat::OpenGL_Version_3_1";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_3_0 )
+    qWarning() << "- QGLFormat::OpenGL_Version_3_0";
+
+  if( glVersionFlags & QGLFormat::OpenGL_Version_2_1 )
+    qWarning() << "- QGLFormat::OpenGL_Version_2_1";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_2_0 )
+    qWarning() << "- QGLFormat::OpenGL_Version_2_0";
+
+  if( glVersionFlags & QGLFormat::OpenGL_Version_1_5 )
+    qWarning() << "- QGLFormat::OpenGL_Version_1_5";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_1_4 )
+    qWarning() << "- QGLFormat::OpenGL_Version_1_4";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_1_3 )
+    qWarning() << "- QGLFormat::OpenGL_Version_1_3";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_1_2 )
+    qWarning() << "- QGLFormat::OpenGL_Version_1_2";
+  if( glVersionFlags & QGLFormat::OpenGL_Version_1_1 )
+    qWarning() << "- QGLFormat::OpenGL_Version_1_1";
+
+  if( glVersionFlags & QGLFormat::OpenGL_Version_None )
+    qWarning() << "- QGLFormat::OpenGL_Version_None";
+#endif
+}
+
+/*****************************************************************************/
+void
+ImageViewWidget
+::Center( const PointType& center, double sx, double sy )
+{
+  /*
+  qDebug()
+    << this << "::Center("
+    << center[ 0 ] << "," << center[ 1 ] << "," << sx << "," << sy
+    << ")";
+  */
+
+  assert( m_Renderer!=NULL );
+  assert( m_Manipulator!=NULL );
+
+  //
+  // Get reference image-model.
+  AbstractImageModel* imageModel =
+    m_Renderer->GetReferenceModel< AbstractImageModel >();
+  assert( imageModel!=NULL );
+
+  // Scale spacing.
+  SpacingType spacing( imageModel->GetSpacing() );
+
+  spacing[ 0 ] /= sx;
+  spacing[ 1 ] /= sy;
+
+  m_Manipulator->SetSpacing( spacing );
+
+  // Center view.
+  m_Manipulator->CenterOn( center );
+}
+
+/*****************************************************************************/
+void
+ImageViewWidget
+::Center( ZoomType zoom )
+{
+  // if( zoom==ZOOM_TYPE_EXTENT )
+  //   qDebug() << this << "::Center( ZOOM_TYPE_EXTENT );";
+
+  assert(
+    zoom==ZOOM_TYPE_EXTENT || zoom==ZOOM_TYPE_FULL || zoom==ZOOM_TYPE_LAYER
+  );
+
+  assert( m_Renderer!=NULL );
+  assert( m_Manipulator!=NULL );
+
+  PointType center;
+  SpacingType spacing;
+
+  center[ 0 ] = center[ 1 ] = 0.0;
+  spacing[ 0 ] = spacing[ 1 ] = 1.0;
+
+  bool result = false;
+
+  switch( zoom )
+    {
+    case ZOOM_TYPE_EXTENT:
+      result = m_Renderer->ZoomToExtent( center, spacing );
+      break;
+
+    case ZOOM_TYPE_FULL:
+      assert( GetLayerStack()!=NULL );
+      result = m_Renderer->ZoomToFull( GetLayerStack()->GetCurrentKey(), center, spacing );
+      break;
+
+    case ZOOM_TYPE_LAYER:
+      assert( GetLayerStack()!=NULL );
+      result = m_Renderer->ZoomToLayer( GetLayerStack()->GetCurrentKey(), center, spacing );
+      break;
+
+    default:
+      assert( false && "Unhandled ImageViewWidget::ZoomType value!" );
+      break;
+    }
+
+  //
+  // Center on middle point.
+  if( result )
+    {
+    m_Manipulator->SetSpacing( spacing );
+    m_Manipulator->CenterOn( center );
+    }
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::Connect( AbstractLayerModel * layer )
+{
+  assert( layer!=NULL );
+
+  QObject::connect(
+    layer,
+    SIGNAL( VisibilityChanged() ),
+    // to:
+    this,
+    SLOT( updateGL() )
+  );
+
+  QObject::connect(
+    this,
+    SIGNAL( ModelUpdated() ),
+    // to:
+    layer,
+    SLOT( OnModelUpdated() )
+  );
+}
+
+/*******************************************************************************/
+void
+ImageViewWidget
+::Disconnect( AbstractLayerModel * layer )
+{
+  assert( layer!=NULL );
+
+  QObject::disconnect(
+    layer,
+    SIGNAL( VisibilityChanged() ),
+    // from:
+    this,
+    SLOT( updateGL() )
+  );
+
+  QObject::disconnect(
+    this,
+    SIGNAL( ModelUpdated() ),
+    // from:
+    layer,
+    SLOT( OnModelUpdated() )
+  );
+}
+
+/*****************************************************************************/
+bool
+ImageViewWidget
+::IsBypassRenderingEnabled() const
+{
+  assert( m_Renderer!=NULL );
+
+  return m_Renderer->IsBypassRenderingEnabled();
+}
+
+/*****************************************************************************/
+bool
+ImageViewWidget
+::SetBypassRenderingEnabled( bool enabled )
+{
+  assert( m_Renderer!=NULL );
+
+  return m_Renderer->SetBypassRenderingEnabled( enabled );
+}
+
+/*****************************************************************************/
+bool
+ImageViewWidget
+::IsPickingEnabled() const
+{
+  return m_IsPickingEnabled;
+}
+
+/*****************************************************************************/
+void
+ImageViewWidget
+::SetPickingEnabled( bool enabled )
+{
+  m_IsPickingEnabled = enabled;
+}
+
+/*****************************************************************************/
+void
+ImageViewWidget
+::SetPickingDefaultStatus( bool defaultStatus )
+{
+  m_PickingDefaultStatus = defaultStatus;
+}
+
+/*******************************************************************************/
+bool
+ImageViewWidget
+::ApplyFixedZoomType()
+{
+  assert( m_Manipulator!=NULL );
+
+  ZoomType zoom = m_Manipulator->GetFixedZoomType();
+
+  if( zoom==ZOOM_TYPE_NONE || zoom>=ZOOM_TYPE_COUNT )
+    return false;
+
+  Center( zoom );
+
+  return true;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/******************************************************************************/
+void
+ImageViewWidget
+::CenterOnSelected( const IndexType & index )
+{
+  /*
+  assert( m_Renderer!=NULL );
+
+  AbstractImageModel* imageModel = m_Render->GetReferenceImageModel();
+
+  if( imageModel==NULL )
+    return;
+
+  ImageBaseType::Pointer image( imageModel->ToImageBase() );
+  assert( !image.IsNull() );
+
+  PointType point;
+
+  image->TransformIndexToPhysicalPoint( index, point );
+
+  m_Renderer->GetReferenceActor();
+
+  assert( m_Manipulator!=NULL );
+
+  m_Manipulator->CenterOn( point );
+  */
+
+  assert( m_Renderer!=NULL );
+
+  const StackedLayerModel * layerStack = m_Renderer->GetLayerStack();
+  assert( layerStack!=NULL );
+
+  if( !layerStack->HasCurrent() )
+    return;
+
+  PointType point;
+
+  if( !m_Renderer->TransformToView( point, layerStack->GetCurrentKey(), index, false ) )
+    return;
+
+  assert( m_Manipulator!=NULL );
+
+  m_Manipulator->CenterOn( point );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnApplyAllRequested()
+{
+  // qDebug() << this << "::OnApplyAllRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * layerStack = m_Renderer->GetLayerStack();
+  assert( layerStack!=NULL );
+
+  AbstractLayerModel * layer = layerStack->GetCurrent();
+  if( layer==NULL )
+    return;
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    assert( imageModel!=NULL );
+
+    const VectorImageSettings & settings = imageModel->GetSettings();
+    const ImageProperties * properties = imageModel->GetProperties();
+
+    for( StackedLayerModel::ConstIterator it( layerStack->Begin() );
+	 it!=layerStack->End();
+	 ++it )
+      if( it->second!=layer )
+	{
+	if( it->second->inherits( VectorImageModel::staticMetaObject.className() ) )
+	  {
+	  VectorImageModel * vim =
+	    qobject_cast< VectorImageModel * >( it->second );
+
+	  //
+	  // Properties.
+	  {
+	    bool needsRefresh = *vim->GetProperties() != *properties;
+
+	    vim->SetProperties( *properties );
+
+	    if( needsRefresh )
+	      {
+	      // qDebug() << "Refreshing histogram...";
+
+	      vim->RefreshHistogram();
+	      }
+	  }
+	  //
+	  // Settings
+	  {
+	    // Find RGB-channels max component.
+	    VectorImageSettings::ChannelVector::value_type rgbChannel = 0;
+	    {
+	      const VectorImageSettings::ChannelVector & rgb(
+		settings.GetRgbChannels()
+	      );
+
+	      for( VectorImageSettings::ChannelVector::const_iterator vis(
+		     rgb.begin()
+		   );
+		   vis!=rgb.end();
+		   ++vis )
+		if( *vis > rgbChannel )
+		  rgbChannel = *vis;
+	    }
+
+	    CountType nbComponents = vim->GetNbComponents();
+
+	    // qDebug()
+	    //   << vim->GetFilename()
+	    //   << nbComponents
+	    //   << rgbChannel
+	    //   << settings.GetGrayChannel()
+	    //   << ( settings.GetGrayChannel()<nbComponents &&
+	    // 	   rgbChannel<nbComponents
+	    // 	   ? "true"
+	    // 	   : "false" );
+
+	    if( rgbChannel<nbComponents &&
+		settings.GetGrayChannel()<nbComponents )
+	      vim->SetSettings( settings );
+	  }
+	  }
+	}
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnClearProjectionRequired()
+{
+  // qDebug() << this << "::OnClearProjectionRequested()";
+
+  assert( m_Manipulator!=NULL );
+  
+  m_Manipulator->SetWkt( std::string() );
+  m_Manipulator->SetKeywordList( otb::ViewSettings::KeywordListType() );
+
+  // m_Manipulator->SetOrigin( imageModel->GetOrigin() );
+  // m_Manipulator->SetSpacing( imageModel->GetSpacing() );
+  // m_Manipulator->SetNativeSpacing( imageModel->GetNativeSpacing() );
+
+  assert( m_Renderer!=NULL );
+
+  if( m_Renderer->IsBypassRenderingEnabled() )
+    return;
+
+  ZoomToExtent();
+
+  // Done in ::ZoomToExtent().
+  // updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnContentChanged()
+{
+  // qDebug() << this << "::OnContentChanged()";
+
+  UpdateScene();
+
+  if( !ApplyFixedZoomType() )
+    updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnContentReset()
+{
+  // qDebug() << this << "::OnContentReset()";
+
+  UpdateScene();
+
+  if( !ApplyFixedZoomType() )
+    updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnDeleteAllRequested()
+{
+  // qDebug() << this << "::OnDeleteAllRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->Clear();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnDeleteSelectedRequested()
+{
+  // qDebug() << this << "::OnDeleteSelectedRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->DeleteCurrent();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnLayerAboutToBeDeleted( size_t index )
+{
+  assert( GetLayerStack()!=NULL );
+
+  Disconnect( GetLayerStack()->At( index ) );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnLayerAdded( size_t index )
+{
+  assert( GetLayerStack()!=NULL );
+
+  Connect( GetLayerStack()->At( index ) );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnLowerLayerRequested()
+{
+  // qDebug() << this << "::OnLowerLayerRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->LowerCurrent();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnRaiseLayerRequested()
+{
+  // qDebug() << this << "::OnRaiseLayerRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->RaiseCurrent();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnReferenceChanged( size_t )
+{
+  // qDebug() << this << "::OnReferenceChanged(" << index << ")";
+
+  assert( m_Renderer!=NULL );
+
+  m_Renderer->RefreshScene();
+
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnRefreshViewRequested()
+{
+  // qDebug() << this << "::OnRefreshViewRequested()";
+
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnResetQuantilesRequested( bool isGlobal )
+{
+  // qDebug() << this << "::OnResetQuantilesRequested(" << isGlobal << ")";
+
+  //
+  // Get layer-stack.
+  StackedLayerModel * layerStack = m_Renderer->GetLayerStack();
+  assert( layerStack!=NULL );
+
+  if( !layerStack->HasCurrent() )
+    return;
+
+  // qDebug() << "current:" << FromStdString( layerStack->GetCurrentKey() );
+
+  //
+  // Get dynamics of current layer.
+  assert( m_Renderer!=NULL );
+
+  ParametersType params( 6 );
+
+  if( !m_Renderer->GetLayerDynamics( layerStack->GetCurrentKey(), params, isGlobal ) )
+    return;
+
+  // qDebug() << "R: [" << params[ 0 ] << "," << params[ 1 ] << "]";
+  // qDebug() << "G: [" << params[ 2 ] << "," << params[ 3 ] << "]";
+  // qDebug() << "B: [" << params[ 4 ] << "," << params[ 5 ] << "]";
+
+  //
+  // Apply dynamics to current layer.
+  AbstractLayerModel * layer = layerStack->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    VectorImageSettings & settings = imageModel->GetSettings();
+
+    if( settings.IsGrayscaleActivated() )
+      settings.SetGrayDynamicsParams( params );
+
+    else
+      settings.SetRgbDynamicsParams( params );
+
+    /*
+    HistogramModel * histogram = imageModel->GetHistogramModel();
+    assert( histogram!=NULL );
+
+    // Get min/max pixels.
+    DefaultImageType::PixelType minPx( histogram->GetMinPixel() );
+    DefaultImageType::PixelType maxPx( histogram->GetMaxPixel() );
+
+    // Iterator bounds.
+    CountType begin = -1;
+    CountType end = -1;
+
+    // Shift intensity for each channel.
+    if( RgbwBounds( begin,
+		    end,
+		    settings.IsGrayscaleActivated() ? RGBW_CHANNEL_WHITE : RGBW_CHANNEL_RGB ) )
+      for( CountType i=begin; i<end; ++i )
+	{
+	// Channel.
+	RgbwChannel c = static_cast< RgbwChannel >( i );
+
+	// Band.
+	VectorImageSettings::ChannelVector::value_type b = settings.GetSmartChannel( c );
+
+	// Compute step.
+	DefaultImageType::PixelType::ValueType step =
+	  static_cast< DefaultImageType::PixelType::ValueType >(
+	    delta * ( maxPx[ b ] - minPx[ b ] )
+	);
+
+	// Apply step shift.
+	settings.SetLowIntensity( c, settings.GetLowIntensity( c ) + step );
+	settings.SetHighIntensity( c, settings.GetHighIntensity( c ) + step );
+	}
+    */
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnResizeShaderRequested( double factor )
+{
+  // qDebug() << this << "::OnResizeShaderRequested(" << factor << ")";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    assert( imageModel!=NULL );
+
+    imageModel->GetSettings().SetSize(
+      static_cast< double >( imageModel->GetSettings().GetSize() ) * factor
+    );
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnReparamShaderRequested( double factor )
+{
+  // qDebug() << this << "::OnReparamShaderRequested(" << factor << ")";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    assert( imageModel!=NULL );
+
+    imageModel->GetSettings().SetValue(
+      static_cast< double >( imageModel->GetSettings().GetValue() ) * factor
+    );
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnRoiChanged( const PointType &,
+                const SizeType &,
+                const SpacingType & spacing,
+                const PointType & center )
+{
+  assert( m_Renderer!=NULL );
+
+  // qDebug()
+  //   << this << "::OnRoiChanged("
+  //   << "[" << point[ 0 ] << "," << point[ 1 ] << "]"
+  //   << "[" << center[ 0 ] << "," << center[ 1 ] << "]";
+
+  emit CenterChanged( center );
+
+  AbstractImageModel* imageModel =
+    m_Renderer->GetReferenceModel< AbstractImageModel >();
+
+  SpacingType nativeSpacing;
+
+  // MANTIS-970: Fixed crash when no dataset is selected.
+  // {
+  if( imageModel==NULL )
+    {
+    nativeSpacing[ 0 ] = 1.0;
+    nativeSpacing[ 1 ] = 1.0;
+    }
+  else
+    nativeSpacing = imageModel->GetNativeSpacing();
+  // }
+
+  double rsx = nativeSpacing[ 0 ] / spacing[ 0 ];
+  double rsy = nativeSpacing[ 1 ] / spacing[ 1 ];
+
+#if 0
+  double sx = ( spacing[ 0 ]>0.0 ? 1.0 : -1.0 ) / spacing[ 0 ];
+  double sy = ( spacing[ 1 ]>0.0 ? 1.0 : -1.0 ) / spacing[ 1 ];
+#endif
+
+  
+  // qDebug() << "sx:" << sx << "; sy:" << sy;
+  // qDebug() << "rsx:" << rsx << "; rsy:" << rsy;
+
+  // qDebug() << this << "::updateGL()";
+
+  // Refresh view.
+  updateGL();
+
+  // Emit absolute scale.
+  emit ScaleChanged( rsx, rsy );
+
+  // Emit zooming scale-factor.
+  emit RoiChanged( center, rsx, rsy );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnScaleDynamicsRequested( double factor )
+{
+  // qDebug() << this << "::OnScaleDynamicsRequested(" << factor << ")";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    VectorImageSettings & settings = imageModel->GetSettings();
+
+    CountType begin = -1;
+    CountType end = -1;
+
+    // Shift intensity for each channel.
+    if( RgbwBounds( begin,
+		    end,
+		    settings.IsGrayscaleActivated() ? RGBW_CHANNEL_WHITE : RGBW_CHANNEL_RGB ) )
+      for( CountType i=begin; i<end; ++i )
+	{
+	RgbwChannel c = static_cast< RgbwChannel >( i );
+
+	ParametersType::ValueType lo = settings.GetLowIntensity( c );
+	ParametersType::ValueType hi = settings.GetHighIntensity( c );
+	ParametersType::ValueType o = ( lo + hi ) / 2;
+
+	settings.SetLowIntensity( c, factor * ( lo - o ) + o );
+	settings.SetHighIntensity( c, factor * ( hi - o ) + o );
+	}
+
+    /*
+    // Grayscale
+    if( settings.IsGrayscaleActivated() )
+      {
+      // Get color-dynamics.
+      ParametersType params( settings.GetGrayDynamicsParams() );
+
+      // Compute center value.
+      ParametersType::ValueType center = ( params[ 0 ] + params[ 1 ] ) / 2;
+
+      // Scale color-dynamics around center value.
+      params[ 0 ] = factor * ( params[ 0 ] - center ) + center;
+      params[ 1 ] = factor * ( params[ 1 ] - center ) + center;
+
+      // Set color-dynamics.
+      settings.SetLowIntensity( RGBW_CHANNEL_WHITE, params[ 0 ] );
+      settings.SetHighIntensity( RGBW_CHANNEL_WHITE, params[ 1 ] );
+      }
+    // RGB
+    else
+      {
+      // Get color-setup.
+      VectorImageSettings::ChannelVector channels( settings.GetRgbChannels() );
+
+      // Get color-dynamics.
+      ParametersType params(
+	settings.GetRgbDynamicsParams()
+      );
+
+      CountType begin = -1;
+      CountType end = -1;
+
+      // Shift intensity for each channel.
+      if( RgbBounds( begin, end, RGBW_CHANNEL_RGB ) )
+	for( CountType i=begin; i<end; ++i )
+	  {
+	  // Compute center value.
+	  ParametersType::ValueType center = ( params[ 2 * i ] + params[ 2 * i + 1 ] ) / 2;
+
+	  // Scale color-dynamics around center value.
+	  params[ 2 * i ] = factor * ( params[ 2 * i ] - center ) + center;
+	  params[ 2 * i + 1 ] = factor * ( params[ 2 * i + 1 ] - center ) + center;
+	  }
+
+      // Set shifted intensities.
+      settings.SetRgbDynamicsParams( params );
+      }
+    */
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnSelectFirstLayerRequested()
+{
+  // qDebug() << this << "::OnSelectFirstLayerRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->SelectFirst();
+
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnSelectLastLayerRequested()
+{
+  // qDebug() << this << "::OnSelectLastLayerRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->SelectLast();
+
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnSelectPreviousLayerRequested()
+{
+  // qDebug() << this << "::OnSelectPreviousLayerRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->SelectPrevious();
+
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnSelectNextLayerRequested()
+{
+  // qDebug() << this << "::OnSelectNextLayerRequested()";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  stackedLayerModel->SelectNext();
+
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnSetProjectionRequired()
+{
+  // qDebug() << this << "::OnSetProjection()";
+
+  StackedLayerModel * stackedLayerModel = GetLayerStack();
+
+  if( stackedLayerModel==NULL )
+    return;
+
+
+  const AbstractLayerModel * layer = stackedLayerModel->GetReference();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    const VectorImageModel * imageModel =
+      qobject_cast< const VectorImageModel * >( layer );
+
+    assert( imageModel!=NULL );
+
+    DefaultImageType::ConstPointer image( imageModel->ToImage() );
+    assert( !image.IsNull() );
+
+    assert( m_Manipulator!=NULL );
+
+    m_Manipulator->SetWkt( image->GetProjectionRef() );
+    m_Manipulator->SetKeywordList( image->GetImageKeywordlist() );
+
+    m_Manipulator->SetOrigin( imageModel->GetOrigin() );
+    m_Manipulator->SetSpacing( imageModel->GetSpacing() );
+    m_Manipulator->SetNativeSpacing( imageModel->GetNativeSpacing() );
+    }
+  else
+    {
+    assert( false && "Unhandled AbstractLayerModel derived type." );
+    }
+
+  ApplyFixedZoomType();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnSetReferenceRequested()
+{
+  // qDebug() << this << "::OnSetReferenceRequested()";
+
+  StackedLayerModel * stackedLayerModel = GetLayerStack();
+
+  if( stackedLayerModel==NULL )
+    return;
+
+  if( !stackedLayerModel->HasCurrent() )
+    return;
+
+  size_t unk = 0;
+  size_t gcs = 0;
+
+  stackedLayerModel->CountSRT( unk, gcs, gcs, gcs );
+
+  if( unk==0 )
+    stackedLayerModel->SetReference( stackedLayerModel->GetCurrentKey() );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnShaderEffectRequested( Effect effect )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnShaderEffectRequested(" << QString( EFFECT_NAME[ effect ] ) << ")";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    assert( imageModel!=NULL );
+
+    imageModel->GetSettings().SetEffect( effect );
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnShiftAlphaRequested( double delta )
+{
+  // qDebug() << this << "::OnShiftAlphaRequested(" << delta << ")";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    imageModel->GetSettings().SetAlpha( imageModel->GetSettings().GetAlpha() + delta );
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnShiftDynamicsRequested( double delta )
+{
+  // qDebug() << this << "::OnShiftDynamicsRequested(" << delta << ")";
+
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    VectorImageSettings & settings = imageModel->GetSettings();
+
+    HistogramModel * histogram = imageModel->GetHistogramModel();
+    assert( histogram!=NULL );
+
+    // Get min/max pixels.
+    DefaultImageType::PixelType minPx( histogram->GetMinPixel() );
+    DefaultImageType::PixelType maxPx( histogram->GetMaxPixel() );
+
+    // Iterator bounds.
+    CountType begin = -1;
+    CountType end = -1;
+
+    // Shift intensity for each channel.
+    if( RgbwBounds( begin,
+		    end,
+		    settings.IsGrayscaleActivated() ? RGBW_CHANNEL_WHITE : RGBW_CHANNEL_RGB ) )
+      for( CountType i=begin; i<end; ++i )
+	{
+	// Channel.
+	RgbwChannel c = static_cast< RgbwChannel >( i );
+
+	// Band.
+	VectorImageSettings::ChannelVector::value_type b = settings.GetSmartChannel( c );
+
+	// Compute step.
+	DefaultImageType::PixelType::ValueType step =
+	  static_cast< DefaultImageType::PixelType::ValueType >(
+	    delta * ( maxPx[ b ] - minPx[ b ] )
+	);
+
+	// Apply step shift.
+	settings.SetLowIntensity( c, settings.GetLowIntensity( c ) + step );
+	settings.SetHighIntensity( c, settings.GetHighIntensity( c ) + step );
+	}
+
+    /*
+    // Grayscale
+    if( settings.IsGrayscaleActivated() )
+      {
+      // Get color-setup.
+      unsigned int channel = settings.GetGrayChannel();
+
+      // Get color-dynamics.
+      ParametersType params( settings.GetGrayDynamicsParams() );
+
+      // Compute step.
+      DefaultImageType::PixelType::ValueType step =
+	static_cast< DefaultImageType::PixelType::ValueType >(
+	  delta * ( maxPx[ channel ] - minPx[ channel ]
+	  )
+	);
+
+      // Shift min & max intensities of channel.
+      params[ 0 ] += step;
+      params[ 1 ] += step;
+
+      // Set color-dynamics.
+      settings.SetLowIntensity( RGBW_CHANNEL_WHITE, params[ 0 ] );
+      settings.SetHighIntensity( RGBW_CHANNEL_WHITE, params[ 1 ] );
+      }
+    // RGB
+    else
+      {	
+      // Get color-setup.
+      VectorImageSettings::ChannelVector channels( settings.GetRgbChannels() );
+
+      // Get color-dynamics.
+      ParametersType params(
+	settings.GetRgbDynamicsParams()
+      );
+
+      // Shift intensity for each channel.
+      for( VectorImageSettings::ChannelVector::const_iterator it( channels.begin() );
+	   it!=channels.end();
+	   ++it )
+	params[ *it ] +=
+	  static_cast< DefaultImageType::PixelType::ValueType >(
+	    delta * ( maxPx[ *it ] - minPx[ *it ]
+	    )
+	  );
+
+      // Set shifted intensities.
+      settings.SetRgbDynamicsParams( params );
+      }
+    */
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::SaveScreenshot( bool isQuickMode )
+{
+  QString filename(
+    QString( "monteverdi-%1-%2.png" )
+    .arg( Monteverdi_VERSION_STRING )
+    .arg(
+      QDateTime::currentDateTime().toString( "yyyyMMdd-hhmm-ss-zzz" )
+    )
+  );
+
+  QString selectedFilter;
+
+  if( isQuickMode )
+    filename = QDir::home().filePath( filename );
+  else
+    filename =
+      QFileDialog::getSaveFileName(
+	this,
+	tr( "Save screenshot..." ),
+	QDir::current().filePath( filename ),
+	tr( "PNG File (*.png);;JPEG File (*.jpg);;TIFF file (*tif)" ),
+  &selectedFilter
+      );
+
+  if( filename.isEmpty() )
+    return;
+
+  // If no correct extension is found
+  if(!filename.endsWith(".png",Qt::CaseInsensitive)
+     &&!filename.endsWith(".jpg",Qt::CaseInsensitive)
+     &&!filename.endsWith(".tif",Qt::CaseInsensitive))
+    {
+    if(selectedFilter.startsWith("PNG"))
+      {
+      filename+=".png";
+      }
+    else if(selectedFilter.startsWith("JPEG"))
+      {
+      filename+=".jpg";
+      }
+    else if(selectedFilter.startsWith("TIFF"))
+      {
+      filename+=".tif";
+      }
+    }
+                        
+  
+  assert( m_Renderer!=NULL );
+
+  try
+    {
+    m_Renderer->SaveScreenshot( filename );
+    }
+  catch( const std::exception & exception )
+    {
+    QMessageBox::warning(
+      this,
+      "Warning!",
+      tr( "Exception caught while saving screenshot into file '%1':\n\n%2" )
+      .arg( filename )
+      .arg( exception.what() )
+    );
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnResetViewport()
+{
+  // qDebug() << this << "::OnResetViewport()";
+
+  assert( m_Manipulator!=NULL );
+
+  m_Manipulator->ResetViewport();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnToggleLayerVisibilityRequested( bool )
+{
+  assert( m_Renderer!=NULL );
+
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+
+  if( layer==NULL )
+    return;
+
+  layer->SetVisible( !layer->IsVisible() );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnUpdateGammaRequested( double factor )
+{
+  // qDebug() << this << "::OnUpdateGammaRequested(" << factor << ")";
+
+  assert( m_Renderer!=NULL );
+
+  
+  StackedLayerModel * stackedLayerModel = m_Renderer->GetLayerStack();
+  assert( stackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = stackedLayerModel->GetCurrent();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    VectorImageModel * imageModel =
+      qobject_cast< VectorImageModel * >( layer );
+
+    imageModel->GetSettings().SetGamma( imageModel->GetSettings().GetGamma() * factor );
+
+    emit ModelUpdated();
+    }
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::OnUpdateProjectionRequired()
+{
+  // qDebug() << this << "::OnUpdateProjectionRequired()";
+
+  // Reminder: specific #include "mvdImageViewRenderer.h"
+  assert( m_Manipulator!=NULL );
+
+  assert( m_Renderer==qobject_cast< const ImageViewRenderer * >( m_Renderer ) );
+
+  //
+  // ImageViewRenderer specific code (as opposing to
+  // AbstractImageViewRenderer).
+  //
+  // Could be moved in derived class if necessary.
+  // {
+  const ImageViewRenderer * renderer =
+    qobject_cast< const ImageViewRenderer * >( m_Renderer );
+
+  assert( m_Renderer!=NULL );
+
+
+  PointType center;
+  SpacingType spacing;
+
+  renderer->Reproject(
+    center,
+    spacing,
+    m_Manipulator->GetCenter(),
+    m_Manipulator->GetSpacing()
+  );
+  // }
+
+
+  // Projection WKT and KWL must preferably be set before changing center/spacing
+  const AbstractLayerModel * layer = GetLayerStack()->GetReference();
+  assert( layer!=NULL );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    assert( layer==qobject_cast< const VectorImageModel * >( layer ) );
+
+    const VectorImageModel * imageModel =
+      qobject_cast< const VectorImageModel * >( layer );
+
+    assert( imageModel!=NULL );
+
+    DefaultImageType::ConstPointer image( imageModel->ToImage() );
+    assert( !image.IsNull() );
+
+    assert( m_Manipulator!=NULL );
+
+    m_Manipulator->SetWkt( image->GetProjectionRef() );
+    m_Manipulator->SetKeywordList( image->GetImageKeywordlist() );
+    }
+  else
+    {
+    assert( false && "Unhandled AbstractLayerModel derived type." );
+    }
+
+  // Spacing must be set before centering.
+  m_Manipulator->SetSpacing( spacing );
+
+  // Centering must be done at the last step.
+  m_Manipulator->CenterOn( center );
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::UpdateScene()
+{
+  assert( m_Renderer!=NULL );
+
+  m_Renderer->UpdateScene();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::ZoomToExtent()
+{
+  assert( m_Renderer!=NULL );
+
+  // if( m_Renderer->GetReferenceModel< AbstractImageModel >()==NULL )
+  //   return;
+
+  // Scale and center.
+  Center( ZOOM_TYPE_EXTENT );
+
+  // Refresh view.
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::ZoomToLayerExtent()
+{
+  assert( m_Renderer!=NULL );
+
+  // Scale and center.
+  Center( ZOOM_TYPE_LAYER );
+
+  // Refresh view.
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::ZoomToFullResolution()
+{
+  assert( m_Renderer!=NULL );
+
+  // if( m_Renderer->GetReferenceModel< AbstractImageModel >()==NULL )
+  //   return;
+
+  // Scale and center.
+  Center( ZOOM_TYPE_FULL );
+
+  // Refresh view.
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::ZoomIn()
+{
+  assert( m_Manipulator!=NULL );
+
+  m_Manipulator->ZoomIn();
+
+  // Refresh view.
+  updateGL();
+}
+
+/******************************************************************************/
+void
+ImageViewWidget
+::ZoomOut()
+{
+  assert( m_Manipulator!=NULL );
+
+  m_Manipulator->ZoomOut();
+
+  // Refresh view.
+  updateGL();
+}
+
+}
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx
new file mode 100644
index 0000000..73b848b
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.cxx
@@ -0,0 +1,567 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImportImagesDialog.h"
+#include "ui_mvdImportImagesDialog.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdCore.h"
+#include "mvdI18nCoreApplication.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::ImportImagesDialog
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+/**
+ */
+enum Columns
+{
+  COLUMN_NONE = -1,
+  //
+  COLUMN_IMAGE_SIZE = 0,
+  COLUMN_OVERVIEW_SIZE,
+  COLUMN_FILENAME,
+  //
+  COLUMN_COUNT,
+};
+
+
+const char * const
+HEADERS[ COLUMN_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::ImportImagesDialog", "Img Size" ),
+  QT_TRANSLATE_NOOP( "mvd::ImportImagesDialog", "Ovr Size" ),
+  QT_TRANSLATE_NOOP( "mvd::ImportImagesDialog", "Filename" ),
+};
+
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+ImportImagesDialog
+::ImportImagesDialog( const QStringList & filenames,
+		      QWidget * p,
+		      Qt::WindowFlags flags  ) :
+  QDialog( p, flags ),
+  m_UI( new Ui::ImportImagesDialog() ),
+  m_EffectiveCount( 0 )
+{
+  m_UI->setupUi( this );
+
+  {
+  QItemSelectionModel * ism = m_UI->filenamesTreeView->selectionModel();
+
+  m_UI->filenamesTreeView->setModel(
+    new QStandardItemModel( 0, COLUMN_COUNT, m_UI->filenamesTreeView )
+  );
+
+  delete ism;
+  ism = NULL;
+  }
+
+  QObject::connect(
+    m_UI->filenamesTreeView->model(),
+    SIGNAL( itemChanged( QStandardItem * ) ),
+    // to:
+    this,
+    SLOT( OnItemChanged( QStandardItem * ) )
+  );
+
+  QObject::connect(
+    m_UI->filenamesTreeView->selectionModel(),
+    SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ),
+    // to:
+    this,
+    SLOT( OnCurrentChanged( const QModelIndex &, const QModelIndex & ) )
+  );
+
+  SetFilenames( filenames );
+}
+
+/*****************************************************************************/
+ImportImagesDialog
+::~ImportImagesDialog()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+const otb::GDALOverviewsBuilder::Pointer &
+ImportImagesDialog
+::GetBuilder( const QModelIndex & index ) const
+{
+  assert( index.isValid() );
+
+  assert(
+    index.row()>=0 &&
+    static_cast< size_t >( index.row() )<m_GDALOverviewsBuilders.size() );
+
+  return m_GDALOverviewsBuilders[ index.row() ];
+}
+
+/*****************************************************************************/
+int
+ImportImagesDialog
+::GetEffectiveCount() const
+{
+  return m_EffectiveCount;
+}
+
+/*****************************************************************************/
+const ImportImagesDialog::GDALOverviewsBuilderVector &
+ImportImagesDialog
+::GetGDALOverviewsBuilders() const
+{
+  return m_GDALOverviewsBuilders;
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::SetFilenames( const QStringList & filenames )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->filenamesTreeView!=NULL );
+
+  m_GDALOverviewsBuilders.clear();
+
+  QStandardItemModel * itemModel =
+    qobject_cast< QStandardItemModel * >( m_UI->filenamesTreeView->model() );
+
+  assert( itemModel!=NULL );
+
+  itemModel->clear();
+
+  SetHeaders();
+
+  m_EffectiveCount = 0;
+
+  for( int i=0;
+       i<filenames.size();
+       ++ i )
+    {
+    std::string filename( QFile::encodeName( filenames[ i ] ).constData() );
+    assert( !filename.empty() );
+
+    if( otb::GDALOverviewsBuilder::CanGenerateOverviews( filename ) )
+      {
+      otb::GDALOverviewsBuilder::Pointer builder(
+	otb::GDALOverviewsBuilder::New()
+      );
+
+      Qt::ItemFlags flags = Qt::NoItemFlags;
+
+      try
+	{
+	builder->SetInputFileName( filename );
+
+	flags |= Qt::ItemIsSelectable;
+
+	unsigned int count = 0;
+
+	{
+	  assert( I18nCoreApplication::Instance()!=NULL );
+
+	  QVariant value(
+	    I18nCoreApplication::Instance()->RetrieveSettingsKey(
+	      I18nCoreApplication::SETTINGS_KEY_OVERVIEWS_SIZE
+	    )
+	  );
+
+	  count =
+	    builder->CountResolutions(
+	      2,
+	      value.isValid()
+	      ? value.toInt()
+	      : OVERVIEWS_SIZE_DEFAULT
+	    );
+	}
+
+	if( builder->GetOverviewsCount()>0 )
+	  builder->SetBypassEnabled( true );
+	else
+	  {
+	  flags |= Qt::ItemIsEnabled;
+
+	  builder->SetBypassEnabled( count<=1 );
+
+	  ++ m_EffectiveCount;
+	  }
+
+	builder->SetResolutionFactor( 2 );
+	builder->SetNbResolutions( count );
+	builder->SetResamplingMethod( otb::GDAL_RESAMPLING_AVERAGE );
+	builder->SetCompressionMethod( otb::GDAL_COMPRESSION_NONE );
+	builder->SetFormat( otb::GDAL_FORMAT_GEOTIFF );
+	}
+      catch( const std::exception & e )
+	{
+	QMessageBox::warning(
+	  this,
+	  PROJECT_NAME,
+	  tr(
+	    "The following exception has raised when scanning file '%1' for GDAL overview settings:\n\n%2" )
+	  .arg( filenames[ i ] )
+	  .arg( e.what() )
+	);
+
+	builder = otb::GDALOverviewsBuilder::Pointer();
+	}
+
+      m_GDALOverviewsBuilders.push_back( builder );
+
+      typedef QList< QStandardItem * > ItemList;
+
+      ItemList items;
+
+      //
+      // COLUMN_IMAGE_SIZE
+      if( !builder.IsNull() )
+	{
+	items.push_back(
+	  new QStandardItem(
+	    QString( "%1x%2" )
+	    .arg( builder->GetWidth() )
+	    .arg( builder->GetHeight() )
+	  )
+	);
+
+	items.back()->setFlags( flags );
+	}
+
+      //
+      // COLUMN_FILE_SIZE
+      items.push_back(
+	new QStandardItem(
+	  ToHumanReadableSize(
+	    builder->GetOverviewsCount() > 0
+	    ? QFileInfo(
+	      filenames[ i ] + ".ovr"
+	    )
+	    .size()
+	    : builder->GetEstimatedSize()
+	  )
+	)
+      );
+
+      items.back()->setFlags( flags );
+
+      //
+      // COLUMN_FILENAME
+      items.push_back( new QStandardItem( filenames[ i ] ) );
+
+      if( flags.testFlag( Qt::ItemIsEnabled ) )
+	{
+	items.back()->setFlags( flags | Qt::ItemIsUserCheckable );
+
+	items.back()->setCheckState(
+	  builder->IsBypassEnabled()
+	  ? Qt::Unchecked
+	  : Qt::Checked
+	);
+	}
+      else
+	items.back()->setFlags( flags );
+
+      //
+      // Append items.
+      itemModel->appendRow( items );
+      }
+#if ( defined( OTB_DEBUG ) && 1 ) || 0
+    else
+      qDebug() << "Skipped:" << filenames[ i ];
+#endif
+    }
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::SetHeaders()
+{
+  assert( m_UI!=NULL );
+  assert(
+    m_UI->filenamesTreeView->model()==
+    qobject_cast< QStandardItemModel * >( m_UI->filenamesTreeView->model() )
+  );
+
+  QStandardItemModel * model =
+    qobject_cast< QStandardItemModel * >( m_UI->filenamesTreeView->model() );
+
+  assert( model!=NULL );
+
+  for( int i=0; i<COLUMN_COUNT; ++i )
+    {
+    // qDebug() <<
+    //   qApp->translate(
+    // 	"mvd::ImportImagesDialog",
+    // 	HEADERS[ i ]
+    //   );
+
+    // labels <<
+    //   qApp->translate(
+    // 	"mvd::ImportImagesDialog",
+    // 	HEADERS[ i ]
+    //   );
+
+    // model->horizontalHeaderItem( i )->setText(
+    //   qApp->translate(
+    // 	"mvd::ImportImagesDialog",
+    // 	HEADERS[ i ]
+    //   )
+    // );
+
+    model->setHorizontalHeaderItem(
+      i,
+      new QStandardItem(
+    	qApp->translate(
+    	  "mvd::ImportImagesDialog",
+    	  HEADERS[ i ]
+    	)
+      )
+    );
+    }
+
+  // qDebug() << labels;
+
+  // model->setHorizontalHeaderLabels( labels );
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::UpdateFileSize( size_t row )
+{
+  assert( row<m_GDALOverviewsBuilders.size() );
+
+  assert( !m_GDALOverviewsBuilders[ row ].IsNull() );
+  assert( m_GDALOverviewsBuilders[ row ]->GetOverviewsCount()<=0 );
+
+  //
+  // Get item-model.
+  assert( m_UI!=NULL );
+  assert( m_UI->filenamesTreeView!=NULL );
+
+  QStandardItemModel * model =
+    qobject_cast< QStandardItemModel * >(
+      m_UI->filenamesTreeView->model()
+    );
+
+  assert( model!=NULL );
+
+  //
+  // Create index.
+  QModelIndex index( model->index( row, COLUMN_OVERVIEW_SIZE ) );
+
+  //
+  // Get GDAL overview builder.
+  otb::GDALOverviewsBuilder::Pointer builder(
+    m_GDALOverviewsBuilders[ index.row() ]
+  );
+  assert( !builder.IsNull() );
+
+  //
+  // Update file size.
+  model->setData(
+    index,
+    ToHumanReadableSize(
+      builder->GetEstimatedSize()
+    )
+  );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+ImportImagesDialog
+::on_buttonBox_clicked( QAbstractButton * button )
+{
+  // qDebug() << this << "::on_buttonBox_clicked(" << button << ")";
+
+  assert( m_UI!=NULL );
+  assert( button!=NULL );
+
+  switch( m_UI->buttonBox->standardButton( button ) )
+    {
+    case QDialogButtonBox::Ok:
+      accept();
+      break;
+
+    case QDialogButtonBox::Cancel:
+      reject();
+      break;
+
+    case QDialogButtonBox::Ignore:
+      done( -1 );
+      break;
+
+    default:
+      assert( false && "Unhandled QDialogButtonBox::StandardButton enum value!" );
+      reject();
+      break;
+    }
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::on_pyramidWidget_BaseValueChanged( int )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->filenamesTreeView!=NULL );
+  assert( m_UI->filenamesTreeView->selectionModel()!=NULL );
+
+  UpdateFileSize(
+    m_UI->filenamesTreeView->selectionModel()->currentIndex().row()
+  );
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::on_pyramidWidget_LevelsValueChanged( int )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->filenamesTreeView!=NULL );
+  assert( m_UI->filenamesTreeView->selectionModel()!=NULL );
+
+  UpdateFileSize(
+    m_UI->filenamesTreeView->selectionModel()->currentIndex().row()
+  );
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::on_pyramidWidget_SizeValueChanged( int )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->filenamesTreeView!=NULL );
+  assert( m_UI->filenamesTreeView->selectionModel()!=NULL );
+
+  UpdateFileSize(
+    m_UI->filenamesTreeView->selectionModel()->currentIndex().row()
+  );
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::OnCurrentChanged( const QModelIndex & current, const QModelIndex & )
+{
+  // qDebug() << this << "::OnCurrentChanged(" << current << "," << previous << ")";
+
+  // const QStandardItemModel * itemModel =
+  //   qobject_cast< const QStandardItemModel * >(
+  //     m_UI->filenamesTreeView->model()
+  //   );
+
+  // assert( itemModel!=NULL );
+
+  const otb::GDALOverviewsBuilder::Pointer & builder =
+    GetBuilder( current );
+
+  m_UI->pyramidWidget->setEnabled(
+    !builder.IsNull() &&
+    !builder->IsBypassEnabled()
+  );
+
+  m_UI->pyramidWidget->SetBuilder( builder );
+}
+
+/*****************************************************************************/
+void
+ImportImagesDialog
+::OnItemChanged( QStandardItem * item )
+{
+  // qDebug() << this << "::OnItemChanged(" << item << ")";
+
+  assert( item!=NULL );
+
+  QModelIndex index( item->index() );
+
+
+  if( index.column()!=COLUMN_FILENAME )
+    return;
+
+
+  const otb::GDALOverviewsBuilder::Pointer & builder =
+    GetBuilder( item->index() );
+
+  if( !builder.IsNull() )
+    {
+    builder->SetBypassEnabled( item->checkState()!=Qt::Checked );
+
+    UpdateFileSize( index.row() );
+    }
+
+  assert( m_UI!=NULL );
+  assert( m_UI->filenamesTreeView->selectionModel()!=NULL );
+
+  if( m_UI->filenamesTreeView->selectionModel()->currentIndex()!=index )
+    return;
+
+
+  m_UI->pyramidWidget->setEnabled(
+    !builder.IsNull() &&
+    !builder->IsBypassEnabled()
+  );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.ui b/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.ui
new file mode 100644
index 0000000..6bf41e2
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImportImagesDialog.ui
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ImportImagesDialog</class>
+ <widget class="QDialog" name="mvd::ImportImagesDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>275</width>
+    <height>134</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Configure multi-resolution pyramid</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="margin">
+    <number>4</number>
+   </property>
+   <property name="spacing">
+    <number>4</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QTreeView" name="filenamesTreeView"/>
+   </item>
+   <item row="1" column="0">
+    <widget class="mvd::MultiResolutionPyramidWidget" name="pyramidWidget" native="true"/>
+   </item>
+   <item row="2" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ignore|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>mvd::MultiResolutionPyramidWidget</class>
+   <extends>QWidget</extends>
+   <header>mvdMultiResolutionPyramidWidget.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx
new file mode 100644
index 0000000..9f5d46f
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx
@@ -0,0 +1,304 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdImportSubDatasetDialog.h"
+#include "ui_mvdImportSubDatasetDialog.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGDALImageIO.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::ImportSubDatasetDialog
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+char const * const
+ImportSubDatasetDialog
+::DATASET_COLUMN_NAMES[ ImportSubDatasetDialog::DATASET_COLUMN_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::ImportSubDatasetDialog", "Index" ),
+  QT_TRANSLATE_NOOP( "mvd::ImportSubDatasetDialog", "Desc" ),
+  QT_TRANSLATE_NOOP( "mvd::ImportSubDatasetDialog", "Name" ),
+};
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+ImportSubDatasetDialog
+::ImportSubDatasetDialog( const QString & filename,
+		     QWidget * p,
+		     Qt::WindowFlags flags  ):
+  QDialog( p, flags ),
+  m_UI( new mvd::Ui::ImportSubDatasetDialog() ),
+  m_HasSubDatasets( false )
+{
+  m_UI->setupUi( this );
+
+  Setup( filename );
+}
+
+/*****************************************************************************/
+ImportSubDatasetDialog
+::~ImportSubDatasetDialog()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+void
+ImportSubDatasetDialog
+::GetSubDatasets( IntVector & dataset ) const
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->datasetTreeView!=NULL );
+
+  assert(
+    m_UI->datasetTreeView->model()==
+    qobject_cast< QStandardItemModel * >( m_UI->datasetTreeView->model() )
+  );
+
+  QStandardItemModel * itemModel =
+    qobject_cast< QStandardItemModel * >( m_UI->datasetTreeView->model() );
+
+  assert( itemModel!=NULL );
+
+  for( int i=0; i<itemModel->rowCount(); ++i )
+    {
+    assert( itemModel->item( i, DATASET_COLUMN_DESC )!=NULL );
+
+    if( itemModel->item( i, DATASET_COLUMN_DESC )
+	->checkState()==Qt::Checked )
+      dataset.push_back( i );
+    }
+}
+
+/*****************************************************************************/
+bool
+ImportSubDatasetDialog
+::HasSubDatasets() const
+{
+  return m_HasSubDatasets;
+}
+
+/*****************************************************************************/
+void
+ImportSubDatasetDialog
+::Setup( const QString & filename )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->datasetTreeView!=NULL );
+
+  QStandardItemModel * itemModel = NULL;
+
+  //
+  // Create item-model.
+  {
+  QItemSelectionModel * ism = m_UI->datasetTreeView->selectionModel();
+
+  itemModel = new QStandardItemModel( m_UI->datasetTreeView );
+
+  m_UI->datasetTreeView->setModel( itemModel );
+
+  delete ism;
+  ism = NULL;
+  }
+
+  //
+  // Setup item-model
+  assert( itemModel!=NULL );
+
+  itemModel->setColumnCount( DATASET_COLUMN_COUNT );
+
+  {
+    QStringList headers;
+
+    for( int i=0; i<DATASET_COLUMN_COUNT; ++i )
+      headers << QApplication::translate( "mvd", DATASET_COLUMN_NAMES[ i ] );
+
+    itemModel->setHorizontalHeaderLabels( headers );
+  }
+
+  //
+  // Fill item-model.
+  otb::GDALImageIO::Pointer gdalIO( otb::GDALImageIO::New() );
+
+  // Check for existing options other than sdataidx
+  int posOptions = filename.indexOf(QChar('?'));
+  int posSubDataIdx = filename.indexOf(QString("sdataidx"));
+  QString cleanFilename(filename);
+  if (posOptions > 0 && posSubDataIdx <= posOptions)
+    {
+    cleanFilename = filename.section('?',0,0);
+    }
+  std::string fname( QFile::encodeName( cleanFilename ).constData() );
+
+  if( gdalIO->CanReadFile( fname.c_str() ) )
+    {
+    gdalIO->SetFileName( fname );
+
+    StringVector names;
+    StringVector descs;
+
+    m_HasSubDatasets = gdalIO->GetSubDatasetInfo( names, descs );
+
+    assert( names.size()==descs.size() );
+
+    typedef QList< QStandardItem * > StandardItemList;
+
+    for( std::string::size_type i=0; i<names.size(); ++i )
+      {
+      assert( i<names.size() );
+      assert( i<descs.size() );
+
+      // qDebug() << "name:" << FromStdString( names[ i ] );
+      // qDebug() << "desc:" << FromStdString( descs[ i ].c_str() );
+
+      StandardItemList items;
+
+      items << new QStandardItem( QString( "%1" ).arg( i + 1 ) );
+      items << new QStandardItem( FromStdString( descs[ i ] ) );
+
+      items.back()->setCheckable( true );
+      items.back()->setCheckState( Qt::Checked );
+
+      items << new QStandardItem( FromStdString( names[ i ] ) );
+
+      itemModel->appendRow( items );
+      }
+    }
+
+  //
+  // Fit tree-view to item-model content.
+  {
+    for( int i=0; i<itemModel->columnCount(); ++i )
+      m_UI->datasetTreeView->resizeColumnToContents( i );
+  }
+}
+
+/*****************************************************************************/
+void
+ImportSubDatasetDialog
+::SetSubDatasetsCheckState( Qt::CheckState state )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->datasetTreeView!=NULL );
+
+  assert(
+    m_UI->datasetTreeView->model()==
+    qobject_cast< QStandardItemModel * >( m_UI->datasetTreeView->model() )
+  );
+
+  QStandardItemModel * itemModel =
+    qobject_cast< QStandardItemModel * >( m_UI->datasetTreeView->model() );
+
+  assert( itemModel!=NULL );
+
+  for( int i=0; i<itemModel->rowCount(); ++i )
+    {
+    assert( itemModel->item( i, DATASET_COLUMN_DESC )!=NULL );
+
+    itemModel->item( i, DATASET_COLUMN_DESC )->setCheckState( state );
+    }
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+ImportSubDatasetDialog
+::on_allButton_clicked()
+{
+  SetSubDatasetsCheckState( Qt::Checked );
+}
+
+/*****************************************************************************/
+void
+ImportSubDatasetDialog
+::on_invertButton_clicked()
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->datasetTreeView!=NULL );
+
+  assert(
+    m_UI->datasetTreeView->model()==
+    qobject_cast< QStandardItemModel * >( m_UI->datasetTreeView->model() )
+  );
+
+  QStandardItemModel * itemModel =
+    qobject_cast< QStandardItemModel * >( m_UI->datasetTreeView->model() );
+
+  assert( itemModel!=NULL );
+
+  for( int i=0; i<itemModel->rowCount(); ++i )
+    {
+    QStandardItem * item = itemModel->item( i, DATASET_COLUMN_DESC );
+
+    assert( item!=NULL );
+
+    item->setCheckState(
+      item->checkState()==Qt::Unchecked
+      ? Qt::Checked
+      : Qt::Unchecked
+    );
+    }
+}
+
+/*****************************************************************************/
+void
+ImportSubDatasetDialog
+::on_noneButton_clicked()
+{
+  SetSubDatasetsCheckState( Qt::Unchecked );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.ui b/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.ui
new file mode 100644
index 0000000..adf0d22
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.ui
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ImportSubDatasetDialog</class>
+ <widget class="QDialog" name="mvd::ImportSubDatasetDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>640</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Import image</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <property name="margin">
+    <number>4</number>
+   </property>
+   <property name="spacing">
+    <number>4</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QGroupBox" name="datasetGroupBox">
+     <property name="title">
+      <string>Dataset</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QPushButton" name="allButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>All</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QPushButton" name="noneButton">
+        <property name="text">
+         <string>None</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QPushButton" name="invertButton">
+        <property name="text">
+         <string>Invert</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="3">
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>320</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="1" column="0" colspan="4">
+       <widget class="QTreeView" name="datasetTreeView"/>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>mvd::ImportSubDatasetDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>mvd::ImportSubDatasetDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.cxx
new file mode 100644
index 0000000..ca12d82
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.cxx
@@ -0,0 +1,75 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdKeymapDialog.h"
+#include "ui_mvdKeymapDialog.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::KeymapDialog
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*******************************************************************************/
+KeymapDialog
+::KeymapDialog( QWidget* p, Qt::WindowFlags flags ) :
+  QDialog( p, flags ),
+  m_UI( new mvd::Ui::KeymapDialog() )
+{
+  m_UI->setupUi( this );
+
+  m_UI->m_ProjectLabel->setText( PROJECT_NAME );
+  m_UI->m_VersionLabel->setText( Monteverdi_VERSION_STRING );
+}
+
+/*******************************************************************************/
+KeymapDialog
+::~KeymapDialog()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.html b/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.html
new file mode 100644
index 0000000..c0734a7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html>
+
+<head>
+<meta name="qrichtext" content="1" />
+<style type="text/css">p, li { white-space: pre-wrap; }</style>
+</head><body style=" font-family:'Droid Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+
+<h1>Keyboard and mouse shortcut mappings</h1>
+<table>
+<tr> <th></th> <th></th> <th>Main window</th> </tr>
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>O</td> <td>Open file(s)</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>Q</td> <td>Quit application</td> </tr>
+<!-- -->
+<tr> <th></th> <th></th> <th>Histogram view</th></tr>
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td></td> <td>Left-button horizontal-drag</td> <td>Read histogram values</td> </tr>
+<tr> <td></td> <td></td> <td>Middle-button vertical-drag</td> <td>Scale histogram view</td> </tr>
+<tr> <td></td> <td></td> <td>Right-button horizontal-drag</td> <td>Shift histogram-view towards lo high</td> </tr>
+<tr> <td></td> <td></td> <td>Wheel</td> <td>Scale histogram-view</td> </tr>
+<!-- -->
+<tr> <th></th> <th></th> <th>Image View</th></tr>
+<tr> <td></td> <td></td> <td><center>(Click in to set focus)</center></td> <td></td> </tr>
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>P</td> <td><b>P</b>rint image-view (screenshot)</td> </tr>
+<tr> <td>SHIFT+</td> <td>CTRL+</td> <td>P</td> <td>Quick <b>P</b>rint image-view (quick screenshot)</td> </tr>
+<tr> <td></td> <td>ALT+</td> <td>Mouse wheel</td> <td>Adjust effect brush size</td> </tr>
+<tr> <td>SHIFT+</td> <td>ALT+</td> <td>Mouse wheel</td> <td>Adjust effect parameter value</td> </tr>
+<tr> <td></td> <td></td> <td>Mouse wheel</td> <td>Zoom in out</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>Mouse wheel</td> <td>Rotate layers</td> </tr>
+<tr> <td></td> <td>CTRL+ALT+</td> <td>Mouse wheel</td> <td>Shift dynamics range towards low/high</td> </tr>
+<tr> <td>SHIFT+</td> <td>CTRL+ALT+</td> <td>Mouse wheel</td> <td>Scale dynamics range around it's mean value</td> </tr>
+<tr> <td></td> <td>META+</td> <td>Mouse wheel</td> <td>Adjust translucency</td> </tr>
+<tr> <td>SHIFT+</td> <td>META+</td> <td>Mouse wheel</td> <td>Adjust gamma correction</td> </tr>
+<!-- -->
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td></td> <td>Mouse drag</td> <td>Scroll view</td> </tr>
+<tr> <td>CTRL+</td> <td></td> <td>Mouse drag</td> <td>Quick scroll view</td> </tr>
+<tr> <td></td> <td></td> <td>↑</td> <td>Scroll up</td> </tr>
+<tr> <td></td> <td></td> <td>↓</td> <td>Scroll down</td> </tr>
+<tr> <td></td> <td></td> <td>←</td> <td>Scroll left</td> </tr>
+<tr> <td></td> <td></td> <td>→</td> <td>Scroll right</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>↑</td> <td>Quick scroll up</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>↓</td> <td>Quick scroll down</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>←</td> <td>Quick scroll left</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>→</td> <td>Quick scroll right</td> </tr>
+<tr> <td></td> <td></td> <td>+</td> <td>Zoom in</td> </tr>
+<tr> <td></td> <td></td> <td>-</td> <td>Zoom out</td> </tr>
+<tr> <td></td> <td></td> <td>1</td> <td>Zoom to full resolution (1:1)</td> </tr>
+<tr> <td></td> <td></td> <td>2</td> <td>Zoom to selected layer extent</td> </tr>
+<tr> <td></td> <td></td> <td>3</td> <td>Zoom to all layers extent</td> </tr>
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td></td> <td>Delete</td> <td>Delete selected layer</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>Delete</td> <td>Delete all layers</td> </tr>
+<tr> <td></td> <td></td> <td>Home</td> <td>Select previous layer</td> </tr>
+<tr> <td></td> <td></td> <td>End</td> <td>Select next layer</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>Home</td> <td>Select first layer</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>End</td> <td>Select last layer</td> </tr>
+<tr> <td></td> <td></td> <td>Page Up</td> <td>Move layer up within stack</td> </tr>
+<tr> <td></td> <td></td> <td>Page Down</td> <td>Move layer down within stack</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>Page Up</td> <td>Move layer to top of stack</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>Page Down</td> <td>Move layer to bottom of stack</td> </tr>
+<tr> <td></td> <td></td> <td>A</td> <td>Apply selected layer settings to <b>A</b>ll layers</td> </tr>
+<tr> <td></td> <td></td> <td>P</td> <td>Use selected layer <b>P</b>rojection as reference projection</td> </tr>
+<tr> <td></td> <td></td> <td>Q</td> <td>Apply 2% <b>Q</b>uantiles to viewed area of selected image layer</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>Q</td> <td>Apply 2% <b>Q</b>uantiles to full area of selected image layer</td> </tr>
+<!-- -->
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td></td> <td>C</td> <td>Switch to <b>C</b>hessboard effect</td> </tr>
+<tr> <td></td> <td></td> <td>D</td> <td>Switch to local <b>D</b>ynamics or local contrast effect</td> </tr>
+<tr> <td></td> <td></td> <td>G</td> <td>Switch to <b>G</b>radient effect</td> </tr>
+<tr> <td></td> <td></td> <td>H</td> <td>Switch to <b>H</b>orizontal swipe effect</td> </tr>
+<tr> <td></td> <td></td> <td>N</td> <td>Switch to <b>N</b>o effect</td> </tr>
+<tr> <td></td> <td></td> <td>S</td> <td>Switch to <b>S</b>pectral angle effect</td> </tr>
+<tr> <td></td> <td></td> <td>T</td> <td>Switch to local <b>T</b>ranslucency effect</td> </tr>
+<tr> <td></td> <td></td> <td>V</td> <td>Switch to <b>V</b>ertical swipe effect</td> </tr>
+<!-- -->
+<tr> <th></th> <th></th> <th>Layer Stack</th></tr>
+<tr> <th></th> <th></th> <th>Key</th> <th>Action</th> </tr>
+<tr> <td></td> <td></td> <td>Delete</td> <td>Delete selected layer</td> </tr>
+<tr> <td>SHIFT+</td> <td></td> <td>Delete</td> <td>Delete all layers</td> </tr>
+<tr> <td></td> <td>CTRL+</td> <td>Mouse wheel</td> <td>Rotate layers up/down</td> </tr>
+</table>
+
+</body>
+
+</html>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.ui b/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.ui
new file mode 100644
index 0000000..50a79e6
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdKeymapDialog.ui
@@ -0,0 +1,653 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::KeymapDialog</class>
+ <widget class="QDialog" name="mvd::KeymapDialog">
+  <property name="windowModality">
+   <enum>Qt::NonModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>606</width>
+    <height>879</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>About...</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLabel" name="m_ProjectLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Monteverdi</string>
+         </property>
+         <property name="scaledContents">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="m_VersionLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="font">
+          <font>
+           <italic>true</italic>
+          </font>
+         </property>
+         <property name="text">
+          <string>Version M.m.pl (codename)</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QTextEdit" name="textEdit">
+       <property name="readOnly">
+        <bool>true</bool>
+       </property>
+       <property name="html">
+        <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Droid Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Keyboard and mouse shortcut mappings</span></p>
+<table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="0">
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Main window</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">O</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Open file(s)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quit application</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Histogram view</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Left-button horizontal-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Read histogram values</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Middle-button vertical-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale histogram view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Right-button horizontal-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shift histogram-view towards lo high</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale histogram-view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Image View</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Click in to set focus)</p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">P</span>rint image-view (screenshot)</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick <span style=" font-weight:600;">P</span>rint image-view (quick screenshot)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust effect brush size</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust effect parameter value</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom in out</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotate layers</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shift dynamics range towards low/high</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale dynamics range around it's mean value</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust translucency</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust gamma correction</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll view</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll up</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll down</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll left</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll right</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll up</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll down</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll left</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll right</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom in</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom out</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to full resolution (1:1)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to selected layer extent</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to all layers extent</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete selected layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete all layers</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Home</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select previous layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">End</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select next layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Home</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select first layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">End</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select last layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Up</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer up within stack</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Down</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer down within stack</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Up</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer to top of stack</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Down</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer to bottom of stack</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply selected layer settings to <span style=" font-weight:600;">A</span>ll layers</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use selected layer <span style=" font-weight:600;">P</span>rojection as reference projection</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply 2% <span style=" font-weight:600;">Q</span>uantiles to viewed area of selected image layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply 2% <span style=" font-weight:600;">Q</span>uantiles to full area of selected image layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">C</span>hessboard effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">D</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to local <span style=" font-weight:600;">D</span>ynamics or local contrast effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">G</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">G</span>radient effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">H</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">H</span>orizontal swipe effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">N</span>o effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">S</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">S</span>pectral angle effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">T</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to local <span style=" font-weight:600;">T</span>ranslucency effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">V</span>ertical swipe effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Layer Stack</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete selected layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete all layers</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotate layers up/down</p></td></tr></table></body></html></string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="m_CloseButton">
+         <property name="text">
+          <string>&Close</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>m_CloseButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>m_CloseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>mvd::KeymapDialog</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>359</x>
+     <y>398</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>206</x>
+     <y>211</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx
new file mode 100644
index 0000000..f5fe472
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackController.cxx
@@ -0,0 +1,510 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdLayerStackController.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractLayerModel.h"
+#include "mvdFilenameInterface.h"
+#include "mvdStackedLayerModel.h"
+#include "mvdLayerStackItemModel.h"
+#include "mvdLayerStackWidget.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::LayerStackController
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+LayerStackController
+::LayerStackController( LayerStackWidget * widget, QObject * p ) :
+  AbstractModelController( widget, p )
+{
+}
+
+/*******************************************************************************/
+LayerStackController
+::~LayerStackController()
+{
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::ClearWidget()
+{
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::Connect( AbstractModel * model )
+{
+  assert( model==qobject_cast< StackedLayerModel * >( model ) );
+
+
+  QObject::connect(
+    model,
+    SIGNAL( CurrentChanged( size_t ) ),
+    // to:
+    this,
+    SLOT( OnStackedLayerCurrentChanged( size_t ) )
+  );
+
+  QObject::connect(
+    model,
+    SIGNAL( ContentChanged() ),
+    // to:
+    this,
+    SLOT( OnStackedLayerContentChanged() )
+  );
+
+  QObject::connect(
+    model,
+    SIGNAL( ContentReset() ),
+    // to:
+    this,
+    SLOT( OnStackedLayerContentReset() )
+  );
+
+
+  LayerStackWidget * widget = GetWidget< LayerStackWidget >();
+  assert( widget!=NULL );
+
+  assert( widget->GetItemModel()!=NULL );
+
+  widget->GetItemModel()->SetStack(
+    qobject_cast< StackedLayerModel * >( model )
+  );
+
+
+  QObject::connect(
+    widget,
+    SIGNAL( SelectionChanged( int ) ),
+    // to:
+    this,
+    SLOT( OnSelectionChanged( int ) )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( ProjectionButtonClicked() ),
+    // to:
+    this,
+    SLOT( OnProjectionButtonClicked() )
+  );  
+
+
+  QObject::connect(
+    widget,
+    SIGNAL( TopButtonClicked() ),
+    // to:
+    model,
+    SLOT( MoveCurrentToTop() )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( BottomButtonClicked() ),
+    // to:
+    model,
+    SLOT( MoveCurrentToBottom() )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( UpButtonClicked() ),
+    // to:
+    model,
+    SLOT( RaiseCurrent() )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( DownButtonClicked() ),
+    // to:
+    model,
+    SLOT( LowerCurrent() )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( DeleteLayerRequested() ),
+    // to:
+    model,
+    SLOT( DeleteCurrent() )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( DeleteAllLayersRequested() ),
+    // to:
+    model,
+    SLOT( Clear() )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( CopyLayerRequested( const AbstractLayerModel * ) ),
+    // to:
+    this,
+    SLOT( OnCopyLayerRequested( const AbstractLayerModel * ) )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( RotateLayersRequested( int ) ),
+    // to:
+    model,
+    SLOT( RotateLayers( int ) )
+  );
+
+  QObject::connect(
+    widget,
+    SIGNAL( ApplyButtonClicked() ),
+    // to:
+    this,
+    SIGNAL( ApplyAllRequested() )
+  );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::Disconnect( AbstractModel * model )
+{
+  // assert( model==qobject_cast< StackedLayerModel * >( model ) );
+
+
+  QObject::disconnect(
+    model,
+    SIGNAL( CurrentChanged( size_t ) ),
+    // from:
+    this,
+    SLOT( OnStackedLayerCurrentChanged( size_t ) )
+  );
+
+  QObject::disconnect(
+    model,
+    SIGNAL( ContentChanged() ),
+    // from:
+    this,
+    SLOT( OnStackedLayerContentChanged() )
+  );
+
+  QObject::disconnect(
+    model,
+    SIGNAL( ContentReset() ),
+    // from:
+    this,
+    SLOT( OnStackedLayerContentReset() )
+  );
+
+
+  LayerStackWidget * widget = GetWidget< LayerStackWidget >();
+  assert( widget!=NULL );
+
+  assert( widget->GetItemModel()!=NULL );
+
+  widget->GetItemModel()->SetStack( NULL );
+
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( SelectionChanged( int ) ),
+    // from:
+    this,
+    SLOT( OnSelectionChanged( int ) )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( ProjectionButtonClicked() ),
+    // from:
+    this,
+    SLOT( OnProjectionButtonClicked() )
+  );  
+
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( TopButtonClicked() ),
+    // from:
+    model,
+    SLOT( MoveCurrentToTop() )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( BottomButtonClicked() ),
+    // from:
+    model,
+    SLOT( MoveCurrentToBottom() )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( UpButtonClicked() ),
+    // from:
+    model,
+    SLOT( RaiseCurrent() )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( DownButtonClicked() ),
+    // from:
+    model,
+    SLOT( LowerCurrent() )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( DeleteLayerRequested() ),
+    // from:
+    model,
+    SLOT( DeleteCurrent() )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( DeleteAllLayersRequested() ),
+    // from:
+    model,
+    SLOT( Clear() )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( CopyLayerRequested( const AbstractLayerModel * ) ),
+    // from:
+    this,
+    SLOT( OnCopyLayerRequested( const AbstractLayerModel * ) )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( RotateLayersRequested( int ) ),
+    // from:
+    model,
+    SLOT( RotateLayers( int ) )
+  );
+
+  QObject::disconnect(
+    widget,
+    SIGNAL( ApplyButtonClicked() ),
+    // to:
+    this,
+    SIGNAL( ApplyAllRequested() )
+  );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::virtual_ResetWidget( bool )
+{
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::UpdateButtonsState()
+{
+  assert( GetModel()==GetModel< StackedLayerModel >() );
+  StackedLayerModel * model = GetModel< StackedLayerModel >();
+  assert( model!=NULL );
+
+  assert( GetWidget()==GetWidget< LayerStackWidget >() );
+  LayerStackWidget * widget = GetWidget< LayerStackWidget >();
+  assert( widget!=NULL );
+
+  {
+  size_t unk = 0;
+  size_t gcs = 0;
+
+  model->CountSRT( unk, gcs, gcs, gcs );
+    
+  widget->SetProjectionEnabled( unk==0 && !model->IsEmpty() );
+  }
+
+  widget->SetDeleteEnabled( !model->IsEmpty() );
+
+  widget->SetReloadEnabled( !model->IsEmpty() );
+
+  widget->SetMoveEnabled( model->GetCount()>1 );
+
+  widget->SetApplyEnabled( model->GetCount()>1 );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+LayerStackController
+::OnCopyLayerRequested( const AbstractLayerModel * layer )
+{
+  // qDebug() << this << "::OnCopyLayerRequested(" << layer << ")";
+
+  assert( layer!=NULL );
+
+  const FilenameInterface * interface =
+    dynamic_cast< const FilenameInterface * >( layer );
+
+  if( interface==NULL )
+    return;
+
+  assert( qApp!=NULL );
+  assert( qApp->clipboard()!=NULL );
+  assert( qApp->clipboard()->mimeData()!=NULL );
+
+  QList< QUrl > urls;
+  
+  urls << QUrl::fromLocalFile( interface->GetFilename() );
+
+  qDebug() << "URLs:" << urls;
+
+  QMimeData * mimeData = new QMimeData();
+
+  mimeData->setUrls( urls );
+  mimeData->setText( interface->GetFilename() );
+
+  qApp->clipboard()->setMimeData( mimeData );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::OnCurrentChanged( int index )
+{
+  // qDebug() << this << "::OnCurrentChanged(" << index << ")";
+
+  assert( GetModel()==GetModel< StackedLayerModel >() );
+  StackedLayerModel * model = GetModel< StackedLayerModel >();
+  assert( model!=NULL );
+
+  model->SetCurrent( index );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::OnProjectionButtonClicked()
+{
+  // qDebug() << this << "::OnProjectionButtonClicked()";
+
+  assert( GetModel()==GetModel< StackedLayerModel >() );
+  StackedLayerModel * model = GetModel< StackedLayerModel >();
+  assert( model!=NULL );
+
+  model->SetReference( model->GetCurrentIndex() );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::OnSelectionChanged( int index )
+{
+  // qDebug() << this << "::OnSelectionChanged(" << index << ")";
+
+  assert( GetModel()==GetModel< StackedLayerModel >() );
+  StackedLayerModel * model = GetModel< StackedLayerModel >();
+  assert( model!=NULL );
+
+  model->SetCurrent( index );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::OnStackedLayerCurrentChanged( size_t index )
+{
+  // qDebug() << this << "::OnStackedLayerCurrentChanged(" << index << ")";
+
+  LayerStackWidget * widget = GetWidget< LayerStackWidget >();
+  assert( widget!=NULL );
+
+  assert( widget->GetItemModel()!=NULL );
+
+  bool prevSignalsBlocked = widget->blockSignals( true );
+  {
+  widget->SetCurrent( index );
+  }
+  widget->blockSignals( prevSignalsBlocked );
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::OnStackedLayerContentChanged()
+{
+  // qDebug() << this << "::OnStackedLayerContentChanged()";
+
+  UpdateButtonsState();
+}
+
+/*******************************************************************************/
+void
+LayerStackController
+::OnStackedLayerContentReset()
+{
+  // qDebug() << this << "::OnStackedLayerContentChanged()";
+
+  UpdateButtonsState();
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx
new file mode 100644
index 0000000..83a0805
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackItemModel.cxx
@@ -0,0 +1,1076 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdLayerStackItemModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractLayerModel.h"
+#include "mvdStackedLayerModel.h"
+#include "mvdVectorImageModel.h"
+#include "mvdVisibleInterface.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::LayerStackItemModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+
+const char * const
+HEADERS[ LayerStackItemModel::COLUMN_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Proj" ),
+  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", "Red" ),
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Green" ),
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Blue" ),
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "X" ),
+  QT_TRANSLATE_NOOP( "mvd::LayerStackItemModel", "Y" ),
+};
+
+} // end of anonymous namespace.
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+/*****************************************************************************/
+const AbstractLayerModel *
+LayerStackItemModel
+::GetLayer( const QModelIndex & index )
+{
+  assert( index.isValid() );
+  assert( !index.parent().isValid() );
+
+  assert(
+    index.internalPointer()==
+    static_cast< const AbstractLayerModel * >( index.internalPointer() )
+  );
+
+  return
+    static_cast< const AbstractLayerModel * >( index.internalPointer() );
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+LayerStackItemModel
+::LayerStackItemModel( QObject* p ) :
+  QAbstractItemModel( p ),
+  m_StackedLayerModel( NULL )
+{
+  // QObject::connect(
+  //   this,
+  //   SIGNAL( modelAboutToBeReset() ),
+  //   // to:
+  //   this,
+  //   SLOT( OnModelAboutToBeReset() )
+  // );
+
+  // QObject::connect(
+  //   this,
+  //   SIGNAL( modelReset() ),
+  //   // to:
+  //   this,
+  //   SLOT( OnModelReset() )
+  // );
+}
+
+/*****************************************************************************/
+LayerStackItemModel
+::~LayerStackItemModel()
+{
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::Connect( AbstractLayerModel * layer )
+{
+  assert( layer!=NULL );
+
+  QObject::connect(
+    layer,
+    SIGNAL( VisibilityChanged( AbstractLayerModel *, bool ) ),
+    // to:*
+    this,
+    SLOT( OnLayerVisibilityChanged( AbstractLayerModel *, bool ) )
+  );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    QObject::connect(
+      layer,
+      SIGNAL( SettingsUpdated( AbstractImageModel * ) ),
+      // to:
+      this,
+      SLOT( OnImageSettingsUpdated( AbstractImageModel * ) )
+    );
+    }
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::Disconnect( AbstractLayerModel * layer )
+{
+  assert( layer!=NULL );
+
+  QObject::disconnect(
+    layer,
+    SIGNAL( VisibilityChanged( AbstractLayerModel *,  bool ) ),
+    // from:
+    this,
+    SLOT( OnLayerVisibilityChanged( AbstractLayerModel *, bool ) )
+  );
+
+  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+    {
+    QObject::disconnect(
+      layer,
+      SIGNAL( SettingsUpdated( AbstractImageModel * ) ),
+      // from:
+      this,
+      SLOT( OnImageSettingsUpdated( AbstractImageModel * ) )
+    );
+    }
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::SetStack( StackedLayerModel * model )
+{
+  // emit layoutAboutToBeChanged();
+
+  if( m_StackedLayerModel!=NULL )
+    {
+    for( StackedLayerModel::ConstIterator it( m_StackedLayerModel->Begin() );
+         it!=m_StackedLayerModel->End();
+         ++it )
+    Disconnect( it->second );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( ContentAboutToBeReset() ),
+      // from:
+      this,
+      SIGNAL( modelAboutToBeReset() )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( ContentReset() ),
+      // from:
+      this,
+      SIGNAL( modelReset() )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( LayerAdded( size_t ) ),
+      // from: 
+      this,
+      SLOT( OnLayerAdded( size_t ) )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( LayerAboutToBeDeleted( size_t ) ),
+      // from: 
+      this,
+      SLOT( OnLayerAboutToBeDeleted( size_t ) )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( LayerDeleted( size_t ) ),
+      // from: 
+      this,
+      SLOT( OnLayerDeleted( size_t ) )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( OrderAboutToBeChanged() ),
+      // from:
+      this,
+      SIGNAL( layoutAboutToBeChanged() )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( OrderChanged() ),
+      // from:
+      this,
+      SIGNAL( layoutChanged() )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( ReferenceChanged( size_t ) ),
+      // from:
+      this,
+      SLOT( OnReferenceChanged( size_t ) )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( PixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & ) ),
+      // from:
+      this,
+      SLOT( OnPixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & ) )
+    );
+
+    QObject::disconnect(
+      m_StackedLayerModel,
+      SIGNAL( ResolutionsChanged( const PixelInfo::Vector & ) ),
+      // from:
+      this,
+      SLOT( ResolutionsChanged( const PixelInfo::Vector & ) )
+    );
+    }
+
+  m_StackedLayerModel = model;
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( ContentAboutToBeReset() ),
+    // to:
+    this,
+    SIGNAL( modelAboutToBeReset() )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( ContentReset() ),
+    // to:
+    this,
+    SIGNAL( modelReset() )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( LayerAdded( size_t ) ),
+    // to: 
+    this,
+    SLOT( OnLayerAdded( size_t ) )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( LayerAboutToBeDeleted( size_t ) ),
+    // to: 
+    this,
+    SLOT( OnLayerAboutToBeDeleted( size_t ) )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( LayerDeleted( size_t ) ),
+    // to: 
+    this,
+    SLOT( OnLayerDeleted( size_t ) )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( OrderAboutToBeChanged() ),
+    // to:
+    this,
+    SIGNAL( layoutAboutToBeChanged() )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( OrderChanged() ),
+    // to:
+    this,
+    SIGNAL( layoutChanged() )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( ReferenceChanged( size_t ) ),
+    // to:
+    this,
+    SLOT( OnReferenceChanged( size_t ) )
+  );
+
+  QObject::connect(
+    m_StackedLayerModel,
+    SIGNAL( PixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & ) ),
+    // to:
+    this,
+    SLOT( OnPixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & ) )
+  );
+
+    QObject::connect(
+      m_StackedLayerModel,
+      SIGNAL( ResolutionsChanged( const PixelInfo::Vector & ) ),
+      // to:
+      this,
+      SLOT( OnResolutionsChanged( const PixelInfo::Vector & ) )
+    );
+
+  for( StackedLayerModel::ConstIterator it( m_StackedLayerModel->Begin() );
+       it!=m_StackedLayerModel->End();
+       ++it )
+    Connect( it->second );
+
+  // emit layoutChanged();
+}
+
+/*****************************************************************************/
+/* QAbstractItemModel overloads                                              */
+/*****************************************************************************/
+int
+LayerStackItemModel
+::columnCount( const QModelIndex & ) const
+{
+  // qDebug() << this << "::columnCount(" << parent << ")";
+
+  return COLUMN_COUNT;
+}
+
+/*****************************************************************************/
+QVariant
+LayerStackItemModel
+::data( const QModelIndex & idx, int role ) const
+{
+  // qDebug() << this << "::data(" << idx << "," << role << ")";
+
+  // Get layer.
+  assert( m_StackedLayerModel!=NULL );
+
+  assert( idx.isValid() );
+  assert( !idx.parent().isValid() );
+  assert( idx.internalPointer()!=NULL );
+
+  const AbstractLayerModel * layer =
+    static_cast< const AbstractLayerModel * >( idx.internalPointer() );
+
+  assert( layer!=NULL );
+
+  // Return data given role.
+  switch( role )
+    {
+    case Qt::CheckStateRole:
+      if( idx.column()!=COLUMN_NAME )
+        return QVariant();
+      else
+        {
+        assert( layer==dynamic_cast< const VisibleInterface * >( layer ) );
+
+        const VisibleInterface * interface =
+          dynamic_cast< const VisibleInterface * >( layer );
+
+        assert( interface!=NULL );
+
+        return
+          interface->IsVisible()
+          ? Qt::Checked
+          : Qt::Unchecked;
+        }
+      break;
+
+    case Qt::DisplayRole:
+      switch( idx.column() )
+        {
+        case COLUMN_PROJ:
+	  return FromStdString( layer->GetAuthorityCode( true ) );
+	  break;
+
+	case COLUMN_RESOLUTION:
+	{
+	const PixelInfo::Vector & pixels = m_StackedLayerModel->PixelInfos();
+
+	assert( idx.row()>=0 );
+
+	if( idx.row()>=0 &&
+	    static_cast< size_t >( idx.row() )<pixels.size() &&
+	    pixels[ idx.row() ].m_HasResolution )
+	  return
+	    static_cast< qlonglong >( pixels[ idx.row() ].m_Resolution );
+	else
+	  return QVariant();
+	}
+	break;
+
+        case COLUMN_NAME:
+          if( layer->inherits(
+                VectorImageModel::staticMetaObject.className() ) )
+            {
+            const VectorImageModel * vectorImageModel =
+              qobject_cast< const VectorImageModel * >( layer );
+            assert( vectorImageModel!=NULL );
+
+            // qDebug() << "filename:" << vectorImageModel->GetFilename();
+
+            return QFileInfo( vectorImageModel->GetFilename() ).fileName();
+            }
+          else
+            {
+            qDebug() << "Unhandled AbstractLayerModel subclass.";
+            }
+          break;
+
+	case COLUMN_EFFECT:
+          if( layer->inherits(
+                VectorImageModel::staticMetaObject.className() ) )
+            {
+            const VectorImageModel * vectorImageModel =
+              qobject_cast< const VectorImageModel * >( layer );
+            assert( vectorImageModel!=NULL );
+
+	    return vectorImageModel->GetSettings().GetEffectName();
+            }
+          else
+            {
+            qDebug() << "Unhandled AbstractLayerModel subclass.";
+            }
+	  break;
+
+	case COLUMN_I:
+	case COLUMN_J:
+	{
+	const PixelInfo::Vector & pixels = m_StackedLayerModel->PixelInfos();
+
+	assert( idx.row()>=0 );
+
+	if( idx.row()>=0 &&
+	    static_cast< size_t >( idx.row() )<pixels.size() &&
+	    pixels[ idx.row() ].m_HasIndex )
+	  return
+	    static_cast< qlonglong >( pixels[ idx.row() ].m_Index[ idx.column() - COLUMN_I ] );
+	else
+	  return QVariant();
+	}
+	break;
+
+	case COLUMN_R:
+	case COLUMN_G:
+	case COLUMN_B:
+	{
+	const PixelInfo::Vector & pixels = m_StackedLayerModel->PixelInfos();
+
+	assert( idx.row()>=0 );
+
+	if( idx.row()>=0 &&
+	    static_cast< size_t >( idx.row() )<pixels.size() &&
+	    pixels[ idx.row() ].m_HasPixel )
+	  return
+	    pixels[ idx.row() ].m_Pixel[ idx.column() - COLUMN_R ];
+	}
+	break;
+
+	case COLUMN_X:
+	case COLUMN_Y:
+	{
+	const PixelInfo::Vector & pixels = m_StackedLayerModel->PixelInfos();
+
+	assert( idx.row()>=0 );
+
+	if( idx.row()>=0 &&
+	    static_cast< size_t >( idx.row() )<pixels.size() &&
+	    pixels[ idx.row() ].m_HasPoint )
+	  return
+	    pixels[ idx.row() ].m_Point[ idx.column() - COLUMN_X ];
+	}
+	  break;
+
+	default:
+	  break;
+        }
+      break;
+    
+    case Qt::FontRole:
+      assert( idx.row()>=0 );
+
+      if( static_cast< StackedLayerModel::SizeType >( idx.row() )==
+	  m_StackedLayerModel->GetReferenceIndex() )
+	{
+	QFont font;
+
+	font.setBold( true );
+
+	return font;
+	}
+      break;
+
+    case Qt::ToolTipRole:
+      switch( idx.column() )
+	{
+	case COLUMN_NAME:
+	  if( layer->inherits( VectorImageModel::staticMetaObject.className() ) )
+	    {
+            const VectorImageModel * vectorImageModel =
+              qobject_cast< const VectorImageModel * >( layer );
+            assert( vectorImageModel!=NULL );
+
+            // qDebug() << "filename:" << vectorImageModel->GetFilename();
+
+            return vectorImageModel->GetFilename();
+	    }
+	  break;
+	}
+      break;
+
+    default:
+      break;
+    }
+
+  return QVariant();
+}
+
+/*****************************************************************************/
+bool
+LayerStackItemModel
+::dropMimeData( const QMimeData * dat,
+                Qt::DropAction action,
+                int row,
+                int column,
+                const QModelIndex & p )
+{
+  // qDebug()
+  //   << this
+  //   << "::dropMimeData("
+  //   << dat << "," << action << "," << row << "," << column << "," << parent
+  //   << ")";
+
+  // qDebug() << "QMimeData::formats():" << dat->formats();
+
+  return QAbstractItemModel::dropMimeData( dat, action, row, column, p );
+}
+
+/*****************************************************************************/
+Qt::ItemFlags
+LayerStackItemModel
+::flags( const QModelIndex & idx ) const
+{
+  if( !idx.isValid() )
+    return QAbstractItemModel::flags( idx );
+
+  Qt::ItemFlags iflags =
+    QAbstractItemModel::flags( idx )
+    // | Qt::ItemIsDragEnabled
+    // | Qt::ItemIsDropEnabled
+    ;
+
+  if( idx.column()==COLUMN_NAME )
+    iflags |=
+        Qt::ItemIsUserCheckable
+      | Qt::ItemIsEditable
+      | Qt::ItemIsDragEnabled;
+
+  return iflags;
+}
+
+/*****************************************************************************/
+bool
+LayerStackItemModel
+::hasChildren( const QModelIndex & idx ) const
+{
+  return !idx.isValid();
+}
+
+/*****************************************************************************/
+QVariant
+LayerStackItemModel
+::headerData( int section,
+              Qt::Orientation /**orientation*/,
+              int role ) const
+{
+  // qDebug()
+  //   << this << "::headerData("
+  //   << section << "," << orientation << "," << role
+  //   << ")";
+
+  // assert( orientation==Qt::Horizontal );
+
+  switch( role )
+    {
+    case Qt::DisplayRole:
+      assert( section>=0 && section<COLUMN_COUNT );
+      return tr( HEADERS[ section ] );
+      break;
+
+    default:
+      break;
+    }
+
+  /*
+  switch( orientation )
+    {
+    case Qt::Horizontal:
+      switch( role )
+        {
+        case Qt::DisplayRole:
+          assert( section>=0 && section<COLUMN_COUNT );
+          return tr( HEADERS[ section ] );
+          break;
+        default:
+          break;
+        }
+      break;
+
+    case Qt::Vertical:
+      break;
+
+    default:
+      assert( false && "Unhandled Qt::Orientation value." );
+      break;
+    }
+  */
+
+  return QVariant();
+}
+
+/*****************************************************************************/
+QModelIndex
+LayerStackItemModel
+::index( int row,
+         int column,
+         const QModelIndex & p ) const
+{
+  // qDebug()
+  //   << this << "::index(" << row << "," << column << "," << parent << ")";
+
+  assert( m_StackedLayerModel!=NULL );
+
+  // qDebug()
+  //   << "index:" << row << "," << column << "," << m_StackedLayerModel->At( row );
+
+  assert( row>=0 && column>=0 );
+
+#if 1
+  AbstractLayerModel * layer = m_StackedLayerModel->At( row );
+
+  if( layer==NULL || p.isValid() )
+    return QModelIndex();
+#endif
+
+  return
+    createIndex(
+      row,
+      column,
+      p.isValid()
+      ? NULL
+      : m_StackedLayerModel->At( row )
+    );
+}
+
+/*****************************************************************************/
+bool
+LayerStackItemModel
+::insertRows( int row, int count, const QModelIndex & p )
+{
+  assert( !p.isValid() );
+  assert( count==1 );
+
+  if( p.isValid() || count!=1 )
+    return false;
+
+  beginInsertRows( p, row, row + count - 1 );
+  {
+  // StackedLayerModel has already been grown.
+
+  // TODO: Allocate additional row data here.
+  }
+  endInsertRows();
+
+  // emit dataChanged( index( row, 0 ), index( last, columnCount() - 1 ) );
+
+  return true;
+}
+
+/*****************************************************************************/
+QMimeData *
+LayerStackItemModel
+::mimeData( const QModelIndexList & indexes ) const
+{
+  QMimeData * mData = QAbstractItemModel::mimeData( indexes );
+  assert( mData!=NULL );
+
+  typedef QList< QUrl > UrlList;
+
+  UrlList urls;
+
+  foreach( const QModelIndex & idx, indexes )
+    if( idx.isValid() )
+      {
+      assert( idx.internalPointer()!=NULL );
+
+      AbstractLayerModel * layer =
+	static_cast< AbstractLayerModel * >( idx.internalPointer() );
+
+      FilenameInterface * interface =
+	dynamic_cast< FilenameInterface * >( layer );
+
+      urls << QUrl::fromLocalFile( interface->GetFilename() );
+      }
+
+  mData->setUrls( urls );
+
+  // qDebug() << this << "mime-data:" << mData;
+
+  return mData;
+}
+
+/*****************************************************************************/
+QStringList
+LayerStackItemModel
+::mimeTypes() const
+{
+  QStringList mTypes( QAbstractItemModel::mimeTypes() );
+
+  mTypes << "text/uri-list";
+
+  // qDebug() << this << "mime-types:" << mTypes;
+
+  return mTypes;
+}
+
+/*****************************************************************************/
+QModelIndex
+LayerStackItemModel
+::parent( const QModelIndex & ) const
+{
+  // qDebug() << this << "::parent(" << index << ")";
+
+  return QModelIndex();
+}
+
+/*****************************************************************************/
+bool
+LayerStackItemModel
+::removeRows( int row, int count, const QModelIndex & p )
+{
+  assert( !p.isValid() );
+  assert( count==1 );
+
+  if( p.isValid() || count!=1 )
+    return false;
+
+  beginRemoveRows( p, row, row + count - 1 );
+  {
+  // StackedLayerModel has already been shortened.
+
+  // TODO: Release additional row data here.
+  }
+  endRemoveRows();
+
+  return true;
+}
+
+/*****************************************************************************/
+int
+LayerStackItemModel
+::rowCount( const QModelIndex & p ) const
+{
+  // qDebug() << this << "::rowCount(" << p << ")";
+
+  // qDebug() << "row-count:" <<
+  //   ( ( m_StackedLayerModel==NULL || p.isValid() )
+  //     ? 0
+  //     : m_StackedLayerModel->GetCount()
+  //   );
+
+  return
+    ( m_StackedLayerModel==NULL || p.isValid() )
+    ? 0
+    : m_StackedLayerModel->GetCount();
+}
+
+/*****************************************************************************/
+bool
+LayerStackItemModel
+::setData( const QModelIndex & idx,
+           const QVariant & value,
+           int role )
+{
+  // qDebug()
+  //   << this << "::setData(" << idx << "," << value << "," << role << ")";
+
+  if( idx.column()==COLUMN_NAME && role==Qt::CheckStateRole )
+    {
+    // qDebug() << idx.row() << "check-state:" << value;
+
+    assert( !idx.parent().isValid() );
+    assert( idx.internalPointer()!=NULL );
+
+    assert( idx.internalPointer()!=NULL );
+
+    AbstractLayerModel * layer =
+      static_cast< AbstractLayerModel * >( idx.internalPointer() );
+
+    assert( layer!=NULL );
+    assert( layer==dynamic_cast< VisibleInterface * >( layer ) );
+
+    VisibleInterface * interface = dynamic_cast< VisibleInterface * >( layer );
+    assert( interface!=NULL );
+
+    switch( value.toInt() )
+      {
+      case Qt::Checked:
+        interface->SetVisible( true );
+        break;
+
+      case Qt::Unchecked:
+        interface->SetVisible( false );
+        break;
+
+      default:
+        assert( false && "Unhandled Qt::CheckedState value." );
+        break;
+      }
+
+    emit dataChanged( idx, idx );
+
+    return true;
+    }
+
+  return false;
+}
+
+/*****************************************************************************/
+Qt::DropActions
+LayerStackItemModel
+::supportedDropActions() const
+{
+  // qDebug() << this << "::supportedDropActions()";
+
+  // return Qt::MoveAction;
+  return QAbstractItemModel::supportedDropActions();
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+// void
+// LayerStackItemModel
+// ::OnContentAboutToBeChanged()
+// {
+//   qDebug() << this << "::OnAboutContentChanged()";
+
+//   emit layoutAboutToBeChanged();
+// }
+
+/*****************************************************************************/
+// void
+// LayerStackItemModel
+// ::OnContentChanged()
+// {
+//   qDebug() << this << "::OnContentChanged()";
+
+//   // assert( m_StackedLayerModel!=NULL );
+
+//   // beginResetModel();
+//   // {
+//   // }
+//   // endResetModel();
+
+//   // if( m_StackedLayerModel->GetCount()>0 )
+//   //   emit dataChanged(
+//   //     index( 0, 0 ),
+//   //     index( m_StackedLayerModel->GetCount() - 1, COLUMN_COUNT -1 )
+//   //   );
+
+//   emit layoutChanged();
+// }
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnImageSettingsUpdated( AbstractImageModel * image )
+{
+  // qDebug() << this << "::OnImageSettingsUpdated(" << image << ")";
+
+  assert( m_StackedLayerModel!=NULL );
+
+  StackedLayerModel::SizeType row = m_StackedLayerModel->IndexOf( image );
+
+  assert( row!=StackedLayerModel::NIL_INDEX );
+
+  emit dataChanged(
+    createIndex( row, LayerStackItemModel::COLUMN_EFFECT, image ),
+    createIndex( row, LayerStackItemModel::COLUMN_EFFECT, image )
+  );
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnLayerAboutToBeDeleted( size_t idx )
+{
+  assert( m_StackedLayerModel!=NULL );
+
+  Disconnect( m_StackedLayerModel->At( idx ) );
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnLayerAdded( size_t idx )
+{
+  if( !insertRow( idx ) )
+    {
+    assert( false && "QAbstractItemModel::insertRow() failed!" );
+    return;
+    }
+
+  assert( m_StackedLayerModel!=NULL );
+
+  Connect( m_StackedLayerModel->At( idx ) );
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnLayerDeleted( size_t idx )
+{
+#ifdef OTB_DEBUG
+  bool isRowRemoved =
+#endif
+
+  removeRow( idx );
+
+#ifdef OTB_DEBUG
+  assert( isRowRemoved && "QAbstractItemModel::removeRow() failed!" );
+#endif
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnLayerVisibilityChanged( AbstractLayerModel * layer, bool )
+{
+  // qDebug() << this << "::OnLayerVisibilityChanged(" << layer << "," << isVisible << ")"; 
+
+  assert( m_StackedLayerModel!=NULL );
+  assert( m_StackedLayerModel->IndexOf( layer )!=StackedLayerModel::NIL_INDEX );
+
+  QModelIndex idx(
+    createIndex(
+      m_StackedLayerModel->IndexOf( layer ),
+      COLUMN_NAME,
+      layer
+    )
+  );
+
+  emit dataChanged( idx, idx );
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnPixelInfoChanged( const QPoint &, const PointType &, const PixelInfo::Vector & pixels )
+{
+  if( pixels.empty() )
+    return;
+
+  emit dataChanged(
+    index( 0, COLUMN_I ),
+    index( pixels.size() - 1, COLUMN_COUNT - 1 )
+  );
+}
+
+/*****************************************************************************/
+// void
+// LayerStackItemModel
+// ::OnModelAboutToBeReset()
+// {
+//   qDebug() << this << "::OnModelAboutToBeReset()";
+// }
+
+/*****************************************************************************/
+// void
+// LayerStackItemModel
+// ::OnModelReset()
+// {
+//   qDebug() << this << "::OnModelReset()";
+// }
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnReferenceChanged( size_t idx )
+{
+  // qDebug() << this << "::OnReferenceChanged(" << idx << ")";
+
+  assert( m_StackedLayerModel!=NULL );
+
+  AbstractLayerModel * layer = m_StackedLayerModel->GetReference();
+
+  assert( LayerStackItemModel::COLUMN_COUNT>0 );
+
+  emit dataChanged(
+    createIndex( idx, 0, layer ),
+    createIndex( idx, LayerStackItemModel::COLUMN_COUNT - 1, layer )
+  );
+}
+
+/*****************************************************************************/
+void
+LayerStackItemModel
+::OnResolutionsChanged( const PixelInfo::Vector & pixels )
+{
+  if( pixels.empty() )
+    return;
+
+  emit dataChanged(
+    index( 0, COLUMN_RESOLUTION ),
+    index( pixels.size() - 1, COLUMN_RESOLUTION )
+  );
+}
+
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx
new file mode 100644
index 0000000..c52a9fe
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.cxx
@@ -0,0 +1,441 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdLayerStackWidget.h"
+#include "ui_mvdLayerStackWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdGui.h"
+#include "mvdLayerStackItemModel.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::LayerStackWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+LayerStackWidget
+::LayerStackWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::LayerStackWidget() )
+{
+  m_UI->setupUi( this );
+
+  m_UI->reloadButton->setVisible( false );
+  m_UI->treeView->setDragEnabled( true );
+
+  {
+  QItemSelectionModel * ism = m_UI->treeView->selectionModel();
+
+  m_UI->treeView->setModel( new LayerStackItemModel( m_UI->treeView ) );
+
+  delete ism;
+  ism = NULL;
+  }
+
+  InstallEventFilter( this );
+
+  QObject::connect(
+    m_UI->treeView->selectionModel(),
+    SIGNAL( currentRowChanged( const QModelIndex &,  const QModelIndex & ) ),
+    // to:
+    this,
+    SLOT( OnCurrentRowChanged( const QModelIndex &, const QModelIndex & ) )
+    );
+
+  QObject::connect(
+    m_UI->treeView->selectionModel(),
+    SIGNAL( selectionChanged( const QItemSelection &,  const QItemSelection & ) ),
+    // to:
+    this,
+    SLOT( OnSelectionChanged( const QItemSelection &, const QItemSelection & ) )
+    );
+
+  QObject::connect(
+    m_UI->topButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( TopButtonClicked() )
+  );
+
+  QObject::connect(
+    m_UI->bottomButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( BottomButtonClicked() )
+  );
+
+  QObject::connect(
+    m_UI->upButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( UpButtonClicked() )
+  );
+
+  QObject::connect(
+    m_UI->downButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( DownButtonClicked() )
+  );
+
+  QObject::connect(
+    m_UI->deleteButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( DeleteLayerRequested() )
+  );
+
+  QObject::connect(
+    m_UI->deleteAllButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( DeleteAllLayersRequested() )
+  );
+
+  QObject::connect(
+    m_UI->projectionButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( ProjectionButtonClicked() )
+  );
+
+  QObject::connect(
+    m_UI->applyButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SIGNAL( ApplyButtonClicked() )
+  );
+}
+
+/*******************************************************************************/
+LayerStackWidget
+::~LayerStackWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+bool
+LayerStackWidget
+::eventFilter( QObject * object, QEvent * e )
+{
+  assert( object==m_UI->treeView );
+  assert( e!=NULL );
+
+  if( object!=m_UI->treeView )
+    return false;
+
+  switch( e->type() )
+    {
+    //
+    // KEY RELEASE
+    case QEvent::KeyRelease :
+    {
+    QKeyEvent * keyEvent = dynamic_cast< QKeyEvent * >( e );
+    assert( keyEvent!=NULL );
+
+    switch( keyEvent->key() )
+      {
+      case Qt::Key_C:
+	if( keyEvent->modifiers()==Qt::ControlModifier &&
+	    m_UI->treeView->currentIndex().isValid() )
+	  {
+	  emit CopyLayerRequested(
+	    LayerStackItemModel::GetLayer(
+	      m_UI->treeView->currentIndex()
+	    )
+	  );
+
+	  return true;
+	  }
+	break;
+      //
+      case Qt::Key_Delete:
+	if( keyEvent->modifiers()==Qt::NoModifier )
+	  {
+	  emit DeleteLayerRequested();
+
+	  return true;
+	  }
+	else if( keyEvent->modifiers()==Qt::ShiftModifier )
+	  {
+	  emit DeleteAllLayersRequested();
+
+	  return true;
+	  }
+	break;
+      }
+    }
+    break;
+    //
+    // MOUSE-WHEEL
+    case QEvent::Wheel :
+    {
+    QWheelEvent * wEvent = dynamic_cast< QWheelEvent * >( e );
+    assert( wEvent!=NULL );
+
+    if( wEvent->modifiers()==Qt::ControlModifier )
+      {
+      emit RotateLayersRequested(
+    	wEvent->delta() / (MOUSE_WHEEL_STEP_FACTOR * MOUSE_WHEEL_STEP_DEGREES)
+      );
+
+      return true;
+      }
+    }
+    break;
+    //
+    // other.
+    default:
+      break;
+    }
+
+  return false;
+}
+
+/*******************************************************************************/
+const LayerStackItemModel *
+LayerStackWidget
+::GetItemModel() const
+{
+  return const_cast< LayerStackWidget * >( this )->GetItemModel();
+}
+
+/*******************************************************************************/
+LayerStackItemModel *
+LayerStackWidget
+::GetItemModel()
+{
+  assert(
+    m_UI->treeView->model()==
+    qobject_cast< LayerStackItemModel * >( m_UI->treeView->model() )
+    );
+
+  return qobject_cast< LayerStackItemModel * >( m_UI->treeView->model() );
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::InstallEventFilter( QObject * filter )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->treeView!=NULL );
+
+  m_UI->treeView->installEventFilter( filter );
+}
+
+/*******************************************************************************/
+// void
+// LayerStackWidget
+// ::SetModel( LayerStackItemModel * itemModel )
+// {
+//   // See http://qt-project.org/doc/qt-4.8/qabstractitemview.html#setModel .
+//   QItemSelectionModel * itemSelectionModel = m_UI->treeView->selectionModel();
+
+//   m_UI->treeView->setModel( itemModel );
+
+//   itemModel->setParent( m_UI->treeView );
+
+//   delete itemSelectionModel;
+//   itemSelectionModel = NULL;
+// }
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::SetApplyEnabled( bool enabled )
+{
+  assert( m_UI->applyButton!=NULL );
+
+  m_UI->applyButton->setEnabled( enabled );
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::SetCurrent( int row )
+{
+  assert( m_UI->treeView->selectionModel()!=NULL );
+
+  // if( m_UI->treeView->selectionModel()->currentIndex().row()==row )
+  //   return;
+
+  if( row<0 )
+    m_UI->treeView->selectionModel()->clearSelection();
+
+  else
+    m_UI->treeView->selectionModel()->select(
+      m_UI->treeView->model()->index( row, 1 ),
+      QItemSelectionModel::ClearAndSelect |
+      QItemSelectionModel::Rows
+  );
+
+  /*
+  m_UI->treeView->selectionModel()->setCurrentIndex(
+    m_UI->treeView->model()->index( row, 1 ),
+    QItemSelectionModel::ClearAndSelect |
+    // QItemSelectionModel::Current |
+    QItemSelectionModel::Rows
+  );
+  */
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::SetDeleteEnabled( bool enabled )
+{
+  assert( m_UI!=NULL );
+
+
+  assert( m_UI->deleteButton!=NULL );
+
+  m_UI->deleteButton->setEnabled( enabled );
+
+
+  assert( m_UI->deleteAllButton!=NULL );
+
+  m_UI->deleteAllButton->setEnabled( enabled );
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::SetMoveEnabled( bool enabled )
+{
+  assert( m_UI!=NULL );
+
+  assert( m_UI->upButton!=NULL );
+  assert( m_UI->downButton!=NULL );
+  assert( m_UI->topButton!=NULL );
+  assert( m_UI->bottomButton!=NULL );
+
+  m_UI->upButton->setEnabled( enabled );
+  m_UI->downButton->setEnabled( enabled );
+  m_UI->topButton->setEnabled( enabled );
+  m_UI->bottomButton->setEnabled( enabled );
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::SetProjectionEnabled( bool enabled )
+{
+  assert( m_UI!=NULL );
+
+  assert( m_UI->projectionButton!=NULL );
+
+  m_UI->projectionButton->setEnabled( enabled );
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::SetReloadEnabled( bool enabled )
+{
+  assert( m_UI!=NULL );
+
+  assert( m_UI->reloadButton!=NULL );
+
+  m_UI->reloadButton->setEnabled( enabled );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+LayerStackWidget
+::OnCurrentRowChanged( const QModelIndex & current,
+                       const QModelIndex & )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnCurrentRowChange(" << current.row() << "," << previous.row() << ")";
+
+  emit CurrentChanged( current.row() );
+}
+
+/*******************************************************************************/
+void
+LayerStackWidget
+::OnSelectionChanged( const QItemSelection & selected,
+                      const QItemSelection & )
+{
+  // qDebug()
+  //   << this
+  //   << "::OnSelectionChanged(" << selected << "," << deselected << ")";
+
+  QModelIndexList indexes( selected.indexes() );
+  // assert( indexes.empty() || indexes.size()==1 );
+
+  emit SelectionChanged(
+    indexes.empty()
+    ? -1
+    : indexes.front().row()
+  );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui
new file mode 100644
index 0000000..3e76944
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdLayerStackWidget.ui
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::LayerStackWidget</class>
+ <widget class="QWidget" name="mvd::LayerStackWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>305</width>
+    <height>124</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="margin">
+    <number>3</number>
+   </property>
+   <property name="spacing">
+    <number>3</number>
+   </property>
+   <item row="1" column="0">
+    <widget class="QTreeView" name="treeView">
+     <property name="locale">
+      <locale language="C" country="AnyCountry"/>
+     </property>
+     <property name="dragEnabled">
+      <bool>false</bool>
+     </property>
+     <property name="dragDropMode">
+      <enum>QAbstractItemView::InternalMove</enum>
+     </property>
+     <property name="defaultDropAction">
+      <enum>Qt::CopyAction</enum>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QToolButton" name="topButton">
+       <property name="toolTip">
+        <string>Move selected layer to top of stack</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerTop_Icon</normaloff>:/icons/action_LayerTop_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="upButton">
+       <property name="toolTip">
+        <string>Move selected layer up within the stack</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerUp_Icon</normaloff>:/icons/action_LayerUp_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="downButton">
+       <property name="toolTip">
+        <string>Move selected layer down within the stack</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerDown_Icon</normaloff>:/icons/action_LayerDown_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="bottomButton">
+       <property name="toolTip">
+        <string>Move selected layer to bottom of stack</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerBottom_Icon</normaloff>:/icons/action_LayerBottom_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="projectionButton">
+       <property name="toolTip">
+        <string>Use selected layer as projection reference</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerProjection_Icon</normaloff>:/icons/action_LayerProjection_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="applyButton">
+       <property name="toolTip">
+        <string>Apply all display settings (color-setup, color-dynamics, shader etc.) of selected layer to all other layers</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_ApplyAll_Icon</normaloff>:/icons/action_ApplyAll_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="reloadButton">
+       <property name="toolTip">
+        <string>Reload data file</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_Reload_Icon</normaloff>:/icons/action_Reload_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </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 resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerDeleteAll_Icon</normaloff>:/icons/action_LayerDeleteAll_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="deleteButton">
+       <property name="toolTip">
+        <string>Delete selected layer</string>
+       </property>
+       <property name="locale">
+        <locale language="C" country="AnyCountry"/>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../Application/Monteverdi/mvdMainWindow.qrc">
+         <normaloff>:/icons/action_LayerDelete_Icon</normaloff>:/icons/action_LayerDelete_Icon</iconset>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../../Application/Monteverdi/mvdMainWindow.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdMainWindowTitleLoader.cxx b/Modules/Visualization/MonteverdiGui/src/mvdMainWindowTitleLoader.cxx
new file mode 100644
index 0000000..6ecf115
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdMainWindowTitleLoader.cxx
@@ -0,0 +1,95 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  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 "mvdMainWindowTitleLoader.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdVectorImageModel.h"
+
+namespace mvd
+{
+
+MainWindowTitleLoader
+::MainWindowTitleLoader(VectorImageModel* model):
+  m_Model(model)
+{
+}
+
+void
+MainWindowTitleLoader
+::LoadTitle()
+{
+  // This method is executed in a separate thread
+
+  assert( m_Model!=NULL );
+
+#if 0
+  std::ostringstream oss;
+  oss<<PROJECT_NAME<<" - "<<otb::System::GetShortFileName( QFile::encodeName( m_Model->GetFilename() ));
+  oss<<" ("<<m_Model->GetNbComponents()<<tr(" bands, ").toLatin1().constData();
+  oss<<m_Model->GetNativeLargestRegion().GetSize()[0];
+  oss<<"x"<<m_Model->GetNativeLargestRegion().GetSize()[1]<<tr(" pixels)").toLatin1().constData();
+  
+  emit TitleLoaded(FromStdString(oss.str()) );
+
+  // add the placename to the title if any
+  std::string placename = m_Model->GetCenterPixelPlaceName();
+  if (!placename.empty())
+    {
+    oss <<" - " <<ToStdString( tr("Location") )<< " : " << placename;
+    emit TitleLoaded(FromStdString(oss.str()) );
+    }
+
+#else
+  SizeType size( m_Model->GetNativeLargestRegion().GetSize() );
+
+  QString placename( FromStdString( m_Model->GetCenterPixelPlaceName() ) );
+
+  QString title(
+    tr( PROJECT_NAME " - %1 (%2 bands, %3x%4 pixels)%5" )
+    .arg( QFileInfo( m_Model->GetFilename() ).fileName() )
+    .arg( m_Model->GetNbComponents() )
+    .arg( size[ 0 ] )
+    .arg( size[ 1 ] )
+    .arg( placename.isEmpty() ? "" : placename.prepend( " " ) )
+  );
+
+  qDebug() << "Title:" << title;
+
+  emit TitleLoaded( title );
+
+#endif
+
+  emit Finished();
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdMultiResolutionPyramidWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdMultiResolutionPyramidWidget.cxx
new file mode 100644
index 0000000..b8f530d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdMultiResolutionPyramidWidget.cxx
@@ -0,0 +1,433 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdMultiResolutionPyramidWidget.h"
+#include "ui_mvdMultiResolutionPyramidWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+#include <cmath>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdCore.h"
+#include "mvdGui.h"
+#include "mvdI18nCoreApplication.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::MultiResolutionPyramidWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+char const * const
+GDAL_RESAMPLING_NAMES[ otb::GDAL_RESAMPLING_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "None" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "Nearest" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "Gauss" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "Cubic" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "Average" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "Mode" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "Average Mag/Phase" ),
+};
+
+
+char const * const
+GDAL_COMPRESSION_NAMES[ otb::GDAL_COMPRESSION_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "None" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "JPEG" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "LZW" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "PACKBITS" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "DEFLATE" ),
+};
+
+
+char const * const
+GDAL_FORMAT_NAMES[ otb::GDAL_FORMAT_COUNT ] =
+{
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "ERDAS" ),
+  QT_TRANSLATE_NOOP( "mvd::MultiResolutionPyramidWidget", "GeoTIFF" ),
+};
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+MultiResolutionPyramidWidget
+::MultiResolutionPyramidWidget( QWidget * p, Qt::WindowFlags flags ) :
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::MultiResolutionPyramidWidget() )
+{
+  m_UI->setupUi( this );
+
+  {
+  QItemSelectionModel * ism = m_UI->resolutionsListView->selectionModel();
+
+  m_UI->resolutionsListView->setModel(
+    new QStandardItemModel( m_UI->resolutionsListView )
+  );
+
+  delete ism;
+  ism = NULL;
+  }
+
+  AddItemsInto(
+    m_UI->formatComboBox,
+    "mvd::MultiResolutionPyramidWidget",
+    GDAL_FORMAT_NAMES,
+    otb::GDAL_FORMAT_COUNT
+  );
+
+  AddItemsInto(
+    m_UI->algorithmComboBox,
+    "mvd::MultiResolutionPyramidWidget",
+    GDAL_RESAMPLING_NAMES,
+    otb::GDAL_RESAMPLING_COUNT
+  );
+
+  AddItemsInto(
+    m_UI->compressionComboBox,
+    "mvd::MultiResolutionPyramidWidget",
+    GDAL_COMPRESSION_NAMES,
+    otb::GDAL_COMPRESSION_COUNT
+  );
+
+  m_UI->baseSpinBox->setValue( 2 );
+
+  m_UI->levelsSpinBox->setValue( 1 );
+
+  m_UI->sizeSpinBox->setValue( 2 );
+}
+
+/*****************************************************************************/
+MultiResolutionPyramidWidget
+::~MultiResolutionPyramidWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::ClearResolutions()
+{
+  QStandardItemModel * itemModel =
+    qobject_cast< QStandardItemModel * >( m_UI->resolutionsListView->model() );
+
+  assert( itemModel!=NULL );
+
+  itemModel->clear();
+}
+
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::SetBuilder( const otb::GDALOverviewsBuilder::Pointer & p )
+{
+  m_UI->formatComboBox->setCurrentIndex( otb::GDAL_FORMAT_GEOTIFF );
+  m_UI->algorithmComboBox->setCurrentIndex( otb::GDAL_RESAMPLING_AVERAGE );
+  m_UI->compressionComboBox->setCurrentIndex( otb::GDAL_COMPRESSION_NONE );
+
+
+  {
+  bool prevSignalsBlocked = m_UI->baseSpinBox->blockSignals( true );
+
+  m_UI->baseSpinBox->setValue( 2 );
+
+  m_UI->baseSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+  {
+  bool prevSignalsBlocked = m_UI->levelsSpinBox->blockSignals( true );
+
+  m_UI->levelsSpinBox->setValue( 1 );
+
+  m_UI->levelsSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+  {
+  bool prevSignalsBlocked = m_UI->sizeSpinBox->blockSignals( true );
+
+  m_UI->sizeSpinBox->setRange( 1, std::numeric_limits< int >::max() );
+  m_UI->sizeSpinBox->setValue( 1 );
+
+  m_UI->sizeSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+
+  ClearResolutions();
+
+
+  m_GDALOverviewsBuilder = p;
+
+  if( p.IsNull() )
+    return;
+
+  assert( !m_GDALOverviewsBuilder.IsNull() );
+
+
+  m_UI->formatComboBox->setCurrentIndex(
+    m_GDALOverviewsBuilder->GetFormat()
+  );
+
+  m_UI->algorithmComboBox->setCurrentIndex(
+    m_GDALOverviewsBuilder->GetResamplingMethod()
+  );
+
+  m_UI->compressionComboBox->setCurrentIndex(
+    m_GDALOverviewsBuilder->GetCompressionMethod()
+  );
+
+
+  unsigned int minSize =
+    std::min(
+      m_GDALOverviewsBuilder->GetWidth(),
+      m_GDALOverviewsBuilder->GetHeight()
+    );
+
+
+  {
+  bool prevSignalsBlocked = m_UI->baseSpinBox->blockSignals( true );
+
+  m_UI->baseSpinBox->setRange( 2, minSize );
+  m_UI->baseSpinBox->setValue( m_GDALOverviewsBuilder->GetResolutionFactor() );
+
+  m_UI->baseSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+  unsigned int maxResolutions = m_GDALOverviewsBuilder->CountResolutions();
+
+  {
+    bool prevSignalsBlocked = m_UI->levelsSpinBox->blockSignals( true );
+
+    m_UI->levelsSpinBox->setRange( 0, maxResolutions );
+    m_UI->levelsSpinBox->setValue( m_GDALOverviewsBuilder->GetNbResolutions() );
+
+    m_UI->levelsSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+  {
+  bool prevSignalsBlocked = m_UI->sizeSpinBox->blockSignals( true );
+
+  m_UI->sizeSpinBox->setRange( 1, minSize );
+
+  assert( maxResolutions >=
+	  m_GDALOverviewsBuilder->GetNbResolutions() );
+
+  // Force C++ implicit cast by declaring local variables to force compiler
+  // to find correct std::pow() signature.
+  //
+  // It fixes compile-time:
+  // error: call of pow(unsigned int, unsigned int) is ambiguous
+  double rf = m_GDALOverviewsBuilder->GetResolutionFactor();
+
+  int m = 
+    maxResolutions -
+    m_GDALOverviewsBuilder->GetNbResolutions();
+
+  m_UI->sizeSpinBox->setValue(
+    static_cast< int >(
+      std::pow( rf, m )
+    )
+  );
+
+  m_UI->sizeSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+
+  UpdateResolutions();
+}
+
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::UpdateResolutions()
+{
+  assert( !m_GDALOverviewsBuilder.IsNull() );
+
+  QStandardItemModel * itemModel =
+    qobject_cast< QStandardItemModel * >( m_UI->resolutionsListView->model() );
+
+  assert( itemModel!=NULL );
+
+  otb::GDALOverviewsBuilder::SizeVector resolutions;
+
+  m_GDALOverviewsBuilder->ListResolutions( resolutions );
+
+  for( otb::GDALOverviewsBuilder::SizeVector::const_iterator it(
+	 resolutions.begin()
+       );
+       it!=resolutions.end();
+       ++ it )
+    itemModel->appendRow(
+      new QStandardItem(
+	QString( "%1x%2" )
+	.arg( ( *it )[ 0 ] )
+	.arg( ( *it )[ 1 ] )
+      )
+    );
+}
+
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::UpdateSize()
+{
+  assert( !m_GDALOverviewsBuilder.IsNull() );
+
+  bool prevSignalsBlocked = m_UI->sizeSpinBox->blockSignals( true );
+
+  unsigned int count = m_GDALOverviewsBuilder->CountResolutions();
+
+  // Force C++ implicit cast by declaring local variables to force compiler
+  // to find correct std::pow() signature.
+  //
+  // It fixes compile-time:
+  // error: call of pow(unsigned int, unsigned int) is ambiguous
+  double rf = m_GDALOverviewsBuilder->GetResolutionFactor();
+
+  int m =
+    count -
+    std::min(
+      m_GDALOverviewsBuilder->GetNbResolutions(),
+      count
+    );
+
+  m_UI->sizeSpinBox->setValue(
+    static_cast< int >(
+      std::pow( rf, m )
+    )
+  );
+
+  m_UI->sizeSpinBox->blockSignals( prevSignalsBlocked );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::on_baseSpinBox_valueChanged( int value )
+{
+  // qDebug() << this << "::on_baseSpinBox_valueChanged(" << value << ")";
+
+  ClearResolutions();
+
+  if( m_GDALOverviewsBuilder.IsNull() )
+    return;
+
+  m_GDALOverviewsBuilder->SetResolutionFactor( value );
+
+  m_UI->levelsSpinBox->setRange(
+    0,
+    m_GDALOverviewsBuilder->CountResolutions()
+  );
+
+  UpdateResolutions();
+
+  UpdateSize();
+
+  emit BaseValueChanged( value );
+}
+
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::on_levelsSpinBox_valueChanged( int value )
+{
+  // qDebug() << this << "::on_levelsSpinBox_valueChanged(" << value << ")";
+
+  ClearResolutions();
+
+  if( m_GDALOverviewsBuilder.IsNull() )
+    return;
+
+  m_GDALOverviewsBuilder->SetNbResolutions( value );
+
+  UpdateResolutions();
+
+  UpdateSize();
+
+  emit LevelsValueChanged( value );
+}
+
+/*****************************************************************************/
+void
+MultiResolutionPyramidWidget
+::on_sizeSpinBox_valueChanged( int value )
+{
+  // qDebug() << this << "::on_sizeSpinBox_valueChanged(" << value << ")";
+
+  if( m_GDALOverviewsBuilder.IsNull() )
+    return;
+
+  unsigned int count =
+    m_GDALOverviewsBuilder->CountResolutions(
+      m_GDALOverviewsBuilder->GetResolutionFactor(),
+      value
+    );
+
+  if( static_cast< unsigned int >( m_UI->levelsSpinBox->value() )<=count )
+    return;
+
+  {
+  bool prevSignalsBlocked = m_UI->levelsSpinBox->blockSignals( true );
+
+  m_UI->levelsSpinBox->setValue( count );
+  m_GDALOverviewsBuilder->SetNbResolutions( count );
+
+  m_UI->levelsSpinBox->blockSignals( prevSignalsBlocked );
+  }
+
+  ClearResolutions();
+
+  UpdateResolutions();
+
+  emit SizeValueChanged( value );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdMultiResolutionPyramidWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdMultiResolutionPyramidWidget.ui
new file mode 100644
index 0000000..b9c1dd7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdMultiResolutionPyramidWidget.ui
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::MultiResolutionPyramidWidget</class>
+ <widget class="QWidget" name="mvd::MultiResolutionPyramidWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>359</width>
+    <height>101</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="margin">
+    <number>4</number>
+   </property>
+   <property name="spacing">
+    <number>4</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QLabel" name="formatLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>File format used for overview file</string>
+     </property>
+     <property name="text">
+      <string>Format:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QComboBox" name="formatComboBox">
+     <property name="toolTip">
+      <string>File format used for overview file</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="2">
+    <widget class="QLabel" name="baseLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Decimation factor = Base power Level</string>
+     </property>
+     <property name="text">
+      <string>Base:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="3">
+    <widget class="QSpinBox" name="baseSpinBox">
+     <property name="toolTip">
+      <string>Decimation factor = Base power Level</string>
+     </property>
+     <property name="minimum">
+      <number>2</number>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="4" rowspan="4">
+    <widget class="QListView" name="resolutionsListView">
+     <property name="toolTip">
+      <string>Size list of all overview levels</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="algorithmLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Algorithm used when resampling image to compute overview level</string>
+     </property>
+     <property name="text">
+      <string>Algorithm:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QComboBox" name="algorithmComboBox">
+     <property name="toolTip">
+      <string>Algorithm used when resampling image to compute overview level</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="2">
+    <widget class="QLabel" name="levelsLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Decimation factor = Base power Level</string>
+     </property>
+     <property name="text">
+      <string>Levels:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="3">
+    <widget class="QSpinBox" name="levelsSpinBox">
+     <property name="toolTip">
+      <string>Decimation factor = Base power Level</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <widget class="QLabel" name="compressionLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Algorithm used to compress overview level data</string>
+     </property>
+     <property name="text">
+      <string>Compression:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QComboBox" name="compressionComboBox">
+     <property name="toolTip">
+      <string>Algorithm used to compress overview level data</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QLabel" name="sizeLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Minimal size (in pixels) of smallest overview level</string>
+     </property>
+     <property name="text">
+      <string>Size:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
+    <widget class="QSpinBox" name="sizeSpinBox">
+     <property name="toolTip">
+      <string>Minimal size (in pixels) of smallest overview level</string>
+     </property>
+     <property name="minimum">
+      <number>1</number>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="4">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdMyWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdMyWidget.cxx
new file mode 100644
index 0000000..b40f8ee
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdMyWidget.cxx
@@ -0,0 +1,86 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdMyWidget.h"
+#include "ui_mvdMyWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::MyWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+MyWidget
+::MyWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::MyWidget() )
+{
+  m_UI->setupUi( this );
+}
+
+/*******************************************************************************/
+MyWidget
+::~MyWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdMyWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdMyWidget.ui
new file mode 100644
index 0000000..57209aa
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdMyWidget.ui
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::MyWidget</class>
+ <widget class="QWidget" name="mvd::MyWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdOTBApplicationsModel.cxx b/Modules/Visualization/MonteverdiGui/src/mvdOTBApplicationsModel.cxx
new file mode 100644
index 0000000..d84deb8
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdOTBApplicationsModel.cxx
@@ -0,0 +1,114 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdOTBApplicationsModel.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdApplicationsBrowser.h"
+#include "mvdApplicationLauncher.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::OTBApplicationsModel
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+OTBApplicationsModel
+::OTBApplicationsModel( QObject* p ) :
+  AbstractModel( p ),
+  m_ApplicationsBrowser( NULL ),
+  m_ApplicationLauncher( NULL )
+{
+  //
+  // instantiate apps browser
+  m_ApplicationsBrowser = new ApplicationsBrowser( this );  
+
+  //
+  // instantiate app launcher
+  m_ApplicationLauncher = new ApplicationLauncher( this );
+
+  // initialize the app browser with empty string. The default
+  // behavior use the env ITK_AUTOLOAD_PATH
+  //m_ApplicationsBrowser->SetAutoLoadPath("");
+}
+
+/*******************************************************************************/
+OTBApplicationsModel
+::~OTBApplicationsModel()
+{
+}
+
+/*******************************************************************************/
+void
+OTBApplicationsModel
+::virtual_BuildModel( void * )
+{
+  // nothing to do
+}
+
+/*******************************************************************************/
+void
+OTBApplicationsModel
+::FillTree( )
+{
+  //
+  // this method is connected to the widget via a signal. In
+  // ApplicationBrowser, when the map is filled with tags/Apps, a
+  // signal is emitted and received by the widget to fill its tree.
+  m_ApplicationsBrowser->SearchAvailableApplicationsTags();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdPixelDescriptionWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdPixelDescriptionWidget.cxx
new file mode 100644
index 0000000..edde163
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdPixelDescriptionWidget.cxx
@@ -0,0 +1,256 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdPixelDescriptionWidget.h"
+#include "ui_mvdPixelDescriptionWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::PixelDescriptionWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+PixelDescriptionWidget
+::PixelDescriptionWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::PixelDescriptionWidget() ),
+  m_CartographicRootItem( NULL ),
+  m_GeographicRootItem( NULL ),
+  m_PixelValueRootItem( NULL ),
+  m_CartographicItem( NULL ),
+  m_GeographicItem( NULL )
+{
+  m_UI->setupUi( this );
+
+  SetupUI();
+}
+
+/*******************************************************************************/
+PixelDescriptionWidget
+::~PixelDescriptionWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*******************************************************************************/
+void
+PixelDescriptionWidget
+::SetupUI()
+{
+  //
+  // Cartographic coordiantes
+  m_CartographicRootItem = new QTreeWidgetItem( GetDescriptionTree() ); 
+  //m_CartographicRootItem->setText(0, tr("Cartographic"));
+  m_CartographicRootItem->setExpanded(true);
+
+  // m_CartographicItem = new QTreeWidgetItem( m_CartographicRootItem );
+  // m_CartographicItem->setText(0, tr("Coordinates"));
+
+  //
+  // Geographic coordinates
+  m_GeographicRootItem = new QTreeWidgetItem( GetDescriptionTree() );
+  m_GeographicRootItem->setText(0, tr("Geographic"));
+  m_GeographicRootItem->setExpanded(true);
+
+  //m_GeographicItem = new QTreeWidgetItem( m_GeographicRootItem );  
+  //m_GeographicItem->setText(0, tr("Coordinates"));
+
+  //
+  // Child items will be created + updated in a dedicated slot
+  m_PixelValueRootItem = new QTreeWidgetItem( GetDescriptionTree() ); 
+  m_PixelValueRootItem->setText(0, tr("Pixel Values"));
+  m_PixelValueRootItem->setExpanded(true);
+}
+
+/*******************************************************************************/
+QTreeWidget *
+PixelDescriptionWidget
+::GetDescriptionTree()
+{
+  return m_UI->m_DescriptionTree;
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+PixelDescriptionWidget
+::OnCurrentPhysicalUpdated(const QStringList & currentPhysical)
+{ 
+  // qDebug() << this << "::OnCurrentPhysicalUpdated(" << currentPhysical << ")";
+
+  //m_CartographicItem->setText(1, currentPhysical);
+
+  if (!currentPhysical.empty())
+    {
+    // remove the previous QTreeWidgetItem  of m_GeographicRootItem
+    while( m_CartographicRootItem->childCount()>0 )
+      {
+      // Remove QTreeWidgetItem
+      QTreeWidgetItem* child = m_CartographicRootItem->takeChild( 0 );
+
+      // Delete it from memory.
+      delete child;
+      child = NULL;
+      }
+ 
+    m_CartographicRootItem->setText( 0, currentPhysical[ 0 ] );
+
+    // fill with the new values
+    QTreeWidgetItem * iCartoXItem = new QTreeWidgetItem( m_CartographicRootItem );
+    iCartoXItem->setText( 0, tr( "X" ) );
+    iCartoXItem->setText( 1, currentPhysical[ 1 ] );
+
+    QTreeWidgetItem * iCartoYItem = new QTreeWidgetItem( m_CartographicRootItem );
+    iCartoYItem->setText( 0, tr( "Y" ) );
+    iCartoYItem->setText( 1, currentPhysical[ 2 ] );
+    }
+}
+
+/*******************************************************************************/
+void
+PixelDescriptionWidget
+::OnCurrentGeographicUpdated(const QStringList&/*const QString &*/ currentGeo)
+{
+  // qDebug() << this << "::OnCurrentGeographicUpdated(" << currentGeo << ")";
+
+  if (!currentGeo.empty())
+    {
+    // remove the previous QTreeWidgetItem  of m_GeographicRootItem
+    while( m_GeographicRootItem->childCount()>0 )
+      {
+      // Remove QTreeWidgetItem
+      QTreeWidgetItem* child = m_GeographicRootItem->takeChild( 0 );
+
+      // Delete it from memory.
+      delete child;
+      child = NULL;
+      }
+
+    m_GeographicRootItem->setText( 0, currentGeo[ 0 ] );
+
+    // fill with the new values
+    QTreeWidgetItem * iGeoLongItem = new QTreeWidgetItem( m_GeographicRootItem );
+    iGeoLongItem->setText( 0, tr( "Long" ) );
+    iGeoLongItem->setText( 1, currentGeo[ 1 ] );
+
+    QTreeWidgetItem * iGeoLatItem = new QTreeWidgetItem( m_GeographicRootItem );
+    iGeoLatItem->setText( 0, tr( "Lat" ) );
+    iGeoLatItem->setText( 1, currentGeo[ 2 ] );
+
+    QTreeWidgetItem * iGeoElevationItem =
+      new QTreeWidgetItem( m_GeographicRootItem );
+    iGeoElevationItem->setText( 0, tr( "Elevation" ) );
+    iGeoElevationItem->setText(
+      1,
+      currentGeo.size() > 3
+      ? currentGeo[ 3 ]
+      : tr( "Not available" )
+    );
+    }
+}
+
+/*******************************************************************************/
+void
+PixelDescriptionWidget
+::OnCurrentPixelValueUpdated(const VectorImageType::PixelType & currentPixel, 
+                             const QStringList& bandNames)
+{
+  // qDebug() << this << "::OnCurrentPixelValueUpdated(" << bandNames << ")";
+
+  if (!bandNames.empty() || currentPixel.GetSize() != 0)
+    {
+    //
+    // remove the previous QTreeWidgetItem  of m_PixelValueRootItem
+    while( m_PixelValueRootItem->childCount()>0 )
+      {
+      // Remove QTreeWidgetItem
+      QTreeWidgetItem* child = m_PixelValueRootItem->takeChild( 0 );
+
+      // Delete it from memory.
+      delete child;
+      child = NULL;
+      }
+
+    // qDebug() << "Bands:" << bandNames;
+
+    // assert( bandNames.size()==currentPixel.GetSize() );
+
+    // fill with the new values
+    for (unsigned int idx = 0; idx < currentPixel.GetSize(); idx++)
+      {
+      QTreeWidgetItem * iBandItem = new QTreeWidgetItem( m_PixelValueRootItem );
+
+      // figure out if a band name is available, if not use Band idx
+      if( !bandNames[ idx ].isEmpty() &&
+          static_cast< unsigned int >( bandNames.size() )==currentPixel.GetSize() )
+        {
+        iBandItem->setText(0, bandNames[ idx ] );
+        }
+      else
+        {
+	iBandItem->setText( 0, tr( "Band %1" ).arg( idx+1 ) );
+        }
+      // set the value
+      iBandItem->setText(1, QString("%1").arg(currentPixel.GetElement( idx )) );
+      }
+    }
+}
+
+/*******************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdPixelDescriptionWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdPixelDescriptionWidget.ui
new file mode 100644
index 0000000..716937a
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdPixelDescriptionWidget.ui
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::PixelDescriptionWidget</class>
+ <widget class="QWidget" name="mvd::PixelDescriptionWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>94</width>
+    <height>87</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Pixel Description</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="sizeConstraint">
+    <enum>QLayout::SetDefaultConstraint</enum>
+   </property>
+   <property name="margin">
+    <number>3</number>
+   </property>
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QTreeWidget" name="m_DescriptionTree">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="contextMenuPolicy">
+      <enum>Qt::CustomContextMenu</enum>
+     </property>
+     <property name="headerHidden">
+      <bool>false</bool>
+     </property>
+     <property name="columnCount">
+      <number>2</number>
+     </property>
+     <attribute name="headerVisible">
+      <bool>true</bool>
+     </attribute>
+     <column>
+      <property name="text">
+       <string>Description</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Value</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx
new file mode 100644
index 0000000..6efb051
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx
@@ -0,0 +1,731 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdQtWidgetView.h"
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <functional>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbWrapperApplicationHtmlDocGenerator.h"
+// #include "otbWrapperComplexOutputImageParameter.h"
+#include "otbWrapperOutputFilenameParameter.h"
+// #include "otbWrapperOutputImageParameter.h"
+#include "otbWrapperOutputVectorDataParameter.h"
+// #include "otbWrapperQtWidgetOutputImageParameter.h"
+// #include "otbWrapperQtWidgetProgressReport.h"
+#include "otbWrapperQtWidgetSimpleProgressReport.h"
+// #include "otbWrapperTypes.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractLayerModel.h"
+#include "mvdFilenameInterface.h"
+#include "mvdI18nCoreApplication.h"
+#include "mvdStackedLayerModel.h"
+#include "mvdQtWidgetParameterInitializers.h"
+
+namespace mvd
+{
+namespace Wrapper
+{
+/*
+  TRANSLATOR mvd::Wrapper::QtWidgetView
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* INTERNAL TYPES                                                            */
+
+class KeyLayerAccumulator :
+    public std::unary_function< StackedLayerModel::ConstIterator::value_type,
+				void >
+{
+public:
+  typedef
+  std::unary_function< StackedLayerModel::ConstIterator::value_type, void >
+    SuperType;
+
+  typedef std::list< SuperType::argument_type > KeyLayerPairList;
+
+  KeyLayerAccumulator( const std::string & filename,
+		       KeyLayerPairList & klp ) :
+    m_KeyLayerPairs( klp ),
+    m_Filename( FromStdString( filename ) ),
+    m_Count( 0 )
+  {
+  }
+
+  void
+  operator () ( const SuperType::argument_type & pair )
+  {
+    const FilenameInterface * interface =
+      dynamic_cast< const FilenameInterface * >( pair.second );
+
+    if( interface!=NULL &&
+	m_Filename.compare( interface->GetFilename() )==0 )
+      {
+      qDebug() << m_Filename << "==" << interface->GetFilename();
+
+      m_KeyLayerPairs.push_back( pair );
+
+      ++ m_Count;
+      }
+  }
+
+  std::size_t
+  GetCount() const
+  {
+    return m_Count;
+  }
+
+
+public:
+  KeyLayerPairList & m_KeyLayerPairs;
+
+
+private:
+  QString m_Filename;
+  std::size_t m_Count;
+};
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+char const * const
+QtWidgetView
+::OBJECT_NAME = "mvd::Wrapper::QtWidgetView";
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+QtWidgetView
+::QtWidgetView( const otb::Wrapper::Application::Pointer & otbApp,
+		QWidget* p,
+		Qt::WindowFlags flags ) :
+  QWidget( p, flags ),
+  m_Application( otbApp ),
+  m_Model( NULL ),
+  m_ExecButton( NULL ),
+  m_QuitButton( NULL ),
+  m_Message( NULL ),
+  m_IsClosable( true )
+{
+  setObjectName( QtWidgetView::OBJECT_NAME );
+
+  m_Model = new otb::Wrapper::QtWidgetModel( otbApp );
+
+  QObject::connect(
+    m_Model, SIGNAL( SetProgressReportBegin() ),
+    this, SLOT( OnProgressReportBegin() )
+  );
+
+  QObject::connect(
+    m_Model, SIGNAL( SetProgressReportDone( int ) ),
+    this, SLOT( OnProgressReportEnd( int ) )
+  );
+
+  QObject::connect(
+    m_Model, SIGNAL( ExceptionRaised( QString ) ),
+    this, SLOT( OnExceptionRaised( QString ) )
+  );
+}
+
+/*******************************************************************************/
+QtWidgetView
+::~QtWidgetView()
+{
+  // m_Application is smart-pointed and will be automatically deleted.
+
+  delete m_Model;
+  m_Model = NULL;
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::CreateGui()
+{
+  // Create a VBoxLayout with the header, the input widgets, and the footer
+  QVBoxLayout *mainLayout = new QVBoxLayout();
+  QTabWidget *tab = new QTabWidget();
+  tab->addTab(CreateInputWidgets(), "Parameters");
+
+   
+  //otb::Wrapper::QtWidgetProgressReport* prog =  new otb::Wrapper::QtWidgetProgressReport(m_Model);
+  //prog->SetApplication(m_Application);
+  //tab->addTab(prog, "Progress");
+  tab->addTab(CreateDoc(), "Documentation");
+  mainLayout->addWidget(tab);
+
+  QTextEdit *log = new QTextEdit();
+  connect( m_Model->GetLogOutput(), SIGNAL(NewContentLog(QString)), log, SLOT(append(QString) ) );
+  tab->addTab(log, "Logs");
+
+  m_Message = new QLabel("<center><font color=\"#FF0000\">Select parameters</font></center>");
+  connect(
+    m_Model,
+    SIGNAL( SetApplicationReady( bool ) ),
+    this, SLOT( UpdateMessageAfterApplicationReady( bool ) )
+  );
+  mainLayout->addWidget(m_Message);
+
+  otb::Wrapper::QtWidgetSimpleProgressReport* progressReport =
+    new otb::Wrapper::QtWidgetSimpleProgressReport(m_Model);
+  progressReport->SetApplication(m_Application);
+   
+  QHBoxLayout *footLayout = new QHBoxLayout;
+  footLayout->addWidget(progressReport);
+  footLayout->addWidget(CreateFooter());
+  mainLayout->addLayout(footLayout);
+
+  QGroupBox *mainGroup = new QGroupBox();
+  mainGroup->setLayout(mainLayout);
+
+  QVBoxLayout  *finalLayout = new QVBoxLayout();
+  finalLayout->addWidget(mainGroup);
+
+  // Make the final layout to the widget
+  this->setLayout(finalLayout);
+}
+
+/*******************************************************************************/
+QWidget*
+QtWidgetView
+::CreateInputWidgets()
+{
+  QScrollArea *scrollArea = new QScrollArea;
+
+  QWidget * widget = 
+    otb::Wrapper::QtWidgetParameterFactory::CreateQtWidget(
+      m_Model->GetApplication()->GetParameterList(),
+      m_Model
+    );
+
+  scrollArea->setWidget( widget );
+  scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+  scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+  scrollArea->setWidgetResizable(true);
+
+  //
+  // need to be connected to the end of a process
+  QObject::connect(
+    m_Model,
+    SIGNAL( SetProgressReportDone( int ) ),
+    // to:
+    this,
+    SLOT ( OnApplicationExecutionDone( int ) )
+    );
+
+  SetupParameterWidgets( widget );
+
+  return scrollArea;
+}
+
+/*******************************************************************************/
+QWidget*
+QtWidgetView
+::CreateFooter()
+{
+  // an HLayout with two buttons : Execute and Quit
+  QGroupBox *footerGroup = new QGroupBox;
+  QHBoxLayout *footerLayout = new QHBoxLayout;
+ 
+  footerGroup->setFixedHeight(40);
+  footerGroup->setContentsMargins(0, 0, 0, 0);
+  footerLayout->setContentsMargins(5, 5, 5, 5);
+
+  m_ExecButton = new QPushButton(footerGroup);
+  m_ExecButton->setDefault(true);
+  m_ExecButton->setEnabled(false);
+  m_ExecButton->setText(QObject::tr("Execute"));
+  connect(
+    m_Model, SIGNAL( SetApplicationReady( bool ) ),
+    m_ExecButton, SLOT( setEnabled( bool ) )
+  );
+
+  QObject::connect(
+    m_ExecButton, SIGNAL( clicked() ),
+    // to:
+    this, SLOT( OnExecButtonClicked() )
+  );
+  QObject::connect(
+    this, SIGNAL( ExecuteAndWriteOutput() ),
+    // to:
+    m_Model, SLOT( ExecuteAndWriteOutputSlot() )
+  );
+
+  m_QuitButton = new QPushButton(footerGroup);
+  m_QuitButton->setText(QObject::tr("Quit"));
+  connect(
+    m_QuitButton,
+    SIGNAL( clicked() ),
+    // to:
+    this,
+    SLOT( close() )
+  );
+
+  // Put the buttons on the right
+  footerLayout->addStretch();
+  footerLayout->addWidget(m_ExecButton);
+  footerLayout->addWidget(m_QuitButton);
+
+  footerGroup->setLayout(footerLayout);
+
+  return footerGroup;
+}
+
+/*******************************************************************************/
+QWidget*
+QtWidgetView
+::CreateDoc()
+{
+  QTextEdit *text = new QTextEdit;
+  text->setReadOnly(true);
+
+  QTextDocument * doc = new QTextDocument();
+
+  std::string docContain;
+  otb::Wrapper::ApplicationHtmlDocGenerator::GenerateDoc( m_Application, docContain);
+
+  doc->setHtml(docContain.c_str());
+
+  text->setDocument(doc);
+
+  return text;
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::SetupParameterWidgets( QWidget * widget )
+{
+  assert( widget!=NULL );
+
+  SetupWidget( widget, InputFilenameInitializer() );
+  SetupWidget( widget, InputFilenameListInitializer( this ) );
+  SetupWidget( widget, InputImageInitializer() );
+  SetupWidget( widget, InputImageListInitializer( this ) );
+  SetupWidget( widget, InputProcessXMLInitializer() );
+  SetupWidget( widget, InputVectorDataInitializer() );
+  SetupWidget( widget, InputVectorDataListInitializer( this ) );
+#if defined( OTB_DEBUG )
+  SetupWidget( widget, ToolTipInitializer() );
+#endif
+
+  SetupWidget( widget, OutputFilenameInitializer() );
+  SetupWidget( widget, OutputProcessXMLInitializer() );
+
+  SetupWidget(
+    widget,
+    OutputImageInitializer( m_Application->GetName() )
+  );
+
+  SetupWidget( widget, OutputVectorDataInitializer() );
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::SetupFileSelectionWidget( QWidget * widget )
+{
+  assert( widget!=NULL );
+  assert(
+    qobject_cast< FileSelectionInitializer::argument_type >( widget )!=NULL
+  );
+
+  FileSelectionInitializer initialize;
+
+  initialize( qobject_cast< FileSelectionInitializer::argument_type >( widget ) );
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::closeEvent( QCloseEvent * e )
+{
+  assert( e!=NULL );
+
+  if( !IsClosable() )
+    {
+    assert( !m_Application.IsNull() );
+
+    QMessageBox::warning(
+      this,
+      tr( "Warning!" ),
+      tr( "OTB-Application '%1' cannot be closed while running!")
+      .arg( m_Application->GetDocName() )
+    );
+
+    e->ignore();
+
+    return;
+    }
+
+  QWidget::closeEvent( e );
+
+  emit QuitSignal();
+
+  deleteLater();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+QtWidgetView
+::OnExecButtonClicked()
+{
+  assert( m_Model!=NULL );
+  assert( m_Model->GetApplication()!=NULL );
+
+
+  assert( I18nCoreApplication::Instance()!=NULL );
+
+  //
+  // Get layer-stack, if any.
+  StackedLayerModel * layerStack =
+    I18nCoreApplication::Instance()->GetModel< StackedLayerModel >();
+
+  otb::Wrapper::Application::Pointer otbApp( m_Model->GetApplication() );
+
+  //
+  // Check output parameters of OTB-application.
+  StringVector paramKeys( otbApp->GetParametersKeys() );
+  QStringList filenames1;
+
+  KeyLayerAccumulator::KeyLayerPairList layers;
+  QStringList filenames2;
+
+  for( StringVector::const_iterator it( paramKeys.begin() );
+       it!=paramKeys.end();
+       ++it )
+    {
+    if( otbApp->IsParameterEnabled( *it, true ) &&
+        otbApp->HasValue( *it ) )
+      {
+      otb::Wrapper::Parameter::Pointer param( otbApp->GetParameterByKey( *it ) );
+      assert( !param.IsNull() );
+
+      // qDebug()
+      // 	<< it->c_str() << ": type" << otbApp->GetParameterType( *it );
+
+      // const char* filename = NULL;
+      std::string filename;
+
+      switch( otbApp->GetParameterType( *it ) )
+	{
+	case otb::Wrapper::ParameterType_OutputFilename:
+	  filename =
+	    otb::DynamicCast< otb::Wrapper::OutputFilenameParameter >( param )
+	    ->GetValue();
+	  break;
+	//
+	// FILENAME.
+	//
+	// IMAGE.
+	case otb::Wrapper::ParameterType_OutputImage:
+	  filename =
+	    otb::DynamicCast< otb::Wrapper::OutputImageParameter >( param )
+	    ->GetFileName();
+	  break;
+	//
+	// VECTOR-DATA.
+	case otb::Wrapper::ParameterType_OutputVectorData:
+	  filename =
+	    otb::DynamicCast< otb::Wrapper::OutputVectorDataParameter >( param )
+	    ->GetFileName();
+	  break;
+	//
+	// COMPLEX IMAGE.
+	case otb::Wrapper::ParameterType_ComplexOutputImage:
+	  filename =
+	    otb::DynamicCast< otb::Wrapper::ComplexOutputImageParameter >( param )
+	    ->GetFileName();
+	  break;
+	//
+	// NONE.
+	default:
+	  break;
+	}
+
+      if( QFileInfo( filename.c_str() ).exists() )
+	filenames1.push_back( filename.c_str() );
+
+      if( layerStack!=NULL )
+	{
+	KeyLayerAccumulator accumulator(
+	  std::for_each(
+	    layerStack->Begin(),
+	    layerStack->End(), KeyLayerAccumulator( filename, layers )
+	  )
+	);
+
+	if( accumulator.GetCount()>0 )
+	  filenames2.push_back( filename.c_str() );
+	}
+      }
+    }
+
+  {
+  QString message;
+
+  if( filenames1.size()==1 )
+    {
+    // qDebug()
+    //   << it->c_str() << ":" << QString( filename.c_str() );
+
+    message =
+      tr( "Are you sure you want to overwrite file '%1'?" )
+      .arg( filenames1.front() );
+    }
+  else if( filenames1.size()>1 )
+    {
+    message =
+      tr( "Following files will be overwritten. Are you sure you want to continue?\n- %1" )
+      .arg( filenames1.join( "\n- " ) );
+    }
+
+  if( !message.isEmpty() )
+    {
+    QMessageBox::StandardButton button =
+      QMessageBox::question(
+	this,
+	PROJECT_NAME,
+	message,
+	QMessageBox::Yes | QMessageBox::No,
+	QMessageBox::No
+      );
+
+    if( button==QMessageBox::No )
+      return;
+    }
+  }
+
+  {
+  QString message;
+
+  if( filenames2.size()==1 )
+    {
+    // qDebug()
+    //   << it->c_str() << ":" << QString( filename.c_str() );
+
+    message =
+      tr( "File '%1' is being viewed in " PROJECT_NAME " and will be concurrently overwritten by running this %2. File will be removed from layer-stack before running %2 and reloaded after.\n\nDo you want to continue?" )
+      .arg( filenames2.front() )
+      .arg( otbApp->GetDocName() );
+    }
+  else if( filenames2.size()>1 )
+    {
+    message =
+      tr( "Following files are being viewed in " PROJECT_NAME " and will be concurrently overwritter by running %2. Files will be removed from layer-stack before running %2. Do you want to continue?\n- %1" )
+      .arg( filenames2.join( "\n- " ) )
+      .arg( otbApp->GetDocName() );
+    }
+
+  if( !message.isEmpty() )
+    {
+    QMessageBox::StandardButton button =
+      QMessageBox::question(
+	this,
+	PROJECT_NAME,
+	message,
+	QMessageBox::Yes | QMessageBox::No,
+	QMessageBox::No
+      );
+
+    if( button==QMessageBox::No )
+      return;
+
+    while( !layers.empty() )
+      {
+      layerStack->Delete( layers.front().first );
+
+      layers.pop_front();
+      }
+    }
+  }
+
+
+  /* U N S A F E
+  // BUGFIX: Mantis-750
+  //
+  // Remove files which will be overwritten in order to use
+  // file-existence to check whether to emit the OutputImageChanged
+  // signal (see ::OnApplicationExecutionDone()).
+  for( FileInfoVector::const_iterator it( fileInfos.begin() );
+       it!=fileInfos.end();
+       ++it )
+    {
+    qDebug() << "Removing:" << it->filePath();
+
+    it->dir().remove( it->fileName() );
+    }
+  */
+
+  m_Message->setText("<center><font color=\"#FF0000\">Running</font></center>");
+
+  emit ExecuteAndWriteOutput();
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::UpdateMessageAfterApplicationReady( bool val )
+{
+  if(val == true)
+    m_Message->setText("<center><font color=\"#00FF00\">Ready to run</font></center>");
+  else
+    m_Message->setText("<center><font color=\"#FF0000\">Select parameters</font></center>");
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::OnExceptionRaised( QString what  )
+{
+  qWarning() << what;
+
+#if defined( OTB_DEBUG )
+  QMessageBox::warning(
+    this,
+    PROJECT_NAME,
+    what,
+    QMessageBox::Ok
+  );
+#endif
+}
+
+/*******************************************************************************/
+void
+QtWidgetView
+::OnApplicationExecutionDone( int status )
+{
+  otb::Wrapper::Application::Pointer otbApp( m_Model->GetApplication() );
+
+  if( status!=0 )
+    {
+    QMessageBox::information(
+      this,
+      PROJECT_NAME,
+      tr( "'%1' has failed with return status %2.\n"
+	  "Please refer to '%1' documentation and check log tab."
+      )
+      .arg( otbApp->GetName() )
+      .arg( status ),
+      QMessageBox::Ok
+    );
+
+    emit ExecutionDone( status );
+
+    return;
+    }
+
+  /*
+  // Removed as per MVDX-259.
+  QMessageBox::information(
+    this,
+    PROJECT_NAME,
+    tr( "'%1' has succeeded.\n"
+	"Result(s) will be imported as dataset(s).\n")
+    .arg( otbApp->GetName() ),
+    QMessageBox::Ok
+  );
+  */
+
+  CountType count = 0;
+
+  //
+  // detect if this application has outputImageParameter. emit
+  // the output filenames if any
+  StringVector paramList( otbApp->GetParametersKeys( true ) );
+
+  // iterate on the application parameters
+  for ( StringVector::const_iterator it( paramList.begin() );
+	it!=paramList.end();
+	++it )
+    {
+    // parameter key
+    const std::string& key = *it;
+
+    // get a valid outputParameter
+    if( otbApp->GetParameterType( key )
+	==otb::Wrapper::ParameterType_OutputImage && 
+	otbApp->IsParameterEnabled( key, true ) &&
+	otbApp->HasValue( key ) )
+      {
+      // get the parameter
+      otb::Wrapper::Parameter* param = otbApp->GetParameterByKey( key );
+
+      // try to cast it 
+      otb::Wrapper::OutputImageParameter* outputParam = 
+	dynamic_cast< otb::Wrapper::OutputImageParameter* >( param );
+
+      // emit the output image filename selected
+      if( outputParam!=NULL )
+	{
+	QFileInfo fileInfo( outputParam->GetFileName() );
+
+	/* U N S A F E
+	// BUGFIX: Mantis-750
+	//
+	// If output image-exists, it's sure that it has been output
+	// from the OTB-application process because overwritten
+	// files are first deleted (see OnExecButtonClicked()).
+	if( fileInfo.exists() )
+	{
+	*/
+	++ count;
+
+	emit OTBApplicationOutputImageChanged(
+	  QString( otbApp->GetName() ),
+	  QFile::decodeName( outputParam->GetFileName() )
+	);
+	/*
+	}
+	*/
+	}
+      }
+    }
+
+  emit ExecutionDone( status );
+}
+
+}
+
+}
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdQuicklookViewManipulator.cxx b/Modules/Visualization/MonteverdiGui/src/mvdQuicklookViewManipulator.cxx
new file mode 100644
index 0000000..c01e7f4
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdQuicklookViewManipulator.cxx
@@ -0,0 +1,273 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdQuicklookViewManipulator.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdQuicklookViewRenderer.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::QuicklookViewManipulator
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+
+QuicklookViewManipulator
+::QuicklookViewManipulator( const otb::ViewSettings::Pointer& viewSettings,
+                            QObject* p ) :
+  ImageViewManipulator( viewSettings, p ),
+  m_RoiOrigin(),
+  m_RoiSpacing(),
+  m_RoiSize()
+{
+  m_RoiOrigin.Fill( 0 );
+  m_RoiSpacing.Fill( 0 );
+  m_RoiSize.Fill( 0 );
+}
+
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+
+QuicklookViewManipulator
+::QuicklookViewManipulator( QObject* p ) :
+  ImageViewManipulator( p ),
+  m_RoiOrigin(),
+  m_RoiSpacing(),
+  m_RoiSize()
+{
+  m_RoiOrigin.Fill( 0 );
+  m_RoiSpacing.Fill( 0 );
+  m_RoiSize.Fill( 0 );
+}
+
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+
+/*****************************************************************************/
+QuicklookViewManipulator
+::~QuicklookViewManipulator()
+{
+}
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::SetupRenderingContext(
+  AbstractImageViewRenderer::RenderingContext * const c ) const
+{
+  assert(
+    c==dynamic_cast< QuicklookViewRenderer::RenderingContext const * >( c )
+  );
+
+  QuicklookViewRenderer::RenderingContext * const context =
+    dynamic_cast< QuicklookViewRenderer::RenderingContext * const >( c );
+
+  // Coverity-19843.
+  // {
+  assert( context!=NULL );
+  // }
+
+  context->m_RoiOrigin = m_RoiOrigin;
+  context->m_RoiExtent = m_RoiOrigin;
+
+  context->m_RoiExtent[ 0 ] +=
+    static_cast< double >( m_RoiSize[ 0 ] ) * m_RoiSpacing[ 0 ];
+  context->m_RoiExtent[ 1 ] +=
+    static_cast< double >( m_RoiSize[ 1 ] ) * m_RoiSpacing[ 1 ];
+
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+#else // USE_VIEW_SETTINGS_SIDE_EFFECT
+#endif // USE_VIEW_SETTINGS_SIDE_EFFECT
+}
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::MousePressEvent( QMouseEvent* e )
+{
+  ImageViewManipulator::MousePressEvent( e );
+
+  assert( e!=NULL );
+
+  // qDebug() << this << ":" << e;
+
+
+  Qt::MouseButtons buttons = e->buttons();
+  Qt::KeyboardModifiers modifiers = e->modifiers();
+
+  if( buttons==Qt::LeftButton && modifiers==Qt::NoModifier )
+    {
+    assert( !m_ViewSettings.IsNull() );
+
+    PointType center;
+
+    m_ViewSettings->ScreenToViewPortTransform(
+      static_cast< double >( m_MousePressPosition.x() ),
+      static_cast< double >( m_MousePressPosition.y() ),
+      center[ 0 ],
+      center[ 1 ]
+    );
+
+    emit CenterRoiRequested( center );
+    }
+}
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::MouseMoveEvent( QMouseEvent* e)
+{
+  assert( e!=NULL );
+
+  // qDebug() << this << ":" << e;
+
+  Qt::MouseButtons buttons = e->buttons();
+  Qt::KeyboardModifiers modifiers = e->modifiers();
+
+  if( buttons==Qt::LeftButton && modifiers==Qt::NoModifier )
+    {
+    assert( !m_ViewSettings.IsNull() );
+
+    PointType center;
+
+    m_ViewSettings->ScreenToViewPortTransform(
+      static_cast< double >( m_MousePressPosition.x() ),
+      static_cast< double >( m_MousePressPosition.y() ),
+      center[ 0 ],
+      center[ 1 ]
+    );
+
+    m_MousePressPosition = e->pos();
+
+    emit CenterRoiRequested( center );
+    }
+}
+
+/******************************************************************************/
+/*
+void
+QuicklookViewManipulator
+::MouseReleaseEvent( QMouseEvent* e)
+{
+  assert( e!=NULL );
+
+  // qDebug() << this << ":" << e;
+}
+*/
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::ResizeEvent( QResizeEvent* e )
+{
+  ImageViewManipulator::ResizeEvent( e );
+
+  emit ZoomToExtentRequested();
+}
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::WheelEvent( QWheelEvent * )
+{
+}
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::KeyPressEvent( QKeyEvent * )
+{
+}
+
+/******************************************************************************/
+void
+QuicklookViewManipulator
+::KeyReleaseEvent( QKeyEvent * )
+{
+}
+
+/*****************************************************************************/
+ZoomType
+QuicklookViewManipulator
+::GetFixedZoomType() const
+{
+  return ZOOM_TYPE_EXTENT;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+QuicklookViewManipulator
+::OnRoiChanged( const PointType & origin,
+                const SizeType & size,
+                const SpacingType & spacing,
+                const PointType & )
+{
+  /*
+  qDebug() << this << ":OnRoiChanged()";
+  qDebug() << "origin :" << origin[ 0 ] << "," << origin[ 1 ];
+  qDebug() << "size   :" << size[ 0 ] << "," << size[ 1 ];
+  qDebug() << "spacing:" << spacing[ 0 ] << "," << spacing[ 1 ];
+  */
+
+  m_RoiOrigin = origin;
+  m_RoiSize = size;
+  m_RoiSpacing = spacing;
+ 
+  emit RefreshViewRequested();
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdQuicklookViewRenderer.cxx b/Modules/Visualization/MonteverdiGui/src/mvdQuicklookViewRenderer.cxx
new file mode 100644
index 0000000..641ec8b
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdQuicklookViewRenderer.cxx
@@ -0,0 +1,222 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdQuicklookViewRenderer.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+#include <QtOpenGL>
+
+//
+// System includes (sorted by alphabetic order)
+// necessary for the opengl variables and methods
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+#include "otbGlImageActor.h"
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdStackedLayerModel.h"
+#include "mvdTypes.h"
+#include "mvdVectorImageModel.h"
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::QuicklookViewRenderer
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+QuicklookViewRenderer
+::QuicklookViewRenderer( QObject* p ) :
+  ImageViewRenderer( p ),
+  m_GlRoiActor( otb::GlROIActor::New() )
+{
+  assert( !m_GlRoiActor.IsNull() );
+
+  setObjectName( "QuicklookViewRenderer" );
+
+  m_EffectsEnabled = false;
+}
+
+/*****************************************************************************/
+QuicklookViewRenderer
+::~QuicklookViewRenderer()
+{
+}
+
+/*****************************************************************************/
+AbstractImageViewRenderer::RenderingContext*
+QuicklookViewRenderer
+::NewRenderingContext() const
+{
+  RenderingContext* context = new QuicklookViewRenderer::RenderingContext();
+
+#if USE_VIEW_SETTINGS_SIDE_EFFECT
+#else
+  assert( !m_GlView.IsNull() );
+
+  //
+  // Share otb::GlViewRendering settings with manipulator using
+  // RenderingContext. Manipulator can then setup otb::ViewSettings
+  // directly by side-effect.
+  context->m_ViewSettings = m_GlView->GetSettings();
+#endif
+
+  return context;
+}
+
+/*******************************************************************************/
+void
+QuicklookViewRenderer
+::virtual_SetProjection()
+{
+  SetWktAndKwl();
+}
+
+/*******************************************************************************/
+void
+QuicklookViewRenderer
+::virtual_UpdateProjection()
+{
+  SetWktAndKwl();
+}
+
+/*******************************************************************************/
+void
+QuicklookViewRenderer
+::SetWktAndKwl()
+{
+  // qDebug() << this << "::SetWktAndKwl()";
+
+#if DISABLE_QUICKLOOK_VIEW
+  return;
+#endif
+
+  assert( GetLayerStack()!=NULL );
+
+  if( GetLayerStack()->IsEmpty() )
+    return;
+
+  otb::GlImageActor::Pointer referenceGlImageActor(
+    GetReferenceActor< otb::GlImageActor >()
+  );
+
+  assert( !referenceGlImageActor.IsNull() );
+
+  m_GlRoiActor->SetKwl( referenceGlImageActor->GetKwl() );
+  m_GlRoiActor->SetWkt( referenceGlImageActor->GetWkt() );
+}
+
+/*******************************************************************************/
+void
+QuicklookViewRenderer
+::virtual_FinishScene()
+{
+  // qDebug() << this << "::virtual_FinishScene()";
+
+  assert( !m_GlView.IsNull() );
+
+#if DISABLE_QUICKLOOK_VIEW
+  return;
+#endif
+
+  std::string key( m_GlView->AddActor( m_GlRoiActor, "ROI" ) );
+
+  m_GlRoiActor->SetVisible( true );
+  m_GlRoiActor->SetOverlay( true );
+
+  // qDebug() << "Added roi-actor:" << FromStdString( key );
+
+  /*
+  ColorType color;
+
+  color.Fill( 1.0 );
+
+  m_GlRoiActor->SetColor( color ); 
+  */
+  m_GlRoiActor->SetFill( false );
+  m_GlRoiActor->SetAlpha( 0.2 );
+
+  m_GlView->MoveActorToEndOfRenderingOrder( key, true );
+}
+
+/*****************************************************************************/
+void
+QuicklookViewRenderer
+::UpdateActors( const AbstractImageViewRenderer::RenderingContext* c )
+{
+  // qDebug() << this << "::UpdateActors()";
+
+  assert( c!=NULL );
+
+  ImageViewRenderer::UpdateActors( c );
+
+  assert(
+    c==dynamic_cast< const QuicklookViewRenderer::RenderingContext * >( c )
+  );
+
+  const QuicklookViewRenderer::RenderingContext * context =
+    dynamic_cast< const QuicklookViewRenderer::RenderingContext * >( c );
+
+  // Coverity-19842
+  // {
+  assert( context!=NULL );
+  // }
+
+  /*
+  qDebug()
+    << "ROI-origin:"
+    << context->m_RoiOrigin[ 0 ] << "," << context->m_RoiOrigin[ 1 ]
+    << "ROI-extent:"
+    << context->m_RoiExtent[ 0 ] << "," << context->m_RoiExtent[ 1 ];
+  */
+
+  m_GlRoiActor->SetUL( context->m_RoiOrigin );
+  m_GlRoiActor->SetLR( context->m_RoiExtent );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdSearchableTreeWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdSearchableTreeWidget.cxx
new file mode 100644
index 0000000..7eff742
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdSearchableTreeWidget.cxx
@@ -0,0 +1,115 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdSearchableTreeWidget.h"
+#include "ui_mvdSearchableTreeWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+
+#define ENABLE_DISPLAY_ID 1
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::SearchableTreeWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+SearchableTreeWidget
+::SearchableTreeWidget( QWidget* p, Qt::WindowFlags flags ) :
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::SearchableTreeWidget() )
+{
+  m_UI->setupUi( this );
+
+  SetupUI();
+}
+
+/*******************************************************************************/
+SearchableTreeWidget
+::~SearchableTreeWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+void
+SearchableTreeWidget
+::SetupUI()
+{
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+/*
+void
+SearchableTreeWidget
+::on_treeWidget_currentItemChanged( QTreeWidgetItem* current,
+                                    QTreeWidgetItem* previous )
+{
+}
+*/
+
+/*******************************************************************************/
+/*
+void
+SearchableTreeWidget
+::on_searchLine_textChanged( const QString& text )
+{
+}
+*/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdSearchableTreeWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdSearchableTreeWidget.ui
new file mode 100644
index 0000000..d7a1dc7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdSearchableTreeWidget.ui
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::SearchableTreeWidget</class>
+ <widget class="QWidget" name="mvd::SearchableTreeWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>262</width>
+    <height>116</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="margin">
+    <number>3</number>
+   </property>
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QLineEdit" name="searchLineEdit">
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QTreeWidget" name="treeWidget">
+     <property name="selectionMode">
+      <enum>QAbstractItemView::SingleSelection</enum>
+     </property>
+     <property name="selectionBehavior">
+      <enum>QAbstractItemView::SelectRows</enum>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx
new file mode 100644
index 0000000..f7bfd13
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.cxx
@@ -0,0 +1,278 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdShaderWidget.h"
+#include "ui_mvdShaderWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdImageSettings.h"
+#include "mvdGui.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::ShaderWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+ShaderWidget
+::ShaderWidget( QWidget * p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::ShaderWidget() )
+{
+  m_UI->setupUi( this );
+
+  assert( qApp!=NULL );
+
+  AddItemsInto( m_UI->effectComboBox, "mvd", EFFECT_NAMES, EFFECT_COUNT );
+
+  m_UI->valueLineEdit->setValidator(
+    new QDoubleValidator( m_UI->valueLineEdit )
+  );
+} 
+
+/*******************************************************************************/
+ShaderWidget
+::~ShaderWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+void
+ShaderWidget
+::SetGLSLEnabled( bool isGLSLEnabled )
+{
+  setEnabled( isGLSLEnabled );
+
+  if( !isGLSLEnabled )
+    {
+    typedef QList< QWidget * > WidgetList;
+
+    WidgetList childrenList( findChildren< QWidget * >() );
+
+    for( WidgetList::iterator it( childrenList.begin() );
+	 it!=childrenList.end();
+	 ++ it )
+      ( *it )->setToolTip(
+	tr( "Rendering effects have been disabled because OpenGL Shading Language minimal requirements have not been met while running on this system." )
+      );
+    }
+}
+
+/*******************************************************************************/
+void
+ShaderWidget
+::SetGLSL140Enabled( bool isGLSLEnabled )
+{
+  assert( qApp!=NULL );
+
+  int index =
+    m_UI->effectComboBox->findText(
+      qApp->translate( "mvd", EFFECT_NAMES[ EFFECT_GRADIENT ] )
+    );
+
+  if( isGLSLEnabled )
+    {
+    if( index<0 )
+      m_UI->effectComboBox->addItem( tr( "mvd", EFFECT_NAMES[ EFFECT_GRADIENT ] ) );
+    }
+  else if( index>=0 )
+    m_UI->effectComboBox->removeItem( index );
+}
+
+/*******************************************************************************/
+void
+ShaderWidget
+::virtual_SetSettings( ImageSettings * settings )
+{
+  assert( m_UI!=NULL );
+
+  m_UI->effectComboBox->setEnabled( settings!=NULL );
+  m_UI->sizeLabel->setEnabled( settings!=NULL );
+  m_UI->sizeSpinBox->setEnabled( settings!=NULL && settings->HasSize() );
+  m_UI->valueLabel->setEnabled( settings!=NULL );
+  m_UI->valueLineEdit->setEnabled( settings!=NULL && settings->HasValue() );
+
+  if( settings!=NULL )
+    {
+    assert( qApp!=NULL );
+
+    for( int i=0; i<m_UI->effectComboBox->count(); ++i )
+      if( m_UI->effectComboBox->itemText( i )
+	  .compare(
+	    qApp->translate( "mvd",
+			     EFFECT_NAMES[ settings->GetEffect() ] ) )==0 )
+        {
+        m_UI->effectComboBox->setCurrentIndex( i );
+
+        break;
+        }
+
+    m_UI->sizeSpinBox->setValue( settings->GetSize() );
+
+    char const * const text = settings->GetValueName();
+
+    if( text==NULL )
+      {
+      m_UI->valueLabel->setVisible( false );
+      m_UI->valueLabel->setText( QString() );
+      }
+    else
+      {
+      m_UI->valueLabel->setVisible( true );
+      m_UI->valueLabel->setText( QString( text ).append( ":" ) );
+      }
+
+    m_UI->valueLineEdit->setVisible( text!=NULL );
+    m_UI->valueLineEdit->setText(
+      settings->HasValue()
+      ? QString::number( settings->GetValue(), 'g', std::numeric_limits< double >::digits10 ) // ToQString( settings->GetValue() )
+      : QString()
+    );
+    m_UI->valueLineEdit->setCursorPosition( 0 );
+    }
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+ShaderWidget
+::on_effectComboBox_currentIndexChanged( const QString & text )
+{
+  if( !HasSettings() )
+    return;
+
+  assert( qApp!=NULL );
+
+  for( int i=0; i<EFFECT_COUNT; ++i )
+    if( QString::compare( text, qApp->translate( "mvd", EFFECT_NAMES[ i ] ) )==0 )
+      {
+      ImageSettings * settings = GetSettings();
+      assert( settings!=NULL );
+
+      settings->SetEffect( static_cast< Effect >( i ) );
+
+      m_UI->sizeSpinBox->setEnabled( GetSettings()->HasSize() );
+      m_UI->valueLineEdit->setEnabled( GetSettings()->HasValue() );
+
+      m_UI->sizeSpinBox->setValue( settings->GetSize() );
+
+      char const * const textName = settings->GetValueName();
+
+      if( textName==NULL )
+	{
+	m_UI->valueLabel->setVisible( false );
+	m_UI->valueLabel->setText( QString() );
+	}
+      else
+	{
+	m_UI->valueLabel->setVisible( true );
+	m_UI->valueLabel->setText( QString( textName ).append( ":" ) );
+	}
+
+      m_UI->valueLineEdit->setVisible( textName!=NULL );
+      m_UI->valueLineEdit->setText(
+	settings->HasValue()
+	? ToQString( settings->GetValue() )
+	: QString()
+      );
+
+      emit SettingsChanged();
+
+      return;
+      }
+}
+
+/*******************************************************************************/
+void
+ShaderWidget
+::on_sizeSpinBox_valueChanged( int value )
+{
+  if( !HasSettings() )
+    return;
+
+  GetSettings()->SetSize( value );
+
+  emit SettingsChanged();
+}
+
+/*******************************************************************************/
+void
+ShaderWidget
+::on_valueLineEdit_editingFinished()
+{
+  if( !HasSettings() ||
+      !GetSettings()->HasValue() )
+    return;
+
+  bool isOk = true;
+
+  assert( m_UI!=NULL );
+  assert( m_UI->valueLineEdit!=NULL );
+
+  GetSettings()->SetValue( m_UI->valueLineEdit->text().toDouble( &isOk ) );
+
+  // assert( isOk );
+
+  if( !isOk )
+    return;
+
+  emit SettingsChanged();
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.ui
new file mode 100644
index 0000000..7061649
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdShaderWidget.ui
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::ShaderWidget</class>
+ <widget class="QWidget" name="mvd::ShaderWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>278</width>
+    <height>29</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="spacing">
+    <number>3</number>
+   </property>
+   <property name="margin">
+    <number>1</number>
+   </property>
+   <item>
+    <widget class="QComboBox" name="effectComboBox">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="toolTip">
+      <string>Select effect to apply to selected layer.</string>
+     </property>
+     <property name="insertPolicy">
+      <enum>QComboBox::InsertAlphabetically</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="sizeLabel">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Size:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QSpinBox" name="sizeSpinBox">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="toolTip">
+      <string>Edit effect-brush size.</string>
+     </property>
+     <property name="maximum">
+      <number>1000000000</number>
+     </property>
+     <property name="value">
+      <number>16</number>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="valueLabel">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Value:</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLineEdit" name="valueLineEdit">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="toolTip">
+      <string>Edit effect-parameter value.</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdStatusBarWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdStatusBarWidget.cxx
new file mode 100644
index 0000000..00df23d
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdStatusBarWidget.cxx
@@ -0,0 +1,301 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdStatusBarWidget.h"
+#include "ui_mvdStatusBarWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+// #include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+/*
+  TRANSLATOR mvd::StatusBarWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+/*****************************************************************************/
+StatusBarWidget
+::StatusBarWidget( QWidget* p, Qt::WindowFlags flags  ):
+  QWidget( p, flags ),
+  m_UI( new mvd::Ui::StatusBarWidget() )
+{
+  m_UI->setupUi( this );
+}
+
+/*****************************************************************************/
+StatusBarWidget
+::~StatusBarWidget()
+{
+  delete m_UI;
+  m_UI = NULL;
+}
+
+/*****************************************************************************/
+QString
+StatusBarWidget
+::ZoomLevel( double scale )
+{
+  if( scale>1.0 )
+    return QString( "%1:1" ).arg( scale );
+
+  else if( scale<1.0 )
+    return QString( "1:%1" ).arg( 1.0 / scale );
+
+  return "1:1";
+}
+
+/*****************************************************************************/
+void
+StatusBarWidget
+::SetGLSLEnabled( bool enabled )
+{
+  m_UI->renderModelLabel->setText(
+    enabled
+    ? tr( "GLSL" )
+    : tr( "OpenGL" )
+  );
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+void
+StatusBarWidget
+::SetPixelIndex( const IndexType & pixel, bool isInsideRegion )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->pixelIndexLineEdit!=NULL );
+
+  m_UI->pixelIndexLineEdit->setText(
+    isInsideRegion
+    ? QString( "%1, %2" ).arg( pixel[ 0 ] ).arg( pixel[ 1 ] )
+    : QString()
+  );
+}
+
+/*****************************************************************************/
+void
+StatusBarWidget
+::SetScale( double sx, double )
+{
+  // qDebug() << this << "::SetScale(" << sx << "," << sy << ")";
+
+  /*
+  if( sx!=sy )
+    zoomLevel.append( "/" + StatusBarWidget::ZoomLevel( sy ) );
+  */
+
+  m_UI->scaleLineEdit->setText( StatusBarWidget::ZoomLevel( sx ) );
+}
+
+/*****************************************************************************/
+/* PRIVATE SLOTS                                                             */
+/*****************************************************************************/
+/*
+void
+StatusBarWidget
+::SetPixelIndexText( const QString& text )
+{
+  m_UI->pixelIndexLineEdit->setText( text );
+}
+*/
+
+/*****************************************************************************/
+void
+StatusBarWidget
+::SetText( const QString & text )
+{
+  assert( m_UI!=NULL );
+  assert( m_UI->pixelIndexLineEdit!=NULL );
+
+  m_UI->pixelRadiometryLabel->setText( text );
+}
+
+/*****************************************************************************/
+void
+StatusBarWidget
+::on_pixelIndexLineEdit_returnPressed()
+{
+  //
+  // Cancel if pixel-index coordinates text is empty.
+  if( m_UI->pixelIndexLineEdit->text().isEmpty() )
+    return;
+
+  //
+  // Split coordinates.
+  QStringList coordinates( m_UI->pixelIndexLineEdit->text().split( ',' ) );
+
+  //
+  // Check split coordinates format.
+  assert( coordinates.size()==1 || coordinates.size()==2 );
+
+  if( coordinates.size()!=1 && coordinates.size()!=2 )
+    return;
+
+  //
+  // Construct resulting pixel-index.
+  IndexType index;
+
+  index.Fill( 0 );
+
+  //
+  // Convert first pixel-index coordinate.
+  bool isOk = true;
+  index[ 0 ] = coordinates.front().toUInt( &isOk );
+
+  // assert( isOk );
+
+  if( !isOk )
+    return;
+
+  //
+  // Convert second pixel-index coordinate.
+  if( coordinates.size()>1 )
+    {
+    index[ 1 ] = coordinates.back().toUInt( &isOk );
+
+    // assert( isOk );
+
+    if( !isOk )
+      return;
+    }
+
+  //
+  // If both pixel-index coordinates have correctly been converted,
+  // emit pixel-index changed signal.
+  emit PixelIndexChanged( index );
+}
+
+/*****************************************************************************/
+void
+StatusBarWidget
+::on_scaleLineEdit_editingFinished()
+{
+  //
+  // Cancel if scale text is empty.
+  if( m_UI->scaleLineEdit->text().isEmpty() )
+    return;
+
+  //
+  // Split scale text.
+  QStringList scale( m_UI->scaleLineEdit->text().split( ':' ) );
+
+  //
+  // Check scale text format.
+  // assert( scale.size()==1 || scale.size()==2 );
+
+  if( scale.size()!=1 && scale.size()!=2 )
+    return;
+
+  /*
+  if( scale.size()!=1 && scale.size()!=2 )
+    {
+    throw std::invalid_argument(
+      ToStdString(
+        tr( "Invalid argument: '%1' should be scale of the form <numerator>[:<denominator>] with numerator and denominator being real numbers." )
+      )
+    );
+    }
+  */
+
+  //
+  // Convert scale numerator.
+  bool isOk = true;
+  double numerator = scale.front().toDouble( &isOk );
+
+  // assert( isOk );
+  // assert( numerator!=0.0 );
+
+  if( !isOk || numerator==0.0 )
+    return;
+
+  /*
+  if( !isOk )
+    {
+    throw std::invalid_argument(
+      ToStdString(
+        tr( "Invalid argument: '%1' should be scale of the form <numerator>[:<denominator>] with numerator and denominator being real numbers." )
+      )
+    );
+    }
+  */
+
+  //
+  // Convert scale denominator.
+  double denominator = 1.0;
+
+  if( scale.size()>1 )
+    {
+    denominator = scale.back().toDouble( &isOk );
+
+    // assert( isOk );
+
+    if( !isOk )
+      return;
+
+    /*
+    if( !isOk )
+      {
+      throw std::invalid_argument(
+        ToStdString(
+          tr( "Invalid argument: '%1' should be scale of the form <numerator>[:<denominator>] with numerator and denominator being real numbers." )
+        )
+      );
+      }
+    */
+    }
+
+  //
+  // Emit scale changed.
+  emit ScaleChanged( numerator / denominator );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdStatusBarWidget.ui b/Modules/Visualization/MonteverdiGui/src/mvdStatusBarWidget.ui
new file mode 100644
index 0000000..e45dcc7
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdStatusBarWidget.ui
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::StatusBarWidget</class>
+ <widget class="QWidget" name="mvd::StatusBarWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>628</width>
+    <height>20</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string/>
+  </property>
+  <property name="toolTip">
+   <string>Ice rendering mode (OpenGL texture or GLSL if using OpenGL Shading Language)</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="sizeConstraint">
+    <enum>QLayout::SetMinimumSize</enum>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QLabel" name="label_5">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Position</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLineEdit" name="pixelIndexLineEdit">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>100</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="Line" name="line">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="pixelRadiometryLabel">
+     <property name="minimumSize">
+      <size>
+       <width>200</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Radiometry</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="horizontalSpacer_2">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>40</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="Line" name="line_2">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_4">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Zoom Level</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLineEdit" name="scaleLineEdit">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>150</width>
+       <height>20</height>
+      </size>
+     </property>
+     <property name="toolTip">
+      <string>Current zoom-level of view, relative to reference layer (projection and spacing).</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="Line" name="line_3">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="renderModelLabel">
+     <property name="text">
+      <string>GLSL</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdTaskProgressDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdTaskProgressDialog.cxx
new file mode 100644
index 0000000..fd73298
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdTaskProgressDialog.cxx
@@ -0,0 +1,228 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdTaskProgressDialog.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAbstractWorker.h"
+#include "mvdBackgroundTask.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::TaskProgressDialog
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+TaskProgressDialog
+::TaskProgressDialog( BackgroundTask* task,
+		      QWidget* p,
+		      Qt::WindowFlags flags ):
+  QProgressDialog( p, flags ),
+  m_BackgroundTask( task ),
+  m_Object( NULL ),
+  m_Exception()
+{
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Do not take ownership of background-task to leave display
+  // independent of execution of background-tas.
+  //
+  // m_BackgroundTask->setParent( this );
+
+  QObject::connect(
+    task->GetWorker(), SIGNAL( ProgressTextChanged( const QString& ) ),
+    // to:
+    this, SLOT( setLabelText( const QString& ) )
+  );
+
+  QObject::connect(
+    task->GetWorker(), SIGNAL( ProgressValueChanged( int ) ),
+    // to:
+    this, SLOT( setValue( int ) )
+  );
+
+  QObject::connect(
+    task->GetWorker(), SIGNAL( ProgressRangeChanged( int, int ) ),
+    // to:
+    this, SLOT( setRange( int, int ) )
+  );
+
+  QObject::connect(
+    task->GetWorker(),
+    SIGNAL( Done( QObject* ) ),
+    // to:
+    this,
+    SLOT( OnDone( QObject* ) )
+  );
+
+  QObject::connect(
+    task->GetWorker(),
+    SIGNAL( ExceptionRaised( QString ) ),
+    // to:
+    this,
+    SLOT( OnExceptionRaised( QString ) )
+  );
+
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Accept progress-dialog when thread has been signaled as
+  // finished() and not when worker object has done or finished it's
+  // job (while the thread is still running when Done() or Finished()
+  // is signalled).
+  QObject::connect(
+    task,
+    SIGNAL( finished() ),
+    // to:
+    this,
+    SLOT( accept() )
+  );
+
+  // Keep informed When some object is destroyed.
+  QObject::connect(
+    m_BackgroundTask,
+    SIGNAL( destroyed( QObject* ) ),
+    // to:
+    this,
+    SLOT( OnObjectDestroyed( QObject* ) )
+  );
+}
+
+/*******************************************************************************/
+TaskProgressDialog
+::~TaskProgressDialog()
+{
+  // qDebug() << this << "is being destroyed.";
+
+
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Trace (for debugging purposes) if background-task thread is still
+  // running when destroying this dialog.
+#if ( defined( OTB_DEBUG ) && 1 ) || 0
+  if( m_BackgroundTask!=NULL &&
+      m_BackgroundTask->isRunning() )
+    {
+    qDebug() << m_BackgroundTask << "is still running!";
+    }
+#endif
+
+  // qDebug() << this << "has been destroyed.";
+}
+
+/*****************************************************************************/
+int
+TaskProgressDialog
+::Exec()
+{
+  m_BackgroundTask->start();
+
+  setLabelText( m_BackgroundTask->GetWorker()->GetFirstProgressText() );
+
+  return exec();
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+void
+TaskProgressDialog
+::OnDone( QObject* res )
+{
+  m_Object = res;
+
+  // MANTIS-921 (http://bugs.orfeo-toolbox.org/view.php?id=921).
+  //
+  // Accept is slotted to QThread finished() signal for correct thread
+  // synchronization.
+  //
+  // accept();
+}
+
+/*******************************************************************************/
+void
+TaskProgressDialog
+::OnExceptionRaised( QString what )
+{
+  QMessageBox::warning(
+    this->parentWidget(),
+    tr( "%1 - Warning!" ).arg( PROJECT_NAME ),
+    what
+  );
+
+  reject();
+}
+
+/*******************************************************************************/
+void
+TaskProgressDialog
+::OnObjectDestroyed( QObject* object )
+{
+  // qDebug() << this << "::OnObjectDestryed(" << object << ")";
+
+  assert( object==m_BackgroundTask );
+
+  if( object==m_BackgroundTask )
+    {
+    // qDebug() << this << "forgetting" << m_BackgroundTask;
+
+    // Forget background-task.
+    m_BackgroundTask = NULL;
+
+    // Accept QDialog te prevent locking the UI.
+    accept();
+    }
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdTreeWidget.cxx b/Modules/Visualization/MonteverdiGui/src/mvdTreeWidget.cxx
new file mode 100644
index 0000000..d9de590
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdTreeWidget.cxx
@@ -0,0 +1,568 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdTreeWidget.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdAlgorithm.h"
+#include "mvdDataStream.h"
+#include "mvdTreeWidgetItem.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::TreeWidget
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+const char*
+TreeWidget
+::ITEM_MIME_TYPE = "application/x-qtreewidgetitemptrlist";
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+#if USE_CUSTOM_MIME_DATA
+
+class StaticInitializer
+{
+public:
+  StaticInitializer() :
+    m_QTreeWidgetItemPtrMetaTypeId( -1 )
+  {
+    Initialize();
+  }
+
+  ~StaticInitializer()
+  {
+    Finalize();
+  }
+
+private:
+  inline
+  void
+  Initialize()
+  {
+    //
+    // Call qRegisterMetaType<>() to make type available in
+    // non-template signatures and serialization.
+    m_QTreeWidgetItemPtrMetaTypeId =
+      qRegisterMetaType< QTreeWidgetItem* >( "QTreeWidgetItem*" );
+
+    //
+    // Register serialization operators for custom meta-types.
+#if QT_VERSION >= QT_VERSION_CHECK( 4, 7, 0 )
+    qRegisterMetaTypeStreamOperators< QTreeWidgetItem* >();
+#else // QT_VERSION >= QT_VERSION_CHECK( 4, 7, 0 )
+    qRegisterMetaTypeStreamOperators< QTreeWidgetItem* >(
+      QMetaType::typeName( m_QTreeWidgetItemPtrMetaTypeId )
+    );
+#endif // QT_VERSION >= QT_VERSION_CHECK( 4, 7, 0 )
+  }
+
+  inline
+  void
+  Finalize()
+  {
+  }
+
+  int m_QTreeWidgetItemPtrMetaTypeId;
+};
+
+namespace
+{
+static const StaticInitializer STATIC_INITIALIZER;
+}
+
+#endif // USE_CUSTOM_MIME_DATA
+
+/*****************************************************************************/
+QMimeData*
+EncodeMimeData( QMimeData* mimeData, const QList< QTreeWidgetItem* >& items )
+{
+#if USE_CUSTOM_MIME_DATA
+
+  assert( mimeData!=NULL );
+
+  typedef QList< QTreeWidgetItem* > QTreeWidgetItemList;
+
+  QByteArray byteArray;
+  QDataStream stream( &byteArray, QIODevice::WriteOnly );
+
+  for( QTreeWidgetItemList::const_iterator it( items.begin() );
+       it!=items.end();
+       ++it )
+    {
+    /*
+    qDebug()
+      << "QTreeWidgetItem::parent()==" << ( *it )->parent();
+    qDebug()
+      << "Pointer:" << static_cast< void* >( *it );
+    qDebug()
+      << "Variant:" << QVariant::fromValue< QTreeWidgetItem* >( *it );
+    */
+
+#if 1
+    QTreeWidgetItem * item = *it;
+
+    qDebug()
+      << "Item (encoded):"
+      << item << "\n"
+      << "text[ 0 ]:" << item->text( 0 ) << "\n"
+      << "text[ 1 ]:" << item->text( 1 ) << "\n"
+      << "text[ 2 ]:" << item->text( 2 );
+
+    if( item->parent()!=NULL )
+      {
+      qDebug()
+        << "parent:" << item->parent() << "\n"
+        << "text[ 0 ]:" << item->parent()->text( 0 ) << "\n"
+        << "text[ 1 ]:" << item->parent()->text( 1 );
+      }
+#endif
+
+    // http://www.qtfr.org/viewtopic.php?id=9630
+    // stream << *it;
+    stream << QVariant::fromValue< QTreeWidgetItem* >( *it );
+    }
+
+  mimeData->setData( TreeWidget::ITEM_MIME_TYPE, byteArray );
+
+  /*
+  qDebug() << mimeData->formats();
+
+  for( QTreeWidgetItemList::const_iterator it( items.begin() );
+       it!=items.end();
+       ++it )
+    {
+    QTreeWidgetItem* item = *it;
+
+    qDebug()
+      << item->type() << item->text( 0 ) << item->text( 1 ) << item->text( 2 );
+    }
+  */
+
+#endif // USE_CUSTOM_MIME_DATA
+
+  return mimeData;
+}
+
+/*****************************************************************************/
+int
+DecodeMimeData( QList< QTreeWidgetItem* >& items, const QMimeData* mimeData )
+{
+  assert( mimeData!=NULL );
+
+  int count = 0;
+
+#if USE_CUSTOM_MIME_DATA
+
+  if( !mimeData->hasFormat( TreeWidget::ITEM_MIME_TYPE ) )
+    return 0;
+
+  QByteArray byteArray(
+    mimeData->data( TreeWidget::ITEM_MIME_TYPE )
+  );
+
+  QDataStream stream( &byteArray, QIODevice::ReadOnly );
+
+  //
+  // http://www.qtcentre.org/threads/8756-QTreeWidgetItem-mime-type
+
+  QTreeWidgetItem* item = NULL;
+
+  while( !stream.atEnd() )
+    {
+    QVariant variant;
+
+    stream >> variant;
+
+    // qDebug() << "Variant:" << variant;
+
+    // http://www.qtfr.org/viewtopic.php?id=9630
+
+    item = variant.value< QTreeWidgetItem* >();
+    assert( item!=NULL );
+
+    items.push_back( item );
+
+#if 1
+    qDebug()
+      << "Item (decoded):"
+      << item << "\n"
+      << "text[ 0 ]:" << item->text( 0 ) << "\n"
+      << "text[ 1 ]:" << item->text( 1 ) << "\n"
+      << "text[ 2 ]:" << item->text( 2 );
+
+      if( item->parent()!=NULL )
+        {
+        qDebug()
+          << "parent:" << item->parent() << "\n"
+          << "text[ 0 ]:" << item->parent()->text( 0 ) << "\n"
+          << "text[ 1 ]:" << item->parent()->text( 1 );
+        }
+#endif
+
+    ++ count;
+    }
+
+  // qDebug() << count2 << "items.";
+
+#else // USE_CUSTOM_MIME_DATA
+
+  /*
+  if( !mimeData->hasFormat( "application/x-qabstractitemmodeldatalist" ) )
+    return 0;
+
+  QByteArray byteArray(
+    mimeData->data( "application/x-qabstractitemmodeldatalist" )
+  );
+
+  QDataStream stream( &byteArray, QIODevice::ReadOnly );
+
+  //
+  // http://www.qtcentre.org/threads/8756-QTreeWidgetItem-mime-type
+
+  QTreeWidgetItem* item = NULL;
+
+  while( !stream.atEnd() )
+    {
+    ++ count;
+    }
+  */
+
+#endif // USE_CUSTOM_MIME_DATA
+
+  return count;
+}
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+TreeWidget
+::TreeWidget( QWidget* p  ):
+  QTreeWidget( p )
+{
+  setSelectionBehavior( QAbstractItemView::SelectRows );
+
+  // MANTIS-929: Leave default behaviour
+  //
+  // setDefaultDropAction( Qt::MoveAction );
+  // setDefaultDropAction( Qt::CopyAction );
+  // setDefaultDropAction( Qt::LinkAction );
+
+  // MANTIS-929: Setting inspired from QGis; don't understand why
+  // there is one call with InternalMode and another with DragDrop but
+  // think it might change setting drag-enabled and accept-drop
+  // behaviour.
+  //
+  setDragDropMode( QAbstractItemView::InternalMove );
+  setDragEnabled( true );
+  setAcceptDrops( true );
+  setDragDropMode( QAbstractItemView::DragDrop );
+}
+
+/*******************************************************************************/
+TreeWidget
+::~TreeWidget()
+{
+}
+
+/*******************************************************************************/
+QStringList
+TreeWidget
+::mimeTypes() const
+{
+  // qDebug() << this << "::mimeTypes()";
+
+  QStringList mTypes( QTreeWidget::mimeTypes() );
+
+#if USE_CUSTOM_MIME_DATA
+
+  mTypes << TreeWidget::ITEM_MIME_TYPE;
+
+#endif // USE_CUSTOM_MIME_DATA
+
+  return mTypes;
+}
+
+/*******************************************************************************/
+QMimeData*
+TreeWidget
+::mimeData( const QList< QTreeWidgetItem* > itemList ) const
+{
+  // qDebug() << this << "::mimeData(" << itemList << ")";
+
+  return EncodeMimeData( QTreeWidget::mimeData( itemList ), itemList );
+}
+
+/*******************************************************************************/
+Qt::DropActions
+TreeWidget
+::supportedDropActions() const
+{
+  // This method is overloaded only to spy/debug Qt behavior.
+
+  Qt::DropActions supportedActions = QTreeWidget::supportedDropActions();
+
+  qDebug() << this << "::supportedDropActions():" << supportedActions;
+
+  return supportedActions;
+}
+
+/*******************************************************************************/
+void
+TreeWidget
+::startDrag( Qt::DropActions supportedActions )
+{
+  // This method is overloaded only to spy/debug Qt behavior.
+
+  qDebug() << this << "::startDrag(" << supportedActions << ")";
+
+  QTreeWidget::startDrag( supportedActions );
+}
+
+/*******************************************************************************/
+void
+TreeWidget
+::dragEnterEvent( QDragEnterEvent* e )
+{
+  qDebug() << this << "::dragEnterEvent(" << e << ")";
+
+  // e->acceptProposedAction();
+
+  QTreeWidget::dragEnterEvent( e );
+}
+
+/*******************************************************************************/
+void 
+TreeWidget
+::dragMoveEvent( QDragMoveEvent* e )
+{
+  assert( e!=NULL );
+
+  qDebug() << this << "::dragMoveEvent(" << e << ")";
+  qDebug() << this << itemAt( e->pos() );
+
+  QTreeWidget::dragMoveEvent( e );
+
+  QTreeWidgetItem* item = itemAt( e->pos() );
+  // const QMimeData * mimeData = e->mimeData();
+
+#if USE_CUSTOM_MIME_DATA
+  if( e->mimeData()->hasFormat( TreeWidget::ITEM_MIME_TYPE ) &&
+      item!=NULL )
+#else // USE_CUSTOM_MIME_DATA
+  if( item!=NULL )
+#endif // USE_CUSTOM_MIME_DATA
+    {
+    qDebug() << "ACCEPT";
+    e->accept();
+    }
+  else
+    {
+    qDebug() << "IGNORE";
+    e->ignore();
+    }
+
+  /*
+  if( e->source()==this )
+    {
+    e->setDropAction( Qt::MoveAction );
+    e->accept();
+    }
+  */
+
+  /*
+  if( itemAt( e->pos() )==NULL )
+    e->ignore();
+  else
+    e->accept();
+  */
+}
+
+/*******************************************************************************/
+void
+TreeWidget
+::dragLeaveEvent( QDragLeaveEvent* e )
+{
+  qDebug() << this << "::dragLeaveEvent(" << e << ")";
+
+  QTreeWidget::dragLeaveEvent( e );
+}
+
+/*******************************************************************************/
+void 
+TreeWidget
+::dropEvent( QDropEvent* e )
+{
+  assert( e!=NULL );
+
+  // qDebug() << this << "::dropEvent(" << e << ")";
+
+  typedef QList< QTreeWidgetItem* > QTreeWidgetItemList;
+
+  QTreeWidgetItemList itemList;
+
+  DecodeMimeData( itemList, e->mimeData() );
+
+  if( e->source()==this )
+    {
+    e->setDropAction( Qt::MoveAction );
+    // e->accept();
+    }
+
+  qDebug() << "dropAction:" << e->dropAction();
+
+  QTreeWidget::dropEvent( e );
+
+  qDebug() << "dropAction:" << e->dropAction();
+
+  /*
+  QTreeWidgetItem * item = itemAt( e->pos() );
+
+  while( !item->flags().testFlag( Qt::ItemIsDropEnabled ) )
+    {
+    item = item->parent();
+    assert( item!=NULL ); 
+
+#if 1
+    qDebug()
+      << "Item (target):"
+      << item << "\n"
+      << "text[ 0 ]:" << item->text( 0 ) << "\n"
+      << "text[ 1 ]:" << item->text( 1 ) << "\n"
+      << "text[ 2 ]:" << item->text( 2 ) << "\n"
+      << "parent:" << item->parent() << "\n"
+      << "text[ 0 ]:" << item->parent()->text( 0 ) << "\n"
+      << "text[ 1 ]:" << item->parent()->text( 1 );
+#endif
+    }
+  */
+
+  /*
+  for( QTreeWidgetItemList::const_iterator it = itemList.begin();
+       it!=itemList.end();
+       ++it )
+    {
+    switch( e->dropAction() )
+      {
+      case Qt::MoveAction:
+        emit ItemMoved( *it, itemAt( e->pos() ) );
+        break;
+
+      default:
+        break;
+      }
+    }
+  */
+
+  QTreeWidgetItem * target = itemAt( e->pos() );
+
+  qDebug() << "itemAt(" << e->pos() << "):" << target;
+
+  if( e->source()==this )
+    for( QTreeWidgetItemList::const_iterator it = itemList.begin();
+         it!=itemList.end();
+         ++it )
+      emit ItemMoved( *it, target );
+}
+
+/*******************************************************************************/
+/* SLOTS                                                                       */
+/*******************************************************************************/
+
+} // end namespace 'mvd'
+
+/*****************************************************************************/
+/* GLOBAL FUNCTIONS IMPLEMENTATION SECTION                                   */
+
+#if USE_CUSTOM_MIME_DATA
+
+#if TREE_WIDGET_ITEM_USE_STREAM_OPERATORS
+
+/*****************************************************************************/
+QDataStream&
+operator << ( QDataStream& out, QTreeWidgetItem const * item )
+{
+  /*
+  qDebug() <<
+    "QDataStream& operator << ( QDataStream&, QTreeWidgetItem const * & );";
+  */
+
+#if DATA_STREAM_USE_TEMPLATE_OPERATORS
+  return operator << < QTreeWidgetItem >( out, item );
+
+#else // DATA_STREAM_USE_TEMPLATE_OPERATORS
+  DATA_STREAM_OUT( out, QTreeWidgetItem, item );
+
+  return out;
+
+#endif // DATA_STREAM_USE_TEMPLATE_OPERATORS
+}
+
+/*****************************************************************************/
+QDataStream&
+operator >>( QDataStream& in, QTreeWidgetItem * & item )
+{
+  /*
+  qDebug() <<
+    "QDataStream& operator >> ( QDataStream&, QTreeWidgetItem * & );";
+  */
+
+#if DATA_STREAM_USE_TEMPLATE_OPERATORS
+  return operator >> < QTreeWidgetItem >( in, item );
+
+#else // DATA_STREAM_USE_TEMPLATE_OPERATORS
+  DATA_STREAM_IN( in, QTreeWidgetItem, item );
+
+  return in;
+
+#endif // DATA_STREAM_USE_TEMPLATE_OPERATORS
+
+}
+
+#endif // TREE_WIDGET_ITEM_USE_STREAM_OPERATORS
+
+#endif // USE_CUSTOM_MIME_DATA
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdTreeWidgetItem.cxx b/Modules/Visualization/MonteverdiGui/src/mvdTreeWidgetItem.cxx
new file mode 100644
index 0000000..98ea52b
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdTreeWidgetItem.cxx
@@ -0,0 +1,181 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdTreeWidgetItem.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::TreeWidgetItem
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+namespace
+{
+int count = 0;
+}
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*******************************************************************************/
+
+// MANTIS-947: Workaround for QTreeWidget::itemAt() returning NULL for
+// last item of view after DatabaseBrowserController::UpdateTree() has
+// been called subsequent to insert new group.
+//
+// This workaround reverts the order of insertion of NODE items so
+// that the last item is always at first index instead of last one.
+//
+// Side effect: This inverts the order for all QTreeWidget using
+// mvd::TreeWidgetItem, not only those in DatabaseBrowser view.
+#define BUG_WORKAROUND_MANTIS_947 1
+
+TreeWidgetItem
+::TreeWidgetItem( QTreeWidgetItem* p,
+                  const QString& txt,
+                  const QVariant& id,
+                  const QStringList& columns,
+                  TreeWidgetItem::ItemType itemType ) :
+#if BUG_WORKAROUND_MANTIS_947
+  QTreeWidgetItem( QStringList( txt ) << QString() << columns, itemType )
+#else // BUG_WORKAROUND_MANTIS_947
+  QTreeWidgetItem( p, QStringList( txt ) << QString() << columns, itemType )
+#endif // BUG_WORKAROUND_MANTIS_947
+{
+  assert( p!=NULL );
+  // parent->addChild( this );
+
+  SetId( id );
+
+  switch( itemType )
+    {
+    case TreeWidgetItem::ITEM_TYPE_NODE:
+      setChildIndicatorPolicy(
+        QTreeWidgetItem::ShowIndicator
+      );
+      setFlags(
+        // Qt::ItemIsDragEnabled |
+        Qt::ItemIsDropEnabled |
+        Qt::ItemIsEditable |
+        Qt::ItemIsEnabled
+      );
+#if BUG_WORKAROUND_MANTIS_947
+      p->insertChild( 0, this );
+#endif // BUG_WORKAROUND_MANTIS_947
+    break;
+
+    case TreeWidgetItem::ITEM_TYPE_LEAF:
+      setChildIndicatorPolicy(
+        QTreeWidgetItem::DontShowIndicator
+      );
+      setFlags(
+        Qt::ItemIsDragEnabled |
+        Qt::ItemIsEditable |
+        Qt::ItemIsEnabled |
+        Qt::ItemIsSelectable
+      );
+#if BUG_WORKAROUND_MANTIS_947
+      p->addChild( this );
+#endif // BUG_WORKAROUND_MANTIS_947
+      break;
+
+    default:
+      assert( false );
+      break;
+    }
+
+  /*
+  qDebug()
+    << "NEW Item:" << count << "\n"
+    << "type:" << GetType() << "\n"
+    << "id:" << GetId() << "\n"
+    << "text:" << GetText() << "\n"
+    << "hash:" << this->text( 2 ) << "\n"
+    << "parent:" << this->parent() << "\n"
+    << "text[ 0 ]:" << parent->text( 0 );
+  */
+
+  ++ count;
+
+  qDebug() << "Item count:" << count;
+}
+
+/*******************************************************************************/
+TreeWidgetItem
+::~TreeWidgetItem()
+{
+  /*
+  qDebug()
+    << "DELETE Item:" << "\n"
+    << "type:" << GetType() << "\n"
+    << "id:" << GetId() << "\n"
+    << "text:" << GetText() << "\n"
+    << "hash:" << text( 2 ) << "\n"
+    << "parent:" << parent() << "\n"
+    << "text[ 0 ]:" << (parent()==NULL ? "" : parent()->text( 0 ));
+  */
+
+  -- count;
+
+  qDebug() << "Item count:" << count;
+}
+
+/*******************************************************************************/
+QTreeWidgetItem*
+TreeWidgetItem
+::clone() const
+{
+  qDebug() << this << "::clone()";
+
+  return new TreeWidgetItem( *this );
+}
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdTreeWidgetItemDragAndDropEventFilter.cxx b/Modules/Visualization/MonteverdiGui/src/mvdTreeWidgetItemDragAndDropEventFilter.cxx
new file mode 100644
index 0000000..7e2bb2c
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdTreeWidgetItemDragAndDropEventFilter.cxx
@@ -0,0 +1,161 @@
+/*=========================================================================
+
+  Program:   Monteverdi
+  Language:  C++
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See Copyright.txt for details.
+
+  Monteverdi is distributed under the CeCILL licence version 2. See
+  Licence_CeCILL_V2-en.txt or
+  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt for more 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 "mvdTreeWidgetItemDragAndDropEventFilter.h"
+
+
+/*****************************************************************************/
+/* INCLUDE SECTION                                                           */
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+#include <cassert>
+
+//
+// ITK includes (sorted by alphabetic order)
+
+//
+// OTB includes (sorted by alphabetic order)
+
+//
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdTreeWidget.h"
+
+namespace mvd
+{
+
+/*
+  TRANSLATOR mvd::TreeWidgetItemDragAndDropEventFilter
+
+  Necessary for lupdate to be aware of C++ namespaces.
+
+  Context comment for translator.
+*/
+
+
+/*****************************************************************************/
+/* CONSTANTS                                                                 */
+
+const char* TREE_WIDGET_ITEM_MIME_TYPE = "application/x-qtreewidgetitemptrlist";
+
+/*****************************************************************************/
+/* STATIC IMPLEMENTATION SECTION                                             */
+
+
+/*****************************************************************************/
+/* CLASS IMPLEMENTATION SECTION                                              */
+
+/*****************************************************************************/
+TreeWidgetItemDragAndDropEventFilter
+::TreeWidgetItemDragAndDropEventFilter( QObject* p  ) :
+  AbstractDragAndDropEventFilter( p )
+{
+}
+
+/*****************************************************************************/
+TreeWidgetItemDragAndDropEventFilter
+::~TreeWidgetItemDragAndDropEventFilter()
+{
+}
+
+/*****************************************************************************/
+bool
+TreeWidgetItemDragAndDropEventFilter
+::DragEnterEvent( QObject *, QDragEnterEvent* e )
+{
+  //
+  // Bypass event its MIME data does not contain not URL(s).
+  if( !e->mimeData()->hasFormat( TREE_WIDGET_ITEM_MIME_TYPE ) )
+    return false;
+
+  //
+  // Accept event if its MIME data contains some URL(s) and they are
+  // all local filenames.
+  e->acceptProposedAction();
+
+  //
+  // Eatup event.
+  return true;
+}
+
+/*****************************************************************************/
+bool
+TreeWidgetItemDragAndDropEventFilter
+::DragLeaveEvent( QObject *, QDragLeaveEvent * )
+{
+  //
+  // Nothing to do: bypass event & let default behaviour occur.
+  return false;
+}
+
+/*****************************************************************************/
+bool
+TreeWidgetItemDragAndDropEventFilter
+::DragMoveEvent( QObject *, QDragMoveEvent * )
+{
+  //
+  // Nothing to do: bypass event & let default behaviour occur.
+  return false;
+}
+
+/*****************************************************************************/
+bool
+TreeWidgetItemDragAndDropEventFilter
+::DropEvent( QObject *, QDropEvent * e )
+{
+  assert( e!=NULL );
+  assert( e->mimeData()!=NULL );
+
+
+  //
+  // Decode MIME data.
+
+  typedef QList< QTreeWidgetItem* > QTreeWidgetItemList;
+
+  QTreeWidgetItemList items;
+
+  int count = DecodeMimeData( items, e->mimeData() );
+
+  if( count==0 )
+    return false;
+
+  //
+  // Emit signals.
+
+  for( QTreeWidgetItemList::const_iterator it = items.begin();
+       it!=items.end();
+       ++it )
+    {
+    emit ItemDropped( *it );
+    }
+
+  //
+  // Eatup event.
+
+  return true;
+}
+
+/*****************************************************************************/
+/* SLOTS                                                                     */
+/*****************************************************************************/
+
+} // end namespace 'mvd'
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdVideoColorToolBox.ui b/Modules/Visualization/MonteverdiGui/src/mvdVideoColorToolBox.ui
new file mode 100644
index 0000000..2407dcf
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/src/mvdVideoColorToolBox.ui
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mvd::VideoColorToolBox</class>
+ <widget class="QToolBox" name="mvd::VideoColorToolBox">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>152</width>
+    <height>133</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Video color</string>
+  </property>
+  <property name="locale">
+   <locale language="C" country="AnyCountry"/>
+  </property>
+  <property name="frameShape">
+   <enum>QFrame::NoFrame</enum>
+  </property>
+  <property name="currentIndex">
+   <number>0</number>
+  </property>
+  <widget class="mvd::ColorSetupWidget" name="videoColorSetupPage">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>152</width>
+     <height>79</height>
+    </rect>
+   </property>
+   <attribute name="label">
+    <string>Video color setup</string>
+   </attribute>
+  </widget>
+  <widget class="mvd::ColorDynamicsWidget" name="videoColorDynamicsPage">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>152</width>
+     <height>79</height>
+    </rect>
+   </property>
+   <attribute name="label">
+    <string>Video color dynamics</string>
+   </attribute>
+  </widget>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>mvd::ColorSetupWidget</class>
+   <extends>QWidget</extends>
+   <header>mvdColorSetupWidget.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>mvd::ColorDynamicsWidget</class>
+   <extends>QWidget</extends>
+   <header>mvdColorDynamicsWidget.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Visualization/MonteverdiGui/test/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/test/CMakeLists.txt
new file mode 100644
index 0000000..ea624e4
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/test/CMakeLists.txt
@@ -0,0 +1,15 @@
+otb_module_test()
+
+set(OTBMonteverdiGUITests
+mvdApplicationsBrowserTest.cxx
+mvdApplicationsToolBoxTest.cxx
+mvdFillToolBoxWidgetTreeTest.cxx
+mvdMonteverdiGuiTestDriver.cxx
+)
+
+add_executable(mvdMonteverdiGuiTestDriver ${OTBMonteverdiGUITests})
+target_link_libraries(mvdMonteverdiGuiTestDriver ${OTBMonteverdiGUI-Test_LIBRARIES})
+otb_module_target_label(mvdMonteverdiGuiTestDriver)
+
+# Tests Declaration
+# TODO
diff --git a/Modules/Visualization/MonteverdiGui/test/mvdApplicationsBrowserTest.cxx b/Modules/Visualization/MonteverdiGui/test/mvdApplicationsBrowserTest.cxx
new file mode 100644
index 0000000..14f5cab
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/test/mvdApplicationsBrowserTest.cxx
@@ -0,0 +1,53 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdApplicationsBrowser.h"
+
+int mvdApplicationsBrowserTest(int argc, char* argv[])
+{ 
+  //
+  // instantiate applications browser
+  mvd::ApplicationsBrowser *  browser = new mvd::ApplicationsBrowser();
+
+  //
+  // is search path set 
+  if (argc > 1)
+    {
+    browser->SetAutoLoadPath(argv[1]);
+    }
+
+  //
+  // print available applications or exit with failure
+  if ( browser->GetAvailableApplications().size() == 0 )
+    return EXIT_FAILURE;
+
+  // return ok
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Visualization/MonteverdiGui/test/mvdApplicationsToolBoxTest.cxx b/Modules/Visualization/MonteverdiGui/test/mvdApplicationsToolBoxTest.cxx
new file mode 100644
index 0000000..30c6a36
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/test/mvdApplicationsToolBoxTest.cxx
@@ -0,0 +1,42 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdApplicationsToolBox.h"
+
+int mvdApplicationsToolBoxTest(int argc, char* argv[])
+{
+  QApplication app(argc, argv);
+  mvd::ApplicationsToolBox applToolBox;
+  applToolBox.show();
+
+  QTimer::singleShot(1000, &app, SLOT(quit()));
+  return app.exec();
+
+}
diff --git a/Modules/Visualization/MonteverdiGui/test/mvdFillToolBoxWidgetTreeTest.cxx b/Modules/Visualization/MonteverdiGui/test/mvdFillToolBoxWidgetTreeTest.cxx
new file mode 100644
index 0000000..f89cad5
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/test/mvdFillToolBoxWidgetTreeTest.cxx
@@ -0,0 +1,92 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+//
+// Configuration include.
+//// Included at first position before any other ones.
+#include "ConfigureMonteverdi.h"
+
+//
+// Qt includes (sorted by alphabetic order)
+//// Must be included before system/custom includes.
+
+//
+// System includes (sorted by alphabetic order)
+
+// Monteverdi includes (sorted by alphabetic order)
+#include "mvdApplicationsToolBox.h"
+#include "mvdApplicationsBrowser.h"
+#include "mvdApplicationLauncher.h"
+
+int mvdFillToolBoxWidgetTreeTest(int argc, char* argv[])
+{ 
+  //
+  // instantiate the algorithms toolbox widget
+  QApplication app(argc, argv);
+  mvd::ApplicationsToolBox *  appToolBox = new mvd::ApplicationsToolBox();
+
+  //
+  // instantiate applications browser
+  mvd::ApplicationsBrowser *  browser = new mvd::ApplicationsBrowser();
+
+  //
+  // connections
+  QObject::connect(browser, 
+                   SIGNAL( AvailableApplicationsTagsChanged(const ApplicationsTagContainer& ) ),
+                   appToolBox,
+                   SLOT( OnAvailableApplicationsTagsChanged(const ApplicationsTagContainer& ) )
+    );
+
+  //
+  // is search path set
+  if (argc > 1)
+    {
+    browser->SetAutoLoadPath(argv[1]);
+    }
+
+  //
+  // get the tags/algs map container in the widget
+  browser->SearchAvailableApplicationsTags();
+
+  //
+  // instantiate Application launcher
+  mvd::ApplicationLauncher * launcher = new mvd::ApplicationLauncher();
+    
+  //
+  // connections
+  QObject::connect(appToolBox, 
+                   SIGNAL( ApplicationToLaunchSelected(const QString& ) ),
+                   launcher,
+                   SLOT( OnApplicationToLaunchSelected(const QString& ) )
+    );
+
+  // add quit
+  // QObject::connect(appToolBox, 
+  //                  SIGNAL( (const QString& ) ),
+  //                  launcher,
+  //                  SLOT( OnQuit() )
+  //   );
+
+  //
+  // show the application for a while
+  appToolBox->show();
+  if ( argc <= 2 )
+    {
+    QTimer::singleShot(1000, &app, SLOT(quit()));
+    }
+  return app.exec();
+}
diff --git a/Modules/Visualization/MonteverdiGui/test/mvdMonteverdiGuiTestDriver.cxx b/Modules/Visualization/MonteverdiGui/test/mvdMonteverdiGuiTestDriver.cxx
new file mode 100644
index 0000000..48dd327
--- /dev/null
+++ b/Modules/Visualization/MonteverdiGui/test/mvdMonteverdiGuiTestDriver.cxx
@@ -0,0 +1,32 @@
+/*=========================================================================
+
+  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 file defines the otbCommonTest for the test driver
+// and all it expects is that you have a function called RegisterTests
+#if defined(_MSC_VER)
+#pragma warning ( disable : 4786 )
+#endif
+#include <iostream>
+#include "otbTestMain.h"
+
+void RegisterTests()
+{
+  REGISTER_TEST(mvdApplicationsToolBoxTest);
+  REGISTER_TEST(mvdApplicationsBrowserTest);
+  REGISTER_TEST(mvdFillToolBoxWidgetTreeTest);
+}
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperAddProcessToWatchEvent.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperAddProcessToWatchEvent.h
index f99ae35..3456208 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperAddProcessToWatchEvent.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperAddProcessToWatchEvent.h
@@ -20,6 +20,7 @@
 
 #include "itkEventObject.h"
 #include "itkProcessObject.h"
+#include "OTBApplicationEngineExport.h"
 
 namespace otb
 {
@@ -33,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT AddProcessToWatchEvent: public itk::EventObject
+class OTBApplicationEngine_EXPORT AddProcessToWatchEvent: public itk::EventObject
 {
 public:
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
index 1ec7219..3b97b24 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
@@ -26,11 +26,13 @@
 #include "itkLogger.h"
 #include "otbWrapperMacros.h"
 #include "otbWrapperInputImageParameter.h"
+#include "otbWrapperInputImageListParameter.h"
 #include "otbWrapperOutputImageParameter.h"
 #include "otbWrapperComplexInputImageParameter.h"
 #include "otbWrapperComplexOutputImageParameter.h"
 #include "otbWrapperDocExampleStructure.h"
 #include "itkMersenneTwisterRandomVariateGenerator.h"
+#include "OTBApplicationEngineExport.h"
 
 namespace otb
 {
@@ -44,7 +46,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT Application: public itk::Object
+class OTBApplicationEngine_EXPORT Application: public itk::Object
 {
 public:
   /** Standard class typedefs. */
@@ -402,6 +404,93 @@ public:
    */
   std::vector<std::string> GetParameterStringList(std::string parameter);
 
+
+  /** 
+   * Set the input image parameter as an ImageBase * instead
+   * of filename. Useful to connect pipelines between different
+   * application instances.
+   * \in parameter The parameter key
+   * \in inputImage ImageBase pointer to use as input
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageParameter
+   */
+  void SetParameterInputImage(std::string parameter, InputImageParameter::ImageBaseType * inputImage);
+
+  /**
+   * Get the output image parameter as an ImageBase * instead
+   * of writing to disk. Useful to connect pipelines between different
+   * application instances.
+   * \in parameter The parameter key
+   * \return The ImageBase * to the output image
+   * \throw itk::Exception if parameter is not found or not an
+   * OutputImageParameter
+   */
+  OutputImageParameter::ImageBaseType * GetParameterOutputImage(std::string parameter);
+
+  /** 
+   * Set the input complex image parameter as an ImageBase * instead
+   * of filename. Useful to connect pipelines between different
+   * application instances.
+   * \in parameter The parameter key
+   * \in inputImage ImageBase pointer to use as input
+   * \throw itk::Exception if parameter is not found or not an
+   * ComplexInputImageParameter
+   */
+  void SetParameterComplexInputImage(std::string parameter, ComplexInputImageParameter::ImageBaseType * inputImage);
+
+  /**
+   * Get the complex output image parameter as an ImageBase * instead
+   * of writing to disk. Useful to connect pipelines between different
+   * application instances.
+   * \in parameter The parameter key
+   * \return The ImageBase * pointer to the output image
+   * \throw itk::Exception if parameter is not found or not an
+   * ComplexOutputImageParameter
+   */
+  ComplexOutputImageParameter::ImageBaseType * GetParameterComplexOutputImage(std::string parameter);
+
+  /**
+   * Add an image to an InputImageList parameter as an ImageBase
+   * pointer instead of reading from file. Useful to connect pipelines
+   * between different application instances.
+   * \in parameter The parameter key
+   * \in img The ImageBase * of the image to add
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageList parameter
+   */ 
+  void AddImageToParameterInputImageList(std::string parameter, InputImageListParameter::ImageBaseType * img);
+
+  /**
+   * Set the nth image of an InputImageList parameter as an ImageBase pointer
+   * instead of reading from file. Useful to connect pipelines
+   * between different application instances.
+   * \in parameter The parameter key
+   * \in id Position at which to set the ImageBase pointer
+   * \in img The ImageBase * of the image to add
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageList parameter or if id is out of bounds
+   */ 
+  void SetNthParameterInputImageList(std::string parameter, const unsigned int &id, InputImageListParameter::ImageBaseType * img);
+
+  /**
+   * Clear all images from an InputImageList parameter.
+   *
+   * \in parameter The parameter key
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageList parameter
+   */ 
+  void ClearParameterInputImageList(std::string parameter);
+
+  /**
+   * Get the number of images in an InputImageList parameter.
+   * \in parameter The parameter key
+   * \return The number of images
+   * \throw itk::Exception if parameter is not found or not an
+   * InputImageList parameter
+   */ 
+  unsigned int GetNumberOfElementsInParameterInputImageList(std::string parameter);
+
+  
   /* Get an image value
    *
    * Can be called for types :
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactory.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactory.h
index 854568a..083f815 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactory.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactory.h
@@ -88,7 +88,7 @@ protected:
     return ret;
   }
 
-  /** This method creates all the objects with the class overide of
+  /** This method creates all the objects with the new class of
    * itkclass name, which are provide by this object
    */
   std::list<LightObject::Pointer>
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactoryBase.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactoryBase.h
index 5be4af9..30a8160 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactoryBase.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationFactoryBase.h
@@ -18,6 +18,7 @@
 #ifndef otbWrapperApplicationFactoryBase_h
 #define otbWrapperApplicationFactoryBase_h
 
+#include "OTBApplicationEngineExport.h"
 #include "itkObjectFactoryBase.h"
 #include "otbWrapperApplication.h"
 
@@ -26,7 +27,7 @@ namespace otb
 namespace Wrapper
 {
 
-class ITK_ABI_EXPORT ApplicationFactoryBase : public itk::ObjectFactoryBase
+class OTBApplicationEngine_EXPORT ApplicationFactoryBase : public itk::ObjectFactoryBase
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationHtmlDocGenerator.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationHtmlDocGenerator.h
index 29fda60..5fe7b2a 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationHtmlDocGenerator.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationHtmlDocGenerator.h
@@ -31,7 +31,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT ApplicationHtmlDocGenerator
+class OTBApplicationEngine_EXPORT ApplicationHtmlDocGenerator
 {
 public:
  /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationRegistry.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationRegistry.h
index 6b0e95f..b47cbc5 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationRegistry.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplicationRegistry.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT ApplicationRegistry : public itk::Object
+class OTBApplicationEngine_EXPORT ApplicationRegistry : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperChoiceParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperChoiceParameter.h
index fe81a7e..1528dc9 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperChoiceParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperChoiceParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT ChoiceParameter
+class OTBApplicationEngine_EXPORT ChoiceParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h
index 04ff1e1..c7681cc 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h
@@ -32,7 +32,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT ComplexInputImageParameter : public Parameter
+class OTBApplicationEngine_EXPORT ComplexInputImageParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx
index e4359ec..6c9d0b4 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx
@@ -166,6 +166,15 @@ ComplexInputImageParameter::CastVectorImageFromImage()
   return caster->GetOutput();
 }
 
+template <class TComplexInputImage>
+void
+ComplexInputImageParameter::SetImage(TComplexInputImage* image)
+{
+  m_UseFilename = false;
+  m_Image = image;
+}
+
+
 
 } // End namespace Wrapper
 } // End namespace otb
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h
index b1019af..b2eb091 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h
@@ -32,7 +32,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT ComplexOutputImageParameter : public Parameter
+class OTBApplicationEngine_EXPORT ComplexOutputImageParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperDirectoryParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperDirectoryParameter.h
index 965f08f..7472384 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperDirectoryParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperDirectoryParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT DirectoryParameter
+class OTBApplicationEngine_EXPORT DirectoryParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperDocExampleStructure.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperDocExampleStructure.h
index 7ba66bb..faf1a7e 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperDocExampleStructure.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperDocExampleStructure.h
@@ -26,7 +26,7 @@
 #include <vector>
 #include "otbConfigure.h"
 #include "itkFixedArray.h"
-
+#include "OTBApplicationEngineExport.h"
 
 namespace otb
 {
@@ -42,7 +42,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT DocExampleStructure :
+class OTBApplicationEngine_EXPORT DocExampleStructure :
   public itk::Object
 {
 public:
@@ -96,7 +96,7 @@ public:
   /** Set one example comment */
   void SetExampleComment( const std::string & comm, unsigned int i);
 
-  /** Add an example using comment. Retrun the index of the new example.*/
+  /** Add an example using comment. Return the index of the new example.*/
   unsigned int  AddExample( const std::string & comm = "");
 
   /** Generation of the documentation for CommandLine for one specific
@@ -106,11 +106,11 @@ public:
  /** Generation of the documentation for CommandLine. */
   std::string GenerateCLExample();
 
-  /** Generation of teh documentation for Qt for one specific
+  /** Generation of the documentation for Qt for one specific
   * example. */
   std::string GenerateHtmlExample( unsigned int exId );
 
-  /** Generation of teh documentation for Qt. */
+  /** Generation of the documentation for Qt. */
   std::string GenerateHtmlExample();
 
 protected:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperElevationParametersHandler.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperElevationParametersHandler.h
index 2254007..b55bd15 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperElevationParametersHandler.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperElevationParametersHandler.h
@@ -47,16 +47,16 @@ public:
     * Add a Group containing several choices for map projections
     *
     */
-  static ITK_ABI_EXPORT void AddElevationParameters(Application::Pointer app, const std::string & key);
+  static OTBApplicationEngine_EXPORT void AddElevationParameters(Application::Pointer app, const std::string & key);
 
   /** Method for getting the value of the elevation mode selected */
-  static ITK_ABI_EXPORT float GetDefaultElevation(const Application::Pointer app, const std::string& key);
-  static ITK_ABI_EXPORT const std::string GetGeoidFile(const Application::Pointer app, const std::string& key);
-  static ITK_ABI_EXPORT const std::string GetDEMDirectory(const Application::Pointer app, const std::string& key);
-  static ITK_ABI_EXPORT bool IsGeoidUsed(const Application::Pointer app, const std::string& key);
-  static ITK_ABI_EXPORT bool IsDEMUsed(const Application::Pointer app, const std::string & key);
+  static OTBApplicationEngine_EXPORT float GetDefaultElevation(const Application::Pointer app, const std::string& key);
+  static OTBApplicationEngine_EXPORT const std::string GetGeoidFile(const Application::Pointer app, const std::string& key);
+  static OTBApplicationEngine_EXPORT const std::string GetDEMDirectory(const Application::Pointer app, const std::string& key);
+  static OTBApplicationEngine_EXPORT bool IsGeoidUsed(const Application::Pointer app, const std::string& key);
+  static OTBApplicationEngine_EXPORT bool IsDEMUsed(const Application::Pointer app, const std::string & key);
 
-  static ITK_ABI_EXPORT void SetupDEMHandlerFromElevationParameters(const Application::Pointer app, const std::string& key);
+  static OTBApplicationEngine_EXPORT void SetupDEMHandlerFromElevationParameters(const Application::Pointer app, const std::string& key);
 
 protected:
   ElevationParametersHandler(); // not implemented
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperEmptyParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperEmptyParameter.h
index 1ff87d4..b26a37b 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperEmptyParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperEmptyParameter.h
@@ -30,7 +30,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT EmptyParameter
+class OTBApplicationEngine_EXPORT EmptyParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameListParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameListParameter.h
index 11c34b6..b1befe9 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameListParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameListParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT InputFilenameListParameter : public Parameter
+class OTBApplicationEngine_EXPORT InputFilenameListParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameParameter.h
index f353490..f4845b4 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputFilenameParameter.h
@@ -31,7 +31,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT InputFilenameParameter
+class OTBApplicationEngine_EXPORT InputFilenameParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageListParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageListParameter.h
index 9fc9342..6d9a9d7 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageListParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageListParameter.h
@@ -18,10 +18,8 @@
 #ifndef otbWrapperInputImageListParameter_h
 #define otbWrapperInputImageListParameter_h
 
-#include "otbImageFileReader.h"
-
 #include "otbWrapperParameter.h"
-#include "otbObjectList.h"
+#include "otbWrapperInputImageParameter.h"
 
 namespace otb
 {
@@ -33,7 +31,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT InputImageListParameter : public Parameter
+class OTBApplicationEngine_EXPORT InputImageListParameter : public Parameter
 {
 public:
   /** Standard class typedef */
@@ -42,9 +40,10 @@ public:
   typedef itk::SmartPointer<Self>       Pointer;
   typedef itk::SmartPointer<const Self> ConstPointer;
 
-  typedef otb::ImageFileReader<FloatVectorImageType> ImageFileReaderType;
-  typedef otb::ObjectList<ImageFileReaderType>  ImageFileReaderListType;
+  typedef std::vector<InputImageParameter::Pointer> InputImageParameterVectorType;
 
+  typedef itk::ImageBase<2> ImageBaseType;
+  
   /** Defining ::New() static method */
   itkNewMacro(Self);
 
@@ -63,7 +62,6 @@ public:
   /** Set one specific stored image filename. */
   bool SetNthFileName( const unsigned int id, const std::string & filename );
 
-
   /** Get the stored image filename list */
   std::vector<std::string> GetFileNameList() const;
 
@@ -76,11 +74,14 @@ public:
   /** Get one specific stored image. */
   FloatVectorImageType* GetNthImage(unsigned int i) const;
 
+  /** Set one specific image. */
+  void SetNthImage(unsigned int i, ImageBaseType * img);
+  
   /** Set the list of image. */
   void SetImageList(FloatVectorImageListType* imList);
 
   /** Add an image to the list. */
-  void AddImage(FloatVectorImageType* image);
+  void AddImage(ImageBaseType* image);
 
   bool HasValue() const ITK_OVERRIDE;
 
@@ -91,7 +92,9 @@ public:
  /** Clear all the list. */
   void ClearValue() ITK_OVERRIDE;
 
-
+  /** Retrieve number of elements */
+  unsigned int Size() const;
+  
 protected:
   /** Constructor */
   InputImageListParameter();
@@ -100,13 +103,14 @@ protected:
   ~InputImageListParameter() ITK_OVERRIDE;
 
 
-  FloatVectorImageListType::Pointer m_ImageList;
-  ImageFileReaderListType::Pointer  m_ReaderList;
-
 private:
   InputImageListParameter(const Parameter &); //purposely not implemented
   void operator =(const Parameter&); //purposely not implemented
 
+  InputImageParameterVectorType m_InputImageParameterVector;
+  FloatVectorImageListType::Pointer m_ImageList;
+  
+  
 }; // End class InputImage Parameter
 
 } // End namespace Wrapper
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
index df467e6..980901b 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
@@ -32,7 +32,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT InputImageParameter : public Parameter
+class OTBApplicationEngine_EXPORT InputImageParameter : public Parameter
 {
 public:
   /** Standard class typedef */
@@ -92,7 +92,7 @@ public:
 
   /** Generic cast method that will be specified for each image type. */
   template <class TInputImage, class TOutputImage>
-  ITK_ABI_EXPORT TOutputImage*  CastImage();
+  TOutputImage*  CastImage();
     
   /** Cast an image to an image of the same type
   * Image to Image, VectorImage to VectorImage, RGBAImage to RGBAImage. */
@@ -162,7 +162,7 @@ private:
 // so that the linker knows they exist when building OTB Applications
 
 #define otbDeclareCastImageMacro(InputImageType, OutputImageType)   \
-  template<> OutputImageType *                                          \
+  template<> OTBApplicationEngine_EXPORT OutputImageType *                                          \
   InputImageParameter::CastImage<InputImageType , OutputImageType>();    \
 
 #define otbGenericDeclareCastImageMacro(InputImageType, prefix)     \
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx
index ccec523..8a385e0 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx
@@ -183,18 +183,25 @@ template <class TInputImage, class TOutputImage>
 TOutputImage*
 InputImageParameter::SimpleCastImage()
 {
-  TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
+  if ( dynamic_cast<TOutputImage*> (m_Image.GetPointer()) )
+    {
+    return dynamic_cast<TOutputImage*> (m_Image.GetPointer());
+    }
+  else
+    {
+    TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
 
-  typedef itk::CastImageFilter<TInputImage, TOutputImage> CasterType;
-  typename CasterType::Pointer caster = CasterType::New();
+    typedef itk::CastImageFilter<TInputImage, TOutputImage> CasterType;
+    typename CasterType::Pointer caster = CasterType::New();
 
-  caster->SetInput(realInputImage);
-  caster->UpdateOutputInformation();
+    caster->SetInput(realInputImage);
+    caster->UpdateOutputInformation();
 
-  m_Image = caster->GetOutput();
-  m_Caster = caster;
+    m_Image = caster->GetOutput();
+    m_Caster = caster;
 
-  return caster->GetOutput();
+    return caster->GetOutput();
+    }
 }
 
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h
index 3f596e4..f10be74 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h
@@ -14,7 +14,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT InputProcessXMLParameter
+class OTBApplicationEngine_EXPORT InputProcessXMLParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataListParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataListParameter.h
index 35920d5..0c0e419 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataListParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataListParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT InputVectorDataListParameter : public Parameter
+class OTBApplicationEngine_EXPORT InputVectorDataListParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataParameter.h
index 494408b..f102bbf 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputVectorDataParameter.h
@@ -31,7 +31,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT InputVectorDataParameter : public Parameter
+class OTBApplicationEngine_EXPORT InputVectorDataParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h
index daf800d..5423377 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperListViewParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT ListViewParameter
+class OTBApplicationEngine_EXPORT ListViewParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperMapProjectionParametersHandler.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperMapProjectionParametersHandler.h
index 4919494..4760ee0 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperMapProjectionParametersHandler.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperMapProjectionParametersHandler.h
@@ -18,6 +18,8 @@
 #ifndef otbWrapperMapProjectionParametersHandler_h
 #define otbWrapperMapProjectionParametersHandler_h
 
+#include "OTBApplicationEngineExport.h"
+
 #include "otbWrapperApplication.h"
 
 namespace otb
@@ -52,14 +54,14 @@ public:
     * Add a Group containing several choices for map projections
     *
     */
-  static ITK_ABI_EXPORT void AddMapProjectionParameters(Application::Pointer app, const std::string & key);
+  static OTBApplicationEngine_EXPORT void AddMapProjectionParameters(Application::Pointer app, const std::string & key);
 
   /**
     * Helper method : Compute the ProjectionRef knowing the map
     * projection picked up by the user
     *
     */
-  static ITK_ABI_EXPORT const std::string GetProjectionRefFromChoice(const Application::Pointer app,
+  static OTBApplicationEngine_EXPORT const std::string GetProjectionRefFromChoice(const Application::Pointer app,
                                                       const std::string & key);
 
 
@@ -67,9 +69,9 @@ public:
     * Helper method : Compute the UTM parameters relative an image
     * Note: The key of the image must be set to be able to get the image.
     *       The key must be totally if the InputImageParameter belongs
-    *       to a ParamaterGroup, ie set io.in
+    *       to a ParameterGroup, ie set io.in
     */
-  static ITK_ABI_EXPORT void InitializeUTMParameters(Application::Pointer app,
+  static OTBApplicationEngine_EXPORT void InitializeUTMParameters(Application::Pointer app,
                                       const std::string & imageKey,
                                       const std::string & mapKey );
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputFilenameParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputFilenameParameter.h
index 62d10fc..94abb74 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputFilenameParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputFilenameParameter.h
@@ -31,7 +31,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT OutputFilenameParameter
+class OTBApplicationEngine_EXPORT OutputFilenameParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
index 4c2c096..25eedeb 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT OutputImageParameter : public Parameter
+class OTBApplicationEngine_EXPORT OutputImageParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
index 8a983b3..73fec05 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
@@ -13,7 +13,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT OutputProcessXMLParameter
+class OTBApplicationEngine_EXPORT OutputProcessXMLParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputVectorDataParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputVectorDataParameter.h
index 155a728..94153d4 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputVectorDataParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputVectorDataParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  * \ingroup OTBApplicationEngine
  */
 
-class ITK_ABI_EXPORT OutputVectorDataParameter : public Parameter
+class OTBApplicationEngine_EXPORT OutputVectorDataParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h
index aed8f88..267ca32 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h
@@ -22,6 +22,7 @@
 #include "itkObjectFactory.h"
 
 #include "otbWrapperTypes.h"
+#include "OTBApplicationEngineExport.h"
 
 namespace otb
 {
@@ -56,7 +57,7 @@ enum DefaultValueMode
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT Parameter
+class OTBApplicationEngine_EXPORT Parameter
   : public itk::Object
 {
 public:
@@ -178,7 +179,7 @@ public:
     return m_Root.GetPointer();
   }
 
-  /** Is the paramter a root or a child of another param */
+  /** Is the parameter a root or a child of another param */
   virtual bool IsRoot() const
   {
     return (this == m_Root.GetPointer());
@@ -208,7 +209,7 @@ public:
     return m_IsChecked;
   }
 
-  /** Modify the state of the checkbox relative to this paramter */
+  /** Modify the state of the checkbox relative to this parameter */
   virtual void SetChecked(const bool value)
   {
     m_IsChecked = value;
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h
index 31600e9..fb395b4 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h
@@ -32,7 +32,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT ParameterGroup
+class OTBApplicationEngine_EXPORT ParameterGroup
   : public Parameter
 {
 public:
@@ -50,7 +50,7 @@ public:
   /** Add a new choice value to an existing choice parameter */
   void AddChoice(std::string paramKey, std::string paramName);
 
-  /** Remove choices made in ListViewParamter widget*/
+  /** Remove choices made in ListViewParameter widget*/
   void ClearChoices(std::string paramKey);
 
   /** Get the choices made in a ListView Parameter widget*/
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h
index ac0f9d6..9237eac 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterKey.h
@@ -23,6 +23,7 @@
 #include <ostream>
 #include <itksys/RegularExpression.hxx>
 #include "itkMacro.h"
+#include "OTBApplicationEngineExport.h"
 
 namespace otb
 {
@@ -37,7 +38,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT ParameterKey
+class OTBApplicationEngine_EXPORT ParameterKey
 {
 public:
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperRAMParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperRAMParameter.h
index 1a234e9..404257b 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperRAMParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperRAMParameter.h
@@ -30,7 +30,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT RAMParameter : public Parameter
+class OTBApplicationEngine_EXPORT RAMParameter : public Parameter
 {
 public:
   /** Standard class typedef */
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperRadiusParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperRadiusParameter.h
index 29d8815..1daebab 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperRadiusParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperRadiusParameter.h
@@ -30,7 +30,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT RadiusParameter
+class OTBApplicationEngine_EXPORT RadiusParameter
   : public IntParameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringListParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringListParameter.h
index 8ca0637..1c9fce9 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringListParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringListParameter.h
@@ -31,7 +31,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT StringListParameter
+class OTBApplicationEngine_EXPORT StringListParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringParameter.h
index e023b8f..f429f67 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperStringParameter.h
@@ -31,7 +31,7 @@ namespace Wrapper
  *
  * \ingroup OTBApplicationEngine
  */
-class ITK_ABI_EXPORT StringParameter
+class OTBApplicationEngine_EXPORT StringParameter
   : public Parameter
 {
 public:
diff --git a/Modules/Wrappers/ApplicationEngine/otb-module.cmake b/Modules/Wrappers/ApplicationEngine/otb-module.cmake
index 3f1a4c7..8873810 100644
--- a/Modules/Wrappers/ApplicationEngine/otb-module.cmake
+++ b/Modules/Wrappers/ApplicationEngine/otb-module.cmake
@@ -2,6 +2,7 @@ set(DOCUMENTATION "This module contains classes that ease the implementation of
 applications (see chapter 'How to write an application' of the SoftwareGuide).")
 
 otb_module(OTBApplicationEngine
+ENABLE_SHARED
   DEPENDS
     OTBVectorDataBase
     OTBImageIO
@@ -26,7 +27,8 @@ otb_module(OTBApplicationEngine
     OTBCommandLine
     OTBEdge
     OTBAppImageUtils
-
+    OTBAppFiltering
+    
   DESCRIPTION
     "${DOCUMENTATION}"
 )
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
index a98e762..0ab8e27 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
@@ -1137,6 +1137,140 @@ std::vector<std::string> Application::GetParameterStringList(std::string paramet
   return ret;
 }
 
+void Application::SetParameterInputImage(std::string parameter, InputImageParameter::ImageBaseType * inputImage)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  InputImageParameter* paramDown = dynamic_cast<InputImageParameter*> (param);
+  
+  if (paramDown)
+    {
+    paramDown->SetImage(inputImage);
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageParameter");
+    }
+}
+
+OutputImageParameter::ImageBaseType * Application::GetParameterOutputImage(std::string parameter)
+{
+  Parameter* param = GetParameterByKey(parameter);
+  
+  OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*> (param);
+  
+  if (paramDown)
+    {    
+    return paramDown->GetValue();
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to OutputImageParameter");
+    }
+}
+
+
+void Application::SetParameterComplexInputImage(std::string parameter, ComplexInputImageParameter::ImageBaseType * inputImage)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  ComplexInputImageParameter* paramDown = dynamic_cast<ComplexInputImageParameter*> (param);
+  
+  if (paramDown)
+    {
+    paramDown->SetImage(inputImage);
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to ComplexInputImageParameter");
+    }
+}
+
+ComplexOutputImageParameter::ImageBaseType * Application::GetParameterComplexOutputImage(std::string parameter)
+{
+  Parameter* param = GetParameterByKey(parameter);
+  
+  ComplexOutputImageParameter* paramDown = dynamic_cast<ComplexOutputImageParameter*> (param);
+  
+  if (paramDown)
+    {    
+    return paramDown->GetValue();
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to ComplexOutputImageParameter");
+    }
+}
+
+void Application::AddImageToParameterInputImageList(std::string parameter, InputImageListParameter::ImageBaseType * img)
+{
+  Parameter* param = GetParameterByKey(parameter);
+  
+  InputImageListParameter * paramDown = dynamic_cast<InputImageListParameter *>(param);
+  
+  if(paramDown)
+    {
+    paramDown->AddImage(img);
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageListParameter");
+    }
+  
+}
+
+void Application::SetNthParameterInputImageList(std::string parameter, const unsigned int &id, InputImageListParameter::ImageBaseType * img)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  InputImageListParameter * paramDown = dynamic_cast<InputImageListParameter *>(param);
+
+  if(paramDown)
+    {
+    paramDown->SetNthImage(id,img);
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageListParameter");
+    }
+
+}
+
+void Application::ClearParameterInputImageList(std::string parameter)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  InputImageListParameter * paramDown = dynamic_cast<InputImageListParameter *>(param);
+
+  if(paramDown)
+    {
+    paramDown->ClearValue();
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageListParameter");
+    }
+
+}
+
+unsigned int Application::GetNumberOfElementsInParameterInputImageList(std::string parameter)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  InputImageListParameter * paramDown = dynamic_cast<InputImageListParameter *>(param);
+
+  if(paramDown)
+    {
+    return paramDown->Size();
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << "parameter can't be casted to InputImageListParameter");
+    }
+
+}
+
+
 
 FloatVectorImageType* Application::GetParameterImage(std::string parameter)
 {
@@ -1421,7 +1555,7 @@ Application::IsApplicationReady()
       // return false when does not have value and:
       //  - The param is root
       //  - The param is not root and belonging to a Mandatory Group
-      //    wich is activated
+      //    which is activated
       if ( !this->HasValue(*it)  && IsMandatory(*it) )
         {
         if( GetParameterByKey(*it)->IsRoot() )
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx
index 63ad78e..a0bb8a8 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx
@@ -127,15 +127,6 @@ ComplexInputImageParameter::SetImage(ComplexFloatVectorImageType* image)
   this->SetImage<ComplexFloatVectorImageType>( image );
 }
 
-
-template <class TComplexInputImage>
-void
-ComplexInputImageParameter::SetImage(TComplexInputImage* image)
-{
-  m_Image = image;
-}
-
-
 bool
 ComplexInputImageParameter::HasValue() const
 {
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageListParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageListParameter.cxx
index ae1acf3..12f636c 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageListParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageListParameter.cxx
@@ -24,11 +24,11 @@ namespace Wrapper
 {
 
 InputImageListParameter::InputImageListParameter()
+  : m_InputImageParameterVector(),
+    m_ImageList(FloatVectorImageListType::New())
 {
   this->SetName("Input Image List");
   this->SetKey("inList");
-  m_ImageList = FloatVectorImageListType::New();
-  m_ReaderList = ImageFileReaderListType::New();
 }
 
 InputImageListParameter::~InputImageListParameter()
@@ -47,25 +47,24 @@ InputImageListParameter::SetListFromFileName(const std::vector<std::string> & fi
     const std::string filename = filenames[i];
     // TODO : when the logger will be available, redirect the exception
     // in the logger (like what is done in MsgReporter)
-    // File existance checked by the reader
+    // File existence checked by the reader
     if (!filename.empty())
       {
-      ImageFileReaderType::Pointer reader = ImageFileReaderType::New();
-      try
-        {
-        reader->SetFileName(filename);
-        reader->UpdateOutputInformation();
-        }
-      catch(itk::ExceptionObject & /*err*/)
+      // Try to build a new ParameterInputImage
+      InputImageParameter::Pointer tmpInputImageParameter = InputImageParameter::New();
+
+      tmpInputImageParameter->SetFromFileName(filename);
+
+      if(!tmpInputImageParameter->HasValue())
         {
+        // If loading failed
         this->ClearValue();
         isOk = false;
         break;
         }
 
-      // everything went fine, store the object references
-      m_ReaderList->PushBack(reader);
-      m_ImageList->PushBack(reader->GetOutput());
+      m_InputImageParameterVector.push_back(tmpInputImageParameter);
+      m_ImageList->PushBack(tmpInputImageParameter->GetFloatVectorImage());
       }
     }
 
@@ -83,7 +82,7 @@ InputImageListParameter::SetListFromFileName(const std::vector<std::string> & fi
 void
 InputImageListParameter::AddNullElement()
 {
-  m_ReaderList->PushBack(ITK_NULLPTR);
+  m_InputImageParameterVector.push_back(ITK_NULLPTR);
   m_ImageList->PushBack(ITK_NULLPTR);
   SetActive(false);
   this->Modified();
@@ -94,24 +93,23 @@ InputImageListParameter::AddFromFileName(const std::string & filename)
 {
   // TODO : when the logger will be available, redirect the exception
   // in the logger (like what is done in MsgReporter)
-  // File existance checked by the reader
+  // File existence checked by the reader
   if (!filename.empty())
     {
-    ImageFileReaderType::Pointer reader = ImageFileReaderType::New();
-    reader->SetFileName(filename);
-    try
-      {
-      reader->UpdateOutputInformation();
-      }
-    catch(itk::ExceptionObject & /*err*/)
+    // Try to build a new ParameterInputImage
+    InputImageParameter::Pointer tmpInputImageParameter = InputImageParameter::New();
+
+    tmpInputImageParameter->SetFromFileName(filename);
+    
+    if(!tmpInputImageParameter->HasValue())
       {
+      // If loading failed
       this->ClearValue();
       return false;
       }
-
-    // everything went fine, store the object references
-    m_ReaderList->PushBack(reader);
-    m_ImageList->PushBack(reader->GetOutput());
+    
+    m_InputImageParameterVector.push_back(tmpInputImageParameter);
+    m_ImageList->PushBack(tmpInputImageParameter->GetFloatVectorImage());
     SetActive(true);
     this->Modified();
     return true;
@@ -123,31 +121,29 @@ InputImageListParameter::AddFromFileName(const std::string & filename)
 bool
 InputImageListParameter::SetNthFileName( const unsigned int id, const std::string & filename )
 {
-  if( m_ReaderList->Size()<id )
+  if( m_InputImageParameterVector.size()<id )
     {
-    itkExceptionMacro(<< "No image "<<id<<". Only "<<m_ReaderList->Size()<<" images available.");
+    itkExceptionMacro(<< "No image "<<id<<". Only "<<m_InputImageParameterVector.size()<<" images available.");
     }
 
   // TODO : when the logger will be available, redirect the exception
   // in the logger (like what is done in MsgReporter)
-  // File existance checked by the reader
+  // File existence checked by the reader
   if (!filename.empty())
     {
-    ImageFileReaderType::Pointer reader = ImageFileReaderType::New();
-    reader->SetFileName(filename);
-    try
-      {
-      reader->UpdateOutputInformation();
-      }
-    catch(itk::ExceptionObject &)
+    InputImageParameter::Pointer tmpInputImageParameter = InputImageParameter::New();
+
+    tmpInputImageParameter->SetFromFileName(filename);
+
+    if(!tmpInputImageParameter->HasValue())
       {
       this->ClearValue();
       return false;
       }
 
-    m_ReaderList->SetNthElement(id, reader);
-    m_ImageList->SetNthElement(id, reader->GetOutput());
-
+    m_InputImageParameterVector[id] = tmpInputImageParameter;
+    m_ImageList->SetNthElement(id,tmpInputImageParameter->GetFloatVectorImage());
+      
     this->Modified();
     SetActive(true);
     return true;
@@ -160,36 +156,27 @@ InputImageListParameter::SetNthFileName( const unsigned int id, const std::strin
 std::vector<std::string>
 InputImageListParameter::GetFileNameList() const
 {
-  if (m_ReaderList)
-    {
-    std::vector<std::string> filenames;
-    for(unsigned int i=0; i<m_ReaderList->Size(); i++)
-      {
-      if( m_ReaderList->GetNthElement(i) )
-        filenames.push_back( m_ReaderList->GetNthElement(i)->GetFileName() );
-      }
+  std::vector<std::string> filenames;
 
-    return filenames;
+  for(InputImageParameterVectorType::const_iterator it = m_InputImageParameterVector.begin();
+      it!=m_InputImageParameterVector.end();++it)
+    {
+    filenames.push_back( (*it)->GetFileName() );
     }
-
-  itkExceptionMacro(<< "No filename value");
+  
+  return filenames;
 }
 
 
 std::string
 InputImageListParameter::GetNthFileName( unsigned int i ) const
 {
-  if (m_ReaderList)
-    {
-    if(m_ReaderList->Size()<i)
+    if(m_InputImageParameterVector.size()<i)
       {
-      itkExceptionMacro(<< "No image "<<i<<". Only "<<m_ReaderList->Size()<<" images available.");
+      itkExceptionMacro(<< "No image "<<i<<". Only "<<m_InputImageParameterVector.size()<<" images available.");
       }
 
-    return m_ReaderList->GetNthElement(i)->GetFileName();
-    }
-
-  itkExceptionMacro(<< "No filename value");
+    return m_InputImageParameterVector[i]->GetFileName();
 }
 
 FloatVectorImageListType*
@@ -226,19 +213,51 @@ InputImageListParameter::SetImageList(FloatVectorImageListType* imList)
     return;
     }
 
-  m_ImageList = imList;
-  m_ReaderList = ImageFileReaderListType::Pointer();
-  for(unsigned int i=0; i<m_ImageList->Size(); i++)
+  // Clear previous values
+  this->ClearValue();
+
+  for(unsigned int i = 0; i<imList->Size(); i++)
     {
-    m_ReaderList->PushBack( ImageFileReaderType::Pointer() );
+    // Try to build a new ParameterInputImage
+    InputImageParameter::Pointer tmpInputImageParameter = InputImageParameter::New();
+    
+    tmpInputImageParameter->SetImage(imList->GetNthElement(i));
+    
+    m_InputImageParameterVector.push_back(tmpInputImageParameter);
+    m_ImageList->PushBack(tmpInputImageParameter->GetFloatVectorImage());
     }
-
+  
   SetActive(true);
   this->Modified();
 }
 
+void InputImageListParameter::SetNthImage(unsigned int i, ImageBaseType * img)
+{
+  if(m_ImageList->Size()<i)
+    {
+    itkExceptionMacro(<< "No image "<<i<<". Only "<<m_ImageList->Size()<<" images available.");
+    }
+  try
+    {
+    img->UpdateOutputInformation();
+    }
+  catch(itk::ExceptionObject &)
+    {
+    return;
+    }
+  
+  // Try to build a new ParameterInputImage
+  InputImageParameter::Pointer tmpInputImageParameter = InputImageParameter::New();
+  
+  tmpInputImageParameter->SetImage(img);
+
+  m_InputImageParameterVector[i] = tmpInputImageParameter;
+  m_ImageList->SetNthElement(i,tmpInputImageParameter->GetFloatVectorImage());
+}
+
+
 void
-InputImageListParameter::AddImage(FloatVectorImageType* image)
+InputImageListParameter::AddImage(ImageBaseType* image)
 {
   // Check input availability
   // TODO : when the logger will be available, redirect the exception
@@ -252,8 +271,12 @@ InputImageListParameter::AddImage(FloatVectorImageType* image)
     return;
     }
 
-  m_ImageList->PushBack( image );
-  m_ReaderList->PushBack( ImageFileReaderType::Pointer() );
+  InputImageParameter::Pointer tmpInputImageParameter = InputImageParameter::New();
+  
+  tmpInputImageParameter->SetImage(image);
+  
+  m_InputImageParameterVector.push_back(tmpInputImageParameter);
+  m_ImageList->PushBack(tmpInputImageParameter->GetFloatVectorImage());
 
   this->Modified();
 }
@@ -287,16 +310,23 @@ InputImageListParameter::Erase( unsigned int id )
     }
 
   m_ImageList->Erase( id );
-  m_ReaderList->Erase( id );
+  m_InputImageParameterVector.erase(m_InputImageParameterVector.begin()+id);
 
   this->Modified();
 }
 
+unsigned int
+InputImageListParameter::Size() const
+{
+  return m_InputImageParameterVector.size();
+}
+
+
 void
 InputImageListParameter::ClearValue()
 {
   m_ImageList->Clear();
-  m_ReaderList->Clear();
+  m_InputImageParameterVector.clear();
 
   SetActive(false);
   this->Modified();
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx
index 4f267cd..b91c764 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx
@@ -102,7 +102,7 @@ InputProcessXMLParameter::GetPixelTypeFromString(std::string strType)
     }
   else
     {
-    /*by default return float. Eg: if strType is emtpy because of no pixtype
+    /*by default return float. Eg: if strType is empty because of no pixtype
     node in xml which was the case earlier
     */
     return ImagePixelType_float;
@@ -263,161 +263,175 @@ InputProcessXMLParameter::Read(Application::Pointer this_)
     ParameterType type = paramGroup->GetParameterTypeFromString(typeAsString);
 
     Parameter* param = this_->GetParameterByKey(key);
-    bool updateFromXML = true;
 
-    if(param->HasUserValue())
-      updateFromXML = false;
+    // std::cout
+    //   << "'" << paramName << "'\t"
+    //   << key << "\t"
+    //   << typeAsString << "\t"
+    //   << type << "\t"
+    //   << ParameterType_OutputImage << "\t"
+    //   << param->HasUserValue() << "\t"
+    //   << value << std::endl;
+
+    param->SetUserValue(true);
+    param->SetActive(true);
+
+    TiXmlElement* n_Values = ITK_NULLPTR;
+    n_Values = n_Parameter->FirstChildElement("values");
+    if(n_Values)
+      {
+      for(TiXmlElement* n_Value = n_Values->FirstChildElement("value"); n_Value != ITK_NULLPTR;
+	  n_Value = n_Value->NextSiblingElement())
+	{
+	values.push_back(n_Value->GetText());
+	}
+      }
 
-    if(updateFromXML)
+    if ( type == ParameterType_OutputFilename || type == ParameterType_OutputVectorData ||
+	 type == ParameterType_String || type == ParameterType_Choice || type == ParameterType_RAM)
+      {
+      this_->SetParameterString(key, value);
+      }
+    else if( type == ParameterType_OutputImage )
       {
-      param->SetUserValue(true);
-      param->SetActive(true);
+      assert( dynamic_cast< OutputImageParameter * >( param )==param );
 
-      TiXmlElement* n_Values = ITK_NULLPTR;
-      n_Values = n_Parameter->FirstChildElement("values");
-      if(n_Values)
-        {
-        for(TiXmlElement* n_Value = n_Values->FirstChildElement("value"); n_Value != ITK_NULLPTR;
-            n_Value = n_Value->NextSiblingElement())
-          {
-          values.push_back(n_Value->GetText());
-          }
-        }
+      OutputImageParameter * outImageParam =
+	dynamic_cast< OutputImageParameter * >( param );
 
-      if ( type == ParameterType_OutputFilename || type == ParameterType_OutputVectorData ||
-           type == ParameterType_String || type == ParameterType_Choice || type == ParameterType_RAM)
-        {
-        this_->SetParameterString(key, value);
-        }
-      else if (type == ParameterType_OutputImage)
-        {
-        OutputImageParameter *paramDown = dynamic_cast<OutputImageParameter*>(param);
-        if(paramDown!=ITK_NULLPTR)
-          {
-          paramDown->SetFileName(value);
-          std::string pixTypeAsString  = GetChildNodeTextOf(n_Parameter, "pixtype");
-          ImagePixelType outPixType = GetPixelTypeFromString(pixTypeAsString);
-          paramDown->SetPixelType(outPixType);
-          }
-        }
-      else if (type == ParameterType_ComplexOutputImage)
-        {
-        ComplexOutputImageParameter* paramDown = dynamic_cast<ComplexOutputImageParameter*>(param);
-        if(paramDown!=ITK_NULLPTR)
-          paramDown->SetFileName(value);
-        }
-      else if (type == ParameterType_Directory)
-        {
-        DirectoryParameter* paramDown = dynamic_cast<DirectoryParameter*>(param);
-        if(paramDown!=ITK_NULLPTR)
-          paramDown->SetValue(value);
-        }
-      else if (type == ParameterType_InputFilename)
-        {
-        InputFilenameParameter* paramDown = dynamic_cast<InputFilenameParameter*>(param);
-        if(paramDown!=ITK_NULLPTR)
-          paramDown->SetValue(value);
-        }
-      else if (type == ParameterType_InputImage)
-        {
-        if(itksys::SystemTools::FileExists(value.c_str()))
-          {
-          InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
-          if(paramDown!=ITK_NULLPTR)
-            {
-            paramDown->SetFromFileName(value);
-            if (!paramDown->SetFromFileName(value))
-              {
-              ret= -1;
-              }
-            }
-          }
-        else
-          {
-          otbMsgDevMacro( << "InputImageFile saved in InputXML does not exists" );
-          }
-        }
-      else if (type == ParameterType_ComplexInputImage)
-        {
-        if(itksys::SystemTools::FileExists(value.c_str()))
-          {
-          ComplexInputImageParameter* paramDown = dynamic_cast<ComplexInputImageParameter*>(param);
-          if(paramDown!=ITK_NULLPTR)
-            paramDown->SetFromFileName(value);
-          }
-        }
-      else if (dynamic_cast<InputVectorDataParameter*>(param))
-        {
-        if(itksys::SystemTools::FileExists(value.c_str()))
-          {
-          InputVectorDataParameter* paramDown = dynamic_cast<InputVectorDataParameter*>(param);
-          paramDown->SetFromFileName(value);
-          if ( !paramDown->SetFromFileName(value) )
-            {
-            ret = -1;
-            }
-          }
-        }
-      else if (dynamic_cast<InputImageListParameter*>(param))
-        {
-        InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
-        paramDown->SetListFromFileName(values);
-        if ( !paramDown->SetListFromFileName(values) )
-          {
-          ret = -1;
-          }
-        }
-      else if (dynamic_cast<InputVectorDataListParameter*>(param))
-        {
-        InputVectorDataListParameter* paramDown = dynamic_cast<InputVectorDataListParameter*>(param);
-        paramDown->SetListFromFileName(values);
-        if ( !paramDown->SetListFromFileName(values) )
-          {
-          ret = -1;
-          }
-        }
-      else if (dynamic_cast<InputFilenameListParameter*>(param))
-        {
-        InputFilenameListParameter* paramDown = dynamic_cast<InputFilenameListParameter*>(param);
-        paramDown->SetListFromFileName(values);
-        if ( !paramDown->SetListFromFileName(values) )
-          {
-          ret= -1;
-          }
-        }
-      else if (type == ParameterType_Radius || type == ParameterType_Int ||
-               typeAsString == "rand" )
-        {
-        int intValue;
-        std::stringstream(value) >> intValue;
-        this_->SetParameterInt(key, intValue);
-        }
-      else if (type == ParameterType_Float)
-        {
-        float floatValue;
-        std::stringstream(value) >> floatValue;
-        this_->SetParameterFloat(key, floatValue);
-        }
-      else if (type == ParameterType_Empty)
-        {
-        bool emptyValue = false;
-        if( value == "true")
-          {
-          emptyValue = true;
-          }
-        this_->SetParameterEmpty(key, emptyValue);
-        }
-      else if (type == ParameterType_StringList || type == ParameterType_ListView)
-        {
-        if(values.empty())
-          itkWarningMacro(<< key << " has null values");
+      assert( outImageParam!=ITK_NULLPTR );
 
-        this_->SetParameterStringList(key, values);
-        }
-      } //end updateFromXML
-    //choice also comes as setint and setstring why??
-    }
-  ret = 0; //resetting return to zero, we dont use it anyway for now.
+      outImageParam->SetFileName( value );
+
+      std::string pixelType(
+	GetChildNodeTextOf(n_Parameter, "pixtype" )
+      );
+
+      if( pixelType.empty() )
+	std::runtime_error( "Invalid pixel type (empty string)." );
+
+      outImageParam->SetPixelType(
+	GetPixelTypeFromString( pixelType )
+      );
+      }
+    else if (type == ParameterType_ComplexOutputImage)
+      {
+      ComplexOutputImageParameter* paramDown = dynamic_cast<ComplexOutputImageParameter*>(param);
+      if(paramDown!=ITK_NULLPTR)
+	paramDown->SetFileName(value);
+      }
+    else if (type == ParameterType_Directory)
+      {
+      DirectoryParameter* paramDown = dynamic_cast<DirectoryParameter*>(param);
+      if(paramDown!=ITK_NULLPTR)
+	paramDown->SetValue(value);
+      }
+    else if (type == ParameterType_InputFilename)
+      {
+      InputFilenameParameter* paramDown = dynamic_cast<InputFilenameParameter*>(param);
+      if(paramDown!=ITK_NULLPTR)
+	paramDown->SetValue(value);
+      }
+    else if (type == ParameterType_InputImage)
+      {
+      if(itksys::SystemTools::FileExists(value.c_str()))
+	{
+	InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
+	if(paramDown!=ITK_NULLPTR)
+	  {
+	  paramDown->SetFromFileName(value);
+	  if (!paramDown->SetFromFileName(value))
+	    {
+	    ret= -1;
+	    }
+	  }
+	}
+      else
+	{
+	otbMsgDevMacro( << "InputImageFile saved in InputXML does not exists" );
+	}
+      }
+    else if (type == ParameterType_ComplexInputImage)
+      {
+      if(itksys::SystemTools::FileExists(value.c_str()))
+	{
+	ComplexInputImageParameter* paramDown = dynamic_cast<ComplexInputImageParameter*>(param);
+	if(paramDown!=ITK_NULLPTR)
+	  paramDown->SetFromFileName(value);
+	}
+      }
+    else if (dynamic_cast<InputVectorDataParameter*>(param))
+      {
+      if(itksys::SystemTools::FileExists(value.c_str()))
+	{
+	InputVectorDataParameter* paramDown = dynamic_cast<InputVectorDataParameter*>(param);
+	paramDown->SetFromFileName(value);
+	if ( !paramDown->SetFromFileName(value) )
+	  {
+	  ret = -1;
+	  }
+	}
+      }
+    else if (dynamic_cast<InputImageListParameter*>(param))
+      {
+      InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param);
+      paramDown->SetListFromFileName(values);
+      if ( !paramDown->SetListFromFileName(values) )
+	{
+	ret = -1;
+	}
+      }
+    else if (dynamic_cast<InputVectorDataListParameter*>(param))
+      {
+      InputVectorDataListParameter* paramDown = dynamic_cast<InputVectorDataListParameter*>(param);
+      paramDown->SetListFromFileName(values);
+      if ( !paramDown->SetListFromFileName(values) )
+	{
+	ret = -1;
+	}
+      }
+    else if (dynamic_cast<InputFilenameListParameter*>(param))
+      {
+      InputFilenameListParameter* paramDown = dynamic_cast<InputFilenameListParameter*>(param);
+      paramDown->SetListFromFileName(values);
+      if ( !paramDown->SetListFromFileName(values) )
+	{
+	ret= -1;
+	}
+      }
+    else if (type == ParameterType_Radius || type == ParameterType_Int ||
+	     typeAsString == "rand" )
+      {
+      int intValue;
+      std::stringstream(value) >> intValue;
+      this_->SetParameterInt(key, intValue);
+      }
+    else if (type == ParameterType_Float)
+      {
+      float floatValue;
+      std::stringstream(value) >> floatValue;
+      this_->SetParameterFloat(key, floatValue);
+      }
+    else if (type == ParameterType_Empty)
+      {
+      bool emptyValue = false;
+      if( value == "true")
+	{
+	emptyValue = true;
+	}
+      this_->SetParameterEmpty(key, emptyValue);
+      }
+    else if (type == ParameterType_StringList || type == ParameterType_ListView)
+      {
+      if(values.empty())
+	itkWarningMacro(<< key << " has null values");
+
+      this_->SetParameterStringList(key, values);
+      }
+    } //end updateFromXML
+  //choice also comes as setint and setstring why??
+
+  ret = 0; //resetting return to zero, we don't use it anyway for now.
 
   fclose(fp);
 
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperMapProjectionParametersHandler.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperMapProjectionParametersHandler.cxx
index e96ab87..e2f4707 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperMapProjectionParametersHandler.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperMapProjectionParametersHandler.cxx
@@ -200,7 +200,7 @@ const std::string MapProjectionParametersHandler::GetProjectionRefFromChoice(con
     * Helper method : Compute the UTM parameters relative to an image Origin
     * Note: The key of the image must be set to be able to get the image.
     *       The key must be totally if the InputImageParameter belongs
-    *       to a ParamaterGroup, ie set io.in
+    *       to a ParameterGroup, ie set io.in
     */
 void MapProjectionParametersHandler::InitializeUTMParameters(Application::Pointer app,
                                                    const std::string & imageKey,
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
index faa67a7..385baaa 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
@@ -167,7 +167,7 @@ OutputProcessXMLParameter::Write(Application::Pointer app)
       ParameterType type = app->GetParameterType(key);
       std::string typeAsString = paramGroup->GetParameterTypeAsString(type);
 
-      // if param is a Group, dont do anything, ParamGroup dont have values
+      // if param is a Group, don't do anything, ParamGroup don't have values
       if (type != ParameterType_Group)
       {
        bool paramExists = app->HasUserValue(key) && app->IsParameterEnabled(key);
@@ -183,7 +183,7 @@ OutputProcessXMLParameter::Write(Application::Pointer app)
 
            if(eParam!=ITK_NULLPTR)
              {
-             //Dont use app->HasUserValue which returns false always because of
+             //Don't use app->HasUserValue which returns false always because of
              //EmptyParameter::HasValue() is false for EmptyParameter
              if(eParam->HasUserValue())
                {
@@ -252,7 +252,7 @@ OutputProcessXMLParameter::Write(Application::Pointer app)
            }
          else if (typeAsString == "Empty")
            {
-           //Nothing to do. copy emtpyValue
+           //Nothing to do. copy emptyValue
            value = emptyValue;
            }
 
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx
index 2ccd5b1..48f68da 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx
@@ -95,9 +95,9 @@ ParameterGroup::AddChoice(std::string paramKey, std::string paramName)
 {
   ParameterKey pKey( paramKey );
   // Split the parameter name
-  std::vector<std::string> splittedKey = pKey.Split();
+  std::vector<std::string> splitKey = pKey.Split();
 
-  if( splittedKey.size() > 1 )
+  if( splitKey.size() > 1 )
     {
       // Get the last subkey
       std::string lastkey = pKey.GetLastElement();
@@ -134,19 +134,19 @@ ParameterGroup::ClearChoices(std::string paramKey)
 {
   ParameterKey pKey( paramKey );
   // Split the parameter name
-  std::vector<std::string> splittedKey = pKey.Split();
+  std::vector<std::string> splitKey = pKey.Split();
 
   std::string parentkey;
   Parameter::Pointer parentParam;
 
-  if (splittedKey.size() > 1)
+  if (splitKey.size() > 1)
     {
     parentkey = pKey.GetRoot();
     parentParam = GetParameterByKey(parentkey);
     }
   else
     {
-    parentParam = GetParameterByKey(splittedKey[0]);
+    parentParam = GetParameterByKey(splitKey[0]);
     }
 
    // parentParam must be a choice, a listBox or this is an error
@@ -210,19 +210,19 @@ ParameterGroup::GetSelectedItems(std::string paramKey)
   std::vector<int> selectedItems;
   ParameterKey pKey( paramKey );
   // Split the parameter name
-  std::vector<std::string> splittedKey = pKey.Split();
+  std::vector<std::string> splitKey = pKey.Split();
 
   std::string parentkey;
   Parameter::Pointer parentParam;
 
-  if (splittedKey.size() > 1)
+  if (splitKey.size() > 1)
     {
     parentkey = pKey.GetRoot();
     parentParam = GetParameterByKey(parentkey);
     }
   else
     {
-    parentParam = GetParameterByKey(splittedKey[0]);
+    parentParam = GetParameterByKey(splitKey[0]);
     }
 
    // parentParam must be a choice, a listBox or this is an error
@@ -487,7 +487,7 @@ ParameterGroup::AddParameter(ParameterType type, std::string paramKey, std::stri
 {
   ParameterKey pKey(paramKey);
   // Split the parameter name
-  std::vector<std::string> splittedKey = pKey.Split();
+  std::vector<std::string> splitKey = pKey.Split();
 
   // Get the last subkey
   std::string lastkey = pKey.GetLastElement();
@@ -496,7 +496,7 @@ ParameterGroup::AddParameter(ParameterType type, std::string paramKey, std::stri
   std::string parentkey;
   Parameter::Pointer parentParam;
 
-  if (splittedKey.size() > 1)
+  if (splitKey.size() > 1)
     {
     parentkey = pKey.GetRoot();
     parentParam = GetParameterByKey(parentkey);
@@ -642,11 +642,11 @@ ParameterGroup::AddParameter(ParameterType type, std::string paramKey, std::stri
     newParam->SetKey(lastkey);
     newParam->SetName(paramName);
 
-    // If splittedKey is greater than 1, that means that the parameter
+    // If splitKey is greater than 1, that means that the parameter
     // is not a root, and have a parent(s):
     // - Add the parent as root of this param
     // - Add the param as a child of its parents
-    if (splittedKey.size() > 1)
+    if (splitKey.size() > 1)
       {
       newParam->SetRoot(parentParam);
       parentParam->AddChild(newParam);
@@ -678,7 +678,7 @@ ParameterGroup::GetParameterByKey(std::string name)
   ParameterKey pName(name);
 
  // Split the parameter name
-  std::vector<std::string> splittedName = pName.Split();
+  std::vector<std::string> splitName = pName.Split();
 
   // Get the first parameter key
   std::string parentName = pName.GetFirstElement();
@@ -702,7 +702,7 @@ ParameterGroup::GetParameterByKey(std::string name)
     }
 
   // If the name contains a child, make a recursive call
-  if (splittedName.size() > 1)
+  if (splitName.size() > 1)
     {
     // Handle ParameterGroup case
     ParameterGroup* parentAsGroup = dynamic_cast<ParameterGroup*>(parentParam.GetPointer());
@@ -710,12 +710,12 @@ ParameterGroup::GetParameterByKey(std::string name)
       {
       // Remove the parent from the param name
       std::ostringstream childNameOss;
-      std::vector<std::string>::const_iterator vvit = splittedName.begin() + 1;
-      while(vvit != splittedName.end())
+      std::vector<std::string>::const_iterator vvit = splitName.begin() + 1;
+      while(vvit != splitName.end())
         {
         childNameOss << *vvit;
         ++vvit;
-        if (vvit != splittedName.end())
+        if (vvit != splitName.end())
           {
           childNameOss << ".";
           }
@@ -729,29 +729,29 @@ ParameterGroup::GetParameterByKey(std::string name)
     ChoiceParameter* parentAsChoice = dynamic_cast<ChoiceParameter*>(parentParam.GetPointer());
     if (parentAsChoice)
       {
-      // Check that splittedName[1] is one of the choice
+      // Check that splitName[1] is one of the choice
       ParameterGroup::Pointer associatedParam;
 
-      // will throw if splittedName[1] is not a choice key
-      associatedParam = parentAsChoice->GetChoiceParameterGroupByKey(splittedName[1]);
+      // will throw if splitName[1] is not a choice key
+      associatedParam = parentAsChoice->GetChoiceParameterGroupByKey(splitName[1]);
 
-      if (splittedName.size() > 2)
+      if (splitName.size() > 2)
         {
         if (associatedParam.IsNull())
           {
-          itkExceptionMacro(<< "Choice " << splittedName[1] << "in "
-                            << splittedName[0] << "  has no key named "
-                            << splittedName[2]);
+          itkExceptionMacro(<< "Choice " << splitName[1] << "in "
+                            << splitName[0] << "  has no key named "
+                            << splitName[2]);
           }
 
         // Remove the parent and the choice value from the param name
         std::ostringstream childNameOss;
-        std::vector<std::string>::const_iterator vvvit = splittedName.begin() + 2;
-        while(vvvit != splittedName.end())
+        std::vector<std::string>::const_iterator vvvit = splitName.begin() + 2;
+        while(vvvit != splitName.end())
           {
           childNameOss << *vvvit;
           ++vvvit;
-          if (vvvit != splittedName.end())
+          if (vvvit != splitName.end())
             {
             childNameOss << ".";
             }
diff --git a/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
index 40c67d9..753d001 100644
--- a/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
+++ b/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
@@ -21,6 +21,7 @@ otbWrapperApplicationDocTests.cxx
 otbWrapperApplicationHtmlDocGeneratorTest.cxx
 otbWrapperInputVectorDataParameterTest.cxx
 otbWrapperOutputImageParameterTest.cxx
+otbApplicationMemoryConnectTest.cxx
 )
 
 add_executable(otbApplicationEngineTestDriver ${OTBApplicationEngineTests})
@@ -172,3 +173,7 @@ otb_add_test(NAME owTuDocExampleStructureNew COMMAND otbApplicationEngineTestDri
   otbWrapperDocExampleStructureNew
   )
 
+otb_add_test(NAME owTvApplicationMemoryConnectTest COMMAND otbApplicationEngineTestDriver otbApplicationMemoryConnectTest
+  $<TARGET_FILE_DIR:otbapp_Smoothing>
+  ${INPUTDATA}/poupees.tif
+  ${TEMP}/owTvApplicationMemoryConnectTestOutput.tif)
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx b/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
index 2d38a23..3cb4aad 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
@@ -31,4 +31,5 @@ void RegisterTests()
   REGISTER_TEST(otbWrapperInputVectorDataParameterNew);
   REGISTER_TEST(otbWrapperOutputImageParameterNew);
   REGISTER_TEST(otbWrapperOutputImageParameterTest1);
+  REGISTER_TEST(otbApplicationMemoryConnectTest);
 }
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx b/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx
new file mode 100644
index 0000000..e0f646d
--- /dev/null
+++ b/Modules/Wrappers/ApplicationEngine/test/otbApplicationMemoryConnectTest.cxx
@@ -0,0 +1,71 @@
+/*=========================================================================
+
+  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.
+
+=========================================================================*/
+#if defined(_MSC_VER)
+#pragma warning ( disable : 4786 )
+#endif
+
+#include "otbWrapperApplicationRegistry.h"
+
+
+int otbApplicationMemoryConnectTest(int argc, char * argv[])
+{
+  if(argc<4)
+    {
+    std::cerr<<"Usage: "<<argv[0]<<" application_path infname outfname"<<std::endl;
+    return EXIT_FAILURE;
+    }
+
+  std::string path = argv[1];
+  std::string infname = argv[2];
+  std::string outfname = argv[3];
+
+  otb::Wrapper::ApplicationRegistry::SetApplicationPath(path);
+  
+  otb::Wrapper::Application::Pointer app1 = otb::Wrapper::ApplicationRegistry::CreateApplication("Smoothing");
+
+  otb::Wrapper::Application::Pointer app2 = otb::Wrapper::ApplicationRegistry::CreateApplication("Smoothing");
+
+  otb::Wrapper::Application::Pointer app3 = otb::Wrapper::ApplicationRegistry::CreateApplication("Smoothing");
+
+  otb::Wrapper::Application::Pointer app4 = otb::Wrapper::ApplicationRegistry::CreateApplication("ConcatenateImages");
+  
+  if(app1.IsNull() || app2.IsNull() || app3.IsNull() || app4.IsNull())
+    {
+    std::cerr<<"Failed to create applications"<<std::endl;
+    return EXIT_FAILURE;
+    }
+
+  app1->SetParameterString("in",infname);
+  app1->Execute();
+  
+  app2->SetParameterString("out",outfname);
+
+  // Connect app1 to app2
+  app2->SetParameterInputImage("in",app1->GetParameterOutputImage("out"));
+  app2->Execute();
+  
+  app3->SetParameterString("in",infname);
+  app3->Execute();
+  
+  app4->AddImageToParameterInputImageList("il",app2->GetParameterOutputImage("out"));
+  app4->AddImageToParameterInputImageList("il",app3->GetParameterOutputImage("out"));
+   
+  app4->ExecuteAndWriteOutput();
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterKeyTest.cxx b/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterKeyTest.cxx
index e24df21..8986d76 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterKeyTest.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbWrapperParameterKeyTest.cxx
@@ -38,14 +38,14 @@ int otbWrapperParameterKey(int itkNotUsed(argc), char* itkNotUsed(argv)[])
   otb::Wrapper::ParameterKey pKey1(theKey);
   if( pKey1.GetKey() != theKey )
     {
-      std::cout<<"Error in construtor method. Waiting for \""<<theKey<<"\" receiving "<<pKey1.GetKey()<<"."<<std::endl;
+      std::cout<<"Error in constructor method. Waiting for \""<<theKey<<"\" receiving "<<pKey1.GetKey()<<"."<<std::endl;
       return EXIT_FAILURE;
     }
 
   otb::Wrapper::ParameterKey pKey2(theKey);
   if( pKey2.GetKey() != theKey )
     {
-      std::cout<<"Error in construtor method. Waiting for \""<<theKey<<"\" receiving "<<pKey2.GetKey()<<"."<<std::endl;
+      std::cout<<"Error in constructor method. Waiting for \""<<theKey<<"\" receiving "<<pKey2.GetKey()<<"."<<std::endl;
       return EXIT_FAILURE;
     }
 
diff --git a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h
index 1f03dcf..8ca98ab 100644
--- a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h
+++ b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h
@@ -137,7 +137,7 @@ protected:
   void LoadApplication();
 
   /** Parse the user expression, extract the key and the associated
-    * string and set it as value of each corresonding application
+    * string and set it as value of each corresponding application
     *  parameter.
     */
   CommandLineLauncher::ParamResultType LoadParameters();
@@ -158,7 +158,7 @@ protected:
   /** Display the output parameter (Role == RoleOutput) */
   void DisplayOutputParameters();
 
-  /** Load the watchers for internal progress and writeing progress report. */
+  /** Load the watchers for internal progress and writing progress report. */
   void LinkWatchers(itk::Object * caller, const itk::EventObject & event);
 
   /** Clear watcher list, deleting its pointers. */
diff --git a/Modules/Wrappers/CommandLine/src/CMakeLists.txt b/Modules/Wrappers/CommandLine/src/CMakeLists.txt
index 3da3ad0..2662ced 100644
--- a/Modules/Wrappers/CommandLine/src/CMakeLists.txt
+++ b/Modules/Wrappers/CommandLine/src/CMakeLists.txt
@@ -15,6 +15,8 @@ add_executable(otbApplicationLauncherCommandLine otbApplicationLauncherCommandLi
 target_link_libraries(otbApplicationLauncherCommandLine OTBCommandLine)
 otb_module_target(otbApplicationLauncherCommandLine)
 
+set_linker_stack_size_flag(otbApplicationLauncherCommandLine 10000000)
+
 # Where we will install the script in the build tree
 get_target_property(CLI_OUTPUT_DIR otbApplicationLauncherCommandLine RUNTIME_OUTPUT_DIRECTORY)
 
diff --git a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
index e44342f..b69ef72 100644
--- a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
+++ b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
@@ -384,13 +384,13 @@ CommandLineLauncher::ParamResultType CommandLineLauncher::LoadParameters()
 
     const bool paramExists(m_Parser->IsAttributExists(std::string("-").append(paramKey), m_VExpression));
 
-    // if param is a Group, dont do anything, ParamGroup dont have values
+    // if param is a Group, don't do anything, ParamGroup don't have values
     if (type != ParameterType_Group)
       {
       // Get the attribute relative to this key as vector
       values = m_Parser->GetAttribut(std::string("-").append(paramKey), m_VExpression);
 
-      // If the param does not exists in the cli, dont try to set a
+      // If the param does not exists in the cli, don't try to set a
       // value on it, an exception will be thrown later in this function
       if (paramExists)
         {
@@ -551,7 +551,7 @@ CommandLineLauncher::ParamResultType CommandLineLauncher::LoadParameters()
             }
         // Update the flag UserValue
         param->SetUserValue(true);
-        // Call the DoUpdateParameter to update dependant params
+        // Call the DoUpdateParameter to update dependent params
         m_Application->UpdateParameters();
         }
       }
@@ -570,7 +570,7 @@ CommandLineLauncher::ParamResultType CommandLineLauncher::LoadParameters()
     // it must be set if :
     //  - The param is root
     //  - The param is not root and belonging to a Mandatory Group
-    //    wich is activated
+    //    which is activated
     bool mustBeSet = false;
     const bool hasValue = m_Application->HasValue(paramKey);
 
@@ -756,7 +756,7 @@ std::string CommandLineLauncher::DisplayParameterHelp(const Parameter::Pointer &
   // it must be set if :
   //  - The param is root
   //  - The param is not root and belonging to a Mandatory Group
-  //    wich is activated
+  //    which is activated
   bool isMissing = false;
   if (!m_Parser->IsAttributExists(std::string("-").append(paramKey), m_VExpression))
     {
diff --git a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineParser.cxx b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineParser.cxx
index b512327..5813c75 100644
--- a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineParser.cxx
+++ b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineParser.cxx
@@ -213,41 +213,41 @@ CommandLineParser::GetModuleName( std::string & modName, const std::vector<std::
 CommandLineParser::ParseResultType
 CommandLineParser::GetModuleName( std::string & modName, const std::string & exp )
 {
-  std::vector<itksys::String> spaceSplittedExp = itksys::SystemTools::SplitString(exp.c_str(), ' ', false);
+  std::vector<itksys::String> spaceSplitExp = itksys::SystemTools::SplitString(exp.c_str(), ' ', false);
   // if the chain is "  module", SplitString will return: [ ], [module]
-  for(unsigned int i=0; i<spaceSplittedExp.size(); i++)
+  for(unsigned int i=0; i<spaceSplitExp.size(); i++)
     {
-    if( spaceSplittedExp[i] == " ")
+    if( spaceSplitExp[i] == " ")
       {
-      spaceSplittedExp.erase(spaceSplittedExp.begin()+i);
+      spaceSplitExp.erase(spaceSplitExp.begin()+i);
       i--;
       }
     }
 
   // The SplitString keep the separator in the string.
-  // If exists a space a the beginnig of the string, it will be interpreted...
+  // If exists a space a the beginning of the string, it will be interpreted...
   // We have to delete it
-  if( spaceSplittedExp[0][0] == ' ' )
+  if( spaceSplitExp[0][0] == ' ' )
     {
-    spaceSplittedExp[0].erase(spaceSplittedExp[0].begin());
+    spaceSplitExp[0].erase(spaceSplitExp[0].begin());
     }
 
   itksys::RegularExpression reg;
   reg.compile("([^0-9a-zA-Z])");
   // The first element must be the module path, non " -" allowed.
-  if( spaceSplittedExp[0].substr(0, 2) == " -" || spaceSplittedExp.size() == 0 )
+  if( spaceSplitExp[0].substr(0, 2) == " -" || spaceSplitExp.size() == 0 )
     {
     return NOMODULENAME;
     }
 
   // It must contain only alphanumerical character
-  if(reg.find(spaceSplittedExp[0]))
+  if(reg.find(spaceSplitExp[0]))
     {
     return INVALIDMODULENAME;
     }
   else
     {
-    modName = spaceSplittedExp[0];
+    modName = spaceSplitExp[0];
     }
 
   return OK;
@@ -357,27 +357,27 @@ CommandLineParser::GetAttribut( const std::string & key, const std::string & exp
   // Only if the key has values associated
   if( tempModKey.size() > 0 )
     {
-    std::vector<itksys::String> spaceSplitted = itksys::SystemTools::SplitString(tempModKey.substr(0, tempModKey.size()).c_str(), ' ', false);
+    std::vector<itksys::String> spaceSplit = itksys::SystemTools::SplitString(tempModKey.substr(0, tempModKey.size()).c_str(), ' ', false);
 
     // Remove " " string element
-    for(unsigned int i=0; i<spaceSplitted.size(); i++)
+    for(unsigned int i=0; i<spaceSplit.size(); i++)
       {
-      if( spaceSplitted[i] == " ")
+      if( spaceSplit[i] == " ")
         {
-        spaceSplitted.erase(spaceSplitted.begin()+i);
+        spaceSplit.erase(spaceSplit.begin()+i);
         i--;
         }
       }
 
     // Remove space at the beginning of the string and cast into std::vector<std::string>
-    for(unsigned int i=0; i<spaceSplitted.size(); i++)
+    for(unsigned int i=0; i<spaceSplit.size(); i++)
       {
-      while( spaceSplitted[i].size()>0  && spaceSplitted[i][0] == ' ' )
+      while( spaceSplit[i].size()>0  && spaceSplit[i][0] == ' ' )
         {
-        spaceSplitted[i] = spaceSplitted[i].substr(1, spaceSplitted[i].size());
+        spaceSplit[i] = spaceSplit[i].substr(1, spaceSplit[i].size());
         }
 
-      res.push_back(spaceSplitted[i]);
+      res.push_back(spaceSplit[i]);
       }
     }
   return res;
@@ -529,7 +529,7 @@ CommandLineParser::IsAValidKey( const std::string & foundKey )
   // the starting dash should be already removed
   tmp.append(".");
 
-  // To be a key, the string must be a serie of groups separated by dots so that :
+  // To be a key, the string must be a series of groups separated by dots so that :
   // - each group has at least one character
   // - each group contains only alphanumeric characters (and lowercase)
   // - there is at least one group
diff --git a/Modules/Wrappers/QtWidget/include/itkQtProgressBar.h b/Modules/Wrappers/QtWidget/include/itkQtProgressBar.h
index 9584e18..7b6aab6 100644
--- a/Modules/Wrappers/QtWidget/include/itkQtProgressBar.h
+++ b/Modules/Wrappers/QtWidget/include/itkQtProgressBar.h
@@ -21,10 +21,11 @@
 #ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
 #include "itkCommand.h"
 #endif //tag=QT4-boost-compatibility
+#include "OTBQtWidgetExport.h"
 
 namespace itk {
 
-class ITK_ABI_EXPORT QtProgressBar : public ::QProgressBar
+class OTBQtWidget_EXPORT QtProgressBar : public ::QProgressBar
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbQtApplication.h b/Modules/Wrappers/QtWidget/include/otbQtApplication.h
index 0ca7fd6..89b5aeb 100644
--- a/Modules/Wrappers/QtWidget/include/otbQtApplication.h
+++ b/Modules/Wrappers/QtWidget/include/otbQtApplication.h
@@ -24,11 +24,13 @@
 #ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829  //tag=QT4-boost-compatibility
 #include "itkMacro.h"
 #endif //tag=QT4-boost-compatibility
+#include "OTBQtWidgetExport.h"
+
 namespace otb
 {
 namespace Wrapper
 {
-class ITK_ABI_EXPORT QtApplication : public QApplication
+class OTBQtWidget_EXPORT QtApplication : public QApplication
 {
   Q_OBJECT
 
diff --git a/Modules/Wrappers/QtWidget/include/otbQtFileSelectionWidget.h b/Modules/Wrappers/QtWidget/include/otbQtFileSelectionWidget.h
index 9ddaacc..36e51b2 100644
--- a/Modules/Wrappers/QtWidget/include/otbQtFileSelectionWidget.h
+++ b/Modules/Wrappers/QtWidget/include/otbQtFileSelectionWidget.h
@@ -25,6 +25,7 @@
 #include "otbWrapperQtWidgetParameterBase.h"
 #endif //tag=QT4-boost-compatibility
 
+#include "OTBQtWidgetExport.h"
 
 namespace otb
 {
@@ -36,10 +37,16 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtFileSelectionWidget : public QWidget
+class OTBQtWidget_EXPORT QtFileSelectionWidget : public QWidget
 {
   Q_OBJECT
 public:
+  enum IOMode
+  {
+    IO_MODE_INPUT = 0,
+    IO_MODE_OUTPUT = 1,
+  };
+
   QtFileSelectionWidget();
   ~QtFileSelectionWidget() ITK_OVERRIDE;
 
@@ -68,6 +75,9 @@ public:
     return m_Input;
   }
 
+  void SetIOMode( IOMode );
+  IOMode GetIOMode() const;
+
 protected slots:
   void SelectFile();
 
@@ -81,9 +91,10 @@ private:
 
 
   QHBoxLayout * m_HLayout;
-  QLineEdit*    m_Input;
+  QLineEdit * m_Input;
   QPushButton * m_Button;
-  QCheckBox *   m_Checkbox;
+  QCheckBox * m_Checkbox;
+  IOMode m_IOMode;
 };
 
 
diff --git a/Modules/Wrappers/QtWidget/include/otbQtLogOutput.h b/Modules/Wrappers/QtWidget/include/otbQtLogOutput.h
index e0e411c..5c2334c 100644
--- a/Modules/Wrappers/QtWidget/include/otbQtLogOutput.h
+++ b/Modules/Wrappers/QtWidget/include/otbQtLogOutput.h
@@ -25,6 +25,8 @@
 //#include "itkObjectFactory.h"
 //#include "itkProcessObject.h"
 
+#include "OTBQtWidgetExport.h"
+
 namespace otb
 {
 
@@ -36,7 +38,7 @@ namespace otb
  *
  */
 
-class ITK_ABI_EXPORT QtLogOutput : public QObject, public itk::LogOutput
+class OTBQtWidget_EXPORT QtLogOutput : public QObject, public itk::LogOutput
 {
 Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbQtStringSelectionWidget.h b/Modules/Wrappers/QtWidget/include/otbQtStringSelectionWidget.h
index 6d830fa..548aa41 100644
--- a/Modules/Wrappers/QtWidget/include/otbQtStringSelectionWidget.h
+++ b/Modules/Wrappers/QtWidget/include/otbQtStringSelectionWidget.h
@@ -23,7 +23,7 @@
 #include "otbWrapperStringListParameter.h"
 #include "otbWrapperQtWidgetParameterBase.h"
 #endif //tag=QT4-boost-compatibility
-
+#include "OTBQtWidgetExport.h"
 
 namespace otb
 {
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtStringSelectionWidget : public QWidget
+class OTBQtWidget_EXPORT QtStringSelectionWidget : public QWidget
 {
   Q_OBJECT
 
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetChoiceParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetChoiceParameter.h
index f347bac..97e7a93 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetChoiceParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetChoiceParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetChoiceParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetChoiceParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexInputImageParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexInputImageParameter.h
index c09ebe7..6fbdda3 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexInputImageParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexInputImageParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetComplexInputImageParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetComplexInputImageParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexOutputImageParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexOutputImageParameter.h
index 2aab53c..03a2f8a 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexOutputImageParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetComplexOutputImageParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetComplexOutputImageParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetComplexOutputImageParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetDirectoryParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetDirectoryParameter.h
index 561ffe3..8194226 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetDirectoryParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetDirectoryParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetDirectoryParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetDirectoryParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetEmptyParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetEmptyParameter.h
index ec1273f..c3c1b9d 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetEmptyParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetEmptyParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetEmptyParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetEmptyParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetFloatParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetFloatParameter.h
index 6ed4196..ce1106d 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetFloatParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetFloatParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetFloatParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetFloatParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameListParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameListParameter.h
index 9b44f3d..8abc71c 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameListParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameListParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputFilenameListParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputFilenameListParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameParameter.h
index 38c345b..78e570b 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputFilenameParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputFilenameParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputFilenameParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageListParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageListParameter.h
index 86133f6..f029ca3 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageListParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageListParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputImageListParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputImageListParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageParameter.h
index 70552c8..72a084e 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputImageParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputImageParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputImageParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h
index 10fc787..547f30d 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputProcessXMLParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputProcessXMLParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataListParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataListParameter.h
index 4796c4d..f6b29ff 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataListParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataListParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputVectorDataListParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputVectorDataListParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataParameter.h
index 4a265d7..30028de 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputVectorDataParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetInputVectorDataParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetInputVectorDataParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetIntParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetIntParameter.h
index fe62aec..0cc7feb 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetIntParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetIntParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetIntParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetIntParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetListViewParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetListViewParameter.h
index 15dbefe..886f60c 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetListViewParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetListViewParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetListViewParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetListViewParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
index 7b2dfbe..e08678a 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
@@ -30,7 +30,7 @@ namespace otb
 namespace Wrapper
 {
 
-class ITK_ABI_EXPORT AppliThread : public QThread
+class OTBQtWidget_EXPORT AppliThread : public QThread
 {
  Q_OBJECT
 
@@ -80,7 +80,7 @@ private:
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetModel : public QObject
+class OTBQtWidget_EXPORT QtWidgetModel : public QObject
 {
   Q_OBJECT
 public:
@@ -121,7 +121,7 @@ signals:
    * \brief Signal emitted when execution otb::Application has finished.
    *
    * \param status The result status of the otb::application (-1 when
-   * an exception has occured).
+   * an exception has occurred).
    */
   void SetProgressReportDone( int status =0 );
 
@@ -146,7 +146,7 @@ protected slots:
   void ExecuteAndWriteOutputSlot();
 
   /**
-   * \brief Slots called everytime one of the widget needs to be
+   * \brief Slots called every time one of the widget needs to be
    * updated (e.g. by specialized parameter widgets).
    *
    * This slot is protected so it can only be called via Qt
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputFilenameParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputFilenameParameter.h
index bef9917..0740f03 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputFilenameParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputFilenameParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetOutputFilenameParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetOutputFilenameParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputImageParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputImageParameter.h
index 7481978..4093fbf 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputImageParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputImageParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetOutputImageParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetOutputImageParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h
index 1de0fb0..e143891 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetOutputProcessXMLParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetOutputProcessXMLParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputVectorDataParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputVectorDataParameter.h
index 432116b..dc577c8 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputVectorDataParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputVectorDataParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetOutputVectorDataParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetOutputVectorDataParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterBase.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterBase.h
index 43bca0e..62ea448 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterBase.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterBase.h
@@ -23,6 +23,7 @@
 #include "otbWrapperParameter.h"
 #include "otbWrapperQtWidgetModel.h"
 #endif //tag=QT4-boost-compatibility
+#include "OTBQtWidgetExport.h"
 
 namespace otb
 {
@@ -34,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetParameterBase : public QWidget
+class OTBQtWidget_EXPORT QtWidgetParameterBase : public QWidget
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterFactory.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterFactory.h
index 0c8c714..4c40483 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterFactory.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterFactory.h
@@ -24,6 +24,8 @@
 #include "itkObjectFactory.h"
 #endif //tag=QT4-boost-compatibility
 
+#include "OTBQtWidgetExport.h"
+
 namespace otb
 {
 namespace Wrapper
@@ -39,7 +41,7 @@ class QtWidgetParameterBase;
  * \ingroup OTBQtWidget
  *
  */
-class ITK_ABI_EXPORT QtWidgetParameterFactory : public itk::Object
+class OTBQtWidget_EXPORT QtWidgetParameterFactory : public itk::Object
 {
 public:
   /** Standard class typedefs. */
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h
index 0d0558c..116d5bf 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h
@@ -38,7 +38,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetParameterGroup : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetParameterGroup : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterLabel.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterLabel.h
index e02de71..ab85bd7 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterLabel.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterLabel.h
@@ -23,6 +23,8 @@
 #include "otbWrapperParameter.h"
 #endif //tag=QT4-boost-compatibility
 
+#include "OTBQtWidgetExport.h"
+
 namespace otb
 {
 namespace Wrapper
@@ -33,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetParameterLabel : public QWidget
+class OTBQtWidget_EXPORT QtWidgetParameterLabel : public QWidget
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h
index 48828cf..f2739bb 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h
@@ -37,7 +37,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetProgressReport : public QWidget
+class OTBQtWidget_EXPORT QtWidgetProgressReport : public QWidget
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetRAMParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetRAMParameter.h
index 0fa0a33..f0bed45 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetRAMParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetRAMParameter.h
@@ -35,7 +35,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetRAMParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetRAMParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h
index 29d3448..2dd760e 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h
@@ -37,7 +37,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetSimpleProgressReport : public QWidget
+class OTBQtWidget_EXPORT QtWidgetSimpleProgressReport : public QWidget
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringListParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringListParameter.h
index b65ebc9..0139b14 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringListParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringListParameter.h
@@ -33,7 +33,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetStringListParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetStringListParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringParameter.h
index 145d903..8c65558 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringParameter.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetStringParameter.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetStringParameter : public QtWidgetParameterBase
+class OTBQtWidget_EXPORT QtWidgetStringParameter : public QtWidgetParameterBase
 {
   Q_OBJECT
 public:
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
index ebfb205..e39f5d1 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
@@ -34,7 +34,7 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class ITK_ABI_EXPORT QtWidgetView : public QWidget
+class OTBQtWidget_EXPORT QtWidgetView : public QWidget
 {
   Q_OBJECT
 public:
@@ -53,7 +53,7 @@ public slots:
   void UnhandledException(QString message);
 
 private slots:
-  void UpdateMessageAfterExcuteClicked();
+  void UpdateMessageAfterExecuteClicked();
   void UpdateMessageAfterApplicationReady(bool val);
 
 signals:
diff --git a/Modules/Wrappers/QtWidget/otb-module.cmake b/Modules/Wrappers/QtWidget/otb-module.cmake
index 2a3a8a1..e05cbed 100644
--- a/Modules/Wrappers/QtWidget/otb-module.cmake
+++ b/Modules/Wrappers/QtWidget/otb-module.cmake
@@ -1,10 +1,12 @@
 set(DOCUMENTATION "QT wrappers.")
 
 otb_module(OTBQtWidget
+ENABLE_SHARED
   DEPENDS
-    OTBQt4
     OTBApplicationEngine
     OTBITK
+    OTBQt4
+    OTBQtAdapters
 
   TEST_DEPENDS
     OTBTestKernel
diff --git a/Modules/Wrappers/QtWidget/src/CMakeLists.txt b/Modules/Wrappers/QtWidget/src/CMakeLists.txt
index ed62094..2482fdd 100644
--- a/Modules/Wrappers/QtWidget/src/CMakeLists.txt
+++ b/Modules/Wrappers/QtWidget/src/CMakeLists.txt
@@ -76,10 +76,13 @@ set(OTBQtWidget_MOC_HDR
 QT4_WRAP_CPP(OTBQtWidget_MOC_SRC ${OTBQtWidget_MOC_HDR})
 
 add_library(OTBQtWidget ${OTBQtWidget_SRC} ${OTBQtWidget_MOC_SRC})
-target_link_libraries(OTBQtWidget
+
+target_link_libraries( OTBQtWidget
   ${OTBApplicationEngine_LIBRARIES}
   ${OTBQt4_LIBRARIES}
+  ${OTBQtAdapters_LIBRARIES}
   )
+
 otb_module_target(OTBQtWidget)
 
 add_executable(otbApplicationLauncherQt otbApplicationLauncherQt.cxx)
@@ -89,6 +92,7 @@ target_link_libraries(otbApplicationLauncherQt
   ${OTBQt4_LIBRARIES}
   )
 otb_module_target(otbApplicationLauncherQt)
+set_linker_stack_size_flag(otbApplicationLauncherQt 10000000)
 
 # Where we will install the script in the build tree
 get_target_property(GUI_OUTPUT_DIR otbApplicationLauncherQt RUNTIME_OUTPUT_DIRECTORY)
diff --git a/Modules/Wrappers/QtWidget/src/otbQtFileSelectionWidget.cxx b/Modules/Wrappers/QtWidget/src/otbQtFileSelectionWidget.cxx
index a3fb761..269e738 100644
--- a/Modules/Wrappers/QtWidget/src/otbQtFileSelectionWidget.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbQtFileSelectionWidget.cxx
@@ -17,13 +17,21 @@
 =========================================================================*/
 #include "otbQtFileSelectionWidget.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
 {
 
-QtFileSelectionWidget::QtFileSelectionWidget()
-  : QWidget()
+QtFileSelectionWidget
+::QtFileSelectionWidget() :
+  QWidget(),
+  m_HLayout( NULL ),
+  m_Input( NULL ),
+  m_Button( NULL ),
+  m_Checkbox( NULL ),
+  m_IOMode( IO_MODE_INPUT )
 {
   this->DoCreateWidget();
 }
@@ -32,6 +40,20 @@ QtFileSelectionWidget::~QtFileSelectionWidget()
 {
 }
 
+void
+QtFileSelectionWidget
+::SetIOMode( IOMode mode )
+{
+  m_IOMode = mode;
+}
+
+QtFileSelectionWidget::IOMode
+QtFileSelectionWidget
+::GetIOMode() const
+{
+  return m_IOMode;
+}
+
 void QtFileSelectionWidget::DoUpdateGUI()
 {
 
@@ -63,28 +85,37 @@ void QtFileSelectionWidget::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtFileSelectionWidget::SelectFile()
-{
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::ExistingFile);
-  fileDialog.setNameFilter("All files (*)");
-
-  QFileInfo finfo( QString::fromStdString( GetFilename() ) );
 
-  fileDialog.setDirectory(
-    finfo.isDir()
-    ? finfo.absoluteFilePath()
-    : finfo.absoluteDir()
+void
+QtFileSelectionWidget
+::SelectFile()
+{
+  assert( m_Input!=NULL );
+
+  QString filename(
+    m_IOMode == IO_MODE_INPUT
+    ? GetOpenFileName(
+        this,
+	QString(),
+	m_Input->text(),
+	tr( "All files (*)" ),
+	NULL,
+	QFileDialog::ReadOnly )
+    : GetSaveFileName(
+        this,
+	QString(),
+	m_Input->text(),
+	tr( "All files (*)" ),
+	NULL )
   );
 
-  if (fileDialog.exec())
-    {
-    QString filemane(fileDialog.selectedFiles().at(0));
-    m_Input->setText(filemane);
-    }
+  if( filename.isEmpty() )
+    return;
+
+  m_Input->setText( filename  );
 }
 
 
 }
+
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexInputImageParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexInputImageParameter.cxx
index 412c1cb..2b144e5 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexInputImageParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexInputImageParameter.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetComplexInputImageParameter.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -72,39 +74,42 @@ void QtWidgetComplexInputImageParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetComplexInputImageParameter::SelectFile()
+void
+QtWidgetComplexInputImageParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::ExistingFile);
-  fileDialog.setNameFilter("Raster files (*)");
-
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
+  QString filename(
+    GetOpenFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "Raster files (*)" ),
+      NULL,
+      QFileDialog::ReadOnly
+    )
+  );
+
+  if( filename.isEmpty() )
+    return;
+
+  if( !SetFileName( filename ) )
     {
-    QFileInfo finfo( m_Input->text() );
+    std::ostringstream oss;
 
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-      );
-    }
+    oss << "Invalid filename: '"
+	<< QFile::encodeName( filename ).constData()
+	<< "'";
 
-  if (fileDialog.exec())
-    {
-    if ( this->SetFileName( fileDialog.selectedFiles().at(0) ) == true )
-      m_Input->setText(fileDialog.selectedFiles().at(0));
-    else
-      {
-      std::ostringstream oss;
-      oss << "The given file "
-          << QFile::encodeName(	fileDialog.selectedFiles().at( 0 ) ).constData()
-          << " is not valid.";
-      this->GetModel()->SendLogWARNING( oss.str() );
-      }
+    assert( GetModel()!=NULL );
+
+    GetModel()->SendLogWARNING( oss.str() );
+
+    return;
     }
+
+  m_Input->setText( filename  );
 }
 
 bool QtWidgetComplexInputImageParameter::SetFileName(const QString& value)
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx
index 79063bf..0d7d043 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx
@@ -16,7 +16,10 @@
 
 =========================================================================*/
 #include "otbWrapperQtWidgetComplexOutputImageParameter.h"
-#include "otbWrapperTypes.h"
+
+
+#include <otbQtAdapters.h>
+#include <otbWrapperTypes.h>
 
 namespace otb
 {
@@ -77,20 +80,32 @@ void QtWidgetComplexOutputImageParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetComplexOutputImageParameter::SelectFile()
+
+void
+QtWidgetComplexOutputImageParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::AnyFile);
-  fileDialog.setNameFilter("Raster files (*)");
-
-  if (fileDialog.exec())
-    {
-    //this->SetFileName(fileDialog.selectedFiles().at(0));
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  assert( m_Input!=NULL );
+
+  QString filename(
+    GetSaveFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "Raster files (*)" ),
+      NULL
+    )
+  );
+
+  if( filename.isEmpty() )
+    return;
+
+  SetFileName( filename );
+
+  m_Input->setText( filename  );
 }
 
+
 void QtWidgetComplexOutputImageParameter::SetFileName(const QString& value)
 {
   // save value
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetDirectoryParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetDirectoryParameter.cxx
index cdf6b8f..e829cd3 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetDirectoryParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetDirectoryParameter.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetDirectoryParameter.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -68,21 +70,28 @@ void QtWidgetDirectoryParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetDirectoryParameter::SelectFile()
+
+void
+QtWidgetDirectoryParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::Directory);
-  fileDialog.setNameFilter("Select a Directory");
+  assert( m_Input!=NULL );
+
+  QString dir(
+    GetExistingDirectory(
+      this,
+      QString(),
+      m_Input->text()
+    )
+  );
 
-  if (fileDialog.exec())
-    {
-    this->SetFileName( fileDialog.selectedFiles().at(0) );
+  if( dir.isEmpty() )
+    return;
 
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  m_Input->setText( dir );
 }
 
+
 void QtWidgetDirectoryParameter::SetFileName(const QString& value)
 {
   // save value
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameListParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameListParameter.cxx
index b28d168..7ea39df 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameListParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameListParameter.cxx
@@ -125,6 +125,7 @@ void QtWidgetInputFilenameListParameter::DoCreateWidget()
   fileLayout->setSpacing(0);
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   fileLayout->addWidget(fileSelection);
   m_InputFilenameListParam->AddNullElement();
@@ -296,6 +297,7 @@ QtWidgetInputFilenameListParameter::AddFile()
     }
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   m_FileLayout->addWidget(fileSelection);
   m_FileSelectionList.push_back(fileSelection);
@@ -345,6 +347,7 @@ QtWidgetInputFilenameListParameter::EraseFile()
   m_FileLayout = new QVBoxLayout();
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   m_FileLayout->addWidget(fileSelection);
   m_FileSelectionList.push_back(fileSelection);
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameParameter.cxx
index 596adee..9b38f12 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputFilenameParameter.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetInputFilenameParameter.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 
@@ -73,53 +75,32 @@ void QtWidgetInputFilenameParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetInputFilenameParameter::SelectFile()
-{
-  QFileDialog fileDialog;
-
-  fileDialog.setConfirmOverwrite(true);
-
-  switch(m_FilenameParam->GetRole())
-    {
-    case Role_Input:
-    {
-    //fileDialog.setFileMode(QFileDialog::ExistingFile);
-    // FIXME: parameter's role is not suitable to separate "input file" names from "output file" names
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    }
-    break;
-    case Role_Output:
-    {
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    }
-    break;
-    }
-
-  fileDialog.setNameFilter("File (*)");
-
 
+void
+QtWidgetInputFilenameParameter
+::SelectFile()
+{
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
-    {
-    QFileInfo finfo( m_Input->text() );
-
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+  QString filename(
+    GetOpenFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "All files (*)" ),
+      NULL,
+      QFileDialog::ReadOnly )
+  );
 
+  if( filename.isEmpty() )
+    return;
 
-  if (fileDialog.exec())
-    {
-    this->SetFileName( fileDialog.selectedFiles().at(0) );
+  SetFileName( filename );
 
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  m_Input->setText( filename  );
 }
 
+
 void QtWidgetInputFilenameParameter::SetFileName(const QString& value)
 {
   // save value
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageListParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageListParameter.cxx
index b44053d..8f22be3 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageListParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageListParameter.cxx
@@ -127,6 +127,7 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
   fileLayout->setSpacing(0);
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   fileLayout->addWidget(fileSelection);
   m_InputImageListParam->AddNullElement();
@@ -310,6 +311,7 @@ QtWidgetInputImageListParameter::AddFile()
     }
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   m_FileLayout->addWidget(fileSelection);
   m_FileSelectionList.push_back(fileSelection);
@@ -364,6 +366,7 @@ QtWidgetInputImageListParameter::EraseFile()
   m_FileLayout = new QVBoxLayout();
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   m_FileLayout->addWidget(fileSelection);
   m_FileSelectionList.push_back(fileSelection);
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageParameter.cxx
index 2ffc527..f53b714 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputImageParameter.cxx
@@ -16,8 +16,14 @@
 
 =========================================================================*/
 #include "otbWrapperQtWidgetInputImageParameter.h"
+
+
 #include <stdexcept>
 
+
+#include <otbQtAdapters.h>
+
+
 namespace otb
 {
 namespace Wrapper
@@ -76,39 +82,42 @@ void QtWidgetInputImageParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetInputImageParameter::SelectFile()
+void
+QtWidgetInputImageParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::ExistingFile);
-  fileDialog.setNameFilter("Raster files (*)");
-
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
+  QString filename(
+    GetOpenFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "Raster files (*)" ),
+      NULL,
+      QFileDialog::ReadOnly
+    )
+  );
+
+  if( filename.isEmpty() )
+    return;
+
+  if( !SetFileName( filename ) )
     {
-    QFileInfo finfo( m_Input->text() );
+    std::ostringstream oss;
 
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+    oss << "Invalid filename: '"
+	<< QFile::encodeName( filename ).constData()
+	<< "'";
 
-  if (fileDialog.exec())
-    {
-    if ( this->SetFileName( fileDialog.selectedFiles().at(0) ) == true )
-      m_Input->setText(fileDialog.selectedFiles().at(0));
-    else
-      {
-      std::ostringstream oss;
-      oss << "The given file "
-          << QFile::encodeName(	fileDialog.selectedFiles().at( 0 ) ).constData()
-          << " is not valid.";
-      this->GetModel()->SendLogWARNING( oss.str() );
-      }
+    assert( GetModel()!=NULL );
+
+    GetModel()->SendLogWARNING( oss.str() );
+
+    return;
     }
+
+  m_Input->setText( filename  );
 }
 
 bool QtWidgetInputImageParameter::SetFileName(const QString& value)
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx
index acf27f5..daa083f 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx
@@ -17,6 +17,10 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetInputProcessXMLParameter.h"
 
+
+#include <otbQtAdapters.h>
+
+
 namespace otb
 {
 namespace Wrapper
@@ -70,39 +74,33 @@ void QtWidgetInputProcessXMLParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetInputProcessXMLParameter::SelectFile()
-{
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::AnyFile);
-  fileDialog.setNameFilter("XML File (*.xml)");
 
+void
+QtWidgetInputProcessXMLParameter
+::SelectFile()
+{
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
-    {
-    QFileInfo finfo( m_Input->text() );
-
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+  QString filename(
+    GetOpenFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "XML File (*.xml)" ),
+      NULL,
+      QFileDialog::ReadOnly
+    )
+  );
 
-  if (fileDialog.exec())
-    {
-    QString name = fileDialog.selectedFiles().at(0);
+  if( filename.isEmpty() )
+    return;
 
-    if( !name.isEmpty() )
-      {
-      this->SetFileName( name );
+  SetFileName( filename );
 
-      m_Input->setText(name);
-      }
-    }
+  m_Input->setText( filename  );
 }
 
+
 void QtWidgetInputProcessXMLParameter::SetFileName(const QString& value)
 {
   // load xml file name
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataListParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataListParameter.cxx
index 611be37..56fbc19 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataListParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataListParameter.cxx
@@ -124,6 +124,7 @@ void QtWidgetInputVectorDataListParameter::DoCreateWidget()
   fileLayout->setSpacing(0);
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   fileLayout->addWidget(fileSelection);
   m_InputVectorDataListParam->AddNullElement();
@@ -295,6 +296,7 @@ QtWidgetInputVectorDataListParameter::AddFile()
     }
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   m_FileLayout->addWidget(fileSelection);
   m_FileSelectionList.push_back(fileSelection);
@@ -344,6 +346,7 @@ QtWidgetInputVectorDataListParameter::EraseFile()
   m_FileLayout = new QVBoxLayout();
 
   QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  fileSelection->SetIOMode( QtFileSelectionWidget::IO_MODE_INPUT );
   fileSelection->setFixedHeight(30);
   m_FileLayout->addWidget(fileSelection);
   m_FileSelectionList.push_back(fileSelection);
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataParameter.cxx
index a227ec5..3cc82c8 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputVectorDataParameter.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetInputVectorDataParameter.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -73,43 +75,46 @@ void QtWidgetInputVectorDataParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetInputVectorDataParameter::SelectFile()
-{
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::ExistingFile);
-  fileDialog.setNameFilter("Vector data files (*)");
 
+void
+QtWidgetInputVectorDataParameter
+::SelectFile()
+{
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
+  QString filename(
+    GetOpenFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "Vector data files (*)" ),
+      NULL,
+      QFileDialog::ReadOnly
+    )
+  );
+
+  if( filename.isEmpty() )
+    return;
+
+  if( !SetFileName( filename ) )
     {
-    QFileInfo finfo( m_Input->text() );
+    std::ostringstream oss;
 
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+    oss << "Invalid filename: '"
+	<< QFile::encodeName( filename ).constData()
+	<< "'";
 
-  if (fileDialog.exec())
-    {
-    if ( this->SetFileName( fileDialog.selectedFiles().at(0) )  == true )
-    {
-      m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
-    else
-      {
-      std::ostringstream oss;
-      oss << "The given file "
-          << QFile::encodeName( fileDialog.selectedFiles().at( 0 ) ).constData()
-          << " is not valid.";
-      this->GetModel()->SendLogWARNING( oss.str() );
-      }
+    assert( GetModel()!=NULL );
+
+    GetModel()->SendLogWARNING( oss.str() );
+
+    return;
     }
+
+  m_Input->setText( filename  );
 }
 
+
 bool QtWidgetInputVectorDataParameter::SetFileName(const QString& value)
 {
   bool res = true;
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
index bdc9eba..9427927 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
@@ -70,7 +70,7 @@ void QtWidgetListViewParameter::DoCreateWidget()
 {
   m_ListView = new QListWidget();
   m_ListView->setToolTip(m_ListViewParam->GetDescription());
-  m_ListView->setSelectionMode(QAbstractItemView::MultiSelection);
+  m_ListView->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
   connect( m_ListView, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItems()) );
 
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputFilenameParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputFilenameParameter.cxx
index 33c356d..7176810 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputFilenameParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputFilenameParameter.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetOutputFilenameParameter.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -69,50 +71,30 @@ void QtWidgetOutputFilenameParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetOutputFilenameParameter::SelectFile()
+void
+QtWidgetOutputFilenameParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  switch(m_FilenameParam->GetRole())
-    {
-    case Role_Input:
-    {
-    //fileDialog.setFileMode(QFileDialog::ExistingFile);
-    // FIXME: parameter's role is not suitable to separate "input file" names from "output file" names
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    }
-    break;
-    case Role_Output:
-    {
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    }
-    break;
-    }
-
-  fileDialog.setNameFilter("File (*)");
-
-
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
-    {
-    QFileInfo finfo( m_Input->text() );
+  QString filename(
+    GetSaveFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "All files (*)" ),
+      NULL )
+  );
 
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+  if( filename.isEmpty() )
+    return;
 
-  if (fileDialog.exec())
-    {
-    this->SetFileName( fileDialog.selectedFiles().at( 0 ) );
+  SetFileName( filename );
 
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  m_Input->setText( filename  );
 }
 
+
 void QtWidgetOutputFilenameParameter::SetFileName(const QString& value)
 {
   // save value
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx
index be265da..9dd9140 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx
@@ -18,6 +18,8 @@
 #include "otbWrapperQtWidgetOutputImageParameter.h"
 #include "otbWrapperTypes.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -84,33 +86,25 @@ void QtWidgetOutputImageParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetOutputImageParameter::SelectFile()
+void
+QtWidgetOutputImageParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
-
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::AnyFile);
-  fileDialog.setNameFilter("Raster files (*)");
-
-
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
-    {
-    QFileInfo finfo( m_Input->text() );
+  QString filename(
+    GetSaveFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "Raster files (*)" ),
+      NULL )
+  );
 
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+  if( filename.isEmpty() )
+    return;
 
-  if (fileDialog.exec())
-    {
-    //this->SetFileName(fileDialog.selectedFiles().at(0));
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  m_Input->setText( filename );
 }
 
 void QtWidgetOutputImageParameter::SetFileName(const QString& value)
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx
index 059d94a..fefd151 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx
@@ -17,6 +17,8 @@
 =========================================================================*/
 #include "otbWrapperQtWidgetOutputProcessXMLParameter.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -67,35 +69,29 @@ void QtWidgetOutputProcessXMLParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetOutputProcessXMLParameter::SelectFile()
-{
-  QFileDialog fileDialog;
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::AnyFile);
-
-  fileDialog.setNameFilter("XML File (*.xml)");
 
+void
+QtWidgetOutputProcessXMLParameter
+::SelectFile()
+{
   assert( m_Input!=NULL );
 
-  if( !m_Input->text().isEmpty() )
-    {
-    QFileInfo finfo( m_Input->text() );
-
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
+  QString filename(
+    GetSaveFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "XML File (*.xml)" ),
+      NULL )
+  );
 
-  if (fileDialog.exec())
-    {
-    this->SetFileName( fileDialog.selectedFiles().at(0) );
+  if( filename.isEmpty() )
+    return;
 
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  m_Input->setText( filename );
 }
 
+
 void QtWidgetOutputProcessXMLParameter::SetFileName(const QString& value)
 {
   // save xml file name
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputVectorDataParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputVectorDataParameter.cxx
index 1cf7024..5db8af4 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputVectorDataParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputVectorDataParameter.cxx
@@ -18,6 +18,8 @@
 #include "otbWrapperQtWidgetOutputVectorDataParameter.h"
 #include "otbWrapperTypes.h"
 
+#include <otbQtAdapters.h>
+
 namespace otb
 {
 namespace Wrapper
@@ -63,34 +65,30 @@ void QtWidgetOutputVectorDataParameter::DoCreateWidget()
   this->setLayout(m_HLayout);
 }
 
-void QtWidgetOutputVectorDataParameter::SelectFile()
+
+void
+QtWidgetOutputVectorDataParameter
+::SelectFile()
 {
-  QFileDialog fileDialog;
+  assert( m_Input!=NULL );
 
-  fileDialog.setConfirmOverwrite(true);
-  fileDialog.setFileMode(QFileDialog::AnyFile);
-  fileDialog.setNameFilter("Vector data files (*)");
+  QString filename(
+    GetSaveFileName(
+      this,
+      QString(),
+      m_Input->text(),
+      tr( "Vector data files (*)" ),
+      NULL
+    )
+  );
 
-  assert( m_Input!=NULL );
+  if( filename.isEmpty() )
+    return;
 
-  if( !m_Input->text().isEmpty() )
-    {
-    QFileInfo finfo( m_Input->text() );
-
-    fileDialog.setDirectory(
-      finfo.isDir()
-      ? finfo.absoluteFilePath()
-      : finfo.absoluteDir()
-    );
-    }
-
-  if (fileDialog.exec())
-    {
-    //this->SetFileName(fileDialog.selectedFiles().at(0));
-    m_Input->setText(fileDialog.selectedFiles().at(0));
-    }
+  m_Input->setText( filename );
 }
 
+
 void QtWidgetOutputVectorDataParameter::SetFileName(const QString& value)
 {
   // save value
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterBase.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterBase.cxx
index b4c3496..2c6d904 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterBase.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterBase.cxx
@@ -46,7 +46,7 @@ void QtWidgetParameterBase::UpdateGUI()
   // Update the GUI
   this->DoUpdateGUI();
 
-  // Emit State of the Parameter to update this paramter checkbox
+  // Emit State of the Parameter to update this parameter checkbox
   if (!m_Param->GetMandatory())
     {
     bool state = m_Param->GetActive();
@@ -77,7 +77,7 @@ QtWidgetModel* QtWidgetParameterBase::GetModel()
 // current widget
 void QtWidgetParameterBase::SetActivationState( bool value )
 {
-  //filter out EmptyParamter
+  //filter out EmptyParameter
   if(strcmp(m_Param->GetNameOfClass(), "EmptyParameter") == 0)
     {
     //only set user value if there is a change
@@ -99,5 +99,7 @@ void QtWidgetParameterBase::Reset(  )
   m_Param->SetAutomaticValue(false);
   this->UpdateGUI();
 }
+
 }
+
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
index 2f1ae5a..fbb113c 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
@@ -130,7 +130,7 @@ void QtWidgetParameterGroup::DoCreateWidget()
         QGroupBox* group = new QGroupBox;
         group->setLayout(vboxLayout);
 
-        // Make the paramter Group checkable when it is not mandatory
+        // Make the parameter Group checkable when it is not mandatory
         if (!param->GetMandatory() )
           {
           group->setCheckable(true);
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetRAMParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetRAMParameter.cxx
index da753d7..16ba810 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetRAMParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetRAMParameter.cxx
@@ -48,7 +48,7 @@ void QtWidgetRAMParameter::DoCreateWidget()
   // Set a valid range
   // Using m_UnsignedIntParam->GetMaximum() to set the maximum range
   // of the SpinBox give a maximum of 0. The SpinBox max is an
-  // interger and m_UnsignedIntParam->GetMaximum() returns an unsigned
+  // integer and m_UnsignedIntParam->GetMaximum() returns an unsigned
   // integer which is 2 times the itk::NumericTraits<int>::max().
   // static_cast<int>(m_UnsignedIntParam->GetMaximum()) = 0 then.
   m_QSpinBox->setRange(itk::NumericTraits<int>::Zero,
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetStringParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetStringParameter.cxx
index 629e90c..e782058 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetStringParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetStringParameter.cxx
@@ -36,7 +36,7 @@ void QtWidgetStringParameter::DoUpdateGUI()
 {
   m_Input->setToolTip(m_StringParam->GetDescription());
 
-  // Update the lineEdit only if there is a change and thats not empty or whitespaces
+  // Update the lineEdit only if there is a change and that's not empty or whitespaces
   QString text( m_StringParam->GetValue().c_str() );
   if (!text.trimmed().isEmpty() && text != m_Input->text())
     {
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
index 63a0adf..70ccd2a 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
@@ -81,7 +81,7 @@ void QtWidgetView::CreateGui()
   this->setLayout(finalLayout);
 }
 
-void QtWidgetView::UpdateMessageAfterExcuteClicked()
+void QtWidgetView::UpdateMessageAfterExecuteClicked()
 {
   m_Message->setText("<center><font color=\"#FF0000\">Running</font></center>");
 }
@@ -123,7 +123,7 @@ QWidget* QtWidgetView::CreateFooter()
   m_ExecButton->setText(QObject::tr("Execute"));
   connect( m_ExecButton, SIGNAL(clicked()), m_Model, SLOT(ExecuteAndWriteOutputSlot() ) );
   connect( m_Model, SIGNAL(SetApplicationReady(bool)), m_ExecButton, SLOT(setEnabled(bool)) );
-  connect( m_ExecButton, SIGNAL(clicked()), this, SLOT(UpdateMessageAfterExcuteClicked() ) );
+  connect( m_ExecButton, SIGNAL(clicked()), this, SLOT(UpdateMessageAfterExecuteClicked() ) );
 
   m_QuitButton = new QPushButton(footerGroup);
   m_QuitButton->setText(QObject::tr("Quit"));
diff --git a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
index 3dae376..21067b3 100644
--- a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
+++ b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
@@ -80,7 +80,7 @@ int otbWrapperQtWidgetShowWidget(int argc, char* argv[])
     QtWidgetProgressReport* progressReport =  new QtWidgetProgressReport(gui->GetModel());
     progressReport->SetApplication(app);
   
-    // Create a dock widget containg the progress widget
+    // Create a dock widget containing the progress widget
     QDockWidget* qdock = new QDockWidget("Progress Reporting ...", mainWindow);
     qdock->setWidget(progressReport);
   
diff --git a/Modules/Wrappers/SWIG/src/otbApplication.i b/Modules/Wrappers/SWIG/src/otbApplication.i
index 9b41b7a..c617e05 100644
--- a/Modules/Wrappers/SWIG/src/otbApplication.i
+++ b/Modules/Wrappers/SWIG/src/otbApplication.i
@@ -29,7 +29,7 @@
 #define SWIG_FILE_WITH_INIT
 %}
 
-// Langage specific extension
+// Language specific extension
 %include "Python.i"
 %include "Java.i"
 %include "Ruby.i"
@@ -203,7 +203,18 @@ public:
   std::string GetParameterString(std::string parameter);
   std::vector<std::string> GetParameterStringList(std::string parameter);
   std::string GetParameterAsString(std::string paramKey);
-
+  
+  InputImageParameter::ImageBaseType * GetParameterOutputImage(std::string parameter);
+  void SetParameterInputImage(std::string parameter, InputImageParameter::ImageBaseType * inputImage);
+  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 ClearParameterInputImageList(std::string parameter);
+  unsigned int GetNumberOfElementsInParameterInputImageList(std::string parameter);
+
+
+  
   itkProcessObject* GetProgressSource() const;
 
   std::string GetProgressDescription() const;
@@ -434,13 +445,13 @@ class ApplicationProxy(object):
       self.__dict__["application"].SetParameterString(groupkey, value)
 
   def __str__(self):
-      return self.__dict__["application"].GetParameterAsString(self.groupkey)
+    return self.__dict__["application"].GetParameterAsString(self.groupkey)
 
   def __eq__(self, other):
     if not type(other) == type(self):
-			return (self.__str__() == other)
+      return (self.__str__() == other)
     else:
-			return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__)
+      return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__)
 
   def __ne__(self, other):
     return not self.__eq__(other)
@@ -450,10 +461,9 @@ class ApplicationProxy(object):
 
   def __setattr__(self,attr,value):
     if attr not in self.__dict__:
-        return self.__dict__["application"].SetParameterValue( self.groupkey + "." + attr.lower(), value )
+      return self.__dict__["application"].SetParameterValue( self.groupkey + "." + attr.lower(), value )
     else:
-        return dict.__setattr__(self, attr, value)
-
+      return dict.__setattr__(self, attr, value)
 
 }
 #endif
@@ -526,7 +536,7 @@ class ApplicationProxy(object):
 			elif paramType in [ParameterType_Choice]:
 			  return ApplicationProxy(self, paramKey, value)
 			else:
-			  print "Unsupported parameter type '%s' with key '%s'" %(self.GetParameterTypeAsString(paramType) ,paramKey)
+			  print ("Unsupported parameter type '%s' with key '%s'" %(self.GetParameterTypeAsString(paramType) ,paramKey))
 			return
 
 		def GetParameterValue(self, paramKey):
@@ -551,7 +561,7 @@ class ApplicationProxy(object):
 			elif paramType in [ParameterType_Group, ParameterType_Choice]:
 			  return ApplicationProxy(self, paramKey)
 			else:
-			  print "Unsupported parameter type '%s' with key '%s'" %(self.GetParameterTypeAsString(paramType) ,paramKey)
+			  print ("Unsupported parameter type '%s' with key '%s'" %(self.GetParameterTypeAsString(paramType) ,paramKey))
 			return None
 
 		def __getattr__(self,attr):
@@ -577,7 +587,7 @@ class ApplicationProxy(object):
 		  keep hide the SetParameter** calls within this method so that it seems like
 		  an obivous call for users. App.IN='my-input-file-name' , App.OUT='my-output-file-name'w
 		  here 'in' and 'out' are    parameters in the 'otb application' with instance App
-		  Ofcourse, we dont blindly accept any attributes as python, we check them against
+		  Ofcourse, we don't blindly accept any attributes as python, we check them against
 		  list of existing parameters for application with 'self.GetParametersKeys(True)'
 		  """
 		  if attr is not None:
@@ -691,8 +701,8 @@ class ApplicationProxy(object):
       elif dt == 'double':
         return self.GetVectorImageAsDoubleNumpyArray_(paramKey)
       else:
-        print "Unknown datatype '" + dt + "'. Using float instead. Available types are:"
-        print "int8, int16, int32, uint8, uint16, uint32, float, double"
+        print ("Unknown datatype '" + dt + "'. Using float instead. Available types are:")
+        print ("int8, int16, int32, uint8, uint16, uint32, float, double")
         return self.GetVectorImageAsFloatNumpyArray_(paramKey)
 
     def GetImageAsNumpyArray(self, paramKey, dt='float'):
@@ -720,8 +730,8 @@ class ApplicationProxy(object):
         numpy_vector_image = self.GetVectorImageAsDoubleNumpyArray_(paramKey)
 
       else:
-        print "Unknown datatype '" + dt + "'. Using float instead. Available types are:"
-        print "int8, int16, int32, uint8, uint16, uint32, float, double"
+        print ("Unknown datatype '" + dt + "'. Using float instead. Available types are:")
+        print ("int8, int16, int32, uint8, uint16, uint32, float, double")
         numpy_vector_image = self.GetVectorImageAsFloatNumpyArray_(paramKey)
 
       if len(numpy_vector_image.shape) > 2:
diff --git a/Modules/Wrappers/SWIG/src/otbWrapperSWIGIncludes.h b/Modules/Wrappers/SWIG/src/otbWrapperSWIGIncludes.h
index bd2af22..c206c79 100644
--- a/Modules/Wrappers/SWIG/src/otbWrapperSWIGIncludes.h
+++ b/Modules/Wrappers/SWIG/src/otbWrapperSWIGIncludes.h
@@ -33,4 +33,7 @@ typedef otb::Wrapper::DocExampleStructure                DocExampleStructure;
 typedef otb::Wrapper::Parameter                          Parameter;
 typedef otb::Wrapper::OutputImageParameter               OutputImageParameter;
 typedef otb::Wrapper::InputImageParameter                InputImageParameter;
+typedef otb::Wrapper::ComplexOutputImageParameter        ComplexOutputImageParameter;
+typedef otb::Wrapper::ComplexInputImageParameter         ComplexInputImageParameter;
+
 #endif
diff --git a/Modules/Wrappers/SWIG/test/python/Bug440.py b/Modules/Wrappers/SWIG/test/python/Bug440.py
index e7d4134..aeb3d1f 100644
--- a/Modules/Wrappers/SWIG/test/python/Bug440.py
+++ b/Modules/Wrappers/SWIG/test/python/Bug440.py
@@ -1,16 +1,16 @@
 # Import the otb applications package
-import otbApplication
-import sys
 
-# The following line creates an instance of the Convert application 
-Convert = otbApplication.Registry.CreateApplication("Convert")
+import sys
+def test(otbApplication, argv):
+	# The following line creates an instance of the Convert application
+	Convert = otbApplication.Registry.CreateApplication("Convert")
 
-# The following lines set all the application parameters:
-Convert.SetParameterString("in", sys.argv[1])
+	# The following lines set all the application parameters:
+	Convert.SetParameterString("in", argv[1])
 
-Convert.SetParameterString("out", sys.argv[2])
+	Convert.SetParameterString("out", argv[2])
 
-Convert.SetParameterString("type","linear")
+	Convert.SetParameterString("type","linear")
 
-# The following line execute the application
-sys.exit(Convert.ExecuteAndWriteOutput())
+	# The following line execute the application
+	sys.exit(Convert.ExecuteAndWriteOutput())
diff --git a/Modules/Wrappers/SWIG/test/python/Bug736.py b/Modules/Wrappers/SWIG/test/python/Bug736.py
index 44d1b33..a32a5ff 100644
--- a/Modules/Wrappers/SWIG/test/python/Bug736.py
+++ b/Modules/Wrappers/SWIG/test/python/Bug736.py
@@ -1,18 +1,17 @@
-import otbApplication
-import sys
 
-RadiometricIndices = otbApplication.Registry.CreateApplication('RadiometricIndices')
-RadiometricIndices.SetParameterString("in", sys.argv[1])
-RadiometricIndices.SetParameterString("out", sys.argv[2])
-RadiometricIndices.SetParameterInt("channels.red", 3)
-RadiometricIndices.SetParameterInt("channels.green", 2)
-RadiometricIndices.SetParameterInt("channels.nir", 4)
 
-RadiometricIndices.SetParameterStringList("list", 
-        ["Vegetation:NDVI","Vegetation:RVI","Vegetation:IPVI"])
-        
-print RadiometricIndices.GetParameterStringList("list")
+def test(otbApplication, argv):
+	RadiometricIndices = otbApplication.Registry.CreateApplication('RadiometricIndices')
+	RadiometricIndices.SetParameterString("in", argv[1])
+	RadiometricIndices.SetParameterString("out", argv[2])
+	RadiometricIndices.SetParameterInt("channels.red", 3)
+	RadiometricIndices.SetParameterInt("channels.green", 2)
+	RadiometricIndices.SetParameterInt("channels.nir", 4)
 
-print RadiometricIndices.GetParameterValue("list")
+	RadiometricIndices.SetParameterStringList("list",	["Vegetation:NDVI","Vegetation:RVI","Vegetation:IPVI"])
 
-RadiometricIndices.ExecuteAndWriteOutput()
\ No newline at end of file
+	print( RadiometricIndices.GetParameterStringList("list") )
+
+	print( RadiometricIndices.GetParameterValue("list") )
+
+	RadiometricIndices.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/Bug804.py b/Modules/Wrappers/SWIG/test/python/Bug804.py
index e982f10..9c04a68 100644
--- a/Modules/Wrappers/SWIG/test/python/Bug804.py
+++ b/Modules/Wrappers/SWIG/test/python/Bug804.py
@@ -1,6 +1,4 @@
-import otbApplication
-app = otbApplication.Registry_CreateApplication('TrainImagesClassifier')
-app.SetParameterFloat('classifier.libsvm.opt',True)
-print app.GetParameterValue('classifier.libsvm.opt')
-
-
+def test(otb, argv):
+	app = otb.Registry.CreateApplication('TrainImagesClassifier')
+	app.SetParameterFloat('classifier.libsvm.opt',True)
+	print( app.GetParameterValue('classifier.libsvm.opt') )
diff --git a/Modules/Wrappers/SWIG/test/python/Bug823.py b/Modules/Wrappers/SWIG/test/python/Bug823.py
index 9795804..9c97558 100644
--- a/Modules/Wrappers/SWIG/test/python/Bug823.py
+++ b/Modules/Wrappers/SWIG/test/python/Bug823.py
@@ -1,13 +1,11 @@
-import otbApplication,sys
-
-app = otbApplication.Registry.CreateApplication('Rasterization')
-
-try:
-  app.GetParameterInt('szx')
-except RuntimeError as e:
-  print "Exception message : " + e.args[0]
-  if e.args[0].startswith("boost::bad_any_cast"):
-    sys.exit(1)
-
-sys.exit(0)
-
+from sys import exit
+def test(otb, argv):
+	app = otb.Registry.CreateApplication('Rasterization')
+	try:
+		app.GetParameterInt('szx')
+	except RuntimeError, e:
+		print( "Exception message : " + e.args[0] )
+		if e.args[0].startswith("boost::bad_any_cast"):
+			exit(1)
+
+		exit(0)
diff --git a/Modules/Wrappers/SWIG/test/python/CMakeLists.txt b/Modules/Wrappers/SWIG/test/python/CMakeLists.txt
index da9cdd7..bc54e08 100644
--- a/Modules/Wrappers/SWIG/test/python/CMakeLists.txt
+++ b/Modules/Wrappers/SWIG/test/python/CMakeLists.txt
@@ -5,94 +5,114 @@ set(TEST_DRIVER otbTestDriver
 
 if(WIN32)
   # on windows, loading the module _otbApplication requires the otbossimplugins*.dll
-  # which is in the 'bin' folder
+  # which is in the 'bin/<CMAKE_BUILD_TYPE>' folder
   set(TEST_DRIVER ${TEST_DRIVER}
-    --add-before-env PATH ${OTB_BINARY_DIR}/bin)
+    --add-before-env PATH ${CMAKE_BINARY_DIR}/bin
+    --add-before-env PATH $<TARGET_FILE_DIR:OTBCommon>)
 endif(WIN32)
 
 add_test( NAME pyTvSmoothing
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonSmoothingTest.py
-                  ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
-                  ${TEMP}/pyTvSmoothing_ )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonSmoothingTest
+  ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
+  ${TEMP}/pyTvSmoothing_ )
 
 add_test( NAME pyTvRescale
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonRescaleTest.py
-                  ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
-                  ${TEMP}/pyTvRescale)
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonRescaleTest
+  ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
+  ${TEMP}/pyTvRescale)
 
 add_test( NAME pyTvHyperspectralUnmixingUCLS
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonHyperspectralUnmixing1.py
-                  ${OTB_DATA_ROOT}/Input/Hyperspectral/synthetic/hsi_cube.tif
-                  ${TEMP}/pyTvHyperspectralUnmixing_ucls.tif
-                  ${OTB_DATA_ROOT}/Input/Hyperspectral/synthetic/endmembers.tif
-                  ucls
-                  )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonHyperspectralUnmixing1
+  ${OTB_DATA_ROOT}/Input/Hyperspectral/synthetic/hsi_cube.tif
+  ${TEMP}/pyTvHyperspectralUnmixing_ucls.tif
+  ${OTB_DATA_ROOT}/Input/Hyperspectral/synthetic/endmembers.tif
+  ucls
+  )
 
 add_test( NAME pyTvBug440
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Bug440.py
-                  ${OTB_DATA_ROOT}/Input/scene.png
-                  ${TEMP}/pyTvBug440Output.tif
-                  )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  Bug440
+  ${OTB_DATA_ROOT}/Input/scene.png
+  ${TEMP}/pyTvBug440Output.tif
+  )
 
 add_test( NAME pyTvBug804
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Bug804.py
-                  )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  Bug804
+  )
 
 add_test( NAME pyTvBug823
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Bug823.py
-                  )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  Bug823
+  )
 
 add_test( NAME pyTvBug736
-          COMMAND ${TEST_DRIVER}
-                  --compare-image ${NOTOL}
-                    ${BASELINE}/apTvRIRadiometricVegetationIndices.tif
-                    ${TEMP}/pyTvBug736Output.tif
-                  Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Bug736.py
-                  ${OTB_DATA_ROOT}/Input/veryverySmallFSATSW.tif
-                  ${TEMP}/pyTvBug736Output.tif
-                  )
+  COMMAND ${TEST_DRIVER}
+  --compare-image ${NOTOL}
+  ${BASELINE}/apTvRIRadiometricVegetationIndices.tif
+  ${TEMP}/pyTvBug736Output.tif
+  Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  Bug736
+  ${OTB_DATA_ROOT}/Input/veryverySmallFSATSW.tif
+  ${TEMP}/pyTvBug736Output.tif
+  )
 
 add_test( NAME pyTvBandMathOutXML
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonOutXMLTest.py
-                  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_r.tif
-                  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_nir.tif
-                  ${OTB_DATA_ROOT}/Input/verySmallFSATSW.tif
-                  ${TEMP}/pyTvBandMathOutXML.tif
-                  ${TEMP}/pyTvBandMathOutXML.xml
-                  )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonOutXMLTest
+  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_r.tif
+  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_nir.tif
+  ${OTB_DATA_ROOT}/Input/verySmallFSATSW.tif
+  ${TEMP}/pyTvBandMathOutXML.tif
+  ${TEMP}/pyTvBandMathOutXML.xml
+  )
 
 add_test( NAME pyTvBandMathInXML
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonInXMLTest.py
-                  ${INPUTDATA}/pyTvBandMathInXML.xml
-                  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_r.tif
-                  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_nir.tif
-                  ${OTB_DATA_ROOT}/Input/verySmallFSATSW.tif
-                  ${TEMP}/pyTvBandMathInXML.tif
-                  )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonInXMLTest
+  ${INPUTDATA}/pyTvBandMathInXML.xml
+  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_r.tif
+  ${OTB_DATA_ROOT}/Input/verySmallFSATSW_nir.tif
+  ${OTB_DATA_ROOT}/Input/verySmallFSATSW.tif
+  ${TEMP}/pyTvBandMathInXML.tif
+  )
 
 add_test( NAME pyTvNumpyIO
-          COMMAND ${TEST_DRIVER} Execute
-                  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonNumpyTest.py
-                  ${OTB_DATA_ROOT}/Examples/ROI_QB_MUL_1_SVN_CLASS_MULTI.png
-                  ${TEMP}/pyTvNumpyIO_SmoothingOut.png )
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonNumpyTest
+  ${OTB_DATA_ROOT}/Examples/ROI_QB_MUL_1_SVN_CLASS_MULTI.png
+  ${TEMP}/pyTvNumpyIO_SmoothingOut.png )
 
 add_test( NAME pyTvNewStyleParameters
-          COMMAND ${TEST_DRIVER} Execute
-          ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonNewStyleParametersTest.py
-          ${OTB_DATA_ROOT}/Input/poupees.tif
-          ${TEMP}/pyTvNewStyleParametersTest.tif
-          ${OTB_DATA_ROOT}/Input/apTvUtSmoothingTest_OutXML.xml)
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonNewStyleParametersTest
+  ${OTB_DATA_ROOT}/Input/poupees.tif
+  ${TEMP}/pyTvNewStyleParametersTest.tif
+  ${OTB_DATA_ROOT}/Input/apTvUtSmoothingTest_OutXML.xml)
 
-add_test( NAME pyTvNewStyleParametersInstanciateAll
-          COMMAND ${TEST_DRIVER} Execute
-          ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonNewStyleParametersInstanciateAllTest.py
-          )
+add_test( NAME pyTvNewStyleParametersInstantiateAll
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonNewStyleParametersInstantiateAllTest
+  )
+
+add_test( NAME pyTvConnectApplications
+  COMMAND ${TEST_DRIVER} Execute
+  ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/PythonTestDriver.py
+  PythonConnectApplications
+  ${OTB_DATA_ROOT}/Input/poupees.tif
+  ${TEMP}/pyTvConnectApplicationsOutput.tif)
diff --git a/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py b/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py
new file mode 100644
index 0000000..0b25eb0
--- /dev/null
+++ b/Modules/Wrappers/SWIG/test/python/PythonConnectApplications.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+#
+#  Example on the use of the Rescale
+#
+
+def test(otb, argv):
+	app1 = otb.Registry.CreateApplication("Smoothing")
+	app2 = otb.Registry.CreateApplication("Smoothing")
+	app3 = otb.Registry.CreateApplication("Smoothing")
+	app4 = otb.Registry.CreateApplication("ConcatenateImages")
+
+	app1.IN = argv[1]
+	app1.Execute()
+
+	app2.SetParameterInputImage("in",app1.GetParameterOutputImage("out"))
+	app2.Execute()
+
+	app3.IN = argv[1]
+	app3.Execute()
+
+	app4.AddImageToParameterInputImageList("il",app2.GetParameterOutputImage("out"));
+	app4.AddImageToParameterInputImageList("il",app3.GetParameterOutputImage("out"));
+
+	app4.OUT = argv[2]
+	app4.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonHyperspectralUnmixing1.py b/Modules/Wrappers/SWIG/test/python/PythonHyperspectralUnmixing1.py
index db55be2..da5727d 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonHyperspectralUnmixing1.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonHyperspectralUnmixing1.py
@@ -1,24 +1,22 @@
 # -*- coding: utf-8 -*-
 
 #
-#  Example on the use of the Rescale 
+#  Example on the use of the Rescale
 #
-from sys import argv
-import otbApplication as otb
 
-app = otb.Registry.CreateApplication("HyperspectralUnmixing")
+def test(otb, argv):
+	app = otb.Registry.CreateApplication("HyperspectralUnmixing")
 
-# input image
-app.SetParameterString("in", argv[1])
+	# input image
+	app.SetParameterString("in", argv[1])
 
-#output image
-app.SetParameterString("out", argv[2])
+	#output image
+	app.SetParameterString("out", argv[2])
 
-#input endmembers
-app.SetParameterString("ie", argv[3])
+	#input endmembers
+	app.SetParameterString("ie", argv[3])
 
-#unmixing algorithm
-app.SetParameterString("ua", argv[4])
+	#unmixing algorithm
+	app.SetParameterString("ua", argv[4])
 
-
-app.ExecuteAndWriteOutput()
+	app.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py b/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py
index 283d676..75e545c 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py
@@ -3,16 +3,15 @@
 #
 #  Example on the use of the inxml via BandMath
 #
-from sys import argv
-import otbApplication as otb
 
-app = otb.Registry_CreateApplication('BandMath')
+def test(otb, argv):
+	app = otb.Registry.CreateApplication('BandMath')
 
-imagelist = argv[2:-1]
-app.SetParameterStringList("il", imagelist, True)
+	app.SetParameterString("inxml", argv[1])
+	app.UpdateParameters()
 
-app.SetParameterString("inxml", argv[1])
-app.UpdateParameters()
+	imagelist = argv[2:-1]
+	app.SetParameterStringList("il", imagelist, True)
 
-app.SetParameterString("out"  , argv[-1])
-app.ExecuteAndWriteOutput()
+	app.SetParameterString("out"  , argv[-1])
+	app.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersInstanciateAllTest.py b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersInstanciateAllTest.py
deleted file mode 100644
index 7151dc0..0000000
--- a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersInstanciateAllTest.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import otbApplication as otb
-import operator
-import inspect
-# List applications
-appNames = [app for app in otb.Registry.GetAvailableApplications()]
-for appName in appNames:
-	app = otb.Registry.CreateApplication(appName)
-	# Generate parameters
-	parameters = app.GetParametersKeys()
-	for param in parameters:
-		upParam = param.upper()
-		if app.HasValue(param):
-			operator.attrgetter(upParam)(app)
-
diff --git a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersInstantiateAllTest.py b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersInstantiateAllTest.py
new file mode 100644
index 0000000..b904a66
--- /dev/null
+++ b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersInstantiateAllTest.py
@@ -0,0 +1,13 @@
+import operator
+import inspect
+def test(otb, argv):
+	# List applications
+	appNames = [app for app in otb.Registry.GetAvailableApplications()]
+	for appName in appNames:
+		app = otb.Registry.CreateApplication(appName)
+		# Generate parameters
+		parameters = app.GetParametersKeys()
+		for param in parameters:
+			upParam = param.upper()
+			if app.HasValue(param):
+				operator.attrgetter(upParam)(app)
diff --git a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py
index 9e05ab4..18a155b 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py
@@ -6,125 +6,123 @@
 #
 #  Example on the use of otb "pythonization"
 #
-from sys import argv
-import otbApplication as otb
-
 def cm_assert(a,b):
 	print "debug print before assert check: '%s'== '%s'" %(a, b)
 	assert a == b
 
-app = otb.Registry.CreateApplication('OrthoRectification')
+def test(otb, argv):
+	app = otb.Registry.CreateApplication('OrthoRectification')
 
-#test GetParameterTypeAsString() method in python.
-print app.GetParameterTypeAsString(otb.ParameterType_InputImage)
-print app.GetParameterTypeAsString(otb.ParameterType_String)
-print app.GetParameterTypeAsString(otb.ParameterType_Empty)
+	# test GetParameterTypeAsString() method in python.
+	print( app.GetParameterTypeAsString(otb.ParameterType_InputImage) )
+	print( app.GetParameterTypeAsString(otb.ParameterType_String) )
+	print( app.GetParameterTypeAsString(otb.ParameterType_Empty) )
 
-# one test for each parameter type (string, float, int, ...)
+	# one test for each parameter type (string, float, int, ...)
 
-# # parameter group io.in
-# 1 - input image parameter set
-app.IO.IN = argv[1]
-cm_assert(app.GetParameterString('io.in'), argv[1])
+	# # parameter group io.in
+	# 1 - input image parameter set
+	app.IO.IN = argv[1]
+	cm_assert(app.GetParameterString('io.in'), argv[1])
 
-# 2 - input image parameter get
-cm_assert(app.IO.IN, argv[1])
+	# 2 - input image parameter get
+	cm_assert(app.IO.IN, argv[1])
 
-# # parameter group io.in
-# 3 - output image parameter set
-app.IO.OUT = argv[2]
-cm_assert(app.GetParameterString('io.out'), argv[2])
+	# # parameter group io.in
+	# 3 - output image parameter set
+	app.IO.OUT = argv[2]
+	cm_assert(app.GetParameterString('io.out'), argv[2])
 
-# 4 - output image parameter get
-cm_assert(app.IO.OUT, argv[2])
+	# 4 - output image parameter get
+	cm_assert(app.IO.OUT, argv[2])
 
-# 5 - choice with sub parameters set
-app.MAP = 'lambert2'
-cm_assert(app.GetParameterString('map'), 'lambert2')
+	# 5 - choice with sub parameters set
+	app.MAP = 'lambert2'
+	cm_assert(app.GetParameterString('map'), 'lambert2')
 
-# 5.1 - choice with sub parameters get
-app.SetParameterString('map', 'wgs')
-cm_assert('wgs', app.MAP)
+	# 5.1 - choice with sub parameters get
+	app.SetParameterString('map', 'wgs')
+	cm_assert('wgs', app.MAP)
 
-# 5.2 - choice with sub parameters set
-app.MAP = 'lambert93'
-cm_assert('lambert93', app.GetParameterString('map'))
+	# 5.2 - choice with sub parameters set
+	app.MAP = 'lambert93'
+	cm_assert('lambert93', app.GetParameterString('map'))
 
-# 5.3 - choice with sub parameters set
-app.SetParameterString('map', 'epsg')
-cm_assert(app.MAP, 'epsg')
+	# 5.3 - choice with sub parameters set
+	app.SetParameterString('map', 'epsg')
+	cm_assert(app.MAP, 'epsg')
 
-# 6 - int type 2nd level sub parameters of choice parameter set
-app.MAP.EPSG.CODE = 32768
-cm_assert(32768, app.GetParameterInt('map.epsg.code'))
+	# 6 - int type 2nd level sub parameters of choice parameter set
+	app.MAP.EPSG.CODE = 32768
+	cm_assert(32768, app.GetParameterInt('map.epsg.code'))
 
-# 7 - another choice with sub parameters set
-app.MAP = 'utm'
-cm_assert('utm', app.GetParameterString('map'))
+	# 7 - another choice with sub parameters set
+	app.MAP = 'utm'
+	cm_assert('utm', app.GetParameterString('map'))
 
-# 8 - int type sub parameters of choice parameter set
-app.MAP.UTM.ZONE = 47
-cm_assert(47,app.GetParameterInt('map.utm.zone'))
+	# 8 - int type sub parameters of choice parameter set
+	app.MAP.UTM.ZONE = 47
+	cm_assert(47,app.GetParameterInt('map.utm.zone'))
 
-# 9 - int type sub parameters of choice parameter get
-app.SetParameterInt('map.utm.zone', 31)
-cm_assert(app.MAP.UTM.ZONE, 31)
+	# 9 - int type sub parameters of choice parameter get
+	app.SetParameterInt('map.utm.zone', 31)
+	cm_assert(app.MAP.UTM.ZONE, 31)
 
-# 10 - bool type sub parameters of choice parameter get
-app.DisableParameter('map.utm.northhem')
-cm_assert(app.MAP.UTM.NORTHHEM, False)
+	# 10 - bool type sub parameters of choice parameter get
+	app.DisableParameter('map.utm.northhem')
+	cm_assert(app.MAP.UTM.NORTHHEM, False)
 
-# 11 - bool type sub parameters of choice parameter set
-app.MAP.UTM.NORTHHEM = True
-cm_assert(True, app.IsParameterEnabled('map.utm.northhem') )
+	# 11 - bool type sub parameters of choice parameter set
+	app.MAP.UTM.NORTHHEM = True
+	cm_assert(True, app.IsParameterEnabled('map.utm.northhem') )
 
-#12 - simple choice parameter set
-app.OUTPUTS.MODE = 'auto'
-cm_assert('auto', app.GetParameterString('outputs.mode'))
+	#12 - simple choice parameter set
+	app.OUTPUTS.MODE = 'auto'
+	cm_assert('auto', app.GetParameterString('outputs.mode'))
 
-#13 - simple choice parameter get
-app.SetParameterString('outputs.mode', 'orthofit')
-cm_assert(app.OUTPUTS.MODE, 'orthofit')
+	#13 - simple choice parameter get
+	app.SetParameterString('outputs.mode', 'orthofit')
+	cm_assert(app.OUTPUTS.MODE, 'orthofit')
 
-#14 - inputxml parameter set
-app.INXML = argv[3]
-cm_assert(app.GetParameterString('inxml'), argv[3])
+	#14 - inputxml parameter set
+	app.INXML = argv[3]
+	cm_assert(app.GetParameterString('inxml'), argv[3])
 
-#15 - outputxml parameter get
-app.SetParameterString('outxml', 'output.xml')
-cm_assert("output.xml", app.OUTXML)
+	#15 - outputxml parameter get
+	app.SetParameterString('outxml', 'output.xml')
+	cm_assert("output.xml", app.OUTXML)
 
-#16 - parameter float get
-app.SetParameterFloat('elev.default', 5.0)
-cm_assert(5.0, app.ELEV.DEFAULT)
+	#16 - parameter float get
+	app.SetParameterFloat('elev.default', 5.0)
+	cm_assert(5.0, app.ELEV.DEFAULT)
 
-#17 -parameter float set
-app.ELEV.DEFAULT = -2.5
-cm_assert(app.GetParameterFloat('elev.default'), -2.5)
+	#17 -parameter float set
+	app.ELEV.DEFAULT = -2.5
+	cm_assert(app.GetParameterFloat('elev.default'), -2.5)
 
-#18 - parameter ram get
-app.SetParameterString('opt.ram', '256')
-cm_assert(256, app.OPT.RAM)
+	#18 - parameter ram get
+	app.SetParameterString('opt.ram', '256')
+	cm_assert(256, app.OPT.RAM)
 
-#19 - parameter ram set
-app.OPT.RAM = '512'
-cm_assert(app.GetParameterInt('opt.ram'), 512)
+	#19 - parameter ram set
+	app.OPT.RAM = '512'
+	cm_assert(app.GetParameterInt('opt.ram'), 512)
 
-#20 - parameter bool set
-app.OUTPUTS.ISOTROPIC = True
-cm_assert(app.IsParameterEnabled('outputs.isotropic'), True)
+	#20 - parameter bool set
+	app.OUTPUTS.ISOTROPIC = True
+	cm_assert(app.IsParameterEnabled('outputs.isotropic'), True)
 
-#21 - parameter bool get
-app.DisableParameter('outputs.isotropic')
-cm_assert(False, app.OUTPUTS.ISOTROPIC)
+	#21 - parameter bool get
+	app.DisableParameter('outputs.isotropic')
+	cm_assert(False, app.OUTPUTS.ISOTROPIC)
 
-#Do not execute. we need LARGEINPUT. so we tried a small application
-#app.Execute()
+	#Do not execute. we need LARGEINPUT. so we tried a small application
+	#app.Execute()
 
-app = None
+	app = None
 
-app = otb.Registry.CreateApplication('Smoothing')
-app.IN = argv[1]
-app.TYPE='anidif'
-app.OUT = argv[2]
-app.ExecuteAndWriteOutput()
+	app = otb.Registry.CreateApplication('Smoothing')
+	app.IN = argv[1]
+	app.TYPE='anidif'
+	app.OUT = argv[2]
+	app.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonNumpyTest.py b/Modules/Wrappers/SWIG/test/python/PythonNumpyTest.py
index 7aee4e2..7cd8fed 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonNumpyTest.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonNumpyTest.py
@@ -6,59 +6,59 @@
 #  Example on testing numpy
 #
 
-import sys
+
 import os
 #from scipy import misc
 
 import numpy as np
-import otbApplication
 
-#from PIL import Image as PILImage
+def test(otbApplication, argv):
+	#from PIL import Image as PILImage
 
-inFile  = sys.argv[1]
-outFile = sys.argv[2]
-# pilimage = PILImage.open(inFile)
-# npimage = np.asarray(pilimage)
-# print npimage.dtype
+	inFile  = argv[1]
+	outFile = argv[2]
+	# pilimage = PILImage.open(inFile)
+	# npimage = np.asarray(pilimage)
+	# print npimage.dtype
 
-ExtractROI = otbApplication.Registry.CreateApplication("ExtractROI")
-ExtractROI.SetParameterString("in", inFile)
-ExtractROI.SetParameterInt("startx", 10)
-ExtractROI.SetParameterInt("starty", 10)
-ExtractROI.SetParameterInt("sizex", 250)
-ExtractROI.SetParameterInt("sizey", 250)
+	ExtractROI = otbApplication.Registry.CreateApplication("ExtractROI")
+	ExtractROI.SetParameterString("in", inFile)
+	ExtractROI.SetParameterInt("startx", 10)
+	ExtractROI.SetParameterInt("starty", 10)
+	ExtractROI.SetParameterInt("sizex", 250)
+	ExtractROI.SetParameterInt("sizey", 250)
 
-#Bug or Design ?.
-#Anyway below two is needed only for ExtractROI application
-ExtractROI.SetParameterUserValue("sizex", True)
-ExtractROI.SetParameterUserValue("sizey", True)
-ExtractROI.Execute()
+	#Bug or Design ?.
+	#Anyway below two is needed only for ExtractROI application
+	ExtractROI.SetParameterUserValue("sizex", True)
+	ExtractROI.SetParameterUserValue("sizey", True)
+	ExtractROI.Execute()
 
-ExtractROIOut = ExtractROI.GetVectorImageAsNumpyArray("out", 'float')
+	ExtractROIOut = ExtractROI.GetVectorImageAsNumpyArray("out", 'float')
 
-#write RGB image to file via python
-#misc.imsave('ExtractROIOut.jpg', ExtractROIOut)
+	#write RGB image to file via python
+	#misc.imsave('ExtractROIOut.jpg', ExtractROIOut)
 
-Rescale = otbApplication.Registry.CreateApplication("Rescale")
-#take numpy array from ExtractROI and feed into Rescale
-Rescale.SetVectorImageFromNumpyArray("in", ExtractROIOut)
-Rescale.SetParameterFloat("outmin", 50, True)
-Rescale.SetParameterFloat("outmax", 100, True)
-Rescale.Execute()
+	Rescale = otbApplication.Registry.CreateApplication("Rescale")
+	#take numpy array from ExtractROI and feed into Rescale
+	Rescale.SetVectorImageFromNumpyArray("in", ExtractROIOut)
+	Rescale.SetParameterFloat("outmin", 50, True)
+	Rescale.SetParameterFloat("outmax", 100, True)
+	Rescale.Execute()
 
-RescaleOut = Rescale.GetVectorImageAsNumpyArray("out", 'float')
-#misc.imsave('RescaleOut.jpg', RescaleOut)
+	RescaleOut = Rescale.GetVectorImageAsNumpyArray("out", 'float')
+	# misc.imsave('RescaleOut.jpg', RescaleOut)
 
-Convert = otbApplication.Registry.CreateApplication("Convert")
-#take numpy output from Rescale application and feed into Convert
-Convert.SetVectorImageFromNumpyArray("in", RescaleOut)
-Convert.SetParameterString("out", "ConvertOut.png")
-Convert.ExecuteAndWriteOutput()
-ConvertOut = Convert.GetVectorImageAsNumpyArray("out", 'float')
+	Convert = otbApplication.Registry.CreateApplication("Convert")
+	# take numpy output from Rescale application and feed into Convert
+	Convert.SetVectorImageFromNumpyArray("in", RescaleOut)
+	Convert.SetParameterString("out", "ConvertOut.png")
+	Convert.ExecuteAndWriteOutput()
+	ConvertOut = Convert.GetVectorImageAsNumpyArray("out", 'float')
 
-Smoothing = otbApplication.Registry.CreateApplication("Smoothing")
-#take numpy output from Convert application and feed into Smoothing
-Smoothing.SetVectorImageFromNumpyArray("in", ConvertOut)
-Smoothing.SetParameterString("type", 'anidif')
-Smoothing.SetParameterString("out", outFile)
-Smoothing.ExecuteAndWriteOutput()
+	Smoothing = otbApplication.Registry.CreateApplication("Smoothing")
+	# take numpy output from Convert application and feed into Smoothing
+	Smoothing.SetVectorImageFromNumpyArray("in", ConvertOut)
+	Smoothing.SetParameterString("type", 'anidif')
+	Smoothing.SetParameterString("out", outFile)
+	Smoothing.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py b/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py
index 60ff84c..32313a2 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py
@@ -1,24 +1,21 @@
 # -*- coding: utf-8 -*-
 
 #
-#  Example on the use of the outxml via BandMath 
+#  Example on the use of the outxml via BandMath
 #
-from sys import argv
-import otbApplication as otb
 
-imagelist = argv[1:-2]
-exp = "cos(im1b1)+im2b1*im3b1-im3b2+ndvi(im3b3, im3b4)"
-out = argv[-2]
-outxml = argv[-1]
-app = otb.Registry_CreateApplication('BandMath')
-app.SetParameterStringList("il", imagelist, True)
-app.SetParameterString("out", out, True)
-app.SetParameterString("exp", exp, True)
-app.SetParameterString("outxml", outxml, True)
-app.UpdateParameters()
+def test(otb, argv):
+	imagelist = argv[1:-2]
+	exp = "cos(im1b1)+im2b1*im3b1-im3b2+ndvi(im3b3, im3b4)"
+	out = argv[-2]
+	outxml = argv[-1]
+	app = otb.Registry.CreateApplication('BandMath')
+	app.SetParameterStringList("il", imagelist, True)
+	app.SetParameterString("out", out, True)
+	app.SetParameterString("exp", exp, True)
+	app.SetParameterString("outxml", outxml, True)
+	app.UpdateParameters()
 #for paramKey in app.GetParametersKeys():
   #app.GetParameterValue(paramKey)
   #print app.HasUserValue(paramKey)
-app.ExecuteAndWriteOutput()
-
-
+	app.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonRescaleTest.py b/Modules/Wrappers/SWIG/test/python/PythonRescaleTest.py
index a7de463..ce2945f 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonRescaleTest.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonRescaleTest.py
@@ -1,16 +1,12 @@
 # -*- coding: utf-8 -*-
 
 #
-#  Example on the use of the Rescale 
+#  Example on the use of the Rescale
 #
-from sys import argv
-import otbApplication as otb
-
-app = otb.Registry.CreateApplication("Rescale")
-
-app.SetParameterString("in", argv[1])
-app.SetParameterFloat("outmin", 1)
-app.SetParameterFloat("outmax", 100)
-app.SetParameterString("out", argv[2] + ".tif")
-
-app.ExecuteAndWriteOutput()
\ No newline at end of file
+def test(otb, argv):
+	app = otb.Registry.CreateApplication("Rescale")
+	app.SetParameterString("in", argv[1])
+	app.SetParameterFloat("outmin", 1)
+	app.SetParameterFloat("outmax", 100)
+	app.SetParameterString("out", argv[2] + ".tif")
+	app.ExecuteAndWriteOutput()
diff --git a/Modules/Wrappers/SWIG/test/python/PythonSmoothingTest.py b/Modules/Wrappers/SWIG/test/python/PythonSmoothingTest.py
index d13c246..b8567ce 100644
--- a/Modules/Wrappers/SWIG/test/python/PythonSmoothingTest.py
+++ b/Modules/Wrappers/SWIG/test/python/PythonSmoothingTest.py
@@ -1,22 +1,21 @@
 # -*- coding: utf-8 -*-
 
 #
-#  Example on the use of the Smoothing 
+#  Example on the use of the Smoothing
 #
-from sys import argv
-import otbApplication as otb
 
-print "Available applications : " + str(otb.Registry.GetAvailableApplications())
+def test(otb, argv):
+	print( "Available applications : " + str(otb.Registry.GetAvailableApplications()) )
 
-app = otb.Registry.CreateApplication("Smoothing")
-print app.GetParametersKeys()
+	app = otb.Registry.CreateApplication("Smoothing")
+	print( app.GetParametersKeys() )
 
-app.SetParameterString("in", argv[1])
+	app.SetParameterString("in", argv[1])
 
-for type in ['mean', 'gaussian', 'anidif']:
-  print 'Testing ' + type
-  app.SetParameterString("type", type)
-  app.SetParameterString("out", argv[2] + type + ".tif")
-  app.ExecuteAndWriteOutput()
-  
-print dir(app)
+	for type_ in ['mean', 'gaussian', 'anidif']:
+		print( 'Testing ' + type_ )
+		app.SetParameterString("type", type_)
+		app.SetParameterString("out", argv[2] + type_ + ".tif")
+		app.ExecuteAndWriteOutput()
+
+		print( dir(app) )
diff --git a/Modules/Wrappers/SWIG/test/python/PythonTestDriver.py b/Modules/Wrappers/SWIG/test/python/PythonTestDriver.py
new file mode 100644
index 0000000..1da10ba
--- /dev/null
+++ b/Modules/Wrappers/SWIG/test/python/PythonTestDriver.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+# https://mail.python.org/pipermail//cplusplus-sig/2011-September/016145.html
+
+import os
+import sys
+if os.name == 'posix':
+  orig_dlopen_flags = sys.getdlopenflags()
+  try:
+    import dl
+  except ImportError:
+    try:
+      import DLFCN as dl
+    except ImportError:
+      dl = None
+  if dl:
+    sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)
+  # now load the module !
+  import otbApplication as otb
+  sys.setdlopenflags(orig_dlopen_flags)
+  del dl
+  del orig_dlopen_flags
+else:
+  import otbApplication as otb
+
+t = __import__(sys.argv[1])
+argv = sys.argv[1:]
+t.test(otb, argv)
diff --git a/README.md b/README.md
index f2dc82e..3e44cd1 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,25 @@
 # ![OTB](https://git.orfeo-toolbox.org/otb.git/blob_plain/HEAD:/Utilities/Doxygen/logoVectoriel.png) Orfeo Toolbox
 ## Open Source processing of remote sensing images
 
-Orfeo ToolBox (OTB) is an open-source C++ library for remote sensing images
-processing, distributed under the CeCILL-v2 license.  It has been initiated and
-funded by CNES (French space agency) in the frame of a program named ORFEO to
-prepare, accompany and promote the use and the exploitation of the images
-derived from Pléiades satellites (PHR). Orfeo ToolBox aims at enabling large
-images state-of-the-art processing even on limited resources laptops, and is
-shipped with a set of extensible ready-to-use tools for classical remote sensing
-tasks, as well as a fully integrated, end-users oriented software called
-Monteverdi.
+Orfeo ToolBox (OTB) is an open-source project for state-of-the-art remote
+sensing. Built on the shoulders of the open-source geospatial community, it can
+process high resolution optical, multispectral and radar images at the terabyte
+scale. A wide variety of applications are available: from ortho-rectification
+or pansharpening, all the way to classification, SAR processing, and much more!
+
+All of OTB's algorithms are accessible from Monteverdi, QGIS, Python, the
+command line or C++. Monteverdi is an easy to use visualization tool with an
+emphasis on hardware accelerated rendering for high resolution imagery (optical
+and SAR).  With it, end-users can visualize huge raw imagery products and
+access all of the applications in the toolbox. From resource limited laptops
+to high performance MPI clusters, OTB is available on Windows, Linux and Mac.
+It is community driven, extensible and heavily documented.  Orfeo ToolBox is
+not a black box!
 
 [![Travis Build Status](https://travis-ci.org/orfeotoolbox/OTB.png?branch=develop)](https://travis-ci.org/orfeotoolbox/OTB)
 [![Coverity Scan Build Status](https://scan.coverity.com/projects/2405/badge.svg)](https://scan.coverity.com/projects/orfeo-toolbox) 
 
-### Ressources
+### Resources
 * [OTB's website](https://www.orfeo-toolbox.org/)
 * [Documentation](https://www.orfeo-toolbox.org/documentation/)
 * [Downloads](https://www.orfeo-toolbox.org/download/)
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 1924ef3..9f49461 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,5 +1,60 @@
+OTB-v.5.8.0 - Changes since version 5.6.1 (November 8th, 2016)
+--------------------------------------------------------------
+
+* Request for Changes (http://wiki.orfeo-toolbox.org/index.php/Requests_for_Changes):
+  * Request for Changes-35: FineRegistration, performances increased
+  * Request for Changes-51: Move Monteverdi into OTB
+  * Request for Changes-52: Faster BandMathX
+  * Request for changes-53: Connect applications in memory
+  * Request for Changes-54: Get OTB ready for gdal derived subdatasets
+  * Request for Changes-55: Monteverdi: Mouse-wheel zoom without CTRL
+  * Request for Changes-56: Spot7 metadata support
+  * Request for Changes-57: Migrate Cookbook to RST
+  * Request for Changes-58: Sampling on multiple images
+  * Request for Changes-59: Build support for msvc 2015 with OTB xdk
+  * Request for Changes-60: Shorter Release Process
+  * Request for Changes-61: Use codespell to fix common misspellings in source code
+  * Request for Changes-62: Enhance text comparison in dashboard
+  * Request for Changes-63: Refactor threading mechanism in sampling filters
+  * Request for Changes-64: Missing RAM for persistent filters in application
+  * Request for Changes-65: Add Shark Random forests implementation
+  * Request for Changes-67: ClassificationMapRegularization option for isolated pixels only
+  * Request for Changes-68: New sampling strategies in classification framework
+
+* Bugfixes :
+
+  * Monteverdi
+    * 0001298: Monteverdi crash with this image
+    * 0001305: SuperBuild falling at BOOST build step
+    * 0001283: GDAL overviews dialog pops under OTB-applications dock
+    * 0001284: GDAL overviews default min-size = 4096 px
+    * 0001282: Status-bar is not always disable at startup
+    * 0001278: Add force OpenGL 1.x compatibility option
+    * 0001267: Monteverdi: unclear "gdal overview" minimum size parameter
+    * 0001274: SuperBuild GLUT compilation problem
+    * 0001277: Missing icon(s) in color-dynamics widget
+    * 0001275: Monteverdi: Histogram view problem with binary image
+    * 0001300: monteverdi $input_filename crash with relative path
+    * 0001303: Memory issue in Monteverdi with images with subdatasets (HDF4)
+    * 0001299: Monteverdi shortcuts list needs some updates
+    * 0001291: Word "Échiquier" is not displayed properly in layer stack (effect column)
+
+  * OTB-Packaging
+    * 0001290: Unable to run OTB applications from Mapla.app on Mac OS X
+    * 0001297: No translation files in Windows standalone package (branch release-5.8)
+
+  * Orfeo Toolbox (OTB)
+    * 0001308: Typo in otbenv.profile and otbenv.cmd
+    * 0001286: Sentinel-1 sensor metadata are not retrieved properly if application is run inside the SAFE directory
+    * 0001287: Using S1 images in monteverdi is slow
+    * 0001268: Patch for spelling error in 5.6.1
+    * 0001306: SuperBuild falling at TIFF build step (GLUT_Xmu_LIBRARY NOTFOUND)
+
+  * OTB-applications
+    * 0001301: Mapla application does not provide translation files
+
 OTB-v.5.6.1 - Changes since version 5.6.0 (August 26th, 2016)
-------------------------------------------------------------
+-------------------------------------------------------------
 
 * Bugfixes :
   * 0001262: OTB 5.7 vector sampler bug
@@ -104,7 +159,7 @@ OTB-v.5.4.0 - Changes since version 5.2.1 (2016/05/04)
     * 0001153: Superimpose app in PHR mode reports wrong origin/spacing/keywordlist
     * 0001154: Exception raised when opening LUM or LUM+HDR
     * 0001152: maximum number of class in KMean application limited to 255
-    * 0001140: Lost pixel position informations in layer stack
+    * 0001140: Lost pixel position information in layer stack
 
   * OTB-Packaging
     * 0001141: muparser 2.2.4 is missing in superbuild archive 5.2.1
@@ -349,7 +404,7 @@ OTB-v.4.4.0 - Changes since version 4.2.1 (2015/02/13)
     * Enhance p to xs registration formula
     * Reduce Curl dependencies
     * Remove 6S dependency for VarSol computation
-    * Clean and udpate the Mapnik adapters code into OTB
+    * Clean and update the Mapnik adapters code into OTB
     * Add an option to limit the number of samples by class into otbListSampleGenerator
     * Fix BCO interpolation about coefficients normalization
     * Fix missing boost namespace
@@ -381,13 +436,13 @@ OTB-v.4.4.0 - Changes since version 4.2.1 (2015/02/13)
         * OGRLayerClassifier
   * Updated applications:
     * Smoothing: add conductance parameter for anidifusion which was added recently in ITK filter
-    * Smoothing: keep the time step independant from the image spacing
+    * Smoothing: keep the time step independent from the image spacing
     * HomologousPoint: proper computation of the opposite region
     * Rasterization: fix computation of output image extent
     * GridBasedImageResampling: fix the wrong channel number otbGridBasedImageResampling.
     * ColorMapping: clamp before cast to uchar
     * OpticalCalibration: the toc computation is no more marked as experimental
-    * OpticalCalibration: add an internal test to check if RSR file is correclty set
+    * OpticalCalibration: add an internal test to check if RSR file is correctly set
     * BundleToPerfectSensor and SuperImpose: Allowing to force default mode with Pleiades images
     * SuperImpose: fix a bug in PHR mode detection logic
     * TrainImagesClassifier: add option to limit the min number of samples to the smallest class
@@ -424,10 +479,10 @@ OTB-v.4.2.0 - Changes since version 4.0 (2014/09/04)
       GDAL and OSSIM. OTB uses pixel centered convention, whereas GDAL and
       OSSIM use corner pixel convention. More details on JIRA #647 and Mantis
       #942
-    * Major performance improvment of Haralick Texture computation (6 to 10 times
+    * Major performance improvement of Haralick Texture computation (6 to 10 times
       faster)
     * Add new texture feature (dissimilarity) in ScalarImageToAdvancedTexturesFilter
-    * Improvments of Simulation code in order to be able to use the solar
+    * Improvements of Simulation code in order to be able to use the solar
       irradiance information when working with spectral responses for simulations.
     * Support Jpeg2000 images through GDAL drivers (can use OpenJpeg, Kakadu, ECW)
     * Reading/Writing RPC coefficients in GeoTIFF tags
@@ -700,13 +755,13 @@ OTB-v.3.18.1 - Changes since version 3.18.0 (2013/07/22)
       * Update Stereo application documentation example with new parameters
       * Add a log message about color mapping method used by application
     * Core Framework
-      * Intialize properly QtWidgetChoiceParameter
-    * Increase minimun cmake version to 2.8.3 wwhen build applications
+      * Initialize properly QtWidgetChoiceParameter
+    * Increase minimum cmake version to 2.8.3 wwhen build applications
 
 OTB-v.3.18 - Changes since version 3.16 (2013/07/05)
 --------------------------------------------------------
 
-Among the classical improvements and bug fixes to exisiting functionnalities, this release provides
+Among the classical improvements and bug fixes to existing functionnalities, this release provides
 the following main functionnalities :
  * Huge improvements in Stereo framework, to compute DEM from stereo pairs :
    check the StereoFramework application !
@@ -737,7 +792,7 @@ The full list of improvements comes here :
       * BijectionCoherencyFilter : from 2 disparity maps, compute coherency left-right and right-left, and output a mask of coherent disparities
       * Multi3DToDEMFilter : fuse several 3D images to produce an elevation map
       * DisparityTranslateFilter : filter to translate epipolar disparities into sensor disparities
-    * PixelWiseBlockMatchingImageFilter : fix initialisation of metric and disparities
+    * PixelWiseBlockMatchingImageFilter : fix initialization of metric and disparities
     * PixelWiseBlockMatchingImageFilter : supports a shift on the subsampled grid
     * SubPixelDisparityImageFilter : supports a subsampled grid (with shift)
     * PixelWiseBlockMatchingImageFilter & SubPixelDisparityImageFilter : subsampled disparities are now consistent with the dispmap index spaces
@@ -846,7 +901,7 @@ The full list of improvements comes here :
     * 0000668: Precision loss when loading/saving/reloading
     * 0000666: upper quantile is not set to 0.0 on integer image type, when using min/max button
     * 0000656: Import Windows does not close
-    * 0000659: At first startup, 'mvd2' dir is not created but Monteverdi2 shoudl create it
+    * 0000659: At first startup, 'mvd2' dir is not created but Monteverdi2 should create it
     * 0000660: Wrong display settings saved
     * 0000657: Radiometry values hide WGS84 coordinates in status bar
     * 0000654: When minimzing the window, all widgets are closed
@@ -907,7 +962,7 @@ OTB-v.3.16 - Changes since version 3.14.1 (2013/02/04)
   * Learning
     * Improved ListSample generation
       * Added support for interior rings
-      * Fixed support for class mininum size
+      * Fixed support for class minimum size
     * Added a filter for classification map regularization by majority voting
 
   * Segmentation
@@ -939,7 +994,7 @@ OTB-v.3.16 - Changes since version 3.14.1 (2013/02/04)
       * Added new tile fusion application (TileFusion)
       * Added new end-to-end stereo pair to Digital Surface Model application (StereoFramework)
 
-    * Miscellanous
+    * Miscellaneous
       * Added an optional clamp in OpticalCalibration application output
       * Added segmentation algorithm based on multiscale morphological structures classification in Segmentation application
       * Added an optional output to the ReadImageInfo application to write the keyword list to a geom file
@@ -1076,7 +1131,7 @@ OTB-v.3.14.0 - Changes since version 3.12.0 (2012/07/09)
     * Add BlockMatchingImageFilter class for fast 2D block-matching
     * Add NCCBlockMatching functor
     * Add LPBlockMatching functor
-    * Adding an optionnal geoid file, and the possibility to use height
+    * Adding an optional geoid file, and the possibility to use height
       above ellispoid in DEMToImageGenerator
     * Add SubPixelDisparityImageFilter class to interpolate disparities
     * Add DisparityMapMedianFilter class
@@ -1131,7 +1186,7 @@ OTB-v.3.14.0 - Changes since version 3.12.0 (2012/07/09)
       by libkml)
     * GenericRSTransform can now be optimized using a set of tie-points,
       calling ossim internal sensor model refining implementation
-    * PackedWidgetManager & SplittedWidgetManager : add method to set the
+    * PackedWidgetManager & SplitWidgetManager : add method to set the
       label of each group
     * HistogramActionHandler : limit moves of asymptots with min/max of
       histogram
@@ -1165,7 +1220,7 @@ OTB-v.3.14.0 - Changes since version 3.12.0 (2012/07/09)
     * Use InputFilename and OutputFilename instead of Filename
     * New option in SVMClassifier application: sample.edg (non mandatory)
       to manage special cases with small samples
-    * In KMeansClassification, Changing the random intialisation method
+    * In KMeansClassification, Changing the random initialization method
       since it can generate centroids that are too far from the image
       distribution and will never move
     * Add AddRANDParameter option in order to set mersenne twister seed
@@ -1794,7 +1849,7 @@ OTB-v.3.10.0 - Changes since version 3.8.0 (2011/06/30)
     * 0000341: weird french warning in ms dos command window with
       monteverdi 1.7 exe
     * 0000313: Unable to perform orthofusion of WV2 PAN+XS (4 bands)
-    * 0000239: Trouble in pixel descrition in Monteverdi viewer
+    * 0000239: Trouble in pixel description in Monteverdi viewer
     * 0000336: Viewer Histogram settings not applied after channel
       order changes
     * 0000304: Advanced save dataset module with scaling on results in
@@ -1847,7 +1902,7 @@ OTB-v.3.8.0 - Changes since version 3.6.0 (2010/12/16)
     a DEM tiles directory, with optional hillshading
   * New ColorMapping module: apply a colormap to a mono band image
   * Viewer module: add multi input support, with slideshow or transparency
-    mode, add more rendering functions, add splitted/packed layout option
+    mode, add more rendering functions, add split/packed layout option
   * Vectorization module: new semi-automatic mode based on segmentation
     results proposals
 
@@ -1903,7 +1958,7 @@ OTB-v.3.8.0 - Changes since version 3.6.0 (2010/12/16)
 
 * System
   * Internal liblas updated to 1.6.0b2 + OTB patches (root CMakeList.txt)
-  * Internal libsvm updated to 3.0 + OTB patches (additionnal kernels)
+  * Internal libsvm updated to 3.0 + OTB patches (additional kernels)
   * Internal ITK: removed compilation of medical image formats library
     and associated ImageIO
   * Internal ITK: removed dependency on libtiff, libjpeg, libpng and zlib,
@@ -2212,7 +2267,7 @@ OTB-v.2.4.0 - Changes since version 2.2.0 (2008/07/24)
     - Added an orthofusion application (otbOrthoFusionAppli)
 
 *Markov:
-      Added full Markov framework for segmentation, restauration
+      Added full Markov framework for segmentation, restoration
       and filtering
       Added related classes:
     - otb::MarkovRandomFieldFilter
@@ -2232,7 +2287,7 @@ OTB-v.2.4.0 - Changes since version 2.2.0 (2008/07/24)
     - MarkovClassification1Example
     - MarkovClassification2Example
     - MarkovRegularizationExample
-    - MarkovRestaurationExample
+    - MarkovRestorationExample
 
 *Projections
       Added Lambert 93 cartographic projection with
@@ -2578,7 +2633,7 @@ OTB-v.1.6.0 - Changes since version 1.4.0 (2007/10/25)
 
     - Added the otb::BayesianFusionImageFilter, a pan-sharpening
       filter which
-      algoritm has been kindly contributed by Julien Radoux.
+      algorithm has been kindly contributed by Julien Radoux.
 
 
 *Documentation:
diff --git a/Utilities/Data/CMakeLists.txt b/Utilities/Data/CMakeLists.txt
new file mode 100644
index 0000000..d406057
--- /dev/null
+++ b/Utilities/Data/CMakeLists.txt
@@ -0,0 +1,43 @@
+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/LICENSE.TXT b/Utilities/Data/Icons/LICENSE.TXT
new file mode 100644
index 0000000..5f1ea39
--- /dev/null
+++ b/Utilities/Data/Icons/LICENSE.TXT
@@ -0,0 +1,16 @@
+LICENSE
+
+Original GIS icons theme was created by Robert Szczepanek [1] and is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License [2].
+Fill free to use it for GIS software or for any other purposes. I only ask you to let me know about that and to include licence.txt file in your work.
+
+[1] http://robert.szczepanek.pl/
+[2] http://creativecommons.org/licenses/by-sa/3.0/
+
+TITLE:			gis-0.1
+DESCRIPTION:	GIS icon theme
+AUTHOR:			Robert Szczepanek	
+CONTACT:		robert at szczepanek pl
+SITE:			http://robert.szczepanek.pl/
+		
+Cracow 2008, 
+Poland
\ No newline at end of file
diff --git a/Utilities/Data/Icons/NOTES b/Utilities/Data/Icons/NOTES
new file mode 100644
index 0000000..b1acb7d
--- /dev/null
+++ b/Utilities/Data/Icons/NOTES
@@ -0,0 +1,13 @@
+Some useful command :
+
+Pad image to fit a squared size :
+> convert -gravity center -extent 128x128  -background None input output
+
+Resize an image
+> convert -resize 48x48 input output
+
+To generate a MS-Windows .ico , see :
+  * http://freecode.com/projects/png2ico
+  * http://www.winterdrache.de/freeware/png2ico/
+  
+  
diff --git a/Utilities/Data/Icons/action-zoomfullextent_24x24.png b/Utilities/Data/Icons/action-zoomfullextent_24x24.png
new file mode 100644
index 0000000..e53755d
Binary files /dev/null and b/Utilities/Data/Icons/action-zoomfullextent_24x24.png differ
diff --git a/Utilities/Data/Icons/action-zoomin_24x24.png b/Utilities/Data/Icons/action-zoomin_24x24.png
new file mode 100644
index 0000000..76f4631
Binary files /dev/null and b/Utilities/Data/Icons/action-zoomin_24x24.png differ
diff --git a/Utilities/Data/Icons/action-zoomout_24x24.png b/Utilities/Data/Icons/action-zoomout_24x24.png
new file mode 100644
index 0000000..a1a1cd1
Binary files /dev/null and b/Utilities/Data/Icons/action-zoomout_24x24.png differ
diff --git a/Utilities/Data/Icons/action-zoomtolayer_24x24.png b/Utilities/Data/Icons/action-zoomtolayer_24x24.png
new file mode 100644
index 0000000..b05eba5
Binary files /dev/null and b/Utilities/Data/Icons/action-zoomtolayer_24x24.png differ
diff --git a/Utilities/Data/Icons/alg.png b/Utilities/Data/Icons/alg.png
new file mode 100644
index 0000000..d90ab66
Binary files /dev/null and b/Utilities/Data/Icons/alg.png differ
diff --git a/Utilities/Data/Icons/check_24x24.png b/Utilities/Data/Icons/check_24x24.png
new file mode 100644
index 0000000..20b3817
Binary files /dev/null and b/Utilities/Data/Icons/check_24x24.png differ
diff --git a/Utilities/Data/Icons/document-open_32x32.png b/Utilities/Data/Icons/document-open_32x32.png
new file mode 100644
index 0000000..f35f258
Binary files /dev/null and b/Utilities/Data/Icons/document-open_32x32.png differ
diff --git a/Utilities/Data/Icons/execute.png b/Utilities/Data/Icons/execute.png
new file mode 100644
index 0000000..dcad911
Binary files /dev/null and b/Utilities/Data/Icons/execute.png differ
diff --git a/Utilities/Data/Icons/forbidden-128x128.png b/Utilities/Data/Icons/forbidden-128x128.png
new file mode 100644
index 0000000..158f78f
Binary files /dev/null and b/Utilities/Data/Icons/forbidden-128x128.png differ
diff --git a/Utilities/Data/Icons/image-export_24x24.png b/Utilities/Data/Icons/image-export_24x24.png
new file mode 100644
index 0000000..d532900
Binary files /dev/null and b/Utilities/Data/Icons/image-export_24x24.png differ
diff --git a/Utilities/Data/Icons/layer-bottom_24x24.png b/Utilities/Data/Icons/layer-bottom_24x24.png
new file mode 100644
index 0000000..a34791e
Binary files /dev/null and b/Utilities/Data/Icons/layer-bottom_24x24.png differ
diff --git a/Utilities/Data/Icons/layer-delete_24x24.png b/Utilities/Data/Icons/layer-delete_24x24.png
new file mode 100644
index 0000000..bf57b11
Binary files /dev/null and b/Utilities/Data/Icons/layer-delete_24x24.png differ
diff --git a/Utilities/Data/Icons/layer-down_24x24.png b/Utilities/Data/Icons/layer-down_24x24.png
new file mode 100644
index 0000000..ef8c4c9
Binary files /dev/null and b/Utilities/Data/Icons/layer-down_24x24.png differ
diff --git a/Utilities/Data/Icons/layer-top_24x24.png b/Utilities/Data/Icons/layer-top_24x24.png
new file mode 100644
index 0000000..339191b
Binary files /dev/null and b/Utilities/Data/Icons/layer-top_24x24.png differ
diff --git a/Utilities/Data/Icons/layer-up_24x24.png b/Utilities/Data/Icons/layer-up_24x24.png
new file mode 100644
index 0000000..fcce521
Binary files /dev/null and b/Utilities/Data/Icons/layer-up_24x24.png differ
diff --git a/Utilities/Data/Icons/layers-remove_24x24.png b/Utilities/Data/Icons/layers-remove_24x24.png
new file mode 100644
index 0000000..8e27130
Binary files /dev/null and b/Utilities/Data/Icons/layers-remove_24x24.png differ
diff --git a/Utilities/Data/Icons/locked.png b/Utilities/Data/Icons/locked.png
new file mode 100644
index 0000000..8325fc9
Binary files /dev/null and b/Utilities/Data/Icons/locked.png differ
diff --git a/Utilities/Data/Icons/monteverdi-128x128.png b/Utilities/Data/Icons/monteverdi-128x128.png
new file mode 100644
index 0000000..770c0e1
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi-128x128.png differ
diff --git a/Utilities/Data/Icons/monteverdi-16x16.png b/Utilities/Data/Icons/monteverdi-16x16.png
new file mode 100644
index 0000000..9c96a7b
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi-16x16.png differ
diff --git a/Utilities/Data/Icons/monteverdi-32x32.png b/Utilities/Data/Icons/monteverdi-32x32.png
new file mode 100644
index 0000000..ce7d043
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi-32x32.png differ
diff --git a/Utilities/Data/Icons/monteverdi-32x32.xpm b/Utilities/Data/Icons/monteverdi-32x32.xpm
new file mode 100644
index 0000000..49bedf1
--- /dev/null
+++ b/Utilities/Data/Icons/monteverdi-32x32.xpm
@@ -0,0 +1,491 @@
+/* XPM */
+static const char * monteverdi2_xpm[] = {
+"32 32 456 2",
+"  	c None",
+". 	c #212121",
+"+ 	c #3A1314",
+"@ 	c #340C0D",
+"# 	c #101414",
+"$ 	c #121111",
+"% 	c #101010",
+"& 	c #1E1D1D",
+"* 	c #720608",
+"= 	c #650103",
+"- 	c #001312",
+"; 	c #151010",
+"> 	c #6A6968",
+", 	c #878584",
+"' 	c #171414",
+") 	c #1B1516",
+"! 	c #7B080B",
+"~ 	c #67090A",
+"{ 	c #011817",
+"] 	c #000000",
+"^ 	c #9B9A9A",
+"/ 	c #DEDCDC",
+"( 	c #474544",
+"_ 	c #535151",
+": 	c #6D6C6C",
+"< 	c #727373",
+"[ 	c #747374",
+"} 	c #737272",
+"| 	c #6C6A6A",
+"1 	c #444B4A",
+"2 	c #110708",
+"3 	c #650001",
+"4 	c #520F10",
+"5 	c #1A1817",
+"6 	c #4C4B4B",
+"7 	c #818080",
+"8 	c #DFDFDE",
+"9 	c #FFFFFF",
+"0 	c #E0E8E8",
+"a 	c #251314",
+"b 	c #4B0000",
+"c 	c #3A0F10",
+"d 	c #070505",
+"e 	c #4E4D4D",
+"f 	c #A4A2A2",
+"g 	c #C9C7C6",
+"h 	c #C1BFBE",
+"i 	c #E4E4E4",
+"j 	c #E8E7E7",
+"k 	c #A8A6A6",
+"l 	c #B2B0AE",
+"m 	c #E7E5E4",
+"n 	c #D4DDDD",
+"o 	c #270F10",
+"p 	c #440000",
+"q 	c #1C0E0F",
+"r 	c #1E1B1B",
+"s 	c #80807F",
+"t 	c #BAB7B5",
+"u 	c #85817E",
+"v 	c #413F40",
+"w 	c #0F0F12",
+"x 	c #A19F9F",
+"y 	c #CCCBCB",
+"z 	c #171518",
+"A 	c #14151C",
+"B 	c #383635",
+"C 	c #6B6864",
+"D 	c #CECCCA",
+"E 	c #C3C7C6",
+"F 	c #180909",
+"G 	c #1B0000",
+"H 	c #0E0F0F",
+"I 	c #232121",
+"J 	c #92908F",
+"K 	c #9E9B97",
+"L 	c #312F30",
+"M 	c #0F1B30",
+"N 	c #274168",
+"O 	c #132034",
+"P 	c #9A9794",
+"Q 	c #E2E0DD",
+"R 	c #262528",
+"S 	c #253F64",
+"T 	c #274166",
+"U 	c #0E1728",
+"V 	c #232325",
+"W 	c #908E8E",
+"X 	c #F3F2F2",
+"Y 	c #8A8989",
+"Z 	c #020000",
+"` 	c #2E0A0C",
+" .	c #4C0D0E",
+"..	c #551011",
+"+.	c #4C1011",
+"@.	c #3F0C0D",
+"#.	c #2B0C0D",
+"$.	c #110D0D",
+"%.	c #0A1B1B",
+"&.	c #1A1717",
+"*.	c #7D7B7A",
+"=.	c #87827F",
+"-.	c #13161E",
+";.	c #253E62",
+">.	c #486DA0",
+",.	c #5178AE",
+"'.	c #1F3149",
+").	c #94918D",
+"!.	c #FFFFFD",
+"~.	c #2D2B2A",
+"{.	c #2B466E",
+"].	c #5680BB",
+"^.	c #4C70A4",
+"/.	c #1B2A42",
+"(.	c #040000",
+"_.	c #1E1915",
+":.	c #0D0C0C",
+"<.	c #000302",
+"[.	c #0C0202",
+"}.	c #360000",
+"|.	c #730000",
+"1.	c #AC0107",
+"2.	c #C1070B",
+"3.	c #B4070B",
+"4.	c #AA0609",
+"5.	c #93070A",
+"6.	c #49090A",
+"7.	c #111413",
+"8.	c #4D4B4B",
+"9.	c #837F7D",
+"0.	c #141923",
+"a.	c #304E78",
+"b.	c #4B72A8",
+"c.	c #466DA0",
+"d.	c #486C9E",
+"e.	c #1B2B42",
+"f.	c #8E8C88",
+"g.	c #514F4D",
+"h.	c #16243A",
+"i.	c #426392",
+"j.	c #2E415E",
+"k.	c #151821",
+"l.	c #0B101A",
+"m.	c #000510",
+"n.	c #0C130A",
+"o.	c #568F54",
+"p.	c #558F52",
+"q.	c #3A5834",
+"r.	c #1D2115",
+"s.	c #370004",
+"t.	c #A2050A",
+"u.	c #E10C0F",
+"v.	c #DA0A0F",
+"w.	c #DB0A0E",
+"x.	c #C4070B",
+"y.	c #510608",
+"z.	c #171C1C",
+"A.	c #373536",
+"B.	c #575553",
+"C.	c #2F2F33",
+"D.	c #2A4469",
+"E.	c #4B73A9",
+"F.	c #436899",
+"G.	c #436798",
+"H.	c #496C9E",
+"I.	c #1C2A42",
+"J.	c #8A8784",
+"K.	c #BBB9B8",
+"L.	c #1D1D21",
+"M.	c #101828",
+"N.	c #19212E",
+"O.	c #2D405C",
+"P.	c #466999",
+"Q.	c #476B9E",
+"R.	c #111027",
+"S.	c #131C0B",
+"T.	c #72CE71",
+"U.	c #78DC78",
+"V.	c #70D473",
+"W.	c #5EB967",
+"X.	c #255E37",
+"Y.	c #140807",
+"Z.	c #910107",
+"`.	c #D70A0E",
+" +	c #CC0A0E",
+".+	c #DA0A0E",
+"++	c #B0080C",
+"@+	c #230B0B",
+"#+	c #302D2D",
+"$+	c #27211C",
+"%+	c #19263A",
+"&+	c #496FA3",
+"*+	c #44699A",
+"=+	c #496D9F",
+"-+	c #888581",
+";+	c #D9D8D8",
+">+	c #130E0A",
+",+	c #33496C",
+"'+	c #4E78B1",
+")+	c #4C76AE",
+"!+	c #406190",
+"~+	c #0F0F26",
+"{+	c #141C0D",
+"]+	c #6EC56C",
+"^+	c #74D473",
+"/+	c #70CD6F",
+"(+	c #75D574",
+"_+	c #74D676",
+":+	c #2F7040",
+"<+	c #200002",
+"[+	c #A90309",
+"}+	c #D10A0E",
+"|+	c #D00A0E",
+"1+	c #420405",
+"2+	c #1D1A1A",
+"3+	c #1A212F",
+"4+	c #3B5781",
+"5+	c #466DA1",
+"6+	c #446899",
+"7+	c #496DA0",
+"8+	c #1B2941",
+"9+	c #928E8A",
+"0+	c #5C5A5A",
+"a+	c #7E7C7B",
+"b+	c #676565",
+"c+	c #0B0F17",
+"d+	c #0E1D32",
+"e+	c #142339",
+"f+	c #0C111C",
+"g+	c #0D180D",
+"h+	c #68B566",
+"i+	c #73D272",
+"j+	c #6EC86D",
+"k+	c #6DC86C",
+"l+	c #6CCB70",
+"m+	c #204328",
+"n+	c #5B0002",
+"o+	c #D5080D",
+"p+	c #CF0A0E",
+"q+	c #600609",
+"r+	c #272A33",
+"s+	c #40618E",
+"t+	c #476CA0",
+"u+	c #4A6FA1",
+"v+	c #17253D",
+"w+	c #908B87",
+"x+	c #999897",
+"y+	c #716F6F",
+"z+	c #A6A4A1",
+"A+	c #6C6762",
+"B+	c #6E6864",
+"C+	c #A19E9B",
+"D+	c #2F2B2F",
+"E+	c #4F8B4F",
+"F+	c #77D875",
+"G+	c #6EC96D",
+"H+	c #6DC76C",
+"I+	c #6FCB6E",
+"J+	c #76D876",
+"K+	c #3E814A",
+"L+	c #4A0002",
+"M+	c #D5050B",
+"N+	c #CD0A0E",
+"O+	c #570507",
+"P+	c #2F3643",
+"Q+	c #456CA0",
+"R+	c #446A9D",
+"S+	c #426696",
+"T+	c #4B72A6",
+"U+	c #203350",
+"V+	c #3B3430",
+"W+	c #8A8787",
+"X+	c #E4E3E3",
+"Y+	c #FEFFFF",
+"Z+	c #473E3F",
+"`+	c #0B0000",
+" @	c #224227",
+".@	c #71D073",
+"+@	c #77DA76",
+"@@	c #72D171",
+"#@	c #78DC77",
+"$@	c #72D675",
+"%@	c #2B5C36",
+"&@	c #580002",
+"*@	c #D5060C",
+"=@	c #CE0A0E",
+"-@	c #340405",
+";@	c #2E333E",
+">@	c #44699B",
+",@	c #456A9D",
+"'@	c #436696",
+")@	c #476EA3",
+"!@	c #365177",
+"~@	c #000003",
+"{@	c #A9A6A5",
+"]@	c #F7F7F7",
+"^@	c #FDFDFD",
+"/@	c #F0FAFA",
+"(@	c #402F2F",
+"_@	c #740000",
+":@	c #2D0205",
+"<@	c #286037",
+"[@	c #64BC68",
+"}@	c #6BC46B",
+"|@	c #65BF69",
+"1@	c #347E47",
+"2@	c #1B0B09",
+"3@	c #970107",
+"4@	c #D3090E",
+"5@	c #D2090D",
+"6@	c #A5090C",
+"7@	c #241112",
+"8@	c #262932",
+"9@	c #436492",
+"0@	c #476A9C",
+"a@	c #111E33",
+"b@	c #64605C",
+"c@	c #FBFBFB",
+"d@	c #FCFCFC",
+"e@	c #FEFEFE",
+"f@	c #DCE7E7",
+"g@	c #312727",
+"h@	c #AB0000",
+"i@	c #A9040A",
+"j@	c #280002",
+"k@	c #202B1C",
+"l@	c #314B2E",
+"m@	c #212A1C",
+"n@	c #200003",
+"o@	c #7E0006",
+"p@	c #D30A0E",
+"q@	c #D1090E",
+"r@	c #5A0508",
+"s@	c #182020",
+"t@	c #27262B",
+"u@	c #334A6C",
+"v@	c #456B9E",
+"w@	c #436797",
+"x@	c #3B5A86",
+"y@	c #111620",
+"z@	c #76726E",
+"A@	c #FEFDFD",
+"B@	c #D4DFDE",
+"C@	c #342323",
+"D@	c #AA0000",
+"E@	c #E30A0F",
+"F@	c #B4050A",
+"G@	c #7B0004",
+"H@	c #700003",
+"I@	c #7D0004",
+"J@	c #AF0309",
+"K@	c #D50A0E",
+"L@	c #9C070B",
+"M@	c #210C0D",
+"N@	c #252F41",
+"O@	c #456A9C",
+"P@	c #486FA4",
+"Q@	c #34517A",
+"R@	c #101520",
+"S@	c #514D49",
+"T@	c #B8B4B1",
+"U@	c #EEECEB",
+"V@	c #FFFEFD",
+"W@	c #FCFBF9",
+"X@	c #9AA3A1",
+"Y@	c #271212",
+"Z@	c #B30000",
+"`@	c #D80A0F",
+" #	c #D5090D",
+".#	c #D4090D",
+"+#	c #CA0A0E",
+"@#	c #BD080C",
+"##	c #3E090A",
+"$#	c #0A1E1E",
+"%#	c #221F22",
+"&#	c #314564",
+"*#	c #446798",
+"=#	c #3B5B87",
+"-#	c #17263F",
+";#	c #22252C",
+">#	c #454242",
+",#	c #524D4C",
+"'#	c #4C4949",
+")#	c #263239",
+"!#	c #0C0A0E",
+"~#	c #940507",
+"{#	c #DD0A0E",
+"]#	c #C8090D",
+"^#	c #CA090E",
+"/#	c #BE080C",
+"(#	c #4E090A",
+"_#	c #0E1515",
+":#	c #22242C",
+"<#	c #354F73",
+"[#	c #476DA0",
+"}#	c #4A6EA1",
+"|#	c #375580",
+"1#	c #264167",
+"2#	c #233F66",
+"3#	c #284670",
+"4#	c #294060",
+"5#	c #131D23",
+"6#	c #390402",
+"7#	c #B5060A",
+"8#	c #D8090D",
+"9#	c #D80A0E",
+"0#	c #D6090E",
+"a#	c #CD080C",
+"b#	c #9A080B",
+"c#	c #3D0909",
+"d#	c #0F1415",
+"e#	c #20232B",
+"f#	c #344A6C",
+"g#	c #44689A",
+"h#	c #4870A6",
+"i#	c #466C9F",
+"j#	c #436799",
+"k#	c #4A71A7",
+"l#	c #517BB3",
+"m#	c #4D75AC",
+"n#	c #3F5A81",
+"o#	c #2A3241",
+"p#	c #181B19",
+"q#	c #36080A",
+"r#	c #7F090C",
+"s#	c #A7070A",
+"t#	c #AB060A",
+"u#	c #8F090C",
+"v#	c #55090B",
+"w#	c #1B0C0C",
+"x#	c #1E1A1C",
+"y#	c #2D3B51",
+"z#	c #38547B",
+"A#	c #406290",
+"B#	c #476DA1",
+"C#	c #4770A6",
+"D#	c #466FA5",
+"E#	c #486EA3",
+"F#	c #38547A",
+"G#	c #2E3D56",
+"H#	c #101213",
+"I#	c #1A0C0D",
+"J#	c #110F0F",
+"K#	c #0F1F1E",
+"L#	c #202127",
+"M#	c #2E3A4E",
+"N#	c #364965",
+"O#	c #394E6D",
+"P#	c #3A4F6F",
+"Q#	c #374D6C",
+"R#	c #364966",
+"S#	c #303C51",
+"T#	c #1F2027",
+"U#	c #231A16",
+"V#	c #292120",
+"W#	c #1C140F",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                      . + @ #                   ",
+"                  $ %                 & * = -                   ",
+"                ; > , '               ) ! ~ {                   ",
+"                ] ^ / ( _ : < [ } | 1 2 3 4                     ",
+"            5 6 7 8 9 9 9 9 9 9 9 9 0 a b c                     ",
+"        d e f g h i j k l m 9 9 9 9 n o p q                     ",
+"      r s t u v w x y z A B C D 9 9 E F G H                     ",
+"    I J K L M N O P Q R S T U V W X Y ] ] Z `  ...+. at .#.$.%.    ",
+"  &.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.] <.[.}.|.1.2.3.4.5.6.7.  ",
+"  8.9.0.a.b.c.d.e.f.9 g.h.i.j.k.l.m.] n.o.p.q.r.s.t.u.v.w.x.y.z.",
+"A.B.C.D.E.F.G.H.I.J.9 K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+++ at +",
+"#+$+%+&+*+G.G.=+/.-+9 ;+>+] ,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+}+1+",
+"2+3+4+5+G.6+G.7+8+9+9 0+a+b+c+d+e+f+] g+h+i+j+k+^+l+m+n+o+p+ +q+",
+"r+s+t+G.6+G.G.u+v+w+x+y+9 9 z+A+B+C+D+] E+F+G+H+I+J+K+L+M+|+N+O+",
+"P+Q+R+G.G.6+S+T+U+V+W+X+9 9 9 Y+9 9 Z+`+ @. at +@@@#@$@%@&@*@}+=@-@",
+";@>@, at G.6+F.'@)@!@~@{@9 ]@^@9 9 9 /@(@_@:@<@[@}@|@1 at 2@3 at 4@5 at 6@7@",
+"8 at 9@, at 6+G.6+G.F.0@a at b@9 9 c at d@e at 9 f at g@h at i@j at k@l at m@n at o@p at N+q@r at s@",
+"t at u@v at 6+6+F.6+w@5+x at y@z at A@9 9 9 9 B at C@D at E@F at G@H at I@J at K@ +`.L at M@  ",
+"  N at 6+O@G.6+6+6+G.P at Q@R at S@T at U@V at W@X at Y@Z@`@p+ #o+.#|++#K@@###$#  ",
+"  %#&#P@>@G.G.F.*#F.&+=#-#;#>#,#'#)#!#~#{#=@]#]#^#|+`./#(#_#    ",
+"    :#<#P@, at G.G.F.G.w@[#}#|#1#2#3#4#5#6#7#8#9#9#0#a#b#c#d#      ",
+"      e#f#g#h#i#F.G.*#'@j#k#l#m#n#o#  p#q#r#s#t#u#v#w#          ",
+"        x#y#z#A#B#C#D#h#E#!+F#G#L.        H#I#w#J#K#            ",
+"            L#M#N#O#P#Q#R#S#T#                                  ",
+"                  U#V#W#                                        ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/Utilities/Data/Icons/monteverdi-48x48.png b/Utilities/Data/Icons/monteverdi-48x48.png
new file mode 100644
index 0000000..4ee24f7
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi-48x48.png differ
diff --git a/Utilities/Data/Icons/monteverdi-48x48.xpm b/Utilities/Data/Icons/monteverdi-48x48.xpm
new file mode 100644
index 0000000..64d999a
--- /dev/null
+++ b/Utilities/Data/Icons/monteverdi-48x48.xpm
@@ -0,0 +1,233 @@
+/* XPM */
+static const char *monteverdi2_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 179 2",
+"   c #000000",
+".  c #0B0303",
+"X  c #000807",
+"o  c #0E0A06",
+"O  c #060608",
+"+  c #08070A",
+"@  c #050B0B",
+"#  c #0D0A0A",
+"$  c #170102",
+"%  c #1C0001",
+"&  c #100A06",
+"*  c #120D0D",
+"=  c #03100F",
+"-  c #0A120E",
+";  c #14120E",
+":  c #0D0D12",
+">  c #061313",
+",  c #0A1515",
+"<  c #0E1912",
+"1  c #0D141B",
+"2  c #0F1819",
+"3  c #131213",
+"4  c #1A1614",
+"5  c #1D1916",
+"6  c #12141A",
+"7  c #141C1C",
+"8  c #1C1B1A",
+"9  c #230203",
+"0  c #2D0405",
+"q  c #320305",
+"w  c #3B0305",
+"e  c #320808",
+"r  c #221A15",
+"t  c #231D1B",
+"y  c #192117",
+"u  c #21201F",
+"i  c #28221E",
+"p  c #131621",
+"a  c #171922",
+"s  c #181B24",
+"d  c #1B1E2A",
+"f  c #1B2223",
+"g  c #1B212D",
+"h  c #1E2534",
+"j  c #252324",
+"k  c #2A2727",
+"l  c #2D2926",
+"z  c #272529",
+"x  c #2D2A2A",
+"c  c #322A26",
+"v  c #342E2C",
+"b  c #273A26",
+"n  c #232937",
+"m  c #202939",
+"M  c #363332",
+"N  c #393535",
+"B  c #3C3939",
+"V  c #440405",
+"C  c #4A0305",
+"Z  c #4A0708",
+"A  c #550607",
+"S  c #5B0507",
+"D  c #550608",
+"F  c #5E0709",
+"G  c #510809",
+"H  c #600406",
+"J  c #690406",
+"K  c #660709",
+"L  c #67080A",
+"P  c #6B0A0C",
+"I  c #710507",
+"U  c #740608",
+"Y  c #7A0709",
+"T  c #71080A",
+"R  c #7C090C",
+"E  c #423E3E",
+"W  c #2F452D",
+"Q  c #32472E",
+"!  c #324D31",
+"~  c #345133",
+"^  c #385536",
+"/  c #3D5C3A",
+"(  c #40653E",
+")  c #242F41",
+"_  c #263146",
+"`  c #2B3143",
+"'  c #26334B",
+"]  c #2A354A",
+"[  c #2C3A53",
+"{  c #2E3D58",
+"}  c #303D56",
+"|  c #323F58",
+" . c #32415B",
+".. c #354663",
+"X. c #3A4967",
+"o. c #364A6A",
+"O. c #394C6C",
+"+. c #354F74",
+"@. c #3B4F72",
+"#. c #37527A",
+"$. c #3D557B",
+"%. c #4D4B4B",
+"&. c #554F50",
+"*. c #4D5050",
+"=. c #555253",
+"-. c #5D5B5B",
+";. c #615E5D",
+":. c #486D44",
+">. c #467143",
+",. c #60605F",
+"<. c #40597E",
+"1. c #656263",
+"2. c #696667",
+"3. c #6C6A6A",
+"4. c #737171",
+"5. c #7D7B7B",
+"6. c #830A0D",
+"7. c #8B090C",
+"8. c #940A0D",
+"9. c #9D0A0C",
+"0. c #A4090C",
+"q. c #AB0A0E",
+"w. c #B30B0E",
+"e. c #BE0A0E",
+"r. c #BE0C10",
+"t. c #C60A0D",
+"y. c #C90A0E",
+"u. c #D40A0E",
+"i. c #DB0A0F",
+"p. c #D80B10",
+"a. c #817F7E",
+"s. c #5B9558",
+"d. c #66A963",
+"f. c #69B267",
+"g. c #6DBE6C",
+"h. c #6DC76C",
+"j. c #6EC96D",
+"k. c #71C570",
+"l. c #73CE72",
+"z. c #75D474",
+"x. c #77D876",
+"c. c #7BE17A",
+"v. c #3F5982",
+"b. c #405C84",
+"n. c #425E88",
+"m. c #43628E",
+"M. c #436695",
+"N. c #486795",
+"B. c #436798",
+"V. c #44699A",
+"C. c #486B9D",
+"Z. c #466DA2",
+"A. c #486FA3",
+"S. c #4A70A5",
+"D. c #4B73AA",
+"F. c #868384",
+"G. c #8D8B8B",
+"H. c #918F8F",
+"J. c #989797",
+"K. c #9A9898",
+"L. c #A19F9F",
+"P. c #A6A4A4",
+"I. c #ABA9AA",
+"U. c #B5B2B2",
+"Y. c #B8B7B7",
+"T. c #BCBABA",
+"R. c #C2C1C1",
+"E. c #CCCCCC",
+"W. c #D2D0D1",
+"Q. c #D8D7D7",
+"!. c #DCDCDC",
+"~. c #E0DEDE",
+"^. c #E2E1E1",
+"/. c #E8E7E7",
+"(. c #EDEDEC",
+"). c #F4F3F3",
+"_. c #F8F6F6",
+"`. c #FEFEFE",
+"'. c None",
+/* pixels */
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.*.=.=.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.#       t '.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.  0.t.  v '.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.#     5 '.'.'.'.'.'.'.'.'.'.'.'.  0.w.  %.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.+ W.R.  '.'.'.'.'.'.'.'.'.'.'.'.  w.9.  '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.3 `.).      O O   O O O +     *   e.I @ '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.l # O `.(.-.F.P.T.E.E.W.E.E.R.I.G.*   y.V , '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.5   * %.U.`.`.`.`.`.`.`.`.`.`.`.`.`.`.5   r.9 2 '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.8   j K._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.*   q.. 8 '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.  3 L.`.`.W.F.3.`._.E =.G.R.(.`.`.`.`.`.`.~..   9.  x '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.l   %.`.`.5.j     8 `.`.        4 4./.`.`.`.`.E.  . P   '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.N   F.`.J.    1 o._ 5 `.`.4 d n.] :     5._.`.`.T.        t f f , , , > 7 f k N '.'.'.'.'.",
+"'.'.'.  H.`.%.  s $.Z.S.[ 4 `.`.B + S.Z.V.O.6   x Q.E.E         % C J I U Y U S V %   @ N '.'.'.",
+"'.'.  1.`.k    .A.C.V.Z.[ ; `.`.3.  M.M.V.C.D.`                 0 K 9.p.i.u.u.u.u.i.w.Z   l '.'.",
+"'.4 3 _.N   @.A.M.B.B.C.[ ; `.`.K.  ..Z.C.C.} +           8 ( Q <     $ 6.p.y.t.t.t.y.i.R   B '.",
+"'.  K.5.  O.Z.B.V.V.B.Z.} ; `.`./.  p S.<.:   : [ $.a     ( c.z.l.d./ +   Z y.u.t.y.y.y.u.V > '.",
+"'.* Y.  ) D.V.B.B.B.B.C.} * `.`.`.2.  n   # ..C.Z.A.N.:   >.z.j.h.z.x.h.!   e y.t.y.t.y.y.w.  '.",
+"k k -.  M.V.M.V.V.B.B.Z.} # `.`.`._.    n A.Z.B.V.V.S.n   >.x.j.j.h.h.j.z./   Z u.t.y.t.t.u.% j ",
+"v 3   ] Z.B.B.B.B.B.V.V. .o `.`.`.3.    : @.C.S.S.M.{     ( z.j.j.h.j.h.j.z.W   7.u.y.y.y.u.S 7 ",
+"M   6 M.B.V.B.B.M.V.B.Z. .+ `.`.G.  Y.Y.    1 ) h         ! z.h.j.h.h.j.h.j.g.  0 u.t.y.t.u.J 2 ",
+"5 o.A.V.M.B.V.V.V.V.V.V. .. `.Q.  I.`.`./.;.4     x F.3   5 l.h.h.h.j.h.h.h.x.! $ u.t.y.t.u.J 7 ",
+"t #.V.B.B.V.B.V.V.B.B.Z...  `.B 2.`.`._.`.`.(.!.~.`.`.      d.j.h.h.j.h.h.h.z.~ % u.t.y.t.u.C s ",
+"l $.Z.B.V.B.V.M.M.V.B.V.<.  5.v `.`.`.`.`.`.`.`.`.`.(.  G   b x.j.j.h.j.h.h.l.- w u.t.y.y.u.. l ",
+"l #.V.B.V.B.B.B.B.M.V.V.M.:   U.`.`.`.`.`.`.`.`.`.`.!.  8.G   :.x.j.h.h.l.x./   6.u.y.t.y.q.  '.",
+"r +.Z.V.B.B.V.B.B.V.B.V.Z.)   W.`.`._.`.`.`.`.`.`.`.E.  0.y.9   ^ f.l.k.s.b   e t.y.y.y.i.S > '.",
+"r { C.B.M.B.B.B.V.M.B.B.B.N.  l `.`.`.`.`.`.`.`.`.`.U.  w.u.t.e     @       V y.y.y.y.y.e.. j '.",
+"'.g S.M.V.V.V.M.B.V.B.V.B.C.O.  -.`.`.`._.`.`.`.`.`.K.  e.y.y.y.7.F D A T q.u.y.y.y.t.i.L X '.'.",
+"'.# m.B.B.B.V.V.V.M.V.V.B.M.Z. .  %.).`.`.`.`.`.`.`.N.% e.y.y.y.u.u.u.u.u.y.y.y.y.y.u.q.  l '.'.",
+"'.4 _ S.B.B.B.M.V.V.B.V.B.V.V.Z. .  # H._.`.`.`.`.`.-.o t.y.y.y.t.y.t.t.y.y.y.y.y.y.u.% 2 '.'.'.",
+"'.'.# b.C.B.B.B.M.B.V.V.B.V.V.V.Z.$.p     B 1.;.%.4 O   8.u.y.y.y.y.y.y.y.t.y.y.y.u.w X '.'.'.'.",
+"'.'.l 6 A.V.B.B.V.B.B.M.B.V.M.V.B.V.C.$.] 6 : @ , h X.+ 0 p.y.y.y.t.y.y.t.y.y.u.y.q O '.'.'.'.'.",
+"'.'.'.5 g S.B.B.B.B.V.B.B.B.B.B.V.B.B.V.Z.A.S.A.S.D.| r   L i.y.y.y.t.y.y.u.i.7.. @ '.'.'.'.'.'.",
+"'.'.'.'.* g C.C.B.V.B.V.B.V.V.M.B.B.B.V.V.V.M.B.S._ & '.B   V w.u.u.i.u.t.8.0   7 '.'.'.'.'.'.'.",
+"'.'.'.'.'.r 6 v.Z.V.V.M.V.V.B.B.V.B.B.B.B.C.A.M.g & '.'.'.B @   q S S V $   2 '.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.c o h v.Z.Z.B.B.B.M.B.B.B.Z.Z.m.' & t '.'.'.'.'.'.B 2 > 2 > f '.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.k 3 g } b.M.V.B.B.B.v...h * 5 '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.v 4 ; r j z j 4 3 3 l '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
+"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'."
+};
diff --git a/Utilities/Data/Icons/monteverdi-highres.png b/Utilities/Data/Icons/monteverdi-highres.png
new file mode 100644
index 0000000..3eeacff
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi-highres.png differ
diff --git a/Utilities/Data/Icons/monteverdi-splash.png b/Utilities/Data/Icons/monteverdi-splash.png
new file mode 100644
index 0000000..2d03923
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi-splash.png differ
diff --git a/Utilities/Data/Icons/monteverdi.ico b/Utilities/Data/Icons/monteverdi.ico
new file mode 100644
index 0000000..89f80b3
Binary files /dev/null and b/Utilities/Data/Icons/monteverdi.ico differ
diff --git a/Utilities/Data/Icons/monteverdi.svg b/Utilities/Data/Icons/monteverdi.svg
new file mode 100644
index 0000000..6d7c405
--- /dev/null
+++ b/Utilities/Data/Icons/monteverdi.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   width="1024"
+   height="1024"
+   version="1.0"
+   sodipodi:docname="monteverdi2.svg">
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs5" />
+  <sodipodi:namedview
+     inkscape:window-height="721"
+     inkscape:window-width="1024"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="0.34894983"
+     inkscape:cx="366.35454"
+     inkscape:cy="422.20322"
+     inkscape:window-x="552"
+     inkscape:window-y="33"
+     inkscape:current-layer="g1892"
+     showgrid="false"
+     inkscape:window-maximized="0" />
+  <g
+     id="g1892"
+     transform="translate(6.0791554,-4.05277)">
+    <g
+       id="g2989"
+       transform="matrix(1.1755021,0,0,1.1580001,-110.91146,1.9856174)">
+      <path
+         sodipodi:nodetypes="cssssssssssccccccccccccsssssscsssssssssssscsssccsssssssssssssssssssscssssssssssssscccccccssssssssssssscsss"
+         inkscape:connector-curvature="0"
+         id="path1906"
+         d="m 381.92084,692.08756 c -29.44259,-2.84679 -66.59653,-16.15077 -93.40867,-33.44751 -9.27039,-5.98041 -25.81637,-19.06817 -32.59133,-25.77953 -13.41644,-13.29048 -30.55337,-36.12598 -37.65824,-50.18079 -5.33219,-10.54812 -14.459,-35.29105 -16.64577,-45.12696 -3.10953,-13.98641 -3.92464,-25.7736 -3.39767,-49.13316 0.40709,-18.046 0.88819,-24.02636 2.282,-28.36684 1.30984,-4.07902 1.94557,-10.6672 2.46061,-25.5 0.84583,-24.35952 2.26771,-30.49271 11.36714,-49.03146 7.94406,-16.1 [...]
+         style="fill:#a1a1a1" />
+      <path
+         sodipodi:nodetypes="cssssssssssssscccccccccccssssssscssssssssssssssssssssssssssssssccssssssscsssscssscssssssscssssssssssssssssscsscssssssssssscscsss"
+         inkscape:connector-curvature="0"
+         id="path1904"
+         d="m 382.92084,691.04648 c -33.48679,-3.40252 -72.25798,-17.80481 -99.5,-36.96115 -7.10067,-4.99312 -23.39239,-18.22399 -27.31717,-22.18487 -9.03729,-9.12044 -17.7161,-19.96327 -30.45814,-38.05275 -3.03468,-4.30823 -10.53517,-18.80863 -11.79094,-22.79494 -0.70775,-2.24667 -3.23587,-9.0785 -7.58604,-20.5 -0.83793,-2.2 -1.89855,-5.8 -2.35693,-8 -0.45838,-2.2 -1.58069,-7.6 -2.49402,-12 -1.13234,-5.45513 -1.8294,-15.32581 -2.19126,-31.02922 -0.51604,-22.39468 -0.0518,-29.08776 2.807 [...]
+         style="fill:#6ec86d" />
+      <path
+         sodipodi:nodetypes="cssssssssssssscccccccccccssssssscssssssssssssssssssssssssssssssccssssssscsssscssscsssssssssssssssssssssscssssssssssssssssscsscssssssssssscscsss"
+         inkscape:connector-curvature="0"
+         id="path1902"
+         d="m 382.92084,691.04648 c -33.48679,-3.40252 -72.25798,-17.80481 -99.5,-36.96115 -7.10067,-4.99312 -23.39239,-18.22399 -27.31717,-22.18487 -9.03729,-9.12044 -17.7161,-19.96327 -30.45814,-38.05275 -3.03468,-4.30823 -10.53517,-18.80863 -11.79094,-22.79494 -0.70775,-2.24667 -3.23587,-9.0785 -7.58604,-20.5 -0.83793,-2.2 -1.89855,-5.8 -2.35693,-8 -0.45838,-2.2 -1.58069,-7.6 -2.49402,-12 -1.13234,-5.45513 -1.8294,-15.32581 -2.19126,-31.02922 -0.51604,-22.39468 -0.0518,-29.08776 2.807 [...]
+         style="fill:#446899" />
+      <path
+         sodipodi:nodetypes="cssssssssssssscccccccccccssssssscssssssssssssssssssssssssssssssccssssssssssssssssssssssscccsssssssscccsssssscssssssssssssssscsssscssscsssssssssssssssssssssscssssssssssssssssscsscssssssssssscscsssssssssssssssssscssssssssss"
+         inkscape:connector-curvature="0"
+         id="path1900"
+         d="m 382.92084,691.04648 c -33.48679,-3.40252 -72.25798,-17.80481 -99.5,-36.96115 -7.10067,-4.99312 -23.39239,-18.22399 -27.31717,-22.18487 -9.03729,-9.12044 -17.7161,-19.96327 -30.45814,-38.05275 -3.03468,-4.30823 -10.53517,-18.80863 -11.79094,-22.79494 -0.70775,-2.24667 -3.23587,-9.0785 -7.58604,-20.5 -0.83793,-2.2 -1.89855,-5.8 -2.35693,-8 -0.45838,-2.2 -1.58069,-7.6 -2.49402,-12 -1.13234,-5.45513 -1.8294,-15.32581 -2.19126,-31.02922 -0.51604,-22.39468 -0.0518,-29.08776 2.807 [...]
+         style="fill:#5a5b5a" />
+      <path
+         sodipodi:nodetypes="ssssssssssssssssscccccccsssssssscssssssssssssssssssssssscsssssssssssssscsssssscccsssssssssssssssscssssssssscsssssssssssssssssssssssssssssscscssccssssssssssssscscsscsssssssssssssscsccssssssssscsssssssssssssssssssssss"
+         inkscape:connector-curvature="0"
+         id="path1898"
+         d="m 382.92084,690.04648 c -33.48679,-3.40252 -72.25798,-17.80481 -99.5,-36.96115 -6.77335,-4.76295 -23.35193,-18.19177 -26.78116,-21.693 -9.06368,-9.254 -17.54132,-19.86572 -29.99415,-37.54462 -3.03468,-4.30823 -10.53517,-18.80863 -11.79094,-22.79494 -0.70775,-2.24667 -3.23587,-9.0785 -7.58604,-20.5 -0.83793,-2.2 -1.89797,-5.8 -2.35565,-8 -0.45768,-2.2 -1.62586,-7.825 -2.59595,-12.5 -1.40863,-6.7884 -1.77712,-13.73549 -1.82996,-34.5 -0.064,-25.14598 0.76359,-34.48254 3.52214,-3 [...]
+         style="fill:#c90a0e" />
+      <path
+         sodipodi:nodetypes="ssssssssssssssssscccccccsssssssscssssssssssssssssssssssscsssssssssssssscsssssscccsssssssssssssssscsssssssssssssssssssssssscssssssssssssccsscsscssssscsssssssssssssssssssssssssssssscscssccssssssssssssscscsscsssssssssssssscsccssssscsssssssssssssssssssssssssssscccssss"
+         inkscape:connector-curvature="0"
+         id="path1896"
+         d="m 382.92084,690.04648 c -33.48679,-3.40252 -72.25798,-17.80481 -99.5,-36.96115 -6.77335,-4.76295 -23.35193,-18.19177 -26.78116,-21.693 -9.06368,-9.254 -17.54132,-19.86572 -29.99415,-37.54462 -3.03468,-4.30823 -10.53517,-18.80863 -11.79094,-22.79494 -0.70775,-2.24667 -3.23587,-9.0785 -7.58604,-20.5 -0.83793,-2.2 -1.89797,-5.8 -2.35565,-8 -0.45768,-2.2 -1.62586,-7.825 -2.59595,-12.5 -1.40863,-6.7884 -1.77712,-13.73549 -1.82996,-34.5 -0.064,-25.14598 0.76359,-34.48254 3.52214,-3 [...]
+         style="fill:#171717" />
+      <path
+         sodipodi:nodetypes="ssssssssssssssssssssssssscscssssssscsssssssssssssscccsssssssscsssssssscccccccsssscssscsscscssssssssssssssccsssssssssssssssssssssssssssssssssssssssssssssssssssssssscsssscssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssscsssssssssssssssssssssssssssssssssssssss"
+         inkscape:connector-curvature="0"
+         id="path1894"
+         d="m 382.92084,689.04648 c -33.29713,-3.38325 -70.88842,-17.24814 -97.5,-35.96115 -7.48002,-5.25988 -23.47534,-18.2864 -27.8404,-22.67311 -9.30858,-9.35474 -17.92681,-20.0982 -30.92974,-38.55692 -3.05101,-4.33116 -9.55971,-16.87161 -10.79686,-20.80253 -0.70697,-2.24634 -3.22968,-9.06419 -7.58529,-20.5 -0.83793,-2.2 -1.89797,-5.8 -2.35565,-8 -0.45768,-2.2 -1.62586,-7.825 -2.59595,-12.5 -2.37431,-11.44212 -2.67552,-57.15495 -0.43983,-66.75 0.80095,-3.4375 1.7437,-6.25 2.09501,-6.2 [...]
+         style="fill:#000000" />
+    </g>
+  </g>
+</svg>
diff --git a/Utilities/Data/Icons/projection_24x24.png b/Utilities/Data/Icons/projection_24x24.png
new file mode 100644
index 0000000..5806601
Binary files /dev/null and b/Utilities/Data/Icons/projection_24x24.png differ
diff --git a/Utilities/Data/Icons/reload_24x24.png b/Utilities/Data/Icons/reload_24x24.png
new file mode 100644
index 0000000..23b6d23
Binary files /dev/null and b/Utilities/Data/Icons/reload_24x24.png differ
diff --git a/Utilities/Data/Icons/unlocked.png b/Utilities/Data/Icons/unlocked.png
new file mode 100644
index 0000000..c2d0850
Binary files /dev/null and b/Utilities/Data/Icons/unlocked.png differ
diff --git a/Utilities/Data/Icons/zoom-1to1.png b/Utilities/Data/Icons/zoom-1to1.png
new file mode 100644
index 0000000..2b5c56f
Binary files /dev/null and b/Utilities/Data/Icons/zoom-1to1.png differ
diff --git a/Utilities/Data/monteverdi.desktop b/Utilities/Data/monteverdi.desktop
new file mode 100644
index 0000000..7664bb1
--- /dev/null
+++ b/Utilities/Data/monteverdi.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Type=Application
+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
+Terminal=false
+StartupNotify=false
+Icon=monteverdi
+Categories=Education;Science;ImageProcessing;Geography;Qt;
+MimeType=image/tiff;image/jpeg;image/jp2;application/x-esri-shape;
diff --git a/Utilities/Data/monteverdi2.desktop b/Utilities/Data/monteverdi2.desktop
new file mode 100644
index 0000000..7664bb1
--- /dev/null
+++ b/Utilities/Data/monteverdi2.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Type=Application
+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
+Terminal=false
+StartupNotify=false
+Icon=monteverdi
+Categories=Education;Science;ImageProcessing;Geography;Qt;
+MimeType=image/tiff;image/jpeg;image/jp2;application/x-esri-shape;
diff --git a/Utilities/Doxygen/CMakeLists.txt b/Utilities/Doxygen/CMakeLists.txt
index 4dbab71..388df13 100644
--- a/Utilities/Doxygen/CMakeLists.txt
+++ b/Utilities/Doxygen/CMakeLists.txt
@@ -109,10 +109,7 @@ find_package( Perl )
 
 if( PERL_FOUND )
   set( OTB_DOXYGEN_INPUT_FILTER
-    "${PERL_EXECUTABLE} ${OTB_BINARY_DIR}/Utilities/Doxygen/otbdoxygen.pl" )
-
-  configure_file(${OTB_SOURCE_DIR}/Utilities/Doxygen/otbdoxygen.pl.in
-               ${OTB_BINARY_DIR}/Utilities/Doxygen/otbdoxygen.pl)
+    "${PERL_EXECUTABLE} ${OTB_SOURCE_DIR}/Utilities/Doxygen/otbgroup.pl" )
 else()
   set( OTB_DOXYGEN_INPUT_FILTER )
 endif()
@@ -154,7 +151,6 @@ if (BUILD_DOCUMENTATION)
     #COMMAND ${CMAKE_COMMAND} -E copy
     #  ${OTB_SOURCE_DIR}/Utilities/Doxygen/favicon.ico
     #  ${OTB_BINARY_DIR}/Documentation/Doxygen/html
-    DEPENDS         ${OTB_BINARY_DIR}/Utilities/Doxygen/otbdoxygen.pl
    # DEPENDS         ${OTB_BINARY_DIR}/Documentation/Doxygen/Examples.dox
     WORKING_DIRECTORY ${OTB_BINARY_DIR}/Utilities/Doxygen
     )
diff --git a/Utilities/Doxygen/OTB/Geometry.dox b/Utilities/Doxygen/OTB/Geometry.dox
index 6b62bde..5398059 100644
--- a/Utilities/Doxygen/OTB/Geometry.dox
+++ b/Utilities/Doxygen/OTB/Geometry.dox
@@ -8,6 +8,6 @@
   This document present the different geometric concepts used in the toolkit,
   as well as their relationships and how they can effectively be used.
   
-  At the beggining there was the Point
+  At the beginning there was the Point
 
  */
diff --git a/Utilities/Doxygen/OTB/ImageSimilarityMetrics.dox b/Utilities/Doxygen/OTB/ImageSimilarityMetrics.dox
index bb3ab4a..8f39562 100644
--- a/Utilities/Doxygen/OTB/ImageSimilarityMetrics.dox
+++ b/Utilities/Doxygen/OTB/ImageSimilarityMetrics.dox
@@ -30,7 +30,7 @@ particular problems.
 
 
 \subsection RegistrationMetrics Similarity Metrics
-Metrics are probably the most critical element of a registration problem. The metric defines what the goal of the process is, they measure how well the Target object is matched by the Reference object after the transform has been applied to it. The Metric should be selected in function of the types of objects to be registered and the expected kind of missalignment. Some metrics has a rather large capture region, which means that the optimizer will be able to find his way to a maximum eve [...]
+Metrics are probably the most critical element of a registration problem. The metric defines what the goal of the process is, they measure how well the Target object is matched by the Reference object after the transform has been applied to it. The Metric should be selected in function of the types of objects to be registered and the expected kind of missalignment. Some metrics has a rather large capture region, which means that the optimizer will be able to find his way to a maximum eve [...]
 
 Unfortunately there are no clear rules about how to select a metric, other that trying some of them in different conditions. In some cases could be and advantage to use a particular metric to get an initial approximation of the transformation, and then switch to another more sensitive metric to achieve better precision in the final result.
 
diff --git a/Utilities/Doxygen/OTB/Iterators.dox b/Utilities/Doxygen/OTB/Iterators.dox
index 86884ba..7dd19a0 100644
--- a/Utilities/Doxygen/OTB/Iterators.dox
+++ b/Utilities/Doxygen/OTB/Iterators.dox
@@ -289,7 +289,7 @@
 
   In general, iterators are not the kind of objects that users of the
   toolkit would need to use. They are rather designed to be used by
-  code developers that add new components to the toolkit, like writting
+  code developers that add new components to the toolkit, like writing
   a new Image filter, for example.
 
   Before starting to write code that use iterators, users should consider
diff --git a/Utilities/Doxygen/OTB/NeighborhoodIterators.dox b/Utilities/Doxygen/OTB/NeighborhoodIterators.dox
index 1c054ff..017cb7b 100644
--- a/Utilities/Doxygen/OTB/NeighborhoodIterators.dox
+++ b/Utilities/Doxygen/OTB/NeighborhoodIterators.dox
@@ -53,7 +53,7 @@ itk::NeighborhoodIterator classes. ITK NeighborhoodIterators allow for code
 that is closer to the algorithmic abstraction,
 
 \code
-  ForAllTheIndicies i in Image
+  ForAllTheIndices i in Image
      GetTheNeighbors n in a 3x3 region around i
        Compute the mean of all pixels n
          Write the value to the output at i
@@ -164,7 +164,7 @@ pixel in a neighborhood is always Size()/2.
 important.  SmartNeighborhoodIterator defines a special class of neighborhood
 iterators that transparently handle boundary conditions.  These iterators store
 a boundary condition object that is used to calculate a value of requested
-pixel indicies that lie outside the data set boundary.  New boundary condition
+pixel indices that lie outside the data set boundary.  New boundary condition
 objects can be defined by a user and plugged into SmartNeighboroodIterators as
 is appropriate for their algorithm.
 
@@ -230,7 +230,7 @@ for (regions_iterator++ ; regions_iterator != regions.end(); regions_iterator++)
 The NeighborhoodAlgorithm::ImageBoundaryFacesCalculator is a special function
 object that returns a list of sub-regions, or faces, of an image region.  The
 first region in the list corresponds to all the non-boundary pixels in the
-input image region.  Subseqent regions in the list represent all of the boundary
+input image region.  Subsequent regions in the list represent all of the boundary
 faces of the image (because an image region is defined only by a single index
 and size, no single composite boundary region is possible).  The list is
 traversed with an iterator.
diff --git a/Utilities/Doxygen/OTB/Registration.dox b/Utilities/Doxygen/OTB/Registration.dox
index bec99c7..5c25bdf 100644
--- a/Utilities/Doxygen/OTB/Registration.dox
+++ b/Utilities/Doxygen/OTB/Registration.dox
@@ -38,7 +38,7 @@ elements. They are:
 \li \b Mapper: the particular technique used for interpolating values when objects are resampled through the \e Transform.
 \li \b Optimizer: the method used to find the \e Transform parameters that optimize the \e Metric.
 
-A particular registration method is defined by selecting specific implemementations of each one of these basic elements.
+A particular registration method is defined by selecting specific implementations of each one of these basic elements.
 In order to determine the registration method appropriated for a particular problem, is will be useful to answer the following questions:
 
 
@@ -68,7 +68,7 @@ This is a rapid description of the transforms implemented in the toolkit
 
 
 \subsection RegistrationMetrics Similarity Metrics
-Metrics are probably the most critical element of a registration problem. The metric defines what the goal of the process is, they measure how well the Target object is matched by the Reference object after the transform has been applied to it. The Metric should be selected in function of the types of objects to be registered and the expected kind of missalignment. Some metrics has a rather large capture region, which means that the optimizer will be able to find his way to a maximum eve [...]
+Metrics are probably the most critical element of a registration problem. The metric defines what the goal of the process is, they measure how well the Target object is matched by the Reference object after the transform has been applied to it. The Metric should be selected in function of the types of objects to be registered and the expected kind of missalignment. Some metrics has a rather large capture region, which means that the optimizer will be able to find his way to a maximum eve [...]
 
 Unfortunately there are no clear rules about how to select a metric, other that trying some of them in different conditions. In some cases could be and advantage to use a particular metric to get an initial approximation of the transformation, and then switch to another more sensitive metric to achieve better precision in the final result.
 
diff --git a/Utilities/Doxygen/OTB/Threading.dox b/Utilities/Doxygen/OTB/Threading.dox
index e018e9c..50e8685 100644
--- a/Utilities/Doxygen/OTB/Threading.dox
+++ b/Utilities/Doxygen/OTB/Threading.dox
@@ -69,7 +69,7 @@
 
    Care must in taken in setting up an application to have separate
    application level (as opposed to filter level) execution threads.
-   Individual ITK objects are not guarenteed to be thread safe. By this
+   Individual ITK objects are not guaranteed to be thread safe. By this
    we mean that a single instance of an object should only be modified
    by a single execution thread.  You should not try to modify a single
    instance of an object in multiple execution threads.
@@ -80,7 +80,7 @@
    safety was chosen as a compromise between performance and flexibility.
    If we allow ITK objects to be modified in multiple threads then ITK
    would have to mutex every access to every instance variable of a 
-   class.  This would severly affect performance.
+   class.  This would severely affect performance.
 
    \section NumericsThreadSafety Thread Safety in the Numerics Library
 
@@ -90,7 +90,7 @@
    (http://www.netlib.org/f2c/).  A cursory glance at the f2c
    generated NETLIB C code yields the impression that the NETLIB code
    is not thread safe (due to COMMON blocks being translated to
-   function scope statics).  We are still investigating this matter.
+   function scope static).  We are still investigating this matter.
 
 
 */
diff --git a/Utilities/Doxygen/doxygen.config.in b/Utilities/Doxygen/doxygen.config.in
index f8a6eb2..f23888a 100644
--- a/Utilities/Doxygen/doxygen.config.in
+++ b/Utilities/Doxygen/doxygen.config.in
@@ -1408,7 +1408,7 @@ EXT_LINKS_IN_WINDOW    = NO
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
 # generated for formulas are transparent PNGs. Transparent PNGs are not
 # supported properly for IE 6.0, but are supported on all modern browsers.
 #
@@ -2029,7 +2029,7 @@ PREDEFINED             = "itkNotUsed(x)=" \
 EXPAND_AS_DEFINED      =
 
 # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all refrences to function-like macros that are alone on a line, have an
+# remove all references to function-like macros that are alone on a line, have an
 # all uppercase name, and do not end with a semicolon. Such function macros are
 # typically used for boiler-plate code, and will confuse the parser if not
 # removed.
diff --git a/Utilities/Doxygen/otbdoxygen.pl.in b/Utilities/Doxygen/otbdoxygen.pl.in
deleted file mode 100644
index 18fc1a0..0000000
--- a/Utilities/Doxygen/otbdoxygen.pl.in
+++ /dev/null
@@ -1,9 +0,0 @@
-# for vxl files run the vxl_doxy.pl script, and use otbgroup.pl for all other files
-if ( $ARGV[0] =~ /(vxl|vcl|vnl)/)
-{
-    system ("perl @OTB_SOURCE_DIR@/Utilities/Doxygen/vxl_doxy.pl $ARGV[0]");
-}
-else
-{
-    system ("perl @OTB_SOURCE_DIR@/Utilities/Doxygen/otbgroup.pl $ARGV[0]");
-}
diff --git a/Utilities/Doxygen/vxl_doxy.pl b/Utilities/Doxygen/vxl_doxy.pl
deleted file mode 100644
index 87458fe..0000000
--- a/Utilities/Doxygen/vxl_doxy.pl
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/bin/sh
-# -*- perl -*-
-exec perl -w -x $0 ${1+"$@"}
-#!perl
-#line 6
-# If Windows barfs at line 3 here, you will need to run perl -x vxl_doxy.pl
-# You can set up as a permanent file association using the following commands
-#  >assoc .pl-PerlScript
-#  >ftype PerlScript=Perl=C:\Perl\bin\Perl.exe -x "%1" %*
-
-# Script to change the perceps documentation format to Doxygen (JavaDoc) format
-# Authors:
-#         Dave Cooper
-#         Maarten Vergauwen
-# Date:
-#      17/02/2000
-# Modified:
-# 11 April 2001 Ian Scott.   Remove support for old perceps commands
-#  5 May   2001 Geoff Cross. Correctly handle end of verbatim blocks. Allow two contiguous comments
-#  10 May  2001 Ian Scott. Merged Geoffs and my changes
-
-
-# patterns to be matched
-$verbpatt = '\\\\verbatim';
-$endverbpatt = '\\\\endverbatim';
-$slashslashpatt = '^\\s*//';
-$slashslashcolonpatt = '^\\s*//:';
-$slashstarstarpatt = '/**';
-$spacespacepatt = '  ';
-$starpatt = '*';
-$starslashpatt = '*/';
-
-# variables that keep state:
-
-# comment found -> first line should start with /**, next lines with *, last line with */
-$comment = 0;
-
-# verbatim found -> lines should not start with * (visible in Doxygen)
-$verbatim = 0;
-# finish verbatim mode at the end of this line.
-$should_end_verbatim = 0;
-
-$debug = 0;
-
-# mainloop
-while (<>)
-{
-    # preprocessing
-    s/\bVCL_SUNPRO_CLASS_SCOPE_HACK\s*\([^()]*\)//g;
-    s/\bVCL_SUNPRO_ALLOCATOR_HACK\s*\(([^()]*)\)/$1/g;
-    s/\bVCL_CAN_STATIC_CONST_INIT_(INT|FLOAT)\b/1/g;
-    s/\bVCL_STATIC_CONST_INIT_(INT|FLOAT)\s*\(([^()]*)\)/= $2/g;
-    s/\bVCL_DFL_TYPE_PARAM_STLDECL\s*\(([^,()]*),([^,()]*)\)/class $1 = $2 /g;
-    s/\bDECLARE_DYNCREATE\s*\([^()]*\)//g; # for MFC
-
-    if ( $should_end_verbatim )
-    {
-        $verbatim = 0;
-        $should_end_verbatim = 0;
-    }
-
-    # found verbatim ?
-    if ( m/$verbpatt/ ) { $verbatim = 1; };
-
-    # found endverbatim ?
-    if ( m/$endverbpatt/ ) { $should_end_verbatim = 1; };
-
-    # found start of comment: "//:"  ?
-    if ( s!$slashslashcolonpatt!$slashstarstarpatt! )
-    {
-        chomp; s/\s*$//;
-        # escape a space following a dot, add a dot at the end,
-#       # and finish brief doc, unless the line is empty or only has '\file':
-        unless (m!^\s*\/\*\*\s*(\\file)?\s*$!) {
-#         s/\. /.\\ /g; s/(\.)?\s*$/. \*\/\n\/\*/;
-          s/\. /.\\ /g; s/(\.)?\s*$/.\n/;
-        }
-        else { s/$/\n/; }
-
-        if ($comment)
-        {
-            # Previous comment hasn't ended--two contiguous comment blocks.
-            # (Should not happen.)
-            print STDERR "Two contiguous comment blocks -- this should not happen\n";
-            print "*/\n";
-        }
-        $comment = 1;
-        print; next;
-    }
-
-    # Replace '$' with '\f$' (TeX math mode)
-    s/(\\f)?\$(.+?)(\\f)?\$/\\f\$$2\\f\$/g if ($comment);
-
-    # found continuation of comment WITH verbatim -> no "*"
-    if ( m!$slashslashpatt! && $verbatim && $comment)
-    {
-        s!$slashslashpatt!$spacespacepatt!;
-#       # Make 'Modifications' a section title:
-#       s!\b(Modifications?)\b\:?!\<H2\>$1\<\/H2\>!;
-        # remove lines of the form ========= or +-+-+-+-+ or ********* or longer:
-        print unless m/^\s*[*=+-]{9,}\s*$/; next;
-    }
-
-    # found continuation of comment WITHOUT verbatim -> start line with "*"
-    if ( m!$slashslashpatt! && $comment )
-    {
-        s!$slashslashpatt!$starpatt!;
-        # remove lines of the form ========= or +-+-+-+-+ or ********* or longer:
-        print unless m/^\s*[*=+-]{9,}\s*$/; next;
-    }
-
-    # found end of comment -> start line with */
-    # NOTE that *every* line within a comment (also empty lines) *must* start with // !
-    # (In an earlier version of this script, empty lines were allowed inside comments.)
-    if ( $comment && ! m!$slashslashpatt!  )
-    {
-        print "$starslashpatt\n";
-        $comment = 0;
-        print; next;
-    }
-
-    # just print line if not in comment or in file
-    if ( !$comment ) { print; next; }
-
-    # debug - print unprocessed lines (s.b. none)
-    if ($debug) { print "LNP:\t"; print; }
-}
diff --git a/Utilities/Maintenance/BuildHeaderTest.py b/Utilities/Maintenance/BuildHeaderTest.py
index 4d2a19c..8b4403b 100644
--- a/Utilities/Maintenance/BuildHeaderTest.py
+++ b/Utilities/Maintenance/BuildHeaderTest.py
@@ -30,7 +30,7 @@ test is to make sure there are not missing module dependencies.  It also tests
 for syntax and missing #include's.
 """
 
-# BANNED_HEADERS = Headers to not test because of dependecy issues, etc.
+# BANNED_HEADERS = Headers to not test because of dependency issues, etc.
 
 
 HEADER = """/*=========================================================================
diff --git a/Utilities/Maintenance/TravisBuild.sh b/Utilities/Maintenance/TravisBuild.sh
index 5790954..9243849 100755
--- a/Utilities/Maintenance/TravisBuild.sh
+++ b/Utilities/Maintenance/TravisBuild.sh
@@ -24,11 +24,11 @@ if [ ! -f $CTEST_DASHBOARD_ROOT/orfeotoolbox/OTB/CMakeLists.txt ]; then
 fi
 
 CMAKE_FILE=$CTEST_DASHBOARD_ROOT/orfeotoolbox/OTB/CMakeLists.txt
-VERION_MAJOR=$(sed -n  '/set.OTB_VERSION_MAJOR/p' $CMAKE_FILE|cut -d '"' -f 2)
-VERION_MINOR=$(sed -n  '/set.OTB_VERSION_MINOR/p' $CMAKE_FILE|cut -d '"' -f 2)
-VERION_PATCH=$(sed -n  '/set.OTB_VERSION_PATCH/p' $CMAKE_FILE|cut -d '"' -f 2)
-OTB_VERSION="$VERION_MAJOR.$VERION_MINOR"
-OTB_VERSION_FULL="$VERION_MAJOR.$VERION_MINOR.$VERION_PATCH"
+VERSION_MAJOR=$(sed -n  '/set.OTB_VERSION_MAJOR/p' $CMAKE_FILE|cut -d '"' -f 2)
+VERSION_MINOR=$(sed -n  '/set.OTB_VERSION_MINOR/p' $CMAKE_FILE|cut -d '"' -f 2)
+VERSION_PATCH=$(sed -n  '/set.OTB_VERSION_PATCH/p' $CMAKE_FILE|cut -d '"' -f 2)
+OTB_VERSION="$VERSION_MAJOR.$VERSION_MINOR"
+OTB_VERSION_FULL="$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH"
 
 XDK_FILE=OTB-$OTB_VERSION_FULL-xdk-Linux64.run
 CMAKE_PREFIX_PATH=/tmp/OTB-$OTB_VERSION_FULL-xdk-Linux64
diff --git a/Utilities/Maintenance/fix_typos.sh b/Utilities/Maintenance/fix_typos.sh
new file mode 100755
index 0000000..7e42702
--- /dev/null
+++ b/Utilities/Maintenance/fix_typos.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+# -*- coding: utf-8 -*-
+
+###############################################################################
+#  Copyright (c) 2016, Even Rouault <even.rouault at spatialys.com>
+#
+#  Permission is hereby granted, free of charge, to any person obtaining a
+#  copy of this software and associated documentation files (the "Software"),
+#  to deal in the Software without restriction, including without limitation
+#  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+#  and/or sell copies of the Software, and to permit persons to whom the
+#  Software is furnished to do so, subject to the following conditions:
+#
+#  The above copyright notice and this permission notice shall be included
+#  in all copies or substantial portions of the Software.
+#
+#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+#  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+#  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+#  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+#  DEALINGS IN THE SOFTWARE.
+###############################################################################
+
+if ! test -d fix_typos; then
+    # Get even rouault fork of codespell that adds --words-white-list and full filename support for -S option
+    mkdir fix_typos
+    cd fix_typos
+    git clone https://github.com/rouault/codespell
+    cd codespell
+    git checkout gdal_improvements
+    cd ..
+    # Aggregate base dictionary + QGIS one + Debian Lintian one
+    curl https://raw.githubusercontent.com/qgis/QGIS/master/scripts/spelling.dat | sed "s/:/->/" | grep -v "colour->" | grep -v "colours->" > qgis.txt
+    curl https://anonscm.debian.org/cgit/lintian/lintian.git/plain/data/spelling/corrections| grep "||" | grep -v "#" | sed "s/||/->/" > debian.txt
+    cat codespell/data/dictionary.txt qgis.txt debian.txt | awk 'NF' > otb_dict.txt
+    cd ..
+fi
+
+#Build exclude files and directory list
+EXCLUDED_FILES="*/.git*"
+#Exclude third parties code, patches from superbuild and doxygen files
+EXCLUDED_FILES="$EXCLUDED_FILES,*/Modules/ThirdParty/6S/*,*/Modules/ThirdParty/SiftFast/*,*/Modules/ThirdParty/SPTW/*,*/SuperBuild/patches/*"
+#Exclude also documentation for now
+EXCLUDED_FILES="$EXCLUDED_FILES,*/Documentation/SoftwareGuide/Art/*,*/Documentation/Cookbook/Art/*,*/Documentation/SoftwareGuide/Latex/Hyperspectral.txt,*/Documentation/Latex/Insight.bib"
+#Exclude also Copyright folder
+EXCLUDED_FILES="$EXCLUDED_FILES,*/Copyright/*,*/SuperBuild/Copyright/*"
+# exclude maintenance, translation, license
+EXCLUDED_FILES="$EXCLUDED_FILES,*/Utilities/Maintenance/fix_typos.sh,*/fix_typos/*,LICENSE,*/i18n/*"
+
+#We use also words white list to handle deprecated classes/methods which are still there and contains some typos
+
+#This list should be updated after each release when deprecated classes/methods are removed
+# use with --words-white-list=$WORDS_WHITE_LIST
+
+#for deprecated class AssymmetricFusionOfLineDetectorImageFilter
+WORDS_WHITE_LIST="Assymmetric"
+#for deprecated method InstanciateProjection in multiple classes
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,Instanciate"
+#for deprecated method DoFinalizeInitialisation in otbGeometriesToGeometriesFilter.h
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,Initialisation"
+#for deprecated method getSubstraction
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,Substraction"
+#for deprecated method ParseFileNameForAdditonalInfo
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,Additonal"
+# for "Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France" in LabelMapToLabelImageFilter
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,Developement"
+# for deprecated method GetShrinkedOutput in otbStreamingShrinkImageFilter
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,Shrinked"
+# for dum variable in prosail
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,dum"
+# for pary variable
+WORDS_WHITE_LIST="$WORDS_WHITE_LIST,pary"
+
+python3 fix_typos/codespell/codespell.py -w -i 3 -q 2 -S $EXCLUDED_FILES \
+        --words-white-list=$WORDS_WHITE_LIST \
+        -D fix_typos/otb_dict.txt  ../..
diff --git a/i18n/CMakeLists.txt b/i18n/CMakeLists.txt
new file mode 100644
index 0000000..5df5b60
--- /dev/null
+++ b/i18n/CMakeLists.txt
@@ -0,0 +1,64 @@
+#############################################################################
+# Qt4 translations.
+#----------------------------------------------------------------------------
+# Locale human-readable translation files.
+set( OTB_TS_TRANSLATIONS
+# en_US.ts
+  fr_FR.ts
+)
+unset(OTB_QM_TRANSLATIONS)
+
+#----------------------------------------------------------------------------
+# Configuration option to enable creation/merging of source .ts files
+# Default value is: OFF.
+option( OTB_I18N_MERGE_TS
+  "Create/merge .ts source translation files. WARNING: If ON, 'make clean' will delete the .ts files from source directory!"
+  OFF
+  )
+
+#----------------------------------------------------------------------------
+if( OTBQt4_ENABLED )
+  # Generate commands to build Qt translations according to option.
+  if( OTB_I18N_MERGE_TS )
+    message(
+      AUTHOR_WARNING
+      "WARNING: OTB_I18N_MERGE_TS:BOOL option is set to ON. 'make clean' will delete .ts files from source directory!"
+      )
+
+    message( STATUS "Qt I18N source files: ${OTB_QT_I18N_SOURCE_FILES}")
+
+    set( OTB_QT_I18N_PRO "${CMAKE_CURRENT_BINARY_DIR}/i18n.pro" )
+
+    generate_qt4_project( ${OTB_QT_I18N_PRO} )
+
+    foreach(_ts_name ${OTB_TS_TRANSLATIONS})
+      get_filename_component(_abs_ts ${_ts_name} ABSOLUTE)
+
+      message( STATUS "Merge TS : ${_abs_ts}")
+      add_custom_command(OUTPUT ${_abs_ts}
+        COMMAND ${QT_LUPDATE_EXECUTABLE}
+        ARGS -locations none -pro ${OTB_QT_I18N_PRO} -ts ${_abs_ts}
+        DEPENDS
+          ${OTB_QT_I18N_HEADER_FILES}
+          ${OTB_QT_I18N_SOURCE_FILES}
+          ${OTB_QT_I18N_FORM_FILES}
+          ${OTB_QT_I18N_PRO}
+        VERBATIM)
+    endforeach()
+  endif()
+
+  qt4_add_translation(OTB_QM_TRANSLATIONS
+      ${OTB_TS_TRANSLATIONS}
+      )
+
+  # Custom build targets.
+  add_custom_target( i18n ALL DEPENDS i18n_qt )
+  add_custom_target( i18n_qt DEPENDS ${OTB_QM_TRANSLATIONS} )
+
+  # Locale human-readable translation files.
+  install(
+    FILES ${OTB_QM_TRANSLATIONS}
+    DESTINATION ${OTB_INSTALL_DATA_DIR}/i18n
+    COMPONENT Resources
+    )
+endif()
diff --git a/i18n/fr_FR.ts b/i18n/fr_FR.ts
new file mode 100644
index 0000000..3127cae
--- /dev/null
+++ b/i18n/fr_FR.ts
@@ -0,0 +1,5018 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+<context>
+    <name>ColorSetupController</name>
+    <message>
+        <source>BAND 0</source>
+        <translation type="obsolete">BANDE 0</translation>
+    </message>
+</context>
+<context>
+    <name>ColorSetupWidget</name>
+    <message>
+        <source>BAND %1</source>
+        <translation type="obsolete">BANDE %1</translation>
+    </message>
+</context>
+<context>
+    <name>DatabaseBrowserController</name>
+    <message>
+        <source>Warning!</source>
+        <translation type="obsolete">Avertissement !</translation>
+    </message>
+</context>
+<context>
+    <name>HistogramWidget</name>
+    <message>
+        <source>White</source>
+        <translation type="obsolete">Gris</translation>
+    </message>
+    <message>
+        <source>RGB</source>
+        <translation type="obsolete">RVB</translation>
+    </message>
+</context>
+<context>
+    <name>Mapla</name>
+    <message>
+        <source>Question!</source>
+        <translation type="obsolete">Question !</translation>
+    </message>
+    <message>
+        <source>The following exception has been caught while initializing the software:
+
+%1
+
+The application may not function as expected. Do you want to continue?</source>
+        <translation type="obsolete">L'exception suivante a été rattrapé pendant l'inialisation du logiciel :
+
+%1
+
+Il se peut que l'application ne fonctionne pas comme prévu. Voulez-vous continuer ?</translation>
+    </message>
+</context>
+<context>
+    <name>Monteverdi</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Monteverdi - Critical error!</source>
+        <translation type="obsolete">Monteverdi - Erreur critique !</translation>
+    </message>
+    <message>
+        <source>Error when creating repository cache-directory:
+%1
+Application will exit!</source>
+        <translation type="obsolete">Une erreur s'est produite lors de la création du répertoire de cache :
+%1
+L'application va se terminer !</translation>
+    </message>
+    <message>
+        <source>Monteverdi - Warning!</source>
+        <translation type="obsolete">Monteverdi - Avertissement !</translation>
+    </message>
+    <message>
+        <source>There are %1 outdated dataset(s) in cache-directory.
+
+Please remove cache-directory '%2' and restart Monteverdi
+
+Do you want to delete cache-directory '%2' before quitting Monteverdi?</source>
+        <translation type="obsolete">Il y a %1 jeu(x) de données obsolète(s) dans le répertoire de cache.
+
+Veuillez supprimer le répertoire de cache  '%2' avant de redémarrer Monteverdi.
+
+Voulez-vous supprimer le répertoire de cache '%2' avant de quitter Monteverdi ?</translation>
+    </message>
+    <message>
+        <source>Tryed to remove home dir.</source>
+        <translation type="obsolete">Tentative de suppression du compte utilisateur.</translation>
+    </message>
+    <message>
+        <source>Error while creating cache repository.
+
+%1
+
+Application will exit!</source>
+        <translation type="obsolete">Erreur durant la création du répertoire de cache.
+
+%1
+
+L'application va se terminer !</translation>
+    </message>
+    <message>
+        <source>Your Monteverdi cache-directory is set to your home directory '%1'. Deletion of cache-directory is aborted to avoid unrecoverable loss of all your account data.
+
+It is generally a bad idea to set Monteverdi cache-directory to your home directory. Please choose another sub-directory.
+
+Application will now exit.</source>
+        <translation type="obsolete">Le répertoire de cache Monteverdi est défini comme étant votre répertoire d'accueil '%1'. La suppression du répertoire de cache est annulée pour éviter toute perte irrémédiable de données.
+
+Il n'est générallement pas conseillé de définir le répertoire de cache de Monteverdi comment étant votre répertoire d'accueil. Veuillez, s'il vous plait, choisir un autre sous-répertoire.
+
+L'apllication va se terminer.</translation>
+    </message>
+    <message>
+        <source>Failed to open Monteverdi database.
+
+Application will now exit!
+
+%2
+
+Please, remove your Monteverdi cache-directory.</source>
+        <translation type="obsolete">Échec lors de l'ouverture de la base de données Monteverdi.
+
+L'application va se terminer !
+
+%2
+
+Veuillez, s'il vous plait, supprimer votre répertoire de cache Monteverdi.</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <source>Execute</source>
+        <translation>Exécuter</translation>
+    </message>
+    <message>
+        <source>Quit</source>
+        <translation>Quitter</translation>
+    </message>
+</context>
+<context>
+    <name>mvd</name>
+    <message>
+        <source>Chessboard</source>
+        <translation>Échiquier</translation>
+    </message>
+    <message>
+        <source>Gradient</source>
+        <translation>Gradient</translation>
+    </message>
+    <message>
+        <source>Local contrast</source>
+        <translation>Contraste local</translation>
+    </message>
+    <message>
+        <source>Local translucency</source>
+        <translation>Transparence locale</translation>
+    </message>
+    <message>
+        <source>Normal</source>
+        <translation>Normal</translation>
+    </message>
+    <message>
+        <source>Spectral angle</source>
+        <translation>Angle spectral</translation>
+    </message>
+    <message>
+        <source>Swipe (horizontal)</source>
+        <translation>Balayage (horizontal)</translation>
+    </message>
+    <message>
+        <source>Swipe (vertical)</source>
+        <translation>Balayage (vertical)</translation>
+    </message>
+    <message>
+        <source>OTB</source>
+        <translation type="obsolete">OTB</translation>
+    </message>
+    <message>
+        <source>GLSL</source>
+        <translation type="obsolete">GLSL</translation>
+    </message>
+    <message>
+        <source>Nearest</source>
+        <translation>Plus proche</translation>
+    </message>
+    <message>
+        <source>Lower bound</source>
+        <translation>Borne inférieure</translation>
+    </message>
+    <message>
+        <source>Upper bound</source>
+        <translation>Borne supérieure</translation>
+    </message>
+    <message>
+        <source>64</source>
+        <translation>64</translation>
+    </message>
+    <message>
+        <source>128</source>
+        <translation>128</translation>
+    </message>
+    <message>
+        <source>256</source>
+        <translation>256</translation>
+    </message>
+    <message>
+        <source>512</source>
+        <translation>512</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AboutDialog</name>
+    <message>
+        <source>About...</source>
+        <translation>À propos de...</translation>
+    </message>
+    <message>
+        <source>Monteverdi</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source><br /><p>Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.</p><p>See Copyright.txt for details.</p><br /><p>Monteverdi is distributed under the CeCILL licence version 2. See</p><p>Licence_CeCILL_V2-en.txt or</p><p><a href="http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt">http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt</a> for more details.&lt [...]
+        <translation></translation>
+    </message>
+    <message>
+        <source>&Close</source>
+        <translation>&Fermer</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>OTB version M.m.pl (codename)</source>
+        <translation>Version OTB M.m.pl (nom_de_code)</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractDragAndDropEventFilter</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractImageModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>BAND </source>
+        <translation>BANDE </translation>
+    </message>
+    <message>
+        <source>Red</source>
+        <translation>Rouge</translation>
+    </message>
+    <message>
+        <source>Green</source>
+        <translation>Vert</translation>
+    </message>
+    <message>
+        <source>Blue</source>
+        <translation>Bleu</translation>
+    </message>
+    <message>
+        <source>Yellow</source>
+        <translation>Jaune</translation>
+    </message>
+    <message>
+        <source>RedEdge</source>
+        <translation>RedEdge</translation>
+    </message>
+    <message>
+        <source>Coastal</source>
+        <translation>Côtier</translation>
+    </message>
+    <message>
+        <source>NIR</source>
+        <translation>PIR</translation>
+    </message>
+    <message>
+        <source>NIR1</source>
+        <translation>PIR1</translation>
+    </message>
+    <message>
+        <source>NIR2</source>
+        <translation>PIR2</translation>
+    </message>
+    <message>
+        <source>PAN</source>
+        <translation>PAN</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractLayerModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Sensor</source>
+        <translation>Capteur</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation>Inconnu</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractModelController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractViewManipulator</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::AbstractWorker</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Algorithm</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Application</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ApplicationLauncher</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Failed to instantiate OTB-application '%1'.</source>
+        <translation>Échec lors de l'instanciation de l'application OTB '%1'.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ApplicationsBrowser</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Uncategorized</source>
+        <translation>Sans catégorie</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ApplicationsToolBox</name>
+    <message>
+        <source>OTB Applications</source>
+        <translation>Applications OTB</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Search Application ...</source>
+        <translation>Recher application...</translation>
+    </message>
+    <message>
+        <source>Orfeo Toolbox Algorithms</source>
+        <translation>Applications OTB</translation>
+    </message>
+    <message>
+        <source>Title</source>
+        <translation>Titre</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ApplicationsToolBoxController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::BackgroundTask</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Worker must not be parented in order to be moved to another thread.</source>
+        <translation>La tâche (worker) doit ne pas être parenté afin d'être déplacé dans un autre fil d'exécution.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::CheckableLineEdit</name>
+    <message>
+        <source>Enabled</source>
+        <translation type="obsolete">Activé</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ColorBandDynamicsWidget</name>
+    <message>
+        <source>Form</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source><span style="color:#000000;background-color:#FF4444">&nbsp;<b>R</b>&nbsp;</span></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source><span style="color:#000000;background-color:#44FF44">&nbsp;<b>G</b>&nbsp;</span></source>
+        <translation><span style="color:#000000;background-color:#44FF44">&nbsp;<b>V</b>&nbsp;</span></translation>
+    </message>
+    <message>
+        <source><span style="color:#CCCCCC;background-color:#4444FF">&nbsp;<b>B</b>&nbsp;</span></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Low</source>
+        <translation>Bas</translation>
+    </message>
+    <message>
+        <source>High</source>
+        <translation>Haut</translation>
+    </message>
+    <message>
+        <source>Apply quantiles to all channels.</source>
+        <translation>Appliquer les quantiles à tous les canaux.</translation>
+    </message>
+    <message>
+        <source>Apply to all</source>
+        <translation type="obsolete">Appliquer à tous</translation>
+    </message>
+    <message>
+        <source>Intensity</source>
+        <translation type="obsolete">Intensité</translation>
+    </message>
+    <message>
+        <source>Set the lower intensity threshold. Values bellow this threshold will be clamped to 0.</source>
+        <translation type="obsolete">Règle le seuil bas pour l'intensité. Les valeurs en dessous de ce seuil seront clampées à 0.</translation>
+    </message>
+    <message>
+        <source>Set the higher intensity threshold. Values bellow this threshold will be clamped to 255.</source>
+        <translation type="obsolete">Règle le seuil haut pour l'intensité. Les valeurs au dessus de ce seuil seront clampées à 255.</translation>
+    </message>
+    <message>
+        <source>Set the intensity low and high thresholds to the minimum and maximum values of the current band.</source>
+        <translation>Règle les seuils bas et haut de l'intensité aux valeurs minimum et maximum pour la bande courante.</translation>
+    </message>
+    <message>
+        <source>Percentage of the band histogram beginning clipped to obtain lower intensity threshold.</source>
+        <translation>Pourcentage du début de l'histogramme de la bande qui sera ignoré pour calculer le seuil bas de l'intensité.</translation>
+    </message>
+    <message>
+        <source>%</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Percentage of the band histogram ending clipped to obtain higher intensity threshold.</source>
+        <translation>Pourcentage de la fin de l'histogramme de la bande qui sera ignoré pour calculer le seuil haut de l'intensité.</translation>
+    </message>
+    <message>
+        <source>Reset to default quantiles.</source>
+        <translation>Restaure les valeurs par défaut des quantiles.</translation>
+    </message>
+    <message>
+        <source>Defaults</source>
+        <translation type="obsolete">Défaut</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Apply all</source>
+        <translation type="obsolete">Appliquer à tous</translation>
+    </message>
+    <message>
+        <source>min/Max</source>
+        <translation>min/Max</translation>
+    </message>
+    <message>
+        <source>Quantile:</source>
+        <translation type="obsolete">Quantile:</translation>
+    </message>
+    <message>
+        <source>Intensity:</source>
+        <translation type="obsolete">Intensité:</translation>
+    </message>
+    <message>
+        <source>2%</source>
+        <translation>2%</translation>
+    </message>
+    <message>
+        <source><span style="color:#EEEEEE;background-color:#111111">&nbsp;<b>W</b>&nbsp;</span></source>
+        <translation><span style="color:#EEEEEE;background-color:#111111">&nbsp;<b>G</b>&nbsp;</span></translation>
+    </message>
+    <message>
+        <source><p>&lceil;</p></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Invalid argument '%1'.</source>
+        <translation>Argument '%1' invalide.</translation>
+    </message>
+    <message>
+        <source>Quantile percentile.</source>
+        <translation>Pourcentage de quantile.</translation>
+    </message>
+    <message>
+        <source>Q:</source>
+        <translation>Q :</translation>
+    </message>
+    <message>
+        <source>Pixel value on band.</source>
+        <translation>Valeur du pixel pour la bande.</translation>
+    </message>
+    <message>
+        <source>V:</source>
+        <translation>V :</translation>
+    </message>
+    <message>
+        <source>Red channel.</source>
+        <translation>Canal rouge.</translation>
+    </message>
+    <message>
+        <source>Green channel.</source>
+        <translation>Canal vert.</translation>
+    </message>
+    <message>
+        <source>Blue channel.</source>
+        <translation>Canal bleu.</translation>
+    </message>
+    <message>
+        <source>White (gray) channel.</source>
+        <translation>Canal blanc (niveau de gris).</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ColorDynamicsController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ColorDynamicsWidget</name>
+    <message>
+        <source>Form</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>No data: </source>
+        <translation>No data :</translation>
+    </message>
+    <message>
+        <source>Apply</source>
+        <translation>Appliquer</translation>
+    </message>
+    <message>
+        <source>Gamma:</source>
+        <translation>Gamma :</translation>
+    </message>
+    <message>
+        <source>Gamma: </source>
+        <translation>Gamma : </translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ColorSetupController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>BAND 0</source>
+        <translation>BANDE 0</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ColorSetupWidget</name>
+    <message>
+        <source>Form</source>
+        <translation></translation>
+    </message>
+    <message utf8="true">
+        <source><html><head/><body><p align="center">Image bands<br/>↓</p></body></html></source>
+        <translation><html><head/><body><p align="center">Bandes<br/>↓</p></body></html></translation>
+    </message>
+    <message>
+        <source><span style="color:#000000;background-color:#FF4444">&nbsp;<b>R</b>&nbsp;</span></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source><span><b>&larr;</b>&nbsp;</span></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>BAND 0</source>
+        <translation>BANDE 0</translation>
+    </message>
+    <message>
+        <source>BAND 1</source>
+        <translation>BANDE 1</translation>
+    </message>
+    <message>
+        <source>BAND 2</source>
+        <translation>BANDE 2</translation>
+    </message>
+    <message>
+        <source><span style="color:#000000;background-color:#44FF44">&nbsp;<b>G</b>&nbsp;</span></source>
+        <translation><span style="color:#000000;background-color:#44FF44">&nbsp;<b>V</b>&nbsp;</span></translation>
+    </message>
+    <message>
+        <source><span style="color:#CCCCCC;background-color:#4444FF">&nbsp;<b>B</b>&nbsp;</span></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>BAND %1</source>
+        <translation>BANDE %1</translation>
+    </message>
+    <message>
+        <source>Red</source>
+        <translation type="obsolete">Rouge</translation>
+    </message>
+    <message>
+        <source>Green</source>
+        <translation type="obsolete">Vert</translation>
+    </message>
+    <message>
+        <source>Blue</source>
+        <translation type="obsolete">Bleu</translation>
+    </message>
+    <message>
+        <source>Yellow</source>
+        <translation type="obsolete">Jaune</translation>
+    </message>
+    <message>
+        <source>Coastal</source>
+        <translation type="obsolete">Côtier</translation>
+    </message>
+    <message>
+        <source>NIR</source>
+        <translation type="obsolete">PIR</translation>
+    </message>
+    <message>
+        <source>NIR1</source>
+        <translation type="obsolete">PIR1</translation>
+    </message>
+    <message>
+        <source>NIR2</source>
+        <translation type="obsolete">PIR2</translation>
+    </message>
+    <message>
+        <source><span style="color:#EEEEEE;background-color:#111111">&nbsp;<b>W</b>&nbsp;</span></source>
+        <translation><span style="color:#EEEEEE;background-color:#111111">&nbsp;<b>G</b>&nbsp;</span></translation>
+    </message>
+    <message>
+        <source>Enable/disable gray-scale mode.</source>
+        <translation>Activer/désactiver le mode niveaux de gris.</translation>
+    </message>
+    <message>
+        <source>White (gray) channel.</source>
+        <translation>Canal blanc (niveau de gris).</translation>
+    </message>
+    <message>
+        <source>Red channel.</source>
+        <translation>Canal rouge.</translation>
+    </message>
+    <message>
+        <source>Green channel.</source>
+        <translation>Canal vert.</translation>
+    </message>
+    <message>
+        <source>Blue channel.</source>
+        <translation>Canal bleu.</translation>
+    </message>
+    <message>
+        <source>Alpha:</source>
+        <translation>Alpha :</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Core</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DataStream</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetCreationProgressDialog</name>
+    <message>
+        <source>Please wait while processing...</source>
+        <translation type="obsolete">Traitement en cours. Merci d'attendre...</translation>
+    </message>
+    <message>
+        <source>Importing image:</source>
+        <translation type="obsolete">Import de l'image:</translation>
+    </message>
+    <message>
+        <source>into dataset:</source>
+        <translation type="obsolete">dans le jeu de données :</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetDescriptor</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetDragAndDropEventFilter</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <translation type="obsolete">inconnu(e)</translation>
+    </message>
+    <message>
+        <source>File Informations</source>
+        <translation type="obsolete">Informations fichier</translation>
+    </message>
+    <message>
+        <source>File</source>
+        <translation type="obsolete">Fichier</translation>
+    </message>
+    <message>
+        <source>Directory</source>
+        <translation type="obsolete">Répertoire</translation>
+    </message>
+    <message>
+        <source>Size in Bytes</source>
+        <translation type="obsolete">Taille (en octets)</translation>
+    </message>
+    <message>
+        <source>Image Informations</source>
+        <translation type="obsolete">Informations image</translation>
+    </message>
+    <message>
+        <source>Dimension</source>
+        <translation type="obsolete">Dimension</translation>
+    </message>
+    <message>
+        <source>Origin</source>
+        <translation type="obsolete">Origine</translation>
+    </message>
+    <message>
+        <source>Number of components</source>
+        <translation type="obsolete">Nombre de composantes</translation>
+    </message>
+    <message>
+        <source>Block size</source>
+        <translation type="obsolete">Taille de bloc</translation>
+    </message>
+    <message>
+        <source>Placename</source>
+        <translation type="obsolete">Toponyme</translation>
+    </message>
+    <message>
+        <source>Metadatas</source>
+        <translation type="obsolete">Méta-données</translation>
+    </message>
+    <message>
+        <source>Sensor</source>
+        <translation type="obsolete">Capteur</translation>
+    </message>
+    <message>
+        <source>Default RGB</source>
+        <translation type="obsolete">RVB par défaut</translation>
+    </message>
+    <message>
+        <source>Estimated ground spacing</source>
+        <translation type="obsolete">Résolution au sol (estimée)</translation>
+    </message>
+    <message>
+        <source>Exception caught when checking version of dataset '%1': </source>
+        <translation type="obsolete">Exception rattrapée lors de la vérification de la version du jeu de données '%1':</translation>
+    </message>
+    <message>
+        <source>Exception caught when checking for version of dataset '%1': </source>
+        <translation type="obsolete">Exception rattrapée lors de la vérification de la version du dataset '%1':</translation>
+    </message>
+    <message>
+        <source>Exception caught when checking version of dataset '%1'.</source>
+        <translation type="obsolete">Exception rattrapée lors de la vérification de la version du jeu de données '%1'.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetPropertiesController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetPropertiesWidget</name>
+    <message>
+        <source>Form</source>
+        <translation type="obsolete">Formulaire</translation>
+    </message>
+    <message>
+        <source>Property</source>
+        <translation type="obsolete">Propriété</translation>
+    </message>
+    <message>
+        <source>Value</source>
+        <translation type="obsolete">Valeur</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DatasetTreeWidgetItem</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DoubleValidator</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::DropLineEdit</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::FilenameDragAndDropEventFilter</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::FilenameInterface</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::GLImageWidget</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Unable to list suppored OpenGL versions using QGLFormat. Qt version is %1. Please upgrade to Qt 4.7.0 or newer.</source>
+        <translation type="obsolete">Impossible de lister les version OpenGL supportés via QGLFormat. Qt version is %1. Veuillez actualiser Qt à la version 4.7.0 ou plus.  </translation>
+    </message>
+    <message>
+        <source>Runtime version of OpenGL used by Qt %1: %2.%3.</source>
+        <translation type="obsolete">Version OpenGL utilisée par Qt %1 : %2.%3 durant l'exécution.</translation>
+    </message>
+    <message>
+        <source>Version(s) of OpenGL supported by Qt %1:</source>
+        <translation type="obsolete">Version(s) OpenGL supportées par Qt %1:</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Gui</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::HistogramController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::HistogramModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1: Pass #1 - finding pixel min/maxes...</source>
+        <translation type="obsolete">%1: Passe #1 - Recherche des min/max des pixels...</translation>
+    </message>
+    <message>
+        <source>%1: Pass #1 - done (%2 ms).</source>
+        <translation type="obsolete">%1: Passe #1 - terminé (%2 ms).</translation>
+    </message>
+    <message>
+        <source>%1: Pass #2 - computing histogram...</source>
+        <translation type="obsolete">%1: Passe #2 - calcul de l'histogramme...</translation>
+    </message>
+    <message>
+        <source>%1: Pass #2 - done (%2 ms).</source>
+        <translation type="obsolete">%1: Passe #2 - terminé (%2 ms).</translation>
+    </message>
+    <message>
+        <source>%1: Generating histogram (M)...</source>
+        <translation>%1: Génération de l'histogramme (M)...</translation>
+    </message>
+    <message>
+        <source>%1: Histogram (M) generated (%2 ms).</source>
+        <translation type="obsolete">%1: Histogramme (M) généré (%2 ms).</translation>
+    </message>
+    <message>
+        <source>%1: Reading histogram...</source>
+        <translation>%1 : Lecture de l'histogramme...</translation>
+    </message>
+    <message>
+        <source>%1: Histogram read (%2 ms)...</source>
+        <translation>%1 : Histogramme lu (%2 ms)...</translation>
+    </message>
+    <message>
+        <source>%1: Writing histogram...</source>
+        <translation>%1 : Écriture de l'histogramme... </translation>
+    </message>
+    <message>
+        <source>%1: Histogram written (%2 ms)...</source>
+        <translation>%1 : histogram écrit (%2 ms)...</translation>
+    </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>
+    </message>
+</context>
+<context>
+    <name>mvd::HistogramPlotPicker</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::HistogramWidget</name>
+    <message>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <source>Zoom to full intensity range.</source>
+        <translation>Zoom sur l'intervale des intensités.</translation>
+    </message>
+    <message>
+        <source>Zoom to quantile ranges.</source>
+        <translation>Zoom sur l'intervale des quantiles.</translation>
+    </message>
+    <message>
+        <source>Select channel(s) to display.</source>
+        <translation>Sélectionner les cannaux à afficher.</translation>
+    </message>
+    <message>
+        <source>Red</source>
+        <translation>Rouge</translation>
+    </message>
+    <message>
+        <source>Green</source>
+        <translation>Vert</translation>
+    </message>
+    <message>
+        <source>Blue</source>
+        <translation>Bleu</translation>
+    </message>
+    <message>
+        <source>RGB</source>
+        <translation>RVB</translation>
+    </message>
+    <message>
+        <source>Histogram estimated on Quicklook.</source>
+        <translation>Histogramme estimé à partir de l'Aperçu.</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Gray</source>
+        <translation>Gris</translation>
+    </message>
+    <message>
+        <source>White</source>
+        <translation>Blanc</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::I18nApplication</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Running from build directory '%1'.</source>
+        <translation type="obsolete">Exécution depuis le répertoire de compilation '%1'.</translation>
+    </message>
+    <message>
+        <source>Running from install directory '%1'.</source>
+        <translation type="obsolete">Exécution depuis le répertoire d'installation '%1'.</translation>
+    </message>
+    <message>
+        <source>Failed to load '%1' translation file from '%2'.</source>
+        <translation type="obsolete">Échec de chargement du fichier de traduction '%1' depuis '%2'.</translation>
+    </message>
+    <message>
+        <source>Warning!</source>
+        <translation type="obsolete">Avertissement !</translation>
+    </message>
+    <message>
+        <source>Successfully loaded '%1' translation file from '%2'.</source>
+        <translation type="obsolete">Chargement réussi du fichier de traduction '%1' depuis '%2'.</translation>
+    </message>
+    <message>
+        <source>Executable dir : %1</source>
+        <translation type="obsolete">Répertoire de l'exécutable : %1</translation>
+    </message>
+    <message>
+        <source>Candidate install prefix found : %1</source>
+        <translation type="obsolete">Répertoire d'installation pontentiel trouvé : %1</translation>
+    </message>
+    <message>
+        <source>Unable to locate translation files</source>
+        <translation type="obsolete">Impossible de trouver les fichiers de traductions</translation>
+    </message>
+    <message>
+        <source>Critical error</source>
+        <translation type="obsolete">Erreur critique</translation>
+    </message>
+    <message>
+        <source>Using translation dir '%1'.</source>
+        <translation type="obsolete">Utilisation du répertoire de traduction :%1'.</translation>
+    </message>
+    <message>
+        <source>Failed to access translation-files directory '%1'</source>
+        <translation type="obsolete">Echec de l'accès au répertoire de fichiers de traduction : '%1'</translation>
+    </message>
+    <message>
+        <source>Cache directory created at %1</source>
+        <translation type="obsolete">Répertoire de cache créé dans %1</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::I18nCoreApplication</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>WARNG> %s
+</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ERROR> %s
+</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Error: </source>
+        <translation>Erreur : </translation>
+    </message>
+    <message>
+        <source>FATAL> %s
+</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Fatal error: </source>
+        <translation>Erreur fatale : </translation>
+    </message>
+    <message>
+        <source>Class 'I18nCoreApplication' instance must be provided aQCoreApplication' pointer at construction time!</source>
+        <translation type="obsolete">Il faut fournir un pointeur vers une instance de "QCoreApplication" lors de la construction d'une instance de la classe "I18nCoreApplication" !</translation>
+    </message>
+    <message>
+        <source>An error occured while loading the geoid file, no geoid file will be used.</source>
+        <translation type="obsolete">Une erreur s'est produite lors du chargement du fichier geoide, aucun fichier geoide ne sera utilisé.</translation>
+    </message>
+    <message>
+        <source>An error occured while loading the DEM directory, no DEM will be used.</source>
+        <translation type="obsolete">Une erreur s'est produite lors du chargement depuis le répertoire MNT, aucun MNT ne sera utilisé.</translation>
+    </message>
+    <message>
+        <source>Failed to locate translation files directory 'i18n' in '%1'.</source>
+        <translation>Le sous-répertoire '%1' contenant les fichiers de traduction n'a pas pu être trouvé dans le répertoire 'i18n'.</translation>
+    </message>
+    <message>
+        <source>Running from build directory '%1'.</source>
+        <translation>Exécution depuis le répertoire de compilation '%1'.</translation>
+    </message>
+    <message>
+        <source>Loading translation files from directory '%1'.</source>
+        <translation>Charement des fichiers de traduction depuis le répertoire '%1'.</translation>
+    </message>
+    <message>
+        <source>Running from install directory '%1'.</source>
+        <translation>Exécution depuis le répertoire d'installation '%1'.</translation>
+    </message>
+    <message>
+        <source>Failed to access translation-files directory '%1'</source>
+        <translation>Échec de l'accès au répertoire de fichiers de traduction : '%1'</translation>
+    </message>
+    <message>
+        <source>Failed to load '%1' translation file from '%2'.</source>
+        <translation>Échec de chargement du fichier de traduction '%1' depuis '%2'.</translation>
+    </message>
+    <message>
+        <source>Successfully loaded '%1' translation file from '%2'.</source>
+        <translation>Chargement réussi du fichier de traduction '%1' depuis '%2'.</translation>
+    </message>
+    <message>
+        <source>An error occured while loading the geoid file, no geoid file will be used: </source>
+        <translation type="obsolete">Une erreur s'est produite lors du chargement du fichier geoide, aucun fichier geoide ne sera utilisé : </translation>
+    </message>
+    <message>
+        <source>An error occured while loading the DEM directory, no DEM will be used: </source>
+        <translation type="obsolete">Une erreur s'est produite lors du chargement depuis le répertoire MNT, aucun MNT ne sera utilisé : </translation>
+    </message>
+    <message>
+        <source>Failed to remove file '%1'.</source>
+        <translation>Échec de la suppression du fichier '%1'.</translation>
+    </message>
+    <message>
+        <source>Failed to access parent directory of '%1'.</source>
+        <translation>Echec de l'accès au répertoire parent '%1'.</translation>
+    </message>
+    <message>
+        <source>Failed to remove dataset directory '%1'.</source>
+        <translation>Echec lors de la suppression du répertoire du jeu de données '%1'.</translation>
+    </message>
+    <message>
+        <source>I18nCoreApplication is a singleton class!</source>
+        <translation>I18nCoreApplication est une classe singleton !</translation>
+    </message>
+    <message>
+        <source>The selected directory seems to be an previous mvd2 directory, nevertheless we will create a new mvd2 repository into the selected directory.</source>
+        <translation type="obsolete">Le répertoire sélectionné semble être un répertoire mvd2 antérieur ; néanmoins nous allons créer un nouveau dépôt mvd2 à l'intérieur du répertoire sélectionné.</translation>
+    </message>
+    <message>
+        <source>Geoid file '%1' not found!</source>
+        <translation>Fichier géoide '%1' non trouvé !</translation>
+    </message>
+    <message>
+        <source>An error occured while loading the geoid file, no geoid file will be used:</source>
+        <translation type="obsolete">Une erreur s'est produite durant le chargement du fichier géoide, aucune géoide ne sera utilisée :</translation>
+    </message>
+    <message>
+        <source>An error occured while loading the DEM directory, no DEM will be used:</source>
+        <translation type="obsolete">Une erreur s'est produite durant le chargement du répertoire MNT, aucun MNT ne sera utilisé :</translation>
+    </message>
+    <message>
+        <source>Class 'I18nCoreApplication' instance must be provided a QCoreApplication' pointer at construction time!</source>
+        <translation>Il faut fournir un pointeur vers une instance de "QCoreApplication" lors de la construction d'une instance de la classe "I18nCoreApplication" !</translation>
+    </message>
+    <message>
+        <source>Cannot access settings file.</source>
+        <translation>Impossible d'accéder au fichiers des paramètres</translation>
+    </message>
+    <message>
+        <source>Bad settings file format.</source>
+        <translation>Mauvais format pour le fichier de paramètres</translation>
+    </message>
+    <message>
+        <source>An error occurred while loading the geoid file, no geoid file will be used:</source>
+        <translation>Erreur lors du chargement du fichier géoide, aucun géoide ne sera utilisé:</translation>
+    </message>
+    <message>
+        <source>An error occurred while loading the DEM directory, no DEM will be used:</source>
+        <translation>Erreur lors du chargement du répertoire DEM, aucun DEM ne sera utilisé:</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::I18nMainWindow</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Welcome new </source>
+        <translation type="obsolete">Bienvenu nouvel </translation>
+    </message>
+    <message>
+        <source>Do you want to specify a custom repository location?</source>
+        <translation type="obsolete">Voulez-vous définir un chemin de dépôt personnalisé ?</translation>
+    </message>
+    <message>
+        <source>Please, select directory where the </source>
+        <translation type="obsolete">Veuillez sélectionner un répertoire où </translation>
+    </message>
+    <message>
+        <source>Dataset has been modified.
+Do you want to save settings before quitting?</source>
+        <translation type="obsolete">Jeu de données modifié.
+Voulez-vous sauvegarder avant de quitter ?</translation>
+    </message>
+    <message>
+        <source>Monteverdi maintains a repository where cached data related to images is stored (such as, for example, color-settings, histogram, quicklook etc.).
+
+Default cache-directory location is: '%1'.
+
+Warning:
+- Your account needs to have write access to this directory;
+- Please be aware that this directory can consume significant disk space.</source>
+        <translation type="obsolete">Monteverdi maintient un dépôt où sont stockées des données additionnelles liées à chaque image (par exemple, réglage d'affichage, histogrammes, aperçus etc.).
+
+L'emplacement par défaut du répertoire de cache est : '%1'.
+
+Attention :
+- Vous devez posséder les droits d'écriture sur ce répertoire ;
+- Soyez conscients que ce répertoire peut grossir and consommer un espace disque significatif.</translation>
+    </message>
+    <message>
+        <source>Please, select directory where the Monteverdi cache repository will be stored.</source>
+        <translation type="obsolete">Veuillez sélectionner le répertoire où sera stocké le dépôt de Monteverdi.</translation>
+    </message>
+    <message>
+        <source>Welcome new Monteverdi user!</source>
+        <translation type="obsolete">Bienvenu, nouvel utilisateur Monteverdi !</translation>
+    </message>
+    <message>
+        <source>The selected directory already contain a mvd2 directory, no new database will be created</source>
+        <translation type="obsolete">The répertoire sélectionné contien déjà un répertoire mvd2 ; aucune nouvelle base de données ne va être créée</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageImporter</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Importing image '%1' as dataset into cache directory...</source>
+        <translation type="obsolete">Image '%1' en cours d'import comme dataset dans le répertoire de cache...</translation>
+    </message>
+    <message>
+        <source>Loading image '%1'...</source>
+        <translation>Chargement de l'image '%1'...</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageModelRenderer</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageProperties</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageSettings</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Range</source>
+        <translation>Plage</translation>
+    </message>
+    <message>
+        <source>Angle</source>
+        <translation>Angle</translation>
+    </message>
+    <message>
+        <source>Invalid argument: %1 ('%2')</source>
+        <translation type="obsolete">Argument invalide : %1 ('%2')</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageSettingsInterface</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageViewManipulator</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageViewRenderer</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Required OpenGL version '%1' with GLSL version '%2'.</source>
+        <translation>Version OpenGL nécessaire '%1' avec GLSL version '%2'.</translation>
+    </message>
+    <message>
+        <source>Runtime OpenGL version '%1' with GLSL version '%2'.</source>
+        <translation>Version OpenGL '%1' détectée avec GLSL version '%2'.</translation>
+    </message>
+    <message>
+        <source>Monteverdi - Critical error!</source>
+        <translation type="obsolete">Monteverdi - Erreur critique !</translation>
+    </message>
+    <message>
+        <source>Current OpenGL version is '%1' supporting OpenGL Shading-Language (GLSL) version '%2'.
+Required OpenGL version is at least '%3' with GLSL version at least '%4'.
+Please upgrade your graphics driver and/or hardware for the application to run properly on this platform.
+If you are running the application under some remote-desktop service, runtime OpenGL and GLSL versions may differ from those running directly on remote platform.
+Please contact your system administrator.
+Application will now exit!</source>
+        <translation type="obsolete">La version OpenGL détectée est '%1' et supporte OpenGL Shading Language (GLSL) version '%2'.
+La version OpenGL nécessaire est (au-moins) '%3' avec GLSL (au-moins) égal '%4'.
+Veuillez, s'il vous plait, mettre à jour vos pilotes de périphériques graphiques et/ou changer de carte graphiques pour que l'appliquation puisse s'exécuter correctement sur cette plateforme.
+Si vous exécutez l'application en utilisant un service de bureau à distance ou de connexion à distance, les versions OpenGL et GLSL détectées peuvent différer de celles qui sont exécutées de manières natives sur la plateforme distante.
+Veuillez, s'il vous plait, contacter votre administrateur système.
+L'application va se terminer !</translation>
+    </message>
+    <message>
+        <source>Critical error!</source>
+        <translation>Erreur critique !</translation>
+    </message>
+    <message>
+        <source>Current OpenGL version is '%1' supporting OpenGL Shading-Language (GLSL) version '%2'.
+To run at best performances, this application needs, at least, OpenGL version '%3' with GLSL version '%4'.
+The application will automatically switch to a rendering mode which does not make use of OpenGL shaders and GLSL.
+If you are running this application under some remote-desktop service, runtime OpenGL and GLSL versions may differ from those running directly on remote platform.</source>
+        <translation>La version courante d'OpenGL est '%1' et supporte OpenGL Shading Language (GLSL) version '%2'.
+Pour s'exécuter avec les meilleures perfomances, cette application a besoin, au moins, de la version OpenGL '%3' avec GLSL version '%4'.
+L'application va automatiquement basculer vers un mode de rendu qui ne fait pas usage des shaders OpenGL ni de GLSL..
+Si vous exécutez cette application via une système d'écran déporté, les version d'OpenGL et de GLSL détectées au cours de l'exécution peuvent être differente celle utilisée directement par le système.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImageViewWidget</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Unable to list suppored OpenGL versions using QGLFormat. Qt version is %1. Please upgrade to Qt 4.7.0 or newer.</source>
+        <translation type="obsolete">Impossible de lister les version OpenGL supportés via QGLFormat. Qt version is %1. Veuillez actualiser Qt à la version 4.7.0 ou plus.  </translation>
+    </message>
+    <message>
+        <source>Runtime version of OpenGL used by Qt %1: %2.%3.</source>
+        <translation>Version OpenGL utilisée par Qt %1 : %2.%3 durant l'exécution.</translation>
+    </message>
+    <message>
+        <source>Version(s) of OpenGL supported by Qt %1:</source>
+        <translation>Version(s) OpenGL supportées par Qt %1:</translation>
+    </message>
+    <message>
+        <source>Save screenshot...</source>
+        <translation>Sauvegarder une capture d'écran...</translation>
+    </message>
+    <message>
+        <source>PNG File (*.png);;JPEG File (*.jpg);;TIFF file (*tif)</source>
+        <translation>PNG File (*.png);;JPEG File (*.jpg);;TIFF file (*tif)</translation>
+    </message>
+    <message>
+        <source>Exception caught while saving screenshot into file '%1':
+
+%2</source>
+        <translation>Exeception rattrapée pendant la sauvegarde de la capture d'écran dans le fichier '%1' :
+
+%2</translation>
+    </message>
+    <message>
+        <source>Unable to list supported OpenGL versions using QGLFormat. Qt version is %1. Please upgrade to Qt 4.7.0 or newer.</source>
+        <translation>Impossible de lister les versions OpenGL supportées à partir du QGLFormat. La version de Qt est %1. Veuillez mettre à jour Qt à la version 4.7.0 ou ultérieure.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImportImagesDialog</name>
+    <message>
+        <source>Configure multi-resolution pyramid</source>
+        <translation>Configuration de la pyramide multi-resolution</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Img Size</source>
+        <translation>Taille Img</translation>
+    </message>
+    <message>
+        <source>Ovr Size</source>
+        <translation>Taille Ovr</translation>
+    </message>
+    <message>
+        <source>Filename</source>
+        <translation>Nom de fichier</translation>
+    </message>
+    <message>
+        <source>The following exception has raised when scanning file '%1' for GDAL overview settings:
+
+%2</source>
+        <translation>L'exception suivante a étée lancée pendant la lecture du fichier '%1' pour détecter le paramétrage des overview GDAL :
+
+%2</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ImportSubDatasetDialog</name>
+    <message>
+        <source>Import image</source>
+        <translation>Importer image</translation>
+    </message>
+    <message>
+        <source>Dataset</source>
+        <translation>Jeu de données</translation>
+    </message>
+    <message>
+        <source>All</source>
+        <translation>Tous</translation>
+    </message>
+    <message>
+        <source>None</source>
+        <translation>Aucun</translation>
+    </message>
+    <message>
+        <source>Invert</source>
+        <translation>Inverser</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Index</source>
+        <translation>Index</translation>
+    </message>
+    <message>
+        <source>Desc</source>
+        <translation>Desc</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>Nom</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::KeymapDialog</name>
+    <message>
+        <source>About...</source>
+        <translation>À propos de...</translation>
+    </message>
+    <message>
+        <source>Monteverdi</source>
+        <translation>Monteverdi</translation>
+    </message>
+    <message>
+        <source>Version M.m.pl (codename)</source>
+        <translation>Version M.m.pl (codename)</translation>
+    </message>
+    <message utf8="true">
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Droid Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Keyboard and mouse shortcut mappings</span></p>
+<table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="0">
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Main window</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">O</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Open file(s)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quit application</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Histogram view</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Left-button horizontal-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Read histogram values</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Middle-button vertical-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale histogram view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Right-button horizontal-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shift histogram-view towards lo high</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale histogram-view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Image View</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Click in to set focus)</p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust effect brush size</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust effect parameter value</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotate layers</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom in out</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shift dynamics range towards low/high</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale dynamics range around it's mean value</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust translucency</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust gamma correction</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll view</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll up</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll down</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll left</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll right</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll up</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll down</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll left</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll right</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom in</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom out</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to full resolution (1:1)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to selected layer extent</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to all layers extent</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete selected layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete all layers</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Home</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select previous layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">End</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select next layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Home</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select first layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">End</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select last layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Up</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer up within stack</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Down</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer down within stack</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Up</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer to top of stack</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Down</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer to bottom of stack</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply selected layer settings to <span style=" font-weight:600;">A</span>ll layers</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use selected layer <span style=" font-weight:600;">P</span>rojection as reference projection</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply 2% <span style=" font-weight:600;">Q</span>uantiles to viewed area of selected image layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply 2% <span style=" font-weight:600;">Q</span>uantiles to full area of selected image layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">C</span>hessboard effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">D</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to local <span style=" font-weight:600;">D</span>ynamics or local contrast effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">G</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">G</span>radient effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">H</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">H</span>orizontal swipe effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">N</span>o effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">S</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">S</span>pectral angle effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">T</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to local <span style=" font-weight:600;">T</span>ranslucency effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">V</span>ertical swipe effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Layer Stack</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete selected layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete all layers</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotate layers up/down</p></td></tr></table></body></html></source>
+        <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Droid Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Raccourcis clavier et souris</span></p>
+<table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="0">
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Fenêtre Principale</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">O</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ouvrir fichier(s)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quitter application</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vue Histogramme</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer horizontal avec le bouton Gauche</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lecture des valeurs de l'histogramme</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer avec le bouton du Milieu</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Modifier l'échelle de la vue histogramme</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer horizontal avec le bouton Droite</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faire défiler la vue histogramme vers les basses/hautes valeurs</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Modifier l'échelle de la vue histogramme</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vue Image</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Cliquer dans la vue pour prendre le focus)</p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajouter la taille du pinceau de l'effet</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajuster la valeur du paramètre de l'effet</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotation circulaire des couches dans de la pile</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom avant/arrière</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Décaler la bande de dynamique vers le bas/haut</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changer l'échelle de la bande de dynamique autour de sa valeur moyenne</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajuster la transparence</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajuster la correction Gamma</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer la vue</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement la vue</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers le haut</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers le bas</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers la gauche</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers la droite</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement vers le haut</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement vers le bas</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement vers la gauche</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dépalcer rapidement vers la droite</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom avant</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom arrière</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoomer à la résolution (1:1)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoomer sur l'étendue de la couche sélectionnée</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoomer sur l'étendue de toutes les couches</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer la couche sélectionnée</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer tous les couches</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Début</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sélectionner la couche précédente</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Fin</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selectionner la couche suivante</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Début</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selectionner la première couche</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Fin</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selectionner la dernière couche</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Précédente</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer la couche sélectionnée vers la haut de la pile</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Suivante</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer la couche vers la bas de la pile</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Précédente</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Placer la couche au sommet de la pile</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Suivante</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Placer la couche au-dessous de la pile</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Appliquer les paramètres de la couche sélectionnée à toutes (<span style=" font-weight:600;">A</span>ll) les couches</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choisir la couche sélectionnée comme <span style=" font-weight:600;">P</span>rojection de référence</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Appliquer les <span style=" font-weight:600;">Q</span>uantiles 2% à la région visualisée de la couche image sélectionnée</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Appliquer les <span style=" font-weight:600;">Q</span>uantiles 2% à toute l'étendue de la couche image sélectionnée</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet échiquier (<span style=" font-weight:600;">C</span>hessboard)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">D</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">D</span>ynamique locale ou contraste local</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">G</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">G</span>radient</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">H</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet balayage <span style=" font-weight:600;">H</span>orizontal</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">N</span>ormal</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">S</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet angle <span style=" font-weight:600;">S</span>pectral</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">T</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">T</span>ransparence locale</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet balayage <span style=" font-weight:600;">V</span>ertical</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pile de couche</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer la couche sélectionnée</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer toutes les couches</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotation circulaire de toutes les couches vers le bas/haut</p></td></tr></table></body></html></translation>
+    </message>
+    <message>
+        <source>&Close</source>
+        <translation>&Fermer</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message utf8="true">
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Droid Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Keyboard and mouse shortcut mappings</span></p>
+<table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="0">
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Main window</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">O</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Open file(s)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quit application</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Histogram view</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Left-button horizontal-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Read histogram values</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Middle-button vertical-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale histogram view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Right-button horizontal-drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shift histogram-view towards lo high</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale histogram-view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Image View</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Click in to set focus)</p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">P</span>rint image-view (screenshot)</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick <span style=" font-weight:600;">P</span>rint image-view (quick screenshot)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust effect brush size</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust effect parameter value</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom in out</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotate layers</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shift dynamics range towards low/high</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale dynamics range around it's mean value</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust translucency</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjust gamma correction</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll view</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse drag</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll view</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll up</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll down</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll left</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scroll right</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll up</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll down</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll left</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quick scroll right</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom in</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom out</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to full resolution (1:1)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to selected layer extent</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom to all layers extent</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete selected layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete all layers</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Home</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select previous layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">End</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select next layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Home</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select first layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">End</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select last layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Up</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer up within stack</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Down</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer down within stack</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Up</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer to top of stack</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Down</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move layer to bottom of stack</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply selected layer settings to <span style=" font-weight:600;">A</span>ll layers</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use selected layer <span style=" font-weight:600;">P</span>rojection as reference projection</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply 2% <span style=" font-weight:600;">Q</span>uantiles to viewed area of selected image layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apply 2% <span style=" font-weight:600;">Q</span>uantiles to full area of selected image layer</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">C</span>hessboard effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">D</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to local <span style=" font-weight:600;">D</span>ynamics or local contrast effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">G</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">G</span>radient effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">H</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">H</span>orizontal swipe effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">N</span>o effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">S</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">S</span>pectral angle effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">T</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to local <span style=" font-weight:600;">T</span>ranslucency effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch to <span style=" font-weight:600;">V</span>ertical swipe effect</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Layer Stack</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Key</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete selected layer</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Delete all layers</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mouse wheel</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotate layers up/down</p></td></tr></table></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Droid Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Raccourcis clavier et souris</span></p>
+<table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="0">
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Fenêtre Principale</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">O</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ouvrir fichier(s)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Quitter application</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vue Histogramme</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer horizontal avec le bouton Gauche</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lecture des valeurs de l'histogramme</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer avec le bouton du Milieu</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Modifier l'échelle de la vue histogramme</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer horizontal avec le bouton Droite</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faire défiler la vue histogramme vers les basses/hautes valeurs</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Modifier l'échelle de la vue histogramme</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vue Image</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Cliquer dans la vue pour prendre le focus)</p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ca<span style=" font-weight:600;">p</span>turer de la vue image dans un fichier (screenshot)</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ca<span style=" font-weight:600;">p</span>ture rapide de la vue image dans un fichier (quick screenshot)</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajouter la taille du pinceau de l'effet</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajuster la valeur du paramètre de l'effet</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom avant/arrière</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotation circulaire des couches dans de la pile</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Décaler la bande de dynamique vers le bas/haut</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+ALT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changer l'échelle de la bande de dynamique autour de sa valeur moyenne</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajuster la transparence</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">META+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajuster la correction Gamma</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer la vue</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presser-Tirer</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement la vue</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers le haut</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers le bas</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers la gauche</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer vers la droite</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↑</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement vers le haut</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">↓</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement vers le bas</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">←</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer rapidement vers la gauche</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">→</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dépalcer rapidement vers la droite</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom avant</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoom arrière</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoomer à la résolution (1:1)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoomer sur l'étendue de la couche sélectionnée</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zoomer sur l'étendue de toutes les couches</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer la couche sélectionnée</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer tous les couches</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Début</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sélectionner la couche précédente</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Fin</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selectionner la couche suivante</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Début</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selectionner la première couche</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Fin</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Selectionner la dernière couche</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Précédente</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer la couche sélectionnée vers la haut de la pile</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Suivante</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Déplacer la couche vers la bas de la pile</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Précédente</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Placer la couche au sommet de la pile</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Page Suivante</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Placer la couche au-dessous de la pile</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Appliquer les paramètres de la couche sélectionnée à toutes (<span style=" font-weight:600;">A</span>ll) les couches</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choisir la couche sélectionnée comme <span style=" font-weight:600;">P</span>rojection de référence</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Appliquer les <span style=" font-weight:600;">Q</span>uantiles 2% à la région visualisée de la couche image sélectionnée</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Q</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Appliquer les <span style=" font-weight:600;">Q</span>uantiles 2% à toute l'étendue de la couche image sélectionnée</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet échiquier (<span style=" font-weight:600;">C</span>hessboard)</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">D</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">D</span>ynamique locale ou contraste local</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">G</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">G</span>radient</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">H</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet balayage <span style=" font-weight:600;">H</span>orizontal</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">N</span>ormal</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">S</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet angle <span style=" font-weight:600;">S</span>pectral</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">T</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet <span style=" font-weight:600;">T</span>ransparence locale</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Activer l'effet balayage <span style=" font-weight:600;">V</span>ertical</p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pile de couche</span></p></td>
+<td></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Touche</span></p></td>
+<td>
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Action</span></p></td></tr>
+<tr>
+<td></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer la couche sélectionnée</p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SHIFT+</p></td>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suppression</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Supprimer toutes les couches</p></td></tr>
+<tr>
+<td></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CTRL+</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Molette</p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rotation circulaire de toutes les couches vers le bas/haut</p></td></tr></table></body></html></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::LayerStackController</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::LayerStackItemModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Proj</source>
+        <translation>Proj</translation>
+    </message>
+    <message>
+        <source>Res</source>
+        <translation>Rés</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>Nom</translation>
+    </message>
+    <message>
+        <source>Effect</source>
+        <translation>Effet</translation>
+    </message>
+    <message>
+        <source>I</source>
+        <translation>I</translation>
+    </message>
+    <message>
+        <source>J</source>
+        <translation>J</translation>
+    </message>
+    <message>
+        <source>Red</source>
+        <translation>Rouge</translation>
+    </message>
+    <message>
+        <source>Green</source>
+        <translation>Vert</translation>
+    </message>
+    <message>
+        <source>Blue</source>
+        <translation>Bleu</translation>
+    </message>
+    <message>
+        <source>X</source>
+        <translation>X</translation>
+    </message>
+    <message>
+        <source>Y</source>
+        <translation>Y</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::LayerStackWidget</name>
+    <message>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <source>Move selected layer to top of stack</source>
+        <translation>Déplacer la couche sélectionnée au sommet de la pile</translation>
+    </message>
+    <message>
+        <source>Move selected layer up within the stack</source>
+        <translation>Déplacer la couche sélectionnée vers le haut de la pile</translation>
+    </message>
+    <message>
+        <source>Move selected layer down within the stack</source>
+        <translation>Déplacer la couche sélectionnée vers bas de la pile</translation>
+    </message>
+    <message>
+        <source>Move selected layer to bottom of stack</source>
+        <translation>Déplacer la couche sélectionnée au-dessous de la pile</translation>
+    </message>
+    <message>
+        <source>Use selected layer as projection reference</source>
+        <translation>Utiliser la projection de la couche sélectionnée comme projection de référence</translation>
+    </message>
+    <message>
+        <source>Apply all display settings (color-setup, color-dynamics, shader etc.) of selected layer to all other layers</source>
+        <translation>Appliquer tous les paramètres (composition colorée, dynamique, effets etc.) de la couche sélectionnée aux autres couches.</translation>
+    </message>
+    <message>
+        <source>Reload data file</source>
+        <translation>Recharger le fichier de données</translation>
+    </message>
+    <message>
+        <source>Delete all layers</source>
+        <translation>Supprimer toutes les couches</translation>
+    </message>
+    <message>
+        <source>Delete selected layer</source>
+        <translation>Supprimer la couche sélectionnée</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MainWindow</name>
+    <message>
+        <source>Open file...</source>
+        <translation>Ouvrir fichier...</translation>
+    </message>
+    <message>
+        <source>Main window</source>
+        <translation>Fenêtre principale</translation>
+    </message>
+    <message>
+        <source>&File</source>
+        <translation>&Fichier</translation>
+    </message>
+    <message>
+        <source>Main toolbar</source>
+        <translation>Barre d'outils principale</translation>
+    </message>
+    <message>
+        <source>&Quit</source>
+        <translation>&Quitter</translation>
+    </message>
+    <message>
+        <source>Quit application.</source>
+        <translation>Quitter l'application.</translation>
+    </message>
+    <message>
+        <source>Ctrl+Q</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>&Open...</source>
+        <translation type="obsolete">&Ouvrir...</translation>
+    </message>
+    <message>
+        <source>Open...</source>
+        <translation type="obsolete">Ouvrir...</translation>
+    </message>
+    <message>
+        <source>Open file.</source>
+        <translation type="obsolete">Ouvrir fichier.</translation>
+    </message>
+    <message>
+        <source>Ctrl+O</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Location</source>
+        <translation type="obsolete">Localisation</translation>
+    </message>
+    <message>
+        <source>&Edit</source>
+        <translation>Éditio&n</translation>
+    </message>
+    <message>
+        <source>Prefere&nces</source>
+        <translation>Préfére&nces</translation>
+    </message>
+    <message>
+        <source>&View</source>
+        <translation>&Affichage</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>&Help</source>
+        <translation>Aid&e</translation>
+    </message>
+    <message>
+        <source>About...</source>
+        <translation>À propos de...</translation>
+    </message>
+    <message>
+        <source>&About...</source>
+        <translation>&À propos de...</translation>
+    </message>
+    <message>
+        <source>Quicklook</source>
+        <translation type="obsolete">Aperçu</translation>
+    </message>
+    <message>
+        <source>Quicklook (show/hide).</source>
+        <translation type="obsolete">Aperçu (montrer/cacher).</translation>
+    </message>
+    <message>
+        <source>Video color setup</source>
+        <translation type="obsolete">Choix des canaux</translation>
+    </message>
+    <message>
+        <source>Video color setup (show/hide).</source>
+        <translation type="obsolete">Choix des canaux (montrer/cacher).</translation>
+    </message>
+    <message>
+        <source>Video color dynamics</source>
+        <translation type="obsolete">Réglage de la dynamique</translation>
+    </message>
+    <message>
+        <source>Video color dynamics (show/hide).</source>
+        <translation type="obsolete">Réglage de la dynamique (montrer/cacher).</translation>
+    </message>
+    <message>
+        <source> bands, </source>
+        <translation type="obsolete"> bandes, </translation>
+    </message>
+    <message>
+        <source>Warning</source>
+        <translation type="obsolete">Attention</translation>
+    </message>
+    <message>
+        <source>This repository seems incorrect to store the cache directory.
+Please choose another one.</source>
+        <translation type="obsolete">Ce répertoire semble incorrect pour stocker le répertoire de cache.
+Merci d'en choisir un autre.</translation>
+    </message>
+    <message>
+        <source>Monteverdi 2 maintains a repository to store additional data related to each image (display settings, histogram, quicklook...).
+
+Warning:
+You need to have write access to this directory.
+Be aware that this directory can grow and consume a significant disk space.</source>
+        <translation type="obsolete">Monteverdi maintient un répertoire pour stocker des données additionnelles liées à chaque image (réglage d'affichage, histogrammes, aperçus...).
+
+Attention:
+Vous devez posséder les droits d'écriture sur ce répertoire.
+Soyez conscients que ce répertoire peut grossir and consommer un espace disque significatif.</translation>
+    </message>
+    <message>
+        <source>Do you want to specify a custom location ?
+(No will use the default location: %1)</source>
+        <translation type="obsolete">Voulez-vous spécifier un emplacement personnalisé ?
+('Non' utilisera l'emplacement par défaut : %1)</translation>
+    </message>
+    <message>
+        <source>Select the repository to store the cache repository for Monteverdi</source>
+        <translation type="obsolete">Sélectionnez le répertoire où stocker le cache de Monteverdi</translation>
+    </message>
+    <message>
+        <source>Error</source>
+        <translation type="obsolete">Erreur</translation>
+    </message>
+    <message>
+        <source>Dataset has been modified.
+Do you want to save settings before quitting?</source>
+        <translation type="obsolete">Jeu de données modifié.
+Voulez-vous sauvegarder avant de quitter ?</translation>
+    </message>
+    <message>
+        <source>&Open image...</source>
+        <translation type="obsolete">&Ouvrir image...</translation>
+    </message>
+    <message>
+        <source>Open image...</source>
+        <translation type="obsolete">Nouvelle image...</translation>
+    </message>
+    <message>
+        <source>Open image-file.</source>
+        <translation type="obsolete">Nouveau fichier image.</translation>
+    </message>
+    <message>
+        <source>Zoom in</source>
+        <translation>Zoomer</translation>
+    </message>
+    <message>
+        <source>Zoom out</source>
+        <translation>Dézoomer</translation>
+    </message>
+    <message>
+        <source>Zoom to image extent</source>
+        <translation type="obsolete">Zoomer sur l'étendue</translation>
+    </message>
+    <message>
+        <source>Zoom to full resolution</source>
+        <translation type="obsolete">Zoomer à pleine résolution</translation>
+    </message>
+    <message>
+        <source>Tool bar</source>
+        <translation>Barre d'outils</translation>
+    </message>
+    <message>
+        <source>Database browser</source>
+        <translation type="obsolete">Navigateur de base de données</translation>
+    </message>
+    <message>
+        <source>Pixel Description</source>
+        <translation>Description pixel</translation>
+    </message>
+    <message>
+        <source>Dataset properties</source>
+        <translation type="obsolete">Propriétés du dataset</translation>
+    </message>
+    <message>
+        <source>OTB Applications browser</source>
+        <translation type="obsolete">Applications OTB</translation>
+    </message>
+    <message>
+        <source>Quicklook view</source>
+        <translation>Aperçu</translation>
+    </message>
+    <message>
+        <source>Color setup</source>
+        <translation>Choix des canaux</translation>
+    </message>
+    <message>
+        <source>Color dynamics</source>
+        <translation>Réglage de la dynamique</translation>
+    </message>
+    <message>
+        <source>Image view</source>
+        <translation>Vue image</translation>
+    </message>
+    <message>
+        <source>Tab cannot be closed while OTB application is running.</source>
+        <translation>L'onglet de l'application OTB ne peut pas être fermé lors de l'exécution de l'application OTB.</translation>
+    </message>
+    <message>
+        <source>Welcome new Montevedi2 user !</source>
+        <translation type="obsolete">Bienvenu, nouvel utilisateur Monteverdi !</translation>
+    </message>
+    <message>
+        <source>Import image-file.</source>
+        <translation>Importer fichier image.</translation>
+    </message>
+    <message>
+        <source>&Import image...</source>
+        <translation type="obsolete">&Importer image...</translation>
+    </message>
+    <message>
+        <source>Import image...</source>
+        <translation type="obsolete">Importer image...</translation>
+    </message>
+    <message>
+        <source>Ctrl++</source>
+        <translation>Ctrl++</translation>
+    </message>
+    <message>
+        <source>Ctrl+-</source>
+        <translation>Ctrl+-</translation>
+    </message>
+    <message>
+        <source>Monteverdi - Warning!</source>
+        <translation type="obsolete">Monteverdi - Avertissement !</translation>
+    </message>
+    <message>
+        <source>Histogram</source>
+        <translation>Histogramme</translation>
+    </message>
+    <message>
+        <source>Quicklook view (Ice)</source>
+        <translation type="obsolete">Apperçu (Ice)</translation>
+    </message>
+    <message>
+        <source>Image view (Ice)</source>
+        <translation type="obsolete">Vue image (Ice)</translation>
+    </message>
+    <message>
+        <source>Database browser (test)</source>
+        <translation type="obsolete">Navigateur de base de données</translation>
+    </message>
+    <message>
+        <source>Render-mode toolbar</source>
+        <translation>Barre d'outils Rendu</translation>
+    </message>
+    <message>
+        <source>Selected layer effect toolbar</source>
+        <translation>Barre d'outils Couche sélectionnée</translation>
+    </message>
+    <message>
+        <source>&Open image(s)...</source>
+        <translation>&Ouvrir image(s)...</translation>
+    </message>
+    <message>
+        <source>Open image(s)...</source>
+        <translation>Ouvrir image(s)...</translation>
+    </message>
+    <message>
+        <source>Open image file(s).</source>
+        <translation>Ouverture fichier(s) image.</translation>
+    </message>
+    <message>
+        <source>Zoom to full extent</source>
+        <translation>Zoomer à l'étendu complète</translation>
+    </message>
+    <message>
+        <source>3</source>
+        <translation>3</translation>
+    </message>
+    <message>
+        <source>Zoom to full resolution (1:1)</source>
+        <translation>Zoomer à pleine résolution (1:1)</translation>
+    </message>
+    <message>
+        <source>1</source>
+        <translation>1</translation>
+    </message>
+    <message>
+        <source>Zoom to layer extent</source>
+        <translation>Zoomer à l'étendu de la couche sélectionnée</translation>
+    </message>
+    <message>
+        <source>2</source>
+        <translation>2</translation>
+    </message>
+    <message>
+        <source>&Keymap...</source>
+        <translation>&Raccourcis claviers et souris...</translation>
+    </message>
+    <message>
+        <source>Display keyboard and mouse key mapping</source>
+        <translation>Afficher les raccourcis clavier et souris</translation>
+    </message>
+    <message>
+        <source>Enable OTB_USE_QT4 preprocessor definition at compile time!</source>
+        <translation type="obsolete">Activer la définition de pré-processeur OTB_USE_QT4 lors de la compilation !</translation>
+    </message>
+    <message>
+        <source>Layer stack</source>
+        <translation>Pile de couche</translation>
+    </message>
+    <message>
+        <source>Proj</source>
+        <translation>Proj</translation>
+    </message>
+    <message>
+        <source>Select projection used as reference for the view.</source>
+        <translation>Sélectionner la projection de la couche comme projection de référence.</translation>
+    </message>
+    <message>
+        <source>Layer FX</source>
+        <translation>Effet</translation>
+    </message>
+    <message>
+        <source>Exception caught while checking Spatial Reference Type of image-file '%1':
+
+%2</source>
+        <translation>Exception rattrapée durant la vérification des métadonnées de géo-référencement du fichier image '%1': %2</translation>
+    </message>
+    <message>
+        <source>Warning!</source>
+        <translation>Avertissement !</translation>
+    </message>
+    <message>
+        <source>No projection information (geographical or cartographical coordinate-system or sensor model) has been found for image. While already loaded images all have some, they are displayed in a geo-referenced view.
+
+Loading '%1' will cause the display to switch to a non geo-referenced view (where images are displayed relatively regarding their origin and spacing).</source>
+        <translation>Aucune information de projection (système de coordonnées geographiques ou cartographiques, ou modèle capteur) n'a été trouvé pour l'image. Comme les images déjà chargés en ont toutes un, elles sont affichées dans une vue géo-référencée.
+
+Charger '%1' provoquera l'affichage des couches dans une vue non géo-référencée (où les images seront positionnées relativement à leur origine et leur espacement pixel).</translation>
+    </message>
+    <message>
+        <source>Select layer...</source>
+        <translation>Choisir une couche...</translation>
+    </message>
+    <message>
+        <source>(%1 %2 ; %3 %4 ; %5)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>[ R: %1 ; G: %2 ; B: %3 ]</source>
+        <translation>[ R: %1 ; V: %2 ; B: %3 ]</translation>
+    </message>
+    <message>
+        <source>Load OTB-&Applications</source>
+        <translation type="obsolete">Charger les OTB-&Applications</translation>
+    </message>
+    <message>
+        <source>Ctrl+A</source>
+        <translation>Ctrl+A</translation>
+    </message>
+    <message>
+        <source>Some files have been loaded. Are you sure you want to quit?</source>
+        <translation>Plusieurs fichiers ont été chargés. Êtes-vous sûr de vouloir quitter ?</translation>
+    </message>
+    <message>
+        <source>OTB-Applications browser</source>
+        <translation>Navigateur d'OTB-Applications</translation>
+    </message>
+    <message>
+        <source>Save screenshot</source>
+        <translation>Sauvegarder une capture d'écran</translation>
+    </message>
+    <message>
+        <source>Take screenshot of image-view and save it into file</source>
+        <translation>Prendre une capture d'écran de la vue image et la sauvegarder dans un fichier</translation>
+    </message>
+    <message>
+        <source>Ctrl+P</source>
+        <translation>Ctrl+P</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MainWindowTitleLoader</name>
+    <message>
+        <source> bands, </source>
+        <translation> bandes, </translation>
+    </message>
+    <message>
+        <source> pixels)</source>
+        <translation> pixels)</translation>
+    </message>
+    <message>
+        <source>Location</source>
+        <translation>Localisation</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MaplaApplication</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MaplaMainWindow</name>
+    <message>
+        <source>Main window</source>
+        <translation>Fenêtre principale</translation>
+    </message>
+    <message>
+        <source>&File</source>
+        <translation>&Fichier</translation>
+    </message>
+    <message>
+        <source>&Help</source>
+        <translation>Aid&e</translation>
+    </message>
+    <message>
+        <source>&Edit</source>
+        <translation>Éditio&n</translation>
+    </message>
+    <message>
+        <source>&Quit</source>
+        <translation>&Quitter</translation>
+    </message>
+    <message>
+        <source>Quit application.</source>
+        <translation>Quitter l'application.</translation>
+    </message>
+    <message>
+        <source>Ctrl+Q</source>
+        <translation>Ctrl+Q</translation>
+    </message>
+    <message>
+        <source>&Import image...</source>
+        <translation>&Importer image...</translation>
+    </message>
+    <message>
+        <source>Import image...</source>
+        <translation>Importer une image...</translation>
+    </message>
+    <message>
+        <source>Import image-file.</source>
+        <translation>Importer un fichier image.</translation>
+    </message>
+    <message>
+        <source>Ctrl+O</source>
+        <translation>Ctrl+O</translation>
+    </message>
+    <message>
+        <source>&About...</source>
+        <translation>&À propos de...</translation>
+    </message>
+    <message>
+        <source>About...</source>
+        <translation>À propos de...</translation>
+    </message>
+    <message>
+        <source>Prefere&nces</source>
+        <translation>Préfére&nces</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Enable OTB_USE_QT4 preprocessor definition at compile time!</source>
+        <translation>Activer la définition de pré-processeur OTB_USE_QT4 lors de la compilation !</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Math</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ModifiableInterface</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MultiResolutionPyramidWidget</name>
+    <message>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <source>File format used for overview file</source>
+        <translation>Format du fichier Overview</translation>
+    </message>
+    <message>
+        <source>Format:</source>
+        <translation>Format :</translation>
+    </message>
+    <message>
+        <source>Decimation factor = Base power Level</source>
+        <translation>Facteur de décimation = Base puissance Niveau</translation>
+    </message>
+    <message>
+        <source>Base:</source>
+        <translation>Base :</translation>
+    </message>
+    <message>
+        <source>Size list of all overview levels</source>
+        <translation>Liste de la taille de tous les niveaux d'Overview</translation>
+    </message>
+    <message>
+        <source>Algorithm used when resampling image to compute overview level</source>
+        <translation>Algorithme utilisé pendant le ré-échantillonage de l'image pour calculer le niveau d'Overview</translation>
+    </message>
+    <message>
+        <source>Algorithm:</source>
+        <translation>Algorithme :</translation>
+    </message>
+    <message>
+        <source>Levels:</source>
+        <translation>Niveaux :</translation>
+    </message>
+    <message>
+        <source>Algorithm used to compress overview level data</source>
+        <translation>Algorithme utilisé pour compresser les niveaux d'Overview</translation>
+    </message>
+    <message>
+        <source>Compression:</source>
+        <translation>Compression :</translation>
+    </message>
+    <message>
+        <source>Minimal size (in pixels) of smallest overview level</source>
+        <translation>Taille minimale (en pixels) du niveau d'Overview le plus petit</translation>
+    </message>
+    <message>
+        <source>Size:</source>
+        <translation>Taille :</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>None</source>
+        <translation>Aucun</translation>
+    </message>
+    <message>
+        <source>Nearest</source>
+        <translation>Plus proche</translation>
+    </message>
+    <message>
+        <source>Gauss</source>
+        <translation>Gauss</translation>
+    </message>
+    <message>
+        <source>Cubic</source>
+        <translation>Cubique</translation>
+    </message>
+    <message>
+        <source>Average</source>
+        <translation>Moyen</translation>
+    </message>
+    <message>
+        <source>Mode</source>
+        <translation>Mode</translation>
+    </message>
+    <message>
+        <source>Average Mag/Phase</source>
+        <translation>Mag/Phase moyenne</translation>
+    </message>
+    <message>
+        <source>JPEG</source>
+        <translation>JPEG</translation>
+    </message>
+    <message>
+        <source>LZW</source>
+        <translation>LZW</translation>
+    </message>
+    <message>
+        <source>PACKBITS</source>
+        <translation>PACKBITS</translation>
+    </message>
+    <message>
+        <source>DEFLATE</source>
+        <translation>DEFLATE</translation>
+    </message>
+    <message>
+        <source>ERDAS</source>
+        <translation>ERDAS</translation>
+    </message>
+    <message>
+        <source>GeoTIFF</source>
+        <translation>GeoTIFF</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MyClass</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::MyWidget</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::OTBApplicationsModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::OverviewBuilder</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Generting overviews for file %1/%2 '%3'.</source>
+        <translation>Génération des Overview pour le fichier %1/%2 '%3'.</translation>
+    </message>
+    <message>
+        <source>Preparing to build GDAL overviews...</source>
+        <translation>Préparation à la construction des Overview GDAL...</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::PixelDescriptionWidget</name>
+    <message>
+        <source>Pixel Description</source>
+        <translation>Description pixel</translation>
+    </message>
+    <message>
+        <source>Description</source>
+        <translation>Description</translation>
+    </message>
+    <message>
+        <source>Value</source>
+        <translation>Valeur</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Geographic</source>
+        <translation>Géographique</translation>
+    </message>
+    <message>
+        <source>Pixel Values</source>
+        <translation>Valeurs pixel</translation>
+    </message>
+    <message>
+        <source>X</source>
+        <translation>X</translation>
+    </message>
+    <message>
+        <source>Y</source>
+        <translation>Y</translation>
+    </message>
+    <message>
+        <source>Long</source>
+        <translation>Long</translation>
+    </message>
+    <message>
+        <source>Lat</source>
+        <translation>Lat</translation>
+    </message>
+    <message>
+        <source>Elevation</source>
+        <translation>Élévation</translation>
+    </message>
+    <message>
+        <source>Not available</source>
+        <translation>Non disponible</translation>
+    </message>
+    <message>
+        <source>Band %1</source>
+        <translation>Bande %1</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::PreferencesDialog</name>
+    <message>
+        <source>Preferences</source>
+        <translation>Préférences</translation>
+    </message>
+    <message>
+        <source>General Settings</source>
+        <translation>Réglages généraux</translation>
+    </message>
+    <message>
+        <source>Cache directory</source>
+        <translation type="obsolete">Répertoire de cache</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Select the repository to store the cache repository for Monteverdi</source>
+        <translation type="obsolete">Sélectionnez le répertoire où stocker le cache de Monteverdi</translation>
+    </message>
+    <message>
+        <source>Warning</source>
+        <translation type="obsolete">Attention</translation>
+    </message>
+    <message>
+        <source>This repository '%1' seems incorrect to store the cache directory.
+Please choose another one.</source>
+        <translation type="obsolete">Le répertoire '%1' semble incorrect pour stocker le cache.
+Merci d'en sélectionner un autre.</translation>
+    </message>
+    <message>
+        <source>Location of user dataset-repository.</source>
+        <translation type="obsolete">Localisation du dépôt de dataset utilisateur.</translation>
+    </message>
+    <message>
+        <source>Results directory</source>
+        <translation>Répertoire de résultats</translation>
+    </message>
+    <message>
+        <source>Default directory for results data</source>
+        <translation>Répertoire par défaut pour les données résultats</translation>
+    </message>
+    <message>
+        <source>Elevation Management</source>
+        <translation>Gestion de l'élévation</translation>
+    </message>
+    <message>
+        <source>Geoid File            </source>
+        <translation>Fichier géoïde</translation>
+    </message>
+    <message>
+        <source>SRTM Directory</source>
+        <translation type="obsolete">Répertoire MNT</translation>
+    </message>
+    <message>
+        <source>Select the directory containing SRTM tiles.</source>
+        <translation type="obsolete">Veuillez choisir le répertoire contenant les tuiles SRTM.</translation>
+    </message>
+    <message>
+        <source>Select a geoid file.</source>
+        <translation>Vuilez choisir un fichier geoïde.</translation>
+    </message>
+    <message>
+        <source>Select the default directory for results data: </source>
+        <translation>Veuillez choisir le répertoire par défaut pour les données résultats:</translation>
+    </message>
+    <message>
+        <source>DEM directory</source>
+        <translation>Répertoire MNT</translation>
+    </message>
+    <message>
+        <source>Select the directory containing DEM files.</source>
+        <translation>Sélectionner un répertoire contenant les fichiers MNT.</translation>
+    </message>
+    <message>
+        <source>Geoid file has changed since application has been started. This setting needs the application to be restarted to be taken into account.</source>
+        <translation>Le fichier géoide a été changé depuis le démarrage de l'application. Ce paramètrage nécessite un redémarrage de l'application.</translation>
+    </message>
+    <message>
+        <source>The following exception has been caught when setting up Elevation Settings:
+
+%1</source>
+        <translation>L'exception suivante a été rattrapée lors de l'application des paramètres d'élevation :</translation>
+    </message>
+    <message>
+        <source>Rendering</source>
+        <translation>Rendu</translation>
+    </message>
+    <message>
+        <source>Tile size</source>
+        <translation type="obsolete">Taille de tuile</translation>
+    </message>
+    <message>
+        <source>Pixel</source>
+        <translation type="obsolete">Pixel</translation>
+    </message>
+    <message>
+        <source>Resolution</source>
+        <translation type="obsolete">Résolution</translation>
+    </message>
+    <message>
+        <source>OTB filter</source>
+        <translation type="obsolete">Filtre OTB</translation>
+    </message>
+    <message>
+        <source>OpenGL shader</source>
+        <translation type="obsolete">OpenGL shader</translation>
+    </message>
+    <message>
+        <source>Size of the image-tile which is loaded when view shifts to an unloaded area.</source>
+        <translation>Taille de la tuille de l'image qui est chargée lorsque la vue se décalle sur une zone non chargée.</translation>
+    </message>
+    <message>
+        <source>Image tile size</source>
+        <translation>Taille de la tuile image</translation>
+    </message>
+    <message>
+        <source>Method to choose level of resolution pyramid when scale is between two levels</source>
+        <translation>Méthode permettant de choisir le niveau dans la pyramide multi-résolution lorsque l'échelle se trouve entre deux niveaux.</translation>
+    </message>
+    <message>
+        <source>Level of resolution pyramid</source>
+        <translation>Niveau dans la pyramide de multi-résolution</translation>
+    </message>
+    <message>
+        <source>GDAL Overviews</source>
+        <translation>Overviews GDAL</translation>
+    </message>
+    <message>
+        <source>Generate</source>
+        <translation>Générer</translation>
+    </message>
+    <message>
+        <source>Minimum size:</source>
+        <translation>Taille minimum :</translation>
+    </message>
+    <message>
+        <source>pixel(s)</source>
+        <translation>pixel(s)</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ProcessObjectObserver</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ProgressInterface</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::QuicklookModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::QuicklookViewManipulator</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::QuicklookViewRenderer</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::SearchableTreeWidget</name>
+    <message>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::SerializableInterface</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::ShaderWidget</name>
+    <message>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <source>Select effect to apply to selected layer.</source>
+        <translation>Sélectioner l'effet à appliquer à la couche.</translation>
+    </message>
+    <message>
+        <source>Size:</source>
+        <translation>Taille :</translation>
+    </message>
+    <message>
+        <source>Edit effect-brush size.</source>
+        <translation>Edition de la taille du pinceau de l'effet.</translation>
+    </message>
+    <message>
+        <source>Value:</source>
+        <translation>Valeur :</translation>
+    </message>
+    <message>
+        <source>Edit effect-parameter value.</source>
+        <translation>Edition de la valeur de paramètre de l'effet.</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>mvd</source>
+        <translation>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>
+        <translation>Les effets de rendu ont étés désactivés car le niveau de l'OpenGL Shading Language minimal requis n'a pas été atteint pendant l'exécution sur ce système.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::StackedLayerModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Cannot insert NULL AbstractLayerModel.</source>
+        <translation>Impossible d'insérer un AbstractLayerModel NULL.</translation>
+    </message>
+    <message>
+        <source>Failed to generate string key for '%1'.</source>
+        <translation>Échec lors de la génération de la chaîne de caractère clé pour '%1'.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::StatusBarWidget</name>
+    <message>
+        <source>Index:</source>
+        <translation type="obsolete">Indice:</translation>
+    </message>
+    <message>
+        <source>Physical: [xxx, yyy]</source>
+        <translation type="obsolete">Physique: [xxx, yyy]</translation>
+    </message>
+    <message>
+        <source>WGS84: [lon, lat]</source>
+        <translation type="obsolete">WGS84: [lon, lat]</translation>
+    </message>
+    <message>
+        <source>Radiometry: [0 1 2]</source>
+        <translation type="obsolete">Radiométrie: [0 1 2]</translation>
+    </message>
+    <message>
+        <source>Zoom Level:</source>
+        <translation type="obsolete">Niveau de zoom:</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Position</source>
+        <translation>Position</translation>
+    </message>
+    <message>
+        <source>Radiometry</source>
+        <translation>Radiométrie</translation>
+    </message>
+    <message>
+        <source>Zoom Level</source>
+        <translation>Niveau de zoom</translation>
+    </message>
+    <message>
+        <source>Ice rendering mode (OpenGL texture or GLSL if using OpenGL Shading Language)</source>
+        <translation>Mode de rendu de Ice (OpenGL texture ou GLSL si OpenGL Shading Language est utilisé)</translation>
+    </message>
+    <message>
+        <source>GLSL</source>
+        <translation>GLSL</translation>
+    </message>
+    <message>
+        <source>OpenGL</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Current zoom-level of view, relative to reference layer (projection and spacing).</source>
+        <translation>Niveau de zoom courant de la vue, relativement à la couche de référence (projection et espacement).</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::SystemError</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>System error %1: '%2'.</source>
+        <translation type="obsolete">Erreur système %1: '%2.</translation>
+    </message>
+    <message>
+        <source>System error %1: '%2' %3.</source>
+        <translation type="obsolete">Erruur système %1: '%2' %3.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::TaskProgressDialog</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1 - Warning!</source>
+        <translation>%1 - Avertissement !</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::TextStream</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></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>
+    </message>
+    <message>
+        <source>Invalid tag name '%1'.</source>
+        <translation>Nom d'étiquette invalide '%1'.</translation>
+    </message>
+    <message>
+        <source>Array dimension (%1) does not match expected dimension (%2).</source>
+        <translation>Les dimensions du tableau (%1) ne correspondent pas aux dimensions attendues (%2).</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>
+    </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>
+    </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>
+    </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>
+    </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>
+    </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>
+    </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>
+    </message>
+</context>
+<context>
+    <name>mvd::TreeWidget</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::TreeWidgetItem</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::TreeWidgetItemDragAndDropEventFilter</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Types</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::VectorImageModel</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Overviews creation: </source>
+        <translation>Création de la pyramide multi-résolution : </translation>
+    </message>
+    <message>
+        <source>Physical</source>
+        <translation>Physique</translation>
+    </message>
+    <message>
+        <source>Radiometry</source>
+        <translation type="obsolete">Radiométrie</translation>
+    </message>
+    <message>
+        <source>The ImageIO used to read this file doesn't support Overviews.</source>
+        <translation type="obsolete">Ce format de fichier ne permet pas d'utiliser les pyramides multi-résolution.</translation>
+    </message>
+    <message>
+        <source>The ImageIO used to read this file supports overviews.</source>
+        <translation>Ce format de fichier permet d'utiliser les pyramides multi-résolution.</translation>
+    </message>
+    <message>
+        <source>The file doesn't have overviews.</source>
+        <translation>Le fichier n'a pas de pyramides multi-résolution.</translation>
+    </message>
+    <message>
+        <source>Caching of overviews.</source>
+        <translation type="obsolete">Mise en cache de la pyramide multi-résolution.</translation>
+    </message>
+    <message>
+        <source>Letting GDAL decimate the file on-the-fly !</source>
+        <translation>GDAL va décimer le fichier à la volée !</translation>
+    </message>
+    <message>
+        <source>The file already has overviews !</source>
+        <translation type="obsolete">Le fichier a déjà une pyramide multi-résolution !</translation>
+    </message>
+    <message>
+        <source>OTB can not read this file ('%1').
+Please check.</source>
+        <translation type="obsolete">OTB ne peut pas lire le fichier ('%1').
+Merci de vérifier.</translation>
+    </message>
+    <message>
+        <source>The overviews creation failed.
+Navigation in resolution will be slower.</source>
+        <translation>La création de la pyramide multi-résolution a échoué.
+La navigation en résolution sera plus lente.</translation>
+    </message>
+    <message>
+        <source>The file already has overviews!</source>
+        <translation type="obsolete">Le fichier a déjà une pyramide multi-résolution !</translation>
+    </message>
+    <message>
+        <source>Cartographic</source>
+        <translation>Cartographique</translation>
+    </message>
+    <message>
+        <source>Geographic(exact)</source>
+        <translation>Geographique (exact)</translation>
+    </message>
+    <message>
+        <source>Geographic(sensor model)</source>
+        <translation>Geographique (modèle capteur)</translation>
+    </message>
+    <message>
+        <source>No geoinfo</source>
+        <translation>Pas d'info géo</translation>
+    </message>
+    <message>
+        <source>Exception caught when validating file '%1': </source>
+        <translation>Exception rattrapée lors de la validation du fichier '%1' : </translation>
+    </message>
+    <message>
+        <source>File '%1' cannot be read by OTB.</source>
+        <translation>OTB ne peut pas lire le fichier '%1'.</translation>
+    </message>
+    <message>
+        <source>Radiometry: [ </source>
+        <translation>Radiométrie : [ </translation>
+    </message>
+</context>
+<context>
+    <name>mvd::VectorImageSettings</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Invalid argument: %1 ('%2')</source>
+        <translation>Argument invalide : %1 ('%2')</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::VideoColorToolBox</name>
+    <message>
+        <source>Video color</source>
+        <translation>Réglage de la couleur</translation>
+    </message>
+    <message>
+        <source>Video color setup</source>
+        <translation>Choix des canaux</translation>
+    </message>
+    <message>
+        <source>Video color dynamics</source>
+        <translation>Réglage de la dynamique</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::VisibleInterface</name>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Wrapper::QtWidgetFileSelection</name>
+    <message>
+        <source>Drag and drop a dataset here.</source>
+        <translation type="obsolete">Glisser-déposer un jeu de données ici.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Wrapper::QtWidgetInputImageParameter</name>
+    <message>
+        <source>Drag and drop a dataset here.</source>
+        <translation type="obsolete">Glisser-déposer un jeu de données ici.</translation>
+    </message>
+</context>
+<context>
+    <name>mvd::Wrapper::QtWidgetView</name>
+    <message>
+        <source>Are you sure you want to overwrite file '%1'?</source>
+        <translation>Êtes-vous certain de vouloir écraser le fichier '%1' ?</translation>
+    </message>
+    <message>
+        <source>'%1' has failed with return status %2.
+Please refer to '%1' documentation and check log tab.</source>
+        <translation>L'exécution de '%1' a échoué avec le code de retour %2..
+Veuillez, s'il vous plait, vous référer à la documentation de '%1' et vérifier l'onglet du journal.</translation>
+    </message>
+    <message>
+        <source>'%1' has succeeded with return status %2.
+Result(s) will be imported as dataset(s).
+Please check '%1' log tab.</source>
+        <translation type="obsolete">L'exécution de '%1' a réussi avec le code de retour %2.
+Les résultats seront importés en tant que jeu de données.
+Veuillez, s'il vous plait, vérifier l'onglet du journal de '%1'.</translation>
+    </message>
+    <message>
+        <source></source>
+        <comment>Necessary for lupdate to be aware of C++ namespaces. Context comment for translator.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>'%1' has succeeded.
+Result(s) will be imported as dataset(s).
+</source>
+        <translation type="obsolete">'%1' exécuté avec succès.
+Le(s) résultat(s) vont être importés en tant que jeu de données.</translation>
+    </message>
+    <message>
+        <source>Warning!</source>
+        <translation>Avertissement !</translation>
+    </message>
+    <message>
+        <source>OTB-Application '%1' cannot be closed while running!</source>
+        <translation>Impossible de fermer l'OTB-Application '%1' pendant sont exéution !</translation>
+    </message>
+    <message>
+        <source>Following files will be overwritten. Are you sure you want to continue?
+- %1</source>
+        <translation>Les fichiers suivants vont êtres écrasés. Êtes vous sür de vouloir continuer ? - %1</translation>
+    </message>
+    <message>
+        <source>File '%1' is being viewed in </source>
+        <translation>Le fichier '%1' est en cours de visualisation dans </translation>
+    </message>
+    <message>
+        <source>Following files are being viewed in </source>
+        <translation>Les fichiers suivants sont en cours de visualisation dans </translation>
+    </message>
+</context>
+</TS>

-- 
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