diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_IonizationCluster.h b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_IonizationCluster.h
index ca9614c28fd7d6505fd40c288f006c2d471adf00..24c45488efd3388249156aa1e7e03dc2c6a229ff 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_IonizationCluster.h
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_IonizationCluster.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef MM_DIGITIZATION_MM_IONIZATIONCLUSTER_H
@@ -63,17 +63,16 @@ class MM_IonizationCluster {
 
   MM_IonizationCluster ();
   MM_IonizationCluster (float HitX, float IonizationX, float IonizationY);
-  MM_IonizationCluster (const MM_IonizationCluster& MM_IonizationCluster);
   void createElectrons(TRandom3* rndm);
   void propagateElectrons(float lorentzAngle, float driftVel);
-  std::vector<MM_Electron*> getElectrons() const;
+  std::vector<std::unique_ptr<MM_Electron>>& getElectrons();
   float getHitX() const { return m_HitX; }
   TVector2 getIonizationStart() const { return m_IonizationStart; }
 
  private:
 
   // Members supplied by user
-  std::vector<MM_Electron*> m_Electrons;
+  std::vector<std::unique_ptr<MM_Electron>> m_Electrons;
   float m_HitX;
   TVector2 m_IonizationStart;
 
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripResponse.h b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripResponse.h
index 672888aad21546cfbd3e6157b0319affb566b7fc..58352dda9bebd56cdc2d07aa8a54cf37d17803b8 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripResponse.h
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripResponse.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef MM_DIGITIZATION_MM_STRIPRESPONSE_H
@@ -22,7 +22,7 @@ class MM_StripResponse {
  public:
 
   MM_StripResponse();
-  MM_StripResponse(std::vector<MM_IonizationCluster> IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID);
+  MM_StripResponse(std::vector<std::unique_ptr<MM_IonizationCluster>>& IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID);
   void timeOrderElectrons();
   void calculateTimeSeries(float thetaD, int gasgap);
   //  void calculateTimeSeries();
@@ -41,7 +41,7 @@ class MM_StripResponse {
 
   int getNElectrons();
   float getTotalCharge();
-  std::vector<MM_Electron*> getElectrons();
+  std::vector<std::unique_ptr<MM_Electron>>& getElectrons();
 
  private:
 
@@ -51,7 +51,7 @@ class MM_StripResponse {
   int m_minstripID;
   int m_maxstripID;
 
-  std::vector<MM_Electron*> m_Electrons;
+  std::vector<std::unique_ptr<MM_Electron>> m_Electrons;
 
   // First argument is time bin, second argument is strip ID
   std::map< int, std::map<int,float> > m_stripCharges;
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripsResponseSimulation.h b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripsResponseSimulation.h
index 4907d9584be1475a27b87cb1d732682730ebb242..c4d56bfca5b0b1e0bd9dd2174e87337ca2f870d8 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripsResponseSimulation.h
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_StripsResponseSimulation.h
@@ -166,7 +166,7 @@ private:
   MM_StripsResponseSimulation & operator=(const MM_StripsResponseSimulation &right);
   MM_StripsResponseSimulation(const MM_StripsResponseSimulation&);
 
-  std::vector<MM_IonizationCluster> m_IonizationClusters;
+  std::vector<std::unique_ptr<MM_IonizationCluster>> m_IonizationClusters;
 
   std::map<TString, TH1F* > m_mapOfHistograms;
   std::map<TString, TH2F* > m_mapOf2DHistograms;
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_IonizationCluster.cxx b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_IonizationCluster.cxx
index a71276303a9bcbf8bd61215667316adae7e19080..5c01bfd8248b0665c33696ba528bdb218893c1d5 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_IonizationCluster.cxx
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_IonizationCluster.cxx
@@ -10,13 +10,6 @@ MM_IonizationCluster::MM_IonizationCluster () {}
 
 MM_IonizationCluster::MM_IonizationCluster (float HitX, float IonizationX, float IonizationY) : m_HitX(HitX), m_IonizationStart(IonizationX, IonizationY) {}
 
-MM_IonizationCluster::MM_IonizationCluster (const MM_IonizationCluster& MM_IonizationCluster) {
-
-  m_HitX = MM_IonizationCluster.getHitX();
-  m_IonizationStart = MM_IonizationCluster.getIonizationStart();
-  m_Electrons = MM_IonizationCluster.getElectrons();
-
-}
 
 void MM_IonizationCluster::createElectrons(TRandom3* rndm) {
 
@@ -24,7 +17,7 @@ void MM_IonizationCluster::createElectrons(TRandom3* rndm) {
   int Nelectron = MM_IonizationCluster::s_NelectronProb.FindBin(MM_IonizationCluster::s_NelectronProb.GetRandom());
   m_Electrons.reserve(Nelectron);
   for (int iElectron = 0; iElectron<Nelectron; iElectron++)
-    m_Electrons.push_back(new MM_Electron(m_IonizationStart.X()+m_HitX, m_IonizationStart.Y()));
+    m_Electrons.push_back(std::make_unique<MM_Electron>(m_IonizationStart.X()+m_HitX, m_IonizationStart.Y()));
 }
 
 void MM_IonizationCluster::propagateElectrons(float lorentzAngle, float driftVel) {
@@ -35,4 +28,4 @@ void MM_IonizationCluster::propagateElectrons(float lorentzAngle, float driftVel
 }
 
 // accessors
-std::vector<MM_Electron*> MM_IonizationCluster::getElectrons() const { return m_Electrons; }
+std::vector<std::unique_ptr<MM_Electron>>& MM_IonizationCluster::getElectrons() { return m_Electrons; }
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripResponse.cxx b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripResponse.cxx
index 663d14296df1f387d1f25e142f3a714ccbc70066..a45395b4c04581a3f1c94210135239b64fd1dad7 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripResponse.cxx
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripResponse.cxx
@@ -6,11 +6,11 @@
 
 MM_StripResponse::MM_StripResponse() {}
 
-MM_StripResponse::MM_StripResponse(std::vector<MM_IonizationCluster> IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID) : m_timeResolution(timeResolution), m_stripPitch(stripPitch), m_stripID(stripID), m_minstripID(minstripID), m_maxstripID(maxstripID) {
+MM_StripResponse::MM_StripResponse(std::vector<std::unique_ptr<MM_IonizationCluster>>& IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID) : m_timeResolution(timeResolution), m_stripPitch(stripPitch), m_stripID(stripID), m_minstripID(minstripID), m_maxstripID(maxstripID) {
 
 	for (auto& IonizationCluster : IonizationClusters)
-		for (auto& Electron : IonizationCluster.getElectrons())
-			m_Electrons.push_back(Electron);
+		for (auto& Electron : IonizationCluster->getElectrons())
+			m_Electrons.push_back(std::move(Electron));
 
 }
 
@@ -20,19 +20,19 @@ int MM_StripResponse::getNElectrons(){
 
 float MM_StripResponse::getTotalCharge(){
 	float qtot = 0;
-	for(const MM_Electron* electron : m_Electrons) {
+	for(const std::unique_ptr<MM_Electron>& electron : m_Electrons) {
 		qtot += electron->getCharge();
 	}
 	return qtot;
 }
 
-std::vector<MM_Electron*> MM_StripResponse::getElectrons(){
+std::vector<std::unique_ptr<MM_Electron>>& MM_StripResponse::getElectrons(){
 	return m_Electrons;
 }
 
 void MM_StripResponse::timeOrderElectrons() {
 
-	std::sort(m_Electrons.begin(), m_Electrons.end(), [](const MM_Electron* a, const MM_Electron* b) -> bool { return a->getTime() < b->getTime(); });
+	std::sort(m_Electrons.begin(), m_Electrons.end(), [](const std::unique_ptr<MM_Electron>& a, const std::unique_ptr<MM_Electron>& b) -> bool { return a->getTime() < b->getTime(); });
 
 }
 
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripsResponseSimulation.cxx b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripsResponseSimulation.cxx
index 189f71939161e70689b9470407a3a70ceb61a837..c287ef08e37cff56a556b28b7540085973fb9b41 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripsResponseSimulation.cxx
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_StripsResponseSimulation.cxx
@@ -220,10 +220,10 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
 	while (pathLengthTraveled < pathLength){
 
 		// N.B. Needs correction from alpha angle still...
-		MM_IonizationCluster IonizationCluster(hitx, pathLengthTraveled*sin(theta), pathLengthTraveled*cos(theta));
-		IonizationCluster.createElectrons(m_random);
+		std::unique_ptr<MM_IonizationCluster> IonizationCluster = std::make_unique<MM_IonizationCluster>(hitx, pathLengthTraveled*sin(theta), pathLengthTraveled*cos(theta));
+		IonizationCluster -> createElectrons(m_random);
 
-		TVector2 initialPosition = IonizationCluster.getIonizationStart();
+		TVector2 initialPosition = IonizationCluster->getIonizationStart();
 
 		ATH_MSG_DEBUG("New interaction starting at x,y, pathLengthTraveled: "
 			<< initialPosition.X()
@@ -233,16 +233,16 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
 			<< pathLengthTraveled
 			);
 
-        for (auto& Electron : IonizationCluster.getElectrons()) {
+        for (auto& Electron : IonizationCluster->getElectrons()) {
             Electron->setOffsetPosition(getTransverseDiffusion(initialPosition.Y()) , getLongitudinalDiffusion(initialPosition.Y()) );
         }
 
-		IonizationCluster.propagateElectrons( lorentzAngle , m_driftVelocity );
+		IonizationCluster->propagateElectrons( lorentzAngle , m_driftVelocity );
 
 
 		int tmpEffectiveNElectrons = 0;
 
-		for (auto& Electron : IonizationCluster.getElectrons()){
+		for (auto& Electron : IonizationCluster->getElectrons()){
 
 			//float effectiveCharge = m_polyaFunction->GetRandom();
 			float effectiveCharge = getEffectiveCharge();
@@ -264,7 +264,7 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
 		if(m_writeOutputFile)	m_mapOfHistograms["effectiveNElectrons"]->Fill( tmpEffectiveNElectrons / m_avalancheGain);
 
 		//---
-		m_IonizationClusters.push_back(IonizationCluster);
+		m_IonizationClusters.push_back(std::move(IonizationCluster));
 
 		pathLengthTraveled +=  getPathLengthTraveled();
 
@@ -310,15 +310,16 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
 		if(m_outputFile) m_outputFile->cd();
 		TGraph grIonizationXZ( m_IonizationClusters.size() );
 		for (int iIonization=0; iIonization <  (int) m_IonizationClusters.size(); iIonization++) {
-			TVector2 ionizationPosition( m_IonizationClusters.at(iIonization).getIonizationStart() );
+			TVector2 ionizationPosition( m_IonizationClusters.at(iIonization)->getIonizationStart() );
 			grIonizationXZ.SetPoint( iIonization, ionizationPosition.X(), ionizationPosition.Y() );
 		}
 		grIonizationXZ.Write("ionizationXZ");
 
 		TGraph grElectronsXZ( stripResponseObject.getNElectrons() );
-		std::vector<MM_Electron*> tmpElectrons = stripResponseObject.getElectrons();
-		for (int iElectron=0; iElectron < (int) tmpElectrons.size(); iElectron++){
-			grElectronsXZ.SetPoint( iElectron, tmpElectrons.at(iElectron)->getX(), tmpElectrons.at(iElectron)->getY() );
+		int iElectron = 0;
+		for (const auto & electron: stripResponseObject.getElectrons()){
+			grElectronsXZ.SetPoint( iElectron, electron->getX(), electron->getY() );
+			iElectron++;
 		}
 		grElectronsXZ.Write("electronsXZ");
 	}