diff --git a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py
index 90cd8473c1d7cfca9fdf9f8864d12bcca385cb4a..76f996b721c1581818cf64997b219b897b562537 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py
+++ b/InnerDetector/InDetDigitization/PixelDigitization/python/PixelDigitizationConfig.py
@@ -34,8 +34,6 @@ def EnergyDepositionTool(name="EnergyDepositionTool", **kwargs):
     kwargs.setdefault("DeltaRayCut", 117.)
     kwargs.setdefault("nCols", 5)
     kwargs.setdefault("LoopLimit", 100000)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     kwargs.setdefault("doBichsel", hasattr(digitizationFlags, "doBichselSimulation") and digitizationFlags.doBichselSimulation())
     kwargs.setdefault("doBichselBetaGammaCut", 0.7)   # dEdx not quite consistent below this
     kwargs.setdefault("doDeltaRay", False)            # needs validation
@@ -53,8 +51,6 @@ def SensorSimPlanarTool(name="SensorSimPlanarTool", **kwargs):
         pixelLorentzAngleToolSetup = PixelLorentzAngleToolSetup()
     kwargs.setdefault("SiPropertiesTool", ToolSvc.PixelSiPropertiesTool)
     kwargs.setdefault("LorentzAngleTool", ToolSvc.PixelLorentzAngleTool)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     return CfgMgr.SensorSimPlanarTool(name, **kwargs)
 
 def SensorSim3DTool(name="SensorSim3DTool", **kwargs):
@@ -67,19 +63,13 @@ def SensorSim3DTool(name="SensorSim3DTool", **kwargs):
         from SiLorentzAngleSvc.PixelLorentzAngleToolSetup import PixelLorentzAngleToolSetup
         pixelLorentzAngleToolSetup = PixelLorentzAngleToolSetup()
     kwargs.setdefault("SiPropertiesTool", ToolSvc.PixelSiPropertiesTool)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     return CfgMgr.SensorSim3DTool(name, **kwargs)
 
 def SensorSimTool(name="SensorSimTool", **kwargs):
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     return CfgMgr.SensorSimTool(name, **kwargs)
 
 def FrontEndSimTool(name="FrontEndSimTool", **kwargs):
     from AthenaCommon.AppMgr import ToolSvc
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     kwargs.setdefault("PixelConditionsSummaryTool", ToolSvc.PixelConditionsSummaryTool)
     from AthenaCommon.BeamFlags import jobproperties
     if jobproperties.Beam.beamType == "cosmics" :
@@ -95,8 +85,6 @@ def FrontEndSimTool(name="FrontEndSimTool", **kwargs):
 
 def BarrelRD53SimTool(name="BarrelRD53SimTool", **kwargs):
     kwargs.setdefault("BarrelEC", 0)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     kwargs.setdefault("Analogthreshold", [-1, -1, -1, -1, -1])
     kwargs.setdefault("ToTthreshold", [-1, -1, -1, -1, -1])
     kwargs.setdefault("ThermalNoise", [160.0,160.0,160.0,160.0,160.0])
@@ -107,8 +95,6 @@ def BarrelRD53SimTool(name="BarrelRD53SimTool", **kwargs):
 
 def EndcapRD53SimTool(name="EndcapRD53SimTool", **kwargs):
     kwargs.setdefault("BarrelEC", 2)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
     kwargs.setdefault("Analogthreshold", [-1, -1, -1, -1, -1])
     kwargs.setdefault("ToTthreshold", [-1, -1, -1, -1, -1])
     kwargs.setdefault("ThermalNoise", [160.0,160.0,160.0,160.0,160.0])
@@ -119,8 +105,6 @@ def EndcapRD53SimTool(name="EndcapRD53SimTool", **kwargs):
 
 def BarrelFEI4SimTool(name="BarrelFEI4SimTool", **kwargs):
     kwargs.setdefault("BarrelEC", 0)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
 
     from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg
     PixelConfigCondAlg.BarrelAnalogThreshold=[-1]
@@ -136,8 +120,6 @@ def BarrelFEI4SimTool(name="BarrelFEI4SimTool", **kwargs):
 
 def DBMFEI4SimTool(name="DBMFEI4SimTool", **kwargs):
     kwargs.setdefault("BarrelEC", 4)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
 
     from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg
     PixelConfigCondAlg.DBMAnalogThreshold=[-1,-1,-1]
@@ -153,8 +135,6 @@ def DBMFEI4SimTool(name="DBMFEI4SimTool", **kwargs):
 
 def BarrelFEI3SimTool(name="BarrelFEI3SimTool", **kwargs):
     kwargs.setdefault("BarrelEC", 0)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
 
     from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg
     PixelConfigCondAlg.BarrelAnalogThreshold=[-1,-1,-1,-1]
@@ -173,8 +153,6 @@ def BarrelFEI3SimTool(name="BarrelFEI3SimTool", **kwargs):
 
 def EndcapFEI3SimTool(name="EndcapFEI3SimTool", **kwargs):
     kwargs.setdefault("BarrelEC", 2)
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    kwargs.setdefault("RndmEngine", "PixelDigitization")
 
     from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg
     PixelConfigCondAlg.EndcapAnalogThreshold=[-1,-1,-1,]
@@ -193,10 +171,6 @@ def EndcapFEI3SimTool(name="EndcapFEI3SimTool", **kwargs):
 
 def BasicPixelDigitizationTool(name="PixelDigitizationTool", **kwargs):
     from AthenaCommon import CfgGetter
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc())
-    streamName = kwargs.setdefault("RndmEngine", "PixelDigitization")
-    if not digitizationFlags.rndmSeedList.checkForExistingSeed(streamName):
-        digitizationFlags.rndmSeedList.addSeed(streamName, 10513239, 492615104 )
     from AthenaCommon.Resilience import protectedInclude
     from AthenaCommon.Include import include
     from AthenaCommon.AppMgr import ServiceMgr
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx
index 35d81ed24b9433a5097afc2d95dd24446e99ce74..6ecdcb7e24f7c3db01c087d736b38ee3bfc007ad 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -46,10 +46,7 @@ EnergyDepositionTool::EnergyDepositionTool(const std::string& type, const std::s
   m_doBichsel(false),
   m_doBichselBetaGammaCut(0.1),        // replace momentum cut
   m_doDeltaRay(false),                 // need validation
-  m_doPU(true),
-  m_rndmSvc("AtDSFMTGenSvc",name),
-  m_rndmEngineName("PixelDigitization"),
-  m_rndmEngine(0)
+  m_doPU(true)
 { 
 
   declareProperty("DeltaRayCut", m_DeltaRayCut = 117.);
@@ -62,8 +59,6 @@ EnergyDepositionTool::EnergyDepositionTool(const std::string& type, const std::s
   declareProperty("doBichselBetaGammaCut", m_doBichselBetaGammaCut, "minimum beta-gamma for particle to be re-simulated through Bichsel Model");
   declareProperty("doDeltaRay", m_doDeltaRay, "whether we simulate delta-ray using Bichsel model");
   declareProperty("doPU", m_doPU, "Whether we apply Bichsel model on PU");
-  declareProperty("RndmSvc", m_rndmSvc, "Random Number Service used in EnergyDepositionTool");
-  declareProperty("RndmEngine", m_rndmEngineName, "Random engine name");
 }
 
 // Destructor:
@@ -74,8 +69,6 @@ EnergyDepositionTool::~EnergyDepositionTool(){}
 //=======================================
 StatusCode EnergyDepositionTool::initialize() {
   
-  CHECK(AthAlgTool::initialize());
-  CHECK(m_rndmSvc.retrieve());
   ATH_MSG_INFO("You are using EnergyDepositionTool for solid-state silicon detectors.");
 
   //Setup distortions tool
@@ -90,17 +83,6 @@ StatusCode EnergyDepositionTool::initialize() {
     }
   }
 
-  // get the random stream
-  ATH_MSG_DEBUG ( "Getting random number engine : <" << m_rndmEngineName << ">" );
-  m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName);
-  if (!m_rndmEngine) {
-    ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName);
-    return StatusCode::FAILURE;
-  }
-  else {
-    ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName);
-  }
-
   if(m_doBichsel){
     // Load Bichsel data
     m_BichselData.clear();
@@ -185,7 +167,7 @@ StatusCode EnergyDepositionTool::finalize() {
 //=======================================
 // D E P O S I T  E N E R G Y
 //=======================================
-StatusCode EnergyDepositionTool::depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions){
+StatusCode EnergyDepositionTool::depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine){
 
   ATH_MSG_DEBUG("Deposit energy in sensor volume.");
   
@@ -293,7 +275,7 @@ StatusCode EnergyDepositionTool::depositEnergy(const TimedHitPtr<SiHit> &phit, c
     //double iTotalLength = pathLength*1000.;   // mm -> micrometer
 
     // begin simulation
-    std::vector<std::pair<double,double> > rawHitRecord = BichselSim(iBetaGamma, iParticleType, iTotalLength, genPart ? (genPart->momentum().e()/CLHEP::MeV) : (phit->energyLoss()/CLHEP::MeV));
+    std::vector<std::pair<double,double> > rawHitRecord = BichselSim(iBetaGamma, iParticleType, iTotalLength, genPart ? (genPart->momentum().e()/CLHEP::MeV) : (phit->energyLoss()/CLHEP::MeV), rndmEngine);
 
     // check if returned simulation result makes sense
     if(rawHitRecord.size() == 0){ // deal with rawHitRecord==0 specifically -- no energy deposition
@@ -360,7 +342,7 @@ void EnergyDepositionTool::simulateBow(const InDetDD::SiDetectorElement * elemen
 // InciEnergy should be in MeV
 // In case there is any abnormal in runtime, (-1,-1) will be returned indicating old deposition model should be used instead
 //-----------------------------------------------------------
-std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy) const{
+std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy, CLHEP::HepRandomEngine *rndmEngine) const{
   ATH_MSG_DEBUG("Begin EnergyDepositionTool::BichselSim");
 
   // prepare hit record (output)
@@ -410,7 +392,7 @@ std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double B
     // sample hit position -- exponential distribution
     double HitPosition = 0.;
     for(int iHit = 0; iHit < m_nCols; iHit++){
-	   HitPosition += CLHEP::RandExpZiggurat::shoot(m_rndmEngine, lambda);
+	   HitPosition += CLHEP::RandExpZiggurat::shoot(rndmEngine, lambda);
     }
     // termination by hit position
     // yes, in case m_nCols > 1, we will loose the last m_nCols collisions. So m_nCols cannot be too big
@@ -420,7 +402,7 @@ std::vector<std::pair<double,double> > EnergyDepositionTool::BichselSim(double B
     // sample single collision
     double TossEnergyLoss = -1.;
     while(TossEnergyLoss <= 0.){ // we have to do this because sometimes TossEnergyLoss will be negative due to too small TossIntX
-      double TossIntX = CLHEP::RandFlat::shoot(m_rndmEngine, 0., IntXUpperBound);
+      double TossIntX = CLHEP::RandFlat::shoot(rndmEngine, 0., IntXUpperBound);
       TossEnergyLoss = GetColE(indices_BetaGammaLog10, TMath::Log10(TossIntX), iData);
     }
 
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h
index 0c03088d6facb47e1989650708931fb32b52a0b4..3a283c7bab475f10812147dd41f7a3fdc576dff0 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/EnergyDepositionTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -23,7 +23,6 @@
 #include "GaudiKernel/ServiceHandle.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "CLHEP/Random/RandomEngine.h"
-#include "AthenaKernel/IAtRndmGenSvc.h"
 #include "GaudiKernel/ToolHandle.h"
 #include "GaudiKernel/Property.h"
 #include "GaudiKernel/Service.h"
@@ -60,12 +59,12 @@ public:
   virtual ~EnergyDepositionTool();
   StatusCode initTools();
   
-  std::vector<std::pair<double,double> > BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy) const;   // output hit record in the format (hit position, energy loss)
+  std::vector<std::pair<double,double> > BichselSim(double BetaGamma, int ParticleType, double TotalLength, double InciEnergy, CLHEP::HepRandomEngine *rndmEngine) const;   // output hit record in the format (hit position, energy loss)
   
   std::vector<std::pair<double,double> > ClusterHits(std::vector<std::pair<double,double> >& rawHitRecord, int n_pieces) const;         // cluster hits into n steps (there could be thousands of hit)
   int trfPDG(int pdgId) const;                                                             // convert pdgId to ParticleType. If it is unsupported particle, -1 is returned.
   
-  virtual StatusCode depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions);
+  virtual StatusCode depositEnergy(const TimedHitPtr<SiHit> &phit, const InDetDD::SiDetectorElement &Module, std::vector<std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine);
 
 
 // Variables
@@ -89,11 +88,6 @@ private:
   PublicToolHandle<IModuleDistortionsTool> m_pixDistoTool
      {this,"PixelDistortionsTool","PixelDistortionsTool",""};
 
-protected:
-  ServiceHandle<IAtRndmGenSvc> m_rndmSvc;
-  std::string                  m_rndmEngineName;
-  CLHEP::HepRandomEngine*      m_rndmEngine;
-
 // Functions
 private:
   void simulateBow(const InDetDD::SiDetectorElement * element,double& xi, double& yi, const double zi, double& xf, double& yf, const double zf) const;
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx
index 5a9b27cc03129b4b9affcbdd26749de40278f521..538b73db2b12e88e0c8896135ebd7f7b62a8097b 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "FEI3SimTool.h"
@@ -24,7 +24,7 @@ StatusCode FEI3SimTool::finalize() {
 	return StatusCode::SUCCESS;
 }
 
-void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) {
+void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) {
 
   const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design());
   if (p_design->getReadoutTechnology()!=InDetDD::PixelModuleDesign::FEI3) { return; }
@@ -44,13 +44,13 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
   CrossTalk(module_data->getCrossTalk(barrel_ec,layerIndex),chargedDiodes);
 
   // Add thermal noise
-  ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes);
+  ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes, rndmEngine);
 
   // Add random noise
-  RandomNoise(chargedDiodes);
+  RandomNoise(chargedDiodes, rndmEngine);
 
   // Add random diabled pixels
-  RandomDisable(chargedDiodes);
+  RandomDisable(chargedDiodes, rndmEngine);
 
   for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) {
     // Merge ganged pixel
@@ -92,17 +92,17 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
     double th0  = m_pixelCalibSvc->getThreshold(diodeID);
     double ith0 = m_pixelCalibSvc->getTimeWalk(diodeID);
 
-    double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+    double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine);
     double intimethreshold = (ith0/th0)*threshold;
 
     if (charge>threshold) {
       int bunchSim;
       if ((*i_chargedDiode).second.totalCharge().fromTrack()) {
-        if (m_timingTune==2015) { bunchSim = relativeBunch2015((*i_chargedDiode).second.totalCharge(),barrel_ec,layerIndex,moduleIndex); }
-        else                    { bunchSim = relativeBunch2009(threshold,intimethreshold,(*i_chargedDiode).second.totalCharge()); }
+        if (m_timingTune==2015) { bunchSim = relativeBunch2015((*i_chargedDiode).second.totalCharge(),barrel_ec,layerIndex,moduleIndex, rndmEngine); }
+        else                    { bunchSim = relativeBunch2009(threshold,intimethreshold,(*i_chargedDiode).second.totalCharge(), rndmEngine); }
       } 
       else {
-        bunchSim = CLHEP::RandFlat::shootInt(m_rndmEngine,m_timeBCN);
+        bunchSim = CLHEP::RandFlat::shootInt(rndmEngine,m_timeBCN);
       }
 
       if (bunchSim<0 || bunchSim>m_timeBCN) { SiHelper::belowThreshold((*i_chargedDiode).second,true,true); }
@@ -117,7 +117,7 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
     // charge to ToT conversion
     double tot    = m_pixelCalibSvc->getTotMean(diodeID,charge);
     double totsig = m_pixelCalibSvc->getTotRes(diodeID,tot);
-    int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,tot,totsig));
+    int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine,tot,totsig));
 
     if (nToT<1) { nToT=1; }
 
@@ -163,7 +163,7 @@ void FEI3SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
   return;
 }
 
-int FEI3SimTool::relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge) const {
+int FEI3SimTool::relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge, CLHEP::HepRandomEngine *rndmEngine) const {
 
   int BCID=0;
   double myTimeWalkEff = 0.;
@@ -180,9 +180,9 @@ int FEI3SimTool::relativeBunch2009(const double threshold, const double intimeth
 
   double myTimeWalk    = -p0 -p1 * log(1. - threshold/totalCharge.charge());
 
-  myTimeWalkEff = myTimeWalk+myTimeWalk*0.2*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+  myTimeWalkEff = myTimeWalk+myTimeWalk*0.2*CLHEP::RandGaussZiggurat::shoot(rndmEngine);
 
-  double randomjitter  = CLHEP::RandFlat::shoot(m_rndmEngine,(-m_timeJitter/2.0),(m_timeJitter/2.0));    	
+  double randomjitter  = CLHEP::RandFlat::shoot(rndmEngine,(-m_timeJitter/2.0),(m_timeJitter/2.0));    	
 
   //double G4Time	 = totalCharge.time();
 
@@ -195,7 +195,7 @@ int FEI3SimTool::relativeBunch2009(const double threshold, const double intimeth
 }
 
 // This is the new parameterization based on the 2015 collision data.
-int FEI3SimTool::relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID) const {
+int FEI3SimTool::relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID, CLHEP::HepRandomEngine *rndmEngine) const {
 
   /**
    * 2016.03.29  Soshi.Tsuno@cern.ch
@@ -394,7 +394,7 @@ int FEI3SimTool::relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_
   }
 
   double G4Time = getG4Time(totalCharge);
-  double rnd    = CLHEP::RandFlat::shoot(m_rndmEngine,0.0,1.0);    	
+  double rnd    = CLHEP::RandFlat::shoot(rndmEngine,0.0,1.0);    	
 
   double timeWalk = 0.0;
   if (rnd<prob) { timeWalk = 25.0; }
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h
index bb9ee5f15fbc7fa4177620873cffd5d869edca09..f0a243bbf21f429193113ac6f6ac464212a41671 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI3SimTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PIXELDIGITIZATION_FEI3SimTool_H
@@ -16,16 +16,16 @@ class FEI3SimTool:public FrontEndSimTool {
     virtual StatusCode initialize();
     virtual StatusCode finalize();
     virtual ~FEI3SimTool();
-    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection);
+    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine);
 
   private:
     FEI3SimTool();
 
     int m_timingTune;
 
-    int relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge) const;
+    int relativeBunch2009(const double threshold, const double intimethreshold, const SiTotalCharge &totalCharge, CLHEP::HepRandomEngine *rndmEngine) const;
 
-    int relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID) const;
+    int relativeBunch2015(const SiTotalCharge &totalCharge, int barrel_ec, int layer_disk, int moduleID, CLHEP::HepRandomEngine *rndmEngine) const;
 
 };
 
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx
index 5c60ef49c0b36c26e55028719d9e864ae5ba35c9..31bffcc877bdb83fd696e2f420bdca590df884d8 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "FEI4SimTool.h"
@@ -23,7 +23,7 @@ StatusCode FEI4SimTool::finalize() {
 	return StatusCode::SUCCESS;
 }
 
-void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) {
+void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) {
 
   const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design());
   if (p_design->getReadoutTechnology()!=InDetDD::PixelModuleDesign::FEI4) { return; }
@@ -52,13 +52,13 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
   CrossTalk(module_data->getCrossTalk(barrel_ec,layerIndex),chargedDiodes);
 
   // Add thermal noise
-  ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes);
+  ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes,rndmEngine);
 
   // Add random noise
-  RandomNoise(chargedDiodes);
+  RandomNoise(chargedDiodes,rndmEngine);
 
   // Add random diabled pixels
-  RandomDisable(chargedDiodes);
+  RandomDisable(chargedDiodes,rndmEngine);
 
   for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) {
 
@@ -68,7 +68,7 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
     // Apply analogu threshold, timing simulation
     double th0  = m_pixelCalibSvc->getThreshold(diodeID);
 
-    double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+    double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine);
 
     if (charge>threshold) {
       int bunchSim;
@@ -76,7 +76,7 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
         bunchSim = static_cast<int>(floor((getG4Time((*i_chargedDiode).second.totalCharge())+m_timeZero)/m_timePerBCO));
       } 
       else {
-        bunchSim = CLHEP::RandFlat::shootInt(m_rndmEngine,m_timeBCN);
+        bunchSim = CLHEP::RandFlat::shootInt(rndmEngine,m_timeBCN);
       }
 
       if (bunchSim<0 || bunchSim>m_timeBCN) { SiHelper::belowThreshold((*i_chargedDiode).second,true,true); }
@@ -91,7 +91,7 @@ void FEI4SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
     // charge to ToT conversion
     double tot    = m_pixelCalibSvc->getTotMean(diodeID,charge);
     double totsig = m_pixelCalibSvc->getTotRes(diodeID,tot);
-    int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,tot,totsig));
+    int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine,tot,totsig));
 
     const PixelID* pixelId = static_cast<const PixelID*>(chargedDiodes.element()->getIdHelper());
     if (pixelId->is_dbm(chargedDiodes.element()->identify())) {
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h
index 0fb43666b816dcb898dcf7b24f3e1954e98ac603..a4a4498f8f6d3bbc8792893d9da8e6412bbfd86d 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FEI4SimTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PIXELDIGITIZATION_FEI4SimTool_H
@@ -16,7 +16,7 @@ class FEI4SimTool:public FrontEndSimTool {
     virtual StatusCode initialize();
     virtual StatusCode finalize();
     virtual ~FEI4SimTool();
-    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection);
+    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine);
 
   private:
     FEI4SimTool();
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h
index febdeab91d8df71ede548a9c79a45cb0282097a6..8061165bb9a915518efe0b41f6f6e33fa389167e 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/FrontEndSimTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PIXELDIGITIZATION_FrontEndSimTool_H
@@ -39,9 +39,6 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
   public:
     FrontEndSimTool( const std::string& type, const std::string& name,const IInterface* parent):
       AthAlgTool(type,name,parent),
-      m_rndmSvc("AtRndmGenSvc",name),
-      m_rndmEngineName("PixelDigitization"),
-      m_rndmEngine(nullptr),
       m_pixelCalibSvc("PixelCalibSvc",name),
       m_timeBCN(1),
       m_timeZero(5.0),
@@ -57,8 +54,6 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
       m_disableProbability(9e-3)
   {
     declareInterface<FrontEndSimTool>(this);
-    declareProperty("RndmSvc",                   m_rndmSvc,        "Random number service used in FE simulation");
-    declareProperty("RndmEngine",                m_rndmEngineName, "Random engine name");
     declareProperty("PixelCalibSvc",             m_pixelCalibSvc);
 	  declareProperty("TimeBCN",                   m_timeBCN,        "Number of BCID");	
 	  declareProperty("TimeZero",                  m_timeZero,       "Time zero...?");
@@ -74,25 +69,12 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
     static const InterfaceID& interfaceID() { return IID_IFrontEndSimTool; }
 
     virtual StatusCode initialize() {
-      ATH_CHECK(AthAlgTool::initialize()); 
-
-      ATH_CHECK(m_rndmSvc.retrieve());
-
       ATH_CHECK(m_pixelConditionsTool.retrieve());
 
       ATH_CHECK(m_pixelCalibSvc.retrieve());
 
       ATH_CHECK(m_moduleDataKey.initialize());
 
-      m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName);
-      if (!m_rndmEngine) {
-        ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName);
-        return StatusCode::FAILURE;
-      }
-      else {
-        ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName);
-      }
-
       ATH_CHECK(m_ComTimeKey.initialize(m_useComTime));
       if (m_useComTime) {
         SG::ReadHandle<ComTime> comTime(m_ComTimeKey);
@@ -109,7 +91,7 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
 
     virtual StatusCode finalize() { return StatusCode::FAILURE; }
     virtual ~FrontEndSimTool() {}
-    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) = 0;
+    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) = 0;
 
     void CrossTalk(double crossTalk, SiChargedDiodeCollection &chargedDiodes) const {
       const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design());
@@ -141,21 +123,21 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
       return;
     }
 
-    void ThermalNoise(double thermalNoise, SiChargedDiodeCollection &chargedDiodes) const {
+    void ThermalNoise(double thermalNoise, SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine) const {
       for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) {
-        SiCharge charge(thermalNoise*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine),0,SiCharge::noise);
+        SiCharge charge(thermalNoise*CLHEP::RandGaussZiggurat::shoot(rndmEngine),0,SiCharge::noise);
         (*i_chargedDiode).second.add(charge);
       }
       return;
     }
 
-    void RandomNoise(SiChargedDiodeCollection &chargedDiodes) const {
+    void RandomNoise(SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine) const {
       const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design());
-      int nNoise = CLHEP::RandPoisson::shoot(m_rndmEngine, p_design->numberOfCircuits()*p_design->columnsPerCircuit()*p_design->rowsPerCircuit()*m_noiseOccupancy*static_cast<double>(m_timeBCN)); 
+      int nNoise = CLHEP::RandPoisson::shoot(rndmEngine, p_design->numberOfCircuits()*p_design->columnsPerCircuit()*p_design->rowsPerCircuit()*m_noiseOccupancy*static_cast<double>(m_timeBCN)); 
       for (int i=0; i<nNoise; i++) {
-        int circuit = CLHEP::RandFlat::shootInt(m_rndmEngine,p_design->numberOfCircuits());
-        int column  = CLHEP::RandFlat::shootInt(m_rndmEngine,p_design->columnsPerCircuit());
-        int row     = CLHEP::RandFlat::shootInt(m_rndmEngine,p_design->rowsPerCircuit());
+        int circuit = CLHEP::RandFlat::shootInt(rndmEngine,p_design->numberOfCircuits());
+        int column  = CLHEP::RandFlat::shootInt(rndmEngine,p_design->columnsPerCircuit());
+        int row     = CLHEP::RandFlat::shootInt(rndmEngine,p_design->rowsPerCircuit());
         if (row>159 && p_design->getReadoutTechnology()==InDetDD::PixelModuleDesign::FEI3) { row += 8; } // jump over ganged pixels - rowsPerCircuit == 320 above
 
         InDetDD::SiReadoutCellId roCell(row, p_design->columnsPerCircuit()*circuit+column);
@@ -164,13 +146,13 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
         if (roCell.isValid()) {
           InDetDD::SiCellId diodeNoise = roCell;
 
-          double x = CLHEP::RandFlat::shoot(m_rndmEngine,0.,1.);
+          double x = CLHEP::RandFlat::shoot(rndmEngine,0.,1.);
           int bin=0;
           for (size_t j=1; j<m_noiseShape.size(); j++) {
             if (x>m_noiseShape[j-1] && x<=m_noiseShape[j]) { bin=j-1; continue; }
           }
           double noiseToTm = bin+1.5;
-          double noiseToT = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,noiseToTm,1.);
+          double noiseToT = CLHEP::RandGaussZiggurat::shoot(rndmEngine,noiseToTm,1.);
 
           double chargeShape = m_pixelCalibSvc->getCharge(noisyID,noiseToT);
           chargedDiodes.add(diodeNoise,SiCharge(chargeShape,0,SiCharge::noise));
@@ -179,9 +161,9 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
       return;
     }
 
-    void RandomDisable(SiChargedDiodeCollection &chargedDiodes) const {
+    void RandomDisable(SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine) const {
       for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) {
-        if (CLHEP::RandFlat::shoot(m_rndmEngine)<m_disableProbability) {
+        if (CLHEP::RandFlat::shoot(rndmEngine)<m_disableProbability) {
           SiHelper::disabled((*i_chargedDiode).second,true,false);
         }
       }
@@ -193,10 +175,6 @@ class FrontEndSimTool:public AthAlgTool,virtual public IAlgTool {
     FrontEndSimTool();
 
   protected:
-    ServiceHandle<IAtRndmGenSvc> m_rndmSvc;
-    std::string                  m_rndmEngineName;
-    CLHEP::HepRandomEngine      *m_rndmEngine;	
-
     ToolHandle<IInDetConditionsTool> m_pixelConditionsTool{this, "PixelConditionsSummaryTool", "PixelConditionsSummaryTool", "Tool to retrieve Pixel Conditions summary"};
     ServiceHandle<IPixelCalibSvc>        m_pixelCalibSvc;
 
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx
index 18bc72721de1c1d24d05f5eb6f84338356e1ed98..19ccde868875605bdafa2d6b4732675f754943c2 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ////////////////////////////////////////////////////////////////////////////
@@ -16,6 +16,10 @@
 #include "Identifier/Identifier.h"
 #include "InDetIdentifier/PixelID.h"
 
+// Random Number Generation
+#include "AthenaKernel/RNGWrapper.h"
+#include "CLHEP/Random/RandomEngine.h"
+
 #include <limits>
 #include <cstdint>
 static constexpr unsigned int crazyParticleBarcode(std::numeric_limits<int32_t>::max());
@@ -29,7 +33,6 @@ PixelDigitizationTool::PixelDigitizationTool(const std::string &type,
   m_simDataCollKey("PixelSDO_Map"),
   m_HardScatterSplittingMode(0),
   m_HardScatterSplittingSkipper(false),
-  m_rndmEngineName("PixelDigitization"),
   m_onlyHitElements(false),
   m_chargeTool(nullptr),
   m_fesimTool(nullptr),
@@ -37,9 +40,7 @@ PixelDigitizationTool::PixelDigitizationTool(const std::string &type,
   m_detID(nullptr),
   m_vetoThisBarcode(crazyParticleBarcode),
   m_timedHits(nullptr),
-  m_rndmSvc("AtRndmGenSvc",name),
   m_mergeSvc("PileUpMergeSvc",name),
-  m_rndmEngine(nullptr),
   m_detManager(nullptr),
   m_inputObjectName(""),
   m_createNoiseSDO(false)
@@ -47,13 +48,11 @@ PixelDigitizationTool::PixelDigitizationTool(const std::string &type,
   declareProperty("ChargeTools",      m_chargeTool,      "List of charge tools");
   declareProperty("FrontEndSimTools", m_fesimTool,       "List of Front-End simulation tools");
   declareProperty("EnergyDepositionTool",   m_energyDepositionTool,       "Energy deposition tool");
-  declareProperty("RndmSvc",          m_rndmSvc,         "Random number service used in Pixel Digitization");
   declareProperty("MergeSvc",         m_mergeSvc,        "Merge service used in Pixel digitization");
   declareProperty("InputObjectName",  m_inputObjectName, "Input Object name" );
   declareProperty("CreateNoiseSDO",   m_createNoiseSDO,  "Set create noise SDO flag");
   declareProperty("RDOCollName",      m_rdoContainerKey, "RDO collection name");
   declareProperty("SDOCollName",      m_simDataCollKey,  "SDO collection name");
-  declareProperty("RndmEngine",       m_rndmEngineName,  "Random engine name");
   declareProperty("OnlyHitElements",  m_onlyHitElements, "Process only elements with hits");
   declareProperty("HardScatterSplittingMode", m_HardScatterSplittingMode, "Control pileup & signal splitting" );
   declareProperty("ParticleBarcodeVeto",m_vetoThisBarcode=crazyParticleBarcode, "Barcode of particle to ignore");
@@ -78,15 +77,7 @@ StatusCode PixelDigitizationTool::initialize() {
   CHECK(m_mergeSvc.retrieve());
 
   // Initialize random number generator
-  CHECK(m_rndmSvc.retrieve());
-  m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName);
-  if (!m_rndmEngine) {
-    ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName);
-    return StatusCode::FAILURE;
-  }
-  else {
-    ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName);
-  }
+  ATH_CHECK(m_rndmSvc.retrieve());
 
   // Initialize detector manager
   CHECK(detStore()->retrieve(m_detManager,"Pixel"));
@@ -161,6 +152,11 @@ StatusCode PixelDigitizationTool::digitizeEvent() {
   std::vector<bool> processedElements;
   processedElements.resize(m_detID->wafer_hash_max(),false);
 
+  // Set the RNG to use for this event.
+  ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this);
+  rngWrapper->setSeed( name(), Gaudi::Hive::currentContext() );
+  CLHEP::HepRandomEngine *rndmEngine = *rngWrapper;
+
   TimedHitCollection<SiHit>::const_iterator firstHit, lastHit;
   
   ////////////////////////////////////////////////
@@ -198,12 +194,12 @@ StatusCode PixelDigitizationTool::digitizeEvent() {
         ATH_MSG_DEBUG("Running sensor simulation.");
 
         //Deposit energy in sensor
-        CHECK(m_energyDepositionTool->depositEnergy( *phit,  *sielement, trfHitRecord, initialConditions));
+        CHECK(m_energyDepositionTool->depositEnergy( *phit,  *sielement, trfHitRecord, initialConditions, rndmEngine));
 
         //Create signal in sensor, loop over collection of loaded sensorTools
         for (unsigned int itool=0; itool<m_chargeTool.size(); itool++) {
           ATH_MSG_DEBUG("Executing tool " << m_chargeTool[itool]->name());
-          if (m_chargeTool[itool]->induceCharge( *phit, *chargedDiodes, *sielement, *p_design, trfHitRecord, initialConditions)==StatusCode::FAILURE) { break; }
+          if (m_chargeTool[itool]->induceCharge( *phit, *chargedDiodes, *sielement, *p_design, trfHitRecord, initialConditions, rndmEngine)==StatusCode::FAILURE) { break; }
         }
         initialConditions.clear();
         trfHitRecord.clear();
@@ -226,7 +222,7 @@ StatusCode PixelDigitizationTool::digitizeEvent() {
     RDOColl->setIdentifier(chargedDiodes->identify());
     for (unsigned int itool=0; itool<m_fesimTool.size(); itool++) {
       ATH_MSG_DEBUG("Executing tool " << m_fesimTool[itool]->name());
-      m_fesimTool[itool]->process(*chargedDiodes,*RDOColl);
+      m_fesimTool[itool]->process(*chargedDiodes,*RDOColl, rndmEngine);
     }
     CHECK(m_rdoContainer->addCollection(RDOColl,RDOColl->identifyHash()));
 
@@ -260,7 +256,7 @@ StatusCode PixelDigitizationTool::digitizeEvent() {
           RDOColl->setIdentifier(chargedDiodes->identify());
           for (unsigned int itool=0; itool<m_fesimTool.size(); itool++) {
             ATH_MSG_DEBUG("Executing tool " << m_fesimTool[itool]->name());
-            m_fesimTool[itool]->process(*chargedDiodes,*RDOColl);
+            m_fesimTool[itool]->process(*chargedDiodes,*RDOColl, rndmEngine);
           }
           CHECK(m_rdoContainer->addCollection(RDOColl,RDOColl->identifyHash()));
 
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h
index 45a617528360988e0c04e5288d8e19186abe7eab..894b5fdaaba14b01b9bd2303101a9fb4b9b0b645 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/PixelDigitizationTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -13,6 +13,7 @@
 
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "PileUpTools/PileUpToolBase.h"
+#include "AthenaKernel/IAthRNGSvc.h"
 #include "HitManagement/TimedHitCollection.h"
 #include "InDetSimEvent/SiHitCollection.h"
 
@@ -63,7 +64,6 @@ class PixelDigitizationTool : public PileUpToolBase {
 
     int               m_HardScatterSplittingMode;
     bool              m_HardScatterSplittingSkipper;
-    std::string       m_rndmEngineName;
 
     bool              m_onlyHitElements;
 
@@ -79,10 +79,9 @@ class PixelDigitizationTool : public PileUpToolBase {
 
   protected:
 
-    ServiceHandle <IAtRndmGenSvc> m_rndmSvc;
+    ServiceHandle<IAthRNGSvc> m_rndmSvc{this, "RndmSvc", "AthRNGSvc", ""};  //!< Random number service
     ServiceHandle <PileUpMergeSvc> m_mergeSvc;
 
-    CLHEP::HepRandomEngine *m_rndmEngine;
     const InDetDD::PixelDetectorManager *m_detManager;
 
     std::string   m_inputObjectName;
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx
index ce1db9c65c177679ab66315d2c3c058b48e97345..477833db1d248479028b050219409ffe99c1e76b 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "RD53SimTool.h"
@@ -30,7 +30,7 @@ StatusCode RD53SimTool::finalize() {
 	return StatusCode::SUCCESS;
 }
 
-void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection) {
+void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine) {
 
   const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&(chargedDiodes.element())->design());
   if (p_design->getReadoutTechnology()!=InDetDD::PixelModuleDesign::RD53) { return; }
@@ -59,13 +59,13 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
   CrossTalk(module_data->getCrossTalk(barrel_ec,layerIndex),chargedDiodes);
 
   // Add thermal noise
-  ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes);
+  ThermalNoise(module_data->getThermalNoise(barrel_ec,layerIndex),chargedDiodes,rndmEngine);
 
   // Add random noise
-  RandomNoise(chargedDiodes);
+  RandomNoise(chargedDiodes,rndmEngine);
 
   // Add random diabled pixels
-  RandomDisable(chargedDiodes);
+  RandomDisable(chargedDiodes,rndmEngine);
 
   for (SiChargedDiodeIterator i_chargedDiode=chargedDiodes.begin(); i_chargedDiode!=chargedDiodes.end(); ++i_chargedDiode) {
 
@@ -75,7 +75,7 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
     // Apply analogu threshold, timing simulation
     double th0  = m_pixelCalibSvc->getThreshold(diodeID);
 
-    double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+    double threshold = th0+m_pixelCalibSvc->getThresholdSigma(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine)+m_pixelCalibSvc->getNoise(diodeID)*CLHEP::RandGaussZiggurat::shoot(rndmEngine);
 
     if (charge>threshold) {
 
@@ -84,7 +84,7 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
         bunchSim = static_cast<int>(floor((getG4Time((*i_chargedDiode).second.totalCharge())+m_timeZero)/m_timePerBCO));
       } 
       else {
-        bunchSim = CLHEP::RandFlat::shootInt(m_rndmEngine,m_timeBCN);
+        bunchSim = CLHEP::RandFlat::shootInt(rndmEngine,m_timeBCN);
       }
 
       if (bunchSim<0 || bunchSim>m_timeBCN) { SiHelper::belowThreshold((*i_chargedDiode).second,true,true); }
@@ -99,7 +99,7 @@ void RD53SimTool::process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Colle
     // charge to ToT conversion
     double tot    = m_pixelCalibSvc->getTotMean(diodeID,charge);
     double totsig = m_pixelCalibSvc->getTotRes(diodeID,tot);
-    int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(m_rndmEngine,tot,totsig));
+    int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine,tot,totsig));
 
     if (nToT<1) { nToT=1; }
 
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h
index 9ee97d417b4a65599c2d407775e7481f751e8e76..e31d8ee227400f87f93ac4f896a0685cc2376d55 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/RD53SimTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PIXELDIGITIZATION_RD53SimTool_H
@@ -16,7 +16,7 @@ class RD53SimTool:public FrontEndSimTool {
     virtual StatusCode initialize();
     virtual StatusCode finalize();
     virtual ~RD53SimTool();
-    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection);
+    virtual void process(SiChargedDiodeCollection &chargedDiodes,PixelRDO_Collection &rdoCollection, CLHEP::HepRandomEngine *rndmEngine);
 
   private:
     RD53SimTool();
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx
index e27462ee0eafbbf7498e2e6027c299a17c666550..59ca1fe472bfbc344b91b942c69dbff9377bb8af 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -69,7 +69,7 @@ StatusCode SensorSim3DTool::finalize() {
 //===============================================
 //    I N D U C E    C H A R G E
 //===============================================
-StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions) {
+StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine * /*rndmEngine*/) {
 
 
   if (!Module.isBarrel()) { return StatusCode::SUCCESS; }
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h
index fb0e798d89e4c50566363cbfb82139317d62c3f0..d32b8e8c7ab9f123d25bed6c9e8ef57e46ef7984 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PIXELDIGITIZATION_SensorSim3DTool_H
@@ -18,7 +18,7 @@ class SensorSim3DTool : public SensorSimTool {
     virtual StatusCode finalize();
     virtual ~SensorSim3DTool();
 
-    virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions);  
+    virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine);  
 
 
   private:
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx
index e30d2d63f120f06d8acdb2eb3f0aea6fe7ed4f08..b41b58cf6cfdc5f1a759b63eacafa05ef2a8e85e 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -66,7 +66,7 @@ StatusCode SensorSimPlanarTool::finalize() {
 //===============================================
 //    I N D U C E    C H A R G E
 //===============================================
-StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions) {
+StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection &chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine) {
 
   // So far, this is only discriminating variable from 3D sensor.
   if (p_design.numberOfCircuits()<2){
@@ -96,7 +96,7 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiC
   if (Module.isDBM()){
     eleholePairEnergy = 1. / (13. * CLHEP::eV); // was 3.62 eV.
     m_diffusionConstant = .00265;
-    smearRand = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+    smearRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine);
   }
   else{
     eleholePairEnergy = siProperties.electronHolePairsPerEnergy();
@@ -140,9 +140,9 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit> &phit, SiC
       double rdif=this->m_diffusionConstant*sqrt(dist_electrode*coLorentz/0.3);
 
       // position at the surface
-      double phiRand = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+      double phiRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine);
       double phi_drifted=phi_i+dist_electrode*tanLorentz+rdif*phiRand;
-      double etaRand = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+      double etaRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine);
       double eta_drifted=eta_i+rdif*etaRand;
 
       // amount of energy to be converted into charges at current step
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h
index 24071ddc529784fe953d71741d6e2eea512b1985..082c08b611f7b33783553af68e6f260ee4d8f718 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -32,7 +32,7 @@ class SensorSimPlanarTool : public SensorSimTool {
     virtual ~SensorSimPlanarTool();
 
     //TODO: change name to induceCharge
-    virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions);  
+    virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine);  
 
   private:
     SensorSimPlanarTool();
diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h
index 4c3e9154d40d0378f39d783c3ebe3bfec2d523a7..f2ffb940f1f7dfc313320ba8a300770a19b7eebf 100644
--- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h
+++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -12,11 +12,9 @@
 #define PIXELDIGITIZATION_SensorSimTool_H
 
 #include "AthenaBaseComps/AthAlgTool.h"
-#include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/ToolHandle.h"
 #include "CLHEP/Random/RandomEngine.h"
 #include "CLHEP/Random/RandGaussZiggurat.h"
-#include "AthenaKernel/IAtRndmGenSvc.h"
 
 #include "HitManagement/TimedHitPtr.h"
 #include "SiDigitization/SiChargedDiodeCollection.h"
@@ -31,14 +29,9 @@ class SensorSimTool:public AthAlgTool,virtual public IAlgTool {
 
   public:
     SensorSimTool( const std::string& type, const std::string& name,const IInterface* parent) : 
-      AthAlgTool(type,name,parent),
-      m_rndmSvc("AtDSFMTGenSvc",name),
-      m_rndmEngineName("PixelDigitization"),
-      m_rndmEngine(nullptr)	
+      AthAlgTool(type,name,parent)
   {
     declareInterface<SensorSimTool>(this);
-    declareProperty("RndmSvc",           m_rndmSvc,            "Random Number Service used in SCT & Pixel digitization");
-    declareProperty("RndmEngine",        m_rndmEngineName,     "Random engine name");
   }
 
     static const InterfaceID& interfaceID() { return IID_ISensorSimTool; }
@@ -48,32 +41,18 @@ class SensorSimTool:public AthAlgTool,virtual public IAlgTool {
 
       ATH_CHECK(m_siPropertiesTool.retrieve());
 
-      ATH_CHECK(m_rndmSvc.retrieve());
-
-      m_rndmEngine = m_rndmSvc->GetEngine(m_rndmEngineName);
-      if (!m_rndmEngine) {
-        ATH_MSG_ERROR("Could not find RndmEngine : " << m_rndmEngineName);
-        return StatusCode::FAILURE;
-      }
-      else {
-        ATH_MSG_DEBUG("Found RndmEngine : " << m_rndmEngineName);
-      }
-
       return StatusCode::SUCCESS;
     }
 
     virtual StatusCode finalize() {return StatusCode::FAILURE;}
     virtual ~SensorSimTool() {}
-    virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions) = 0;  
+    virtual StatusCode induceCharge(const TimedHitPtr<SiHit> &phit, SiChargedDiodeCollection& chargedDiodes, const InDetDD::SiDetectorElement &Module, const InDetDD::PixelModuleDesign &p_design, std::vector< std::pair<double,double> > &trfHitRecord, std::vector<double> &initialConditions, CLHEP::HepRandomEngine *rndmEngine) = 0;  
 
   private:
     SensorSimTool();
 
   protected:
     ToolHandle<ISiPropertiesTool>   m_siPropertiesTool{this, "SiPropertiesTool", "SiPropertiesTool", "Tool to retrieve SiProperties"};
-    ServiceHandle<IAtRndmGenSvc>    m_rndmSvc;
-    std::string 		                m_rndmEngineName;
-    CLHEP::HepRandomEngine         *m_rndmEngine;	
 };