diff --git a/Code/IO/otbJPEG2000ImageIO.cxx b/Code/IO/otbJPEG2000ImageIO.cxx
index 89e868f58a4e9668b0c1ed0a94aebaa3a273d08d..fcab990f26a698f68d893a1896b25b976352b769 100644
--- a/Code/IO/otbJPEG2000ImageIO.cxx
+++ b/Code/IO/otbJPEG2000ImageIO.cxx
@@ -46,8 +46,6 @@ extern "C"
 
 #include "otbTinyXML.h"
 
-#include <boost/shared_ptr.hpp>
-
 void OpjImageDestroy(opj_image_t * img)
 {
   if(img)
@@ -722,9 +720,9 @@ JPEG2000ImageIO::JPEG2000ImageIO()
 
   for(int i = 0; i<m_NumberOfThreads; ++i)
     {
-    m_InternalReaders.push_back(new JPEG2000InternalReader);
+    m_InternalReaders.push_back(boost::shared_ptr<JPEG2000InternalReader>(new JPEG2000InternalReader));
     }
-  m_TileCache      = new JPEG2000TileCache;
+  m_TileCache = boost::shared_ptr<JPEG2000TileCache>(new JPEG2000TileCache);
 
   // By default set number of dimensions to two.
   this->SetNumberOfDimensions(2);
@@ -745,19 +743,7 @@ JPEG2000ImageIO::JPEG2000ImageIO()
 }
 
 JPEG2000ImageIO::~JPEG2000ImageIO()
-{
-  for(ReaderVectorType::iterator it = m_InternalReaders.begin();
-      it != m_InternalReaders.end();
-      ++it)
-    {
-    (*it)->Clean();
-    delete (*it);
-    }
-  m_InternalReaders.clear();
-
-  m_TileCache->Clear();
-  delete m_TileCache;
-}
+{}
 
 bool JPEG2000ImageIO::CanReadFile(const char* filename)
 {
@@ -808,7 +794,7 @@ void JPEG2000ImageIO::ReadVolume(void*)
 /** Internal structure used for passing image data into the threading library */
 struct ThreadStruct
 {
-  std::vector<JPEG2000InternalReader *> Readers;
+  std::vector<boost::shared_ptr<JPEG2000InternalReader> > Readers;
   std::vector<JPEG2000TileCache::CachedTileType> * Tiles;
 };
 
@@ -1125,7 +1111,7 @@ ITK_THREAD_RETURN_TYPE JPEG2000ImageIO::ThreaderCallback( void *arg )
   str = (ThreadStruct *)(((itk::MultiThreader::ThreadInfoStruct *)(arg))->UserData);
 
   // Retrieve data
-  std::vector<JPEG2000InternalReader *> readers = str->Readers;
+  std::vector<boost::shared_ptr<JPEG2000InternalReader> > readers = str->Readers;
   std::vector<JPEG2000TileCache::CachedTileType> *  tiles = str->Tiles;
 
   total = std::min((unsigned int)tiles->size(), threadCount);
diff --git a/Code/IO/otbJPEG2000ImageIO.h b/Code/IO/otbJPEG2000ImageIO.h
index dd5bfe9a240a6feb3e6667fac058ad2a94a81352..b5b0cd817ef104e5905bc3554ccc5d3b18a63458 100644
--- a/Code/IO/otbJPEG2000ImageIO.h
+++ b/Code/IO/otbJPEG2000ImageIO.h
@@ -21,6 +21,7 @@
 #include "otbImageIOBase.h"
 #include "itkMultiThreader.h"
 
+#include <boost/shared_ptr.hpp>
 
 namespace otb
 {
@@ -124,10 +125,10 @@ protected:
 
   void PrintSelf(std::ostream& os, itk::Indent indent) const;
 
-  typedef std::vector<JPEG2000InternalReader *> ReaderVectorType;
+  typedef std::vector<boost::shared_ptr<JPEG2000InternalReader> > ReaderVectorType;
 
-  ReaderVectorType    m_InternalReaders;
-  JPEG2000TileCache*  m_TileCache;
+  ReaderVectorType                     m_InternalReaders;
+  boost::shared_ptr<JPEG2000TileCache> m_TileCache;
 
 private:
   JPEG2000ImageIO(const Self &); //purposely not implemented