diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
index 1f0221e665a2291577f3d8ba4cb316624647148d..0378a7024a0ee5172c06d01af936658608ba8635 100644
--- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx
@@ -252,6 +252,7 @@ private:
     if ( HasValue("in") )
       {
       ImageType* inImage = GetParameterImage("in");
+      inImage->UpdateOutputInformation();
       ImageType::RegionType  largestRegion = inImage->GetLargestPossibleRegion();
 
       bool userExtent = !HasUserValue( "mode.extent.ulx" ) \
@@ -385,7 +386,9 @@ private:
     region.SetIndex(1, GetParameterInt("starty"));
     if ( HasValue("in") )
       {
-      if (region.Crop(GetParameterImage("in")->GetLargestPossibleRegion()))
+      ImageType* inImage = GetParameterImage("in");
+      inImage->UpdateOutputInformation();
+      if (region.Crop(inImage->GetLargestPossibleRegion()))
         {
         SetParameterInt("sizex",region.GetSize(0), HasUserValue("sizex"));
         SetParameterInt("sizey",region.GetSize(1), HasUserValue("sizey"));
@@ -426,19 +429,15 @@ private:
 
       ImageType * inImage = GetParameterImage("in");
       FloatVectorImageType::IndexType uli , lri;
-      bool startin = inImage->TransformPhysicalPointToIndex(ulp,uli);
-      bool sizein = inImage->TransformPhysicalPointToIndex(lrp,lri);
-      if ( startin )
-        {
-        SetParameterInt( "startx", uli[0] , true );
-        SetParameterInt( "starty", uli[1] , true );
-        }
-        
-      if( startin && sizein )
-        {
-        SetParameterInt( "sizex", lri[0] - uli[0] + 1, true );
-        SetParameterInt( "sizey", lri[1] - uli[1] + 1, true );
-        }
+      inImage->TransformPhysicalPointToIndex(ulp,uli);
+      inImage->TransformPhysicalPointToIndex(lrp,lri);
+
+      SetParameterInt( "startx", uli[0] , true );
+      SetParameterInt( "starty", uli[1] , true );
+
+      SetParameterInt( "sizex", lri[0] - uli[0] + 1, true );
+      SetParameterInt( "sizey", lri[1] - uli[1] + 1, true );
+      
       }
     else if( GetParameterString( "mode.extent.unit" ) == "lonlat" )
       {
@@ -456,21 +455,16 @@ private:
       lrp_out = rsTransform->TransformPoint(lrp_in);
 
       FloatVectorImageType::IndexType uli_out , lri_out;
-      bool startin = inImage->TransformPhysicalPointToIndex(ulp_out,uli_out);
-      bool sizein = inImage->TransformPhysicalPointToIndex(lrp_out,lri_out);
+      inImage->TransformPhysicalPointToIndex(ulp_out,uli_out);
+      inImage->TransformPhysicalPointToIndex(lrp_out,lri_out);
 
-      if ( startin )
-        {
-        SetParameterInt( "startx", uli_out[0] , true );
-        SetParameterInt( "starty", uli_out[1] , true );
-        }
-            
-      if( startin && sizein )
-        {
-        SetParameterInt( "sizex", lri_out[0] - uli_out[0] + 1, true );
-        SetParameterInt( "sizey", lri_out[1] - uli_out[1] + 1, true );
-        }
-      }  
+      SetParameterInt( "startx", uli_out[0] , true );
+      SetParameterInt( "starty", uli_out[1] , true );
+
+      SetParameterInt( "sizex", lri_out[0] - uli_out[0] + 1, true );
+      SetParameterInt( "sizey", lri_out[1] - uli_out[1] + 1, true );
+      }
+      this->CropRegionOfInterest();
   }
 
   void
@@ -685,10 +679,10 @@ private:
     ImageType* inImage = GetParameterImage("in");
     inImage->UpdateOutputInformation();
 
-    if ( HasValue( "mode.fit.vect" ) && GetParameterString("mode") == "fit" )
+    if ( HasValue( "mode.fit.vect" ) && GetParameterString("mode") == "fit")
       {
       otb::ogr::DataSource::Pointer ogrDS;
-      ogrDS = otb::ogr::DataSource::New(GetParameterString("in") ,
+      ogrDS = otb::ogr::DataSource::New(GetParameterString("mode.fit.vect") ,
                                         otb::ogr::DataSource::Modes::Read);
       double ulx, uly, lrx, lry;
       bool extentAvailable = true;
@@ -724,40 +718,50 @@ private:
       if (extentAvailable)
         {
         RSTransformType::Pointer rsTransform = RSTransformType::New();
-        rsTransform->SetInputProjectionRef(inputProjectionRef);
+        rsTransform->SetInputProjectionRef( inputProjectionRef );
         rsTransform->SetOutputKeywordList( inImage->GetImageKeywordlist() );
         rsTransform->SetOutputProjectionRef( inImage->GetProjectionRef() );
         rsTransform->InstantiateTransform();
-
-        itk::Point<float, 2> ulp_in,  lrp_in , ulp_out , lrp_out;
+        itk::Point<float, 2> ulp_in , urp_in , llp_in , lrp_in ,
+          ulp_out , urp_out , llp_out , lrp_out;
         ulp_in[ 0 ] = ulx ;
         ulp_in[ 1 ] = uly ;
+        urp_in[ 0 ] = ulx ;
+        urp_in[ 1 ] = lry ;
+        llp_in[ 0 ] = lrx ; 
+        llp_in[ 1 ] = ulx ;
         lrp_in[ 0 ] = lrx ;
         lrp_in[ 1 ] = lry ;
         ulp_out = rsTransform->TransformPoint(ulp_in);
+        urp_out = rsTransform->TransformPoint(urp_in);
+        llp_out = rsTransform->TransformPoint(llp_in);
         lrp_out = rsTransform->TransformPoint(lrp_in);
+        FloatVectorImageType::IndexType uli_out , uri_out , lli_out , lri_out;
 
-        FloatVectorImageType::IndexType uli_out , lri_out;
-        bool startin , sizein ;
-        startin = inImage->TransformPhysicalPointToIndex(ulp_out,uli_out);
-        sizein = inImage->TransformPhysicalPointToIndex(lrp_out,lri_out);
-
-        if ( startin )
-            {
-            SetParameterInt( "startx", uli_out[0] , false );
-            SetParameterInt( "starty", uli_out[1] , false );
-            }
-                
-        if( startin && sizein )
-            {
-            SetParameterInt( "sizey", lri_out[1] - uli_out[1] + 1 , false );
-            SetParameterInt( "sizex", lri_out[0] - uli_out[0] + 1 , false );
-            }
-        }
+        inImage->TransformPhysicalPointToIndex(ulp_out,uli_out);
+        inImage->TransformPhysicalPointToIndex(urp_out,uri_out);
+        inImage->TransformPhysicalPointToIndex(llp_out,lli_out);
+        inImage->TransformPhysicalPointToIndex(lrp_out,lri_out);
         
+        FloatVectorImageType::IndexType uli, lri;
+
+        uli[0] = std::min( std::min( uli_out[0] , uri_out[0] ) , 
+                           std::min( lli_out[0] , lri_out[0] ) );
+        uli[1] = std::min( std::min( uli_out[1] , uri_out[1] ) ,
+                           std::min( lli_out[1] , lri_out[1] ) );
+
+        lri[0] = std::max( std::max( uli_out[0] , uri_out[0] ) ,
+                           std::max( lli_out[0] , lri_out[0] ) );
+        lri[1] = std::max( std::max( uli_out[1] , uri_out[1] ) ,
+                           std::max( lli_out[1] , lri_out[1] ) );
+
+        SetParameterInt( "startx", uli[0] , false );
+        SetParameterInt( "starty", uli[1] , false );   
+        SetParameterInt( "sizex", lri[0] - uli[0] , false );
+        SetParameterInt( "sizey", lri[1] - uli[1] , false );
+        }
       }
-
-    if( HasValue( "mode.fit.im" ) && GetParameterString( "mode" ) == "fit" )
+    else if( HasValue( "mode.fit.im" ) && GetParameterString( "mode" ) == "fit" )
       {
       // Setup the DEM Handler
       otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
@@ -820,9 +824,9 @@ private:
       SetParameterInt("sizex",lri[0]-uli[0]);
       SetParameterInt("sizey",lri[1]-uli[1]);
 
-      this->CropRegionOfInterest();
       }
 
+    this->CropRegionOfInterest();
 
     m_ExtractROIFilter = ExtractROIFilterType::New();
     m_ExtractROIFilter->SetInput(inImage);