diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.txx b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
index 907da0d9bd562a6954e2978a34a38830f671de09..87a0d50453a74b4ecb3c5554428c1623b9576489 100644
--- a/Modules/IO/ImageIO/include/otbImageFileWriter.txx
+++ b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
@@ -468,22 +468,22 @@ ImageFileWriter<TInputImage>
    */
   inputPtr->UpdateOutputInformation();
   InputImageRegionType inputRegion = inputPtr->GetLargestPossibleRegion();
+  typename TInputImage::PointType origin = inputPtr->GetOrigin();
 
   /** Parse region size modes */
   if(m_FilenameHelper->BoxIsSet())
     {
- 	std::vector<int> boxVector;
- 	Utils::ConvertStringToVector( 
- 	m_FilenameHelper->GetBox(), boxVector, "ExtendedFileName:box", ":");
- 	
- 	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] = 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);
 
     m_ShiftOutputIndex = start;
@@ -501,6 +501,9 @@ ImageFileWriter<TInputImage>
       e.SetDataObject(inputPtr);
       throw e;
       }
+
+    inputPtr->TransformIndexToPhysicalPoint(inputRegion.GetIndex(), origin);
+
     otbLogMacro(Info,<<"Writing user defined region ["<<start[0]<<", "<<start[0]+size[0]-1<<"]x["<<start[1]<<", "<<start[1]+size[1]<<"]");
     }
 
@@ -541,10 +544,9 @@ ImageFileWriter<TInputImage>
   //
   // Setup the ImageIO with information from inputPtr
   //
-  m_ImageIO->SetNumberOfDimensions(TInputImage::ImageDimension);
   const typename TInputImage::SpacingType&   spacing = inputPtr->GetSpacing();
-  const typename TInputImage::PointType&     origin = inputPtr->GetOrigin();
   const typename TInputImage::DirectionType& direction = inputPtr->GetDirection();
+  m_ImageIO->SetNumberOfDimensions(TInputImage::ImageDimension);
   int direction_sign(0);
   for (unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
     {
@@ -555,7 +557,7 @@ ImageFileWriter<TInputImage>
     // Final image size
     m_ImageIO->SetDimensions(i, inputRegion.GetSize(i));
     m_ImageIO->SetSpacing(i, direction_sign * spacing[i]);
-    m_ImageIO->SetOrigin(i, origin[i] + static_cast<double>(inputRegion.GetIndex()[i]) * spacing[i]);
+    m_ImageIO->SetOrigin(i, origin[i]);
 
     vnl_vector<double> axisDirection(TInputImage::ImageDimension);
     // Please note: direction cosines are stored as columns of the
@@ -618,7 +620,6 @@ ImageFileWriter<TInputImage>
     for (unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
       {
       ioRegion.SetSize(i, streamRegion.GetSize(i));
-      ioRegion.SetIndex(i, streamRegion.GetIndex(i));
       //Set the ioRegion index using the shifted index ( (0,0 without box parameter))
       ioRegion.SetIndex(i, streamRegion.GetIndex(i) - m_ShiftOutputIndex[i]);
       }
diff --git a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx
index 96cbf7120c497f340b31f7657e7161bbeafd2d63..336f399df82f4fb35c9e3c820d3e9a319fdb6ff3 100644
--- a/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx
+++ b/Modules/MPI/MPITiffWriter/include/otbSimpleParallelTiffWriter.txx
@@ -458,6 +458,7 @@ SimpleParallelTiffWriter<TInputImage>
    */
   inputPtr->UpdateOutputInformation();
   InputImageRegionType inputRegion = inputPtr->GetLargestPossibleRegion();
+  typename InputImageType::PointType origin = inputPtr->GetOrigin();
 
   /** Parse region size modes */
   if(m_FilenameHelper->BoxIsSet())
@@ -497,6 +498,9 @@ SimpleParallelTiffWriter<TInputImage>
       throw e;
       }
     otbMsgDevMacro(<< "inputRegion " << inputRegion);
+
+    // Update the origin
+    inputPtr->TransformIndexToPhysicalPoint(inputRegion.GetIndex(), origin);
     }
 
   // Get number of bands & pixel data type
@@ -538,7 +542,7 @@ SimpleParallelTiffWriter<TInputImage>
   else
     {
     // When mode is not tiled (i.e. striped)
-    block_size_x = inputPtr->GetLargestPossibleRegion().GetSize()[0];
+    block_size_x = inputRegion.GetSize()[0];
     }
 
   // Master process (Rank 0) is responsible for the creation of the output raster.
@@ -546,10 +550,10 @@ SimpleParallelTiffWriter<TInputImage>
     {
     // Set geotransform
     double geotransform[6];
-    geotransform[0] = inputPtr->GetOrigin()[0] - 0.5*inputPtr->GetSignedSpacing()[0];
+    geotransform[0] = origin[0] - 0.5*inputPtr->GetSignedSpacing()[0];
     geotransform[1] = inputPtr->GetSignedSpacing()[0];
     geotransform[2] = 0.0;
-    geotransform[3] = inputPtr->GetOrigin()[1] - 0.5*inputPtr->GetSignedSpacing()[1];
+    geotransform[3] = origin[1] - 0.5*inputPtr->GetSignedSpacing()[1];
     geotransform[4] = 0.0;
     geotransform[5] = inputPtr->GetSignedSpacing()[1];
 
@@ -557,8 +561,8 @@ SimpleParallelTiffWriter<TInputImage>
     if(!m_TiffTiledMode)
       {
       SPTW_ERROR sperr = sptw::create_raster(m_FileName,
-                                             inputPtr->GetLargestPossibleRegion().GetSize()[0],
-                                             inputPtr->GetLargestPossibleRegion().GetSize()[1],
+                                             inputRegion.GetSize()[0],
+                                             inputRegion.GetSize()[1],
                                              nBands,
                                              dataType,
                                              geotransform,
@@ -573,8 +577,8 @@ SimpleParallelTiffWriter<TInputImage>
     else
       {
       SPTW_ERROR sperr = sptw::create_tiled_raster(m_FileName,
-                                                   inputPtr->GetLargestPossibleRegion().GetSize()[0],
-                                                   inputPtr->GetLargestPossibleRegion().GetSize()[1],
+                                                   inputRegion.GetSize()[0],
+                                                   inputRegion.GetSize()[1],
                                                    nBands,
                                                    dataType,
                                                    geotransform,