diff --git a/Code/Projections/otbGenericRSResampleImageFilter.txx b/Code/Projections/otbGenericRSResampleImageFilter.txx
index 5f633b0b51b3a878fe4788926be0a4d268111112..08ce77ebac4c6b8c34e5b05420453fe88080cce3 100644
--- a/Code/Projections/otbGenericRSResampleImageFilter.txx
+++ b/Code/Projections/otbGenericRSResampleImageFilter.txx
@@ -73,7 +73,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
   // resampler output parameters
   m_Resampler->SetOutputSize(m_OutputSize);
   m_Resampler->SetOutputSpacing(m_OutputSpacing);
-  m_Resampler->SetOutputIndex(m_OutputIndex);
+  m_Resampler->SetOutputStartIndex(m_OutputIndex);
   m_Resampler->SetOutputOrigin(m_OutputOrigin);
 
   // expose the metadata to the output of the resample filter 
diff --git a/Code/Projections/otbOptResampleImageFilter.h b/Code/Projections/otbOptResampleImageFilter.h
index 408198fd38c757e616aebc8f322c4b21f8cfd3af..23434dcc0a0f6cc5a7071bb15d6d7d472f316a09 100644
--- a/Code/Projections/otbOptResampleImageFilter.h
+++ b/Code/Projections/otbOptResampleImageFilter.h
@@ -25,6 +25,8 @@
 #include "itkInterpolateImageFunction.h"
 #include "itkVector.h"
 
+#include "otbMacro.h"
+
 namespace otb
 {
 
@@ -92,59 +94,73 @@ public:
   virtual void GenerateData();
   
   /** Accessors to internal filters parameters */
-  itkSetObjectMacro(Transform,TransformType);
+  void SetTransform(TransformType * transform)
+  {
+    m_DeformationFilter->SetTransform(transform);
+    this->Modified();
+  }
+  otbGetObjectMemberConstMacro(DeformationFilter,Transform,const TransformType*);
 
   /** The Deformation field spacing & size */
-  itkSetMacro(DeformationFieldSpacing,SpacingType);
-  
+  void SetDeformationFieldSpacing(const SpacingType & spacing)
+  {
+    m_DeformationFilter->SetOutputSpacing(spacing);
+    this->Modified();
+  }
+  const SpacingType & GetDeformationFieldSpacing() const
+  {
+   return m_DeformationFilter->GetOutputSpacing();
+  }
+
   /** The resampled image parameters */
   // Output Origin
-  itkSetMacro(OutputOrigin,OriginType);
-  itkGetMacro(OutputOrigin,OriginType);
+  void SetOutputOrigin(const OriginType & origin)
+  {
+    m_DeformationFilter->SetOutputOrigin(origin);
+    m_WarpFilter->SetOutputOrigin(origin);
+    this->Modified();
+  }
+  otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputOrigin,OriginType);
+
   // Output Start index
-  itkSetMacro(OutputIndex,IndexType);
-  itkGetMacro(OutputIndex,IndexType);
+  otbSetObjectMemberMacro(WarpFilter,OutputStartIndex,IndexType);
+  otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputStartIndex,IndexType);
+
   // Output Size
-  itkSetMacro(OutputSize,SizeType);
-  itkGetMacro(OutputSize,SizeType);
-  // Output Spacing
-  itkSetMacro(OutputSpacing,SpacingType);
-  itkGetMacro(OutputSpacing,SpacingType);
+  otbSetObjectMemberMacro(WarpFilter,OutputSize,SizeType);
+  otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputSize,SizeType);
 
-  /** Get the deformation grid generated */
-  virtual DeformationFieldType * GetDeformationField();
+  // Output Spacing
+  otbSetObjectMemberMacro(WarpFilter,OutputSpacing,SpacingType);
+  otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputSpacing,SpacingType);
   
   /** Methods to Set/Get the interpolator */
-  itkSetObjectMacro( Interpolator, InterpolatorType );
-  itkGetObjectMacro( Interpolator, InterpolatorType );
-
-  virtual void GenerateOutputInformation();
-  
-  virtual void GenerateInputRequestedRegion();
-
+  void SetInterpolator(InterpolatorType * interpolator)
+  {
+    m_WarpFilter->SetInterpolator(interpolator);
+    this->Modified();
+  }
+  otbGetObjectMemberConstMacro(WarpFilter, Interpolator, const InterpolatorType *);
+
+  /** Import output parameters from a given image */
   void SetOutputParametersFromImage(const InputImageType * image);
   
 protected:
   OptResampleImageFilter();
+
   /** Destructor */
   virtual ~OptResampleImageFilter() {};
 
+  virtual void GenerateOutputInformation();
+
+  virtual void GenerateInputRequestedRegion();
+
 private:
   OptResampleImageFilter(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
   DeformationFieldGeneratorPointerType   m_DeformationFilter;
-  typename TransformType::Pointer        m_Transform;
-
-  SizeType                               m_DeformationGridSize;
-  SpacingType                            m_DeformationFieldSpacing;
-  SizeType                               m_OutputSize;
-  OriginType                             m_OutputOrigin;
-  IndexType                              m_OutputIndex;
-  SpacingType                            m_OutputSpacing;
-  
   typename WarpImageFilterType::Pointer  m_WarpFilter;
-  InterpolatorPointerType                m_Interpolator;
 };
 
 } // namespace otb
diff --git a/Code/Projections/otbOptResampleImageFilter.txx b/Code/Projections/otbOptResampleImageFilter.txx
index 147731c8adb59b2ed3008aedbcf88f63ed25eb4b..38ea75192171d7e3cd303be6a8482c8eba5b221c 100644
--- a/Code/Projections/otbOptResampleImageFilter.txx
+++ b/Code/Projections/otbOptResampleImageFilter.txx
@@ -31,84 +31,25 @@ template <class TInputImage, class TOutputImage, class TDeformationField>
 OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
 ::OptResampleImageFilter() 
 {
-  // default values for DeformationGrid
-  m_DeformationGridSize.Fill(1);
-  m_DeformationFieldSpacing.Fill(2);
-  
-  // default values for Resampled Image
-  m_OutputSize.Fill(1);
-  m_OutputOrigin.Fill(0);
-  m_OutputIndex.Fill(0);
-  m_OutputSpacing.Fill(1);
-  
   // internal filters instanciation
   m_DeformationFilter = DeformationFieldGeneratorType::New();
   m_WarpFilter        = WarpImageFilterType::New();
 
-  // default identity transform
-  m_Transform = itk::IdentityTransform<double ,InputImageType::ImageDimension >::New();
-  
-  // Setup default interpolator
-  typename DefaultInterpolatorType::Pointer interp =  DefaultInterpolatorType::New();
-  m_Interpolator = static_cast<InterpolatorType*>( interp.GetPointer() );
-}
-
-template <class TInputImage, class TOutputImage, class TDeformationField>
-typename OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>::DeformationFieldType*
-OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
-::GetDeformationField()
-{
-  return m_DeformationFilter->GetOutput();
+  // Wire minipipeline
+  m_WarpFilter->SetDeformationField(m_DeformationFilter->GetOutput());
 }
 
-
 template <class TInputImage, class TOutputImage, class TDeformationField>
 void
 OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
 ::GenerateData()
 {
-  // Get the input image 
-  typename InputImageType::Pointer  input  = const_cast<InputImageType *>(this->GetInput());
-  typename OutputImageType::Pointer output = this->GetOutput();
-  
-  
-  // Build the deformation field
-  m_DeformationFilter->SetTransform(m_Transform);
-  m_DeformationFilter->SetOutputIndex(output->GetLargestPossibleRegion().GetIndex());
-  m_DeformationFilter->SetOutputOrigin(output->GetOrigin());
-  m_DeformationFilter->SetOutputSpacing(m_DeformationFieldSpacing);
-
-  // Build the deformation field size following the
-  // m_DeformationFieldSpacing set by the user
-  SizeType    size    = output->GetLargestPossibleRegion().GetSize();
-  SpacingType spacing = output->GetSpacing();
-  
-  for (unsigned int dim = 0; dim < InputImageType::ImageDimension;++dim)
-    {
-    m_DeformationGridSize[dim] = static_cast<unsigned long>(size[dim]*vcl_abs(spacing[dim]/m_DeformationFieldSpacing[dim]));
-    }
-  m_DeformationFilter->SetOutputSize(m_DeformationGridSize); 
-  
-  // Apply the streamed warp filter to the input image using the
-  // deformation field generated before
-  m_WarpFilter->SetInput(input);
-  m_WarpFilter->SetOutputOrigin(m_OutputOrigin);
-  m_WarpFilter->SetOutputSpacing(m_OutputSpacing);
-  m_WarpFilter->SetOutputSize(m_OutputSize);
-  m_WarpFilter->SetOutputStartIndex(m_OutputIndex);
-  
-  // Set the deformation field and the interpolator
-  m_WarpFilter->SetDeformationField(m_DeformationFilter->GetOutput());
-  m_WarpFilter->SetInterpolator(m_Interpolator);
-  
   m_WarpFilter->GraftOutput(this->GetOutput());
   m_WarpFilter->Update();
   this->GraftOutput(m_WarpFilter->GetOutput());
 }
 
-
 /**
- *  
  *
  */
 template <class TInputImage, class TOutputImage, class TDeformationField>
@@ -121,12 +62,12 @@ OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
   
   typename OutputImageType::Pointer outputPtr = this->GetOutput();
 
-  outputPtr->SetSpacing( m_OutputSpacing );
-  outputPtr->SetOrigin( m_OutputOrigin );
+  outputPtr->SetSpacing( this->GetOutputSpacing() );
+  outputPtr->SetOrigin(  this->GetOutputOrigin() );
   
   typename OutputImageType::RegionType region;
-  region.SetSize(m_OutputSize);
-  region.SetIndex(m_OutputIndex);
+  region.SetSize( this->GetOutputSize() );
+  region.SetIndex(this->GetOutputStartIndex() );
 
   outputPtr->SetLargestPossibleRegion(region);
   
@@ -142,45 +83,33 @@ void
 OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
 ::GenerateInputRequestedRegion()
 {
-  // call the superclass's implementation
-  Superclass::GenerateInputRequestedRegion();
-  
-  // Load Input
-  typename InputImageType::Pointer inputPtr = const_cast<InputImageType*>(this->GetInput());
-  // Load Output
-  typename OutputImageType::Pointer outputPtr = this->GetOutput();
+  // Retrieve output pointer
+  OutputImageType * outputPtr = this->GetOutput();
 
-  // Compute the subsampling rate
-  SizeType  inputSize  = inputPtr->GetLargestPossibleRegion().GetSize();
-  SizeType  outputSize  = outputPtr->GetLargestPossibleRegion().GetSize();
+  // Retrieve input pointer
+  const InputImageType * inputPtr = this->GetInput();
 
-  SpacingType  spacing = inputPtr->GetSpacing();
-  
-  std::vector<double>   rate(0.);
-  rate[0] = static_cast<double>(inputSize[0])/static_cast<double>(outputSize[0]);
-  rate[1] = static_cast<double>(inputSize[1])/static_cast<double>(outputSize[1]);
+  // Retrieve output requested region
+  RegionType requestedRegion = outputPtr->GetRequestedRegion();
+  SizeType largestSize       = outputPtr->GetLargestPossibleRegion().GetSize();
 
-  // Get the output dimensions
-  SizeType  lOutputSize  = outputPtr->GetRequestedRegion().GetSize();
-  IndexType lOutputIndex = outputPtr->GetRequestedRegion().GetIndex();
-  
-  // Compute the input informations
-  SizeType lInputSize;
-  IndexType lInputIndex;
-  for (unsigned int i=0; i<InputImageType::ImageDimension ;i ++)
+  // Set up deformation field filter
+  SizeType deformationFieldLargestSize;
+  for(unsigned int dim = 0; dim < InputImageType::ImageDimension;++dim)
     {
-    lInputSize[i] = static_cast<unsigned int>(vcl_ceil( lOutputSize[i] * rate[i]) );
-    lInputIndex[i] = static_cast<unsigned int>(vcl_ceil( lOutputIndex[i] * rate[i]) );
+    deformationFieldLargestSize[dim] = static_cast<unsigned long>(largestSize[dim]
+                                       *vcl_abs(this->GetDeformationFieldSpacing()[dim]
+                                       /this->GetOutputSpacing()[dim]));
     }
-  
-  RegionType lInputRegion;
-  lInputRegion.SetSize(lInputSize);
-  lInputRegion.SetIndex(lInputIndex);
-  
-  lInputRegion.Crop(outputPtr->GetLargestPossibleRegion());
 
-  // Set input resolution input regions
-  inputPtr->SetRequestedRegion(lInputRegion);
+  m_DeformationFilter->SetOutputSize(deformationFieldLargestSize);
+  m_DeformationFilter->SetOutputIndex(this->GetOutputStartIndex());
+
+  // Generate input requested region
+  m_WarpFilter->SetInput(inputPtr);
+  m_WarpFilter->GetOutput()->UpdateOutputInformation();
+  m_WarpFilter->GetOutput()->SetRequestedRegion(requestedRegion);
+  m_WarpFilter->GetOutput()->PropagateRequestedRegion();
 }
 
 /**
@@ -194,7 +123,7 @@ OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>
 {
   this->SetOutputOrigin ( image->GetOrigin() );
   this->SetOutputSpacing ( image->GetSpacing() );
-  this->SetOutputIndex ( image->GetLargestPossibleRegion().GetIndex() );
+  this->SetOutputStartIndex ( image->GetLargestPossibleRegion().GetIndex() );
   this->SetOutputSize ( image->GetLargestPossibleRegion().GetSize() );
 }
 
diff --git a/Testing/Code/Projections/otbOptResampleImageFilter.cxx b/Testing/Code/Projections/otbOptResampleImageFilter.cxx
index d957ec6e60da88cff3db79559a307a1a4a4433f7..fbe845e4e6e86e8a65f68b172eb9782fd5e72022 100644
--- a/Testing/Code/Projections/otbOptResampleImageFilter.cxx
+++ b/Testing/Code/Projections/otbOptResampleImageFilter.cxx
@@ -94,7 +94,7 @@ int otbOptResampleImageFilter(int argc, char* argv[])
   // Write the resampled image
   typedef otb::StreamingImageFileWriter<ImageType>    WriterType;
   WriterType::Pointer writer= WriterType::New();
-  writer->SetTilingStreamDivisions();
+  writer->SetTilingStreamDivisions(4);
   writer->WriteGeomFileOn();
   writer->SetFileName(outfname);
   writer->SetInput(resampler->GetOutput());