diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.h
index a02c5ba2da8a46890a3f81d46b7ec20e00a159e6..4f48854950611ec2a331a734a88191a30a6a8840 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_FrontEnd.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
 */
 
 /**
@@ -37,13 +37,6 @@ class ISCT_FrontEnd : virtual public ISiChargedDiodesProcessorTool {
   //** Destructor: */
   virtual ~ISCT_FrontEnd() {}
 
-  ///////////////////////////////////////////////////////////////////
-  // Pure virtual methods:
-  ///////////////////////////////////////////////////////////////////
-
-  //** process the collection of charged diodes */
-  virtual void process(SiChargedDiodeCollection& collection) const =0;
-  virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) =0;
 };
 
 #endif // SCT_DIGITIZATION_ISCT_FRONTEND_H
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.h
index b5cb45fce30dd7188e730a86d6c0a1cb5e465b9e..5ffa6f3b9390eceed633877cfeff48302a4cd43d 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_RandomDisabledCellGenerator.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
 */
 
 /**
@@ -35,13 +35,6 @@ class ISCT_RandomDisabledCellGenerator : virtual public ISiChargedDiodesProcesso
   // Destructor:
   virtual ~ISCT_RandomDisabledCellGenerator() {}
 
-  ///////////////////////////////////////////////////////////////////
-  // Pure virtual methods:
-  ///////////////////////////////////////////////////////////////////
-
-  // process the collection of charged diodes
-  virtual void process(SiChargedDiodeCollection& collection) const =0;
-  virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) =0;
 };
 
 #endif // SCT_DIGITIZATION_ISCT_RANDOMDISABLEDCELLGENERATOR_H
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.h
index 53acc0d8619983f85c7012c78d248ab7d54f4bb9..232dc5089692e10f335aa692cc56103a8dd2970d 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/ISCT_SurfaceChargesGenerator.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
 */
 
 /**
@@ -47,15 +47,14 @@ class ISCT_SurfaceChargesGenerator : virtual public IAlgTool {
 
   //Retrieve interface ID
   static const InterfaceID& interfaceID() { return IID_ISCT_SurfaceChargesGenerator; }
-  
+
   // Destructor:
   virtual ~ISCT_SurfaceChargesGenerator() {}
 
   virtual void process(const InDetDD::SiDetectorElement* ele,
                        const TimedHitPtr<SiHit>& phit,
-                       const ISiSurfaceChargesInserter& inserter) const =0;
-  virtual void setFixedTime(float fixedTime) =0;                             
-  virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) =0;       
+                       const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const =0;
+  virtual void setFixedTime(float fixedTime) =0;
 };
 
 #endif // SIDIGITIZATION_ISCT_SURFACECHARGESGENERATOR_H
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h
index 2ceb2e7d4b9cc05e761bc214ff4e2e855299c544..82410b10024d325aac9fc46d7d21f421db06ce40 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/SCT_Digitization/SCT_DigitizationTool.h
@@ -1,7 +1,7 @@
 /* -*- C++ -*- */
 
 /*
-  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 SCT_DIGITZATION_SCT_DIGITZATIONTOOL_H
@@ -16,7 +16,7 @@
 #include "PileUpTools/PileUpToolBase.h"
 
 // Athena headers
-#include "AthenaKernel/IAtRndmGenSvc.h"
+#include "AthenaKernel/IAthRNGSvc.h"
 #include "HitManagement/TimedHitCollection.h"
 #include "InDetRawData/SCT_RDO_Container.h"
 #include "InDetReadoutGeometry/SiDetectorElementCollection.h"
@@ -70,8 +70,8 @@ public:
 
 protected:
 
-  bool       digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi) const ; //!
-  void       applyProcessorTools(SiChargedDiodeCollection* chargedDiodes) const; //!
+  bool       digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi, CLHEP::HepRandomEngine * rndmEngine) const ; //!
+  void       applyProcessorTools(SiChargedDiodeCollection* chargedDiodes, CLHEP::HepRandomEngine * rndmEngine) const; //!
   void       addSDO(SiChargedDiodeCollection* collection, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap) const;
 
   void storeTool(ISiChargedDiodesProcessorTool* p_processor) {m_diodeCollectionTools.push_back(p_processor);}
@@ -82,10 +82,6 @@ private:
      @brief initialize the required services
   */
   StatusCode initServices();
-  /**
-     @brief initialize the random number engine
-  */
-  StatusCode initRandomEngine();
   /**
      @brief Initialize the SCT_FrontEnd AlgTool
   */
@@ -112,8 +108,8 @@ private:
   SCT_RDO_Collection* createRDO(SiChargedDiodeCollection* collection) const;
 
   StatusCode getNextEvent();
-  void       digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi) const; //!< digitize all hits
-  void       digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements) const;     //!< digitize SCT without hits
+  void       digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi, CLHEP::HepRandomEngine * rndmEngine) const; //!< digitize all hits
+  void       digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements, CLHEP::HepRandomEngine * rndmEngine) const;     //!< digitize SCT without hits
 
   float m_tfix;           //!< Use fixed timing for cosmics
 
@@ -149,10 +145,9 @@ private:
   SG::ReadCondHandleKey<InDetDD::SiDetectorElementCollection> m_SCTDetEleCollKey{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"};
 
   std::string                                        m_inputObjectName;     //! name of the sub event  hit collections.
-  ServiceHandle <IAtRndmGenSvc>                      m_rndmSvc;             //!< Random number service
+  ServiceHandle<IAthRNGSvc> m_rndmSvc{this, "RndmSvc", "AthRNGSvc", ""};  //!< Random number service
   ServiceHandle <PileUpMergeSvc>                     m_mergeSvc; //!
 
-  CLHEP::HepRandomEngine*                            m_rndmEngine;          //! Random number engine used - not init in SiDigitization
   std::list<ISiChargedDiodesProcessorTool*>          m_diodeCollectionTools;
   TimedHitCollection<SiHit>*                         m_thpcsi;
   IntegerProperty                                    m_vetoThisBarcode;
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py
index 71ac7a7aecc3ca86a6eb11f00d2fb00f0f720d0d..f0f684910a1d7b7958e93e7e4a2f32637f22316f 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfig.py
@@ -189,11 +189,6 @@ def commonSCT_DigitizationConfig(name,**kwargs):
     # write out SCT1_RawData
     #kwargs.setdefault("WriteSCT1_RawData", False)
 
-    kwargs.setdefault("RndmSvc", digitizationFlags.rndmSvc() )
-    streamName = "SCT_Digitization" # FIXME ideally random stream name would be configurable
-    if not digitizationFlags.rndmSeedList.checkForExistingSeed(streamName):
-        digitizationFlags.rndmSeedList.addSeed(streamName, 49261510, 105132394 )
-
     if digitizationFlags.doXingByXingPileUp():
         kwargs.setdefault("FirstXing", SCT_FirstXing())
         kwargs.setdefault("LastXing",  SCT_LastXing() )
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx
index 327f29a26e4fd0945b278baae5677503d0443e61..3f8b8ba7b3654adf7b4a0d348a0ce3de4064d5db 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.cxx
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.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 "SCT_DetailedSurfaceChargesGenerator.h"
@@ -66,9 +66,7 @@ SCT_DetailedSurfaceChargesGenerator::SCT_DetailedSurfaceChargesGenerator(const s
   // Did this code *ever* work? Has it *ever* been used?
   m_stripCharge_iymax{285-1},
   m_stripCharge_dx{1.},
-  m_stripCharge_dy{1.},
-  m_rndmEngine{nullptr},
-  m_rndmEngineName{"SCT_Digitization"}
+  m_stripCharge_dy{1.}
   {
     declareProperty("FixedTime", m_tfix=-999.); //!< fixed timing
     declareProperty("SubtractTime", m_tsubtract=-999.); //!< substract drift time
@@ -305,18 +303,18 @@ float SCT_DetailedSurfaceChargesGenerator::SurfaceDriftTime(float ysurf) const {
 //-------------------------------------------------------------------------------------------
 // create a list of surface charges from a hit - called from SCT_Digitization AthAlgorithm
 //-------------------------------------------------------------------------------------------
-void SCT_DetailedSurfaceChargesGenerator::process(const SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter) const {
+void SCT_DetailedSurfaceChargesGenerator::process(const SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const {
   ATH_MSG_VERBOSE("SCT_DetailedSurfaceChargesGenerator::process starts");
   const float p_eventTime{phit.eventTime()};
   const unsigned short p_eventId{phit.eventId()};
-  processSiHit(element, *phit, inserter, p_eventTime, p_eventId);
+  processSiHit(element, *phit, inserter, p_eventTime, p_eventId, rndmEngine);
   return;
 }
 
 //-------------------------------------------------------------------------------------------
 // create a list of surface charges from a hit - called from both AthAlgorithm and PileUpTool
 //-------------------------------------------------------------------------------------------
-void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float p_eventTime, unsigned short p_eventId) const {
+void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float p_eventTime, unsigned short p_eventId, CLHEP::HepRandomEngine * rndmEngine) const {
   const SCT_ModuleSideDesign* p_design{dynamic_cast<const SCT_ModuleSideDesign*>(&(element->design()))};
   if (p_design==nullptr) {
     ATH_MSG_ERROR("SCT_DetailedSurfaceChargesGenerator::process can not get " << p_design);
@@ -426,9 +424,9 @@ void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement*
         y1 += tanLorentz*zReadout; //!< Taking into account the magnetic field
         float diffusionSigma{DiffusionSigma(zReadout, element)};
         for (int i{0}; i<m_numberOfCharges; ++i) {
-          float rx{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)};
+          float rx{CLHEP::RandGaussZiggurat::shoot(rndmEngine)};
           double xd{x1+diffusionSigma*rx};
-          float ry{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)};
+          float ry{CLHEP::RandGaussZiggurat::shoot(rndmEngine)};
           double yd{y1+diffusionSigma*ry};
 
           SiLocalPosition position{element->hitLocalToLocal(xd, yd)};
@@ -489,8 +487,8 @@ void SCT_DetailedSurfaceChargesGenerator::processSiHit(const SiDetectorElement*
         }
 
         // Electron and hole transportation starting at x0 and y0
-        holeTransport    (x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2);
-        electronTransport(x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2);
+        holeTransport    (x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, rndmEngine);
+        electronTransport(x0, y0, Q_m2, Q_m1, Q_00, Q_p1, Q_p2, rndmEngine);
 
         //Loop over the strips and add the surface charges from each step and strip
         for (int strip{-2}; strip<=2; strip++) {
@@ -885,7 +883,7 @@ double SCT_DetailedSurfaceChargesGenerator::mud_h(double E) const {
 //---------------------------------------------------------------------
 //  holeTransport
 //---------------------------------------------------------------------
-void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const {
+void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const {
   // transport holes in the bulk 
   // T. Kondo, 2010.9.9
   // External parameters to be specified
@@ -934,8 +932,8 @@ void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0,
 
     x += vx*dt*1.E-9;
     double diffusion{sqrt(2.*D*dt*1.E-9)};
-    y += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-    x += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+    y += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+    x += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
     if (y > m_bulk_depth) {
       y = m_bulk_depth;
       isInBulk = false;
@@ -978,7 +976,7 @@ void SCT_DetailedSurfaceChargesGenerator::holeTransport(double& x0, double& y0,
 //---------------------------------------------------------------------
 //  electronTransport
 //---------------------------------------------------------------------
-void SCT_DetailedSurfaceChargesGenerator::electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const {
+void SCT_DetailedSurfaceChargesGenerator::electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const {
   // transport electrons in the bulk
   // T. Kondo, 2010.9.10
   // External parameters to be specified
@@ -1026,8 +1024,8 @@ void SCT_DetailedSurfaceChargesGenerator::electronTransport(double& x0, double&
 
     x += vx * dt *1.E-9;
     double diffusion{sqrt(2.* D * dt*1.E-9)};
-    y += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-    x += diffusion * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+    y += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+    x += diffusion * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
     if (y < m_y_origin_min) {
       y = m_y_origin_min;
       isInBulk = false;
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.h
index a3136b759acaca376ba3e06067b4da7beb854d5c..7e46ea417a66c19f25404b6754143c47486ffd22 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DetailedSurfaceChargesGenerator.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
 */
 
 /**
@@ -81,11 +81,10 @@ class SCT_DetailedSurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surf
 
   // Non-const methods are used in initialization
   void setFixedTime(float fixedTime) { m_tfix = fixedTime; }
-  void setRandomEngine(CLHEP::HepRandomEngine *rndmEngine) { m_rndmEngine = rndmEngine; }
 
   /** create a list of surface charges from a hit */
-  virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter) const;
-  void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, const float eventTime, const unsigned short eventID) const;
+  virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const;
+  void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, const float eventTime, const unsigned short eventID, CLHEP::HepRandomEngine * rndmEngine) const;
 
   // some diagnostics methods are needed here too
   float DriftTime(float zhit, const InDetDD::SiDetectorElement* element) const; //!< calculate drift time perpandicular to the surface for a charge at distance zhit from mid gap
@@ -111,8 +110,8 @@ class SCT_DetailedSurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surf
   double ExValue150(int ix, int iy) const;
   double EyValue150(int ix, int iy) const;
   double GetPotentialValue(int ix, int iy) const;
-  void holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const;
-  void electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2) const;
+  void holeTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const;
+  void electronTransport(double& x0, double& y0, double* Q_m2, double* Q_m1, double* Q_00, double* Q_p1, double* Q_p2, CLHEP::HepRandomEngine * rndmEngine) const;
   double inducedCharge(int& istrip, double& x, double& y, double& t) const;
 
   int m_numberOfCharges; //!< number of charges
@@ -195,9 +194,6 @@ class SCT_DetailedSurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surf
   ToolHandle<ISiliconConditionsTool> m_siConditionsTool{this, "SiConditionsTool", "SCT_SiliconConditionsTool", "Tool to retrieve SCT silicon information"};
   ToolHandle<ISiLorentzAngleTool> m_lorentzAngleTool{this, "LorentzAngleTool", "SiLorentzAngleTool/SCTLorentzAngleTool", "Tool to retreive Lorentz angle"};
 
-  CLHEP::HepRandomEngine* m_rndmEngine; //!< Random Engine
-  std::string m_rndmEngineName; //!< name of random engine, actual pointer in SiDigitization
-
   bool m_isOverlay; // flag for overlay
 };
 
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx
index c97b07dc860a6152bbbc43fda4943c9a9f5260b4..cf6810a8ef3b06e01079d8ba712d96f220f7d974 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.cxx
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_DigitizationTool.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 "SCT_Digitization/SCT_DigitizationTool.h"
@@ -24,6 +24,10 @@
 #include "StoreGate/ReadCondHandle.h"
 #include "StoreGate/ReadHandle.h"
 
+// Random Number Generation
+#include "AthenaKernel/RNGWrapper.h"
+#include "CLHEP/Random/RandomEngine.h"
+
 // C++ Standard Library
 #include <limits>
 #include <memory>
@@ -40,9 +44,7 @@ SCT_DigitizationTool::SCT_DigitizationTool(const std::string& type,
   base_class(type, name, parent),
   m_HardScatterSplittingSkipper{false},
   m_detID{nullptr},
-  m_rndmSvc{"AtRndmGenSvc", name},
   m_mergeSvc{"PileUpMergeSvc", name},
-  m_rndmEngine{nullptr},
   m_thpcsi{nullptr},
   m_vetoThisBarcode{crazyParticleBarcode} {
     declareInterface<SCT_DigitizationTool>(this);
@@ -56,7 +58,6 @@ SCT_DigitizationTool::SCT_DigitizationTool(const std::string& type,
     declareProperty("CreateNoiseSDO", m_createNoiseSDO = false, "Set create noise SDO flag");
     declareProperty("WriteSCT1_RawData", m_WriteSCT1_RawData = false, "Write out SCT1_RawData rather than SCT3_RawData");
     declareProperty("InputObjectName", m_inputObjectName = "", "Input Object name");
-    declareProperty("RndmSvc", m_rndmSvc, "Random Number Service used in SCT & Pixel digitization");
     declareProperty("MergeSvc", m_mergeSvc, "Merge service used in Pixel & SCT digitization");
     declareProperty("HardScatterSplittingMode", m_HardScatterSplittingMode = 0, "Control pileup & signal splitting");
     declareProperty("ParticleBarcodeVeto", m_vetoThisBarcode = crazyParticleBarcode, "Barcode of particle to ignore");
@@ -89,9 +90,6 @@ StatusCode SCT_DigitizationTool::initialize() {
   // +++ Init the services
   ATH_CHECK(initServices());
 
-  // +++ Get the random generator engine
-  ATH_CHECK(initRandomEngine());
-
   // +++ Get the Surface Charges Generator tool
   ATH_CHECK(initSurfaceChargesGeneratorTool());
 
@@ -162,8 +160,6 @@ namespace {
 StatusCode SCT_DigitizationTool::initSurfaceChargesGeneratorTool() {
   ATH_CHECK(m_sct_SurfaceChargesGenerator.retrieve());
 
-  m_sct_SurfaceChargesGenerator->setRandomEngine(m_rndmEngine);
-
   if (m_cosmicsRun and m_tfix > -998) {
     m_sct_SurfaceChargesGenerator->setFixedTime(m_tfix);
     ATH_MSG_INFO("Use of FixedTime = " << m_tfix << " in cosmics");
@@ -180,28 +176,12 @@ StatusCode SCT_DigitizationTool::initSurfaceChargesGeneratorTool() {
 StatusCode SCT_DigitizationTool::initFrontEndTool() {
   ATH_CHECK(m_sct_FrontEnd.retrieve());
 
-  m_sct_FrontEnd->setRandomEngine(m_rndmEngine);
   storeTool(&(*m_sct_FrontEnd));
 
   ATH_MSG_DEBUG("Retrieved and initialised tool " << m_sct_FrontEnd);
   return StatusCode::SUCCESS;
 }
 
-// ----------------------------------------------------------------------
-// Initialize the Random Engine
-// ----------------------------------------------------------------------
-StatusCode SCT_DigitizationTool::initRandomEngine() {
-  std::string rndmEngineName{"SCT_Digitization"};
-
-  m_rndmEngine = m_rndmSvc->GetEngine(rndmEngineName);
-  if (m_rndmEngine == nullptr) {
-    ATH_MSG_FATAL("Could not find RndmEngine : " << rndmEngineName);
-    return StatusCode::FAILURE;
-  }
-  ATH_MSG_DEBUG("Get random number engine : <" << rndmEngineName << ">");
-  return StatusCode::SUCCESS;
-}
-
 // ----------------------------------------------------------------------
 // Initialize the different services
 // ----------------------------------------------------------------------
@@ -223,7 +203,6 @@ StatusCode SCT_DigitizationTool::initDisabledCells() {
   // +++ Retrieve the SCT_RandomDisabledCellGenerator
   ATH_CHECK(m_sct_RandomDisabledCellGenerator.retrieve());
 
-  m_sct_RandomDisabledCellGenerator->setRandomEngine(m_rndmEngine);
   storeTool(&(*m_sct_RandomDisabledCellGenerator));
 
   ATH_MSG_INFO("Retrieved the SCT_RandomDisabledCellGenerator tool:" << m_sct_RandomDisabledCellGenerator);
@@ -234,9 +213,14 @@ StatusCode SCT_DigitizationTool::processAllSubEvents() {
   if (prepareEvent(0).isFailure()) {
     return StatusCode::FAILURE;
   }
+  // 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;
+
   ATH_MSG_VERBOSE("Begin digitizeAllHits");
   if (m_enableHits and (not getNextEvent().isFailure())) {
-    digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi);
+    digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi, rndmEngine);
   } else {
     ATH_MSG_DEBUG("no hits found in event!");
   }
@@ -244,7 +228,7 @@ StatusCode SCT_DigitizationTool::processAllSubEvents() {
 
   // loop over elements without hits
   if (not m_onlyHitElements) {
-    digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements);
+    digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, rndmEngine);
     ATH_MSG_DEBUG("Digitized Elements without Hits");
   }
 
@@ -283,13 +267,17 @@ StatusCode SCT_DigitizationTool::prepareEvent(unsigned int /*index*/) {
 StatusCode SCT_DigitizationTool::mergeEvent() {
   ATH_MSG_VERBOSE("SCT_DigitizationTool::mergeEvent()");
 
+  // 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;
 
   if (m_enableHits) {
-    digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi);
+    digitizeAllHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, m_thpcsi, rndmEngine);
   }
 
   if (not m_onlyHitElements) {
-    digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements);
+    digitizeNonHits(&m_rdoContainer, &m_simDataCollMap, &m_processedElements, rndmEngine);
   }
 
   for (SiHitCollection* hit: m_hitCollPtrs) {
@@ -305,7 +293,7 @@ StatusCode SCT_DigitizationTool::mergeEvent() {
   return StatusCode::SUCCESS;
 }
 
-void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi) const {
+void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, std::vector<bool>* processedElements, TimedHitCollection<SiHit>* thpcsi, CLHEP::HepRandomEngine * rndmEngine) const {
   /////////////////////////////////////////////////
   //
   // In order to process all element rather than just those with hits we
@@ -318,7 +306,7 @@ void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* r
 
   SiChargedDiodeCollection chargedDiodes;
 
-  while (digitizeElement(&chargedDiodes, thpcsi)) {
+  while (digitizeElement(&chargedDiodes, thpcsi, rndmEngine)) {
     ATH_MSG_DEBUG("Hit collection ID=" << m_detID->show_to_string(chargedDiodes.identify()));
 
     hitcount++;  // Hitcount will be a number in the hit collection minus
@@ -356,7 +344,7 @@ void SCT_DigitizationTool::digitizeAllHits(SG::WriteHandle<SCT_RDO_Container>* r
 }
 
 // digitize elements without hits
-void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements) const {
+void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* rdoContainer, SG::WriteHandle<InDetSimDataCollection>* simDataCollMap, const std::vector<bool>* processedElements, CLHEP::HepRandomEngine * rndmEngine) const {
   // Get SCT_DetectorElementCollection
   SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> sctDetEle(m_SCTDetEleCollKey);
   const InDetDD::SiDetectorElementCollection* elements{sctDetEle.retrieve()};
@@ -385,7 +373,7 @@ void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* r
 
         chargedDiodes.setDetectorElement(element);
         ATH_MSG_DEBUG("calling applyProcessorTools() for NON hits");
-        applyProcessorTools(&chargedDiodes);
+        applyProcessorTools(&chargedDiodes, rndmEngine);
 
         // Create and store RDO and SDO
         // Don't create empty ones.
@@ -405,7 +393,7 @@ void SCT_DigitizationTool::digitizeNonHits(SG::WriteHandle<SCT_RDO_Container>* r
   return;
 }
 
-bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi) const {
+bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiodes, TimedHitCollection<SiHit>*& thpcsi, CLHEP::HepRandomEngine * rndmEngine) const {
   if (nullptr == thpcsi) {
     ATH_MSG_ERROR("thpcsi should not be nullptr!");
 
@@ -461,11 +449,11 @@ bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiod
                                                                        phit->getEtaModule(),
                                                                        phit->getSide())));
       ATH_MSG_DEBUG("calling process() for all methods");
-      m_sct_SurfaceChargesGenerator->process(sielement, phit, SiDigitizationSurfaceChargeInserter(sielement, chargedDiodes));
+      m_sct_SurfaceChargesGenerator->process(sielement, phit, SiDigitizationSurfaceChargeInserter(sielement, chargedDiodes), rndmEngine);
       ATH_MSG_DEBUG("charges filled!");
     }
   }
-  applyProcessorTools(chargedDiodes); // !< Use of the new AlgTool surface
+  applyProcessorTools(chargedDiodes, rndmEngine); // !< Use of the new AlgTool surface
   // charges generator class
   return true;
 }
@@ -473,12 +461,12 @@ bool SCT_DigitizationTool::digitizeElement(SiChargedDiodeCollection* chargedDiod
 // -----------------------------------------------------------------------------
 // Applies processors to the current detector element for the current element:
 // -----------------------------------------------------------------------------
-void SCT_DigitizationTool::applyProcessorTools(SiChargedDiodeCollection* chargedDiodes) const {
+void SCT_DigitizationTool::applyProcessorTools(SiChargedDiodeCollection* chargedDiodes, CLHEP::HepRandomEngine * rndmEngine) const {
   ATH_MSG_DEBUG("applyProcessorTools()");
   int processorNumber{0};
 
   for (ISiChargedDiodesProcessorTool* proc: m_diodeCollectionTools) {
-    proc->process(*chargedDiodes);
+    proc->process(*chargedDiodes, rndmEngine);
 
     processorNumber++;
     ATH_MSG_DEBUG("Applied processor # " << processorNumber);
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx
index 6873cdf64c10a3b483c9a17a52e2ac9f18155f1a..e5a7317ffe496978fee0e8864d6485448521ed39 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.cxx
@@ -5,10 +5,10 @@
 #include "SCT_FrontEnd.h"
 
 // Random number
-#include "AthenaKernel/IAtRndmGenSvc.h"
 #include "CLHEP/Random/RandFlat.h"
 #include "CLHEP/Random/RandGaussZiggurat.h"  // for RandGaussZiggurat
 #include "CLHEP/Random/RandPoisson.h"
+#include "CLHEP/Random/RandomEngine.h"
 
 #include "SiDigitization/SiHelper.h"
 #include "SCT_Digitization/ISCT_Amp.h"
@@ -31,8 +31,7 @@ using namespace InDetDD;
 SCT_FrontEnd::SCT_FrontEnd(const std::string& type, const std::string& name, const IInterface* parent)
   : AthAlgTool(type, name, parent),
     m_SCTdetMgr(nullptr),
-    m_sct_id(nullptr),
-    m_rndmEngine(nullptr) {
+    m_sct_id(nullptr) {
   declareInterface<ISCT_FrontEnd>(this);
 
   declareProperty("NoiseBarrel", m_NoiseBarrel = 1500.0, "NoiseBarrel");
@@ -147,7 +146,7 @@ StatusCode SCT_FrontEnd::initVectors(int strips) const {
 // ----------------------------------------------------------------------
 // prepare gain and offset for the strips for a given module
 // ----------------------------------------------------------------------
-StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId) const {
+StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const {
   // now we need to generate gain and offset channel by channel: some algebra
   // for generation of partially correlated random numbers
   float W = m_OGcorr * m_GainRMS * m_Ospread / (m_GainRMS * m_GainRMS - m_Ospread * m_Ospread);
@@ -219,8 +218,8 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
         for (; i < i_end; i++) {
           // Need to check if strip is already setup
           if (m_Analogue[1][i] <= 0.0) {
-            float g = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S1);
-            float o = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S2);
+            float g = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S1);
+            float o = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S2);
 
             m_GainFactor[i] = 1.0 + (cosfi * g + sinfi * o);
             m_Offset[i] = (cosfi * o - sinfi * g);
@@ -228,14 +227,14 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
 
             // Fill the noise and offset values into the Analogue
             if (m_data_compression_mode == 1 and m_data_readout_mode == 0) { // level mode x1x
-              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
             } else if (m_data_compression_mode == 2 and m_data_readout_mode == 0) { // edge mode 01x
-              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
             } else if (m_data_compression_mode == 3 or m_data_readout_mode == 1) { // any hit mode xxx or expanded read out mode
-              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-              m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+              m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
             }
           }
         }
@@ -250,7 +249,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
 // prepare gain and offset for the strips for a given module using
 // Cond Db data to get the chip calibration data
 // ----------------------------------------------------------------------
-StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId) const {
+StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const {
   // Get chip data from calib DB
   std::vector<float> gainByChipVect = m_ReadCalibChipDataTool->getNPtGainData(moduleId, side, "GainByChip");
   std::vector<float> gainRMSByChipVect = m_ReadCalibChipDataTool->getNPtGainData(moduleId, side, "GainRMSByChip");
@@ -265,7 +264,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
   // Need to check if empty, most should have data, but a few old DEAD modules don't
   if (gainByChipVect.empty() or noiseByChipVect.empty()) {
     ATH_MSG_DEBUG("No calibration data in cond DB for module " << moduleId << " using JO values");
-    if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId)) {
+    if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId, rndmEngine)) {
       return StatusCode::FAILURE;
     } else {
       return StatusCode::SUCCESS;
@@ -276,7 +275,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
   float gainMeanValue = meanValue(gainByChipVect);
   if (gainMeanValue < 0.0) {
     ATH_MSG_DEBUG("All chip gain values are 0 for module " << moduleId << " using JO values");
-    if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId)) {
+    if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId, rndmEngine)) {
       return StatusCode::FAILURE;
     } else {
       return StatusCode::SUCCESS;
@@ -341,8 +340,8 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
           if (m_Analogue[1][i] <= 0.0) {
             // Values depends on which chip the strip is on (complex when strip is on chip edge)
             int chip = i / 128;
-            float g = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S1[chip]);
-            float o = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, 0.0, S2[chip]);
+            float g = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S1[chip]);
+            float o = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.0, S2[chip]);
 
             m_GainFactor[i] = gain[chip] + (cosfi[chip] * g + sinfi[chip] * o);
             m_Offset[i] = offset[chip]   + (cosfi[chip] * o - sinfi[chip] * g);
@@ -350,14 +349,14 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
 
             // Fill the noise and offset values into the Analogue
             if (m_data_compression_mode == 1 and m_data_readout_mode == 0) { // level mode x1x
-              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
             } else if (m_data_compression_mode == 2 and m_data_readout_mode == 0) { // edge mode 01x
-              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
             } else if (m_data_compression_mode == 3 or m_data_readout_mode == 1) { // any hit mode xxx or expanded read out mode
-              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
-              m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(m_rndmEngine);
+              m_Analogue[0][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+              m_Analogue[1][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
+              m_Analogue[2][i] = m_Offset[i] + m_NoiseFactor[i] * CLHEP::RandGaussZiggurat::shoot(rndmEngine);
             }
           }
         }
@@ -371,7 +370,7 @@ StatusCode SCT_FrontEnd::prepareGainAndOffset(SiChargedDiodeCollection& collecti
 // ----------------------------------------------------------------------
 //
 // ----------------------------------------------------------------------
-StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId) const {
+StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const {
   // Add random noise
 
   double occupancy = 0.0;
@@ -443,14 +442,14 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
   if (nEmptyStrips != 0) {
     // Should randomize the fixed NO values, so we get some differences per
     // wafer
-    occupancy = CLHEP::RandGaussZiggurat::shoot(m_rndmEngine, NoiseOccupancy, NoiseOccupancy * 0.1);
+    occupancy = CLHEP::RandGaussZiggurat::shoot(rndmEngine, NoiseOccupancy, NoiseOccupancy * 0.1);
 
     // Modify the occupancy if threshold is not 1.0 fC
     if (m_Threshold > 6242.3 or m_Threshold < 6242.1) {
       const float fC = 6242.2;
       occupancy = occupancy * exp(-(0.5 / (Noise * Noise) * (m_Threshold * m_Threshold - fC * fC)));
     }
-    nNoisyStrips = CLHEP::RandPoisson::shoot(m_rndmEngine, m_strip_max * occupancy * mode);
+    nNoisyStrips = CLHEP::RandPoisson::shoot(rndmEngine, m_strip_max * occupancy * mode);
 
     // Check and adapt the number of noisy strips to the number of free strips
     if (nEmptyStrips < nNoisyStrips) {
@@ -459,7 +458,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
 
     // Find random strips to get noise hits
     for (int i = 0; i < nNoisyStrips; i++) {
-      int index = CLHEP::RandFlat::shootInt(m_rndmEngine, nEmptyStrips - i); // strip == 10, 12 free strips
+      int index = CLHEP::RandFlat::shootInt(rndmEngine, nEmptyStrips - i); // strip == 10, 12 free strips
       // have vector [10000100100200211001] 20 strips
       int strip = emptyStrips.at(index);
       emptyStrips.erase(emptyStrips.begin()+index); // Erase it not to use it again
@@ -469,7 +468,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
       m_StripHitsOnWafer[strip] = 3; // !< Random Noise hit
       // Add tbin info to noise diode
       if (noise_expanded_mode) { // !< if any hit mode, any time bin otherwise fixed tbin=2
-        int noise_tbin = CLHEP::RandFlat::shootInt(m_rndmEngine, 3);
+        int noise_tbin = CLHEP::RandFlat::shootInt(rndmEngine, 3);
         // !< random number 0, 1 or 2
         if (noise_tbin == 0) {
           noise_tbin = 4; // !< now 1,2 or 4
@@ -491,7 +490,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
 // ----------------------------------------------------------------------
 //
 // ----------------------------------------------------------------------
-StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side) const {
+StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side, CLHEP::HepRandomEngine * rndmEngine) const {
   int n_chips = 6;
   int chipStripmax = m_strip_max / n_chips;
   std::vector<float> NOByChipVect(n_chips, 0.0);
@@ -513,7 +512,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
   // Need to check if empty, most should have data, but a few old DEAD modules don't, and 9C...
   if (NOByChipVect.empty()) {
     ATH_MSG_DEBUG("No calibration data in cond DB for module " << moduleId << " using JO values");
-    if (StatusCode::SUCCESS != randomNoise(collection, moduleId)) {
+    if (StatusCode::SUCCESS != randomNoise(collection, moduleId, rndmEngine)) {
       return StatusCode::FAILURE;
     } else {
       return StatusCode::SUCCESS;
@@ -529,7 +528,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
         NOByChipVect[i] = NOByChipVect[i] * exp(-(0.5 / (ENCByChipVect[i]*ENCByChipVect[i]) * (m_Threshold*m_Threshold - fC*fC)));
       }
 
-      nNoisyStrips[i] = CLHEP::RandPoisson::shoot(m_rndmEngine, chipStripmax * NOByChipVect[i] * mode);
+      nNoisyStrips[i] = CLHEP::RandPoisson::shoot(rndmEngine, chipStripmax * NOByChipVect[i] * mode);
     }
   }
 
@@ -557,7 +556,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
 
       // Find random strips to get noise hits
       for (int i = 0; i < nNoisyStrips[chip_index]; i++) {
-        int index = CLHEP::RandFlat::shootInt(m_rndmEngine, nEmptyStripsOnChip - i);
+        int index = CLHEP::RandFlat::shootInt(rndmEngine, nEmptyStripsOnChip - i);
         int strip_on_chip = emptyStripsOnChip.at(index);
         emptyStripsOnChip.erase(emptyStripsOnChip.begin()+index); // Erase it not to use it again
         int strip = strip_on_chip + chip_strip_offset;
@@ -568,7 +567,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
         // Add tbin info to noise diode
         if (noise_expanded_mode) { // !< if any hit mode, any time bin
           // !< otherwise fixed tbin=2
-          int noise_tbin = CLHEP::RandFlat::shootInt(m_rndmEngine, 3);
+          int noise_tbin = CLHEP::RandFlat::shootInt(rndmEngine, 3);
           // !< random number 0, 1 or 2
           if (noise_tbin == 0) {
             noise_tbin = 4; // !< now 1, 2 or 4
@@ -593,7 +592,7 @@ StatusCode SCT_FrontEnd::randomNoise(SiChargedDiodeCollection& collection, const
 // all single-strip pre-digits calculate the amplifier response add noise
 // (this could be moved elsewhere later) apply threshold do clustering
 // ----------------------------------------------------------------------
-void SCT_FrontEnd::process(SiChargedDiodeCollection& collection) const {
+void SCT_FrontEnd::process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const {
   // get SCT module side design and check it
   const SCT_ModuleSideDesign *p_design = dynamic_cast<const SCT_ModuleSideDesign*>(&(collection.design()));
 
@@ -648,11 +647,11 @@ void SCT_FrontEnd::process(SiChargedDiodeCollection& collection) const {
   if (not collection.empty()) {
     // Setup gain/offset/noise to the hit and neighbouring strips
     if (m_useCalibData) { // Use calib cond DB data
-      if (StatusCode::SUCCESS != prepareGainAndOffset(collection, side, moduleId)) {
+      if (StatusCode::SUCCESS != prepareGainAndOffset(collection, side, moduleId, rndmEngine)) {
         ATH_MSG_ERROR("\tCan't prepare Gain and Offset");
       }
     } else { // Use JO values
-      if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId)) {
+      if (StatusCode::SUCCESS != prepareGainAndOffset(collection, moduleId, rndmEngine)) {
         ATH_MSG_ERROR("\tCan't prepare Gain and Offset");
       }
     }
@@ -672,11 +671,11 @@ void SCT_FrontEnd::process(SiChargedDiodeCollection& collection) const {
 
   if (m_NoiseOn) {
     if (m_useCalibData) { // Check if using DB or not
-      if (StatusCode::SUCCESS != randomNoise(collection, moduleId, side)) {
+      if (StatusCode::SUCCESS != randomNoise(collection, moduleId, side, rndmEngine)) {
         ATH_MSG_ERROR("\tCan't do random noise on wafer?!");
       }
     } else { // Use JO fixed values
-      if (StatusCode::SUCCESS != randomNoise(collection, moduleId)) {
+      if (StatusCode::SUCCESS != randomNoise(collection, moduleId, rndmEngine)) {
         ATH_MSG_ERROR("\tCan't do random noise on wafer?!");
       }
     }
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.h
index 6fc6a689f285d6bbcd4710872fceb9c68e4dab28..73e510cb778a3c1b8802a2e5a4f0370b05b7f4d3 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_FrontEnd.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
 */
 
 /**
@@ -74,16 +74,15 @@ class  SCT_FrontEnd : public AthAlgTool, virtual public ISCT_FrontEnd {
    * process the collection of pre digits: needed to go through all single-strip pre-digits to calculate
    * the amplifier response add noise (this could be moved elsewhere later) apply threshold do clustering
    */
-  virtual void process(SiChargedDiodeCollection& collection) const;
-  void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) { m_rndmEngine = rndmEngine; };
+  virtual void process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const;
   StatusCode doSignalChargeForHits(SiChargedDiodeCollection& collectione) const;
   StatusCode doThresholdCheckForRealHits(SiChargedDiodeCollection& collectione) const;
   StatusCode doThresholdCheckForCrosstalkHits(SiChargedDiodeCollection& collection) const;
   StatusCode doClustering(SiChargedDiodeCollection& collection) const;
-  StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId) const;
-  StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId) const;
-  StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId) const;
-  StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side) const;
+  StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const;
+  StatusCode prepareGainAndOffset(SiChargedDiodeCollection& collection, int side, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const;
+  StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, CLHEP::HepRandomEngine * rndmEngine) const;
+  StatusCode randomNoise(SiChargedDiodeCollection& collection, const Identifier& moduleId, int side, CLHEP::HepRandomEngine * rndmEngine) const;
   StatusCode addNoiseDiode(SiChargedDiodeCollection& collection, int strip, int tbin) const;
   float meanValue(std::vector<float>& calibDataVect) const;
   StatusCode initVectors(int strips) const;
@@ -125,7 +124,6 @@ class  SCT_FrontEnd : public AthAlgTool, virtual public ISCT_FrontEnd {
   ToolHandle<ISCT_Amp> m_sct_amplifier{this, "SCT_Amp", "SCT_Amp", "Handle the Amplifier tool"}; //!< Handle the Amplifier tool
   ToolHandle<ISCT_ReadCalibChipDataTool> m_ReadCalibChipDataTool{this, "SCT_ReadCalibChipDataTool", "SCT_ReadCalibChipDataTool", "Tool to retrieve chip calibration information"}; //!< Handle to the Calibration ConditionsTool
 
-  CLHEP::HepRandomEngine* m_rndmEngine;        //!< Random number generation engine
 };
 
 #endif //SCT_FRONTEND_H
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.cxx
index e8286dcce72d4f89fb5b21db4194b97898b8e913..50f60499a64206197da71023a9c89a333c27783e 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.cxx
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.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 "SCT_RandomDisabledCellGenerator.h"
@@ -8,15 +8,12 @@
 
 #include "SiDigitization/SiHelper.h"
 
-// random number service includes
-#include "AthenaKernel/IAtRndmGenSvc.h"
-
+#include "CLHEP/Random/RandomEngine.h"
 #include "CLHEP/Random/RandFlat.h"
 
 // constructor
 SCT_RandomDisabledCellGenerator::SCT_RandomDisabledCellGenerator(const std::string& type, const std::string& name, const IInterface* parent)
-  : base_class(type, name, parent),
-    m_rndmEngine{nullptr}
+  : base_class(type, name, parent)
 {
   declareProperty("TotalBadChannels", m_disableProbability=0.01);
 }
@@ -33,11 +30,11 @@ StatusCode SCT_RandomDisabledCellGenerator::finalize() {
 }
 
 // process the collection 
-void SCT_RandomDisabledCellGenerator::process(SiChargedDiodeCollection& collection) const {
+void SCT_RandomDisabledCellGenerator::process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const {
   // disabling is applied to all cells even unconnected or below threshold ones to be able to use these cells as well
   // loop on all charged diodes
   for (std::pair<const InDetDD::SiCellId, SiChargedDiode>& chargedDiode: collection) {
-    if (CLHEP::RandFlat::shoot(m_rndmEngine)<m_disableProbability) {
+    if (CLHEP::RandFlat::shoot(rndmEngine)<m_disableProbability) {
       SiHelper::disconnected(chargedDiode.second, true, false);
     }
   }
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.h
index 246f590d542fcd628bbe1ca0ddc3420c86411f30..eb75e3c4cbb0aa90398cb04b10afdfdb3f6e1a4f 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_RandomDisabledCellGenerator.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
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -49,8 +49,7 @@ class SCT_RandomDisabledCellGenerator : public extends<AthAlgTool, ISCT_RandomDi
   /** AlgTool finalize */
   virtual StatusCode finalize();
 
-  virtual void process(SiChargedDiodeCollection& collection) const;
-  void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine) {m_rndmEngine = rndmEngine;}
+  virtual void process(SiChargedDiodeCollection& collection, CLHEP::HepRandomEngine * rndmEngine) const;
 
  private:
 
@@ -60,7 +59,6 @@ class SCT_RandomDisabledCellGenerator : public extends<AthAlgTool, ISCT_RandomDi
  private:
 
   float m_disableProbability;   // probability that a cell is disabled
-  CLHEP::HepRandomEngine *m_rndmEngine; // local rndm stream
 
 };
 
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx
index bb271ce3992bd38579a40bf5f1f6f40b0cf15611..260ae32a319945e2ab4884de7693a9d6c26096f7 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx
@@ -72,9 +72,7 @@ SCT_SurfaceChargesGenerator::SCT_SurfaceChargesGenerator(const std::string& type
   m_h_gen2{nullptr},
   m_h_velocity_trap{nullptr},
   m_h_mobility_trap{nullptr},
-  m_h_trap_pos{nullptr},
-  m_rndmEngine{nullptr},
-  m_rndmEngineName{"SCT_Digitization"} {
+  m_h_trap_pos{nullptr} {
     declareInterface<ISCT_SurfaceChargesGenerator>(this);
 
     declareProperty("FixedTime", m_tfix = -999.); // !< fixed timing
@@ -348,9 +346,9 @@ float SCT_SurfaceChargesGenerator::surfaceDriftTime(float ysurf) const {
 // -------------------------------------------------------------------------------------------
 void SCT_SurfaceChargesGenerator::process(const SiDetectorElement* element,
                                           const TimedHitPtr<SiHit>& phit,
-                                          const ISiSurfaceChargesInserter& inserter) const {
+                                          const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const {
   ATH_MSG_VERBOSE("SCT_SurfaceChargesGenerator::process starts");
-  processSiHit(element, *phit, inserter, phit.eventTime(), phit.eventId());
+  processSiHit(element, *phit, inserter, phit.eventTime(), phit.eventId(), rndmEngine);
   return;
 }
 
@@ -362,7 +360,7 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element,
                                                const SiHit& phit,
                                                const ISiSurfaceChargesInserter& inserter,
                                                float p_eventTime,
-                                               unsigned short p_eventId) const {
+                                               unsigned short p_eventId, CLHEP::HepRandomEngine * rndmEngine) const {
   const SCT_ModuleSideDesign* design{dynamic_cast<const SCT_ModuleSideDesign*>(&(element->design()))};
   if (design==nullptr) {
     ATH_MSG_ERROR("SCT_SurfaceChargesGenerator::process can not get " << design);
@@ -480,9 +478,9 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element,
       const float sigma{diffusionSigma(zReadout, element)};
 
       for (int i{0}; i < m_numberOfCharges; ++i) {
-        const float rx{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)};
+        const float rx{CLHEP::RandGaussZiggurat::shoot(rndmEngine)};
         const float xd{x1 + sigma * rx};
-        const float ry{CLHEP::RandGaussZiggurat::shoot(m_rndmEngine)};
+        const float ry{CLHEP::RandGaussZiggurat::shoot(rndmEngine)};
         const float yd{y1 + sigma * ry};
 
         // For charge trapping with Ramo potential
diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.h b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.h
index 0fdde720870f4bbd2fc0db676ecefda311680d70..f0901e01d74e93f3881a4372d9ea633d4004d38e 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.h
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.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
 */
 
 /**
@@ -86,11 +86,10 @@ class SCT_SurfaceChargesGenerator : public AthAlgTool, virtual public ISCT_Surfa
  private:
 
   virtual void setFixedTime(float fixedTime)                             {m_tfix = fixedTime;}
-  virtual void setRandomEngine(CLHEP::HepRandomEngine* rndmEngine)       {m_rndmEngine = rndmEngine;}
 
   /** create a list of surface charges from a hit */
-  virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter) const;
-  void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float eventTime, unsigned short eventID) const;
+  virtual void process(const InDetDD::SiDetectorElement* element, const TimedHitPtr<SiHit>& phit, const ISiSurfaceChargesInserter& inserter, CLHEP::HepRandomEngine * rndmEngine) const;
+  void processSiHit(const InDetDD::SiDetectorElement* element, const SiHit& phit, const ISiSurfaceChargesInserter& inserter, float eventTime, unsigned short eventID, CLHEP::HepRandomEngine * rndmEngine) const;
   
   // some diagnostics methods are needed here too
   float driftTime(float zhit, const InDetDD::SiDetectorElement* element) const; //!< calculate drift time perpandicular to the surface for a charge at distance zhit from mid gap
@@ -156,9 +155,6 @@ class SCT_SurfaceChargesGenerator : public AthAlgTool, virtual public ISCT_Surfa
   ToolHandle<ISiliconConditionsTool> m_siConditionsTool{this, "SiConditionsTool", "SCT_SiliconConditionsTool", "Tool to retrieve SCT silicon information"};
   ToolHandle<ISiLorentzAngleTool> m_lorentzAngleTool{this, "LorentzAngleTool", "SiLorentzAngleTool/SCTLorentzAngleTool", "Tool to retreive Lorentz angle"};
 
-  CLHEP::HepRandomEngine*           m_rndmEngine;          //!< Random Engine
-  std::string                       m_rndmEngineName;      //!< name of random engine, actual pointer in SiDigitization
-
   bool m_isOverlay; // flag for overlay
 };
 
diff --git a/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.h b/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.h
index f845599606c052e7f6e7a2a777be06fdc3e9d231..17387eb40c08688aeca835ded533a8166e2b9631 100755
--- a/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.h
+++ b/InnerDetector/InDetDigitization/SiDigitization/SiDigitization/ISiChargedDiodesProcessorTool.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
 */
 
 /**
@@ -17,6 +17,9 @@
 
 class SiChargedDiodeCollection;
 class NPtGainSummaryData;
+namespace CLHEP {
+  class HepRandomEngine;
+}
 
 static const InterfaceID IID_ISiChargedDiodesProcessorTool("ISiChargedDiodesProcessorTool",1,0);
 
@@ -38,7 +41,7 @@ public:
   ///////////////////////////////////////////////////////////////////
 
   // process the collection of charged diodes
-  virtual void process(SiChargedDiodeCollection &collection) const =0;
+  virtual void process(SiChargedDiodeCollection &collection, CLHEP::HepRandomEngine * rndmEngine) const =0;
 };
 
 #endif // SIDIGITIZATION_ISICHARGEDDIODESPROCESSORTOOL_H