diff --git a/CMakeLists.txt b/CMakeLists.txt
index f1b0d6002bd3cb3fd1b8996baec47d89dfa730fd..c31d605bd28213d887e01e20bb954b5bdd8c0342 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -392,6 +392,17 @@ endif()
 # Provide an option for generating documentation.
 add_subdirectory(Utilities/Doxygen)
 
+#----------------------------------------------------------------------
+# Provide a target to generate the SuperBuild archive (only for Unix)
+if(UNIX)
+  add_custom_target(SuperBuild-archive
+    COMMAND ./SuperbuildDownloadList.sh
+      ${OTB_BINARY_DIR}/Download
+      ${OTB_BINARY_DIR}
+    WORKING_DIRECTORY ${OTB_SOURCE_DIR}/Utilities/Maintenance
+    )
+endif()
+
 # TODO cleanup
 # 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.
diff --git a/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h b/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h
index 528144e916d3c06135cdb501bd37487718c5042d..7e51a0c79178a1e1e0489cd45eb0c797e6311343 100644
--- a/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h
+++ b/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h
@@ -107,9 +107,29 @@ public:
   /** return true if the directoty contain DEM */
   virtual bool IsValidDEMDirectory(const char* DEMDirectory);
 
-  /** Open geoid file. */
-  virtual void OpenGeoidFile(const char* geoidFile);
-  virtual void OpenGeoidFile(const std::string& geoidFile);
+  /**
+   * \brief Open geoid file given its filename or throw an exception
+   * if geoid-file could not be loaded.
+   *
+   * \param geoidFile The filename of the geoid-file.
+   *
+   * \return <code>true</code> if geoid file has been changed or
+   * <code>false</code> if geod-file have been set before and could
+   * not be changed.
+   */
+  virtual bool OpenGeoidFile(const char* geoidFile);
+
+  /**
+   * \brief Open geoid file given its filename or throw an exception
+   * if geoid-file could not be loaded.
+   *
+   * \param geoidFile The filename of the geoid-file.
+   *
+   * \return <code>true</code> if geoid file has been changed or
+   * <code>false</code> if geod-file have been set before and could
+   * not be changed.
+   */
+  virtual bool OpenGeoidFile(const std::string& geoidFile);
 
   /** Compute the height above MSL(Mean Sea Level) of a geographic point. */
   virtual double GetHeightAboveMSL(double lon, double lat) const;
@@ -125,6 +145,11 @@ public:
   /** Set the default height above ellipsoid in case no information is available*/
   double GetDefaultHeightAboveEllipsoid() const;
 
+  /**
+   * \return The number of elevation databases in the
+   * <code>ossimElevManager</code>.
+   */
+  unsigned int GetDEMCount() const;
 
   /** Get DEM directory */
   std::string GetDEMDirectory(unsigned int idx = 0) const;
@@ -132,14 +157,18 @@ public:
   /** Get Goid file */
   std::string GetGeoidFile() const;
 
+  /**
+   * \brief Remove all the ossimElevationDatabases from the
+   * <code>ossimElevManager</code>.
+   */
+  void ClearDEMs();
+
 protected:
   DEMHandler();
   virtual ~DEMHandler() {}
 
   void PrintSelf(std::ostream& os, itk::Indent indent) const;
 
-  ossimElevManager* m_ElevManager;
-
   // Ossim does not allow to retrieve the geoid file path
   // We therefore must keep it on our side
   std::string m_GeoidFile;
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx b/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx
index 79b352417c22648288dc5a537bf99707a5f24a09..71b94952260fdcba5b6ed9f65a784976b1eaa3e1 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx
@@ -18,6 +18,8 @@
 #include "otbDEMHandler.h"
 #include "otbMacro.h"
 
+#include <cassert>
+
 #include "ossim/elevation/ossimElevManager.h"
 #include "ossim/base/ossimGeoidManager.h"
 #include "ossim/base/ossimFilename.h"
@@ -49,23 +51,25 @@ DEMHandler::Pointer DEMHandler::Instance()
 
 DEMHandler
 ::DEMHandler() :
-  m_ElevManager(ossimElevManager::instance()),
   m_GeoidFile(""),
   m_DefaultHeightAboveEllipsoid(0)
 {
-  m_ElevManager->setDefaultHeightAboveEllipsoid(m_DefaultHeightAboveEllipsoid);
+  assert( ossimElevManager::instance()!=NULL );
+
+  ossimElevManager::instance()->setDefaultHeightAboveEllipsoid(m_DefaultHeightAboveEllipsoid);
   // Force geoid fallback
-  m_ElevManager->setUseGeoidIfNullFlag(true);
+  ossimElevManager::instance()->setUseGeoidIfNullFlag(true);
 }
 
 void
 DEMHandler
 ::OpenDEMDirectory(const char* DEMDirectory)
 {
-  ossimFilename ossimDEMDir;
-  ossimDEMDir = ossimFilename(DEMDirectory);
+  assert( ossimElevManager::instance()!=NULL );
+
+  ossimFilename ossimDEMDir( DEMDirectory );
 
-  if (!m_ElevManager->loadElevationPath(ossimDEMDir))
+  if (!ossimElevManager::instance()->loadElevationPath(ossimDEMDir))
     {
     // In ossim elevation database factory code, the
     // ossimImageElevationDatabase is explicitly disabled by a #if 0
@@ -82,11 +86,22 @@ DEMHandler
     else
       {
       otbMsgDevMacro(<< "DEM directory contains general elevation image files: " << ossimDEMDir);
-      m_ElevManager->addDatabase(imageElevationDatabase.get());
+      ossimElevManager::instance()->addDatabase(imageElevationDatabase.get());
       }
     }
 }
 
+
+void
+DEMHandler
+::ClearDEMs()
+{
+  assert( ossimElevManager::instance()!=NULL );
+
+  ossimElevManager::instance()->clear();
+}
+
+
 void
 DEMHandler
 ::OpenDEMDirectory(const std::string& DEMDirectory)
@@ -98,8 +113,10 @@ bool
 DEMHandler
 ::IsValidDEMDirectory(const char* DEMDirectory)
 {
+  assert( ossimElevManager::instance()!=NULL );
+
   //Try to load elevation source
-  bool result = m_ElevManager->loadElevationPath(DEMDirectory);
+  bool result = ossimElevManager::instance()->loadElevationPath(DEMDirectory);
 
   if (!result)
     {
@@ -111,7 +128,7 @@ DEMHandler
   return result;
 }
 
-void
+bool
 DEMHandler
 ::OpenGeoidFile(const char* geoidFile)
 {
@@ -131,22 +148,31 @@ DEMHandler
 
       // The previous flag will be ignored if
       // defaultHeightAboveEllipsoid is not NaN
-      m_ElevManager->setDefaultHeightAboveEllipsoid(ossim::nan());
+      assert( ossimElevManager::instance()!=NULL );
 
+      ossimElevManager::instance()->setDefaultHeightAboveEllipsoid(ossim::nan());
+
+      return true;
       }
     else
       {
       otbMsgDevMacro(<< "Failure opening geoid");
       geoidPtr.release();
+
+      itkExceptionMacro( << "Failed to open geoid file: '" << geoidFile << "'" );
+
+      return false;
       }
     }
+
+  return false;
 }
 
-void
+bool
 DEMHandler
 ::OpenGeoidFile(const std::string& geoidFile)
 {
-  OpenGeoidFile(geoidFile.c_str());
+  return OpenGeoidFile(geoidFile.c_str());
 }
 
 double
@@ -155,9 +181,14 @@ DEMHandler
 {
   double   height;
   ossimGpt ossimWorldPoint;
+
   ossimWorldPoint.lon = lon;
   ossimWorldPoint.lat = lat;
-  height = m_ElevManager->getHeightAboveMSL(ossimWorldPoint);
+
+  assert( ossimElevManager::instance()!=NULL );
+
+  height = ossimElevManager::instance()->getHeightAboveMSL(ossimWorldPoint);
+
   return height;
 }
 
@@ -174,9 +205,13 @@ DEMHandler
 {
   double   height;
   ossimGpt ossimWorldPoint;
+
   ossimWorldPoint.lon = lon;
   ossimWorldPoint.lat = lat;
-  height = m_ElevManager->getHeightAboveEllipsoid(ossimWorldPoint);
+
+  assert( ossimElevManager::instance()!=NULL );
+
+  height = ossimElevManager::instance()->getHeightAboveEllipsoid(ossimWorldPoint);
 
   return height;
 }
@@ -195,7 +230,10 @@ DEMHandler
   // Ossim does not allow to retrieve the default height above
   // ellipsoid We therefore must keep it on our side
   m_DefaultHeightAboveEllipsoid = h;
-  m_ElevManager->setDefaultHeightAboveEllipsoid(h);
+
+  assert( ossimElevManager::instance()!=NULL );
+
+  ossimElevManager::instance()->setDefaultHeightAboveEllipsoid(h);
 }
 
 double
@@ -207,13 +245,24 @@ DEMHandler
   return m_DefaultHeightAboveEllipsoid;
 }
 
+unsigned int
+DEMHandler
+::GetDEMCount() const
+{
+  assert( ossimElevManager::instance()!=NULL );
+
+  return ossimElevManager::instance()->getNumberOfElevationDatabases();
+}
+
 std::string DEMHandler::GetDEMDirectory(unsigned int idx) const
 {
   std::string demDir = "";
 
-  if(m_ElevManager->getNumberOfElevationDatabases() > 0)
+  if(ossimElevManager::instance()->getNumberOfElevationDatabases() > 0)
     {
-    demDir = m_ElevManager->getElevationDatabase(idx)->getConnectionString().string();
+    assert( ossimElevManager::instance()!=NULL );
+
+    demDir = ossimElevManager::instance()->getElevationDatabase(idx)->getConnectionString().string();
     }
   return demDir;
 }
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx
index 0a0309e5f3dba0a46c02262d9a6529903f4fd798..98d873885e84be567549957fb78fa6985d72e2ee 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx
@@ -139,41 +139,51 @@ bool
 ImageKeywordlist::
 convertToGDALRPC(GDALRPCInfo &rpc) const
 {
-  ossimKeywordlist geom_kwl;
-
-  this->convertToOSSIMKeywordlist(geom_kwl);
-
-  if( geom_kwl.hasKey("polynomial_format")) //RK
-  {
-  ossimRefPtr<ossimRpcModel> rpcModel = new ossimRpcModel;
-  if (rpcModel->loadState(geom_kwl))
-    {
-    ossimRpcModel::rpcModelStruct ossimRpcStruct;
-    rpcModel->getRpcParameters(ossimRpcStruct);
+   /* ossimRpcModel::loadState() actually expects certain keyword values to be
+    * present in the keywordlist. So We check a single keyword value
+    * (polynomial_format) first.  Even though it is not enough to ensure a valid
+    * ossimRpcModel by checking for presence of one single key but atleast we
+    * are sure about not to create an ossimRpcModel.
+    *
+    * The current mechanism creates ossimRpcModel instance, calls loadState()
+    * and fails. The below check for 'polynomial_format' save us from creating
+    * an ossimRpcModel which will be invalid if the 'polynomial_format' is not
+    * present.
+    */
+   if( m_Keywordlist.find("polynomial_format") != m_Keywordlist.end() )
+   {
+      ossimKeywordlist geom_kwl;
+      this->convertToOSSIMKeywordlist(geom_kwl);
 
-    if (ossimRpcStruct.type == 'B')
+      ossimRefPtr<ossimRpcModel> rpcModel = new ossimRpcModel;
+      if (rpcModel->loadState(geom_kwl))
       {
-      rpc.dfSAMP_OFF = ossimRpcStruct.sampOffset;
-      rpc.dfLINE_OFF = ossimRpcStruct.lineOffset;
-      rpc.dfSAMP_SCALE = ossimRpcStruct.sampScale;
-      rpc.dfLINE_SCALE = ossimRpcStruct.lineScale;
-      rpc.dfLAT_OFF = ossimRpcStruct.latOffset;
-      rpc.dfLONG_OFF = ossimRpcStruct.lonOffset;
-      rpc.dfHEIGHT_OFF = ossimRpcStruct.hgtOffset;
-      rpc.dfLAT_SCALE = ossimRpcStruct.latScale;
-      rpc.dfLONG_SCALE = ossimRpcStruct.lonScale;
-      rpc.dfHEIGHT_SCALE = ossimRpcStruct.hgtScale;
-
-      memcpy(rpc.adfLINE_NUM_COEFF, ossimRpcStruct.lineNumCoef, sizeof(double) * 20);
-      memcpy(rpc.adfLINE_DEN_COEFF, ossimRpcStruct.lineDenCoef, sizeof(double) * 20);
-      memcpy(rpc.adfSAMP_NUM_COEFF, ossimRpcStruct.sampNumCoef, sizeof(double) * 20);
-      memcpy(rpc.adfSAMP_DEN_COEFF, ossimRpcStruct.sampDenCoef, sizeof(double) * 20);
-
-      return true;
+         ossimRpcModel::rpcModelStruct ossimRpcStruct;
+         rpcModel->getRpcParameters(ossimRpcStruct);
+
+         if (ossimRpcStruct.type == 'B')
+         {
+            rpc.dfSAMP_OFF = ossimRpcStruct.sampOffset;
+            rpc.dfLINE_OFF = ossimRpcStruct.lineOffset;
+            rpc.dfSAMP_SCALE = ossimRpcStruct.sampScale;
+            rpc.dfLINE_SCALE = ossimRpcStruct.lineScale;
+            rpc.dfLAT_OFF = ossimRpcStruct.latOffset;
+            rpc.dfLONG_OFF = ossimRpcStruct.lonOffset;
+            rpc.dfHEIGHT_OFF = ossimRpcStruct.hgtOffset;
+            rpc.dfLAT_SCALE = ossimRpcStruct.latScale;
+            rpc.dfLONG_SCALE = ossimRpcStruct.lonScale;
+            rpc.dfHEIGHT_SCALE = ossimRpcStruct.hgtScale;
+
+            memcpy(rpc.adfLINE_NUM_COEFF, ossimRpcStruct.lineNumCoef, sizeof(double) * 20);
+            memcpy(rpc.adfLINE_DEN_COEFF, ossimRpcStruct.lineDenCoef, sizeof(double) * 20);
+            memcpy(rpc.adfSAMP_NUM_COEFF, ossimRpcStruct.sampNumCoef, sizeof(double) * 20);
+            memcpy(rpc.adfSAMP_DEN_COEFF, ossimRpcStruct.sampDenCoef, sizeof(double) * 20);
+
+            return true;
+         }
       }
-    }
-  }
-  return false;
+   }
+   return false;
 }
 
 void
diff --git a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt
index d11608709f0552643a238bb01042453df869e9d2..42440cd9a65cea1d85f0099a6ba1760664f64e8e 100644
--- a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt
+++ b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt
@@ -441,6 +441,7 @@ otb_add_test(NAME uaTvDEMHandler_AboveEllipsoid_SRTM_BadGeoid COMMAND otbOSSIMAd
   339.513
   0.001
   )
+set_property(TEST uaTvDEMHandler_AboveEllipsoid_SRTM_BadGeoid PROPERTY WILL_FAIL true)
 
 otb_add_test(NAME uaTvDEMHandler_AboveMSL_SRTM_NoGeoid_NoData COMMAND otbOSSIMAdaptersTestDriver
   otbDEMHandlerTest
diff --git a/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx
index 9987db6a5bcd5cd74ac0793cd8e5b0aaea5261f2..09ab37cf7c098c990a0668f176099eda0109ab94 100644
--- a/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx
+++ b/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx
@@ -59,7 +59,19 @@ int otbDEMHandlerTest(int argc, char * argv[])
 
   if(geoid != "no")
     {
-    demHandler->OpenGeoidFile(geoid);
+    try
+      {
+      demHandler->OpenGeoidFile(geoid);
+      }
+    catch( const std::exception & exception )
+      {
+      std::cout
+	<< "Exception thrown while opening geod-file '" << geoid << "':" << std::endl
+	<< exception.what();
+
+      fail = true;
+      }
+
     std::cout<<"GetGeoidFile() = "<<demHandler->GetGeoidFile()<<std::endl;
     }
 
diff --git a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx
index 9595466d47d0a1bb66768e6d241a8c26f8341f88..ef5b28192b5d1f658327d89fa9b8a0b0ec403610 100644
--- a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx
+++ b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx
@@ -112,8 +112,8 @@ ImageRegionAdaptativeSplitter<VImageDimension>
   // First, we need to get which tiles are covered by ROI
   firstTileCovered[0] = m_ImageRegion.GetIndex()[0] / m_TileHint[0];
   firstTileCovered[1] = m_ImageRegion.GetIndex()[1] / m_TileHint[1];
-  tilesPerDim[0] = (m_ImageRegion.GetIndex()[0] + m_ImageRegion.GetSize()[0] -1 + m_TileHint[0] -1) / m_TileHint[0] - firstTileCovered[0];
-  tilesPerDim[1] = (m_ImageRegion.GetIndex()[1] + m_ImageRegion.GetSize()[1] -1 + m_TileHint[1] -1) / m_TileHint[1] - firstTileCovered[1];
+  tilesPerDim[0] = (m_ImageRegion.GetIndex()[0] + m_ImageRegion.GetSize()[0] + m_TileHint[0] -1) / m_TileHint[0] - firstTileCovered[0];
+  tilesPerDim[1] = (m_ImageRegion.GetIndex()[1] + m_ImageRegion.GetSize()[1] + m_TileHint[1] -1) / m_TileHint[1] - firstTileCovered[1];
   
   unsigned int totalTiles = tilesPerDim[0] * tilesPerDim[1];
 
@@ -186,7 +186,9 @@ ImageRegionAdaptativeSplitter<VImageDimension>
 
     unsigned int i = 1;
 
-    while(totalTiles * (divideTiles[0] * divideTiles[1]) < m_RequestedNumberOfSplits)
+    // Exit condition if divideTiles=m_TileHint (i.e. no more subdivision available)
+    while(totalTiles * (divideTiles[0] * divideTiles[1]) < m_RequestedNumberOfSplits
+      && (divideTiles[0] < m_TileHint[0] || divideTiles[1] < m_TileHint[1]))
       {
       if(divideTiles[i] < m_TileHint[i])
         {
@@ -200,6 +202,8 @@ ImageRegionAdaptativeSplitter<VImageDimension>
     splitSize[0] = (m_TileHint[0] + divideTiles[0] - 1)/ divideTiles[0];
     splitSize[1] = (m_TileHint[1] + divideTiles[1] - 1)/ divideTiles[1];
 
+    RegionType tileHintRegion;
+    tileHintRegion.SetSize(m_TileHint);
     // Fill the tiling scheme
     for(unsigned int tiley = 0; tiley < tilesPerDim[1]; ++tiley)
       {
@@ -219,13 +223,21 @@ ImageRegionAdaptativeSplitter<VImageDimension>
             newSplit.SetIndex(newSplitIndex);
             newSplit.SetSize(splitSize);
 
+            tileHintRegion.SetIndex(0, tilex * m_TileHint[0]);
+            tileHintRegion.SetIndex(1, tiley * m_TileHint[1]);
+
             bool cropped = newSplit.Crop(m_ImageRegion);
 
             // If newSplit could not be cropped, it means that it is
             // outside m_ImageRegion. In this case we ignore it.
             if(cropped)
               {
-              m_StreamVector.push_back(newSplit);
+              // check that the split stays inside its tile
+              cropped = newSplit.Crop(tileHintRegion);
+              if (cropped)
+                {
+                m_StreamVector.push_back(newSplit);
+                }
               }
             }
           }
diff --git a/Modules/Core/Common/test/CMakeLists.txt b/Modules/Core/Common/test/CMakeLists.txt
index 40f89e72aeb1144f9fc5c7166c32aaef6d62870b..c40b6a289fdce16ec39937f9db531dbe9d61a38c 100644
--- a/Modules/Core/Common/test/CMakeLists.txt
+++ b/Modules/Core/Common/test/CMakeLists.txt
@@ -96,6 +96,18 @@ otb_add_test(NAME coTvImageRegionAdaptativeSplitterShiftedROISmallStream COMMAND
   ${TEMP}/coTvImageRegionAdaptativeSplitterShiftedROISmallStreamOutput.txt
   )
 
+otb_add_test(NAME coTvImageRegionAdaptativeSplitterMissingLine COMMAND otbCommonTestDriver
+  otbImageRegionAdaptativeSplitter
+  0 0 1000 1000 1000 1 37
+  ${TEMP}/coTvImageRegionAdaptativeSplitterMissingLine.txt
+  )
+
+otb_add_test(NAME coTvImageRegionAdaptativeSplitterDivideBlock COMMAND otbCommonTestDriver
+  otbImageRegionAdaptativeSplitter
+  0 0 10 10 5 5 36
+  ${TEMP}/coTvImageRegionAdaptativeSplitterDivideBlock.txt
+  )
+
 otb_add_test(NAME coTuRGBAPixelConverter COMMAND otbCommonTestDriver
   otbRGBAPixelConverterNew
   )
diff --git a/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx b/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx
index 638993505239432d2926178eff637ca2b94c6720..66cc0ae45d7159fe3f84b945cdbaf2edf2a903bb 100644
--- a/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx
+++ b/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx
@@ -59,16 +59,63 @@ int otbImageRegionAdaptativeSplitter(int itkNotUsed(argc), char * argv[])
 
 
   unsigned int nbSplits = splitter->GetNumberOfSplits(region, requestedNbSplits);
+  std::vector<RegionType> splits;
 
   outfile<<splitter<<std::endl;
   outfile<<"Split map: "<<std::endl;
 
   for(unsigned int i = 0; i < nbSplits; ++i)
     {
-    outfile<<"Split "<<i<<": "<<splitter->GetSplit(i, requestedNbSplits, region);
+    RegionType tmpRegion = splitter->GetSplit(i, requestedNbSplits, region);
+    splits.push_back(tmpRegion);
+    outfile<<"Split "<<i<<": "<<tmpRegion;
     }
 
   outfile.close();
 
+  // Basic consistency check on split map
+  if (requestedNbSplits != nbSplits)
+    {
+    std::cout << "Wrong number of splits : got "<<nbSplits<<" , expected "<<requestedNbSplits<< std::endl;
+    }
+  IndexType tmpIndex;
+  for (unsigned int i=regionIndex[0] ; i<(regionIndex[0]+regionSize[0]) ; ++i)
+    {
+    for (unsigned int j=regionIndex[1] ; j<(regionIndex[1]+regionSize[1]) ; ++j)
+      {
+      tmpIndex[0] = i;
+      tmpIndex[1] = j;
+      unsigned int count = 0;
+      for (unsigned int k=0 ; k<nbSplits ; ++k )
+        {
+        if (splits[k].IsInside(tmpIndex))
+          {
+          count++;
+          }
+        }
+      if (count == 0)
+        {
+        std::cout << "Index ["<<i<<","<<j<<"] is missing in split map" << std::endl;
+        return EXIT_FAILURE;
+        }
+      if (count > 1)
+        {
+        std::cout << "Index ["<<i<<","<<j<<"] occurs more than once in the split map" << std::endl;
+        return EXIT_FAILURE;
+        }
+      }
+    }
+
+  unsigned int pixelInSplit = 0;
+  for (unsigned int k=0 ; k<nbSplits ; ++k )
+    {
+    pixelInSplit += splits[k].GetSize(0) * splits[k].GetSize(1);
+    }
+  if (pixelInSplit != regionSize[0]*regionSize[1])
+    {
+    std::cout << "Wrong number of pixels in split : got "<<pixelInSplit << " , expected "<< regionSize[0]*regionSize[1] << std::endl;
+    return EXIT_FAILURE;
+    }
+
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx
index 4bd558f4a9589795edaac72e023f28d1e67f737a..db371582435603f927fdd60004275ee41ed9e28e 100644
--- a/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx
@@ -70,12 +70,12 @@ int otbChangeNoDataValueFilter(int itkNotUsed(argc),char * itkNotUsed(argv) [])
   
   for(it.GoToBegin();!it.IsAtEnd();++it,++count)
     {
-    if (count%2 == 0 and it.Get()!=-20.)
+    if (count%2 == 0 && it.Get()!=-20.)
       {
       std::cerr<<"Pixel should have new no-data value"<<std::endl;
       failed = true;
       }
-    else if(count%2 == 1 and it.Get()!=10.)
+    else if(count%2 == 1 && it.Get()!=10.)
       {
       std::cerr<<"Pixel value should be unchanged"<<std::endl;
       failed = true;
diff --git a/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx
index 109a2ec7d44c4ad2ff420337613260d64ba66b8a..d5c2b4283635847be4947e15791e785ec1924d9d 100644
--- a/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx
@@ -69,12 +69,12 @@ int otbImageToNoDataMaskFilter(int itkNotUsed(argc),char * itkNotUsed(argv) [])
   
   for(it.GoToBegin();!it.IsAtEnd();++it,++count)
     {
-    if (count%2 == 0 and it.Get()!=0)
+    if (count%2 == 0 && it.Get()!=0)
       {
       std::cerr<<"Pixel should be masked"<<std::endl;
       failed = true;
       }
-    else if(count%2 == 1 and it.Get()!=255)
+    else if(count%2 == 1 && it.Get()!=255)
       {
       std::cerr<<"Pixel should not be masked"<<std::endl;
       failed = true;
diff --git a/Utilities/Maintenance/SuperbuildDownloadList.sh b/Utilities/Maintenance/SuperbuildDownloadList.sh
index e0cc7033b1933fc5d8943747184a249d51d01f5c..2cb32210b12d8d28a5c985047956271ad4e970e2 100755
--- a/Utilities/Maintenance/SuperbuildDownloadList.sh
+++ b/Utilities/Maintenance/SuperbuildDownloadList.sh
@@ -1,2 +1,62 @@
 #/bin/bash
-grep -h -E "^[^#]*\"https?://.*(\.tar\.gz|\.tar\.bz2|\.tgz|\.tar\.xz|\.zip|export=download).*\"" ../../SuperBuild/CMake/*.cmake | grep -o -E "https?://[^\"]*" | sed "s/\/download$//" | sort | uniq
+
+if [ $# -eq 2 ]; then
+DOWNLOAD_DIR=$(readlink -f $1)
+OUTPUT_DIR=$(readlink -f $2)
+else
+echo 'Usage: '$0' <download_directory> <archive_output_directory>'
+exit 1
+fi
+
+SB_CMAKE_DIR_REL=$(dirname $0)/../../SuperBuild/CMake
+SB_CMAKE_DIR=$(readlink -f ${SB_CMAKE_DIR_REL})
+
+DOWNLOAD_LIST=$(grep -h -E "^[^#]*\"https?://.*(\.tar\.gz|\.tar\.bz2|\.tgz|\.tar\.xz|\.zip|export=download).*\"" ${SB_CMAKE_DIR}/*.cmake | grep -o -E "https?://[^\"]*" | sed "s/\/\(download\)\?$//" | sort | uniq)
+
+DOWNLOAD_NAMES=
+
+mkdir -p ${DOWNLOAD_DIR}
+cd ${DOWNLOAD_DIR}
+
+echo "Start downloads..."
+
+for url in ${DOWNLOAD_LIST}; do
+  # clean log file
+  echo "" >download.log
+
+  file_name=$(echo "${url}" | grep -o -E "[^\/]+$")
+  docs_google=$(echo "${file_name}" | grep -F "export=download")
+  if [ "${docs_google}" = "" ]; then
+    echo "Download ${file_name}..."
+    wget -N ${url} -o download.log
+  else
+    # look into the original file for a valid download name
+    file_name=$(grep -h -A 3 -B 3 -F "${url}" ${SB_CMAKE_DIR}/*.cmake | grep -E "^[^#]*DOWNLOAD_NAME" | grep -o -E "[^ ]*\.(tar\.gz|tar\.bz2|tar\.xz|zip)" | uniq)
+    if [ -z "$file_name" ]; then
+      echo "Can't find correct filename for url ${url} : skip download"
+    else
+      echo "Download ${file_name}..."
+      wget -O ${file_name} ${url} -o download.log
+    fi
+  fi
+
+  download_errors=$(grep "ERROR" download.log)
+  if [ "$download_errors" != "" ]; then
+    echo "=== Error downloading ${file_name} ==="
+    cat download.log
+  else
+    if [ "$file_name" != "" ]; then
+      DOWNLOAD_NAMES="${DOWNLOAD_NAMES} ${file_name}"
+    fi
+  fi
+done
+
+rm download.log
+
+echo "Create archive..."
+
+cd ${OUTPUT_DIR}
+tar -cjf SuperBuild-archives.tar.bz2 -C ${DOWNLOAD_DIR} ${DOWNLOAD_NAMES}
+
+echo "Compute md5sum..."
+md5sum SuperBuild-archives.tar.bz2 >SuperBuild-archives.md5