diff --git a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx
index 154c73b8c4805ade35f63410d841b2999b2fe751..9595466d47d0a1bb66768e6d241a8c26f8341f88 100644
--- a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx
+++ b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx
@@ -107,10 +107,14 @@ ImageRegionAdaptativeSplitter<VImageDimension>
   // Now we can handle the case where we have a tile hint and a
   // non-trivial requested number of splits
   SizeType tilesPerDim, splitsPerDim;
-
-  tilesPerDim[0] = (m_ImageRegion.GetSize()[0] + m_TileHint[0] -1) / m_TileHint[0];
-  tilesPerDim[1] = (m_ImageRegion.GetSize()[1] + m_TileHint[1] -1) / m_TileHint[1];
-
+  IndexType firstTileCovered;
+
+  // 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];
+  
   unsigned int totalTiles = tilesPerDim[0] * tilesPerDim[1];
 
   // In this case, we have to group input tiles
@@ -134,13 +138,14 @@ ImageRegionAdaptativeSplitter<VImageDimension>
       i = (i+1)%2;
       }
 
+   
     splitsPerDim[0] = tilesPerDim[0] / groupTiles[0];
+    splitsPerDim[1] = tilesPerDim[1] / groupTiles[1];
 
     // Handle the last small tile if any
     if(tilesPerDim[0] % groupTiles[0] > 0)
       splitsPerDim[0]++;
 
-    splitsPerDim[1] = tilesPerDim[1] / groupTiles[1];
     if(tilesPerDim[1] % groupTiles[1] > 0)
       splitsPerDim[1]++;
 
@@ -157,8 +162,8 @@ ImageRegionAdaptativeSplitter<VImageDimension>
         newSplitSize[0] = groupTiles[0] * m_TileHint[0];
         newSplitSize[1] = groupTiles[1] * m_TileHint[1];
 
-        newSplitIndex[0] = splitx * newSplitSize[0];
-        newSplitIndex[1] = splity * newSplitSize[1];
+        newSplitIndex[0] = firstTileCovered[0] * m_TileHint[0] + splitx * newSplitSize[0];
+        newSplitIndex[1] = firstTileCovered[1] * m_TileHint[1] + splity * newSplitSize[1];
 
         newSplit.SetIndex(newSplitIndex);
         newSplit.SetSize(newSplitSize);
@@ -208,8 +213,8 @@ ImageRegionAdaptativeSplitter<VImageDimension>
             RegionType newSplit;
             IndexType newSplitIndex;
 
-            newSplitIndex[0] = tilex * m_TileHint[0] + divx * splitSize[0];
-            newSplitIndex[1] = tiley * m_TileHint[1] + divy * splitSize[1];
+            newSplitIndex[0] = (tilex + firstTileCovered[0]) * m_TileHint[0] + divx * splitSize[0];
+            newSplitIndex[1] = (tiley + firstTileCovered[1]) * m_TileHint[1] + divy * splitSize[1];
 
             newSplit.SetIndex(newSplitIndex);
             newSplit.SetSize(splitSize);
diff --git a/Modules/Core/Common/test/CMakeLists.txt b/Modules/Core/Common/test/CMakeLists.txt
index e32118293bc838491f5be7754ed53d22c35699b3..4a1a24db97c81f0ae6b4b08316c494f79126c795 100644
--- a/Modules/Core/Common/test/CMakeLists.txt
+++ b/Modules/Core/Common/test/CMakeLists.txt
@@ -78,6 +78,24 @@ otb_add_test(NAME coTvImageRegionAdaptativeSplitterStripLargeStream COMMAND otbC
   ${TEMP}/coTvImageRegionAdaptativeSplitterStripLargeStreamOutput.txt
   )
 
+otb_add_test(NAME coTvImageRegionAdaptativeSplitterShiftedROILargeStream COMMAND otbCommonTestDriver
+  --compare-ascii ${NOTOL}
+  ${BASELINE_FILES}/coTvImageRegionAdaptativeSplitterShiftedROILargeStreamOutput.txt
+  ${TEMP}/coTvImageRegionAdaptativeSplitterShiftedROILargeStreamOutput.txt
+  otbImageRegionAdaptativeSplitter
+  1000 1000 4000 4000 2000 2000 5
+  ${TEMP}/coTvImageRegionAdaptativeSplitterShiftedROILargeStreamOutput.txt
+  )
+
+otb_add_test(NAME coTvImageRegionAdaptativeSplitterShiftedROISmallStream COMMAND otbCommonTestDriver
+  --compare-ascii ${NOTOL}
+  ${BASELINE_FILES}/coTvImageRegionAdaptativeSplitterShiftedROISmallStreamOutput.txt
+  ${TEMP}/coTvImageRegionAdaptativeSplitterShiftedROISmallStreamOutput.txt
+  otbImageRegionAdaptativeSplitter
+  1000 1000 4000 4000 2000 2000 5
+  ${TEMP}/coTvImageRegionAdaptativeSplitterShiftedROISmallStreamOutput.txt
+  )
+
 otb_add_test(NAME coTuRGBAPixelConverter COMMAND otbCommonTestDriver
   otbRGBAPixelConverterNew
   )