diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
index 3293c3ad1f229e6af4ff39755c11f348e869038a..a2fc5e2549333380e9b2cca755f2cacf3f43eeea 100644
--- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
+++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx
@@ -106,6 +106,11 @@ private:
     SetDefaultParameterFloat("lms", 4.);
     MandatoryOff("lms");
 
+    AddParameter(ParameterType_Float, "fv", "Fill Value");
+    SetParameterDescription("fv","Fill value for area outside the reprojected image");
+    SetDefaultParameterFloat("fv", 0.);
+    MandatoryOff("fv");
+
     AddParameter(ParameterType_OutputImage,  "out",   "Output image");
     SetParameterDescription("out","Output reprojected image.");
 
@@ -210,8 +215,8 @@ private:
     
     FloatVectorImageType::PixelType defaultValue;
     itk::NumericTraits<FloatVectorImageType::PixelType>::SetLength(defaultValue, movingImage->GetNumberOfComponentsPerPixel());
+    defaultValue.Fill(GetParameterFloat("fv"));
 
-    
     if(GetParameterString("mode")=="default")
       {
       if(IsParameterEnabled("lms"))
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
index 38d511a2ca3b9ab38c56529d1bc238af2aadbf14..51cef1b3d9c74b4054c2c8eb47ec99a40ba5cfc8 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.h
@@ -78,7 +78,6 @@ public:
                               const RegionType& region) ITK_OVERRIDE;
 
   itkGetMacro(TileSizeAlignment, unsigned int);
-  itkSetMacro(TileSizeAlignment, unsigned int);
 
   itkGetMacro(TileDimension, unsigned int);
 
@@ -246,6 +245,9 @@ private:
 
   /** The shrink factor */
   unsigned int m_ShrinkFactor;
+
+  /** The offset to get the cell center */
+  IndexType m_Offset;
 }; // end of class PersistentStatisticsVectorImageFilter
 
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
index d20cd23bb9b90f355a6ef6cc3ba573682ca82f9a..df3082cce1c204d7228c1a48c7a74d03da54956c 100644
--- a/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbStreamingShrinkImageFilter.txx
@@ -43,7 +43,7 @@ StreamingShrinkStreamingManager<TImage>::PrepareStreaming( itk::DataObject * inp
 {
   typedef otb::StreamingShrinkImageRegionSplitter TileSplitterType;
   TileSplitterType::Pointer splitter = TileSplitterType::New();
-  splitter->SetTileSizeAlignment(m_ShrinkFactor);
+  splitter->SetShrinkFactor(m_ShrinkFactor);
   this->m_Splitter = splitter;
 
   unsigned long nbDivisions = this->EstimateOptimalNumberOfDivisions(input, region, 0);
@@ -125,6 +125,9 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
                                            inputSpacing = inputPtr->GetSpacing();
   const typename InputImageType::SizeType& inputSize
     = inputPtr->GetLargestPossibleRegion().GetSize();
+  const typename InputImageType::IndexType& inputIndex
+    = inputPtr->GetLargestPossibleRegion().GetIndex();
+  typename InputImageType::IndexType startIndex;
 
   typename OutputImageType::SpacingType shrunkOutputSpacing;
   typename OutputImageType::RegionType  shrunkOutputLargestPossibleRegion;
@@ -134,12 +137,14 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
 
   for (unsigned int i = 0; i < OutputImageType::ImageDimension; ++i)
     {
+    startIndex[i] = inputIndex[i] + (m_ShrinkFactor - 1) / 2;
+    if (m_ShrinkFactor > inputSize[i])
+      startIndex[i] = inputIndex[i] + (inputSize[i] - 1) / 2;
+    m_Offset[i] = startIndex[i] % m_ShrinkFactor;
     shrunkOutputSpacing[i] = inputSpacing[i] * static_cast<double>(m_ShrinkFactor);
     shrunkOutputSize[i] = inputSize[i] > m_ShrinkFactor ? inputSize[i] / m_ShrinkFactor : 1;
     
-    shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] *
-      (static_cast<double>(inputPtr->GetLargestPossibleRegion().GetIndex(i)) - 0.5)
-      + shrunkOutputSpacing[i] * 0.5;
+    shrunkOutputOrigin[i] = inputPtr->GetOrigin()[i] + inputSpacing[i] * startIndex[i];
 
     // we choose to output a region with a start index [0,0]
     // the origin is set accordingly
@@ -184,12 +189,12 @@ PersistentShrinkImageFilter<TInputImage, TOutputImage>
     {
     const IndexType& inIndex = inIt.GetIndex();
     // TODO the pixel value should be taken near the centre of the cell, not at the corners
-    if (inIndex[0] % m_ShrinkFactor == 0
-        && inIndex[1] % m_ShrinkFactor == 0 )
+    if ((inIndex[0] - m_Offset[0]) % m_ShrinkFactor == 0
+        && (inIndex[1] - m_Offset[1]) % m_ShrinkFactor == 0 )
       {
       IndexType shrunkIndex;
-      shrunkIndex[0] = inIndex[0] / m_ShrinkFactor;
-      shrunkIndex[1] = inIndex[1] / m_ShrinkFactor;
+      shrunkIndex[0] = (inIndex[0] - m_Offset[0]) / m_ShrinkFactor;
+      shrunkIndex[1] = (inIndex[1] - m_Offset[1]) / m_ShrinkFactor;
       if (m_ShrunkOutput->GetLargestPossibleRegion().IsInside(shrunkIndex))
         m_ShrunkOutput->SetPixel(shrunkIndex, inIt.Get());
       }
diff --git a/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx b/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx
index e1e2064c29a8155856e442209a750553efdba5b9..dbbb0c7036835d77cbaf84123d880e888514f76e 100644
--- a/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/src/otbStreamingShrinkImageFilter.cxx
@@ -27,23 +27,24 @@ StreamingShrinkImageRegionSplitter
   unsigned int theoricalNbPixelPerTile = region.GetNumberOfPixels() / requestedNumber;
   unsigned int theoricalTileDimension = static_cast<unsigned int> (vcl_sqrt(static_cast<double>(theoricalNbPixelPerTile)) );
 
-  // Take the previous multiple of m_TileSizeAlignment (eventually generate more splits than requested)
-  m_TileDimension = theoricalTileDimension / m_TileSizeAlignment * m_TileSizeAlignment;
+  // Take the previous multiple of m_ShrinkFactor (eventually generate more splits than requested)
+  m_TileDimension = theoricalTileDimension / m_ShrinkFactor * m_ShrinkFactor;
 
-  // Minimal tile size is m_TileSizeAlignment * m_TileSizeAlignment
-  if (m_TileDimension < m_TileSizeAlignment)
+  // Minimal tile size is m_ShrinkFactor * m_ShrinkFactor
+  if (m_TileDimension < m_ShrinkFactor)
     {
-    otbMsgDevMacro(<< "Using the minimal tile size : " << m_TileSizeAlignment << " * " << m_TileSizeAlignment);
-    m_TileDimension = m_TileSizeAlignment;
+    otbMsgDevMacro(<< "Using the minimal tile size : " << m_ShrinkFactor << " * " << m_ShrinkFactor);
+    m_TileDimension = m_ShrinkFactor;
     }
 
-  // Use the computed tile size, and generate (m_TileDimension * 1) tiles
   const SizeType&  regionSize = region.GetSize();
-  m_SplitsPerDimension[0] = (regionSize[0] + m_TileDimension - 1) / m_TileDimension;
-  m_SplitsPerDimension[1] = regionSize[1] / m_TileSizeAlignment;
+  // Compute the alignment of the sampling grid
+  m_TileSizeAlignment = (m_ShrinkFactor - 1) / 2;
+  if (m_ShrinkFactor > regionSize[1]) m_TileSizeAlignment = (regionSize[1] - 1)/2;
 
-  if (m_SplitsPerDimension[1] == 0)
-    m_SplitsPerDimension[1] = 1;
+  // Use the computed tile size, and generate (m_TileDimension * 1) tiles
+  m_SplitsPerDimension[0] = (regionSize[0] + m_TileDimension - 1) / m_TileDimension;
+  m_SplitsPerDimension[1] = (regionSize[1] - m_TileSizeAlignment - 1) / m_ShrinkFactor + 1;
 
   unsigned int numPieces = 1;
   for (unsigned int j = 0; j < ImageDimension; ++j)
@@ -82,7 +83,7 @@ StreamingShrinkImageRegionSplitter
 
   // Transform the split index to the actual coordinates
   splitRegion.SetIndex(0, region.GetIndex(0) + m_TileDimension * splitIndex[0]);
-  splitRegion.SetIndex(1, region.GetIndex(1) + m_TileSizeAlignment * splitIndex[1]);
+  splitRegion.SetIndex(1, region.GetIndex(1) + m_ShrinkFactor * splitIndex[1] + m_TileSizeAlignment);
 
   splitRegion.SetSize(0, m_TileDimension);
   splitRegion.SetSize(1, 1);
@@ -98,6 +99,7 @@ StreamingShrinkImageRegionSplitter
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   Superclass::PrintSelf(os, indent);
+  os << indent << "ShrinkFactor       : " << m_ShrinkFactor << std::endl;
   os << indent << "SplitsPerDimension : " << m_SplitsPerDimension << std::endl;
   os << indent << "TileDimension      : " << m_TileDimension << std::endl;
   os << indent << "TileSizeAlignment  : " << m_TileSizeAlignment << std::endl;
diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
index 121ed2b588e3a292140643a04ca305dbed1e5e00..934e2d480ae6437846280be21c23aa476054a9b7 100644
--- a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
+++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
@@ -50,15 +50,23 @@ SamplingRateCalculator
   MapRateType::iterator it = m_RatesByClass.begin();
   for (; it != m_RatesByClass.end() ; ++it)
     {
-    if (smallestNbofSamples > it->second.Tot)
+    if (it->second.Tot)
       {
-      smallestNbofSamples = it->second.Tot;
+      if (smallestNbofSamples > it->second.Tot)
+        {
+        smallestNbofSamples = it->second.Tot;
+        }
+      }
+    else
+      {
+      otbWarningMacro("Ignoring empty class " << it->first);
       }
     }
-  // Check if there is an empty class
-  if (smallestNbofSamples == 0UL)
+  // Check if there is at least one non-empty class
+  if (smallestNbofSamples == itk::NumericTraits<unsigned long>::max())
     {
-    otbWarningMacro("There is an empty class, sample size is set to zero!");
+    otbWarningMacro("There are only empty classes, sample size is set to zero!");
+    smallestNbofSamples = 0UL;
     }
   this->SetNbOfSamplesAllClasses( smallestNbofSamples );
 }
@@ -70,7 +78,15 @@ SamplingRateCalculator
   MapRateType::iterator it = m_RatesByClass.begin();
   for (; it != m_RatesByClass.end() ; ++it)
     {
-    it->second.Required = dRequiredNbSamples;
+    if (it->second.Tot)
+      {
+      it->second.Required = dRequiredNbSamples;
+      }
+    else
+      {
+      // ignore empty classes
+      it->second.Required = 0UL;
+      }
     this->UpdateRate(it->first);
     }
 }
diff --git a/Modules/Visualization/MonteverdiGui/CMakeLists.txt b/Modules/Visualization/MonteverdiGui/CMakeLists.txt
index 73d8b00def4c69928e012d52803148695bebba76..37f9984e1ddbabc5b30532cf9802c06bfee4d2d0 100644
--- a/Modules/Visualization/MonteverdiGui/CMakeLists.txt
+++ b/Modules/Visualization/MonteverdiGui/CMakeLists.txt
@@ -7,4 +7,44 @@ set( OTBMonteverdiGUI_INCLUDE_DIRS
   ${OTBMonteverdiGUI_BINARY_DIR}/src
   )
 
+
+set(OTBMonteverdiGUI_DATA_DIR "${CMAKE_SOURCE_DIR}/Utilities/Data")
+
+if (UNIX AND NOT APPLE)
+  # -------------------------
+  # Install icons
+  # following freedesktop recommandations
+  # http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
+
+  # The different icon sizes installed
+  # According to the specs, the 48x48 icon is mandatory, others are optional
+  set( icon_sizes 16 32 48 128 )
+  foreach( icon_size ${icon_sizes} )
+    install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-${icon_size}x${icon_size}.png
+      DESTINATION share/icons/hicolor/${icon_size}x${icon_size}/apps
+      RENAME monteverdi.png)
+  endforeach()
+
+  # Fallback on "/usr/share/pixmaps"
+  # See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-32x32.png
+    DESTINATION share/pixmaps
+    RENAME monteverdi.png)
+
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-splash.png
+    DESTINATION share/pixmaps
+    RENAME monteverdi-splash.png)
+
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/Icons/monteverdi-32x32.xpm
+    DESTINATION share/pixmaps
+    RENAME monteverdi.xpm)
+
+  # -------------------------
+  # Install freedesktop entry
+
+  install(FILES ${OTBMonteverdiGUI_DATA_DIR}/monteverdi.desktop
+    DESTINATION share/applications)
+
+endif()
+
 otb_module_impl()
diff --git a/SuperBuild/CMake/External_libsvm.cmake b/SuperBuild/CMake/External_libsvm.cmake
index e385aa3c640a72aee6f0ca2637231982259c2628..34789c84b4481ed1282b270d7ba05f9b5a7c99c2 100644
--- a/SuperBuild/CMake/External_libsvm.cmake
+++ b/SuperBuild/CMake/External_libsvm.cmake
@@ -4,8 +4,8 @@ SETUP_SUPERBUILD(LIBSVM)
 
 ExternalProject_Add(LIBSVM
   PREFIX LIBSVM
-  URL "https://github.com/cjlin1/libsvm/archive/v320.tar.gz"
-  URL_MD5 b735fce96fc634f1d7e26b586181e1a4
+  URL "https://github.com/cjlin1/libsvm/archive/v322.tar.gz"
+  URL_MD5 d9617d29efad013573f63ca9a517f490
   BINARY_DIR ${LIBSVM_SB_BUILD_DIR}
   DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
   INSTALL_DIR ${SB_INSTALL_PREFIX}
diff --git a/Utilities/Data/CMakeLists.txt b/Utilities/Data/CMakeLists.txt
deleted file mode 100644
index d4060576ab3db7625996ddce4a2d2ee30e1735ed..0000000000000000000000000000000000000000
--- a/Utilities/Data/CMakeLists.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-if (UNIX AND NOT APPLE)
-
-# -------------------------
-# Install icons
-# following freedesktop recommandations
-# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
-
-# The different icon sizes installed
-# According to the specs, the 48x48 icon is mandatory, others are optional
-set( icon_sizes 16 32 48 128 )
-foreach( icon_size ${icon_sizes} )
-  install(FILES Icons/monteverdi-${icon_size}x${icon_size}.png
-          DESTINATION share/icons/hicolor/${icon_size}x${icon_size}/apps
-          RENAME monteverdi.png
-          COMPONENT Resources)
-endforeach()
-
-# Fallback on "/usr/share/pixmaps"
-# See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout
-install(FILES Icons/monteverdi-32x32.png
-        DESTINATION share/pixmaps
-        RENAME monteverdi.png
-        COMPONENT Resources)
-
-install(FILES Icons/monteverdi-splash.png
-        DESTINATION share/pixmaps
-        RENAME monteverdi-splash.png
-        COMPONENT Resources)
-
-
-install(FILES Icons/monteverdi-32x32.xpm
-        DESTINATION share/pixmaps
-        RENAME monteverdi.xpm
-        COMPONENT Resources)
-
-# -------------------------
-# Install freedesktop entry
-
-install(FILES monteverdi.desktop
-        DESTINATION share/applications
-        COMPONENT Resources)
-
-endif()