diff --git a/Code/Common/otbImageToImageListFilter.h b/Code/Common/otbImageToImageListFilter.h
index cc17786fedff89c7587f960b06129378e5f361ae..a7eb49d453f5aa070c810f2066da65375b21bc2e 100644
--- a/Code/Common/otbImageToImageListFilter.h
+++ b/Code/Common/otbImageToImageListFilter.h
@@ -22,7 +22,7 @@ PURPOSE.  See the above copyright notices for more information.
 
 namespace otb 
 {
-/** \class ImageListSource
+/** \class ImageToImageListFilter
  *  \brief Base class for all the filters taking an image input 
  *  to produce an image list.
  * \ingroup Images
diff --git a/Code/Common/otbObjectList.h b/Code/Common/otbObjectList.h
index d1bfa1eb7514497770b1e74e3ac3dae14168fa35..c977d4d5b0ea52eba760f7f41b7bb1abd1f4b37e 100644
--- a/Code/Common/otbObjectList.h
+++ b/Code/Common/otbObjectList.h
@@ -110,12 +110,15 @@ class ObjectList
   void Clear(void);
 
   class ConstIterator;
+  class ReverseConstIterator;
+
   /** \class Iterator
    *  \brief Iterator of the object list.
    */
   class Iterator
     {
     public:
+      friend class ObjectList;
       friend class ConstIterator;
       /** typedef of the internal iterator */
       typedef typename InternalContainerType::iterator InternalIteratorType;
@@ -136,6 +139,15 @@ class ObjectList
        * Decrement.
        */
       Iterator& operator--();
+      /**
+       * Add
+       */
+      Iterator& operator+(int i);
+
+      /**
+       * Remove
+       */
+      Iterator& operator-(int i);
       /**
        * Difference comparison operator.
        */
@@ -152,7 +164,6 @@ class ObjectList
        * Copy operator.
        */
       Iterator(const Iterator &it);
-
     private:
       // Internal iterator.
       InternalIteratorType m_Iter;
@@ -211,8 +222,6 @@ class ObjectList
       // Internal iterator.
       InternalConstIteratorType m_Iter;
     };
-
-  class ReverseConstIterator;
   /** \class ReverseIterator
    *  \brief ReverseIterator of the object list.
    */
@@ -354,7 +363,13 @@ class ObjectList
    * \return The iterator.
    */
   ReverseConstIterator ReverseEnd(void) const;
- 
+  /**
+   * Erase elements from begin to last.
+   * \param begin Iterator pointing on first object to erase.
+   * \param end Iterator pointing past the last object to erase.
+   */
+  void Erase(Iterator begin, Iterator end);
+
  protected:
   /** Constructor */
   ObjectList();
diff --git a/Code/Common/otbObjectList.txx b/Code/Common/otbObjectList.txx
index ee5460ac97c2c476e1540fdcd8ea3e975c671cbe..0bf954b6cd43b946d1ddf4cc113f242bcd882707 100644
--- a/Code/Common/otbObjectList.txx
+++ b/Code/Common/otbObjectList.txx
@@ -197,6 +197,28 @@ namespace otb
   {
     --m_Iter;
     return *this;
+  } 
+  /**
+   * Add
+   */
+  template <class TObject>
+  typename ObjectList<TObject>::Iterator& 
+  ObjectList<TObject>::Iterator
+  ::operator+(int i)
+  {
+    m_Iter=m_Iter+i;
+    return *this;
+  }
+  /**
+   * Remove
+   */
+  template <class TObject>
+  typename ObjectList<TObject>::Iterator& 
+  ObjectList<TObject>::Iterator
+  ::operator-(int i)
+  {
+    m_Iter=m_Iter-i;
+    return *this;
   }
   /**
    * Difference comparison operator.
@@ -629,6 +651,18 @@ namespace otb
     ReverseConstIterator iter(m_InternalContainer.rend());
     return iter;
   } 
+  /**
+   * Erase elements from begin to last.
+   * \param begin Iterator pointing on first object to erase.
+   * \param end Iterator pointing past the last object to erase.
+   */
+  template <class TObject>
+  void
+  ObjectList<TObject>
+  ::Erase(Iterator begin, Iterator end)
+  {
+    m_InternalContainer.erase(begin.m_Iter,end.m_Iter);
+  }
   /**PrintSelf method */
   template <class TObject>
   void 
diff --git a/Code/Common/otbTestMain.h b/Code/Common/otbTestMain.h
index bdfd4aa0d60ecf8dd39aeb977ed7f1c771a10c75..f67fb4deaabbf880c9e872f51b4efdf182794ebc 100644
--- a/Code/Common/otbTestMain.h
+++ b/Code/Common/otbTestMain.h
@@ -187,8 +187,8 @@ otbMsgDebugMacro(<<"----------------     DEBUT Controle NON-REGRESION  ---------
 	  std::vector<char*>::iterator itBaselineFilenames = baseLineFilenamesImage.begin();
 	  std::vector<char*>::iterator itTestFilenames = testFilenamesImage.begin();
 	  // For each couple of baseline and test file, do the comparison
-	  for(;(itBaselineFilenames != baseLineFilenamesImage.begin())
-		&&(itTestFilenames != testFilenamesImage.begin());
+	  for(;(itBaselineFilenames != baseLineFilenamesImage.end())
+		&&(itTestFilenames != testFilenamesImage.end());
 	      ++itBaselineFilenames,++itTestFilenames)
 	    {
 	      char * baselineFilenameImage = (*itBaselineFilenames);
diff --git a/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.h b/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.h
index 3ea9e445a4bd4f44b5f15c174312d0b67307d85c..a3a67abf5ded59419220a106467e2453310136c2 100644
--- a/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.h
+++ b/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.h
@@ -79,8 +79,6 @@ public:
   typedef typename InputImageType::ValueType           ValueType;  
   typedef typename InputImageType::PixelType           PixelType;
   typedef typename InputImageType::SpacingType         SpacingType;
-  /** Size vector typedefs */
-  typedef std::vector<SizeType>                        SizeVectorType;
   /** Accessors */
   itkSetMacro(NumberOfIterations, int);
   itkSetMacro(SubSampleScale, float);
@@ -91,11 +89,6 @@ public:
   itkGetConstReferenceMacro(InfFiltre,OutputImageListPointerType);
   itkGetConstReferenceMacro(SupDeci,OutputImageListPointerType);
   itkGetConstReferenceMacro(InfDeci,OutputImageListPointerType);
-  /**
-   * Get the vector of sizes
-   * \return The vector of sizes
-   */
-  std::vector<typename TOutputImage::SizeType> GetSize();
 
 protected:  
   /** Constructor */
@@ -121,8 +114,6 @@ protected:
   OutputImageListPointerType m_SupDeci;
   /** Inf details from subsampling operations */
   OutputImageListPointerType m_InfDeci;
-  /** Sizes vector */
-  SizeVectorType m_Size;
 };
 }// End namespace otb
 
diff --git a/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.txx b/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.txx
index a6dfc168cddd66a709a7900efcdd88ba6d7ca779..88a5fdfd6546095bd234b875c5f0a4dea71156b3 100644
--- a/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.txx
+++ b/Code/MultiScale/otbMorphologicalPyramidAnalyseFilter.txx
@@ -49,18 +49,6 @@ namespace otb
   template <class TInputImage, class TOutputImage, class TMorphoFilter>
   MorphologicalPyramidAnalyseFilter<TInputImage,TOutputImage,TMorphoFilter>
   ::~MorphologicalPyramidAnalyseFilter(){}
-
-  /**
-   * Get the vector of sizes
-   * \return The vector of sizes
-   */
-  template <class TInputImage, class TOutputImage, class TMorphoFilter>
-  std::vector<typename TOutputImage::SizeType>
-  MorphologicalPyramidAnalyseFilter<TInputImage,TOutputImage,TMorphoFilter>
-  ::GetSize(void)
-  {
-    return m_Size;
-  }
   /**
    * Main computation method
    */
@@ -98,7 +86,7 @@ namespace otb
     typename SubtractFilterType::Pointer subtract1,subtract2,subtract3,subtract4;
     typename ResamplerType::Pointer resampler1, resampler2;
   
-    // Size vector declaration
+    // Size declaration
     typename InputImageType::SizeType size;
 
     // local variables declarations and initialisations
@@ -142,10 +130,9 @@ namespace otb
 	otbMsgDebugMacro(<<"MorphologicalPyramidAnalyseFilter: subtract2 OK "<<subtract2->GetOutput()->GetLargestPossibleRegion().GetSize());
 	m_InfFiltre->PushBack(subtract2->GetOutput());
 	otbMsgDebugMacro("MorphologicalPyramidAnalyseFilter: step "<<i<<" - Image appended to m_InfFiltre");
-	// New  Size/Spacing computation
+	
+	// New  Size
 	size = morphoFilter->GetOutput()->GetLargestPossibleRegion().GetSize();
-	m_Size.push_back(size);
-	otbMsgDebugMacro(<<"New size and spacing :");
 	for (int j =0; j<InputImageType::ImageDimension;j++)
 	  {
 	    sizeTmp=size[j];
@@ -160,17 +147,15 @@ namespace otb
 	resampler1->SetSize(size);
 	resampler1->Update();
 	currentImage=resampler1->GetOutput();
-	//currentImage = ResampleImage(morphoFilter->GetOutput(),size,spacing);
 	
 	otbMsgDebugMacro(<<"MorphologicalPyramidAnalyseFilter: DownSampling OK "<<currentImage->GetLargestPossibleRegion().GetSize());
 	// New current image is appeneded to the output list
 	OutputImageList->PushBack(currentImage);
 
 	// Image upsampling
-	//upsampled = ResampleImage(currentImage,m_Size.back(),m_Spacing.back());
 	resampler2 = ResamplerType::New();
 	resampler2->SetInput(resampler1->GetOutput());
-	resampler2->SetSize(m_Size.back());
+	resampler2->SetSize(morphoFilter->GetOutput()->GetLargestPossibleRegion().GetSize());
 	resampler2->Update();
 
 	otbMsgDebugMacro(<<"MorphologicalPyramidAnalyseFilter: UpSampling OK "<<resampler2->GetOutput()->GetLargestPossibleRegion().GetSize());
diff --git a/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.h b/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..55f3bbc52ad0340585c4d54e8a68d67c90f646f2
--- /dev/null
+++ b/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.h
@@ -0,0 +1,108 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even 
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef _otbMorphologicalPyramidMRToMSConverter_h
+#define _otbMorphologicalPyramidMRToMSConverter_h
+
+#include "otbImageListToImageListFilter.h"
+
+namespace otb
+{
+  namespace morphologicalPyramid
+    {
+      /**
+       * \class MRToMSConverter
+       * \brief This class convert a multi resolution decomposition from the morphological pyramid to a multi-scale one.
+       * 
+       * This class convert a multi resolution decomposition from the morphological pyramid to a multi-scale one.
+       * 
+       * The operation consists in iterativly upsampling and adding decimation details to a given detail image.
+       * 
+       * \sa MorphologicalPyramidAnalyseFilter
+       * \sa MorphologicalPyramidSynthesisFilter
+       */
+      template <class TInputImage, class TOutputImage>
+	class  MRToMSConverter
+	: public ImageListToImageListFilter<TInputImage,TOutputImage>
+	{
+	  public :
+	    /** Standard typedefs */ 
+	    typedef MRToMSConverter                                    Self;
+	  typedef ImageListToImageListFilter<TInputImage,TOutputImage> Superclass;
+	  typedef itk::SmartPointer<Self>                              Pointer;
+	  typedef itk::SmartPointer<const Self>                        ConstPointer;
+	  /** Creation through object factory macro */
+	  itkNewMacro(Self);
+	  /** Type macro */
+	  itkTypeMacro(MRToMSConverter,ImageListToImageListFilter);
+	  /** Input parameters typedefs */
+	  typedef TInputImage                                     InputImageType;
+	  typedef typename Superclass::InputImagePointer          InputImagePointer;
+	  typedef typename Superclass::InputImageListPointerType  InputImageListPointerType;
+	  /** Output parameters typedefs */
+	  typedef TOutputImage                                    OutputImageType;
+	  typedef typename Superclass::OutputImagePointer         OutputImagePointerType;
+	  typedef typename Superclass::OutputImageListType        OutputImageListType;
+	  typedef typename Superclass::OutputImageListPointerType OutputImageListPointerType;
+	  /** Input image lists setters */
+	  itkSetMacro(SupFiltre,InputImageListPointerType);
+	  itkSetMacro(InfFiltre,InputImageListPointerType);
+	  itkSetMacro(SupDeci,InputImageListPointerType);
+	  itkSetMacro(InfDeci,InputImageListPointerType);
+
+	  /** Number of iterations accessors */
+	  itkSetMacro(NumberOfIterations, unsigned int);
+	  itkGetMacro(NumberOfIterations, unsigned int);
+
+	  /** Full resolution detail image lists getters */
+	  itkGetMacro(SupFiltreFullResolution,OutputImageListPointerType);
+	  itkGetMacro(InfFiltreFullResolution,OutputImageListPointerType);
+	protected:
+	  /** Constructor */
+	  MRToMSConverter();
+	  /** Destructor */
+	  ~MRToMSConverter() {};
+
+	  /** Main computation method */
+	  void GenerateData();
+	  /** PrintSelf method */
+	  void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+	  private :
+	    MRToMSConverter(const Self&); // purposely not implemented
+	  void operator=(const Self&); // purposely not implemented
+
+	  InputImageListPointerType  m_SupFiltre;
+	  InputImageListPointerType  m_InfFiltre;
+	  InputImageListPointerType  m_SupDeci;
+	  InputImageListPointerType  m_InfDeci;
+	  OutputImageListPointerType m_SupFiltreFullResolution;
+	  OutputImageListPointerType m_InfFiltreFullResolution;
+	  unsigned int m_NumberOfIterations;
+
+
+
+
+	};
+    } // End namespace morphologicalPyramid
+}// End namespace otb
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "otbMorphologicalPyramidMRToMSConverter.txx"
+#endif
+
+#endif
diff --git a/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.txx b/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.txx
new file mode 100644
index 0000000000000000000000000000000000000000..15847087bec743f14ded947807f3c8c496c05277
--- /dev/null
+++ b/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.txx
@@ -0,0 +1,93 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even 
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbMorphologicalPyramidMRToMSConverter_txx
+#define __otbMorphologicalPyramidMRToMSConverter_txx
+
+#include "otbMorphologicalPyramidMRToMSConverter.h"
+#include "otbMorphologicalPyramidResampler.h"
+#include "otbMacro.h"
+
+namespace otb
+{
+  namespace morphologicalPyramid
+  {
+    /**
+     * Constructor
+     */
+    template <class TInputImage,class TOuputImage>
+    MRToMSConverter<TInputImage, TOuputImage>
+    ::MRToMSConverter()
+    {
+      m_InfFiltreFullResolution = OutputImageListType::New();
+      m_SupFiltreFullResolution = OutputImageListType::New();
+      m_NumberOfIterations = 0;
+    }
+    /**
+     * Main computation method
+     */
+    template <class TInputImage,class TOuputImage>
+    void
+    MRToMSConverter<TInputImage, TOuputImage>
+    ::GenerateData()
+    {
+      // typedef of the resampling filter
+      typedef otb::morphologicalPyramid::Resampler<InputImageType,OutputImageType> ResamplerType;
+
+      // Definition of the resampler filters
+      typename ResamplerType::Pointer resampler;
+
+      // Full resolution size
+      typename InputImageType::SizeType frsize = m_SupFiltre->Front()->GetLargestPossibleRegion().GetSize();
+      otbMsgDebugMacro(<<"Full resolution size: "<<frsize);
+
+      /// Full resolution details reconstruction  
+      for(int i=0; i<m_NumberOfIterations; i++)
+	{
+	  resampler = ResamplerType::New();
+	  resampler->SetSize(frsize);
+	  resampler->SetInput(m_SupFiltre->GetNthElement(i));
+	  resampler->Update();
+	  m_SupFiltreFullResolution->PushBack(resampler->GetOutput());
+	  otbMsgDebugMacro(<<"SupFiltre Details reconstruction level "<<i<<" OK");
+	  resampler = ResamplerType::New();
+	  resampler->SetSize(frsize);
+	  resampler->SetInput(m_InfFiltre->GetNthElement(i));
+	  resampler->Update();
+	  m_InfFiltreFullResolution->PushBack(resampler->GetOutput());
+	  otbMsgDebugMacro(<<"InfFiltre Details reconstruction level "<<i<<" OK");
+	  resampler = ResamplerType::New();
+	  resampler->SetSize(frsize);
+	  resampler->SetInput(this->GetInput()->GetNthElement(i));
+	  resampler->Update();
+	  this->GetOutput()->PushBack(resampler->GetOutput());
+	  otbMsgDebugMacro(<<"Analyse Details reconstruction level "<<i<<" OK");	   
+	} 
+    }
+    /**
+     * PrintSelf method
+     */
+    template <class TInputImage,class TOuputImage>
+    void
+    MRToMSConverter<TInputImage, TOuputImage>
+    ::PrintSelf(std::ostream& os, itk::Indent indent) const
+    {
+      Superclass::PrintSelf(os,indent);
+    }
+  } // End namespace morphologicalPyramid
+} // End namespace otb
+#endif
diff --git a/Code/MultiScale/otbMorphologicalPyramidResampler.h b/Code/MultiScale/otbMorphologicalPyramidResampler.h
index 89258bedc3587b07226d16939d8125c0e74b1f61..026f1871a700f66b5bd570012d115c8a0a09d2e8 100644
--- a/Code/MultiScale/otbMorphologicalPyramidResampler.h
+++ b/Code/MultiScale/otbMorphologicalPyramidResampler.h
@@ -53,7 +53,7 @@ namespace otb
 	  /** Creation through object factory macro */
 	  itkNewMacro(Self);
 	  /** Type macro */
-	  itkTypeMacro(MorphologicalPyramidResampler,ImageToImageFilter);
+	  itkTypeMacro(Resampler,ImageToImageFilter);
 	  /** Template parameters typedefs */
 	  typedef TInputImage                           InputImageType;
 	  typedef TOutputImage                          OutputImageType;
diff --git a/Code/MultiScale/otbMorphologicalPyramidResampler.txx b/Code/MultiScale/otbMorphologicalPyramidResampler.txx
index 720cd923490469ae193e0942f518ebb6a89b1565..b0de89ebd5db73ff8894f5e9a22c396449b2cd9b 100644
--- a/Code/MultiScale/otbMorphologicalPyramidResampler.txx
+++ b/Code/MultiScale/otbMorphologicalPyramidResampler.txx
@@ -134,8 +134,8 @@ Resampler<TInputImage, TOuputImage>
   typename TransformType::ParametersType scales(2);
   typename InputImageType::SizeType inputSize = this->GetInput()->GetLargestPossibleRegion().GetSize();
   typename InputImageType::SpacingType inputSpacing = this->GetInput()->GetSpacing();
-  scales[0]=static_cast<double>(inputSize[0])/static_cast<double>(m_Size[0]);
-  scales[1]=static_cast<double>(inputSize[1])/static_cast<double>(m_Size[1]);
+  scales[0]=static_cast<double>(inputSize[0]-1)/static_cast<double>(m_Size[0]-1);
+  scales[1]=static_cast<double>(inputSize[1]-1)/static_cast<double>(m_Size[1]-1);
   transform->SetParameters(scales);
 
   // Resampling filter set up
@@ -156,64 +156,6 @@ Resampler<TInputImage, TOuputImage>
   resampler->Update();
   result = resampler->GetOutput();
 
- //  // variable definition for the following cases
-//   typename OutputImageType::RegionType::IndexType inputStart;
-//   typename OutputImageType::RegionType::IndexType outputStart;
-//   typename OutputImageType::RegionType::SizeType  size;
-//   typename OutputImageType::RegionType inputRegion;
-//   typename OutputImageType::RegionType outputRegion;
-
-//   // Gestion d'un cas particulier qui fait apparaître une bande
-//   // noire sur un des bords de l'image
-//   // Dans ce cas on duplique la dernière ligne de l'image
-//   if(m_Spacing[0]*static_cast<float>(m_Size[0]-1)>=(this->GetInput()->GetSpacing()[0]*static_cast<float>(this->GetInput()->GetLargestPossibleRegion().GetSize()[0]-1)))
-//       {
-//       inputStart[0]=m_Size[0]-2;
-//       inputStart[1]=0;
-//       outputStart[0]=m_Size[0]-1;
-//       outputStart[1]=0;
-//       size[0]=1;
-//       size[1]=m_Size[1];
-//       inputRegion.SetSize(size);
-//       outputRegion.SetSize(size);
-//       inputRegion.SetIndex(inputStart);
-//       outputRegion.SetIndex(outputStart);
-//       ConstIteratorType inputIt(result, inputRegion);
-//       IteratorType outputIt(result,outputRegion);
-//       // Duplication de la dernière ligne
-//       for(inputIt.GoToBegin(), outputIt.GoToBegin(); !inputIt.IsAtEnd();++inputIt,++outputIt)
-// 	{
-// 	outputIt.Set(inputIt.Get());
-// 	}      
-//       }
-//      // Gestion d'un cas particulier qui fait apparaître une bande
-//      // noire sur un des bords de l'image
-//      // Dans ce cas on duplique la dernière colonne de l'image
-//      if(m_Spacing[1]*static_cast<float>(m_Size[1]-1)>=(this->GetInput()->GetSpacing()[1]*static_cast<float>(this->GetInput()->GetLargestPossibleRegion().GetSize()[1]-1)))
-//       {
-//       typename OutputImageType::RegionType::IndexType inputStart;
-//       typename OutputImageType::RegionType::IndexType outputStart;
-//       typename OutputImageType::RegionType::SizeType  size;
-//       typename OutputImageType::RegionType inputRegion;
-//       typename OutputImageType::RegionType outputRegion;
-//       inputStart[1]=m_Size[1]-2;
-//       inputStart[0]=0;
-//       outputStart[1]=m_Size[1]-1;
-//       outputStart[0]=0;
-//       size[1]=1;
-//       size[0]=m_Size[0];
-//       inputRegion.SetSize(size);
-//       outputRegion.SetSize(size);
-//       inputRegion.SetIndex(inputStart);
-//       outputRegion.SetIndex(outputStart);
-//       ConstIteratorType inputIt(result, inputRegion);
-//       IteratorType outputIt(result,outputRegion);
-//       // Duplication de la dernière colonne
-//       for(inputIt.GoToBegin(), outputIt.GoToBegin(); !inputIt.IsAtEnd();++inputIt,++outputIt)
-// 	{
-// 	outputIt.Set(inputIt.Get());
-// 	}      
-//      }
   /** Output filter connexion */
   this->GraftOutput(result);
 }
diff --git a/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.h b/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.h
index 566a520dc64ff54098689249a944523aed93ada2..a6be0dc713e02226fd1011169d37fc3625c112f6 100644
--- a/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.h
+++ b/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.h
@@ -81,11 +81,6 @@ public:
   itkSetMacro(InfFiltre,OutputImageListPointerType);
   itkSetMacro(SupDeci,OutputImageListPointerType);
   itkSetMacro(InfDeci,OutputImageListPointerType);  
-  /**
-   * Set the vector of sizes
-   * \param size The vector of sizes
-   */
-  virtual  void  SetSize(std::vector<typename TOutputImage::SizeType> size);    
 
 protected:
   /** Constructor */
@@ -105,8 +100,6 @@ protected:
   OutputImageListPointerType m_SupDeci;
   /** Inf details from subsampling operations */
   OutputImageListPointerType m_InfDeci;
-  /** Sizes vector */
-  SizeVectorType m_Size;
 };
 }// End namespace otb
 
diff --git a/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.txx b/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.txx
index 673231e1832e1d1ec976c0bb9f68acfec1a64505..89f937070a4b87908982f4b8cd4031baf7a9d5c9 100644
--- a/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.txx
+++ b/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.txx
@@ -24,6 +24,7 @@ PURPOSE.  See the above copyright notices for more information.
 #include "itkSubtractImageFilter.h"
 #include "itkAddImageFilter.h"
 #include  "itkImageDuplicator.h"
+#include "otbMacro.h"
 
 namespace otb
 {
@@ -39,17 +40,6 @@ MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
 template <class TInputImage, class TOutputImage>
 MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
 ::~MorphologicalPyramidSynthesisFilter() {}
-/**
- * Get the vector of sizes
- * \param size The vector of sizes
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
-::SetSize(std::vector<typename TOutputImage::SizeType> size)
-{
-  m_Size=size;
-}
 /**
  * Main computation method
  */
@@ -58,6 +48,7 @@ void
 MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
 ::GenerateData(void)
 {
+  otbMsgDebugMacro(<<"MorphologicalPyramidSynthesisFilter : Entering main method.");
   // Input image pointer
   OutputImageListType *   OutputImageList   = this->GetOutput();
   // typedefs of the filters
@@ -79,13 +70,27 @@ MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
   typename SubtractFilterType::Pointer subtract1,subtract2;
   typename ResamplerType::Pointer resampler;
 
+
+  // Size vector computation
+  SizeVectorType size;
+
+  ImageListIterator it = m_SupFiltre->Begin();
+  
+  while(it!=m_SupFiltre->End())
+    {
+      size.push_back(it.Get()->GetLargestPossibleRegion().GetSize());
+      ++it;
+    }
+  otbMsgDebugMacro(<<"MorphologicalPyramidSynthesisFilter : Size vector computation OK");
+
   // Iterators definition  
   ImageListReverseIterator itInfFiltre = m_InfFiltre->ReverseBegin();
   ImageListReverseIterator itSupFiltre = m_SupFiltre->ReverseBegin();
   ImageListReverseIterator itInfDeci = m_InfDeci->ReverseBegin();
   ImageListReverseIterator itSupDeci = m_SupDeci->ReverseBegin();
-  SizeReverseIterator itSize = m_Size.rbegin();
+  SizeReverseIterator itSize = size.rbegin();
 
+  int i =1;
  //--------------------------------------------------------//
   //                      Main loop                         //
   //--------------------------------------------------------//
@@ -93,14 +98,16 @@ MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
 	&& itSupFiltre!=m_SupFiltre->ReverseEnd()
 	&& itInfDeci!=m_InfDeci->ReverseEnd()
 	&& itSupDeci!=m_SupDeci->ReverseEnd()
-	&& itSize!=m_Size.rend())
+	&& itSize!=size.rend())
     {
-    
+
+      ++i;
       // Upsampling current image
     resampler = ResamplerType::New();
     resampler->SetSize(*itSize);
     resampler->SetInput(currentImage);
-
+    resampler->Update();
+    otbMsgDebugMacro(<<"MorphologicalPyramidSynthesisFilter: step "<<i<<" Upsampling OK");
     // Adding *Sup details from current level
     add1= AddFilterType::New();
     add1->SetInput1(resampler->GetOutput());
@@ -117,6 +124,8 @@ MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
     subtract2->SetInput1(subtract1->GetOutput());
     subtract2->SetInput2(itInfDeci.Get());
     subtract2->Update();
+    otbMsgDebugMacro(<<"MorphologicalPyramidSynthesisFilter: step "<<i<<" Details addition OK");
+    
     
     // Updating current image
     currentImage=subtract2->GetOutput();
@@ -129,6 +138,7 @@ MorphologicalPyramidSynthesisFilter<TInputImage,TOutputImage>
     ++itInfDeci;
     ++itSize;
     } 
+  otbMsgDebugMacro(<<"MorphologicalPyramidSynthesisFilter: Exiting main method.");
   }
 /**
  * PrintSelf method
diff --git a/Testing/Code/Common/CMakeLists.txt b/Testing/Code/Common/CMakeLists.txt
index 3e7368592c5182fd56a5d0b3fa6565169d296945..0737eace72111b2a9178cfa9ab837d3099035eb1 100644
--- a/Testing/Code/Common/CMakeLists.txt
+++ b/Testing/Code/Common/CMakeLists.txt
@@ -261,6 +261,11 @@ ADD_TEST(coTuImageListSourceNew ${COMMON_TESTS}
 ADD_TEST(coTuImageToImageListFilterNew ${COMMON_TESTS} 
          otbImageToImageListFilterNew) 
 
+# -------            otb::ImageListToImageListFilter   -------------------------------------------
+
+ADD_TEST(coTvImageListToImageListFilterNew ${COMMON_TESTS} 
+         otbImageListToImageListFilterNew) 
+
          
 # -------       Fichiers sources CXX -----------------------------------
 SET(BasicCommon_SRCS
@@ -292,6 +297,7 @@ otbImageListNew.cxx
 otbImageList.cxx
 otbImageListSourceNew.cxx
 otbImageToImageListFilterNew.cxx
+otbImageListToImageListFilterNew.cxx
 )
 
 
diff --git a/Testing/Code/Common/otbCommonTests.cxx b/Testing/Code/Common/otbCommonTests.cxx
index 61685ae80ab0928547f4102d623b53fb58b50557..c497e6dbbc86370807623654ea41fd7dfcbc62ec 100644
--- a/Testing/Code/Common/otbCommonTests.cxx
+++ b/Testing/Code/Common/otbCommonTests.cxx
@@ -54,4 +54,5 @@ REGISTER_TEST(otbImageListNew);
 REGISTER_TEST(otbImageList);
 REGISTER_TEST(otbImageListSourceNew);
 REGISTER_TEST(otbImageToImageListFilterNew);
+REGISTER_TEST(otbImageListToImageListFilterNew);
 }
diff --git a/Testing/Code/Common/otbObjectList.cxx b/Testing/Code/Common/otbObjectList.cxx
index 8eaefa5728f21733a8829fd1448eb12130c04788..00861204dc19192e3a5685411de0925f943bd14e 100644
--- a/Testing/Code/Common/otbObjectList.cxx
+++ b/Testing/Code/Common/otbObjectList.cxx
@@ -222,6 +222,25 @@ int otbObjectList(int argc, char * argv[])
 	{
 	  fail("Clear()");
 	}
+
+
+      // Testing erase with iterators
+      imageList->PushBack(reader1->GetOutput());
+      imageList->PushBack(reader2->GetOutput());
+      imageList->PushBack(reader3->GetOutput());
+
+      ImageListType::Iterator begin = imageList->Begin()+1;
+      ImageListType::Iterator end = imageList->End();
+      imageList->Erase(begin,end);
+
+      if(imageList->Size()!=1)
+	{
+	  fail("Erase(Iterator,Iterator)/Size()");
+	}
+      if(imageList->Back()!=reader1->GetOutput())
+	{
+	  fail("Erase(Iterator,Iterator)/Back()");
+	}
     }
 
   catch( itk::ExceptionObject & err ) 
diff --git a/Testing/Code/MultiScale/CMakeLists.txt b/Testing/Code/MultiScale/CMakeLists.txt
index c84441d0b25a239fd9d35024fd60a9b88e56ccda..04bf371282fb246be85fb66e0d38e3ff16e9e123 100644
--- a/Testing/Code/MultiScale/CMakeLists.txt
+++ b/Testing/Code/MultiScale/CMakeLists.txt
@@ -15,7 +15,7 @@ SET(TOL 0.0)
 SET(MULTISCALE_TESTS ${CXX_TEST_PATH}/otbMultiScaleTests)
 
 
-# -------            otb::MorphologicalPyramidAnalyseFilter   ----------
+# -------            otb::MorphologicalPyramidResampler  ----------
 
 ADD_TEST(msTuMorphoPyrResamplerNew ${MULTISCALE_TESTS} 
          otbMorphologicalPyramidResamplerNew)
@@ -32,8 +32,6 @@ ADD_TEST(msTvMorphoPyrResampler ${MULTISCALE_TESTS}
 	 ${TEMP}/msPyrResampler_IKO_LesHalles_full.tif
 	 256
 	 256
-#	 2.0
-#	 2.0
 	 )
 
 # -------            otb::MorphologicalPyramidAnalyseFilter   ----------
@@ -60,7 +58,7 @@ ADD_TEST(msTvMorphoPyrAnalyseFilter ${MULTISCALE_TESTS}
 	 2
 	 2.0)
 
-# -------            otb::MorphologicalPyramidAnalyseFilter   ----------
+# -------            otb::MorphologicalPyramidSynthesisFilter   ----------
 
 ADD_TEST(msTuMorphoPyrSynthesisFilterNew ${MULTISCALE_TESTS} 
          otbMorphologicalPyramidSynthesisFilterNew)
@@ -75,6 +73,28 @@ ADD_TEST(msTvMorphoPyrSynthesisFilter ${MULTISCALE_TESTS}
 	 4
 	 2.0)
 
+# -------            otb::MorphologicalPyramidMRToMSConverter   ----------
+
+ADD_TEST(msTuMorphoPyrMRToMSConverterNew ${MULTISCALE_TESTS} 
+         otbMorphologicalPyramidMRToMSConverterNew)
+
+ADD_TEST(msTvMorphoPyrMRToMSConverter ${MULTISCALE_TESTS} 
+   --compare-n-images ${TOL} 3
+ 		   ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
+ 		   ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
+		   ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
+ 		   ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
+		   ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
+ 		   ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
+
+         otbMorphologicalPyramidMRToMSConverter
+	 ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
+	 ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
+	 ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
+	 ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
+	 4
+	 2.0)
+
 # -------       Fichiers sources CXX -----------------------------------
 SET(BasicMultiScale_SRCS
 otbMorphologicalPyramidResamplerNew.cxx
@@ -83,6 +103,8 @@ otbMorphologicalPyramidAnalyseFilterNew.cxx
 otbMorphologicalPyramidAnalyseFilter.cxx
 otbMorphologicalPyramidSynthesisFilterNew.cxx
 otbMorphologicalPyramidSynthesisFilter.cxx
+otbMorphologicalPyramidMRToMSConverterNew.cxx
+otbMorphologicalPyramidMRToMSConverter.cxx
 )
 
 
diff --git a/Testing/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.cxx b/Testing/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..0a06fc0289c2a8ffabccd0b5ad9734d90fcd9e85
--- /dev/null
+++ b/Testing/Code/MultiScale/otbMorphologicalPyramidMRToMSConverter.cxx
@@ -0,0 +1,109 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even 
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "itkExceptionObject.h"
+
+#include "otbMorphologicalPyramidAnalyseFilter.h"
+#include "otbMorphologicalPyramidMRToMSConverter.h"
+#include "otbOpeningClosingMorphologicalFilter.h"
+#include "itkBinaryBallStructuringElement.h"
+#include "otbImageFileReader.h"
+#include "otbImageFileWriter.h"
+#include "otbImage.h"
+
+int otbMorphologicalPyramidMRToMSConverter(int argc, char * argv[])
+{
+  try
+    {
+      const char * inputFilename = argv[1];
+      const char * outputFilename1 = argv[2];
+      const char * outputFilename2 = argv[3];
+      const char * outputFilename3 = argv[4];
+      const unsigned int numberOfIterations = atoi(argv[5]);
+      const float subSampleScale = atof(argv[6]);
+      
+      const unsigned int Dimension = 2;
+      typedef unsigned char InputPixelType;
+      typedef unsigned char OutputPixelType;
+
+      typedef otb::Image<InputPixelType,Dimension> InputImageType;
+      typedef otb::Image<OutputPixelType,Dimension> OutputImageType;
+
+      typedef otb::ImageFileReader<InputImageType> ReaderType;
+      typedef otb::ImageFileWriter<OutputImageType> WriterType;
+
+      typedef itk::BinaryBallStructuringElement<InputPixelType,Dimension> StructuringElementType;
+      typedef otb::OpeningClosingMorphologicalFilter<InputImageType,InputImageType,StructuringElementType>
+	OpeningClosingFilterType;
+      typedef otb::MorphologicalPyramidAnalyseFilter<InputImageType,InputImageType,OpeningClosingFilterType>
+	PyramidAnalyseFilterType;
+      typedef otb::morphologicalPyramid::MRToMSConverter<InputImageType,OutputImageType> MRToMSConverterType;
+
+
+      // Reading input image
+      ReaderType::Pointer reader = ReaderType::New();
+      reader->SetFileName(inputFilename);
+
+      // Analysis
+      PyramidAnalyseFilterType::Pointer pyramidAnalyse = PyramidAnalyseFilterType::New();
+      pyramidAnalyse->SetNumberOfIterations(numberOfIterations);
+      pyramidAnalyse->SetSubSampleScale(subSampleScale);
+      pyramidAnalyse->SetInput(reader->GetOutput());
+      pyramidAnalyse->Update();
+
+      // From multi resolution to multi scale
+      MRToMSConverterType::Pointer mrtoms = MRToMSConverterType::New();
+      mrtoms->SetInput(pyramidAnalyse->GetOutput());
+      mrtoms->SetNumberOfIterations(numberOfIterations);
+      mrtoms->SetSupFiltre(pyramidAnalyse->GetSupFiltre());
+      mrtoms->SetSupDeci(pyramidAnalyse->GetSupDeci());
+      mrtoms->SetInfFiltre(pyramidAnalyse->GetInfFiltre());
+      mrtoms->SetInfDeci(pyramidAnalyse->GetInfDeci());
+      mrtoms->Update();
+
+      // Writing the output images
+      WriterType::Pointer writer1 = WriterType::New();
+      writer1->SetFileName(outputFilename1);
+      writer1->SetInput(mrtoms->GetSupFiltreFullResolution()->Back());
+      writer1->Update();
+
+      WriterType::Pointer writer2 = WriterType::New();
+      writer2->SetFileName(outputFilename2);
+      writer2->SetInput(mrtoms->GetInfFiltreFullResolution()->Back());
+      writer2->Update();
+
+      WriterType::Pointer writer3 = WriterType::New();
+      writer3->SetFileName(outputFilename3);
+      writer3->SetInput(mrtoms->GetOutput()->Back());
+      writer3->Update();
+      
+    }
+      catch( itk::ExceptionObject & err ) 
+	{ 
+	  std::cout << "Exception itk::ExceptionObject thrown !" << std::endl; 
+	  std::cout << err << std::endl; 
+	  return EXIT_FAILURE;
+	} 
+
+      catch( ... ) 
+	{ 
+	  std::cout << "Unknown exception thrown !" << std::endl; 
+	  return EXIT_FAILURE;
+	} 
+
+      return EXIT_SUCCESS;
+    }
diff --git a/Testing/Code/MultiScale/otbMorphologicalPyramidMRToMSConverterNew.cxx b/Testing/Code/MultiScale/otbMorphologicalPyramidMRToMSConverterNew.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6f1eaf073b3702dba4728d4db073fa5e118fa7ee
--- /dev/null
+++ b/Testing/Code/MultiScale/otbMorphologicalPyramidMRToMSConverterNew.cxx
@@ -0,0 +1,54 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even 
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "itkExceptionObject.h"
+
+#include "otbMorphologicalPyramidMRToMSConverter.h"
+#include "otbImage.h"
+
+int otbMorphologicalPyramidMRToMSConverterNew(int argc, char * argv[])
+{
+  try
+    {
+      const unsigned int Dimension = 2;
+      typedef unsigned char InputPixelType;
+      typedef unsigned char OutputPixelType;
+
+      typedef otb::Image<InputPixelType,Dimension> InputImageType;
+      typedef otb::Image<OutputPixelType,Dimension> OutputImageType;
+      typedef otb::morphologicalPyramid::MRToMSConverter<InputImageType,OutputImageType> MRToMSConverterType;
+
+
+      // Instantiation
+      MRToMSConverterType::Pointer mrtoms = MRToMSConverterType::New();
+      
+    }
+      catch( itk::ExceptionObject & err ) 
+	{ 
+	  std::cout << "Exception itk::ExceptionObject thrown !" << std::endl; 
+	  std::cout << err << std::endl; 
+	  return EXIT_FAILURE;
+	} 
+
+      catch( ... ) 
+	{ 
+	  std::cout << "Unknown exception thrown !" << std::endl; 
+	  return EXIT_FAILURE;
+	} 
+
+      return EXIT_SUCCESS;
+    }
diff --git a/Testing/Code/MultiScale/otbMorphologicalPyramidResampler.cxx b/Testing/Code/MultiScale/otbMorphologicalPyramidResampler.cxx
index 52306d904ae8eb112f76c13a24f3e488ae6645eb..5120f6184aaf794a3c8410effd725c97dfb754cc 100644
--- a/Testing/Code/MultiScale/otbMorphologicalPyramidResampler.cxx
+++ b/Testing/Code/MultiScale/otbMorphologicalPyramidResampler.cxx
@@ -30,8 +30,6 @@ int otbMorphologicalPyramidResampler(int argc, char * argv[])
       const char* outputFilename2 = argv[3];
       const unsigned int size_x = atoi(argv[4]);
       const unsigned int size_y = atoi(argv[5]);
-      // const float spacing_x = atof(argv[5]);
-//       const float spacing_y = atof(argv[6]);
 
       const unsigned int Dimension = 2;
       typedef unsigned char InputPixelType;
@@ -54,15 +52,10 @@ int otbMorphologicalPyramidResampler(int argc, char * argv[])
       size[0] = size_x;
       size[1] = size_y;
 
-      // InputImageType::SpacingType spacing;
-//       spacing[0] = spacing_x;
-//       spacing[1] = spacing_y;
-
       // Instantiation
       ResamplerType::Pointer resampler = ResamplerType::New();
       resampler->SetInput(reader->GetOutput());
       resampler->SetSize(size);
-      // resampler->SetSpacing(spacing);
 
       // File writing
       WriterType::Pointer writer = WriterType::New();
diff --git a/Testing/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.cxx b/Testing/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.cxx
index 347c7e3e082ceeb69a5d1e3418eded1d294fe9eb..872bcf4528e4136da29422a0acf96f19ef2ac8cd 100644
--- a/Testing/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.cxx
+++ b/Testing/Code/MultiScale/otbMorphologicalPyramidSynthesisFilter.cxx
@@ -70,6 +70,14 @@ int otbMorphologicalPyramidSynthesisFilter(int argc, char * argv[])
       pyramidSynthesis->SetSupDeci(pyramidAnalyse->GetSupDeci());
       pyramidSynthesis->SetInfFiltre(pyramidAnalyse->GetInfFiltre());
       pyramidSynthesis->SetInfDeci(pyramidAnalyse->GetInfDeci());
+      pyramidSynthesis->Update();
+
+      // Writing the output image
+      WriterType::Pointer writer = WriterType::New();
+      writer->SetFileName(outputFilename);
+      writer->SetInput(pyramidSynthesis->GetOutput()->Back());
+      writer->Update();
+      
     }
       catch( itk::ExceptionObject & err ) 
 	{ 
diff --git a/Testing/Code/MultiScale/otbMultiScaleTests.cxx b/Testing/Code/MultiScale/otbMultiScaleTests.cxx
index b023e1aec33a46659df120dd237c744ae4cd9c0c..2333ee854d007fdc3135007545d3fee1ed9cc51a 100644
--- a/Testing/Code/MultiScale/otbMultiScaleTests.cxx
+++ b/Testing/Code/MultiScale/otbMultiScaleTests.cxx
@@ -32,4 +32,6 @@ REGISTER_TEST(otbMorphologicalPyramidAnalyseFilterNew);
 REGISTER_TEST(otbMorphologicalPyramidAnalyseFilter);
 REGISTER_TEST(otbMorphologicalPyramidSynthesisFilterNew);
 REGISTER_TEST(otbMorphologicalPyramidSynthesisFilter);
+REGISTER_TEST(otbMorphologicalPyramidMRToMSConverterNew);
+REGISTER_TEST(otbMorphologicalPyramidMRToMSConverter);
 }