diff --git a/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilder.cxx b/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilder.cxx
index a1c927350e470431133a438899e123da59e900fb..e8e30e959a0daadd32a6ed61a745a30defa4067c 100755
--- a/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilder.cxx
+++ b/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilder.cxx
@@ -1070,12 +1070,12 @@ const Trk::TrackingGeometry* Calo::CaloTrackingGeometryBuilder::trackingGeometry
    // the Tile Crack volume (TileGap3, enum 17) inserted here
    // binned material for Crack : steering in binEta
    // TODO turn into 2D binned array
-   std::vector<const Trk::IdentifiedMaterial*> matCrack;
+   std::vector<Trk::IdentifiedMaterial> matCrack;
    // layer material can be adjusted here
    int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 17;
-   matCrack.push_back(new std::pair<const Trk::Material*,int>(mScint,baseID));
-   matCrack.push_back(new std::pair<const Trk::Material*,int>(m_caloMaterial,-1));
-   matCrack.push_back(new std::pair<const Trk::Material*,int>(mAl,-1));
+   matCrack.emplace_back(mScint,baseID);
+   matCrack.emplace_back(m_caloMaterial,-1);
+   matCrack.emplace_back(mAl,-1);
    //
    Trk::BinUtility* bun = new Trk::BinUtility(3,-1.8,-1.2,Trk::open,Trk::binEta);
    Trk::BinUtility* bup = new Trk::BinUtility(3, 1.2,1.8,Trk::open,Trk::binEta);
diff --git a/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilderCond.cxx b/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilderCond.cxx
index f2a4f973f7f2ed37e952e29681258fd0d7898819..dfbf0cdb8da00ba21371cb25af927a951e2104a2 100755
--- a/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilderCond.cxx
+++ b/Calorimeter/CaloTrackingGeometry/src/CaloTrackingGeometryBuilderCond.cxx
@@ -1080,12 +1080,12 @@ std::pair<EventIDRange, const Trk::TrackingGeometry*> Calo::CaloTrackingGeometry
    // the Tile Crack volume (TileGap3, enum 17) inserted here
    // binned material for Crack : steering in binEta
    // TODO turn into 2D binned array
-   std::vector<const Trk::IdentifiedMaterial*> matCrack;
+   std::vector<Trk::IdentifiedMaterial> matCrack;
    // layer material can be adjusted here
    int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 17;
-   matCrack.push_back(new std::pair<const Trk::Material*,int>(mScint,baseID));
-   matCrack.push_back(new std::pair<const Trk::Material*,int>(m_caloMaterial,-1));
-   matCrack.push_back(new std::pair<const Trk::Material*,int>(mAl,-1));
+   matCrack.emplace_back(mScint,baseID);
+   matCrack.emplace_back(m_caloMaterial,-1);
+   matCrack.emplace_back(mAl,-1);
    //
    Trk::BinUtility* bun = new Trk::BinUtility(3,-1.8,-1.2,Trk::open,Trk::binEta);
    Trk::BinUtility* bup = new Trk::BinUtility(3, 1.2,1.8,Trk::open,Trk::binEta);
diff --git a/LArCalorimeter/LArTrackingGeometry/src/LArVolumeBuilder.cxx b/LArCalorimeter/LArTrackingGeometry/src/LArVolumeBuilder.cxx
index dc65355f37ce18a9a262662a687529871a088e01..b452aca949de1d0fb438577d86ba0088fd4e8fdc 100755
--- a/LArCalorimeter/LArTrackingGeometry/src/LArVolumeBuilder.cxx
+++ b/LArCalorimeter/LArTrackingGeometry/src/LArVolumeBuilder.cxx
@@ -292,28 +292,28 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
     // layer entry/exit    
 
     // binned material for LAr : steering in binEta
-    std::vector<const Trk::IdentifiedMaterial*> matID;
+    std::vector<Trk::IdentifiedMaterial> matID;
     // layer material can be adjusted here
     int baseID = Trk::GeometrySignature(Trk::Calo)*1000;
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial,0));
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial,baseID+1));
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial,baseID+2));
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial,baseID+3));
+    matID.emplace_back(lArBarrelMaterial,0);
+    matID.emplace_back(lArBarrelMaterial,baseID+1);
+    matID.emplace_back(lArBarrelMaterial,baseID+2);
+    matID.emplace_back(lArBarrelMaterial,baseID+3);
     // scaling factors refer to avZ(avA) change
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(1.3),baseID+1));
-    throwIntoGarbage(matID.back()->first);
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(1.3),baseID+2));
-    throwIntoGarbage(matID.back()->first);
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(0.6),baseID+3));
-    throwIntoGarbage(matID.back()->first);
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(0.7),baseID+3));
-    throwIntoGarbage(matID.back()->first);
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(0.8),baseID+3));
-    throwIntoGarbage(matID.back()->first);
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(0.9),baseID+3));
-    throwIntoGarbage(matID.back()->first);
-    matID.push_back(new std::pair<const Trk::Material*,int>(lArBarrelMaterial->scale(1.1),baseID+3));
-    throwIntoGarbage(matID.back()->first);
+    matID.emplace_back(lArBarrelMaterial->scale(1.3),baseID+1);
+    throwIntoGarbage(matID.back().first);
+    matID.emplace_back(lArBarrelMaterial->scale(1.3),baseID+2);
+    throwIntoGarbage(matID.back().first);
+    matID.emplace_back(lArBarrelMaterial->scale(0.6),baseID+3);
+    throwIntoGarbage(matID.back().first);
+    matID.emplace_back(lArBarrelMaterial->scale(0.7),baseID+3);
+    throwIntoGarbage(matID.back().first);
+    matID.emplace_back(lArBarrelMaterial->scale(0.8),baseID+3);
+    throwIntoGarbage(matID.back().first);
+    matID.emplace_back(lArBarrelMaterial->scale(0.9),baseID+3);
+    throwIntoGarbage(matID.back().first);
+    matID.emplace_back(lArBarrelMaterial->scale(1.1),baseID+3);
+    throwIntoGarbage(matID.back().first);
 
     //std::cout <<"matID:"<< matID[3]->second<< std::endl;
     //
@@ -536,10 +536,10 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
 
     std::vector<size_t> dummylay (1,0);
     // binned material for Presampler : 
-    std::vector<const Trk::IdentifiedMaterial*> matBP;
+    std::vector<Trk::IdentifiedMaterial> matBP;
     // layer material can be adjusted here
     int baseID = Trk::GeometrySignature(Trk::Calo)*1000;
-    matBP.push_back(new Trk::IdentifiedMaterial(lArBarrelPresamplerMaterial,baseID));
+    matBP.emplace_back(lArBarrelPresamplerMaterial,baseID);
 
     const Trk::BinnedMaterial* lArBarrelPresamplerMaterialBinPos = new Trk::BinnedMaterial(lArBarrelPresamplerMaterial,rBU,dummylay,matBP);
     const Trk::BinnedMaterial* lArBarrelPresamplerMaterialBinNeg = new Trk::BinnedMaterial(lArBarrelPresamplerMaterial,rBUc,dummylay,matBP);
@@ -748,68 +748,68 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
     Trk::BinUtility* bun = new Trk::BinUtility(37,-3.2,-1.35,Trk::open,Trk::binEta);
 
     // binned material for LAr : steering in binEta
-    std::vector<const Trk::IdentifiedMaterial*> matEID;
+    std::vector<Trk::IdentifiedMaterial> matEID;
     // layer material can be adjusted here
     int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 4;
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial,0));
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial,baseID+1));
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial,baseID+2));
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial,baseID+3));
+    matEID.emplace_back(lArEndcapMaterial,0);
+    matEID.emplace_back(lArEndcapMaterial,baseID+1);
+    matEID.emplace_back(lArEndcapMaterial,baseID+2);
+    matEID.emplace_back(lArEndcapMaterial,baseID+3);
     // scaled
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.05),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.1),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.15),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.2),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.25),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.3),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.35),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.4),baseID+1));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.05),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.1),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.15),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.2),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.25),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.3),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.35),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.4),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.45),baseID+2));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(0.7),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(0.75),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(0.8),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(0.85),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(0.9),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(0.95),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.05),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.1),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.15),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
-    matEID.push_back(new std::pair<const Trk::Material*,int>(lArEndcapMaterial->scale(1.2),baseID+3));
-    throwIntoGarbage(matEID.back()->first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.05),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.1),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.15),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.2),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.25),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.3),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.35),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.4),baseID+1);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.05),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.1),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.15),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.2),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.25),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.3),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.35),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.4),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.45),baseID+2);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(0.7),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(0.75),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(0.8),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(0.85),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(0.9),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(0.95),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.05),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.1),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.15),baseID+3);
+    throwIntoGarbage(matEID.back().first);
+    matEID.emplace_back(lArEndcapMaterial->scale(1.2),baseID+3);
+    throwIntoGarbage(matEID.back().first);
 
     // binned material for LAr : layer depth per eta bin
     std::vector< Trk::BinUtility*> layEUP(bup->bins());
@@ -963,7 +963,7 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
   const GeoLogVol* lArECPresamplerLogVol = lArECPresamplerPhysVol ? lArECPresamplerPhysVol->getLogVol() : 0;
 
   // binned material for EC Presampler : layers only
-   std::vector<const Trk::IdentifiedMaterial*> matECP;
+   std::vector<Trk::IdentifiedMaterial> matECP;
    const Trk::Material* mAr = new Trk::Material(140., 1170./1.4, 40., 18., 0.0014);
    const Trk::Material* mAl = new Trk::Material(88.93, 388.8, 27., 13., 0.0027);
    throwIntoGarbage(mAr);
@@ -971,8 +971,8 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
 
    // layer material can be adjusted here
    int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 4;
-   matECP.push_back(new std::pair<const Trk::Material*,int>(mAl,0));
-   matECP.push_back(new std::pair<const Trk::Material*,int>(mAr,baseID));
+   matECP.emplace_back(mAl,0);
+   matECP.emplace_back(mAr,baseID);
 
   if (  lArECPresamplerLogVol ) {
   
@@ -1441,7 +1441,7 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
    lArFcalZposition = hecFcalCoverZpos;
 
    // binned material for HEC : layers only
-   std::vector<const Trk::IdentifiedMaterial*> matHEC;
+   std::vector<Trk::IdentifiedMaterial> matHEC;
    //Trk::MaterialProperties lArHecFcalCoverMaterial = geoMaterialToMaterialProperties.convert(lArPositiveHec1Material);
    //Trk::MaterialProperties lArHecFcalCoverMaterial = Trk::MaterialProperties(1., 18.6, 0.00345, 27.);
    const Trk::Material* lArHecFcalCoverMaterial=new Trk::Material(18.4, 201.9, 57.2, 26.1, 0.0071);
@@ -1451,14 +1451,16 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
 
    // layer material can be adjusted here
    baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 8;
-   matHEC.push_back(new std::pair<const Trk::Material*,int>(lArHecFcalCoverMaterial->scale(0.13*m_scale_HECmaterial),0));
-   matHEC.push_back(new std::pair<const Trk::Material*,int>(lArHecMaterial->scale(m_scale_HECmaterial),baseID));
-   matHEC.push_back(new std::pair<const Trk::Material*,int>(lArHecFcalCoverMaterial->scale(0.93*m_scale_HECmaterial),baseID+1));
-   throwIntoGarbage(matHEC.back()->first);
-   matHEC.push_back(new std::pair<const Trk::Material*,int>(lArHecFcalCoverMaterial->scale(1.09*m_scale_HECmaterial),baseID+2));
-   throwIntoGarbage(matHEC.back()->first);
-   matHEC.push_back(new std::pair<const Trk::Material*,int>(lArHecFcalCoverMaterial->scale(1.12*m_scale_HECmaterial),baseID+3));
-   throwIntoGarbage(matHEC.back()->first);
+   matHEC.emplace_back(lArHecFcalCoverMaterial->scale(0.13*m_scale_HECmaterial),0);
+   throwIntoGarbage(matHEC.back().first);
+   matHEC.emplace_back(lArHecMaterial->scale(m_scale_HECmaterial),baseID);
+   throwIntoGarbage(matHEC.back().first);
+   matHEC.emplace_back(lArHecFcalCoverMaterial->scale(0.93*m_scale_HECmaterial),baseID+1);
+   throwIntoGarbage(matHEC.back().first);
+   matHEC.emplace_back(lArHecFcalCoverMaterial->scale(1.09*m_scale_HECmaterial),baseID+2);
+   throwIntoGarbage(matHEC.back().first);
+   matHEC.emplace_back(lArHecFcalCoverMaterial->scale(1.12*m_scale_HECmaterial),baseID+3);
+   throwIntoGarbage(matHEC.back().first);
 
    // divide the HEC into two parts per EC :
    // -  fit one around the FCAL - and adopt to LAr Endcap outer radius
@@ -1600,7 +1602,7 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
    
    // Now the FCAL
    // binned material for FCAL : layers only
-   std::vector<const Trk::IdentifiedMaterial*> matFCAL;
+   std::vector<Trk::IdentifiedMaterial> matFCAL;
    // convert the Material 
    //Trk::MaterialProperties lArFcalMaterial = geoMaterialToMaterialProperties.convert(lArPositiveEndcapMaterial);
    const Trk::Material* lArFcalMaterial =new Trk::Material(8.4, 175.5, 100.8, 42.1, 0.0097);
@@ -1610,13 +1612,13 @@ const std::vector<const Trk::TrackingVolume*>* LAr::LArVolumeBuilder::trackingVo
 
    // layer material can be adjusted here
    baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 20;
-   matFCAL.push_back(new std::pair<const Trk::Material*,int>(lArFcalMaterial0,0));
-   matFCAL.push_back(new std::pair<const Trk::Material*,int>(lArFcalMaterial->scale(0.5),baseID+1));
-   throwIntoGarbage(matFCAL.back()->first);
-   matFCAL.push_back(new std::pair<const Trk::Material*,int>(lArFcalMaterial->scale(1.5),baseID+2));
-   throwIntoGarbage(matFCAL.back()->first);
-   matFCAL.push_back(new std::pair<const Trk::Material*,int>(lArFcalMaterial->scale(1.4),baseID+3));
-   throwIntoGarbage(matFCAL.back()->first);
+   matFCAL.emplace_back(lArFcalMaterial0,0);
+   matFCAL.emplace_back(lArFcalMaterial->scale(0.5),baseID+1);
+   throwIntoGarbage(matFCAL.back().first);
+   matFCAL.emplace_back(lArFcalMaterial->scale(1.5),baseID+2);
+   throwIntoGarbage(matFCAL.back().first);
+   matFCAL.emplace_back(lArFcalMaterial->scale(1.4),baseID+3);
+   throwIntoGarbage(matFCAL.back().first);
 
    // smooth the FCal to Tube form
    if (lArPositiveFcal1Bounds && lArPositiveFcal2Bounds && lArPositiveFcal3Bounds &&
diff --git a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx
index 6c571e9e7004c794b5ab89676187ee44c8ef78a8..ca6732cc16d8bfbd893ecdf86c5104ec51e553fb 100755
--- a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx
+++ b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx
@@ -199,23 +199,23 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   ATH_MSG_DEBUG( "Retrieved " << numTreeTops << " tree tops from the TileDetDescrManager. " );
 
   // layer material can be adjusted here
-  std::vector<const Trk::IdentifiedMaterial*> matTB; 
+  std::vector<Trk::IdentifiedMaterial> matTB; 
   int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 12;
-  matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,0));
-  matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,baseID));
-  matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,baseID+1));
-  matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,baseID+2));
+  matTB.emplace_back(barrelProperties,0);
+  matTB.emplace_back(barrelProperties,baseID);
+  matTB.emplace_back(barrelProperties,baseID+1);
+  matTB.emplace_back(barrelProperties,baseID+2);
   
   // material index 
   std::vector<size_t> ltb{0,1,2,3};
   
   // layer material can be adjusted here
-  std::vector<const Trk::IdentifiedMaterial*> matETB; 
+  std::vector<Trk::IdentifiedMaterial> matETB; 
   baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 18;
-  matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,0));
-  matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,baseID));
-  matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,baseID+1));
-  matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,baseID+2));
+  matETB.emplace_back(extendedBarrelProperties,0);
+  matETB.emplace_back(extendedBarrelProperties,baseID);
+  matETB.emplace_back(extendedBarrelProperties,baseID+1);
+  matETB.emplace_back(extendedBarrelProperties,baseID+2);
 
   // layer material can be adjusted here
   //Trk::MaterialProperties barrelFingerGapProperties = Trk::MaterialProperties(1., 130./0.35, 0.003*pow(0.35,3),30.);
@@ -438,12 +438,12 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   double tileExtZ = tilePositiveExtendedBarrel->center().z()-tilePositiveExtendedBarrelBounds.halflengthZ();
 
   // binned material for ITC : 
-  std::vector<const Trk::IdentifiedMaterial*> matITC;
+  std::vector<Trk::IdentifiedMaterial> matITC;
   // layer material can be adjusted here
   baseID = Trk::GeometrySignature(Trk::Calo)*1000;
-  matITC.push_back(new Trk::IdentifiedMaterial(barrelProperties,baseID+15));
-  matITC.push_back(new Trk::IdentifiedMaterial(barrelProperties,baseID+16));
-  matITC.push_back(new Trk::IdentifiedMaterial(barrelProperties,baseID+17));
+  matITC.emplace_back(barrelProperties,baseID+15);
+  matITC.emplace_back(barrelProperties,baseID+16);
+  matITC.emplace_back(barrelProperties,baseID+17);
 
   // ITCPlug1
   double p1Z = 0.5*(plug1Z-plug1hZ+tileExtZ);
diff --git a/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray.h b/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray.h
index 41a47089e79408eddd051e20fde0c70f2b3b1479..9cd738fe6784baeba029dc72823296e9a8dfba69 100644
--- a/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray.h
+++ b/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -41,6 +41,7 @@ public:
 
   /** Implicit constructor */
   virtual CompactBinnedArrayT* clone() const = 0;
+  virtual CompactBinnedArrayT* clone(const std::vector<T*>& ptrs) const = 0;
 
   /** layer bin utility */
   virtual const Trk::BinUtility* layerBinUtility(const Amg::Vector3D& gp) const = 0;
diff --git a/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray1D.h b/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray1D.h
index 7e304dd358a5f2ca4676dd427c2d27bfbd941ba8..2a22788d5cec4a21345b6ee50b1983a12a8646d6 100644
--- a/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray1D.h
+++ b/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray1D.h
@@ -94,6 +94,12 @@ public:
     return new CompactBinnedArray1DT(m_arrayObjects, m_array, m_binUtility->clone());
   }
 
+  CompactBinnedArray1DT* clone(const std::vector<T*>& ptrs) const
+  {
+    assert (ptrs.size() == m_arrayObjects.size());
+    return new CompactBinnedArray1DT(ptrs, m_array, m_binUtility->clone());
+  }
+
   /**Virtual Destructor*/
   ~CompactBinnedArray1DT() { delete m_binUtility; }
 
diff --git a/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray2D.h b/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray2D.h
index 420bd1d0d8eafce2d0de5eb128d820d7610b74f3..5b6b3fa9cc3cb015f994b5b023a71fc904a6f9be 100644
--- a/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray2D.h
+++ b/Tracking/TrkDetDescr/TrkDetDescrUtils/TrkDetDescrUtils/CompactBinnedArray2D.h
@@ -103,6 +103,12 @@ public:
     return new CompactBinnedArray2DT(m_arrayObjects, m_array, m_binUtility->clone(), m_buVec);
   }
 
+  CompactBinnedArray2DT* clone(const std::vector<T*>& ptrs) const
+  {
+    assert (ptrs.size() == m_arrayObjects.size());
+    return new CompactBinnedArray2DT(ptrs, m_array, m_binUtility->clone(), m_buVec);
+  }
+
   /**Virtual Destructor*/
   ~CompactBinnedArray2DT()
   {
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;
+}