diff --git a/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h b/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h
index ab6c04884cdc102bd5b43166574236051227fca3..d7bcd1bc2cda00b7c3c941c17715bb496e2cb901 100644
--- a/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h
+++ b/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h
@@ -16,6 +16,7 @@
 #include <iomanip>
 #include <string>
 #include <climits>
+#include <memory>
 #include "TrkGeometry/Material.h"
 #include "TrkDetDescrUtils/CompactBinnedArray.h"
 #include "TrkDetDescrUtils/CompactBinnedArray1D.h"
@@ -38,9 +39,7 @@ namespace Trk {
     public:
 
       /** Default Constructor needed for POOL */
-      BinnedMaterial():
-      Material(),
-      m_matBins(nullptr){}
+      BinnedMaterial() = default;
 
       /** Constructor with arguments */
       BinnedMaterial(float iX0, 
@@ -55,37 +54,21 @@ namespace Trk {
 
       /** Constructor with averaged material and binning in 1D*/
       BinnedMaterial(const Material*& mat, BinUtility*& bu, const std::vector<size_t>& index,
-		     const std::vector< const IdentifiedMaterial*>& detailedMat); 
+		     const std::vector<IdentifiedMaterial>& detailedMat); 
 
       /** Constructor with averaged material and binning in 2D*/
       BinnedMaterial(const Material*& mat, BinUtility*& bu, std::vector< Trk::BinUtility*>& bVec,
 		     const std::vector<std::vector<size_t> >& index,
-		     const std::vector< const IdentifiedMaterial* >& detailedMat);
+		     const std::vector<IdentifiedMaterial>& detailedMat);
       
       /** Copy Constructor */
-      BinnedMaterial(const BinnedMaterial& amc) :
-      Material(amc),
-	m_matBins(amc.m_matBins? amc.m_matBins->clone() : nullptr )
-      {}
+      BinnedMaterial(const BinnedMaterial& amc);
 
-      /** Desctructor - delete the composition if there */
-      ~BinnedMaterial() { if (m_matBins) delete m_matBins;  }
+      /** Destructor - delete the composition if there */
+      ~BinnedMaterial() = default;
 
       /** Assignment operator */
-      BinnedMaterial& operator=(const BinnedMaterial& amc) {
-          if (this != &amc){
-              X0          = amc.X0;
-              L0          = amc.L0;
-              A           = amc.A;
-              Z           = amc.Z;
-              rho         = amc.rho;  
-              dEdX        = amc.dEdX;  
-              zOaTr       = amc.zOaTr;  
-              delete m_matBins;
-              m_matBins =  amc.m_matBins ? amc.m_matBins->clone() : nullptr;
-          }
-          return (*this);
-      }
+      BinnedMaterial& operator=(const BinnedMaterial& amc);
 
       /** access to layer bin utility */
       const Trk::BinUtility*  layerBinUtility(const Amg::Vector3D& position) const;
@@ -98,8 +81,10 @@ namespace Trk {
       const IdentifiedMaterial* materialNext(const Amg::Vector3D& pos,const Amg::Vector3D& dir, bool layOnly ) const;
   
   private:
-      const CompactBinnedArray< const IdentifiedMaterial >* m_matBins;  
-
+      std::vector<const Trk::IdentifiedMaterial* > ptrs() const;
+      std::vector<IdentifiedMaterial> m_matVec;
+      using binsPtr_t = std::unique_ptr<const CompactBinnedArray< const IdentifiedMaterial > >;
+      binsPtr_t m_matBins;  
   };
 
 
diff --git a/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx b/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx
index c72924044ad090f6e6a386ffc8ad5ae13069af2b..351094fa2cfa695d1c8d28971c1581c22088caa3 100755
--- a/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx
+++ b/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx
@@ -6,27 +6,63 @@
 
 /** Constructor with averaged material and binning in 1D*/
 Trk::BinnedMaterial::BinnedMaterial(const Trk::Material*& mat, Trk::BinUtility*& bu, const std::vector<size_t>& index, 
-				    const std::vector< const Trk::IdentifiedMaterial* >& detailedMat ) : 
+				    const std::vector<Trk::IdentifiedMaterial>& detailedMat ) : 
   Trk::Material(*mat),
-  m_matBins(nullptr)
+  m_matVec (detailedMat),
+  m_matBins (std::make_unique<Trk::CompactBinnedArray1D<const Trk::IdentifiedMaterial> >(ptrs(),index,bu))
 {
-  Trk::CompactBinnedArray1D<const Trk::IdentifiedMaterial >* bm = 
-    new Trk::CompactBinnedArray1D<const Trk::IdentifiedMaterial >(detailedMat,index,bu);
-  m_matBins = bm;
 }    
 
 /** Constructor with averaged material and binning in 2D*/
 Trk::BinnedMaterial::BinnedMaterial(const Trk::Material*& mat, Trk::BinUtility*& bu, std::vector< Trk::BinUtility*>& bVec,
 				    const std::vector<std::vector<size_t> >& index, 
-				    const std::vector<const Trk::IdentifiedMaterial* >& detailedMat ) :
+				    const std::vector<Trk::IdentifiedMaterial>& detailedMat ) :
   Trk::Material(*mat),
-  m_matBins(nullptr)
+  m_matVec (detailedMat),
+  m_matBins (std::make_unique<Trk::CompactBinnedArray2D<const Trk::IdentifiedMaterial> >(ptrs(),index,bu,bVec))
 {
-  Trk::CompactBinnedArray2D<const Trk::IdentifiedMaterial >* bm = 
-    new Trk::CompactBinnedArray2D<const Trk::IdentifiedMaterial >(detailedMat,index,bu,bVec);
-  m_matBins = bm;  
 }    
 
+Trk::BinnedMaterial::BinnedMaterial(const BinnedMaterial& amc) :
+  Material(amc),
+  m_matVec (amc.m_matVec)
+{
+  if (amc.m_matBins) {
+    if (!m_matVec.empty()) {
+      m_matBins = binsPtr_t (amc.m_matBins->clone(ptrs()));
+    }
+    else {
+      m_matBins = binsPtr_t (amc.m_matBins->clone());
+    }
+  }
+}
+
+/** Assignment operator */
+Trk::BinnedMaterial&
+Trk::BinnedMaterial::operator=(const BinnedMaterial& amc)
+{
+  if (this != &amc){
+    X0          = amc.X0;
+    L0          = amc.L0;
+    A           = amc.A;
+    Z           = amc.Z;
+    rho         = amc.rho;  
+    dEdX        = amc.dEdX;  
+    zOaTr       = amc.zOaTr;
+    m_matVec    = amc.m_matVec;
+    m_matBins.reset();
+    if (amc.m_matBins) {
+      if (!m_matVec.empty()) {
+        m_matBins = binsPtr_t (amc.m_matBins->clone(ptrs()));
+      }
+      else {
+        m_matBins =  binsPtr_t (amc.m_matBins->clone());
+      }
+    }
+  }
+  return (*this);
+}
+
 /** access to binned material */
 const Trk::IdentifiedMaterial* Trk::BinnedMaterial::material(const Amg::Vector3D& position ) const
 { 
@@ -41,3 +77,14 @@ const Trk::IdentifiedMaterial* Trk::BinnedMaterial::materialNext(const Amg::Vect
   return mat ;        
 }
   
+
+std::vector<const Trk::IdentifiedMaterial* >
+Trk::BinnedMaterial::ptrs() const
+{
+  std::vector<const Trk::IdentifiedMaterial* > p;
+  p.reserve (m_matVec.size());
+  for (const Trk::IdentifiedMaterial& m : m_matVec) {
+    p.push_back (&m);
+  }
+  return p;
+}