diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0a79f45dfba0c749abc920d945d384b566442fc9..3cba605b33ce3adcd9ad6a604170521570005156 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,7 +25,7 @@ build_image:
     - mkdir build
     - cd build
     - set +e && source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh; set -e
-    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.31; set -e
+    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.40; set -e
     - cmake ../../calypso
     - make -j 3
   artifacts:
@@ -41,7 +41,7 @@ test_unittest:
     - yum -y install man
     - cd build
     - set +e && source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh; set -e
-    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.31; set -e 
+    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.40; set -e 
     - set +e && source `find . -name 'setup.sh'`; set -e
     - ctest -j3
   dependencies:
diff --git a/Calorimeter/CaloDetDescr/CaloReadoutGeometry/CaloReadoutGeometry/CaloDetectorElement.h b/Calorimeter/CaloDetDescr/CaloReadoutGeometry/CaloReadoutGeometry/CaloDetectorElement.h
index 452822c0a481ba734b8c18aa5174cc04c3179e8f..a9b29abde4e5b14eaf7664488a030514aed1f474 100644
--- a/Calorimeter/CaloDetDescr/CaloReadoutGeometry/CaloReadoutGeometry/CaloDetectorElement.h
+++ b/Calorimeter/CaloDetDescr/CaloReadoutGeometry/CaloReadoutGeometry/CaloDetectorElement.h
@@ -38,6 +38,7 @@ class GeoAlignmentStore;
 namespace Trk{
  class Surface;
  class SurfaceBounds;
+ constexpr DetectorElemType Calorimeter = DetectorElemType::Csc;
 }
 
 namespace CaloDD {
@@ -403,6 +404,10 @@ namespace CaloDD {
     public:
     
       const CaloCommonItems* getCommonItems() const;
+
+      /** TrkDetElementBase interface detectorType
+      */
+      virtual Trk::DetectorElemType detectorType() const override final;
     
       ///////////////////////////////////////////////////////////////////
       // Private methods:
@@ -514,7 +519,12 @@ namespace CaloDD {
     ///////////////////////////////////////////////////////////////////
     // Inline methods:
     ///////////////////////////////////////////////////////////////////
-       
+
+
+    inline Trk::DetectorElemType CaloDetectorElement::detectorType() const{
+      return Trk::Calorimeter;
+    }
+
     inline HepGeom::Point3D<double> CaloDetectorElement::globalPositionHit(const HepGeom::Point3D<double> &localPos) const
     {
       return Amg::EigenTransformToCLHEP(transformHit())*localPos;
diff --git a/Calorimeter/CaloDetDescr/EcalGeoModel/src/EcalDetectorTool.cxx b/Calorimeter/CaloDetDescr/EcalGeoModel/src/EcalDetectorTool.cxx
index bd4b729877d78083bbad2fa08091686d0c10f884..cdd48cd1f9287fd33b3158897f9b54cf4607d70e 100644
--- a/Calorimeter/CaloDetDescr/EcalGeoModel/src/EcalDetectorTool.cxx
+++ b/Calorimeter/CaloDetDescr/EcalGeoModel/src/EcalDetectorTool.cxx
@@ -65,7 +65,7 @@ EcalDetectorTool::create()
   ATH_CHECK(m_rdbAccessSvc.retrieve());
   // Print the Ecal version tag:
   std::string ecalVersionTag{m_rdbAccessSvc->getChildTag("Ecal", versionKey.tag(), versionKey.node(), "FASERDD")};
-  ATH_MSG_INFO("Ecal Version: " << ecalVersionTag <<  "  Package Version: " << PACKAGE_VERSION);
+  ATH_MSG_INFO("Ecal Version: " << ecalVersionTag);
   // Check if version is empty. If so, then the Ecal cannot be built. This may or may not be intentional. We
   // just issue an INFO message. 
   if (ecalVersionTag.empty()) {
@@ -181,7 +181,7 @@ EcalDetectorTool::clear()
 StatusCode 
 EcalDetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE ()
 {
-  StatusCode sc{StatusCode::FAILURE, true};
+  StatusCode sc{StatusCode::FAILURE};
   if (m_alignable.value()) {
     if (m_useDynamicAlignFolders.value()) {
       ATH_MSG_WARNING("Called unsupported EcalDetectorTool::registerCallback() with useDynamicAlignFolders = true");
diff --git a/Control/CalypsoConfiguration/python/DetectorConfigFlags.py b/Control/CalypsoConfiguration/python/DetectorConfigFlags.py
index 5588000a509db94c0317d831ab1893a1461dde17..763f1176951ecef9e3ecb3a57d7b8a607d449bbb 100644
--- a/Control/CalypsoConfiguration/python/DetectorConfigFlags.py
+++ b/Control/CalypsoConfiguration/python/DetectorConfigFlags.py
@@ -220,35 +220,33 @@ def disableDetectors(flags, detectors, toggle_geometry=False):
 
 def modifyDetectorConfigFlags(flags):
     # disable problematic ATLAS flags by hand
-    flags.Detector.GeometryCSC = False
-    flags.Detector.GeometrysTGC = False
-    flags.Detector.GeometryMM = False
+    # flags.Detector.GeometryCSC = False
+    # flags.Detector.GeometrysTGC = False
+    # flags.Detector.GeometryMM = False
 
-    flags.Detector.EnableBCM = False
-    flags.Detector.EnableDBM = False
-    flags.Detector.EnablePixel = False
-    flags.Detector.EnableSCT = False
-    flags.Detector.EnableTRT = False
+    # flags.Detector.EnableBCM = False
+    # flags.Detector.EnableDBM = False
+    # flags.Detector.EnablePixel = False
+    # flags.Detector.EnableSCT = False
+    # flags.Detector.EnableTRT = False
 
     # Upgrade ITk Inner Tracker is a separate and parallel detector
-    flags.Detector.EnableBCMPrime = False
-    flags.Detector.EnableITkPixel = False
-    flags.Detector.EnableITkStrip = False
+    # flags.Detector.EnableBCMPrime = False
+    # flags.Detector.EnableITkPixel = False
+    # flags.Detector.EnableITkStrip = False
 
-    flags.Detector.EnableHGTD = False
+    # flags.Detector.EnableHGTD = False
 
     # Calorimeters
-    flags.Detector.EnableLAr = False
-    flags.Detector.EnableTile = False
+    # flags.Detector.EnableLAr = False
+    # flags.Detector.EnableTile = False
 
     # Muon Spectrometer
-    flags.Detector.EnableCSC = False 
-    flags.Detector.EnableMDT = False
-    flags.Detector.EnableRPC = False
-    flags.Detector.EnableTGC = False
-    flags.Detector.EnablesTGC = False
-    flags.Detector.EnableMM = False
-
-    flags.Detector.RecoIBL = False
+    # flags.Detector.EnableCSC = False 
+    # flags.Detector.EnableMDT = False
+    # flags.Detector.EnableRPC = False
+    # flags.Detector.EnableTGC = False
+    # flags.Detector.EnablesTGC = False
+    # flags.Detector.EnableMM = False
 
     return flags
\ No newline at end of file
diff --git a/Control/CalypsoExample/GenEventExample/src/GenEventReadAlg.h b/Control/CalypsoExample/GenEventExample/src/GenEventReadAlg.h
index b99e07a09e679336b85ab27d464f60cdc18c82d4..4e45d15d349898a6691d46eff484d4740c66a15d 100644
--- a/Control/CalypsoExample/GenEventExample/src/GenEventReadAlg.h
+++ b/Control/CalypsoExample/GenEventExample/src/GenEventReadAlg.h
@@ -29,6 +29,6 @@ class GenEventReadAlg : public AthHistogramAlgorithm
 
     // Read handle keys for data containers
     // Any other event data can be accessed identically
-    // Note the key names ("GEN_EVENT" or "SCT_Hits") are Gaudi properties and can be configured at run-time
-    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "GEN_EVENT" };
+    // Note the key names ("BeamTruthEvent" or "SCT_Hits") are Gaudi properties and can be configured at run-time
+    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "BeamTruthEvent" };
 };
\ No newline at end of file
diff --git a/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.h b/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.h
index 9f3dd5f4ef98cd67204712be254313e6f3fa2910..40f0e1f2a29ccccf3d8f1499c381fc70ec3d1e39 100644
--- a/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.h
+++ b/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.h
@@ -27,7 +27,7 @@ class RDOReadAlg : public AthHistogramAlgorithm
 
     // Read handle keys for data containers
     // Any other event data can be accessed identically
-    // Note the key names ("GEN_EVENT" or "SCT_Hits") are Gaudi properties and can be configured at run-time
+    // Note the key names ("BeamTruthEvent" or "SCT_Hits") are Gaudi properties and can be configured at run-time
     SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "TruthEvent" };
     SG::ReadHandleKey<FaserSiHitCollection> m_faserSiHitKey { this, "FaserSiHitCollection", "SCT_Hits" };
     SG::ReadHandleKey<FaserSCT_RDO_Container> m_faserRdoKey { this, "FaserSCT_RDO_Container", "SCT_RDOs"};
diff --git a/Control/CalypsoExample/SimHitExample/src/CaloSimHitAlg.h b/Control/CalypsoExample/SimHitExample/src/CaloSimHitAlg.h
index 2444115e38d24b923223fc358336bcb953696599..3c912341eb84e10d4447f6e66b9373f2e79469c4 100644
--- a/Control/CalypsoExample/SimHitExample/src/CaloSimHitAlg.h
+++ b/Control/CalypsoExample/SimHitExample/src/CaloSimHitAlg.h
@@ -55,7 +55,7 @@ class CaloSimHitAlg : public AthHistogramAlgorithm
 
     // Read handle keys for data containers
     // Any other event data can be accessed identically
-    // Note the key names ("GEN_EVENT" or "SCT_Hits") are Gaudi properties and can be configured at run-time
-    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "GEN_EVENT" };
+    // Note the key names ("BeamTruthEvent" or "SCT_Hits") are Gaudi properties and can be configured at run-time
+    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "BeamTruthEvent" };
     SG::ReadHandleKey<CaloHitCollection> m_faserCaloHitKey { this, "CaloHitCollection", "EcalHits" };
 };
diff --git a/Control/CalypsoExample/SimHitExample/src/SimHitAlg.h b/Control/CalypsoExample/SimHitExample/src/SimHitAlg.h
index d7747bbfb9fc3c95920c99cbbe7ea0537bad0dca..476f2999a4c403d73d7d303c1ed45256e0f9f7f5 100644
--- a/Control/CalypsoExample/SimHitExample/src/SimHitAlg.h
+++ b/Control/CalypsoExample/SimHitExample/src/SimHitAlg.h
@@ -36,10 +36,10 @@ class SimHitAlg : public AthHistogramAlgorithm
 
     // Read handle keys for data containers
     // Any other event data can be accessed identically
-    // Note the key names ("GEN_EVENT" or "SCT_Hits") are Gaudi properties and can be configured at run-time
+    // Note the key names ("BeamTruthEvent" or "SCT_Hits") are Gaudi properties and can be configured at run-time
 
     // Truth information
-    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "GEN_EVENT" };
+    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "BeamTruthEvent" };
 
     // Tracker hits
     SG::ReadHandleKey<FaserSiHitCollection> m_faserSiHitKey { this, "FaserSiHitCollection", "SCT_Hits" };
diff --git a/DetectorDescription/DetDescrCnvSvc/python/DetStoreConfig.py b/DetectorDescription/DetDescrCnvSvc/python/DetStoreConfig.py
index 40a838de765d5aafaa1eb5bb34352cb5211b6db7..1e769c27f31cf8550872bf168ed98a39d4a8ff91 100644
--- a/DetectorDescription/DetDescrCnvSvc/python/DetStoreConfig.py
+++ b/DetectorDescription/DetDescrCnvSvc/python/DetStoreConfig.py
@@ -6,11 +6,11 @@
 #
 
 def _setupDetStoreConfig():
-    from AthenaCommon.AppMgr import theApp
+    # from AthenaCommon.AppMgr import theApp
     from AthenaCommon.AppMgr import ServiceMgr as svcMgr
 
     # first, make sure we create a DetectorStore
-    import AthenaCommon.AtlasUnixStandardJob
+    # import AthenaCommon.AtlasUnixStandardJob
     #theApp.CreateSvc += [ svcMgr.DetectorStore.getFullName() ]
 
     # now configure the Detector Description converter service
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx
index c35ddacbbf70b2e92c5b5122ee5df4408114e545..08197aa15ffe3d7e046e564d56689c2c2516dfe1 100644
--- a/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx
+++ b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx
@@ -14,7 +14,7 @@
 //#include "eformat/SourceIdentifier.h"
 //#include "eformat/StreamTag.h"
 
-#include "AthenaKernel/IClassIDSvc.h"
+#include "GaudiKernel/IClassIDSvc.h"
 
 #include "AthenaPoolUtilities/CondAttrListCollection.h"
 
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx
index 8695ec12b9233fff232a3759e78891d8f8caeb90..e2d659995a21c00f125e8dfb32a779fe202a27c6 100644
--- a/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx
+++ b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx
@@ -67,7 +67,7 @@ FaserByteStreamInputSvc::~FaserByteStreamInputSvc() {
 }
 //------------------------------------------------------------------------------
 StatusCode FaserByteStreamInputSvc::initialize() {
-   ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+   ATH_MSG_INFO("Initializing " << name() );
 
    ATH_CHECK(m_storeGate.retrieve());
    ATH_CHECK(m_robProvider.retrieve());
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx b/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx
index ef11d4c96265b1a8c8bd74e373dc59a8be8299cd..5a29672fe71cc9eff05810a13303bc2f0077e0c0 100644
--- a/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx
+++ b/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx
@@ -95,7 +95,7 @@ FaserEventSelectorByteStream::~FaserEventSelectorByteStream() {
 }
 //________________________________________________________________________________
 StatusCode FaserEventSelectorByteStream::initialize() {
-  ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+  ATH_MSG_INFO("Initializing " << name());
   if (!::AthService::initialize().isSuccess()) {
     ATH_MSG_FATAL("Cannot initialize AthService base class.");
     return(StatusCode::FAILURE);
@@ -806,7 +806,8 @@ StatusCode FaserEventSelectorByteStream::makeServer(int /*num*/) {
   if (m_eventStreamingTool.empty()) {
     return(StatusCode::FAILURE);
   }
-  return(m_eventStreamingTool->makeServer(1));
+  std::string dummyString;
+  return(m_eventStreamingTool->makeServer(1, dummyString));
 }
 
 //________________________________________________________________________________
@@ -814,7 +815,8 @@ StatusCode FaserEventSelectorByteStream::makeClient(int /*num*/) {
   if (m_eventStreamingTool.empty()) {
     return(StatusCode::FAILURE);
   }
-  return(m_eventStreamingTool->makeClient(0));
+  std::string dummyString;
+  return(m_eventStreamingTool->makeClient(0, dummyString));
 }
 
 //________________________________________________________________________________
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx
index e5b16c854481b52a346ef7bbf9131e4d0d31e813..252075361d8e75084d78dc4359ec8b29deb7ffd5 100644
--- a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx
@@ -11,7 +11,7 @@
 #include "SGTools/TransientAddress.h"
 #include "GaudiKernel/ListItem.h"
 
-#include "AthenaKernel/IClassIDSvc.h"
+#include "GaudiKernel/IClassIDSvc.h"
 
 //#include "eformat/SourceIdentifier.h"
 
@@ -27,7 +27,7 @@ FaserByteStreamAddressProviderSvc::~FaserByteStreamAddressProviderSvc() {
 }
 //________________________________________________________________________________
 StatusCode FaserByteStreamAddressProviderSvc::initialize() {
-   ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+   ATH_MSG_INFO("Initializing " << name());
    if (!::AthService::initialize().isSuccess()) {
       ATH_MSG_FATAL("Cannot initialize AthService base class.");
       return(StatusCode::FAILURE);
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx
index a250c8597214513e610c2598efb41448489d21a2..b41792c41b68e6814edcba83e229d43012ddedcc 100644
--- a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx
@@ -11,7 +11,7 @@
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/IIncidentSvc.h"
 
-#include "AthenaKernel/IClassIDSvc.h"
+#include "GaudiKernel/IClassIDSvc.h"
 #include "StoreGate/StoreGateSvc.h" 
 
 //______________________________________________________________________________
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx
index a897e51681e2278a7b0a02cb8f7569c2042c121e..4863796dab9affef15b662cbeb0091c62b8115c1 100644
--- a/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx
@@ -98,7 +98,7 @@ FaserROBDataProviderSvc::~FaserROBDataProviderSvc() {
 
 // Initialization
 StatusCode FaserROBDataProviderSvc::initialize() {
-   ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+   ATH_MSG_INFO("Initializing " << name());
    if (!::AthService::initialize().isSuccess()) {
       ATH_MSG_FATAL("Cannot initialize AthService base class.");
       return(StatusCode::FAILURE);
diff --git a/Generators/DIFGenerator/python/DIFSampler.py b/Generators/DIFGenerator/python/DIFSampler.py
index 18f9156b4c385cc11614ac0937897ac813b34583..24659c0178d8cbefc9843a24a1a10ef38bbcde21 100644
--- a/Generators/DIFGenerator/python/DIFSampler.py
+++ b/Generators/DIFGenerator/python/DIFSampler.py
@@ -344,7 +344,7 @@ if __name__ == "__main__":
         s = daughters[0].mom+daughters[1].mom
 
         try:
-            assert DIFS.mother_sampler.pid() == None
+            assert DIFS.mother_sampler.pid() is None
             assert mother_mom.E()**2 -  mother_mom.P()**2 - epsilon <= s.E()**2 - s.P()**2 <= mother_mom.E()**2 - mother_mom.P()**2 + epsilon
             assert mother_mom.Px() - epsilon <= s.Px() <= mother_mom.Px() + epsilon
             assert mother_mom.Py() - epsilon <= s.Py() <= mother_mom.Py() + epsilon
diff --git a/Generators/FaserCosmicGenerator/README.md b/Generators/FaserCosmicGenerator/README.md
index 7a2ea2f057ee6eeb89851b4a0ed0d8de168ede4b..512c32c60d6d875dba083a0fc2e5dc34e7dc8499 100644
--- a/Generators/FaserCosmicGenerator/README.md
+++ b/Generators/FaserCosmicGenerator/README.md
@@ -2,11 +2,11 @@
 
 ## Setup
 
-In Athena 22.0.31, the scipy module is missing from the LCG environment for some reason.
+In Athena 22.0.40, the scipy module is missing from the LCG environment for some reason.
 
 To use the generator, the following command is required after the usual steps to setup the release:
 
-`lsetup "lcgenv -p LCG_98python3_ATLAS_8 x86_64-centos7-gcc8-opt scipy"`
+`export PYTHONPATH=/cvmfs/sft.cern.ch/lcg/releases/LCG_100_ATLAS_5/scipy/1.5.1/x86_64-centos7-gcc8-opt/lib/python3.8/site-packages:${PYTHONPATH}`
 
 ## Usage
 
diff --git a/Generators/FaserParticleGun/CMakeLists.txt b/Generators/FaserParticleGun/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..dfc2bbd92f4488e6ccf0a4fffab49d98460234e9
--- /dev/null
+++ b/Generators/FaserParticleGun/CMakeLists.txt
@@ -0,0 +1,10 @@
+################################################################################
+# Package: FaserParticleGun
+################################################################################
+
+# Declare the package name:
+atlas_subdir( FaserParticleGun )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+
diff --git a/Generators/FaserParticleGun/python/FaserParticleGunConfig.py b/Generators/FaserParticleGun/python/FaserParticleGunConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..7409c81ae6d65b3b3b4a0dfabc077f2d2e2c973f
--- /dev/null
+++ b/Generators/FaserParticleGun/python/FaserParticleGunConfig.py
@@ -0,0 +1,110 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# import sys
+from AthenaConfiguration.MainServicesConfig import AthSequencer
+import ParticleGun as PG
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+# from AthenaCommon.Constants import VERBOSE, INFO
+from AthenaCommon.SystemOfUnits import TeV
+from AthenaCommon.PhysicalConstants import pi
+
+
+def FaserParticleGunCommonCfg(ConfigFlags, **kwargs) :
+    cfg = ComponentAccumulator(AthSequencer("AthBeginSeq", Sequential = True))
+
+
+    # have to do this in a clunky way, since ParticleGun does not recognize all keywords we might get passed
+    pg = PG.ParticleGun( name = kwargs.setdefault("name", "ParticleGun"),
+                         randomSeed = kwargs.setdefault("randomSeed", 12345),
+                         randomSvcName = kwargs.setdefault("randomSvcName", "AtRndmGenSvc"),
+                         randomStream = kwargs.setdefault("randomStream", "ParticleGun") )
+
+    pg.McEventKey = kwargs.setdefault("McEventKey", "BeamTruthEvent")
+    cfg.addEventAlgo(pg, sequenceName = "AthBeginSeq", primary = True) # to run *before* G4
+
+    return cfg
+
+
+def FaserParticleGunSingleParticleCfg(ConfigFlags, **kwargs) :
+    cfg = FaserParticleGunCommonCfg(ConfigFlags, **kwargs)
+
+    pg = cfg.getPrimary()
+
+    pg.sampler.pid = kwargs.setdefault("pid", -13)
+    pg.sampler.mom = PG.EThetaMPhiSampler(energy = kwargs.setdefault("energy", 1*TeV),
+                                          theta = kwargs.setdefault("theta", [0, pi/20]), 
+                                          phi = kwargs.setdefault("phi", [0, 2*pi]), 
+                                          mass = kwargs.setdefault("mass", 0.0) )
+    pg.sampler.pos = PG.PosSampler(x = kwargs.setdefault("x", [-5, 5]), 
+                                   y = kwargs.setdefault("y", [-5, 5]), 
+                                   z = kwargs.setdefault("z", -3750.0), 
+                                   t = kwargs.setdefault("t", 0.0) )
+
+    return cfg
+
+def FaserParticleGunSingleEcalParticleCfg(ConfigFlags, **kwargs) :
+    cfg = FaserParticleGunCommonCfg(ConfigFlags, **kwargs)
+
+    pg = cfg.getPrimary()
+
+    pg.sampler.pid = kwargs.setdefault("pid", 11)
+    pg.sampler.mom = PG.EThetaMPhiSampler(energy = kwargs.setdefault("energy", 1*TeV),
+                                          theta = kwargs.setdefault("theta", [0, pi/200]), 
+                                          phi = kwargs.setdefault("phi", [0, 2*pi]), 
+                                          mass = kwargs.setdefault("mass", 0.0) )
+    pg.sampler.pos = PG.PosSampler(x = kwargs.setdefault("x", [-5, 5]), 
+                                   y = kwargs.setdefault("y", [-5, 5]), 
+                                   z = kwargs.setdefault("z", 2730.0), 
+                                   t = kwargs.setdefault("t", 0.0) )
+
+    return cfg
+
+def FaserParticleGunCosmicsCfg(ConfigFlags, **kwargs) :
+    # Supported keyword arguments:
+    #
+    # chargeRatio       (default: 1.27)
+    # maxMuonEnergyGeV  (default: 10000)
+    # thetaMinDegree    (default: 0)
+    # thetaMaxDegree    (default: 80)
+    # targetDepthMeters (default: 85)
+    # targetDxMm        (default: 600)  - width of target slab
+    # targetDyMm        (default: 600)  - height of target slab
+    # targetDzMm        (default: 7000) - length of target slab
+    # x0Mm              (default: 0)    - X center of target slab in FASER coordinate system
+    # y0Mm              (default: 0)    - Y center of target slab in FASER coordinate system
+    # z0Mm              (default: 150)  - Z center of target slab in FASER coordinate system
+    #
+    
+    cfg = FaserParticleGunCommonCfg(ConfigFlags, **kwargs)
+
+    pg = cfg.getPrimary()
+
+    from FaserCosmicGenerator import CosmicSampler
+    pg.sampler = CosmicSampler(**kwargs)
+
+    return cfg
+
+def FaserParticleGunDecayInFlightCfg(ConfigFlags, **kwargs) :
+    # Supported keyword arguments:
+    #
+    # daughter1_pid (default:  11)
+    # daughter2_pid (default: -11)
+    # mother_pid    (default: none)
+    # mother_mom    (default: PG.EThetaMPhiSampler(sqrt((1*TeV)**2 + (10*MeV)**2),0,10*MeV,0))
+    # mother_pos    (default: CylinderSampler([0, 100**2],[0, 2*pi],[-1500, 0],0))
+    #
+    # Note that ALL of these can be samplers themselves - either the simple, "literal" variety or a sampler object configured by the caller
+    #
+
+    cfg = FaserParticleGunCommonCfg(ConfigFlags, **kwargs)
+
+    pg = cfg.getPrimary()
+
+    from DIFGenerator import DIFSampler
+    pg.sampler = DIFSampler(**kwargs)
+
+    return cfg
diff --git a/Generators/FaserParticleGun/python/__init__.py b/Generators/FaserParticleGun/python/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Monitoring/python/MonitorValueBase.py b/Monitoring/python/MonitorValueBase.py
index 82220c35ca5d513952bb1fd71ecac5cf4f38fd96..c4f5552d8da5e3c4ee0e24d5e03520896a2883e3 100644
--- a/Monitoring/python/MonitorValueBase.py
+++ b/Monitoring/python/MonitorValueBase.py
@@ -148,7 +148,7 @@ class MonitorValueBase ():
 
         # Set type if not configured
         actualType = self.__class__.__name__
-        if self.conf.type == None:
+        if self.conf.type is None:
             self.conf.type = actualType
 
         # Check that type is correct
diff --git a/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionDetectorTool.cxx b/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionDetectorTool.cxx
index ed7015b1f6734f3f5be7ba60b4594ea830896ea6..11f32197b20833c8cfeb8c3fc7c566fc7fea959b 100644
--- a/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionDetectorTool.cxx
+++ b/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionDetectorTool.cxx
@@ -66,7 +66,7 @@ EmulsionDetectorTool::create()
   ATH_CHECK(m_rdbAccessSvc.retrieve());
   // Print the Emulsion version tag:
   std::string emulsionVersionTag{m_rdbAccessSvc->getChildTag("Emulsion", versionKey.tag(), versionKey.node(), "FASERDD")};
-  ATH_MSG_INFO("Emulsion Version: " << emulsionVersionTag <<  "  Package Version: " << PACKAGE_VERSION);
+  ATH_MSG_INFO("Emulsion Version: " << emulsionVersionTag);
   // Check if version is empty. If so, then the Emulsion cannot be built. This may or may not be intentional. We
   // just issue an INFO message. 
   if (emulsionVersionTag.empty()) {
@@ -172,7 +172,7 @@ EmulsionDetectorTool::clear()
 StatusCode 
 EmulsionDetectorTool::registerCallback()
 {
-  StatusCode sc{StatusCode::FAILURE, true};
+  StatusCode sc{StatusCode::FAILURE};
   if (m_alignable.value()) {
       ATH_MSG_WARNING("Called untested EmulsionDetectorTool::registerCallback()");
     if (m_useDynamicAlignFolders.value()) {
diff --git a/Neutrino/NeutrinoDetDescr/NeutrinoReadoutGeometry/NeutrinoReadoutGeometry/NeutrinoDetectorElement.h b/Neutrino/NeutrinoDetDescr/NeutrinoReadoutGeometry/NeutrinoReadoutGeometry/NeutrinoDetectorElement.h
index 14641723e8d8d81878772e3d4cba75c2b5158f3d..492daccd4dfd15e7bbe15ce19a08311ab5198e17 100644
--- a/Neutrino/NeutrinoDetDescr/NeutrinoReadoutGeometry/NeutrinoReadoutGeometry/NeutrinoDetectorElement.h
+++ b/Neutrino/NeutrinoDetDescr/NeutrinoReadoutGeometry/NeutrinoReadoutGeometry/NeutrinoDetectorElement.h
@@ -38,6 +38,7 @@ class GeoAlignmentStore;
 namespace Trk{
  class Surface;
  class SurfaceBounds;
+ constexpr DetectorElemType Emulsion = DetectorElemType::SolidState;
 }
 
 namespace NeutrinoDD {
@@ -382,6 +383,10 @@ namespace NeutrinoDD {
     public:
     
       const NeutrinoCommonItems* getCommonItems() const;
+
+      /** TrkDetElementBase interface detectorType
+      */
+      virtual Trk::DetectorElemType detectorType() const override final;
     
       ///////////////////////////////////////////////////////////////////
       // Private methods:
@@ -487,6 +492,10 @@ namespace NeutrinoDD {
     // Inline methods:
     ///////////////////////////////////////////////////////////////////
 
+    inline Trk::DetectorElemType NeutrinoDetectorElement::detectorType() const{
+      return Trk::Emulsion;
+    }
+
     inline HepGeom::Point3D<double> NeutrinoDetectorElement::globalPositionHit(const HepGeom::Point3D<double> &localPos) const
     {
       return Amg::EigenTransformToCLHEP(transformHit())*localPos;
diff --git a/README.md b/README.md
index 75e54471ca72ec58d5447a7899d2f87e6cb90891..310f3646591eae6b890efc2f8f461a11aa0e5c7e 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ git clone --recursive https://:@gitlab.cern.ch:8443/$USERNAME/calypso.git
 #The next three lines are used to setup the ATLAS release environment
 export ATLAS_LOCAL_ROOT_BASE=/cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase 
 source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh
-asetup --input=calypso/asetup.faser Athena,22.0.31
+asetup --input=calypso/asetup.faser Athena,22.0.40
 
 #create build directory
 mkdir build
diff --git a/Scintillator/ScintDetDescr/PreshowerGeoModel/src/PreshowerDetectorTool.cxx b/Scintillator/ScintDetDescr/PreshowerGeoModel/src/PreshowerDetectorTool.cxx
index a64eead9a31c558994b87fb61c9366ad62d977c0..dfa1e24e35c5f224d802369f81fd4c377a15581f 100644
--- a/Scintillator/ScintDetDescr/PreshowerGeoModel/src/PreshowerDetectorTool.cxx
+++ b/Scintillator/ScintDetDescr/PreshowerGeoModel/src/PreshowerDetectorTool.cxx
@@ -66,7 +66,7 @@ PreshowerDetectorTool::create()
   ATH_CHECK(m_rdbAccessSvc.retrieve());
   // Print the Preshower version tag:
   std::string preshowerVersionTag{m_rdbAccessSvc->getChildTag("Preshower", versionKey.tag(), versionKey.node(), "FASERDD")};
-  ATH_MSG_INFO("Preshower Version: " << preshowerVersionTag <<  "  Package Version: " << PACKAGE_VERSION);
+  ATH_MSG_INFO("Preshower Version: " << preshowerVersionTag);
   // Check if version is empty. If so, then the Preshower cannot be built. This may or may not be intentional. We
   // just issue an INFO message. 
   if (preshowerVersionTag.empty()) {
@@ -172,7 +172,7 @@ PreshowerDetectorTool::clear()
 StatusCode 
 PreshowerDetectorTool::registerCallback()
 {
-  StatusCode sc{StatusCode::FAILURE, true};
+  StatusCode sc{StatusCode::FAILURE};
   if (m_alignable.value()) {
       ATH_MSG_WARNING("Called untested PreshowerDetectorTool::registerCallback()");
     if (m_useDynamicAlignFolders.value()) {
diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h
index 08d89603be7167480491a5beab34a1d6e0f783a1..2f1e7c0a95be335fcc8e349159d9f6b4b4efe213 100644
--- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h
+++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h
@@ -38,6 +38,7 @@ class GeoAlignmentStore;
 namespace Trk{
  class Surface;
  class SurfaceBounds;
+ constexpr DetectorElemType Scintillator = DetectorElemType::TRT;
 }
 
 namespace ScintDD {
@@ -142,10 +143,12 @@ namespace ScintDD {
       //@{
     
       /// identifier of this detector element:
-      Identifier identify() const;
+      virtual Identifier identify() const override final;      
+      // Identifier identify() const;
     
       /// identifier hash
-      IdentifierHash identifyHash() const;
+      virtual IdentifierHash identifyHash() const override final;      
+      // IdentifierHash identifyHash() const;
     
       /// Returns the id helper
       const FaserDetectorID* getIdHelper() const;
@@ -188,13 +191,13 @@ namespace ScintDD {
       /// Local (simulation/hit frame) to global transform
       virtual const GeoTrf::Transform3D & transformHit() const;
       /// Local (reconstruction frame) to global transform
-      const Amg::Transform3D & transform() const;
+      virtual const Amg::Transform3D & transform() const override;
       /// Default Local (reconstruction frame) to global transform
       /// ie with no misalignment. 
       const HepGeom::Transform3D defTransformCLHEP() const;
       const Amg::Transform3D defTransform() const;
       /// Center in global coordinates
-      const Amg::Vector3D & center() const;
+      virtual const Amg::Vector3D & center() const override;
     
       const HepGeom::Transform3D & transformCLHEP() const;
     
@@ -233,7 +236,7 @@ namespace ScintDD {
       const Amg::Vector3D & etaAxis() const;
       const HepGeom::Vector3D<double> & etaAxisCLHEP() const;
       /// Get reconstruction local normal axes in global frame. Choosen to give right-handed coordinate frame.
-      const Amg::Vector3D & normal() const;
+      virtual const Amg::Vector3D & normal() const override;
      
       /// transform a hit local position into a global position:
       HepGeom::Point3D<double> globalPositionHit(const HepGeom::Point3D<double> &simulationLocalPos) const;
@@ -255,7 +258,7 @@ namespace ScintDD {
      
       /// Element Surface
       virtual Trk::Surface & surface();
-      virtual const Trk::Surface & surface() const;
+      virtual const Trk::Surface & surface() const override;
     
       //@}
 
@@ -332,7 +335,7 @@ namespace ScintDD {
       double length() const; // Length in y direction 
       double thickness() const; // Thickness in z direction
     
-      virtual const Trk::SurfaceBounds & bounds() const;
+      virtual const Trk::SurfaceBounds & bounds() const override;
     
       // Test that it is in the active region
       // Intersect has 3 states
@@ -393,7 +396,11 @@ namespace ScintDD {
     public:
     
       const ScintCommonItems* getCommonItems() const;
-    
+
+    /** TrkDetElementBase interface detectorType
+     */
+     virtual Trk::DetectorElemType detectorType() const override final;
+
       ///////////////////////////////////////////////////////////////////
       // Private methods:
       ///////////////////////////////////////////////////////////////////
@@ -500,6 +507,13 @@ namespace ScintDD {
     // Inline methods:
     ///////////////////////////////////////////////////////////////////
        
+
+    inline Trk::DetectorElemType ScintDetectorElement::detectorType() const{
+      return Trk::Scintillator;
+    }
+
+
+
     inline HepGeom::Point3D<double> ScintDetectorElement::globalPositionHit(const HepGeom::Point3D<double> &localPos) const
     {
       return Amg::EigenTransformToCLHEP(transformHit())*localPos;
diff --git a/Scintillator/ScintDetDescr/TriggerGeoModel/src/TriggerDetectorTool.cxx b/Scintillator/ScintDetDescr/TriggerGeoModel/src/TriggerDetectorTool.cxx
index 878e632899d7419a775994050861c1f32bb06327..acbaf4a282f115ee69ca6ef3fdfde81eee9251c6 100644
--- a/Scintillator/ScintDetDescr/TriggerGeoModel/src/TriggerDetectorTool.cxx
+++ b/Scintillator/ScintDetDescr/TriggerGeoModel/src/TriggerDetectorTool.cxx
@@ -66,7 +66,7 @@ TriggerDetectorTool::create()
   ATH_CHECK(m_rdbAccessSvc.retrieve());
   // Print the Trigger version tag:
   std::string triggerVersionTag{m_rdbAccessSvc->getChildTag("Trigger", versionKey.tag(), versionKey.node(), "FASERDD")};
-  ATH_MSG_INFO("Trigger Version: " << triggerVersionTag <<  "  Package Version: " << PACKAGE_VERSION);
+  ATH_MSG_INFO("Trigger Version: " << triggerVersionTag);
   // Check if version is empty. If so, then the Trigger cannot be built. This may or may not be intentional. We
   // just issue an INFO message. 
   if (triggerVersionTag.empty()) {
@@ -172,7 +172,7 @@ TriggerDetectorTool::clear()
 StatusCode 
 TriggerDetectorTool::registerCallback()
 {
-  StatusCode sc{StatusCode::FAILURE, true};
+  StatusCode sc{StatusCode::FAILURE};
   if (m_alignable.value()) {
       ATH_MSG_WARNING("Called untested TriggerDetectorTool::registerCallback()");
     if (m_useDynamicAlignFolders.value()) {
diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorTool.cxx b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorTool.cxx
index d588039a74e5df1973cc11b29be5311be1014af6..71ad2bf461c25eef45db32cae8496c5699bdcd02 100644
--- a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorTool.cxx
+++ b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorTool.cxx
@@ -66,7 +66,7 @@ VetoDetectorTool::create()
   ATH_CHECK(m_rdbAccessSvc.retrieve());
   // Print the Veto version tag:
   std::string vetoVersionTag{m_rdbAccessSvc->getChildTag("Veto", versionKey.tag(), versionKey.node(), "FASERDD")};
-  ATH_MSG_INFO("Veto Version: " << vetoVersionTag <<  "  Package Version: " << PACKAGE_VERSION);
+  ATH_MSG_INFO("Veto Version: " << vetoVersionTag);
   // Check if version is empty. If so, then the Veto cannot be built. This may or may not be intentional. We
   // just issue an INFO message. 
   if (vetoVersionTag.empty()) {
@@ -172,7 +172,7 @@ VetoDetectorTool::clear()
 StatusCode 
 VetoDetectorTool::registerCallback()
 {
-  StatusCode sc{StatusCode::FAILURE, true};
+  StatusCode sc{StatusCode::FAILURE};
   if (m_alignable.value()) {
       ATH_MSG_WARNING("Called untested VetoDetectorTool::registerCallback()");
     if (m_useDynamicAlignFolders.value()) {
diff --git a/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt b/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt
index 0d43acc75094828fca4345969a0919448d878cfa..76828930fd30794c8677e23fed1699158a80b091 100644
--- a/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt
+++ b/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt
@@ -26,18 +26,18 @@ atlas_add_component( G4FaserAlg
                      INCLUDE_DIRS ${GEANT4_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${HEPMC_INCLUDE_DIRS}
                      LINK_LIBRARIES ${GEANT4_LIBRARIES} ${EIGEN_LIBRARIES} ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} AtlasHepMCLib AthenaBaseComps AthenaKernel GaudiKernel G4AtlasInterfaces G4FaserAlgLib G4AtlasAlgLib SGTools StoreGateLib SGtests EventInfo GeneratorObjects FaserMCTruthBaseLib )
 
-atlas_add_test( G4FaserAlgConfig_Test
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/runG4.py
+atlas_add_test( G4FaserAlgConfig_TestFaser
+                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/G4FaserAlgConfigNew_Test.py GeoModel.FaserVersion="'FASER-01'" IOVDb.GlobalTag="'OFLCOND-FASER-01'" Output.HITSFileName='faser.HITS.pool.root'
                 PROPERTIES TIMEOUT 300 
                 PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
 
-atlas_add_test( G4FaserAlgConfig_FaserNu
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/runG4FaserNu.py
+atlas_add_test( G4FaserAlgConfig_TestFaserNu
+                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/G4FaserAlgConfigNew_Test.py GeoModel.FaserVersion="'FASERNU-02'" IOVDb.GlobalTag="'OFLCOND-FASER-02'" Output.HITSFileName='faserNu.HITS.pool.root'
                 PROPERTIES TIMEOUT 300 
                 PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
 
-atlas_add_test( G4FaserAlgConfig_TestBeam
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/runG4TestBeam.py
+atlas_add_test( G4FaserAlgConfig_TestTestbeam
+                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/G4FaserAlgConfigNew_Test.py GeoModel.FaserVersion="'FASER-TB00'" IOVDb.GlobalTag="'OFLCOND-FASER-02'" Output.HITSFileName='tb.HITS.pool.root'
                 PROPERTIES TIMEOUT 300 
                 PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
 
diff --git a/Simulation/G4Faser/G4FaserAlg/python/G4FaserAlgConfigNew.py b/Simulation/G4Faser/G4FaserAlg/python/G4FaserAlgConfigNew.py
index 7e24163ad90fc101363f39bc33e2c48670b3dd9a..82c35779d0225b979cf8d04c2f3b20bd17f5f930 100644
--- a/Simulation/G4Faser/G4FaserAlg/python/G4FaserAlgConfigNew.py
+++ b/Simulation/G4Faser/G4FaserAlg/python/G4FaserAlgConfigNew.py
@@ -1,230 +1,156 @@
-#
-#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-#
-from AthenaConfiguration.ComponentFactory import CompFactory
-#
-#  Manager classes for detector geometry and sensitive detectors
-#
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS and FASER collaborations
 from G4FaserServices.G4FaserServicesConfigNew import DetectorGeometrySvcCfg, PhysicsListSvcCfg
+from FaserISF_Services.FaserISF_ServicesConfigNew import FaserTruthServiceCfg, FaserInputConverterCfg
+from FaserISF_Services.FaserISF_ServicesCoreConfigNew import FaserGeoIDSvcCfg
 from G4FaserTools.G4FaserToolsConfigNew import SensitiveDetectorMasterToolCfg
+from G4FaserTools.G4FaserToolsConfigNew import FastSimulationMasterToolCfg
 from G4FaserServices.G4FaserUserActionConfigNew import UserActionSvcCfg
-from G4FaserServices.G4FaserUserActionConfigNew import UserActionMaterialStepRecorderSvcCfg
-# from G4AtlasApps.G4Atlas_MetadataNew import writeSimulationParametersMetadata
-#
-#  Framework utilities
-#
-from FaserISF_Services.FaserISF_ServicesConfigNew import FaserTruthServiceCfg, FaserInputConverterCfg, FaserGeoIDSvcCfg
-#
-# from  G4FaserAlg.G4FaserAlgConf import G4FaserAlg
-G4FaserAlg=CompFactory.G4FaserAlg
-
-def G4FaserAlgCfg(ConfigFlags, name='G4FaserAlg', **kwargs):
-    #
-    #  add Services to G4AtlasAlg
-    #
+# from G4FaserApps.G4Faser_MetadataNew import writeSimulationParametersMetadata
+from AthenaConfiguration.ComponentFactory import CompFactory
+from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+
+
+def G4FaserAlgBasicCfg(ConfigFlags, name="G4FaserAlg", **kwargs):
+    """Return ComponentAccumulator configured for Faser G4 simulation, without output"""
+    # wihout output
     result = DetectorGeometrySvcCfg(ConfigFlags)
-    kwargs.setdefault('DetGeoSvc', result.getService("DetectorGeometrySvc"))
-    #
-    #  MC particle container names
-    #
-    kwargs.setdefault("InputTruthCollection", "GEN_EVENT") 
+    kwargs.setdefault("DetGeoSvc", result.getService("DetectorGeometrySvc"))
+
+    kwargs.setdefault("InputTruthCollection", "BeamTruthEvent") #tocheck -are these string inputs?
     kwargs.setdefault("OutputTruthCollection", "TruthEvent")
-    #
-    #  Option to free memory by dropping GeoModel after construction
-    #
-    # if ConfigFlags.Sim.ReleaseGeoModel:
-    kwargs.setdefault('ReleaseGeoModel', ConfigFlags.Sim.ReleaseGeoModel)
-    #
-    #  Record the particle flux during the simulation
-    #
-    #if ConfigFlags.Sim.RecordFlux:
-    kwargs.setdefault('RecordFlux' , ConfigFlags.Sim.RecordFlux)
-    #
-    #  Treatment of bad events
-    #
-    # if ConfigFlags.Sim.FlagAbortedEvents:
+    ## Killing neutrinos
+
+    ## Don"t drop the GeoModel
+    kwargs.setdefault("ReleaseGeoModel", ConfigFlags.Sim.ReleaseGeoModel)
+
+    ## Record the particle flux during the simulation
+    kwargs.setdefault("RecordFlux", ConfigFlags.Sim.RecordFlux)
+
+    if ConfigFlags.Sim.FlagAbortedEvents:
         ## default false
-    kwargs.setdefault('FlagAbortedEvents' ,ConfigFlags.Sim.FlagAbortedEvents)
-    if ConfigFlags.Sim.FlagAbortedEvents and ConfigFlags.Sim.KillAbortedEvents:
-            print('WARNING When G4AtlasAlg.FlagAbortedEvents is True G4AtlasAlg.KillAbortedEvents should be False!!! Setting G4AtlasAlg.KillAbortedEvents = False now!')
-            kwargs.setdefault('KillAbortedEvents' ,False)
-    # if  ConfigFlags.Sim.KillAbortedEvents:
-        ## default true
-    kwargs.setdefault('KillAbortedEvents' ,ConfigFlags.Sim.KillAbortedEvents)
-    #
-    #  Random numbers
-    #
-    from RngComps.RandomServices import AthEngines, RNG
-    if ConfigFlags.Random.Engine in AthEngines.keys():
-        result.merge(RNG(ConfigFlags.Random.Engine, name="AthRNGSvc"))
-        kwargs.setdefault("AtRndmGenSvc",result.getService("AthRNGSvc"))
+        kwargs.setdefault("FlagAbortedEvents", ConfigFlags.Sim.FlagAbortedEvents)
+        if ConfigFlags.Sim.FlagAbortedEvents and ConfigFlags.Sim.KillAbortedEvents:
+            print("WARNING When G4FaserAlg.FlagAbortedEvents is True G4FaserAlg.KillAbortedEvents should be False. Setting G4FaserAlg.KillAbortedEvents = False now.")
+            kwargs.setdefault("KillAbortedEvents", False)
+
+    ## default true
+    kwargs.setdefault("KillAbortedEvents", ConfigFlags.Sim.KillAbortedEvents)
+
+    from RngComps.RandomServices import RNG
+    result.merge(RNG(ConfigFlags.Random.Engine, name="AthRNGSvc"))
+    kwargs.setdefault("AtRndmGenSvc", result.getService("AthRNGSvc"))
 
     kwargs.setdefault("RandomGenerator", "athena")
-    #
-    #  Multi-threading settings
-    #
-    is_hive = ConfigFlags.Concurrency.NumThreads > 1
-    kwargs.setdefault('MultiThreading', is_hive)
-    #
-    #  What truth information to save?
-    #
+
+    # Multi-threading settinggs
+    #is_hive = (concurrencyProps.ConcurrencyFlags.NumThreads() > 0)
+    is_hive = ConfigFlags.Concurrency.NumThreads > 0
+    kwargs.setdefault("MultiThreading", is_hive)
+
     accMCTruth = FaserTruthServiceCfg(ConfigFlags)
     result.merge(accMCTruth)
-    kwargs.setdefault('TruthRecordService', result.getService("FaserISF_TruthService"))
-    #kwargs.setdefault('TruthRecordService', ConfigFlags.Sim.TruthStrategy) # TODO need to have manual override (simFlags.TruthStrategy.TruthServiceName())
-    #
-    #  Locates detector region for space points (no longer used by G4FaserAlg)
-    #
-    accGeoID = FaserGeoIDSvcCfg(ConfigFlags)
-    result.merge(accGeoID)
-    #kwargs.setdefault('GeoIDSvc', result.getService('ISF_FaserGeoIDSvc'))
-    #
-    #  Converts generator particles to a proprietary type managed by ISF
-    #
+    kwargs.setdefault("TruthRecordService", result.getService("FaserISF_TruthService"))
+    #kwargs.setdefault("TruthRecordService", ConfigFlags.Sim.TruthStrategy) # TODO need to have manual override (simFlags.TruthStrategy.TruthServiceName())
+
+    # accGeoID = FaserGeoIDSvcCfg(ConfigFlags)
+    # result.merge(accGeoID)
+    # kwargs.setdefault("GeoIDSvc", result.getService("ISF_FaserGeoIDSvc"))
+
+    #input converter
     accInputConverter = FaserInputConverterCfg(ConfigFlags)
     result.merge(accInputConverter)
-    kwargs.setdefault('InputConverter', result.getService("ISF_FaserInputConverter"))
-    #
-    # Sensitive detector master tool
-    #
-    accSensitiveDetector = SensitiveDetectorMasterToolCfg(ConfigFlags)
-    result.merge(accSensitiveDetector)
-    kwargs.setdefault('SenDetMasterTool', result.getPublicTool("SensitiveDetectorMasterTool")) #NOTE - is still a public tool
-    #
+    kwargs.setdefault("InputConverter", result.getService("ISF_FaserInputConverter"))
+
+    #sensitive detector master tool
+    SensitiveDetector = result.popToolsAndMerge(SensitiveDetectorMasterToolCfg(ConfigFlags))
+    result.addPublicTool(SensitiveDetector)
+    kwargs.setdefault("SenDetMasterTool", result.getPublicTool(SensitiveDetector.name))
+
+    #fast simulation master tool
+    FastSimulation = result.popToolsAndMerge(FastSimulationMasterToolCfg(ConfigFlags))
+    result.addPublicTool(FastSimulation)
+    kwargs.setdefault("FastSimMasterTool", result.getPublicTool(FastSimulation.name))
+
     #Write MetaData container
-    #
-    #result.merge(writeSimulationParametersMetadata(ConfigFlags))
-    #
+    # result.merge(writeSimulationParametersMetadata(ConfigFlags))
+
     #User action services (Slow...)
-    #
     result.merge( UserActionSvcCfg(ConfigFlags) )
-    kwargs.setdefault('UserActionSvc', result.getService( "G4UA::UserActionSvc") )
+    kwargs.setdefault("UserActionSvc", result.getService( "G4UA::UserActionSvc") )
 
     #PhysicsListSvc
     result.merge( PhysicsListSvcCfg(ConfigFlags) )
-    kwargs.setdefault('PhysicsListSvc', result.getService( "PhysicsListSvc") )
+    kwargs.setdefault("PhysicsListSvc", result.getService( "PhysicsListSvc") )
 
-    #
-    #  Output level
-    #
     ## G4AtlasAlg verbosities (available domains = Navigator, Propagator, Tracking, Stepping, Stacking, Event)
     ## Set stepper verbose = 1 if the Athena logging level is <= DEBUG
     # TODO: Why does it complain that G4AtlasAlgConf.G4AtlasAlg has no "Verbosities" object? Fix.
-    verbosities=dict(Placeholder = '0')
-    if "OutputLevel" in kwargs and kwargs["OutputLevel"] <= 2 :
-       verbosities["Tracking"]='1'
-       print (verbosities)
-    kwargs.setdefault('Verbosities', verbosities)
-    #
-    # Set commands for the G4FaserAlg
-    #
+    # FIXME GaudiConfig2 seems to fail to distinguish an empty dict {} from None
+    verbosities=dict(foo="bar")
+    #from AthenaCommon.AppMgr import ServiceMgr
+    #if ServiceMgr.MessageSvc.OutputLevel <= 2:
+    #    verbosities["Tracking"]="1"
+    #    print verbosities
+    kwargs.setdefault("Verbosities", verbosities)
+
+    # Set commands for the G4AtlasAlg
     kwargs.setdefault("G4Commands", ConfigFlags.Sim.G4Commands)
 
-    result.addEventAlgo(G4FaserAlg(name, **kwargs))
+    result.addEventAlgo(CompFactory.G4FaserAlg(name, **kwargs))
+
     return result
 
-def G4FaserMaterialStepRecorderAlgCfg(ConfigFlags, name='G4FaserAlg', **kwargs):
-    #
-    #  add Services to G4AtlasAlg
-    #
-    result = DetectorGeometrySvcCfg(ConfigFlags)
-    kwargs.setdefault('DetGeoSvc', result.getService("DetectorGeometrySvc"))
-    #
-    #  MC particle container names
-    #
-    kwargs.setdefault("InputTruthCollection", "GEN_EVENT") 
-    kwargs.setdefault("OutputTruthCollection", "TruthEvent")
-    #
-    #  Option to free memory by dropping GeoModel after construction
-    #
-    # if ConfigFlags.Sim.ReleaseGeoModel:
-    kwargs.setdefault('ReleaseGeoModel', ConfigFlags.Sim.ReleaseGeoModel)
-    #
-    #  Record the particle flux during the simulation
-    #
-    #if ConfigFlags.Sim.RecordFlux:
-    kwargs.setdefault('RecordFlux' , ConfigFlags.Sim.RecordFlux)
-    #
-    #  Treatment of bad events
-    #
-    # if ConfigFlags.Sim.FlagAbortedEvents:
-        ## default false
-    kwargs.setdefault('FlagAbortedEvents' ,ConfigFlags.Sim.FlagAbortedEvents)
-    if ConfigFlags.Sim.FlagAbortedEvents and ConfigFlags.Sim.KillAbortedEvents:
-            print('WARNING When G4AtlasAlg.FlagAbortedEvents is True G4AtlasAlg.KillAbortedEvents should be False!!! Setting G4AtlasAlg.KillAbortedEvents = False now!')
-            kwargs.setdefault('KillAbortedEvents' ,False)
-    # if  ConfigFlags.Sim.KillAbortedEvents:
-        ## default true
-    kwargs.setdefault('KillAbortedEvents' ,ConfigFlags.Sim.KillAbortedEvents)
-    #
-    #  Random numbers
-    #
-    from RngComps.RandomServices import AthEngines, RNG
-    if ConfigFlags.Random.Engine in AthEngines.keys():
-        result.merge(RNG(ConfigFlags.Random.Engine, name="AthRNGSvc"))
-        kwargs.setdefault("AtRndmGenSvc",result.getService("AthRNGSvc"))
 
-    kwargs.setdefault("RandomGenerator", "athena")
-    #
-    #  Multi-threading settings
-    #
-    is_hive = ConfigFlags.Concurrency.NumThreads > 1
-    kwargs.setdefault('MultiThreading', is_hive)
-    #
-    #  What truth information to save?
-    #
-    accMCTruth = FaserTruthServiceCfg(ConfigFlags)
-    result.merge(accMCTruth)
-    kwargs.setdefault('TruthRecordService', result.getService("FaserISF_TruthService"))
-    #kwargs.setdefault('TruthRecordService', ConfigFlags.Sim.TruthStrategy) # TODO need to have manual override (simFlags.TruthStrategy.TruthServiceName())
-    #
-    #  Locates detector region for space points (no longer used by G4FaserAlg)
-    #
-    accGeoID = FaserGeoIDSvcCfg(ConfigFlags)
-    result.merge(accGeoID)
-    #kwargs.setdefault('GeoIDSvc', result.getService('ISF_FaserGeoIDSvc'))
-    #
-    #  Converts generator particles to a proprietary type managed by ISF
-    #
-    accInputConverter = FaserInputConverterCfg(ConfigFlags)
-    result.merge(accInputConverter)
-    kwargs.setdefault('InputConverter', result.getService("ISF_FaserInputConverter"))
-    #
-    # Sensitive detector master tool
-    #
-    accSensitiveDetector = SensitiveDetectorMasterToolCfg(ConfigFlags)
-    result.merge(accSensitiveDetector)
-    kwargs.setdefault('SenDetMasterTool', result.getPublicTool("SensitiveDetectorMasterTool")) #NOTE - is still a public tool
-    #
-    #Write MetaData container
-    #
-    #result.merge(writeSimulationParametersMetadata(ConfigFlags))
-    #
-    #User action services (Slow...)
-    #
-    result.merge(UserActionMaterialStepRecorderSvcCfg(ConfigFlags) )
-    kwargs.setdefault('UserActionSvc', result.getService( "G4UA::UserActionSvc") )
+def G4FaserAlgOutputCfg(ConfigFlags):
+    """
+    Return ComponentAccumulator with output for G4 simulation. Not standalone.
 
-    #PhysicsListSvc
-    result.merge( PhysicsListSvcCfg(ConfigFlags) )
-    kwargs.setdefault('PhysicsListSvc', result.getService( "PhysicsListSvc") )
+    follows G4Atlas.flat.configuration.py
+    """
+    ItemList = ["EventInfo#*",
+                "McEventCollection#TruthEvent"]
 
-    #
-    #  Output level
-    #
-    ## G4AtlasAlg verbosities (available domains = Navigator, Propagator, Tracking, Stepping, Stacking, Event)
-    ## Set stepper verbose = 1 if the Athena logging level is <= DEBUG
-    # TODO: Why does it complain that G4AtlasAlgConf.G4AtlasAlg has no "Verbosities" object? Fix.
-    verbosities=dict(Placeholder = '0')
-    if "OutputLevel" in kwargs and kwargs["OutputLevel"] <= 2 :
-       verbosities["Tracking"]='1'
-       print (verbosities)
-    kwargs.setdefault('Verbosities', verbosities)
-    #
-    # Set commands for the G4FaserAlg
-    #
-    kwargs.setdefault("G4Commands", ConfigFlags.Sim.G4Commands)
+    if ConfigFlags.Sim.IncludeParentsInG4Event:
+        ItemList += ["McEventCollection#BeamTruthEvent"]
+
+    if ConfigFlags.Detector.EnableEmulsion:
+        ItemList += ["NeutrinoHitCollection#*"]
+
+    if ConfigFlags.Detector.EnableFaserSCT:
+        ItemList += ["FaserSiHitCollection#*"]
+
+    if ConfigFlags.Detector.EnableEcal:
+        ItemList += ["CaloHitCollection#*"]
+
+    if ConfigFlags.Detector.EnableVeto:
+        ItemList += ["ScintHitCollection#VetoHits"]
+
+    if ConfigFlags.Detector.EnableTrigger:
+        ItemList += ["ScintHitCollection#TriggerHits"]
+
+    if ConfigFlags.Detector.EnablePreshower:
+        ItemList += ["ScintHitCollection#PreshowerHits"]
+
+    # TimingAlg
+    # ItemList += ["RecoTimingObj#EVNTtoHITS_timings"]
+
+    acc = OutputStreamCfg(ConfigFlags,"HITS", ItemList=ItemList, disableEventTag=True)
+
+    # Make stream aware of aborted events
+    OutputStreamHITS = acc.getEventAlgo("OutputStreamHITS")
+    OutputStreamHITS.AcceptAlgs += ["G4FaserAlg"]
+
+    # G4Atlas.flat.configuration.py#0333 onwards
+    # FIXME unifyset now fails
+    #PoolAttributes = ["TREE_BRANCH_OFFSETTAB_LEN = '100'"]
+    #PoolAttributes += ["DatabaseName = '" + ConfigFlags.Output.HITSFileName + "'; ContainerName = 'TTree=CollectionTree'; TREE_AUTO_FLUSH = '1'"]
+    #acc.addService(CompFactory.AthenaPoolCnvSvc(PoolAttributes=PoolAttributes))
+
+    return acc
 
-    result.addEventAlgo(G4FaserAlg(name, **kwargs))
-    return result
 
+def G4FaserAlgCfg(ConfigFlags, name="G4FaserAlg", **kwargs):
+    """Return ComponentAccumulator configured for Faser G4 simulation, with output"""
+    acc = G4FaserAlgBasicCfg(ConfigFlags, **kwargs)
+    acc.merge(G4FaserAlgOutputCfg(ConfigFlags))
+    return acc
diff --git a/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx b/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx
index 50cbcec1aff8dca123e64e2a4c4effb9dde42061..3ce528b032fd0ce76494e114623aa753dbc0345c 100644
--- a/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx
+++ b/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx
@@ -123,7 +123,7 @@ void G4FaserAlg::initializeOnce()
     std::unique_ptr<G4AtlasUserWorkerThreadInitialization> workerInit =
       std::make_unique<G4AtlasUserWorkerThreadInitialization>();
     workerInit->SetDetGeoSvc( m_detGeoSvc.typeAndName() );
-    workerInit->SetSDMasterTool( m_senDetTool.typeAndName() );
+    // workerInit->SetSDMasterTool( m_senDetTool.typeAndName() );
     workerInit->SetFastSimMasterTool( m_fastSimTool.typeAndName() );
     runMgr->SetUserInitialization( workerInit.release() );
     std::unique_ptr<G4AtlasActionInitialization> actionInitialization =
@@ -140,7 +140,6 @@ void G4FaserAlg::initializeOnce()
     runMgr->SetRecordFlux( m_recordFlux, std::make_unique<G4FaserFluxRecorder>() );
     runMgr->SetLogLevel( int(msg().level()) ); // Synch log levels
     runMgr->SetDetGeoSvc( m_detGeoSvc.typeAndName() );
-    runMgr->SetSDMasterTool(m_senDetTool.typeAndName() );
     runMgr->SetFastSimMasterTool(m_fastSimTool.typeAndName() );
     runMgr->SetPhysListSvc(m_physListSvc.typeAndName() );
     std::unique_ptr<G4AtlasActionInitialization> actionInitialization =
@@ -190,7 +189,7 @@ void G4FaserAlg::initializeOnce()
     rm->RunInitialization();
   }
 
-  ATH_MSG_INFO( "retireving the Detector Geometry Service" );
+  ATH_MSG_INFO( "retrieving the Detector Geometry Service" );
   if(m_detGeoSvc.retrieve().isFailure()) {
     throw std::runtime_error("Could not initialize ATLAS DetectorGeometrySvc!");
   }
diff --git a/Simulation/G4Faser/G4FaserAlg/test/G4FaserAlgConfigNew_Test.py b/Simulation/G4Faser/G4FaserAlg/test/G4FaserAlgConfigNew_Test.py
new file mode 100644
index 0000000000000000000000000000000000000000..3421ae83f53992751c8e9ec5961a234529cd3177
--- /dev/null
+++ b/Simulation/G4Faser/G4FaserAlg/test/G4FaserAlgConfigNew_Test.py
@@ -0,0 +1,148 @@
+#!/usr/bin/env python
+"""Run tests on G4FaserAlgConfigNew
+
+Copyright (C) 2002-2021 CERN for the benefit of the ATLAS and FASER collaborations
+"""
+
+if __name__ == '__main__':
+
+    import time
+    a = time.time()
+#
+# Set up logging and config behaviour
+#
+    from AthenaCommon.Logging import log
+    from AthenaCommon.Constants import DEBUG
+    from AthenaCommon.Configurable import Configurable
+    log.setLevel(DEBUG)
+    Configurable.configurableRun3Behavior = 1
+#
+# Import and set config flags
+#
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+    ConfigFlags.Exec.MaxEvents = 4  # can be overridden from command line with --maxEvt=<number>
+    ConfigFlags.Exec.SkipEvents = 0 # can be overridden from command line with --skipEvt=<number>
+    from AthenaConfiguration.Enums import ProductionStep
+    ConfigFlags.Common.ProductionStep = ProductionStep.Simulation
+#
+# All these must be specified to avoid auto-configuration
+#
+    ConfigFlags.Input.RunNumber = [12345] #Isn't updating - todo: investigate
+    ConfigFlags.Input.OverrideRunNumber = True
+    ConfigFlags.Input.LumiBlockNumber = [1]
+    ConfigFlags.Input.isMC = True
+#
+# Input source if reading generator file
+#
+    # from AthenaConfiguration.TestDefaults import defaultTestFiles
+    # inputDir = defaultTestFiles.d
+    # ConfigFlags.Input.Files = ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/SimCoreTests/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.evgen.EVNT.e4993.EVNT.08166201._000012.pool.root.1'] #defaultTestFiles.EVNT
+#
+# Output file name
+# 
+    ConfigFlags.Output.HITSFileName = "my.HITS.pool.root" # can be overridden from command line with Output.HITSFileName=<name>
+    
+#
+# Sim ConfigFlags
+#
+    ConfigFlags.Sim.Layout = "FASER"
+    ConfigFlags.Sim.PhysicsList = "FTFP_BERT"
+    ConfigFlags.Sim.ReleaseGeoModel = False
+    ConfigFlags.Sim.IncludeParentsInG4Event = True # Controls whether BeamTruthEvent is written to output HITS file
+
+    ConfigFlags.GeoModel.FaserVersion = "FASERNU-02"             # Geometry set-up
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"             # Conditions set-up
+    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)             # To avoid autoconfig 
+    ConfigFlags.GeoModel.Align.Dynamic = False
+#
+# Override flags above from command line
+#
+    import sys
+    ConfigFlags.fillFromArgs(sys.argv[1:])
+#
+# By being a little clever, we can steer the geometry setup from the command line using GeoModel.FaserVersion
+#
+# Start with minimal configuration for Testbeam
+#
+    detectors = ['Veto', 'Preshower', 'FaserSCT', 'Ecal']
+    zStart = -200
+    if ConfigFlags.GeoModel.FaserVersion.count("TB") == 0 :
+        detectors += ['Trigger', 'Dipole']
+        zStart = -1800
+    if ConfigFlags.GeoModel.FaserVersion.count("FASERNU") > 0 :
+        detectors += ['Emulsion']
+        zStart = -3750
+#
+# Setup detector flags
+#
+    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
+    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
+#
+# Finalize flags
+#
+    ConfigFlags.lock()
+#
+# Initialize a new component accumulator
+#
+    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
+    cfg = MainServicesCfg(ConfigFlags)
+#
+# Particle gun generators - the energy, angle, particle type, position, etc can be modified by passing keyword arguments
+#
+    from FaserParticleGun.FaserParticleGunConfig import FaserParticleGunSingleParticleCfg
+    cfg.merge(FaserParticleGunSingleParticleCfg(ConfigFlags, theta = 0.001, z = zStart))
+    #
+    # from FaserParticleGun.FaserParticleGunConfig import FaserParticleGunSingleEcalParticleCfg
+    # cfg.merge(FaserParticleGunSingleEcalParticleCfg(ConfigFlags))
+    #
+    # from FaserParticleGun.FaserParticleGunConfig import FaserParticleGunCosmicsCfg
+    # cfg.merge(FaserParticleGunCosmicsCfg(ConfigFlags))
+    #
+    # from FaserParticleGun.FaserParticleGunConfig import FaserParticleGunDecayInFlightCfg
+    # cfg.merge(FaserParticleGunDecayInFlightCfg(ConfigFlags))
+    #
+#
+# Only one of these two should be used in a given job
+# MCEventSelectorCfg for generating events with no input file
+# PoolReadCfg when reading generator data from an input file
+#    
+    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
+    cfg.merge(McEventSelectorCfg(ConfigFlags))
+
+    # from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+    # cfg.merge(PoolReadCfg(ConfigFlags))
+#
+# Output file
+#
+    from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+    cfg.merge(PoolWriteCfg(ConfigFlags))
+#
+# Add the G4FaserAlg
+#
+    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
+    cfg.merge(G4FaserAlgCfg(ConfigFlags))
+#
+# Dump config
+#
+    from AthenaConfiguration.ComponentFactory import CompFactory
+    cfg.addEventAlgo(CompFactory.JobOptsDumperAlg(FileName="G4FaserTestConfig.txt"))
+    cfg.getService("StoreGateSvc").Dump = True
+    cfg.getService("ConditionStore").Dump = True
+    cfg.printConfig(withDetails=True, summariseProps = False)  # gags on ParticleGun if summariseProps = True?
+
+    ConfigFlags.dump()
+    f = open("test.pkl","wb")
+    cfg.store(f)
+    f.close()
+#
+# Execute and finish
+#
+    sc = cfg.run()
+
+    b = time.time()
+    log.info("Run G4FaserAlg in " + str(b-a) + " seconds")
+#
+# Success should be 0
+#
+    sys.exit(not sc.isSuccess())
+
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runEcal.py b/Simulation/G4Faser/G4FaserAlg/test/runEcal.py
deleted file mode 100755
index eaef5c20150c9ffc1b0e2a59d6b8004a7dbf0310..0000000000000000000000000000000000000000
--- a/Simulation/G4Faser/G4FaserAlg/test/runEcal.py
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env python
-if __name__ == "__main__":
-    import os
-    import sys
-    import GaudiPython
-    import ParticleGun as PG
-    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    from AthenaCommon.AppMgr import *
-    from AthenaCommon.Logging import log, logging
-    from AthenaCommon.SystemOfUnits import TeV
-    from AthenaCommon.PhysicalConstants import pi
-    from AthenaCommon.Constants import VERBOSE, INFO
-    from AthenaCommon.Configurable import Configurable
-    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
-    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
-    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
-    from G4FaserServices.G4FaserServicesConfigNew import G4GeometryNotifierSvcCfg
-#
-# Set up logging and new style config
-#
-    log.setLevel(VERBOSE)
-    Configurable.configurableRun3Behavior = True
-#
-# Input settings (Generator file)
-#
-#   from AthenaConfiguration.TestDefaults import defaultTestFiles
-#   ConfigFlags.Input.Files = defaultTestFiles.EVNT
-#
-# Alternatively, these must ALL be explicitly set to run without an input file
-# (if missing, it will try to read metadata from a non-existent file and crash)
-#
-    ConfigFlags.Input.Files = [""]
-    ConfigFlags.Input.isMC = True
-    ConfigFlags.Input.RunNumber = 12345
-    ConfigFlags.Input.Collections = [""]
-    ConfigFlags.Input.ProjectName = "mc19"
-    ConfigFlags.Common.isOnline = False
-    ConfigFlags.Beam.Type = "collisions"
-    ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
-    ConfigFlags.GeoModel.FaserVersion = "FASER-01"               # Always needed
-    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01"             # Always needed; must match FaserVersion
-# Workaround for bug/missing flag; unimportant otherwise 
-    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)
-# Workaround to avoid problematic ISF code
-    ConfigFlags.GeoModel.Layout = "Development"
-#
-# Output settings
-#
-    ConfigFlags.Output.HITSFileName = "ecalNone.1k.HITS.pool.root"
-    ConfigFlags.GeoModel.GeoExportFile = "faserGeo.db" # Optional dump of geometry for browsing in vp1light
-#
-# Geometry-related settings
-# Do not change!
-#
-    detectors = ['Veto', 'Trigger', 'Preshower', 'FaserSCT', 'Dipole', 'Ecal']
-    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
-    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
-    ConfigFlags.GeoModel.Align.Dynamic  = False
-    ConfigFlags.Sim.ReleaseGeoModel     = False
-#
-# All flags should be set before calling lock
-#
-    ConfigFlags.lock()
-#
-# Construct ComponentAccumulator
-#
-    acc = MainServicesCfg(ConfigFlags)
-#
-# Particle Gun generator (comment out to read generator file)
-# Raw energies (without units given) are interpreted as MeV
-#
-    pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
-    pg.randomSeed = 1234567
-    pg.sampler.pid = 11
-    pg.sampler.mom = PG.EThetaMPhiSampler(energy=1*TeV, theta=[0, pi/200], phi=[0, 2*pi], mass=0.511)
-    pg.sampler.pos = PG.PosSampler(x=[-5.0, 5.0], y=[-5.0, 5.0], z=2730.0, t=0.0)
-    acc.addEventAlgo(pg, "AthBeginSeq") # to run *before* G4
-#
-# Only one of these two should be used in a given job
-# (MCEventSelectorCfg for generating events with no input file,
-#  PoolReadCfg when reading generator data from an input file)
-#    
-    acc.merge(McEventSelectorCfg(ConfigFlags))
-    # acc.merge(PoolReadCfg(ConfigFlags))
-#
-#  Output stream configuration
-#
-    acc.merge(OutputStreamCfg(ConfigFlags, 
-                              "HITS", 
-                             ["EventInfo#*",
-                              "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
-                              "ScintHitCollection#*",
-                              "FaserSiHitCollection#*",
-                              "CaloHitCollection#*"
-                            ], disableEventTag=True))
-    acc.getEventAlgo("OutputStreamHITS").AcceptAlgs = ["G4FaserAlg"]               # optional
-    acc.getEventAlgo("OutputStreamHITS").WritingTool.ProcessingTag = "StreamHITS"  # required
-#
-#  Here is the configuration of the Geant4 pieces
-#    
-    acc.merge(FaserGeometryCfg(ConfigFlags))
-    acc.merge(G4FaserAlgCfg(ConfigFlags))
-    acc.addService(G4GeometryNotifierSvcCfg(ConfigFlags, ActivateLVNotifier=True))
-#
-# Verbosity
-#
-#    ConfigFlags.dump()
-#    logging.getLogger('forcomps').setLevel(VERBOSE)
-#    acc.foreach_component("*").OutputLevel = VERBOSE
-#    acc.foreach_component("*ClassID*").OutputLevel = INFO
-#    acc.getService("StoreGateSvc").Dump=True
-#    acc.getService("ConditionStore").Dump=True
-#    acc.printConfig()
-    f=open('FaserG4AppCfg_EVNT.pkl','wb')
-    acc.store(f)
-    f.close()
-#
-# Execute and finish
-#
-    sys.exit(int(acc.run(maxEvents=1000).isFailure()))
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runG4.py b/Simulation/G4Faser/G4FaserAlg/test/runG4.py
deleted file mode 100644
index 9538edac50589c38fbfc3a54bb0f512359232861..0000000000000000000000000000000000000000
--- a/Simulation/G4Faser/G4FaserAlg/test/runG4.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-if __name__ == "__main__":
-    import os
-    import sys
-    import GaudiPython
-    import ParticleGun as PG
-    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    from AthenaCommon.AppMgr import *
-    from AthenaCommon.Logging import log, logging
-    from AthenaCommon.SystemOfUnits import TeV
-    from AthenaCommon.PhysicalConstants import pi
-    from AthenaCommon.Constants import VERBOSE, INFO
-    from AthenaCommon.Configurable import Configurable
-    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
-    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
-    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
-    from G4FaserServices.G4FaserServicesConfigNew import G4GeometryNotifierSvcCfg
-#
-# Set up logging and new style config
-#
-    log.setLevel(VERBOSE)
-    Configurable.configurableRun3Behavior = True
-#
-# Input settings (Generator file)
-#
-#   from AthenaConfiguration.TestDefaults import defaultTestFiles
-#   ConfigFlags.Input.Files = defaultTestFiles.EVNT
-#
-# Alternatively, these must ALL be explicitly set to run without an input file
-# (if missing, it will try to read metadata from a non-existent file and crash)
-#
-    ConfigFlags.Input.Files = [""]
-    ConfigFlags.Input.isMC = True
-    ConfigFlags.Input.RunNumber = 12345
-    ConfigFlags.Input.Collections = [""]
-    ConfigFlags.Input.ProjectName = "mc19"
-    ConfigFlags.Common.isOnline = False
-    ConfigFlags.Beam.Type = "collisions"
-    ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
-    ConfigFlags.GeoModel.FaserVersion = "FASER-01"               # Always needed
-    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01"             # Always needed; must match FaserVersion
-# Workaround for bug/missing flag; unimportant otherwise 
-    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)
-# Workaround to avoid problematic ISF code
-    ConfigFlags.GeoModel.Layout = "Development"
-#
-# Output settings
-#
-    ConfigFlags.Output.HITSFileName = "my.HITS.pool.root"
-    ConfigFlags.GeoModel.GeoExportFile = "faserGeo.db" # Optional dump of geometry for browsing in vp1light
-#
-# Geometry-related settings
-# Do not change!
-#
-    detectors = ['Veto', 'Trigger', 'Preshower', 'FaserSCT', 'Dipole', 'Ecal']
-    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
-    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
-    ConfigFlags.GeoModel.Align.Dynamic  = False
-    ConfigFlags.Sim.ReleaseGeoModel     = False
-#
-# Physics list
-#
-    ConfigFlags.Sim.PhysicsList = "FTFP_BERT"
-#
-# All flags should be set before calling lock
-#
-    ConfigFlags.lock()
-#
-# Construct ComponentAccumulator
-#
-    acc = MainServicesCfg(ConfigFlags)
-#
-# Particle Gun generator (comment out to read generator file)
-# Raw energies (without units given) are interpreted as MeV
-#
-    pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
-    pg.randomSeed = 123456
-    pg.sampler.pid = -13
-    pg.sampler.mom = PG.EThetaMPhiSampler(energy=1*TeV, theta=[0, pi/20], phi=[0, 2*pi], mass=105.71)
-    pg.sampler.pos = PG.PosSampler(x=[-5, 5], y=[-5, 5], z=-2100.0, t=0.0)
-    acc.addEventAlgo(pg, "AthBeginSeq") # to run *before* G4
-#
-# Only one of these two should be used in a given job
-# (MCEventSelectorCfg for generating events with no input file,
-#  PoolReadCfg when reading generator data from an input file)
-#    
-    acc.merge(McEventSelectorCfg(ConfigFlags))
-    # acc.merge(PoolReadCfg(ConfigFlags))
-#
-#  Output stream configuration
-#
-    acc.merge(OutputStreamCfg(ConfigFlags, 
-                              "HITS", 
-                             ["EventInfo#*",
-                              "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
-                              "ScintHitCollection#*",
-                              "FaserSiHitCollection#*",
-                              "CaloHitCollection#*"
-                            ], disableEventTag=True))
-    acc.getEventAlgo("OutputStreamHITS").AcceptAlgs = ["G4FaserAlg"]               # optional
-    acc.getEventAlgo("OutputStreamHITS").WritingTool.ProcessingTag = "StreamHITS"  # required
-#
-#  Here is the configuration of the Geant4 pieces
-#    
-    acc.merge(FaserGeometryCfg(ConfigFlags))
-    acc.merge(G4FaserAlgCfg(ConfigFlags))
-    acc.addService(G4GeometryNotifierSvcCfg(ConfigFlags, ActivateLVNotifier=True))
-#
-# Verbosity
-#
-#    ConfigFlags.dump()
-#    logging.getLogger('forcomps').setLevel(VERBOSE)
-#    acc.foreach_component("*").OutputLevel = VERBOSE
-#    acc.foreach_component("*ClassID*").OutputLevel = INFO
-#    acc.getService("StoreGateSvc").Dump=True
-#    acc.getService("ConditionStore").Dump=True
-#    acc.printConfig()
-    f=open('FaserG4AppCfg_EVNT.pkl','wb')
-    acc.store(f)
-    f.close()
-#
-# Execute and finish
-#
-    sys.exit(int(acc.run(maxEvents=500).isFailure()))
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runG4Cosmics.py b/Simulation/G4Faser/G4FaserAlg/test/runG4Cosmics.py
deleted file mode 100644
index 56618f6cebcdac90c40570797e1c17953653200e..0000000000000000000000000000000000000000
--- a/Simulation/G4Faser/G4FaserAlg/test/runG4Cosmics.py
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env python
-if __name__ == "__main__":
-    import os
-    import sys
-    import GaudiPython
-    import ParticleGun as PG
-    from FaserCosmicGenerator import CosmicSampler
-    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    from AthenaCommon.AppMgr import *
-    from AthenaCommon.Logging import log, logging
-    from AthenaCommon.SystemOfUnits import TeV
-    from AthenaCommon.PhysicalConstants import pi
-    from AthenaCommon.Constants import VERBOSE, INFO
-    from AthenaCommon.Configurable import Configurable
-    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
-    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
-    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
-    from G4FaserServices.G4FaserServicesConfigNew import G4GeometryNotifierSvcCfg
-#
-# Set up logging and new style config
-#
-    log.setLevel(VERBOSE)
-    Configurable.configurableRun3Behavior = True
-#
-# Input settings (Generator file)
-#
-#   from AthenaConfiguration.TestDefaults import defaultTestFiles
-#   ConfigFlags.Input.Files = defaultTestFiles.EVNT
-#
-# Alternatively, these must ALL be explicitly set to run without an input file
-# (if missing, it will try to read metadata from a non-existent file and crash)
-#
-    ConfigFlags.Input.Files = [""]
-    ConfigFlags.Input.isMC = True
-    ConfigFlags.Input.RunNumber = 12345
-    ConfigFlags.Input.Collections = [""]
-    ConfigFlags.Input.ProjectName = "mc19"
-    ConfigFlags.Common.isOnline = False
-    ConfigFlags.Beam.Type = "collisions"
-    ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
-    ConfigFlags.GeoModel.FaserVersion = "FASER-01"               # Always needed
-    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01"             # Always needed; must match FaserVersion
-# Workaround for bug/missing flag; unimportant otherwise 
-    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)
-# Workaround to avoid problematic ISF code
-    ConfigFlags.GeoModel.Layout = "Development"
-#
-# Output settings
-#
-    ConfigFlags.Output.HITSFileName = "cosmics.HITS.pool.root"
-    ConfigFlags.GeoModel.GeoExportFile = "faserGeo.db" # Optional dump of geometry for browsing in vp1light
-#
-# Geometry-related settings
-# Do not change!
-#
-    detectors = ['Veto', 'Trigger', 'Preshower', 'FaserSCT', 'Dipole', 'Ecal']
-    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
-    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
-    ConfigFlags.GeoModel.Align.Dynamic  = False
-    ConfigFlags.Sim.ReleaseGeoModel     = False
-
-#
-# Physics list
-#
-
-    ConfigFlags.Sim.PhysicsList = "FTFP_BERT"
-#
-# All flags should be set before calling lock
-#
-    ConfigFlags.lock()
-#
-# Construct ComponentAccumulator
-#
-    acc = MainServicesCfg(ConfigFlags)
-#
-# Particle Gun generator (comment out to read generator file)
-# Raw energies (without units given) are interpreted as MeV
-#
-    pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
-    pg.randomSeed = 123456
-
-    pg.sampler = CosmicSampler()
-    # For just box around Ecal:
-    # pg.sampler = CosmicSampler(z0Mm = 3099.2, targetDzMm = 705, targetDxMm = 200, targetDyMm = 200)
-    acc.addEventAlgo(pg, "AthBeginSeq") # to run *before* G4
-#
-# Only one of these two should be used in a given job
-# (MCEventSelectorCfg for generating events with no input file,
-#  PoolReadCfg when reading generator data from an input file)
-#    
-    acc.merge(McEventSelectorCfg(ConfigFlags))
-    # acc.merge(PoolReadCfg(ConfigFlags))
-#
-#  Output stream configuration
-#
-    acc.merge(OutputStreamCfg(ConfigFlags, 
-                              "HITS", 
-                             ["EventInfo#*",
-                              "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
-                              "ScintHitCollection#*",
-                              "FaserSiHitCollection#*",
-                               "CaloHitCollection#*"
-                            ], disableEventTag=True))
-    acc.getEventAlgo("OutputStreamHITS").AcceptAlgs = ["G4FaserAlg"]               # optional
-    acc.getEventAlgo("OutputStreamHITS").WritingTool.ProcessingTag = "StreamHITS"  # required
-#
-#  Here is the configuration of the Geant4 pieces
-#    
-    acc.merge(FaserGeometryCfg(ConfigFlags))
-    acc.merge(G4FaserAlgCfg(ConfigFlags))
-    acc.addService(G4GeometryNotifierSvcCfg(ConfigFlags, ActivateLVNotifier=True))
-#
-# Verbosity
-#
-#    ConfigFlags.dump()
-#    logging.getLogger('forcomps').setLevel(VERBOSE)
-#    acc.foreach_component("*").OutputLevel = VERBOSE
-#    acc.foreach_component("*ClassID*").OutputLevel = INFO
-#    acc.getService("StoreGateSvc").Dump=True
-#    acc.getService("ConditionStore").Dump=True
-#    acc.printConfig()
-    f=open('FaserG4AppCfg_EVNT.pkl','wb')
-    acc.store(f)
-    f.close()
-#
-# Execute and finish
-#
-    sys.exit(int(acc.run(maxEvents=50000).isFailure()))
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runG4DecayInFlight.py b/Simulation/G4Faser/G4FaserAlg/test/runG4DecayInFlight.py
deleted file mode 100644
index 8110c6eeaaec03ef1ea21569f1d1bcd94b8fa0d9..0000000000000000000000000000000000000000
--- a/Simulation/G4Faser/G4FaserAlg/test/runG4DecayInFlight.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python
-if __name__ == "__main__":
-    import os
-    import sys
-    import GaudiPython
-    import ParticleGun as PG
-    from DIFGenerator import DIFSampler
-    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    from AthenaCommon.AppMgr import *
-    from AthenaCommon.Logging import log, logging
-    from AthenaCommon.SystemOfUnits import TeV
-    from AthenaCommon.PhysicalConstants import pi
-    from AthenaCommon.Constants import VERBOSE, INFO
-    from AthenaCommon.Configurable import Configurable
-    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
-    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
-    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
-    from G4FaserServices.G4FaserServicesConfigNew import G4GeometryNotifierSvcCfg
-#
-# Set up logging and new style config
-#
-    log.setLevel(VERBOSE)
-    Configurable.configurableRun3Behavior = True
-#
-# Input settings (Generator file)
-#
-#   from AthenaConfiguration.TestDefaults import defaultTestFiles
-#   ConfigFlags.Input.Files = defaultTestFiles.EVNT
-#
-# Alternatively, these must ALL be explicitly set to run without an input file
-# (if missing, it will try to read metadata from a non-existent file and crash)
-#
-    ConfigFlags.Input.Files = [""]
-    ConfigFlags.Input.isMC = True
-    ConfigFlags.Input.RunNumber = 12345
-    ConfigFlags.Input.Collections = [""]
-    ConfigFlags.Input.ProjectName = "mc19"
-    ConfigFlags.Common.isOnline = False
-    ConfigFlags.Beam.Type = "collisions"
-    ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
-    ConfigFlags.GeoModel.FaserVersion = "FASER-01"               # Always needed
-    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01"             # Always needed; must match FaserVersion
-# Workaround for bug/missing flag; unimportant otherwise 
-    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)
-# Workaround to avoid problematic ISF code
-    ConfigFlags.GeoModel.Layout = "Development"
-#
-# Output settings
-#
-    ConfigFlags.Output.HITSFileName = "DecayInFlight.HITS.pool.root"
-    ConfigFlags.GeoModel.GeoExportFile = "faserGeo.db" # Optional dump of geometry for browsing in vp1light
-#
-# Geometry-related settings
-# Do not change!
-#
-    detectors = ['Veto', 'Trigger', 'Preshower', 'FaserSCT', 'Dipole', 'Ecal']
-    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
-    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
-    ConfigFlags.GeoModel.Align.Dynamic  = False
-    ConfigFlags.Sim.ReleaseGeoModel     = False
-
-#
-# Physics list
-#
-
-    ConfigFlags.Sim.PhysicsList = "FTFP_BERT"
-#
-# All flags should be set before calling lock
-#
-    ConfigFlags.lock()
-#
-# Construct ComponentAccumulator
-#
-    acc = MainServicesCfg(ConfigFlags)
-#
-# Particle Gun generator (comment out to read generator file)
-# Raw energies (without units given) are interpreted as MeV
-#
-    pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
-    pg.randomSeed = 123456
-    pg.sampler = DIFSampler()
-# Next line sets the range of mother particle energies to [0.1 TeV, 0.2 TeV] (default is 1 TeV)
-#   pg.sampler.mother_sampler.mom.energy = [0.1*TeV, 0.2*TeV]
-# Next line sets the range of cylindrical radii to [90 mm, 100 mm] (default is [0, 100 mm])
-#   pg.sampler.mother_sampler.pos.rsq = [90**2, 100**2]
-# Next line changes the range of z vertex positions to [-1000 mm, -500 mm] (default is [-1500 mm, 0])
-#   pg.sampler.mother_sampler.pos.z = [-1000, -500]
-    acc.addEventAlgo(pg, "AthBeginSeq") # to run *before* G4
-#
-# Only one of these two should be used in a given job
-# (MCEventSelectorCfg for generating events with no input file,
-#  PoolReadCfg when reading generator data from an input file)
-#    
-    acc.merge(McEventSelectorCfg(ConfigFlags))
-    # acc.merge(PoolReadCfg(ConfigFlags))
-#
-#  Output stream configuration
-#
-    acc.merge(OutputStreamCfg(ConfigFlags, 
-                              "HITS", 
-                             ["EventInfo#*",
-                              "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
-                              "ScintHitCollection#*",
-                              "FaserSiHitCollection#*",
-                              "CaloHitCollection#*"
-                            ], disableEventTag=True))
-    acc.getEventAlgo("OutputStreamHITS").AcceptAlgs = ["G4FaserAlg"]               # optional
-    acc.getEventAlgo("OutputStreamHITS").WritingTool.ProcessingTag = "StreamHITS"  # required
-#
-#  Here is the configuration of the Geant4 pieces
-#    
-    acc.merge(FaserGeometryCfg(ConfigFlags))
-    acc.merge(G4FaserAlgCfg(ConfigFlags))
-    acc.addService(G4GeometryNotifierSvcCfg(ConfigFlags, ActivateLVNotifier=True))
-#
-# Verbosity
-#
-#    ConfigFlags.dump()
-#    logging.getLogger('forcomps').setLevel(VERBOSE)
-#    acc.foreach_component("*").OutputLevel = VERBOSE
-#    acc.foreach_component("*ClassID*").OutputLevel = INFO
-#    acc.getService("StoreGateSvc").Dump=True
-#    acc.getService("ConditionStore").Dump=True
-#    acc.printConfig()
-    f=open('FaserG4AppCfg_EVNT.pkl','wb')
-    acc.store(f)
-    f.close()
-#
-# Execute and finish
-#
-    sys.exit(int(acc.run(maxEvents=500).isFailure()))
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runG4FaserNu.py b/Simulation/G4Faser/G4FaserAlg/test/runG4FaserNu.py
deleted file mode 100644
index 0b301ba955e595e76301f9effb5aab6f508c21c6..0000000000000000000000000000000000000000
--- a/Simulation/G4Faser/G4FaserAlg/test/runG4FaserNu.py
+++ /dev/null
@@ -1,132 +0,0 @@
-#!/usr/bin/env python
-if __name__ == "__main__":
-    import os
-    import sys
-    import GaudiPython
-    import ParticleGun as PG
-    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    from AthenaCommon.AppMgr import *
-    from AthenaCommon.Logging import log, logging
-    from AthenaCommon.SystemOfUnits import TeV
-    from AthenaCommon.PhysicalConstants import pi
-    from AthenaCommon.Constants import VERBOSE, INFO
-    from AthenaCommon.Configurable import Configurable
-    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
-    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
-    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
-    from G4FaserServices.G4FaserServicesConfigNew import G4GeometryNotifierSvcCfg
-#
-# Set up logging and new style config
-#
-    log.setLevel(VERBOSE)
-    Configurable.configurableRun3Behavior = True
-#
-# Input settings (Generator file)
-#
-#   from AthenaConfiguration.TestDefaults import defaultTestFiles
-#   ConfigFlags.Input.Files = defaultTestFiles.EVNT
-#
-# Alternatively, these must ALL be explicitly set to run without an input file
-# (if missing, it will try to read metadata from a non-existent file and crash)
-#
-    ConfigFlags.Input.Files = [""]
-    ConfigFlags.Input.isMC = True
-    ConfigFlags.Input.RunNumber = 12345
-    ConfigFlags.Input.Collections = [""]
-    ConfigFlags.Input.ProjectName = "mc19"
-    ConfigFlags.Common.isOnline = False
-    ConfigFlags.Beam.Type = "collisions"
-    ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
-    ConfigFlags.GeoModel.FaserVersion = "FASERNU-02"             # Always needed
-    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"             # Always needed; must match FaserVersion
-# Workaround for bug/missing flag; unimportant otherwise 
-    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)
-# Workaround to avoid problematic ISF code
-    ConfigFlags.GeoModel.Layout = "Development"
-#
-# Output settings
-#
-    ConfigFlags.Output.HITSFileName = "myFaserNu.HITS.pool.root"
-    ConfigFlags.GeoModel.GeoExportFile = "faserNuGeo.db" # Optional dump of geometry for browsing in vp1light
-#
-# Geometry-related settings
-# Do not change!
-#
-    detectors = ['Emulsion', 'Veto', 'Trigger', 'Preshower', 'FaserSCT', 'Dipole', 'Ecal']
-    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
-    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
-    ConfigFlags.GeoModel.Align.Dynamic  = False
-    ConfigFlags.Sim.ReleaseGeoModel     = False
-#
-# Physics list
-#
-    ConfigFlags.Sim.PhysicsList = "FTFP_BERT"
-#
-# All flags should be set before calling lock
-#
-    ConfigFlags.lock()
-#
-# Construct ComponentAccumulator
-#
-    acc = MainServicesCfg(ConfigFlags)
-#
-# Particle Gun generator (comment out to read generator file)
-# Raw energies (without units given) are interpreted as MeV
-#
-    pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
-    pg.randomSeed = 123456
-    pg.sampler.pid = -13
-    pg.sampler.mom = PG.EThetaMPhiSampler(energy=1*TeV, theta=[0, pi/20], phi=[0, 2*pi], mass=105.71)
-    pg.sampler.pos = PG.PosSampler(x=[-5, 5], y=[-5, 5], z=-3750.0, t=0.0)
-    acc.addEventAlgo(pg, "AthBeginSeq") # to run *before* G4
-#
-# Only one of these two should be used in a given job
-# (MCEventSelectorCfg for generating events with no input file,
-#  PoolReadCfg when reading generator data from an input file)
-#    
-    acc.merge(McEventSelectorCfg(ConfigFlags))
-    # acc.merge(PoolReadCfg(ConfigFlags))
-#
-#  Output stream configuration
-#
-    acc.merge(OutputStreamCfg(ConfigFlags, 
-                              "HITS", 
-                             ["EventInfo#*",
-                              "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
-                              "NeutrinoHitCollection#*",
-                              "ScintHitCollection#*",
-                              "FaserSiHitCollection#*",
-                              "CaloHitCollection#*"
-                            ], disableEventTag=True))
-    acc.getEventAlgo("OutputStreamHITS").AcceptAlgs = ["G4FaserAlg"]               # optional
-    acc.getEventAlgo("OutputStreamHITS").WritingTool.ProcessingTag = "StreamHITS"  # required
-#
-#  Here is the configuration of the Geant4 pieces
-#    
-    acc.merge(FaserGeometryCfg(ConfigFlags))
-    acc.merge(G4FaserAlgCfg(ConfigFlags))
-    acc.addService(G4GeometryNotifierSvcCfg(ConfigFlags, ActivateLVNotifier=True))
-#
-# Verbosity
-#
-#    ConfigFlags.dump()
-#    logging.getLogger('forcomps').setLevel(VERBOSE)
-#    acc.foreach_component("*").OutputLevel = VERBOSE
-#    acc.foreach_component("*ClassID*").OutputLevel = INFO
-#    acc.getService("StoreGateSvc").Dump=True
-#    acc.getService("ConditionStore").Dump=True
-#    acc.printConfig()
-    f=open('FaserG4AppCfgFaserNu_EVNT.pkl','wb')
-    acc.store(f)
-    f.close()
-#
-# Execute and finish
-#
-    sys.exit(int(acc.run(maxEvents=10).isFailure()))
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runG4TestBeam.py b/Simulation/G4Faser/G4FaserAlg/test/runG4TestBeam.py
deleted file mode 100755
index 667e76055b99f8db17f3d3c05ad90000c7955790..0000000000000000000000000000000000000000
--- a/Simulation/G4Faser/G4FaserAlg/test/runG4TestBeam.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/env python
-if __name__ == "__main__":
-    import os
-    import sys
-    import GaudiPython
-    import ParticleGun as PG
-    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    from AthenaCommon.AppMgr import *
-    from AthenaCommon.Logging import log, logging
-    from AthenaCommon.SystemOfUnits import TeV
-    from AthenaCommon.PhysicalConstants import pi
-    from AthenaCommon.Constants import VERBOSE, INFO
-    from AthenaCommon.Configurable import Configurable
-    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
-    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
-    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
-    from G4FaserAlg.G4FaserAlgConfigNew import G4FaserAlgCfg
-    from G4FaserServices.G4FaserServicesConfigNew import G4GeometryNotifierSvcCfg
-#
-# Set up logging and new style config
-#
-    log.setLevel(VERBOSE)
-    Configurable.configurableRun3Behavior = True
-#
-# Input settings (Generator file)
-#
-#   from AthenaConfiguration.TestDefaults import defaultTestFiles
-#   ConfigFlags.Input.Files = defaultTestFiles.EVNT
-#
-# Alternatively, these must ALL be explicitly set to run without an input file
-# (if missing, it will try to read metadata from a non-existent file and crash)
-#
-    ConfigFlags.Input.Files = [""]
-    ConfigFlags.Input.isMC = True
-    ConfigFlags.Input.RunNumber = 12345
-    ConfigFlags.Input.Collections = [""]
-    ConfigFlags.Input.ProjectName = "mc19"
-    ConfigFlags.Common.isOnline = False
-    ConfigFlags.Beam.Type = "collisions"
-    ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
-    ConfigFlags.GeoModel.FaserVersion = "FASER-TB00"             # Always needed
-    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"             # Always needed; must match FaserVersion
-# Workaround for bug/missing flag; unimportant otherwise 
-    ConfigFlags.addFlag("Input.InitialTimeStamp", 0)
-# Workaround to avoid problematic ISF code
-    ConfigFlags.GeoModel.Layout = "Development"
-#
-# Output settings
-#
-    ConfigFlags.Output.HITSFileName = "myTestBeam.HITS.pool.root"
-    ConfigFlags.GeoModel.GeoExportFile = "faserTestBeamGeo.db" # Optional dump of geometry for browsing in vp1light
-#
-# Geometry-related settings
-# Do not change!
-#
-    detectors = ['Veto', 'Preshower', 'FaserSCT', 'Ecal']
-    from CalypsoConfiguration.DetectorConfigFlags import setupDetectorsFromList
-    setupDetectorsFromList(ConfigFlags, detectors, toggle_geometry=True)
-    ConfigFlags.GeoModel.Align.Dynamic  = False
-    ConfigFlags.Sim.ReleaseGeoModel     = False
-#
-# Physics list
-#
-    ConfigFlags.Sim.PhysicsList = "FTFP_BERT"
-#
-# All flags should be set before calling lock
-#
-    ConfigFlags.lock()
-#
-# Construct ComponentAccumulator
-#
-    acc = MainServicesCfg(ConfigFlags)
-#
-# Particle Gun generator (comment out to read generator file)
-# Raw energies (without units given) are interpreted as MeV
-#
-    pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
-    pg.randomSeed = 123456
-    pg.sampler.pid = -11
-    pg.sampler.mom = PG.EThetaMPhiSampler(energy=0.2*TeV, theta=[0, pi/20], phi=[0, 2*pi], mass=0.511)
-    pg.sampler.pos = PG.PosSampler(x=[-5, 5], y=[-5, 5], z=-20.0, t=0.0)
-    acc.addEventAlgo(pg, "AthBeginSeq") # to run *before* G4
-#
-# Only one of these two should be used in a given job
-# (MCEventSelectorCfg for generating events with no input file,
-#  PoolReadCfg when reading generator data from an input file)
-#    
-    acc.merge(McEventSelectorCfg(ConfigFlags))
-    # acc.merge(PoolReadCfg(ConfigFlags))
-#
-#  Output stream configuration
-#
-    acc.merge(OutputStreamCfg(ConfigFlags, 
-                              "HITS", 
-                             ["EventInfo#*",
-                              "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
-                              "NeutrinoHitCollection#*",
-                              "ScintHitCollection#*",
-                              "FaserSiHitCollection#*",
-                              "CaloHitCollection#*"
-                            ], disableEventTag=True))
-    acc.getEventAlgo("OutputStreamHITS").AcceptAlgs = ["G4FaserAlg"]               # optional
-    acc.getEventAlgo("OutputStreamHITS").WritingTool.ProcessingTag = "StreamHITS"  # required
-#
-#  Here is the configuration of the Geant4 pieces
-#    
-    acc.merge(FaserGeometryCfg(ConfigFlags))
-    acc.merge(G4FaserAlgCfg(ConfigFlags))
-    # Disable magnetic field
-    cacheAlg = acc.getCondAlgo("FaserFieldCacheCondAlg")
-    cacheAlg.UseDipoScale = 0.0
-    cacheAlg.UseDCS = False
-    acc.addService(G4GeometryNotifierSvcCfg(ConfigFlags, ActivateLVNotifier=True))
-#
-# Verbosity
-#
-#    ConfigFlags.dump()
-#    logging.getLogger('forcomps').setLevel(VERBOSE)
-#    acc.foreach_component("*").OutputLevel = VERBOSE
-#    acc.foreach_component("*ClassID*").OutputLevel = INFO
-#    acc.getService("StoreGateSvc").Dump=True
-#    acc.getService("ConditionStore").Dump=True
-#    acc.printConfig()
-    f=open('FaserG4AppCfgTestBeam_EVNT.pkl','wb')
-    acc.store(f)
-    f.close()
-#
-# Execute and finish
-#
-    sys.exit(int(acc.run(maxEvents=10).isFailure()))
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runGeantinoScan.py b/Simulation/G4Faser/G4FaserAlg/test/runGeantinoScan.py
index 99c94f3cd0b4a528bf67abf855162dee9b27970f..7e0a93719a520de7bb819fe270f8666a00c42f5c 100644
--- a/Simulation/G4Faser/G4FaserAlg/test/runGeantinoScan.py
+++ b/Simulation/G4Faser/G4FaserAlg/test/runGeantinoScan.py
@@ -76,7 +76,7 @@ if __name__ == "__main__":
 # Raw energies (without units given) are interpreted as MeV
 #
     pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
+    pg.McEventKey = "BeamTruthEvent"
     pg.randomSeed = 123456
     pg.sampler.pid = 999
     pg.sampler.mom = PG.EThetaMPhiSampler(energy=1*TeV, theta=[0, pi/20], phi=[0, 2*pi])
@@ -96,7 +96,7 @@ if __name__ == "__main__":
                               "HITS", 
                              ["EventInfo#*",
                               "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
+                              "McEventCollection#BeamTruthEvent",
 			      "Trk::MaterialStepCollection#*",
                               "ScintHitCollection#*",
                               "FaserSiHitCollection#*"
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runGen.py b/Simulation/G4Faser/G4FaserAlg/test/runGen.py
index 216688162a91f3ed561ef60566ea5d0c58ce6e28..e255b49ce3d866c457b691725bd9c15755a081b5 100755
--- a/Simulation/G4Faser/G4FaserAlg/test/runGen.py
+++ b/Simulation/G4Faser/G4FaserAlg/test/runGen.py
@@ -75,7 +75,7 @@ if __name__ == "__main__":
 # Raw energies (without units given) are interpreted as MeV
 #
     pg = PG.ParticleGun()
-    pg.McEventKey = "GEN_EVENT"
+    pg.McEventKey = "BeamTruthEvent"
     pg.randomSeed = 123456
     pg.sampler.pid = -13
     pg.sampler.mom = PG.EThetaMPhiSampler(energy=1*TeV, theta=[0, pi/20], phi=[0, 2*pi], mass=105.71)
@@ -95,7 +95,7 @@ if __name__ == "__main__":
                               "HITS", 
                              ["EventInfo#*",
                               "McEventCollection#TruthEvent",
-                              "McEventCollection#GEN_EVENT",
+                              "McEventCollection#BeamTruthEvent",
                               "ScintHitCollection#*",
                               "FaserSiHitCollection#*"
                             ], disableEventTag=True))
diff --git a/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py b/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py
index 9e502c2769e286af0da4e433fd3982a2f99ddfed..cb4f0bcfdb0aedfd41c7493269bc5f540839bc64 100644
--- a/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py
+++ b/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py
@@ -39,166 +39,3 @@ def ConstantFieldSvcCfg(ConfigFlags,name="ConstantField", **kwargs):
     return result
 
 
-# def ForwardFieldSvcCfg(ConfigFlags, name="ForwardField", **kwargs):
-#     result = ComponentAccumulator()
-
-#     #setup the field and add the magneticfield service
-#     acc = MagneticFieldSvcCfg(ConfigFlags)
-#     result.merge(acc)
-
-#     #FIXME Once it exists this version should use the new MagField Service defined in ForwardRegionMgField
-#     kwargs.setdefault("MagneticFieldSvc", result.getService("AtlasFieldSvc"))
-#     #kwargs.setdefault("FieldOn", True)
-
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-
-# def Q1FwdG4FieldSvcCfg(ConfigFlags, name='Q1FwdG4FieldSvc', **kwargs):
-#     result = ComponentAccumulator()
-
-#     result.addService( MagField__ForwardRegionFieldSvc("Q1", 
-#                                                         Magnet = 0, # FIXME find a better way to do this.
-#                                                         MQXA_DataFile = "MQXA_NOMINAL.dat"))
-
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q1"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q2FwdG4FieldSvcCfg(ConfigFlags, name='Q2FwdG4FieldSvc', **kwargs):
-#     result = ComponentAccumulator()
-
-#     result.addService( MagField__ForwardRegionFieldSvc("Q2", 
-#                                                         Magnet = 1, # FIXME find a better way to do this.
-#                                                         MQXA_DataFile = "MQXA_NOMINAL.dat"))
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q2"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q3FwdG4FieldSvcCfg(ConfigFlags, name='Q3FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-
-#     result.addService( MagField__ForwardRegionFieldSvc("Q3", 
-#                                                         Magnet = 2, # FIXME find a better way to do this.
-#                                                         MQXA_DataFile = "MQXA_NOMINAL.dat"))
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q3"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def D1FwdG4FieldSvcCfg(ConfigFlags, name='D1FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("D1", 
-#                                                         Magnet = 3))# FIXME find a better way to do this.
-                                                        
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("D1"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def D2FwdG4FieldSvcCfg(ConfigFlags, name='D2FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-
-#     result.addService( MagField__ForwardRegionFieldSvc("D2", 
-#                                                         Magnet = 4))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("D2"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q4FwdG4FieldSvcCfg(ConfigFlags, name='Q4FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q4", 
-#                                                         Magnet = 5))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q4"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q5FwdG4FieldSvcCfg(ConfigFlags, name='Q5FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q5", 
-#                                                         Magnet = 6))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q5"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q6FwdG4FieldSvcCfg(ConfigFlags, name='Q6FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q6", 
-#                                                         Magnet = 7))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q6"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q7FwdG4FieldSvcCfg(ConfigFlags, name='Q7FwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q7", 
-#                                                         Magnet = 8))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q7"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q1HKickFwdG4FieldSvcCfg(ConfigFlags, name='Q1HKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q1HKick", 
-#                                                         Magnet = 9))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q1HKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q1VKickFwdG4FieldSvcCfg(ConfigFlags, name='Q1VKickFwdG4FieldSvc', **kwargs): #note is lower case "v" in ForwardRegionMgFieldConfig.py
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q1VKick", 
-#                                                         Magnet = 10))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q1VKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q2HKickFwdG4FieldSvcCfg(ConfigFlags, name='Q2HKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q2HKick", 
-#                                                         Magnet = 11))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q2HKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q2VKickFwdG4FieldSvcCfg(ConfigFlags, name='Q2VKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q2VKick", 
-#                                                         Magnet = 12))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q2VKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q3HKickFwdG4FieldSvcCfg(ConfigFlags, name='Q3HKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q3HKick", 
-#                                                         Magnet = 13))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q3HKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q3VKickFwdG4FieldSvcCfg(ConfigFlags, name='Q3VKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q3VKick", 
-#                                                         Magnet = 14))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q3VKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q4VKickAFwdG4FieldSvcCfg(ConfigFlags, name='Q4VKickAFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q4VKickA", 
-#                                                         Magnet = 15))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q4VKickA"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q4HKickFwdG4FieldSvcCfg(ConfigFlags, name='Q4HKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q4HKick", 
-#                                                         Magnet = 16))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q4HKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q4VKickBFwdG4FieldSvcCfg(ConfigFlags, name='Q4VKickBFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q4VKickB", 
-#                                                         Magnet = 17))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q4VKickB"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q5HKickFwdG4FieldSvcCfg(ConfigFlags, name='Q5HKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q5HKick", 
-#                                                         Magnet = 18))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q5HKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
-# def Q6VKickFwdG4FieldSvcCfg(ConfigFlags, name='Q6VKickFwdG4FieldSvc', **kwargs): 
-#     result = ComponentAccumulator()
-#     result.addService( MagField__ForwardRegionFieldSvc("Q6VKick", 
-#                                                         Magnet = 19))# FIXME find a better way to do this.
-#     kwargs.setdefault("MagneticFieldSvc",           result.getService("Q6VKick"))
-#     result.addService(StandardFieldSvc(name, **kwargs))
-#     return result
diff --git a/Simulation/G4Faser/G4FaserServices/python/G4FaserServicesConfigNew.py b/Simulation/G4Faser/G4FaserServices/python/G4FaserServicesConfigNew.py
index 21357a02dc4298dc734f0dcbbc70d38f8b52b45b..839a4fda883d0f8e39f04f4efdc7a632918a6176 100644
--- a/Simulation/G4Faser/G4FaserServices/python/G4FaserServicesConfigNew.py
+++ b/Simulation/G4Faser/G4FaserServices/python/G4FaserServicesConfigNew.py
@@ -1,116 +1,21 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 from __future__ import print_function
 from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 
 DetectorGeometrySvc, G4AtlasSvc, G4GeometryNotifierSvc, PhysicsListSvc=CompFactory.getComps("DetectorGeometrySvc","G4AtlasSvc","G4GeometryNotifierSvc","PhysicsListSvc",)
-#
-#  Physics region tools
-#
-from G4FaserTools.G4PhysicsRegionConfigNew import NeutrinoPhysicsRegionToolCfg, ScintillatorPhysicsRegionToolCfg, TrackerPhysicsRegionToolCfg, EcalPhysicsRegionToolCfg
-#
-#  Geometry tools
-#
-from G4FaserTools.G4GeometryToolConfig import MaterialDescriptionToolCfg, G4AtlasDetectorConstructionToolCfg, FASEREnvelopeCfg
-#
-#  Magnetic field tools - start simple
-#
-from G4FaserTools.G4FieldConfigNew import FASERFieldManagerToolCfg, EmulsionFieldManagerToolCfg, VetoFieldManagerToolCfg, TriggerFieldManagerToolCfg, PreshowerFieldManagerToolCfg
-#
-#  Future field managers (?)
-#
-# from G4FaserTools.G4FieldConfigNew import UpstreamDipoleFieldManagerToolCfg, CentralDipoleFieldManagerToolCfg, DownstreamDipleFieldManagerToolCfg, FaserCaloFieldManagerToolCfg
-from G4FaserTools.G4FieldConfigNew import TrackerFieldManagerToolCfg, DipoleFieldManagerToolCfg, EcalFieldManagerToolCfg
-#
-#
-#
-def getFASER_RegionCreatorList(ConfigFlags):
-    regionCreatorList = []
-
-    # from G4AtlasApps.SimFlags import simFlags
-    # Settings to widen the region of study - not yet supported by FASER
-    # if ConfigFlags.Beam.Type == 'cosmics' or ConfigFlags.Sim.CavernBG != 'Signal':
-    #     regionCreatorList += [SX1PhysicsRegionToolCfg(ConfigFlags), BedrockPhysicsRegionToolCfg(ConfigFlags), CavernShaftsConcretePhysicsRegionToolCfg(ConfigFlags)]
-
-    if ConfigFlags.Detector.EnableNeutrino:
-        regionCreatorList += [NeutrinoPhysicsRegionToolCfg(ConfigFlags)]
-
-    if ConfigFlags.Detector.EnableScintillator:
-        regionCreatorList += [ScintillatorPhysicsRegionToolCfg(ConfigFlags)]
-
-    if ConfigFlags.Detector.EnableTracker:
-        regionCreatorList += [TrackerPhysicsRegionToolCfg(ConfigFlags)]
-
-    if ConfigFlags.Detector.EnableEcal:
-        regionCreatorList += [EcalPhysicsRegionToolCfg(ConfigFlags)]
-
-    return regionCreatorList
-
-#########################################################################
-def FASER_FieldMgrListCfg(ConfigFlags):
-    result = ComponentAccumulator()
-    fieldMgrList = []
-
-    acc   = FASERFieldManagerToolCfg(ConfigFlags)
-    tool  = result.popToolsAndMerge(acc)
-    fieldMgrList += [tool]
-
-    if ConfigFlags.Detector.GeometryDipole:
-        acc = DipoleFieldManagerToolCfg(ConfigFlags)
-        tool  = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]    
-    if ConfigFlags.Detector.GeometryEmulsion:
-        acc = EmulsionFieldManagerToolCfg(ConfigFlags)
-        tool  = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]
-    if ConfigFlags.Detector.GeometryVeto:
-        acc = VetoFieldManagerToolCfg(ConfigFlags)
-        tool  = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]
-    if ConfigFlags.Detector.GeometryTrigger:
-        acc = TriggerFieldManagerToolCfg(ConfigFlags)
-        tool = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]
-    if ConfigFlags.Detector.GeometryPreshower:
-        acc = PreshowerFieldManagerToolCfg(ConfigFlags)
-        tool = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]
-    if ConfigFlags.Detector.GeometryTracker:
-        acc = TrackerFieldManagerToolCfg(ConfigFlags)
-        tool  = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]
-    if ConfigFlags.Detector.GeometryEcal:
-        acc = EcalFieldManagerToolCfg(ConfigFlags)
-        tool  = result.popToolsAndMerge(acc)
-        fieldMgrList += [tool]
-
-    result.setPrivateTools(fieldMgrList)
-    return result
-
-def getGeometryConfigurationTools(ConfigFlags):
-    geoConfigToolList = []
-    # The methods for these tools should be defined in the
-    # package containing each tool, so G4FaserTools in this case
-    geoConfigToolList += [MaterialDescriptionToolCfg(ConfigFlags)]
-    return geoConfigToolList
-
+from G4FaserTools.G4GeometryToolConfig import G4AtlasDetectorConstructionToolCfg
 
 def DetectorGeometrySvcCfg(ConfigFlags, name="DetectorGeometrySvc", **kwargs):
     result = ComponentAccumulator()
-    kwargs.setdefault("DetectorConstruction", G4AtlasDetectorConstructionToolCfg(ConfigFlags))
-    kwargs.setdefault("GeometryConfigurationTools", getGeometryConfigurationTools(ConfigFlags))
-
-    accGeo, toolGeo = FASEREnvelopeCfg(ConfigFlags)
-    kwargs.setdefault("World", toolGeo)
-    result.merge(accGeo)
-    kwargs.setdefault("RegionCreators", getFASER_RegionCreatorList(ConfigFlags))
-    acc = FASER_FieldMgrListCfg(ConfigFlags)
-    fieldMgrList = result.popToolsAndMerge(acc)
-    kwargs.setdefault("FieldManagers", fieldMgrList)
+    detConstTool = result.popToolsAndMerge(G4AtlasDetectorConstructionToolCfg(ConfigFlags))
+    result.addPublicTool(detConstTool)
+    kwargs.setdefault("DetectorConstruction", result.getPublicTool(detConstTool.name))
 
     result.addService(DetectorGeometrySvc(name, **kwargs))
     return result
 
+
 def G4AtlasSvcCfg(ConfigFlags, name="G4AtlasSvc", **kwargs):
     if ConfigFlags.Concurrency.NumThreads > 0:
         is_hive = True
@@ -126,6 +31,7 @@ def G4GeometryNotifierSvcCfg(ConfigFlags, name="G4GeometryNotifierSvc", **kwargs
     kwargs.setdefault("ActivatePVNotifier", False)
     return G4GeometryNotifierSvc(name, **kwargs)
 
+
 def PhysicsListSvcCfg(ConfigFlags, name="PhysicsListSvc", **kwargs):
     result = ComponentAccumulator()
     G4StepLimitationTool = CompFactory.G4StepLimitationTool
@@ -138,13 +44,19 @@ def PhysicsListSvcCfg(ConfigFlags, name="PhysicsListSvc", **kwargs):
     if 'PhysicsList' in kwargs:
         if kwargs['PhysicsList'].endswith('_EMV') or kwargs['PhysicsList'].endswith('_EMX'):
             raise RuntimeError( 'PhysicsList not allowed: '+kwargs['PhysicsList'] )
-    kwargs.setdefault("GeneralCut", 1.)
-    if ConfigFlags.Sim.NeutronTimeCut > 0.:
-        kwargs.setdefault("NeutronTimeCut", ConfigFlags.Sim.NeutronTimeCut)
-
-    if ConfigFlags.Sim.NeutronEnergyCut > 0.:
-        kwargs.setdefault("NeutronEnergyCut", ConfigFlags.Sim.NeutronEnergyCut)
 
+    kwargs.setdefault("GeneralCut", 1.)
+    kwargs.setdefault("NeutronTimeCut", ConfigFlags.Sim.NeutronTimeCut)
+    kwargs.setdefault("NeutronEnergyCut", ConfigFlags.Sim.NeutronEnergyCut)
     kwargs.setdefault("ApplyEMCuts", ConfigFlags.Sim.ApplyEMCuts)
+    ## from AthenaCommon.SystemOfUnits import eV, TeV
+    ## kwargs.setdefault("EMMaxEnergy"     , 7*TeV)
+    ## kwargs.setdefault("EMMinEnergy"     , 100*eV)
+    """ --- ATLASSIM-3967 ---
+        these two options are replaced by SetNumberOfBinsPerDecade
+        which now controls both values.
+    """
+    ## kwargs.setdefault("EMDEDXBinning"   , 77)
+    ## kwargs.setdefault("EMLambdaBinning" , 77)
     result.addService(PhysicsListSvc(name, **kwargs))
     return result
diff --git a/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py b/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py
index 6f3d50a2b91d255fa6ad1af6b9e73ad61ddb12ab..3520b26d0df3e3bc948c8b69cedf4de6cc5aecb6 100644
--- a/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py
+++ b/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py
@@ -6,6 +6,20 @@ from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaCommon import CfgMgr
 SensitiveDetectorMasterTool=CompFactory.SensitiveDetectorMasterTool
+FastSimulationMasterTool=CompFactory.FastSimulationMasterTool
+
+def generateFastSimulationListCfg(ConfigFlags):
+    result = ComponentAccumulator()
+    FastSimulationList = []
+    result.setPrivateTools(FastSimulationList)
+    return result
+
+def FastSimulationMasterToolCfg(ConfigFlags, **kwargs):
+    result = ComponentAccumulator()
+    FastSimulationList = result.popToolsAndMerge(generateFastSimulationListCfg(ConfigFlags))
+    kwargs.setdefault("FastSimulations", FastSimulationList)
+    result.setPrivateTools(FastSimulationMasterTool(name="FastSimulationMasterTool", **kwargs))
+    return result
 
 from EmulsionG4_SD.EmulsionG4_SDToolConfig import EmulsionSensorSDCfg
 from VetoG4_SD.VetoG4_SDToolConfig import VetoSensorSDCfg
@@ -72,12 +86,6 @@ def generateCaloSensitiveDetectorList(ConfigFlags):
     
     return result, SensitiveDetectorList #List of tools here now! (CALL IT TOOL LIST?)
 
-# def generateEnvelopeSensitiveDetectorList(ConfigFlags):
-#     SensitiveDetectorList=[]
-#     if ConfigFlags.Beam.Type == 'cosmics' and not ConfigFlags.Sim.ReadTR:
-#         SensitiveDetectorList+=['CosmicRecord']
-#     return SensitiveDetectorList
-
 def generateSensitiveDetectorList(ConfigFlags):
     result = ComponentAccumulator()
     SensitiveDetectorList=[]
@@ -108,7 +116,7 @@ def SensitiveDetectorMasterToolCfg(ConfigFlags, name="SensitiveDetectorMasterToo
     accSensitiveDetector = generateSensitiveDetectorList(ConfigFlags)
     kwargs.setdefault("SensitiveDetectors", result.popToolsAndMerge(accSensitiveDetector)) #list of tools
 
-    result.addPublicTool(SensitiveDetectorMasterTool(name, **kwargs)) #note -this is still a public tool
+    result.setPrivateTools(SensitiveDetectorMasterTool(name, **kwargs)) #note -this is still a public tool
     return result
 
 def getEmptySensitiveDetectorMasterTool(name="EmptySensitiveDetectorMasterTool", **kwargs):
diff --git a/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py b/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py
index 85b372fa30ee6bdb1b3b5015b7901d5db8792fe6..992cfbe4fe506841adbbaa052540dc50168f1155 100644
--- a/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py
+++ b/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py
@@ -3,11 +3,15 @@
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 
-GeoDetectorTool=CompFactory.GeoDetectorTool
+from AthenaCommon import Logging
 
-BoxEnvelope,MaterialDescriptionTool,G4AtlasDetectorConstructionTool=CompFactory.getComps("BoxEnvelope","MaterialDescriptionTool","G4AtlasDetectorConstructionTool",)
+#the physics region tools
+from G4FaserTools.G4PhysicsRegionConfigNew import NeutrinoPhysicsRegionToolCfg, TrackerPhysicsRegionToolCfg, ScintillatorPhysicsRegionToolCfg, EcalPhysicsRegionToolCfg
 
-from AthenaCommon.SystemOfUnits import mm
+#the field config tools
+from G4FaserTools.G4FieldConfigNew import FASERFieldManagerToolCfg, EmulsionFieldManagerToolCfg, VetoFieldManagerToolCfg, TriggerFieldManagerToolCfg, PreshowerFieldManagerToolCfg, TrackerFieldManagerToolCfg, DipoleFieldManagerToolCfg, EcalFieldManagerToolCfg
+
+GeoDetectorTool=CompFactory.GeoDetectorTool
 from EmulsionGeoModel.EmulsionGeoModelConfig import EmulsionGeometryCfg
 from VetoGeoModel.VetoGeoModelConfig import VetoGeometryCfg
 from TriggerGeoModel.TriggerGeoModelConfig import TriggerGeometryCfg
@@ -16,123 +20,249 @@ from FaserSCT_GeoModel.FaserSCT_GeoModelConfig import FaserSCT_GeometryCfg
 from DipoleGeoModel.DipoleGeoModelConfig import DipoleGeometryCfg
 from EcalGeoModel.EcalGeoModelConfig import EcalGeometryCfg
 
+BoxEnvelope, MaterialDescriptionTool, SmartlessnessTool, G4AtlasDetectorConstructionTool = CompFactory.getComps("BoxEnvelope", "MaterialDescriptionTool", "SmartlessnessTool", "G4AtlasDetectorConstructionTool",)
+
+from AthenaCommon.SystemOfUnits import mm
+
 #ToDo - finish migrating this (dnoel)
 #Todo - just return component accumulator
 #to still migrate: getCavernWorld, getCavernInfraGeoDetectorTool
 #from ForwardRegionProperties.ForwardRegionPropertiesToolConfig import ForwardRegionPropertiesCfg
 
+#put it here to avoid circular import?
+G4GeometryNotifierSvc=CompFactory.G4GeometryNotifierSvc
+def G4GeometryNotifierSvcCfg(ConfigFlags, name="G4GeometryNotifierSvc", **kwargs):
+    kwargs.setdefault("ActivateLVNotifier", True)
+    kwargs.setdefault("ActivatePVNotifier", False)
+    return G4GeometryNotifierSvc(name, **kwargs)
+
 def EmulsionGeoDetectorToolCfg(ConfigFlags, name='Emulsion', **kwargs):
     #set up geometry
     result=EmulsionGeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "Emulsion")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def VetoGeoDetectorToolCfg(ConfigFlags, name='Veto', **kwargs):
     #set up geometry
     result=VetoGeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "Veto")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def TriggerGeoDetectorToolCfg(ConfigFlags, name='Trigger', **kwargs):
     #set up geometry
     result=TriggerGeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "Trigger")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def PreshowerGeoDetectorToolCfg(ConfigFlags, name='Preshower', **kwargs):
     #set up geometry
     result=PreshowerGeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "Preshower")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def SCTGeoDetectorToolCfg(ConfigFlags, name='SCT', **kwargs):
     #set up geometry
     result=FaserSCT_GeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "SCT")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def DipoleGeoDetectorToolCfg(ConfigFlags, name='Dipole', **kwargs):
     #set up geometry
     result=DipoleGeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "Dipole")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def EcalGeoDetectorToolCfg(ConfigFlags, name='Ecal', **kwargs):
     #set up geometry
     result=EcalGeometryCfg(ConfigFlags)
     kwargs.setdefault("DetectorName", "Ecal")
-    return result, GeoDetectorTool(name, **kwargs)
+    #add the GeometryNotifierSvc
+    result.addService(G4GeometryNotifierSvcCfg(ConfigFlags))
+    kwargs.setdefault("GeometryNotifierSvc", result.getService("G4GeometryNotifierSvc"))
+    result.setPrivateTools(GeoDetectorTool(name, **kwargs))
+    return result
 
 def generateSubDetectorList(ConfigFlags):
     result = ComponentAccumulator()
     SubDetectorList=[]
 
     if ConfigFlags.Detector.GeometryEmulsion:
-        accEmulsion, toolEmulsion = EmulsionGeoDetectorToolCfg(ConfigFlags)
+        toolEmulsion = result.popToolsAndMerge(EmulsionGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolEmulsion ]
-        result.merge(accEmulsion)
 
     if ConfigFlags.Detector.GeometryVeto:
-        accVeto, toolVeto = VetoGeoDetectorToolCfg(ConfigFlags)
+        toolVeto = result.popToolsAndMerge(VetoGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolVeto ]
-        result.merge(accVeto)
 
     if ConfigFlags.Detector.GeometryTrigger:
-        accTrigger, toolTrigger = TriggerGeoDetectorToolCfg(ConfigFlags)
+        toolTrigger = result.popToolsAndMerge(TriggerGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolTrigger ]
-        result.merge(accTrigger)
 
     if ConfigFlags.Detector.GeometryPreshower:
-        accPreshower, toolPreshower = PreshowerGeoDetectorToolCfg(ConfigFlags)
+        toolPreshower = result.popToolsAndMerge(PreshowerGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolPreshower ]
-        result.merge(accPreshower)
 
     if ConfigFlags.Detector.GeometryFaserSCT:
-        accSCT, toolSCT = SCTGeoDetectorToolCfg(ConfigFlags)
+        toolSCT = result.popToolsAndMerge(SCTGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolSCT ]
-        result.merge(accSCT)
 
     if ConfigFlags.Detector.GeometryDipole:
-        accDipole, toolDipole = DipoleGeoDetectorToolCfg(ConfigFlags)
+        toolDipole = result.popToolsAndMerge(DipoleGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolDipole ]
-        result.merge(accDipole)
 
     if ConfigFlags.Detector.GeometryEcal:
-        accEcal, toolEcal = EcalGeoDetectorToolCfg(ConfigFlags)
+        toolEcal = result.popToolsAndMerge(EcalGeoDetectorToolCfg(ConfigFlags))
         SubDetectorList += [ toolEcal ]
-        result.merge(accEcal)
-
-    return result, SubDetectorList
+    result.setPrivateTools(SubDetectorList)
+    return result
 
 def FASEREnvelopeCfg(ConfigFlags, name="Faser", **kwargs):
     result = ComponentAccumulator()
 
-    kwargs.setdefault("DetectorName", "Faser")
-    accSubDetectors, SubDetectorList = generateSubDetectorList(ConfigFlags) 
-    result.merge(accSubDetectors)
-
     kwargs.setdefault("OffsetX", 0.0 * mm)
     kwargs.setdefault("OffsetY", 0.0 * mm)
     kwargs.setdefault("OffsetZ", 0.0 * mm)
-    # kwargs.setdefault("OffsetX", 0.0 * mm)
-    # kwargs.setdefault("OffsetY", 0.0 * mm)
-    # kwargs.setdefault("OffsetZ", -1650.0 * mm)
-    
-    # kwargs.setdefault("dX", 16.0 * mm) 
-    # kwargs.setdefault("dY", 16.0 * mm) 
-    # kwargs.setdefault("dZ", 33.0 * mm) 
     kwargs.setdefault("dX", 600.0 * mm) 
     kwargs.setdefault("dY", 600.0 * mm) 
     kwargs.setdefault("dZ", 4000.0 * mm) 
 
+    kwargs.setdefault("DetectorName", "Faser")
+    SubDetectorList = result.popToolsAndMerge(generateSubDetectorList(ConfigFlags))
     kwargs.setdefault("SubDetectors", SubDetectorList)
+    result.setPrivateTools(BoxEnvelope(name, **kwargs))
+    return result
 
-    return result, BoxEnvelope(name, **kwargs)
+def MaterialDescriptionToolCfg(ConfigFlags, name="MaterialDescriptionTool", **kwargs):
+    ## kwargs.setdefault("SomeProperty", aValue)
+    result = ComponentAccumulator()
+    result.setPrivateTools(MaterialDescriptionTool(name, **kwargs))
+    return result
 
-def G4AtlasDetectorConstructionToolCfg(ConfigFlags, name="G4FaserDetectorConstructionTool", **kwargs):
-    return G4AtlasDetectorConstructionTool(name, **kwargs)
 
-def MaterialDescriptionToolCfg(ConfigFlags, name="MaterialDescriptionTool", **kwargs):
+def SmartlessnessToolCfg(ConfigFlags, name="SmartlessnessTool", **kwargs):
     ## kwargs.setdefault("SomeProperty", aValue)
-    return MaterialDescriptionTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(SmartlessnessTool(name, **kwargs))
+    return result
+
+def getFASER_RegionCreatorList(ConfigFlags):
+    regionCreatorList = []
+
+    if ConfigFlags.Detector.GeometryNeutrino:
+        regionCreatorList += [NeutrinoPhysicsRegionToolCfg(ConfigFlags)]
+
+    if ConfigFlags.Detector.GeometryTracker:
+        regionCreatorList += [TrackerPhysicsRegionToolCfg(ConfigFlags)]
+
+    if ConfigFlags.Detector.GeometryScintillator:
+        regionCreatorList += [ScintillatorPhysicsRegionToolCfg(ConfigFlags)]
+
+    if ConfigFlags.Detector.GeometryFaserCalo:
+        regionCreatorList += [EcalPhysicsRegionToolCfg(ConfigFlags)]
+
+    return regionCreatorList
+
+def FASER_FieldMgrListCfg(ConfigFlags):
+    result = ComponentAccumulator()
+    fieldMgrList = []
+
+    acc   = FASERFieldManagerToolCfg(ConfigFlags)
+    tool  = result.popToolsAndMerge(acc)
+    fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryEmulsion:
+        acc = EmulsionFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryVeto:
+        acc = VetoFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryTrigger:
+        acc = TriggerFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryPreshower:
+        acc = PreshowerFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryTracker:
+        acc = TrackerFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryDipole:
+        acc = DipoleFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    if ConfigFlags.Detector.GeometryEcal:
+        acc = EcalFieldManagerToolCfg(ConfigFlags)
+        tool  = result.popToolsAndMerge(acc)
+        fieldMgrList += [tool]
+
+    result.setPrivateTools(fieldMgrList)
+    return result
+
+def getGeometryConfigurationTools(ConfigFlags):
+    geoConfigToolList = []
+    # The methods for these tools should be defined in the
+    # package containing each tool, so G4FaserTools in this case
+    result =ComponentAccumulator()
+    geoConfigToolList += [result.popToolsAndMerge(MaterialDescriptionToolCfg(ConfigFlags))]
+    geoConfigToolList += [result.popToolsAndMerge(SmartlessnessToolCfg(ConfigFlags))]
+    return result, geoConfigToolList
+
+
+def G4AtlasDetectorConstructionToolCfg(ConfigFlags, name="G4FaserDetectorConstructionTool", **kwargs):
+    result = ComponentAccumulator()
+
+    ## For now just have the same geometry configurations tools loaded for ATLAS and TestBeam
+    geoConfAcc, listOfGeoConfTools = getGeometryConfigurationTools(ConfigFlags)
+    result.merge(geoConfAcc)
+    kwargs.setdefault("GeometryConfigurationTools", listOfGeoConfTools)
+
+    # Getting this tool by name works, but not if you use getSensitiveDetectorMasterTool()
+    kwargs.setdefault('SenDetMasterTool', "SensitiveDetectorMasterTool" )
+
+    toolGeo = result.popToolsAndMerge(FASEREnvelopeCfg(ConfigFlags))
+    kwargs.setdefault("World", toolGeo)
+    kwargs.setdefault("RegionCreators", getFASER_RegionCreatorList(ConfigFlags))
+    #if hasattr(simFlags, 'MagneticField') and simFlags.MagneticField.statusOn:
+    if True:
+        acc = FASER_FieldMgrListCfg(ConfigFlags)
+        fieldMgrList = result.popToolsAndMerge(acc)
+        kwargs.setdefault("FieldManagers", fieldMgrList)
+    
+    result.setPrivateTools(G4AtlasDetectorConstructionTool(name, **kwargs))
+    return result
+
 
diff --git a/Simulation/G4Faser/G4FaserTools/python/G4PhysicsRegionConfigNew.py b/Simulation/G4Faser/G4FaserTools/python/G4PhysicsRegionConfigNew.py
index c910e2b8003df305b801f437257b0b44cbf937ec..040853dc2f46d08f0a92843d8b2f0dfef945ef11 100644
--- a/Simulation/G4Faser/G4FaserTools/python/G4PhysicsRegionConfigNew.py
+++ b/Simulation/G4Faser/G4FaserTools/python/G4PhysicsRegionConfigNew.py
@@ -2,65 +2,6 @@
 from AthenaConfiguration.ComponentFactory import CompFactory
 
 RegionCreator=CompFactory.RegionCreator
-# Beampipe Regions
-# def BeampipeFwdCutPhysicsRegionToolCfg(ConfigFlags, name='BeampipeFwdCutPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'BeampipeFwdCut')
-#     volumeList = ['BeamPipe::SectionF47', 'BeamPipe::SectionF48', 'BeamPipe::SectionF61']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     from G4AtlasApps.SimFlags import simFlags
-
-#     #if simFlags.BeamPipeSimMode() == "FastSim":
-#     if True:
-#         kwargs.setdefault("ElectronCut", 10.)
-#         kwargs.setdefault("PositronCut", 10.)
-#         kwargs.setdefault("GammaCut", 10.)
-#         print('Adding fast sim model to the beampipe!')
-#     else:
-#         assert simFlags.BeamPipeCut.statusOn
-#         if simFlags.BeamPipeCut() < 1:
-#             msg = "Setting the forward beam pipe range cuts to %e mm " % simFlags.BeamPipeCut()
-#             msg += "-- cut is < 1 mm, I hope you know what you're doing!"
-#             print(msg)
-#         if simFlags.BeamPipeSimMode() == "EGammaRangeCuts":
-#             kwargs.setdefault("ElectronCut", simFlags.BeamPipeCut())
-#             kwargs.setdefault("PositronCut", simFlags.BeamPipeCut())
-#             kwargs.setdefault("GammaCut", simFlags.BeamPipeCut())
-#         elif simFlags.BeamPipeSimMode() == "EGammaPRangeCuts":
-#             kwargs.setdefault("ElectronCut", simFlags.BeamPipeCut())
-#             kwargs.setdefault("PositronCut", simFlags.BeamPipeCut())
-#             kwargs.setdefault("GammaCut", simFlags.BeamPipeCut())
-#             kwargs.setdefault("ProtonCut", simFlags.BeamPipeCut())
-#     return RegionCreator(name, **kwargs)
-
-# def FWDBeamLinePhysicsRegionToolCfg(ConfigFlags, name='FWDBeamLinePhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'FWDBeamLine')
-#     volumeList = ['BeamPipe::SectionF46']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     return RegionCreator(name, **kwargs)
-
-# # Forward Regions
-# def FwdRegionPhysicsRegionToolCfg(ConfigFlags, name='FwdRegionPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'FwdRegion')
-#     volumeList = ['FwdRegion::ForwardRegionGeoModel']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 200.)
-#     kwargs.setdefault("PositronCut", 200.)
-#     kwargs.setdefault("GammaCut",    200.)
-#     return RegionCreator(name, **kwargs)
-
-# # Inner Detector Regions
-# def PixelPhysicsRegionToolCfg(ConfigFlags, name='PixelPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'Pixel')
-#     volumeList = ['Pixel::siLog', 'Pixel::siBLayLog']
-#     from AtlasGeoModel.CommonGMJobProperties import CommonGeometryFlags as commonGeoFlags
-#     from AtlasGeoModel.InDetGMJobProperties import InDetGeometryFlags as geoFlags
-#     if (ConfigFlags.GeoModel.Run in ["RUN2", "RUN3"]) or (commonGeoFlags.Run()=="UNDEFINED" and geoFlags.isIBL()):
-#         volumeList += ['Pixel::dbmDiamondLog']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.05)
-#     kwargs.setdefault("PositronCut", 0.05)
-#     kwargs.setdefault("GammaCut",    0.05)
-#     return RegionCreator(name, **kwargs)
 
 #  Values identical to ATLAS SCT
 
@@ -104,232 +45,3 @@ def EcalPhysicsRegionToolCfg(ConfigFlags, name='EcalPhysicsRegionTool', **kwargs
     kwargs.setdefault("PositronCut", rangeEMB)
     kwargs.setdefault("GammaCut",    rangeEMB)
     return RegionCreator(name, **kwargs)
-
-# def SCTPhysicsRegionToolCfg(ConfigFlags, name='SCTPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'SCT')
-#     volumeList = ['SCT::BRLSensor', 'SCT::BRLSensorSS', 'SCT::BRLSensorMS',
-#                    'SCT::ECSensor0', 'SCT::ECSensor1', 'SCT::ECSensor2',
-#                    'SCT::ECSensor3', 'SCT::ECSensor4', 'SCT::ECSensor5']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.05)
-#     kwargs.setdefault("PositronCut", 0.05)
-#     kwargs.setdefault("GammaCut",    0.05)
-#     return RegionCreator(name, **kwargs)
-
-# def TRTPhysicsRegionToolCfg(ConfigFlags, name='TRTPhysicsRegionTool', **kwargs):
-#     #rangeCut = simFlags.TRTRangeCut._Value()
-#     rangeCut = 30.0
-#     kwargs.setdefault("RegionName", 'TRT')
-#     volumeList = ['TRT::Gas', 'TRT::GasMA']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", rangeCut)
-#     kwargs.setdefault("PositronCut", rangeCut)
-#     # The photon range cut is meant to stay small
-#     kwargs.setdefault("GammaCut",    0.05)
-#     return RegionCreator(name, **kwargs)
-
-# def TRT_ArPhysicsRegionToolCfg(ConfigFlags, name='TRT_ArPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'TRT_Ar')
-#     volumeList = ['TRT::Gas_Ar', 'TRT::GasMA_Ar']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 30.0)
-#     kwargs.setdefault("PositronCut", 30.0)
-#     kwargs.setdefault("GammaCut",    0.05)
-#     return RegionCreator(name, **kwargs)
-
-# def TRT_KrPhysicsRegionToolCfg(ConfigFlags, name='TRT_KrPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'TRT_Kr')
-#     volumeList = ['TRT::Gas_Kr', 'TRT::GasMA_Kr']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 15.0)
-#     kwargs.setdefault("PositronCut", 15.0)
-#     kwargs.setdefault("GammaCut",    0.05)
-#     return RegionCreator(name, **kwargs)
-
-# # Calo Regions
-# def EMBPhysicsRegionToolCfg(ConfigFlags, name='EMBPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'EMB')
-#     volumeList = ['LArMgr::LAr::EMB::STAC']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     rangeEMB = 0.03
-#     from G4AtlasApps.SimFlags import simFlags
-#     if '_EMV' not in simFlags.PhysicsList() and '_EMX' not in simFlags.PhysicsList():
-#         rangeEMB = 0.1
-#     kwargs.setdefault("ElectronCut", rangeEMB)
-#     kwargs.setdefault("PositronCut", rangeEMB)
-#     kwargs.setdefault("GammaCut",    rangeEMB)
-#     return RegionCreator(name, **kwargs)
-
-# def EMECPhysicsRegionToolCfg(ConfigFlags, name='EMECPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'EMEC')
-#     volumeList = ['LArMgr::LAr::EMEC::Mother']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     rangeEMEC = 0.03
-#     from G4AtlasApps.SimFlags import simFlags
-#     if '_EMV' not in simFlags.PhysicsList() and '_EMX' not in simFlags.PhysicsList():
-#         rangeEMEC = 0.1
-#     kwargs.setdefault("ElectronCut", rangeEMEC)
-#     kwargs.setdefault("PositronCut", rangeEMEC)
-#     kwargs.setdefault("GammaCut",    rangeEMEC)
-#     return RegionCreator(name, **kwargs)
-
-# def HECPhysicsRegionToolCfg(ConfigFlags, name='HECPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'HEC')
-#     volumeList = ['LArMgr::LAr::HEC::LiquidArgon']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     rangeHEC = 0.03
-#     from G4AtlasApps.SimFlags import simFlags
-#     if '_EMV' not in simFlags.PhysicsList() and '_EMX' not in simFlags.PhysicsList():
-#         rangeHEC = 1.0
-#     kwargs.setdefault("ElectronCut", rangeHEC)
-#     kwargs.setdefault("PositronCut", rangeHEC)
-#     kwargs.setdefault("GammaCut",    rangeHEC)
-#     return RegionCreator(name, **kwargs)
-
-# def FCALPhysicsRegionToolCfg(ConfigFlags, name='FCALPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'FCAL')
-#     volumeList = ['LArMgr::LAr::FCAL::LiquidArgonC']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.03)
-#     kwargs.setdefault("PositronCut", 0.03)
-#     kwargs.setdefault("GammaCut",    0.03)
-#     return RegionCreator(name, **kwargs)
-
-# def EMECParaPhysicsRegionToolCfg(ConfigFlags, name='EMECParaPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'EMECPara')
-#     volumeList = ['LArMgr::LAr::EMEC::Pos::InnerWheel', 'LArMgr::LAr::EMEC::Pos::OuterWheel',
-#                   'LArMgr::LAr::EMEC::Neg::InnerWheel', 'LArMgr::LAr::EMEC::Neg::OuterWheel']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     rangeEMEC = 0.03
-#     from G4AtlasApps.SimFlags import simFlags
-#     if '_EMV' not in simFlags.PhysicsList() and '_EMX' not in simFlags.PhysicsList():
-#         rangeEMEC = 0.1
-#     kwargs.setdefault("ElectronCut", rangeEMEC)
-#     kwargs.setdefault("PositronCut", rangeEMEC)
-#     kwargs.setdefault("GammaCut",    rangeEMEC)
-#     return RegionCreator(name, **kwargs)
-
-# def FCALParaPhysicsRegionToolCfg(ConfigFlags, name='FCALParaPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'FCALPara')
-#     volumeList = ['LArMgr::LAr::FCAL::Module1::Absorber']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.03)
-#     kwargs.setdefault("PositronCut", 0.03)
-#     kwargs.setdefault("GammaCut",    0.03)
-#     return RegionCreator(name, **kwargs)
-
-# def FCAL2ParaPhysicsRegionToolCfg(ConfigFlags, name='FCAL2ParaPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'FCAL2Para')
-#     volumeList = ['LArMgr::LAr::FCAL::Module2::Absorber', 'LArMgr::LAr::FCAL::Module3::Absorber']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.03)
-#     kwargs.setdefault("PositronCut", 0.03)
-#     kwargs.setdefault("GammaCut",    0.03)
-#     return RegionCreator(name, **kwargs)
-
-# def PreSampLArPhysicsRegionToolCfg(ConfigFlags, name='PreSampLArPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'PreSampLAr')
-#     volumeList = ['LArMgr::LAr::Endcap::Presampler::LiquidArgon']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     return RegionCreator(name, **kwargs)
-
-# def DeadMaterialPhysicsRegionToolCfg(ConfigFlags, name='DeadMaterialPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'DeadMaterial')
-#     volumeList = []
-#     sectionList = range(16,49) # does not include 49
-#     sectionList += [ 51, 52, 53, 54 ]
-#     for section in sectionList:
-#         volumeList += ['BeamPipe::SectionF'+str(section)]
-#     volumeList += ['LArMgr::LAr::Endcap::Cryostat::Cylinder',
-#                    'LArMgr::LAr::Endcap::Cryostat::Cylinder::Mixed',
-#                    'LArMgr::LAr::Endcap::Cryostat::Cone::Mixed',
-#                    'LArMgr::LAr::Endcap::Cryostat::Cone',
-#                    'DiskShieldingPlugs', 'ToroidShieldingInnerPlugs',
-#                    'ForwardShieldingMainCylinder']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 1.0)
-#     kwargs.setdefault("PositronCut", 1.0)
-#     kwargs.setdefault("GammaCut",    1.0)
-#     return RegionCreator(name, **kwargs)
-
-# #Muon Regions
-# def DriftWallPhysicsRegionToolCfg(ConfigFlags, name='DriftWallPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'DriftWall')
-#     volumeList = ['Muon::MDTDriftWall']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.05)
-#     kwargs.setdefault("PositronCut", 0.05)
-#     return RegionCreator(name, **kwargs)
-
-# def DriftWall1PhysicsRegionToolCfg(ConfigFlags, name='DriftWall1PhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'DriftWall1')
-#     volumeList = ['Muon::Endplug']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 1.0)
-#     kwargs.setdefault("PositronCut", 1.0)
-#     return RegionCreator(name, **kwargs)
-
-# def DriftWall2PhysicsRegionToolCfg(ConfigFlags, name='DriftWall2PhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'DriftWall2')
-#     volumeList = ['Muon::SensitiveGas']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 1.0)
-#     kwargs.setdefault("PositronCut", 1.0)
-#     return RegionCreator(name, **kwargs)
-
-# def MuonSystemFastPhysicsRegionToolCfg(ConfigFlags, name='MuonSystemFastPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'MuonSystemFastRegion')
-#     volumeList = []
-#     if ConfigFlags.Sim.CavernBG  == 'World':
-#         volumeList += ['BeamPipe::BeamPipe', 'IDET::IDET']
-#     volumeList = ['Muon::MuonSys']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 1.0)
-#     kwargs.setdefault("PositronCut", 1.0)
-#     return RegionCreator(name, **kwargs)
-
-# def MuonPhysicsRegionToolCfg(ConfigFlags, name="MuonPhysicsRegionTool", **kwargs):
-#     kwargs.setdefault("RegionName", 'MuonSys')
-#     volumeList = ['Muon::MuonSys']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 0.1)
-#     kwargs.setdefault("PositronCut", 0.1)
-#     kwargs.setdefault("GammaCut",    0.1)
-#     return RegionCreator(name, **kwargs)
-
-# # Cavern Regions
-# def SX1PhysicsRegionToolCfg(ConfigFlags, name='SX1PhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'SX1')
-#     volumeList = ['CavernInfra::SX1Air']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 2000.)
-#     kwargs.setdefault("PositronCut", 2000.)
-#     kwargs.setdefault("GammaCut",    2000.)
-#     return RegionCreator(name, **kwargs)
-
-# def BedrockPhysicsRegionToolCfg(ConfigFlags, name='BedrockPhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'BEDROCK')
-#     volumeList = ['CavernInfra::BEDROCK']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 1000000.)
-#     kwargs.setdefault("PositronCut", 1000000.)
-#     kwargs.setdefault("GammaCut",    1000000.)
-#     return RegionCreator(name, **kwargs)
-
-# def CavernShaftsConcretePhysicsRegionToolCfg(ConfigFlags, name='CavernShaftsConcretePhysicsRegionTool', **kwargs):
-#     kwargs.setdefault("RegionName", 'CAV_SHAFTS_CONC')
-#     volumeList = ['CavernInfra::CAV_SHAFTS_CONC']
-#     kwargs.setdefault("VolumeList",  volumeList)
-#     kwargs.setdefault("ElectronCut", 150.)
-#     kwargs.setdefault("PositronCut", 150.)
-#     kwargs.setdefault("GammaCut",    150.)
-#     return RegionCreator(name, **kwargs)
-
-##def getCavernShaftsAirPhysicsRegionTool(name='CavernShaftsAirPhysicsRegionTool', **kwargs):
-##    kwargs.setdefault("RegionName", 'CAV_SHAFTS_AIR')
-##    volumeList = ['CavernInfra::CAV_SHAFTS_AIR']
-##    kwargs.setdefault("VolumeList",  volumeList)
-##    kwargs.setdefault("ElectronCut", 2000.)
-##    kwargs.setdefault("PositronCut", 2000.)
-##    kwargs.setdefault("GammaCut",    2000.)
-##    return CfgMgr.RegionCreator(name, **kwargs)
diff --git a/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesConfigNew.py b/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesConfigNew.py
index 6f7478c462fb631db72596e8d3ee9d0a220e3418..7260d59fc1e6df1b327196817f8a44c865d72a16 100644
--- a/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesConfigNew.py
+++ b/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesConfigNew.py
@@ -10,30 +10,10 @@ from AthenaConfiguration.ComponentFactory import CompFactory
 
 from BarcodeServices.BarcodeServicesConfigNew import MC15aPlusBarcodeSvcCfg
 from ISF_HepMC_Tools.ISF_HepMC_ToolsConfigNew import ParticleFinalStateFilterCfg, GenParticleInteractingFilterCfg
-#from FaserISF_HepMC_Tools.FaserISF_HepMC_ToolsConfigNew import FaserParticlePositionFilterCfg, FaserParticleGenericFilterCfg
 from FaserISF_HepMC_Tools.FaserISF_HepMC_ToolsConfigNew import FaserTruthStrategyCfg, FaserDipoleTruthStrategyCfg
 
-# from ISF_HepMC_Tools.ISF_HepMC_ToolsConfigNew import TruthStrategyGroupID_MC15Cfg, TruthStrategyGroupCaloMuBremCfg, TruthStrategyGroupCaloDecay_MC15Cfg, TruthStrategyGroupIDHadInt_MC15Cfg, ParticleFinalStateFilterCfg, ParticlePositionFilterDynamicCfg, EtaPhiFilterCfg, GenParticleInteractingFilterCfg
-# from SubDetectorEnvelopes.SubDetectorEnvelopesConfigNew import EnvelopeDefSvcCfg
-
-
 ISF__FaserTruthSvc, ISF__FaserGeoIDSvc, ISF__FaserInputConverter = CompFactory.getComps("ISF::FaserTruthSvc","ISF::FaserGeoIDSvc","ISF::FaserInputConverter")
 
-#Functions yet to be migrated:
-#getParticleBrokerSvcNoOrdering, getParticleBrokerSvc, getAFIIParticleBrokerSvc, getAFIIEnvelopeDefSvc, getAFIIGeoIDSvc
-#getLongLivedInputConverter, getValidationTruthService, getMC12BeamPipeTruthStrategies, getMC12IDTruthStrategies
-#getMC12CaloTruthStrategies, getMC12MSTruthStrategies, getMC12TruthService, getTruthService, getMC12LLPTruthService, getMC12PlusTruthService,  getMC15IDTruthStrategies
-#getMC15CaloTruthStrategies
-
-
-def FaserGeoIDSvcCfg(ConfigFlags, name="ISF_FaserGeoIDSvc", **kwargs):
-    result = ComponentAccumulator()
-
-    result.addService(ISF__FaserGeoIDSvc(name, **kwargs))
-
-    return result
-
-
 def GenParticleFiltersToolCfg(ConfigFlags):
     result = ComponentAccumulator()
 
@@ -110,39 +90,3 @@ def FaserTruthServiceCfg(ConfigFlags, name="FaserISF_TruthService", **kwargs):
 
     result.addService(ISF__FaserTruthSvc(name, **kwargs))
     return result
-
-
-# def MC15TruthServiceCfg(ConfigFlags, name="ISF_MC15TruthService", **kwargs):
-#     result = ComponentAccumulator()
-#     # importing Reflex dictionary to access AtlasDetDescr::AtlasRegion enum
-#     import ROOT, cppyy
-#     cppyy.loadDictionary('AtlasDetDescrDict')
-#     AtlasRegion = ROOT.AtlasDetDescr
-
-#     acc1 = TruthStrategyGroupID_MC15Cfg(ConfigFlags)
-#     acc2 = TruthStrategyGroupIDHadInt_MC15Cfg(ConfigFlags)
-#     acc3 = TruthStrategyGroupCaloMuBremCfg(ConfigFlags)
-#     acc4 = TruthStrategyGroupCaloDecay_MC15Cfg(ConfigFlags)
-
-#     kwargs.setdefault('TruthStrategies', [result.popToolsAndMerge(acc1),
-#                                           result.popToolsAndMerge(acc2),
-#                                           result.popToolsAndMerge(acc3), #FIXME this should be ISF_MCTruthStrategyGroupCaloMuBrem_MC15!!
-#                                           result.popToolsAndMerge(acc4)])
-
-
-#     kwargs.setdefault('IgnoreUndefinedBarcodes', False)
-#     kwargs.setdefault('PassWholeVertices', False) # new for MC15 - can write out partial vertices.
-#     kwargs.setdefault('ForceEndVtxInRegions', [AtlasRegion.fAtlasID])
-#     accTruthService = GenericTruthServiceCfg(ConfigFlags, name, **kwargs)
-#     result.merge(accTruthService)
-#     return result
-
-
-# def MC15aPlusTruthServiceCfg(ConfigFlags, name="ISF_MC15aPlusTruthService", **kwargs):
-#     # importing Reflex dictionary to access AtlasDetDescr::AtlasRegion enum
-#     import ROOT, cppyy
-#     cppyy.loadDictionary('AtlasDetDescrDict')
-#     AtlasRegion = ROOT.AtlasDetDescr
-#     kwargs.setdefault('ForceEndVtxInRegions', [AtlasRegion.fAtlasID])
-#     result = MC15TruthServiceCfg(ConfigFlags, name, **kwargs)
-#     return result
diff --git a/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesCoreConfigNew.py b/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesCoreConfigNew.py
new file mode 100644
index 0000000000000000000000000000000000000000..569a51177d8144a328ffce9415bd6a7f5773b97f
--- /dev/null
+++ b/Simulation/ISF/ISF_Core/FaserISF_Services/python/FaserISF_ServicesCoreConfigNew.py
@@ -0,0 +1,9 @@
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+def FaserGeoIDSvcCfg(ConfigFlags, name="ISF_FaserGeoIDSvc", **kwargs):
+    result = ComponentAccumulator()
+
+    result.addService(CompFactory.ISF.FaserGeoIDSvc(name, **kwargs))
+
+    return result
diff --git a/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/src/FaserISFG4GeoHelper.cxx b/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/src/FaserISFG4GeoHelper.cxx
index 5dd4fa5d5b746700b47f384b058d2ae9af7955c3..6697607742a1a4cb0cdebf08aa138ba1fca4ba6c 100644
--- a/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/src/FaserISFG4GeoHelper.cxx
+++ b/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/src/FaserISFG4GeoHelper.cxx
@@ -139,7 +139,7 @@ bool iGeant4::FaserISFG4GeoHelper::checkVolumeDepth(G4LogicalVolume* lv, int vol
   } // Check of volume name
 
   // Going through the volume depth
-  for (int i=0; i<lv->GetNoDaughters(); ++i) {
+  for (size_t i=0; i<lv->GetNoDaughters(); ++i) {
     Cavern = Cavern || checkVolumeDepth( lv->GetDaughter(i)->GetLogicalVolume() , volLevel , depth+1 );
   }
   if (depth==0 && !Cavern && volLevel>1) {
diff --git a/Simulation/README.md b/Simulation/README.md
index 350d7ab9beb3eb94d7683c94d210d2e11d1fa90c..4b9556c73de0e240dc4c14d3d407712fc24ed20a 100644
--- a/Simulation/README.md
+++ b/Simulation/README.md
@@ -1,15 +1,14 @@
 To generate Calypso MC data from an installation (run) directory:
 
-1) edit the G4FaserAlg/test/runG4.py file to setup the job
+1) edit the G4FaserAlg/test/G4FaserAlgConfigNew_Test.py file to setup the job
 ....the default generator is particle-gun; it can also read EVNT files but note that the Veto is far away from (0,0,0) where most ATLAS generators put things by default
+....there are examples of single-particle (muon or electron), cosmic-rays and decay-in-flight.  The parameters of each can be changed by passing keyword arguments
 ....read the comments carefully as a few other things have to be changed in the job options to switch between internal generator and generator data-file
+....the geometry can be changed on the command line, using the GeoModel.FaserVersion flag and IOVDb.GlobalTag flags.  See the tests in the CMakeLists.txt file for examples
 
 2) source ./setup.sh
-3) runG4.py
+3) G4FaserAlgConfigNew_Test.py
 
 (setup.sh will put the script in your path)
 
-To generate events with the emulsion detector, use
-
-3a) runG4FaserNu.py
 
diff --git a/Tracker/TrackerDetDescr/DipoleGeoModel/src/DipoleTool.cxx b/Tracker/TrackerDetDescr/DipoleGeoModel/src/DipoleTool.cxx
index 535c63ef409ada5cac9b9ca7a49982d802c1afde..138deee6639c1248aae0dc2cb02fa946b0fa233a 100644
--- a/Tracker/TrackerDetDescr/DipoleGeoModel/src/DipoleTool.cxx
+++ b/Tracker/TrackerDetDescr/DipoleGeoModel/src/DipoleTool.cxx
@@ -83,7 +83,6 @@ StatusCode DipoleTool::create()
   }  
   
   std::string versionTag = m_rdbAccessSvc->getChildTag("Dipole", versionKey.tag(), versionKey.node(), "FASERDD");
-  msg(MSG::INFO) << "Dipole Package Version: " << PACKAGE_VERSION << endmsg;
   if(msgLvl(MSG::DEBUG)) msg() << "versionTag=" << versionTag <<" %%%"<< endmsg;
 
   // If versionTag is NULL then don't build.
diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx
index 91958660cb9e1a8d697e7a59f6825f0539df7a14..456afc4ee1b9199a3ec62aac9a03b82a8b705d8d 100644
--- a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx
+++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx
@@ -63,7 +63,7 @@ FaserSCT_DetectorTool::create()
   ATH_CHECK(m_rdbAccessSvc.retrieve());
   // Print the SCT version tag:
   std::string sctVersionTag{m_rdbAccessSvc->getChildTag("SCT", versionKey.tag(), versionKey.node(),"FASERDD")};
-  ATH_MSG_INFO("SCT Version: " << sctVersionTag <<  "  Package Version: " << PACKAGE_VERSION);
+  ATH_MSG_INFO("SCT Version: " << sctVersionTag);
   // Check if version is empty. If so, then the SCT cannot be built. This may or may not be intentional. We
   // just issue an INFO message. 
   if (sctVersionTag.empty()) {
@@ -163,7 +163,7 @@ FaserSCT_DetectorTool::clear()
 StatusCode 
 FaserSCT_DetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE ()
 {
-  StatusCode sc{StatusCode::FAILURE, true};
+  StatusCode sc{StatusCode::FAILURE};
   if (m_alignable.value()) {
     if (m_useDynamicAlignFolders.value()) {
       ATH_MSG_FATAL("Dynamic alignment not supported.");
diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h
index ebb1b3151a2f4e96652b2b2598e66ccf8ffe1ba3..89fa0e161a3f73b06d54c5630dd7ac763b41bc69 100644
--- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h
+++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h
@@ -162,10 +162,10 @@ namespace TrackerDD {
     //@{
     
     /// identifier of this detector element (inline)
-    Identifier identify() const;
+    virtual Identifier identify() const override final;
     
     /// identifier hash (inline)
-    IdentifierHash identifyHash() const;
+    virtual IdentifierHash identifyHash() const override final;
     
     /// Returns the id helper (inline)
     const FaserDetectorID* getIdHelper() const;
@@ -201,20 +201,38 @@ namespace TrackerDD {
     /// @name Transformation/Orientation
     //
     ///////////////////////////////////////////////////////////////////
+    /**
+     * Element Surface
+     */
+    Trk::Surface& surface();
+    virtual const Trk::Surface& surface() const override final;
+    /**
+     * TrkDetElementBase interface (inline)
+     */
+    virtual const Trk::Surface& surface(const Identifier&) const override final;
     
     //@{
     // Position 
     /// Local (simulation/hit frame) to global transform
     virtual const GeoTrf::Transform3D& transformHit() const;
     /// Local (reconstruction frame) to global transform
-    const Amg::Transform3D& transform() const;
+    virtual const Amg::Transform3D& transform() const override final;
+    /**
+     * TrkDetElementBase interface (inline)
+     */
+    virtual const Amg::Transform3D& transform(const Identifier&) const override final;
+
     /// Default Local (reconstruction frame) to global transform
     /// ie with no misalignment. 
     const HepGeom::Transform3D defTransformCLHEP() const;
     const Amg::Transform3D defTransform() const;
     /// Center in global coordinates
-    const Amg::Vector3D& center() const;
-    
+    virtual const Amg::Vector3D& center() const override final;
+    /**
+     * TrkDetElementBase interface (inline)
+     */
+    virtual const Amg::Vector3D& center(const Identifier&) const override final;
+
     const HepGeom::Transform3D& transformCLHEP() const;
     
     /// Simulation/Hit local frame to reconstruction local frame. 2D.
@@ -254,8 +272,14 @@ namespace TrackerDD {
     /// In direction of increasing z in the barrel and increasing r in the endcap. 
     const Amg::Vector3D& etaAxis() const;
     const HepGeom::Vector3D<double>& etaAxisCLHEP() const;
-    /// Get reconstruction local normal axes in global frame. Choosen to give right-handed coordinate frame.
-    const Amg::Vector3D& normal() const;
+    /**
+     * Get reconstruction local normal axes in global frame. Choosen to give right-handed coordinate frame.
+     */
+    virtual const Amg::Vector3D& normal() const override final;
+    /**
+     * TrkDetElementBase interface (inline)
+     */
+    virtual const Amg::Vector3D& normal(const Identifier&) const override final;
      
     /// transform a hit local position into a global position (inline):
     HepGeom::Point3D<double> globalPositionHit(const HepGeom::Point3D<double>& simulationLocalPos) const;
@@ -298,8 +322,8 @@ namespace TrackerDD {
     double sinStereoLocal(const HepGeom::Point3D<double>& globalPos) const;
     
     /// Element Surface
-    virtual Trk::Surface& surface();
-    virtual const Trk::Surface& surface() const;
+    // virtual Trk::Surface& surface();
+    // virtual const Trk::Surface& surface() const;
     
     //@}
 
@@ -396,7 +420,11 @@ namespace TrackerDD {
     TrackerDD::CarrierType carrierType() const; // carrier type for readout. ie holes for SCT 
     // and electrons for pixels.
 
-    virtual const Trk::SurfaceBounds& bounds() const;
+    virtual const Trk::SurfaceBounds& bounds() const override final;
+    /**
+     * TrkDetElementBase interface (inline)
+     */
+    virtual const Trk::SurfaceBounds& bounds(const Identifier&) const override final;
     
     // Pitch 
     //
@@ -527,11 +555,11 @@ namespace TrackerDD {
     //
     ///////////////////////////////////////////////////////////////////
     //{@
-    virtual const Amg::Transform3D& transform(const Identifier&) const;
-    virtual const Trk::Surface& surface(const Identifier&) const;
-    virtual const Amg::Vector3D& center(const Identifier&) const;
-    virtual const Amg::Vector3D& normal(const Identifier&) const;
-    virtual const Trk::SurfaceBounds& bounds(const Identifier&) const;
+    // virtual const Amg::Transform3D& transform(const Identifier&) const;
+    // virtual const Trk::Surface& surface(const Identifier&) const;
+    // virtual const Amg::Vector3D& center(const Identifier&) const;
+    // virtual const Amg::Vector3D& normal(const Identifier&) const;
+    // virtual const Trk::SurfaceBounds& bounds(const Identifier&) const;
     //@}
     
     //////////////////////////////////////////////////////////////////////////////////////
@@ -553,7 +581,11 @@ namespace TrackerDD {
     //@}
 
     const SiCommonItems* getCommonItems() const;
-    
+
+    /** TrkDetElementBase interface detectorType
+     */
+     virtual Trk::DetectorElemType detectorType() const override final;
+
     ///////////////////////////////////////////////////////////////////
     // Private methods:
     ///////////////////////////////////////////////////////////////////
diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc
index 5936a08d41b3bb58c0da56e42bcea1de5542dbad..33bd220bf0f135f9180b28f6e99c256bddb37e3f 100644
--- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc
+++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc
@@ -11,7 +11,11 @@ namespace TrackerDD {
   ///////////////////////////////////////////////////////////////////
   // Inline methods:
   ///////////////////////////////////////////////////////////////////
-    
+
+  inline Trk::DetectorElemType SiDetectorElement::detectorType() const{
+    return Trk::DetectorElemType::Silicon;
+  }
+
   inline Identifier SiDetectorElement::identify() const
   {
     return m_id;
diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerPrepRawData/FaserSCT_ClusterCnv_p3.cxx b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerPrepRawData/FaserSCT_ClusterCnv_p3.cxx
index 038542e50285a76e1a41fb77156b465bd96b4bb9..22879d7c4979c1254d49d6fc296a58b2ff2cccd6 100644
--- a/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerPrepRawData/FaserSCT_ClusterCnv_p3.cxx
+++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/src/TrackerPrepRawData/FaserSCT_ClusterCnv_p3.cxx
@@ -49,11 +49,11 @@ FaserSCT_ClusterCnv_p3::createSCT_Cluster (const Tracker::FaserSCT_Cluster_p3* p
   m_swCnv.persToTrans(&persObj->m_width, &sw, log);
 
   // Error matrix
-  auto cmat = std::make_unique<Amg::MatrixX>(2,2);
-  (*cmat)(0,0) = static_cast<double>(persObj->m_mat00);
-  (*cmat)(1,0) = static_cast<double>(persObj->m_mat01);
-  (*cmat)(0,1) = static_cast<double>(persObj->m_mat01);
-  (*cmat)(1,1) = static_cast<double>(persObj->m_mat11);
+  auto cmat = Amg::MatrixX(2,2);
+  (cmat)(0,0) = static_cast<double>(persObj->m_mat00);
+  (cmat)(1,0) = static_cast<double>(persObj->m_mat01);
+  (cmat)(0,1) = static_cast<double>(persObj->m_mat01);
+  (cmat)(1,1) = static_cast<double>(persObj->m_mat11);
 
   Tracker::FaserSCT_Cluster clus (clusId,
                            localPos,
diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
index ab88bf504ec140e847eaed5e39eee664943ad164..6e955b6a250599eaaf33d12baf0e55369803fd39 100644
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
@@ -378,12 +378,13 @@ ClusterFitAlg::AddTrack(std::unique_ptr<TrackCollection>& tracks,
     s->push_back( GetState(fitResult, fitCovariance, nullptr, station) );
 
     for (const clusterInfo* cInfo : fitClusters)
-      {
-	s->push_back( GetState(fitResult, fitCovariance, cInfo->cluster, station) );
-      }
+    {
+	      s->push_back( GetState(fitResult, fitCovariance, cInfo->cluster, station) );
+    }
 
     // Create and store track
-    tracks->push_back(new Trk::Track(i, s , q));
+    std::unique_ptr<DataVector<const Trk::TrackStateOnSurface>> sink(s);
+    tracks->push_back(new Trk::Track(i, std::move(*sink) , q));
     return StatusCode::SUCCESS;
 }
 
@@ -422,7 +423,7 @@ ClusterFitAlg::GetState( const Eigen::Matrix< double, 4, 1 >& fitResult,
                                            fitCluster->localCovariance(), 
                                            m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())};
     }
-    std::unique_ptr<Trk::TrackParameters> p { new Trk::CurvilinearParameters { pos, phi, theta, qoverp, covPar5.release() } };
+    std::unique_ptr<Trk::TrackParameters> p { new Trk::CurvilinearParameters { pos, phi, theta, qoverp, *(covPar5.release()) } };
     return new Trk::TrackStateOnSurface { rot, p.release() };
 }
 
diff --git a/Tracker/TrackerRecAlgs/TrackerSeedFinder/src/TrackerSeedFinder.cxx b/Tracker/TrackerRecAlgs/TrackerSeedFinder/src/TrackerSeedFinder.cxx
index f8aef6daed4a6d9af723ccd7ef7c4fc573c28c6c..53ffec6a238914461c8780138a4f36704c36f49c 100755
--- a/Tracker/TrackerRecAlgs/TrackerSeedFinder/src/TrackerSeedFinder.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerSeedFinder/src/TrackerSeedFinder.cxx
@@ -138,7 +138,7 @@ namespace Tracker
     CHECK(m_thistSvc->regHist("/TrackerSeedFinder/sp/sp_dx_intercept_after",m_hist_dx_intercept_after));
     CHECK(m_thistSvc->regHist("/TrackerSeedFinder/sp/sp_line",m_hist_line));
 
-    ATH_MSG_INFO( "TrackerSeedFinder::initialized for package version " << PACKAGE_VERSION );
+    ATH_MSG_INFO( "TrackerSeedFinder::initialized" );
     return StatusCode::SUCCESS;
   }
 
diff --git a/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/StatisticsAlg.cxx b/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/StatisticsAlg.cxx
index bf8b17d4fc16103c45cb0256bd3d7c644a3afc9e..5589297e584762c57a6450790c2a6d65a170a50e 100755
--- a/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/StatisticsAlg.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/StatisticsAlg.cxx
@@ -114,7 +114,7 @@ StatusCode StatisticsAlg::initialize()
   CHECK(m_thistSvc->regHist("/StatisticsAlg/sp/sp_x_y_plane6",m_hist_x_y_plane6));
   CHECK(m_thistSvc->regHist("/StatisticsAlg/sp/sp_x_y_plane7",m_hist_x_y_plane7));
   CHECK(m_thistSvc->regHist("/StatisticsAlg/sp/sp_x_y_plane8",m_hist_x_y_plane8));
-  ATH_MSG_INFO( "StatisticsAlg::initialized for package version " << PACKAGE_VERSION );
+  ATH_MSG_INFO( "StatisticsAlg::initialized" );
   return StatusCode::SUCCESS;
 }
 
diff --git a/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/TrackerSpacePointFinder.cxx b/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/TrackerSpacePointFinder.cxx
index 5c9940aeaa3cef28e0631d9d6a6480c54f473b57..62f63d8db08a27d9c04a347347954e07e4ee8968 100755
--- a/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/TrackerSpacePointFinder.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/src/TrackerSpacePointFinder.cxx
@@ -95,7 +95,7 @@ StatusCode TrackerSpacePointFinder::initialize()
 
   if (!m_monTool.empty()) CHECK(m_monTool.retrieve());
 
-  ATH_MSG_INFO( "Initialized for package version " << PACKAGE_VERSION );
+  ATH_MSG_INFO( "Initialized" );
   return StatusCode::SUCCESS;
 }
 
diff --git a/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.cxx b/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.cxx
index 90228db2ef2cf233968ae6a481df1e64858b5214..1094424fb0cbd11f0a9618aedbd2813bfca4ded8 100755
--- a/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.cxx
+++ b/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.cxx
@@ -180,7 +180,7 @@ namespace Tracker
     CHECK(m_thistSvc->regHist("/TruthTrackSeeds/sp/InitReso_py",m_hist_InitReso_py));
     CHECK(m_thistSvc->regHist("/TruthTrackSeeds/sp/InitReso_pz",m_hist_InitReso_pz));
 	//!!!!!!!!!!!!!!!!!!!!
-    ATH_MSG_INFO( "TruthTrackSeeds::initialized for package version " << PACKAGE_VERSION );
+    ATH_MSG_INFO( "TruthTrackSeeds::initialized" );
     return StatusCode::SUCCESS;
   }
 
diff --git a/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.h b/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.h
index 1e91539955a063585de8b823a30a5d28081acee4..bb09dfc937b252c2e4af9e4d8dd8e5e49e24358d 100755
--- a/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.h
+++ b/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/src/TruthSeededTrackFinder.h
@@ -69,7 +69,7 @@ class TruthSeededTrackFinder:public AthReentrantAlgorithm {
 
     SG::ReadCondHandleKey<TrackerDD::SiDetectorElementCollection> m_SCTDetEleCollKey{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"};
 
-    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "GEN_EVENT" };
+    SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "BeamTruthEvent" };
     SG::ReadHandleKey<FaserSiHitCollection> m_faserSiHitKey { this, "FaserSiHitCollection", "SCT_Hits" };
     SG::ReadHandleKey<FaserSCT_RDO_Container> m_faserRdoKey { this, "FaserSCT_RDO_Container", "SCT_RDOs"};
     SG::ReadHandleKey<TrackerSimDataCollection> m_sctMap {this, "TrackerSimDataCollection", "SCT_SDO_Map"};
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/FaserSCT_Cluster.h b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/FaserSCT_Cluster.h
index 109d093c41099fee1a164c9dc38580fb9e2d292d..71412ba7aaa7bb44c863b1fb75ff92b50233bd13 100755
--- a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/FaserSCT_Cluster.h
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/FaserSCT_Cluster.h
@@ -44,18 +44,16 @@ class FaserSCT_Cluster : public TrackerCluster {
                 const std::vector<Identifier>& rdoList,
                 const FaserSiWidth& width,
                 const TrackerDD::SiDetectorElement* detEl,
-                const Amg::MatrixX* locErrMat
+                const Amg::MatrixX& locErrMat
               );
 
   // For use by tp converter.
-  FaserSCT_Cluster( 
-                const Identifier& RDOId,
-                const Amg::Vector2D& locpos, 
-                std::vector<Identifier>&& rdoList,
-                const FaserSiWidth& width,
-                const TrackerDD::SiDetectorElement* detEl,
-                std::unique_ptr<const Amg::MatrixX> locErrMat
-              );
+  FaserSCT_Cluster(const Identifier& RDOId,
+              const Amg::Vector2D& locpos,
+              std::vector<Identifier>&& rdoList,
+              const FaserSiWidth& width,
+              const TrackerDD::SiDetectorElement* detEl,
+              Amg::MatrixX&& locErrMat);
 
     /** dump information about the PRD object. */
     virtual MsgStream&    dump( MsgStream&    stream) const;
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h
index 75f3a09f89b70743cd00a5fe620d27ef99866607..79e3bf3031f8c08f34aca8dfd946b15219c850e1 100755
--- a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h
@@ -19,7 +19,6 @@
 // Base class
 #include "TrkPrepRawData/PrepRawData.h"
 
-#include "CxxUtils/CachedUniquePtr.h"
 #include "Identifier/Identifier.h"
 #include "TrackerPrepRawData/FaserSiWidth.h"
 #include "TrackerReadoutGeometry/SiDetectorElement.h" // cant be forward declared
@@ -51,34 +50,63 @@ namespace Tracker
 		public:
 		
 		/** Public, Copy, operator=, constructor*/
-		TrackerCluster();
-		TrackerCluster(const TrackerCluster &);
-		TrackerCluster(TrackerCluster &&);
-		TrackerCluster &operator=(const TrackerCluster &);
-		TrackerCluster &operator=(TrackerCluster &&);
+		TrackerCluster() = default;
+		TrackerCluster(const TrackerCluster &) = default;
+		TrackerCluster(TrackerCluster &&) = default;
+		TrackerCluster &operator=(const TrackerCluster &) = default;
+		TrackerCluster &operator=(TrackerCluster &&) = default;
 		
-			/** Only constructor for TrackerCluster.
-				Last datamember might not be always filled and will be 0 by default.
-				The others including SiDetectorElement have to be given!
-			*/
-
-			TrackerCluster( 
-					const Identifier& RDOId,
-					const Amg::Vector2D& locpos, 
+		/**
+		 * Constructor with parameters using ref or omitting  Amg::MatrixX.
+		 * If omitted we have any empty one.
+		 */
+		TrackerCluster(const Identifier& RDOId,
+					const Amg::Vector2D& locpos,
 					const std::vector<Identifier>& rdoList,
 					const FaserSiWidth& width,
 					const TrackerDD::SiDetectorElement* detEl,
-					const Amg::MatrixX* locErrMat = 0
-					);
+					const Amg::MatrixX& locErrMat);
 
-			TrackerCluster( 
-					const Identifier& RDOId,
-					const Amg::Vector2D& locpos, 
+		TrackerCluster(const Identifier& RDOId,
+					const Amg::Vector2D& locpos,
+					const std::vector<Identifier>& rdoList,
+					const FaserSiWidth& width,
+					const TrackerDD::SiDetectorElement* detEl);
+
+		TrackerCluster(const Identifier& RDOId,
+					const Amg::Vector2D& locpos,
+					const Amg::Vector3D& globpos,
+					const std::vector<Identifier>& rdoList,
+					const FaserSiWidth& width,
+					const TrackerDD::SiDetectorElement* detEl,
+					const Amg::MatrixX& locErrMat);
+
+		TrackerCluster(const Identifier& RDOId,
+					const Amg::Vector2D& locpos,
+					const Amg::Vector3D& globpos,
+					const std::vector<Identifier>& rdoList,
+					const FaserSiWidth& width,
+					const TrackerDD::SiDetectorElement* detEl);
+
+		/**
+		 * Constructor with parameters using r-value reference of Amg::MatrixX.
+		 * All parameters have to be given!
+		 */
+		TrackerCluster(const Identifier& RDOId,
+					const Amg::Vector2D& locpos,
 					std::vector<Identifier>&& rdoList,
 					const FaserSiWidth& width,
 					const TrackerDD::SiDetectorElement* detEl,
-					std::unique_ptr<const Amg::MatrixX> locErrMat
-					);
+					Amg::MatrixX&& locErrMat);
+
+		TrackerCluster(const Identifier& RDOId,
+					const Amg::Vector2D& locpos,
+					const Amg::Vector3D& globpos,
+					std::vector<Identifier>&& rdoList,
+					const FaserSiWidth& width,
+					const TrackerDD::SiDetectorElement* detEl,
+					Amg::MatrixX&& locErrMat);
+
 
 			// Destructor:
 		virtual ~TrackerCluster();
@@ -95,20 +123,25 @@ namespace Tracker
 		
 		/** return the detector element corresponding to this PRD
 		The pointer will be zero if the det el is not defined (i.e. it was not passed in by the ctor)*/
-		virtual const TrackerDD::SiDetectorElement* detectorElement() const override;
+		virtual const TrackerDD::SiDetectorElement* detectorElement() const override final;
 
 		/** Interface method checking the type*/
-		virtual bool type(Trk::PrepRawDataType::Type type) const final;
+		virtual bool type(Trk::PrepRawDataType type) const override final;
 
 		/** dump information about the SiCluster*/
 		virtual MsgStream&    dump( MsgStream&    stream) const override;
 		/** dump information about the SiCluster*/
 		virtual std::ostream& dump( std::ostream& stream) const override;
 
+		/// Set the m_detEl and calculate globalPostion
+		//used by TPCnv converters
+		void setDetectorElement(const TrackerDD::SiDetectorElement* detEl);
+
 		private:
+	    Amg::Vector3D m_globalPosition = Amg::Vector3D::Zero();
+  		/// col, row, and width in mm
 		FaserSiWidth m_width; //col, row, and width in mm
-		CxxUtils::CachedUniquePtr<const Amg::Vector3D> m_globalPosition;
-		const TrackerDD::SiDetectorElement* m_detEl;
+		const TrackerDD::SiDetectorElement* m_detEl = nullptr;
 
 		// Identifier m_clusId; 
 		// /**see derived classes for definition of meaning of LocalPosition*/
@@ -128,32 +161,6 @@ namespace Tracker
 	MsgStream&    operator << (MsgStream& stream,    const TrackerCluster& prd);
 	std::ostream& operator << (std::ostream& stream, const TrackerCluster& prd);
 
-	///////////////////////////////////////////////////////////////////
-	// Inline methods:
-	///////////////////////////////////////////////////////////////////
-
-	// return width:
-	inline const FaserSiWidth&  TrackerCluster::width() const
-	{
-		return m_width;
-	}
-	// return globalPosition:
-	inline const Amg::Vector3D& TrackerCluster::globalPosition() const
-	{
-	if (not m_globalPosition) {
-		m_globalPosition.set(std::unique_ptr<const Amg::Vector3D>(m_detEl->surface(identify()).localToGlobal(localPosition())));
-	}
-	return *m_globalPosition;
-	}
-
-	inline const TrackerDD::SiDetectorElement* TrackerCluster::detectorElement() const
-	{
-		return m_detEl;
-	}
-
-	inline bool TrackerCluster::type(Trk::PrepRawDataType::Type type) const
-	{
-  		return type == Trk::PrepRawDataType::SiCluster;
-	}
 }
+#include "TrackerCluster.icc"
 #endif // TRACKERPREPRAWDATA_TRACKERCLUSTER_H
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.icc b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.icc
new file mode 100644
index 0000000000000000000000000000000000000000..cf9a189464cfdb759ec9eb1441c84317c1750eac
--- /dev/null
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.icc
@@ -0,0 +1,36 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+namespace Tracker
+{
+	// return width:
+	inline const FaserSiWidth&  TrackerCluster::width() const
+	{
+		return m_width;
+	}
+	// return globalPosition:
+	inline const Amg::Vector3D& TrackerCluster::globalPosition() const
+	{
+	return m_globalPosition;
+	}
+
+	inline const TrackerDD::SiDetectorElement* TrackerCluster::detectorElement() const
+	{
+		return m_detEl;
+	}
+
+	inline bool TrackerCluster::type(Trk::PrepRawDataType type) const
+	{
+  		return type == Trk::PrepRawDataType::SiCluster;
+	}
+    inline void
+    TrackerCluster::setDetectorElement(const TrackerDD::SiDetectorElement* detEl)
+    {
+        m_detEl = detEl;
+        if (m_detEl) {
+            m_globalPosition =
+            m_detEl->surface(identify()).localToGlobal(localPosition());
+        }
+    }
+}
\ No newline at end of file
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/src/FaserSCT_Cluster.cxx b/Tracker/TrackerRecEvent/TrackerPrepRawData/src/FaserSCT_Cluster.cxx
index 7c4b9f474e9166376c117be1b83d1386c69e4b60..8675b0129c7b9c5f7b68eb158f7e51dddd107faf 100755
--- a/Tracker/TrackerRecEvent/TrackerPrepRawData/src/FaserSCT_Cluster.cxx
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/src/FaserSCT_Cluster.cxx
@@ -21,25 +21,27 @@ FaserSCT_Cluster::FaserSCT_Cluster(
     const std::vector<Identifier>& rdoList,
     const FaserSiWidth& width,
     const TrackerDD::SiDetectorElement* detEl,
-    const Amg::MatrixX* locErrMat
+    const Amg::MatrixX& locErrMat
     ) : TrackerCluster(RDOId, locpos, rdoList, width, detEl, locErrMat) 
 {
   m_hitsInThirdTimeBin=0;
 }
 
-FaserSCT_Cluster::FaserSCT_Cluster( 
-    const Identifier& RDOId,
-    const Amg::Vector2D& locpos, 
-    std::vector<Identifier>&& rdoList,
-    const FaserSiWidth& width,
-    const TrackerDD::SiDetectorElement* detEl,
-    std::unique_ptr<const Amg::MatrixX> locErrMat
-    ) : TrackerCluster(RDOId, locpos,
-      std::move(rdoList), width, detEl,
-      std::move(locErrMat)),
-    m_hitsInThirdTimeBin(0)
-{
-}
+FaserSCT_Cluster::FaserSCT_Cluster(const Identifier& RDOId,
+                         const Amg::Vector2D& locpos,
+                         std::vector<Identifier>&& rdoList,
+                         const FaserSiWidth& width,
+                         const TrackerDD::SiDetectorElement* detEl,
+                         Amg::MatrixX&& locErrMat)
+  : TrackerCluster(RDOId,
+              locpos,
+              std::move(rdoList),
+              width,
+              detEl,
+              std::move(locErrMat))
+  , m_hitsInThirdTimeBin(0)
+{}
+
 
 // Default constructor:
 FaserSCT_Cluster::FaserSCT_Cluster():TrackerCluster()
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/src/TrackerCluster.cxx b/Tracker/TrackerRecEvent/TrackerPrepRawData/src/TrackerCluster.cxx
index a590bf8d1bf31edec0023b52847096eecbca52ce..6a9d9adf9a7f64e91caa7504e83bb6f5a6243c48 100755
--- a/Tracker/TrackerRecEvent/TrackerPrepRawData/src/TrackerCluster.cxx
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/src/TrackerCluster.cxx
@@ -16,96 +16,105 @@
 
 namespace Tracker {
 // Constructor for EF:
-TrackerCluster::TrackerCluster(
-    const Identifier &RDOId,
-    const Amg::Vector2D& locpos, 
-    const std::vector<Identifier>& rdoList, 
-    const FaserSiWidth& width,
-    const TrackerDD::SiDetectorElement* detEl,
-    const Amg::MatrixX* locErrMat
-    ) :
-    PrepRawData(RDOId, locpos, rdoList, locErrMat), //call base class constructor    
-  m_width(width),
-  m_globalPosition{},
-  m_detEl(detEl) {}
-
-  TrackerCluster::TrackerCluster(
-      const Identifier &RDOId,
-      const Amg::Vector2D& locpos, 
-      std::vector<Identifier>&& rdoList, 
-      const FaserSiWidth& width,
-      const TrackerDD::SiDetectorElement* detEl,
-      std::unique_ptr<const Amg::MatrixX> locErrMat
-      ) :
-      PrepRawData(RDOId, locpos,
-                  std::move(rdoList),
-                  std::move(locErrMat)), //call base class constructor
-    m_width(width),
-    m_globalPosition{},
-    m_detEl(detEl) {}
+TrackerCluster::TrackerCluster(const Identifier& RDOId,
+                    const Amg::Vector2D& locpos,
+                    const std::vector<Identifier>& rdoList,
+                    const FaserSiWidth& width,
+                    const TrackerDD::SiDetectorElement* detEl,
+                    const Amg::MatrixX& locErrMat)
+  : // call base class constructor
+  PrepRawData(RDOId, locpos, rdoList, locErrMat)
+  , m_width(width)
+  , m_detEl(detEl)
+{
+  if (m_detEl) {
+    m_globalPosition =
+      m_detEl->surface(identify()).localToGlobal(localPosition());
+  }
+}
 
-    // Destructor:
-TrackerCluster::~TrackerCluster()
+// Constructor for EF:
+TrackerCluster::TrackerCluster(const Identifier& RDOId,
+                    const Amg::Vector2D& locpos,
+                    const std::vector<Identifier>& rdoList,
+                    const FaserSiWidth& width,
+                    const TrackerDD::SiDetectorElement* detEl)
+  : // call base class constructor
+  PrepRawData(RDOId, locpos, rdoList, {})
+  , m_width(width)
+  , m_detEl(detEl)
 {
-  // do not delete m_detEl since owned by DetectorStore
+  if (m_detEl) {
+    m_globalPosition =
+      m_detEl->surface(identify()).localToGlobal(localPosition());
+  }
 }
 
-// Default constructor:
-TrackerCluster::TrackerCluster():
-  m_globalPosition{},
-  m_detEl(0)
+TrackerCluster::TrackerCluster(const Identifier& RDOId,
+                    const Amg::Vector2D& locpos,
+                    const Amg::Vector3D& globpos,
+                    const std::vector<Identifier>& rdoList,
+                    const FaserSiWidth& width,
+                    const TrackerDD::SiDetectorElement* detEl,
+                    const Amg::MatrixX& locErrMat)
+  : // call base class constructor
+  PrepRawData(RDOId, locpos, rdoList, locErrMat)
+  , m_globalPosition(globpos)
+  , m_width(width)
+  , m_detEl(detEl)
 {}
 
-//copy constructor:
-TrackerCluster::TrackerCluster(const TrackerCluster& RIO):
-  PrepRawData( RIO ),
-  m_width( RIO.m_width ),
-  m_globalPosition{},
-  m_detEl( RIO.m_detEl )
+TrackerCluster::TrackerCluster(const Identifier& RDOId,
+                    const Amg::Vector2D& locpos,
+                    const Amg::Vector3D& globpos,
+                    const std::vector<Identifier>& rdoList,
+                    const FaserSiWidth& width,
+                    const TrackerDD::SiDetectorElement* detEl)
+  : // call base class constructor
+  PrepRawData(RDOId, locpos, rdoList,{})
+  , m_globalPosition(globpos)
+  , m_width(width)
+  , m_detEl(detEl)
+{}
 
+TrackerCluster::TrackerCluster(const Identifier& RDOId,
+                    const Amg::Vector2D& locpos,
+                    std::vector<Identifier>&& rdoList,
+                    const FaserSiWidth& width,
+                    const TrackerDD::SiDetectorElement* detEl,
+                    Amg::MatrixX&& locErrMat)
+  : // call base class constructor
+  PrepRawData(RDOId, locpos, std::move(rdoList), std::move(locErrMat))
+  , m_width(width)
+  , m_detEl(detEl)
 {
-  // copy only if it exists
-  if (RIO.m_globalPosition) {
-    m_globalPosition.set(std::make_unique<Amg::Vector3D>(*RIO.m_globalPosition));
+  if (m_detEl) {
+    m_globalPosition =
+      m_detEl->surface(identify()).localToGlobal(localPosition());
   }
 }
 
-//move constructor:
-TrackerCluster::TrackerCluster(TrackerCluster&& RIO):
-  PrepRawData( std::move(RIO) ),
-  m_width( std::move(RIO.m_width) ),
-  m_globalPosition( std::move(RIO.m_globalPosition) ),
-  m_detEl( RIO.m_detEl )
+TrackerCluster::TrackerCluster(const Identifier& RDOId,
+                    const Amg::Vector2D& locpos,
+                    const Amg::Vector3D& globpos,
+                    std::vector<Identifier>&& rdoList,
+                    const FaserSiWidth& width,
+                    const TrackerDD::SiDetectorElement* detEl,
+                    Amg::MatrixX&& locErrMat)
+  : // call base class constructor
+  PrepRawData(RDOId, locpos, std::move(rdoList), std::move(locErrMat))
+  , m_globalPosition(globpos)
+  , m_width(width)
+  , m_detEl(detEl)
+{}
+
 
+    // Destructor:
+TrackerCluster::~TrackerCluster()
 {
+  // do not delete m_detEl since owned by DetectorStore
 }
 
-//assignment operator
-TrackerCluster& TrackerCluster::operator=(const TrackerCluster& RIO){
-  if (&RIO !=this) {
-    Trk::PrepRawData::operator= (RIO);
-    m_width = RIO.m_width;
-    if (RIO.m_globalPosition) {
-      m_globalPosition.set(std::make_unique<Amg::Vector3D>(*RIO.m_globalPosition));
-    } else if (m_globalPosition) {
-      m_globalPosition.release().reset();
-    }
-    m_detEl =  RIO.m_detEl ;
-  }
-  return *this;
-} 
-
-//move operator
-TrackerCluster& TrackerCluster::operator=(TrackerCluster&& RIO){
-  if (&RIO !=this) {
-    Trk::PrepRawData::operator= (std::move(RIO));
-    m_width = RIO.m_width;
-    m_globalPosition = std::move(RIO.m_globalPosition);
-    m_detEl =  RIO.m_detEl ;
-  }
-  return *this;
-} 
-
 MsgStream& TrackerCluster::dump( MsgStream&    stream) const
 {
   stream << "TrackerCluster object"<<std::endl;
diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx
index 7964343741c0dadc9818b4792a8d17e56fe04d33..5567e5cf9ab507ce8e7f076917055adef219e8e8 100644
--- a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx
+++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx
@@ -29,7 +29,7 @@ Tracker::FaserSCT_ClusterOnTrack::FaserSCT_ClusterOnTrack(const Tracker::FaserSC
 
   // Set global position
   Amg::Vector2D lpos(localParameters().get(Trk::locX), m_positionAlongStrip);
-  m_globalPosition = detectorElement()->surface(identify()).localToGlobalPos(lpos);
+  m_globalPosition = detectorElement()->surface(identify()).localToGlobal(lpos);
 }
 
 // Constructor with parameters
@@ -45,8 +45,9 @@ Tracker::FaserSCT_ClusterOnTrack::FaserSCT_ClusterOnTrack(const Tracker::FaserSC
   m_rio.setElement(RIO);
 
   //constructing local position provided a global one  
-  std::unique_ptr<const Amg::Vector2D>
-    lpos{detectorElement()->surface( identify() ).positionOnSurface(globalPosition)};
+  std::optional<Amg::Vector2D> lpos{
+    detectorElement()->surface(identify()).positionOnSurface(globalPosition)
+  };
 					
   //storing the position along the strip if available
   m_positionAlongStrip = (lpos) ? (*lpos)[Trk::locY]:0.; 
@@ -94,7 +95,7 @@ void Tracker::FaserSCT_ClusterOnTrack::setValues(const Trk::TrkDetElementBase* d
       Amg::Vector2D lpos(localParameters().get(Trk::locX),
                          m_positionAlongStrip);
       m_globalPosition =
-        detectorElement()->surface(identify()).localToGlobalPos(lpos);
+        detectorElement()->surface(identify()).localToGlobal(lpos);
     }
 }
 
diff --git a/Tracker/TrackerRecEvent/TrackerSpacePoint/TrackerSpacePoint/FaserSCT_SpacePoint.h b/Tracker/TrackerRecEvent/TrackerSpacePoint/TrackerSpacePoint/FaserSCT_SpacePoint.h
index 8a6b7aceb2b233388699f0b7d11f7e874599de44..28c5cc2663b61019656504e176ff273779bb4820 100755
--- a/Tracker/TrackerRecEvent/TrackerSpacePoint/TrackerSpacePoint/FaserSCT_SpacePoint.h
+++ b/Tracker/TrackerRecEvent/TrackerSpacePoint/TrackerSpacePoint/FaserSCT_SpacePoint.h
@@ -46,23 +46,9 @@ namespace Tracker
        * on the surface associated to the FIRST member of the PRD-pair clusList.
        */
       //@{
-      FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList, 
-		     const Amg::Vector3D* position, 
-		     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) ;
-      
-      FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList, 
-		     const Amg::Vector3D* position,
-		     const Amg::MatrixX* loccov,//assumes ownership of loccov
-		     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) ;
-      
       FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList, 
 		     const Amg::Vector3D& position, 
-		     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) ;
-      
-      FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList, 
-		     const Amg::Vector3D& position,
-		     const Amg::MatrixX& loccov,//assumes ownership of loccov
-		     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) ;
+		     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>& clusList) ;
       //@}
 
       /** Copy Constructor */
@@ -91,7 +77,7 @@ namespace Tracker
       /** common method used in constructors. */
       void setup(const std::pair<IdentifierHash, IdentifierHash>& elementIdList,  		    
 		 const Amg::Vector3D& position,
-		 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList);
+		 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>&clusList);
     };
   
   ///////////////////////////////////////////////////////////////////
diff --git a/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx b/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx
index ca62c4ab52f916db61d3c8676495b0b1990cb2e0..68554d010e724fbe59f5c07cbfbb2c02b64d97f9 100755
--- a/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx
+++ b/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx
@@ -20,37 +20,9 @@ namespace Tracker
 
   //-------------------------------------------------------------
 
-  FaserSCT_SpacePoint::FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList,  		    
-				 const Amg::Vector3D* position,
-				 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) 
-    :
-    Trk::SpacePoint()
-  {
-    setup(elementIdList,*position,clusList);
-    setupLocalCovarianceSCT();
-    setupGlobalFromLocalCovariance();
-    delete position;
-  }
-
-  //-------------------------------------------------------------
-
-  FaserSCT_SpacePoint::FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList,  		    
-				 const Amg::Vector3D* position,
-				 const Amg::MatrixX* loccov,
-				 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) 
-    :
-    Trk::SpacePoint()
-  {
-    Trk::MeasurementBase::m_localCovariance = *loccov;
-    setup(elementIdList,*position,clusList);
-    setupGlobalFromLocalCovariance();
-    delete loccov;
-    delete position;
-  }
-
   FaserSCT_SpacePoint::FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList,  		    
 				 const Amg::Vector3D& position,
-				 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) 
+				 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>& clusList) 
     :
     Trk::SpacePoint()
   {
@@ -59,38 +31,23 @@ namespace Tracker
     setupGlobalFromLocalCovariance();
   }
 
-  //-------------------------------------------------------------
-
-  FaserSCT_SpacePoint::FaserSCT_SpacePoint(const std::pair<IdentifierHash, IdentifierHash>& elementIdList,  		    
-				 const Amg::Vector3D& position,
-				 const Amg::MatrixX& loccov,
-				 const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList) 
-    :
-    Trk::SpacePoint()
-  {
-    Trk::MeasurementBase::m_localCovariance = loccov;
-    setup(elementIdList,position,clusList);
-    setupGlobalFromLocalCovariance();
-  }
-
-  
   //-------------------------------------------------------------
   
   void FaserSCT_SpacePoint::setup(const std::pair<IdentifierHash, IdentifierHash>& elementIdList,  		    
 			     const Amg::Vector3D& position,
-			     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList)
+			     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>& clusList)
   {
-    m_clusList.first = clusList->first;
-    m_clusList.second = clusList->second;
+    m_clusList = clusList;
     m_position = position ;
     m_elemIdList.first = elementIdList.first ;
     m_elemIdList.second = elementIdList.second ;
-    assert( (clusList->first!=0) && (clusList->second!=0) );
+    assert( (clusList.first!=0) && (clusList.second!=0) );
     assert(clusList->first->detectorElement()) ;
-    const Amg::Vector2D* locpos = (clusList->first->detectorElement()->surface().globalToLocal(position)) ;  
+   std::optional<Amg::Vector2D> locpos{
+      clusList.first->detectorElement()->surface().globalToLocal(position)
+    };
     assert(locpos);
     Trk::MeasurementBase::m_localParams = Trk::LocalParameters(*locpos ) ;
-    delete locpos ;
 
   }
 
diff --git a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx
index dece2904daf8acc0ac4ac9e2d71c681713df8353..2963d98dfdb966c92bf9541052bfe9d0e256b654 100644
--- a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx
+++ b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/FaserSCT_ClusteringTool.cxx
@@ -435,7 +435,7 @@ namespace Tracker
       const Tracker::FaserSiWidth siWidth(Amg::Vector2D(nStrips, 1), Amg::Vector2D(clusterDim.width, stripLength));
       
       Tracker::FaserSCT_Cluster* cluster = (m_clusterMaker) ? (m_clusterMaker->sctCluster(clusterId, localPos, stripGroup, siWidth, element, m_errorStrategy))
-        : (new Tracker::FaserSCT_Cluster(clusterId, localPos, stripGroup, siWidth, element, 0));
+        : (new Tracker::FaserSCT_Cluster(clusterId, localPos, stripGroup, siWidth, element, {}));
       cluster->setHashAndIndex(clusterCollection->identifyHash(), clusterCollection->size());
       if (tbinIter != tbinGroups.end()) {
         cluster->setHitsInThirdTimeBin(*tbinIter);
@@ -666,8 +666,8 @@ namespace Tracker
         V[3]           = sn2*v0+cs2*v1;
       }
 
-      Amg::MatrixX* errorMatrix(new Amg::MatrixX(2,2));
-      *errorMatrix<<V[0],V[1],V[2],V[3];
+      auto errorMatrix = Amg::MatrixX(2,2);
+      errorMatrix<<V[0],V[1],V[2],V[3];
 
       Tracker::FaserSiWidth siWidth{Amg::Vector2D(dnStrips,1.), Amg::Vector2D(width,stripL)};
 
diff --git a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx
index 2313a1584a00f63827cbfd9183c5fbf9acd29feb..9b853f514ed2b561219528707a9d15d14d2600b8 100644
--- a/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx
+++ b/Tracker/TrackerRecTools/FaserSiClusterizationTool/src/TrackerClusterMakerTool.cxx
@@ -92,8 +92,8 @@ Tracker::FaserSCT_Cluster* TrackerClusterMakerTool::sctCluster(
 	const Amg::Vector2D& colRow = width.colRow();// made ref to avoid 
 	// unnecessary copy EJWM
 
-	Amg::MatrixX* errorMatrix = new Amg::MatrixX(2,2);
-	errorMatrix->setIdentity();
+	auto errorMatrix = Amg::MatrixX(2,2);
+	errorMatrix.setIdentity();
 
 	// switches are more readable **OPT**
 	// actually they're slower as well (so I'm told) so perhaps
@@ -101,37 +101,37 @@ Tracker::FaserSCT_Cluster* TrackerClusterMakerTool::sctCluster(
     
 	switch (errorStrategy){
 	case 0:
-	  errorMatrix->fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
-	  errorMatrix->fillSymmetric(1,1,square(width.z())*ONE_TWELFTH);
+	  errorMatrix.fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
+	  errorMatrix.fillSymmetric(1,1,square(width.z())*ONE_TWELFTH);
 	  break;
 	case 1:
 	  // mat(1,1) = pow(width.phiR()/colRow.x(),2)/12;
 	  // single strip - resolution close to pitch/sqrt(12)
 	  // two-strip hits: better resolution, approx. 40% lower
 	  if(colRow.x() == 1){
-	    errorMatrix->fillSymmetric(0,0,square(1.05*width.phiR())*ONE_TWELFTH);
+	    errorMatrix.fillSymmetric(0,0,square(1.05*width.phiR())*ONE_TWELFTH);
 	  }
 	  else if(colRow.x() == 2){
-	    errorMatrix->fillSymmetric(0,0,square(0.27*width.phiR())*ONE_TWELFTH);
+	    errorMatrix.fillSymmetric(0,0,square(0.27*width.phiR())*ONE_TWELFTH);
 	  }
 	  else{
-	    errorMatrix->fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
+	    errorMatrix.fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
 	  }
-	  errorMatrix->fillSymmetric(1,1,square(width.z()/colRow.y())*ONE_TWELFTH);
+	  errorMatrix.fillSymmetric(1,1,square(width.z()/colRow.y())*ONE_TWELFTH);
 	  break;
 	default:
 	  // single strip - resolution close to pitch/sqrt(12)
 	  // two-strip hits: better resolution, approx. 40% lower
 	  if(colRow.x() == 1){
-	    errorMatrix->fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
+	    errorMatrix.fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
 	  }
 	  else if(colRow.x() == 2){
-	    errorMatrix->fillSymmetric(0,0,square(0.27*width.phiR())*ONE_TWELFTH);
+	    errorMatrix.fillSymmetric(0,0,square(0.27*width.phiR())*ONE_TWELFTH);
 	  }
 	  else{
-	    errorMatrix->fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
+	    errorMatrix.fillSymmetric(0,0,square(width.phiR())*ONE_TWELFTH);
 	  }
-	  errorMatrix->fillSymmetric(1,1,square(width.z()/colRow.y())*ONE_TWELFTH);
+	  errorMatrix.fillSymmetric(1,1,square(width.z()/colRow.y())*ONE_TWELFTH);
 	  break;
 	}
 
diff --git a/Tracker/TrackerRecTools/FaserSiSpacePointTool/src/TrackerSpacePointMakerTool.cxx b/Tracker/TrackerRecTools/FaserSiSpacePointTool/src/TrackerSpacePointMakerTool.cxx
index a26a3c3460a48b131de633dbfe3b3e09f177f39d..d04d721c7a748433d02087fc9ac981e46eeb205d 100644
--- a/Tracker/TrackerRecTools/FaserSiSpacePointTool/src/TrackerSpacePointMakerTool.cxx
+++ b/Tracker/TrackerRecTools/FaserSiSpacePointTool/src/TrackerSpacePointMakerTool.cxx
@@ -183,10 +183,9 @@ Trk::SpacePoint* TrackerSpacePointMakerTool::makeSCT_SpacePoint(const Tracker::T
   }
   if (ok) {
     ATH_MSG_VERBOSE( "SpacePoint generated at: ( " <<  point.x() << " , " << point.y() << " , " << point.z() << " )   " );       
-    const std::pair<IdentifierHash,IdentifierHash> elementIdList( element1->identifyHash() , element2->identifyHash() ); 
-    const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>*
-      clusList = new std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>(&cluster1, &cluster2);
-    return new FaserSCT_SpacePoint(elementIdList, new Amg::Vector3D(point), clusList);
+    std::pair<IdentifierHash,IdentifierHash> elementIdList( element1->identifyHash() , element2->identifyHash() ); 
+    std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*> clusList {&cluster1, &cluster2 };
+    return new FaserSCT_SpacePoint(elementIdList, point, clusList);
   }
 
   return nullptr;
@@ -531,9 +530,8 @@ void TrackerSpacePointMakerTool::makeSCT_SpacePoints(const double stripLengthGap
 
       ATH_MSG_VERBOSE("SpacePoint generated at: ( " <<  point.x() << " , " << point.y() << " , " << point.z() << " )   ");
       const std::pair<IdentifierHash, IdentifierHash> elementIdList(ent->m_element0->identifyHash(), ent->m_element1->identifyHash());
-      const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>*
-	clusList = new std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>((*I).cluster(), (*J).cluster());
-      ent->m_tmpSpacePoints.push_back(new FaserSCT_SpacePoint(elementIdList, new Amg::Vector3D(point), clusList));
+      const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*> clusList {(*I).cluster(), (*J).cluster()};
+      ent->m_tmpSpacePoints.push_back(new FaserSCT_SpacePoint(elementIdList, point, clusList));
     }
   }
 }
diff --git a/Tracking/Acts/ActsInterop/ActsInterop/Logger.h b/Tracking/Acts/ActsInterop/ActsInterop/Logger.h
index cf0b4a4f9af8ab364220d680882d3a01d9e9bfb2..e76b7d0e3136b4b0e1f9d08da56f196090d65d8e 100644
--- a/Tracking/Acts/ActsInterop/ActsInterop/Logger.h
+++ b/Tracking/Acts/ActsInterop/ActsInterop/Logger.h
@@ -20,7 +20,7 @@ public:
   ActsAthenaPrintPolicy(std::shared_ptr<MsgStream> msg) : m_msg(msg) {}
 
   void
-  flush(const Acts::Logging::Level& lvl, const std::ostringstream& input);
+  flush(const Acts::Logging::Level& lvl, const std::string& input);
 
 private:
   std::shared_ptr<MsgStream> m_msg;
diff --git a/Tracking/Acts/ActsInterop/CMakeLists.txt b/Tracking/Acts/ActsInterop/CMakeLists.txt_disabled
similarity index 100%
rename from Tracking/Acts/ActsInterop/CMakeLists.txt
rename to Tracking/Acts/ActsInterop/CMakeLists.txt_disabled
diff --git a/Tracking/Acts/ActsInterop/src/Logger.cxx b/Tracking/Acts/ActsInterop/src/Logger.cxx
index e40f9e47943baee1e5a33f7b34d535008661285e..aec48aee54814c60cbb69cb0bfd1759dcb3689cb 100644
--- a/Tracking/Acts/ActsInterop/src/Logger.cxx
+++ b/Tracking/Acts/ActsInterop/src/Logger.cxx
@@ -29,10 +29,10 @@ namespace {
 }
 
 void
-ActsAthenaPrintPolicy::flush(const Acts::Logging::Level& lvl, const std::ostringstream& input)
+ActsAthenaPrintPolicy::flush(const Acts::Logging::Level& lvl, const std::string& input)
 {
   MSG::Level athLevel = athLevelVector[lvl];
-  (*m_msg) << athLevel << input.str() << endmsg;
+  (*m_msg) << athLevel << input << endmsg;
 }
   
 
diff --git a/Tracking/Acts/FaserActsGeometry/CMakeLists.txt b/Tracking/Acts/FaserActsGeometry/CMakeLists.txt_disabled
similarity index 100%
rename from Tracking/Acts/FaserActsGeometry/CMakeLists.txt
rename to Tracking/Acts/FaserActsGeometry/CMakeLists.txt_disabled
diff --git a/Tracking/Acts/FaserActsGeometry/python/ActsGeometryConfig.py b/Tracking/Acts/FaserActsGeometry/python/ActsGeometryConfig.py
index 84bfe224aad7f984ffa7ca1f712a2db5525e7427..a1c3c9f1f239befaaa4c10542706cacfdd18e4dd 100644
--- a/Tracking/Acts/FaserActsGeometry/python/ActsGeometryConfig.py
+++ b/Tracking/Acts/FaserActsGeometry/python/ActsGeometryConfig.py
@@ -5,7 +5,7 @@ FaserActsWriteTrackingGeometry,FaserActsTrackingGeometrySvc,FaserActsTrackingGeo
 
 
 
-def ActsTrackingGeometrySvcCfg(configFlags, name = "ActsTrackingGeometrySvc" ) :
+def ActsTrackingGeometrySvcCfg(configFlags, name = "ActsTrackingGeometrySvc" , **kwargs) :
   result = ComponentAccumulator()
   actsTrackingGeometrySvc = FaserActsTrackingGeometrySvc(name = "FaserActsTrackingGeometrySvc", **kwargs)
 
diff --git a/Tracking/Acts/FaserActsGeometry/python/FaserActsExtrapolationConfig.py b/Tracking/Acts/FaserActsGeometry/python/FaserActsExtrapolationConfig.py
index 574f7f82273d076fd6b236488d9a443a17890b68..8720049d249df0064baddab4a91edea401ea2ae1 100644
--- a/Tracking/Acts/FaserActsGeometry/python/FaserActsExtrapolationConfig.py
+++ b/Tracking/Acts/FaserActsGeometry/python/FaserActsExtrapolationConfig.py
@@ -3,7 +3,7 @@ Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 """
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+# from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
 from FaserSCT_GeoModel.FaserSCT_GeoModelConfig import FaserSCT_GeometryCfg
 from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
 
diff --git a/Tracking/Acts/FaserActsGeometry/python/FaserActsMaterialMapping_jobOptions.py b/Tracking/Acts/FaserActsGeometry/python/FaserActsMaterialMapping_jobOptions.py
index 23270e4e9eeec0f6ddac95645749d3de1bf714c0..feb3b04d2f978297bfcbea4229d0ff35862d5aee 100644
--- a/Tracking/Acts/FaserActsGeometry/python/FaserActsMaterialMapping_jobOptions.py
+++ b/Tracking/Acts/FaserActsGeometry/python/FaserActsMaterialMapping_jobOptions.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS and FASER collaborations
+
 ###############################################################
 #
 # Map material from a Geantino scan onto the surfaces and 
diff --git a/Tracking/Acts/FaserActsGeometry/test/FaserActsWriteTrackingGeometry.py b/Tracking/Acts/FaserActsGeometry/test/FaserActsWriteTrackingGeometry.py
index 899134b324e2975bb78e33361b6ea974a5aa68f7..61f1e62490ee5d50a9f4d20f0e23a4d5dc55646a 100644
--- a/Tracking/Acts/FaserActsGeometry/test/FaserActsWriteTrackingGeometry.py
+++ b/Tracking/Acts/FaserActsGeometry/test/FaserActsWriteTrackingGeometry.py
@@ -44,7 +44,7 @@ acc.merge(FaserActsWriteTrackingGeometryCfg(ConfigFlags))
 #oStream = acc.getEventAlgo("OutputStreamRDO")
 #oStream.ItemList += ["EventInfo#*",
 #                     "McEventCollection#TruthEvent",
-#                     "McEventCollection#GEN_EVENT"
+#                     "McEventCollection#BeamTruthEvent"
 #                    ]
                     
 # Timing
diff --git a/Tracking/Acts/FaserActsGeometryInterfaces/CMakeLists.txt b/Tracking/Acts/FaserActsGeometryInterfaces/CMakeLists.txt_disabled
similarity index 100%
rename from Tracking/Acts/FaserActsGeometryInterfaces/CMakeLists.txt
rename to Tracking/Acts/FaserActsGeometryInterfaces/CMakeLists.txt_disabled
diff --git a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt_disabled
similarity index 100%
rename from Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
rename to Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt_disabled
diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h
index 033f0ebc836ca6d81dfb6d23f64db1501f146e64..2cdf9b4a75de9c39e50686a54bb4988323a90811 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h
@@ -116,7 +116,7 @@ private:
 
   SG::ReadHandleKey<SpacePointForSeedCollection>  m_seed_spcollectionKey{this, "FaserSpacePointsSeedsName", "SpacePointForSeedCollection", "SpacePointForSeedCollection"};
 
-  SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "GEN_EVENT" };
+  SG::ReadHandleKey<McEventCollection> m_mcEventKey       { this, "McEventCollection", "BeamTruthEvent" };
   SG::ReadHandleKey<TrackerSimDataCollection> m_sctMap {this, "TrackerSimDataCollection", "SCT_SDO_Map"};
   const TrackerDD::SCT_DetectorManager* m_detManager{nullptr};
 
diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/CombinatorialKalmanFilterConfig.py b/Tracking/Acts/FaserActsKalmanFilter/python/CombinatorialKalmanFilterConfig.py
index 0953ea66a7e6e95ccf68af1517c183a04075bdcc..b4bef9af0883abd8219a5d908e3c39603674da55 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/python/CombinatorialKalmanFilterConfig.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/python/CombinatorialKalmanFilterConfig.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS and FASER collaborations
+
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py b/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py
index 0a955d80a50c7fcb5de8878841404565cd870f1b..6d6167c051b868d6032355e5bfd58d2a0f8296bd 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS and FASER collaborations
+
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h
index 3f734e18539c905ba35dd824b3f61c18dfb0b42d..d8da8531253883eb19265ff95b798a3db1164f34 100644
--- a/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h
+++ b/Tracking/TrkEventCnv/TrkEventCnvTools/TrkEventCnvTools/DetElementSurface.h
@@ -47,7 +47,7 @@ class DetElementSurface : public Surface
     std::ostream &              dump (std::ostream &sl) const { return sl;};
     const Identifier            associatedDetectorElementIdentifier() const {return m_id;}
     bool                        isFree() {return true;}// To avoid memory leaks
-    Surface::SurfaceType        type() const {return Surface::Other;}
+    SurfaceType                 type() const {return SurfaceType::Other;}
     void                        localToGlobal(const Amg::Vector2D&, const Amg::Vector3D&, Amg::Vector3D&) const {}
     bool                        globalToLocal(const Amg::Vector3D&, const Amg::Vector3D&, Amg::Vector2D&) const {return false;}
     std::string                 name() const { return "Trk::DetElementSurface";}
@@ -58,7 +58,7 @@ class DetElementSurface : public Surface
                                 double,
                                 double,
                                 double,
-                                AmgSymMatrix(5) *) const
+                                std::optional<AmgSymMatrix(5)> = std::nullopt) const
     {
       return nullptr;
     }
@@ -66,7 +66,7 @@ class DetElementSurface : public Surface
     createUniqueTrackParameters(const Amg::Vector3D&,
                                 const Amg::Vector3D&,
                                 double,
-                                AmgSymMatrix(5) *) const
+                                std::optional<AmgSymMatrix(5)> = std::nullopt) const
     {
       return nullptr;
     }
@@ -77,7 +77,7 @@ class DetElementSurface : public Surface
                                   double,
                                   double,
                                   double,
-                                  AmgSymMatrix(5) *) const
+                                  std::optional<AmgSymMatrix(5)> = std::nullopt) const
     {
       return nullptr;
     }
@@ -85,7 +85,7 @@ class DetElementSurface : public Surface
     createUniqueNeutralParameters(const Amg::Vector3D&,
                                   const Amg::Vector3D&,
                                   double,
-                                  AmgSymMatrix(5) *) const
+                                  std::optional<AmgSymMatrix(5)> = std::nullopt) const
     {
       return nullptr;
     }
@@ -99,7 +99,7 @@ class DetElementSurface : public Surface
     virtual Trk::DistanceSolution straightLineDistanceEstimate(const Amg::Vector3D&,
                                            const Amg::Vector3D&, bool) const {return 0;}
 
-    virtual bool isOnSurface(const Amg::Vector3D&, Trk::BoundaryCheck, double, double) const {return false;}
+    virtual bool isOnSurface(const Amg::Vector3D&, const Trk::BoundaryCheck&, double, double) const {return false;}
 
 private:
     Identifier  m_id;
diff --git a/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py b/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py
index 272de9158e9e65da5bbbfe6aa911abaa6c424ed3..6a30a71bd796ec8f56834aeccd258eb235dd4de6 100644
--- a/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py
+++ b/Tracking/TrkEventCnv/TrkEventCnvTools/python/TrkEventCnvToolsConfig.py
@@ -3,7 +3,7 @@
 # default configuration of TrkEventCnvTools
 # example of a configuration in class deriving from a Configurable
 
-from AthenaCommon.DetFlags import DetFlags
+# from AthenaCommon.DetFlags import DetFlags
 from AthenaCommon.AppMgr import ToolSvc
 # from RecExConfig import RecFlags as rec
 
diff --git a/graphics/VTI12/VTI12Algs/share/vti12 b/graphics/VTI12/VTI12Algs/share/vti12
index 803466b4e18a0e5c2de706db1e774f717c11c7fa..ee3cf7c0f5f1afd20895c475e6a42f7f7d7d9caa 100644
--- a/graphics/VTI12/VTI12Algs/share/vti12
+++ b/graphics/VTI12/VTI12Algs/share/vti12
@@ -715,7 +715,7 @@ if [ "x$FLAG_HELP" != "x0" ]; then
     echo "                                (default mode when running over data files)"
     echo
     echo "  -fatras                     : Use Fatras (in single-track-simulation mode if no input file with generated event)"
-    echo "  -fatraskey=KEY              : Optionally override truth key used by Fatras (typical values are GEN_EVENT or TruthEvent)"
+    echo "  -fatraskey=KEY              : Optionally override truth key used by Fatras (typical values are BeamTruthEvent or TruthEvent)"
     echo
     echo "  -eventsrc=DIR               : Directory to take single event files from (do not specify input files in this case)."
     echo "                                To get files from a web server (i.e. live events), put instead the url to the file"
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/AscObj_TSOS.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/AscObj_TSOS.cxx
index 7e96708b11b6bad45ecf793de1683e2ec828cebc..2c767c0c206fc6acd18301e993a075c1252fa9ff 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/AscObj_TSOS.cxx
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/AscObj_TSOS.cxx
@@ -196,8 +196,8 @@ const Trk::MeasurementBase * AscObj_TSOS::measurement() const
 SoTranslation* AscObj_TSOS::getZTranslationTube( const Trk::Surface * theSurface,
                          const double& maxTrans ) const
 {
-  const Amg::Vector3D* origo = theSurface->localToGlobal(Amg::Vector2D(0,0));
-  const Amg::Vector3D* unitz = theSurface->localToGlobal(Amg::Vector2D(0,1));
+  const Amg::Vector3D origo = theSurface->localToGlobal(Amg::Vector2D(0,0));
+  const Amg::Vector3D unitz = theSurface->localToGlobal(Amg::Vector2D(0,1));
 
   std::vector< Amg::Vector3D > * points = trackHandle()->hackGetPointsPropagated();//FIXME
 
@@ -208,7 +208,7 @@ SoTranslation* AscObj_TSOS::getZTranslationTube( const Trk::Surface * theSurface
   for ( size_t i = 0; i<points->size(); i++)
   {
     double s;
-    double dist = VP1LinAlgUtils::distPointLine2( (*points)[i], *origo, *unitz, s );
+    double dist = VP1LinAlgUtils::distPointLine2( (*points)[i], origo, unitz, s );
     if (dist < min)
     {
       min = dist;
@@ -226,16 +226,16 @@ SoTranslation* AscObj_TSOS::getZTranslationTube( const Trk::Surface * theSurface
     double sp,tp,sm,tm;
     if (imin+1 < points->size() && imin >= 1)
     {
-      VP1LinAlgUtils::distLineLineParam((*points).at(imin),(*points).at(imin+1),*origo,*unitz,tp,sp);
-      VP1LinAlgUtils::distLineLineParam((*points).at(imin-1),(*points).at(imin),*origo,*unitz,tm,sm);
+      VP1LinAlgUtils::distLineLineParam((*points).at(imin),(*points).at(imin+1),origo,unitz,tp,sp);
+      VP1LinAlgUtils::distLineLineParam((*points).at(imin-1),(*points).at(imin),origo,unitz,tm,sm);
       smin = fabs(tm - 0.5) < fabs(tp - 0.5) ? sm : sp;
     } else if (imin+1 >= points->size() && imin >= 1 )
     {
-      VP1LinAlgUtils::distLineLineParam((*points).at(imin-1),(*points).at(imin),*origo,*unitz,tm,sm);
+      VP1LinAlgUtils::distLineLineParam((*points).at(imin-1),(*points).at(imin),origo,unitz,tm,sm);
       smin = sm;
     } else
     {
-      VP1LinAlgUtils::distLineLineParam((*points).at(imin),(*points).at(imin+1),*origo,*unitz,tp,sp);
+      VP1LinAlgUtils::distLineLineParam((*points).at(imin),(*points).at(imin+1),origo,unitz,tp,sp);
       smin = sp;
     }
   } else {
@@ -389,13 +389,12 @@ void AscObj_TSOS::addErrors(const Trk::Surface& theSurface, const AmgSymMatrix(5
     // Shift from Surface centre to correct position
     if (applyLocalTrans) {
       SoTranslation * theTransform = new SoTranslation;
-      const Amg::Vector2D* locPosTmp = surface()->globalToLocal(p1);
+      std::optional<Amg::Vector2D> locPosTmp = surface()->globalToLocal(p1);
       if (locPosTmp) {
         theTransform->translation.setValue(locPosTmp->x(),locPosTmp->y(),0.0); 
         // std::cout<<"applyLocalTrans & Offset=("<<locPosTmp->x()<<","<<locPosTmp->y()<<std::endl;
         errSimple->addChild(theTransform);
         errDetailed->addChild(theTransform);
-        delete locPosTmp;
       } else {
         VP1Msg::message("AscObj_TSOS::addErrors - failed to get tmp position");  
       }
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/SimHitHandle_TrackRecord.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/SimHitHandle_TrackRecord.cxx
index 816c08f3ebdc3c3571a0cc549a16d921c6f5ce49..4cc6d5e0f292ed8e122f8ae20dc1facf91279bcf 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/SimHitHandle_TrackRecord.cxx
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/SimHitHandle_TrackRecord.cxx
@@ -43,7 +43,7 @@ Trk::TrackParameters * SimHitHandle_TrackRecord::createTrackParameters() const
 	Amg::Transform3D transf =  Amg::CLHEPTranslate3DToEigen(HepGeom::Translate3D(m_trkrecord->GetPosition().x(),m_trkrecord->GetPosition().y(),m_trkrecord->GetPosition().z()));
   //Surface:
   const Trk::PlaneSurface * surf
-    = new Trk::PlaneSurface( &transf );
+    = new Trk::PlaneSurface( transf );
   //Fixme: surface and transform ever DELETED??
 
   //Fixme: Don't do this in every simhit!!:
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackHandle_TruthTrack.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackHandle_TruthTrack.cxx
index 1d003ab384abc7102e77de3121bc77c906614079..d800a49d65814f78553a2a77622fae7cebf8cbf3 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackHandle_TruthTrack.cxx
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackHandle_TruthTrack.cxx
@@ -80,7 +80,7 @@ public:
     Amg::Vector3D pos(v->point3d().x(),v->point3d().y(),v->point3d().z());
 
     Amg::Translation3D amgtranslation(pos.x(),pos.y(),pos.z());
-    Amg::Transform3D* amgTransf = new Amg::Transform3D(amgtranslation * Amg::RotationMatrix3D::Identity());
+    Amg::Transform3D amgTransf { amgtranslation * Amg::RotationMatrix3D::Identity() };
 
     return new Trk::AtaPlane(pos,mom,charge, *(new Trk::PlaneSurface(amgTransf)));
   }
@@ -116,7 +116,10 @@ public:
     }
 
     Trk::TrackInfo ti(Trk::TrackInfo::Unknown,theclass->extrapolationParticleHypothesis());
-    trkTrack = new Trk::Track(ti,trackStateOnSurfaces/*track assumes ownership*/,0/*fitquality*/);
+    std::unique_ptr<DataVector<const Trk::TrackStateOnSurface>> sink(trackStateOnSurfaces);
+    trkTrack = new Trk::Track(ti,
+                              std::move(*sink),
+                              nullptr /*fitquality*/);
 
 //     if (VP1Msg::verbose())
 //       VP1Msg::messageVerbose("TrackHandle_TruthTrack created track with "
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx
index 60a4efb144bf327cb35d9e27890a5a6513256a6b..f5545c729ec9007f9f2823ec2f5e968ceac35b17 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx
@@ -367,7 +367,7 @@ const Trk::TrackParameters * TrackPropagationHelper::Imp::extrapolateToNewPar( T
   Trk::CurvilinearUVT uvt(prevpars->momentum().unit());
   
   
-  Amg::Transform3D*  t  = new Amg::Transform3D(uvt.curvU(),uvt.curvV(),uvt.curvT(), prevpars->position()+(prevpars->momentum().unit()*dist));
+  Amg::Transform3D  t  {uvt.curvU(),uvt.curvV(),uvt.curvT(), prevpars->position()+(prevpars->momentum().unit()*dist)};
   
   Trk::PlaneSurface surf(t);
   
diff --git a/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx b/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx
index 9bb096aa783f217b1dcdb1f0c2cd18c0d4509fb6..6aaef646fe42edd3c232cfd690121eafb39d04ce 100644
--- a/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx
+++ b/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx
@@ -129,7 +129,7 @@ void HitToSoNode::buildStripShapes(const Trk::RIO_OnTrack& rio, SoSeparator*&sha
 
 
     double stripLength =100.0, stripWidth = 10.0, stripThickness=1.0;
-    const Amg::Vector2D* localposROT=0;
+    std::optional<Amg::Vector2D> localposROT=std::nullopt;
     Amg::Vector2D* localposStrip=0;
     Identifier id=rio.identify();
     fillValues(id, rio.detectorElement(), stripLength, stripWidth, stripThickness, localposStrip);
@@ -144,7 +144,7 @@ void HitToSoNode::buildStripShapes(const Trk::RIO_OnTrack& rio, SoSeparator*&sha
 
     if( !localposROT )
     {
-        localposROT = new Amg::Vector2D;
+        localposROT = Amg::Vector2D{};
         VP1Msg::message("Warning: Local hit position was NULL");
     }
 
@@ -181,7 +181,6 @@ void HitToSoNode::buildStripShapes(const Trk::RIO_OnTrack& rio, SoSeparator*&sha
     shape_detailed->addChild(localtrans1);
 
     delete localposStrip;
-    delete localposROT;    
 }
 
 void HitToSoNode::fillValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
diff --git a/version.txt b/version.txt
index e5078b479cf7c53b9a657a8440d822748ade1826..cdbc15874e55b47fb45012cbf75daefe3196299b 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-22.0.31
+22.0.40