diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/ATLAS_CHECK_THREAD_SAFETY b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/ATLAS_CHECK_THREAD_SAFETY
new file mode 100644
index 0000000000000000000000000000000000000000..7e36450425721b5a37a2469322099f68219f3322
--- /dev/null
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/ATLAS_CHECK_THREAD_SAFETY
@@ -0,0 +1 @@
+Tracking/TrkAlignment/TrkAlignGenTools
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignModuleTool.h b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignModuleTool.h
index df1155e1cbfdcf583c4e694de96cc81adbdb7875..8f7bec69db200ed043bcc91f51108c0a3e55e581 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignModuleTool.h
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignModuleTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKALIGNGENTOOLS_ALIGNMODULETOOL_H
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignResidualCalculator.h b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignResidualCalculator.h
index 4db391ac81287bc243223e7970cc55762f72e45a..b092fdd7aa7105dc5fcca215458c70251a26f8da 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignResidualCalculator.h
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignResidualCalculator.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKALIGNGENTOOLS_ALIGNRESIDUALCALCULATOR_H
@@ -66,7 +66,7 @@ namespace Trk {
 
     double setResidualsOnATSOS(AlignTSOS* atsos, const TrackStateOnSurface* tsos);
     void   accumulateScattering(const TrackStateOnSurface* tsos);
-    const TrackStateOnSurface* getMatchingTSOS(const AlignTSOS* atsos, const Track* track) const;
+    const TrackStateOnSurface* getMatchingTSOS(const AlignTSOS* atsos, const Track* track);
 
     ToolHandle <IResidualPullCalculator> m_pullCalculator;
     ToolHandle <IUpdator>                m_updator;
@@ -81,7 +81,7 @@ namespace Trk {
 
     double* m_chi2ForMeasType; 
 
-    mutable std::vector<const TrackStateOnSurface*> m_matchedTSOS;
+    std::vector<const TrackStateOnSurface*> m_matchedTSOS;
 
   };
 
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackCreator.h b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackCreator.h
index fe296ec2f20419c27586c9b809d9e6aa1065f8ca..63e305bcc8a5b72515f17979e8e05a8833baa789 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackCreator.h
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackCreator.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKALIGNGENTOOLS_ALIGN_TRACK_CREATOR_H
@@ -54,7 +54,7 @@ namespace Trk {
     const AtlasDetectorID*   m_idHelper;
     MeasurementTypeID* m_measTypeIdHelper;
 
-    mutable std::vector< std::pair<int,int> > m_goodEventList; //!> good events read in from ASCII file
+    std::vector< std::pair<int,int> > m_goodEventList; //!> good events read in from ASCII file
 
     std::string m_eventListName;             //!> name of event list ASCII file    
     bool m_writeEventList;                   //!> write selected events to event list ASCII file
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackDresser.h b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackDresser.h
index b46b26bb2ab778329e23fb575fa7060832c9589e..cc481198433a190335cb8a2fa459b3d72e543517 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackDresser.h
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AlignTrackDresser.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKALIGNGENDRESSERS_ALIGN_TRACK_DRESSER_H
@@ -36,8 +36,8 @@ namespace Trk {
     AlignTrackDresser(const std::string & type, const std::string & name, const IInterface * parent);
     virtual ~AlignTrackDresser();
 
-    StatusCode initialize();
-    StatusCode finalize();
+    virtual StatusCode initialize() override;
+    virtual StatusCode finalize() override;
     
     /** dresses alignTrack with derivatives and other information */
     bool dressAlignTrack(AlignTrack * alignTrack);
@@ -53,7 +53,7 @@ namespace Trk {
     // private variables
     ToolHandle <IDerivCalcTool>  m_derivCalcTool; //!< tool for calculating derivatives of residuals wrt. alignment parameters
 
-    mutable unsigned int m_numBadCovWMatrix; //!< number of tracks with invalid weight matrix from the deriv.calc.tool
+    unsigned int m_numBadCovWMatrix; //!< number of tracks with invalid weight matrix from the deriv.calc.tool
 
   }; // end class
 
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AnalyticalDerivCalcTool.h b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AnalyticalDerivCalcTool.h
index 4461265a0f6670206bfc01c982a79bd48096a98b..560e946aaf002fdef585a00c296d5ee3517e60ab 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AnalyticalDerivCalcTool.h
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/AnalyticalDerivCalcTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRK_ANALYTICALDERIVCALCTOOL_H
@@ -79,10 +79,8 @@ namespace Trk
     bool m_useIntrinsicSCTErrors = false;   //!< use intrinsic errors for SCT
     bool m_useIntrinsicTRTErrors = false;   //!< use intrinsic errors for TRT
 
-    mutable bool m_firstEvent; //!< recognise the first call to setResidualCovMatrix()
-
     int m_residualType; //!< residual type to be used in the calculations
-    mutable bool m_residualTypeSet;   //!< do we have the residual type set?
+    bool m_residualTypeSet;   //!< do we have the residual type set?
 
     bool m_storeDerivatives; //!< store derivatives on AlignTSOS to be filled into ntuple
 
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignModuleTool.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignModuleTool.cxx
index e0e1fd1c5b16d801af9ed42ff15b8a7da091d34d..ab43a01b855cb70e8993e830283c80e3439f3e28 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignModuleTool.cxx
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignModuleTool.cxx
@@ -201,7 +201,7 @@ namespace Trk {
     int idHash =alignModule->identifyHash();
     ATH_MSG_DEBUG("getting alignPars for idHash "<<idHash);
 
-    return (*m_alignParList)[idHash];
+    return std::as_const(m_alignParList)->at(idHash);
   }
 
   //________________________________________________________________________
@@ -219,7 +219,7 @@ namespace Trk {
     
     ATH_MSG_DEBUG("have alignModule "<<alignModule->identify());
     // get alignment parameters
-    AlignParVec* modAlignPar = getFullAlignPars(alignModule);
+    const AlignParVec* modAlignPar = getFullAlignPars(alignModule);
     ATH_MSG_DEBUG("modAlignPar size: "<<modAlignPar->size());
     
     double alignModPar[AlignModule::NTransformPar];
@@ -312,10 +312,11 @@ namespace Trk {
   }
  
   //________________________________________________________________________
-  DataVector<AlignPar>* AlignModuleTool::getFullAlignPars(const AlignModule* alignModule) const
+  AlignModuleTool::AlignParVec*
+  AlignModuleTool::getFullAlignPars(const AlignModule* alignModule) const
   {
     int idHash =alignModule->identifyHash();
-    return (*m_fullAlignParList)[idHash];
+    return std::as_const(m_fullAlignParList)->at(idHash);
   }
 
   //________________________________________________________________________
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx
index 28c551fb131eca0fdb35bd720431aed4d9236942..8ccf5d82a2cda984a38017dd68a1c5e75a6f9211 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -327,7 +327,7 @@ namespace Trk {
 
   //________________________________________________________________________
   const TrackStateOnSurface*
-  AlignResidualCalculator::getMatchingTSOS(const AlignTSOS* atsos, const Track* track) const
+  AlignResidualCalculator::getMatchingTSOS(const AlignTSOS* atsos, const Track* track)
   {
     const TrackStateOnSurface* tsos(nullptr);
 
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignTrackDresser.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignTrackDresser.cxx
index 27d9238c22d408904583bb5f14df0e6751d8c297..8b41423529392ee3df77d05ac17ccdb687013e15 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignTrackDresser.cxx
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignTrackDresser.cxx
@@ -121,7 +121,7 @@ namespace Trk {
 
     if (imeas!=NMEAS) {
       msg(MSG::ERROR)<<"problem with nmeas.  imeas="<<imeas<<", NMEAS="<<NMEAS<<endmsg;
-      exit(3);
+      throw std::runtime_error("Error in AlignTrackDresser::setResiduals");
     }
 
     alignTrack->setResidualVector(residuals); // residuals owned by alignTrack
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/AnalyticalDerivCalcTool.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/AnalyticalDerivCalcTool.cxx
index cd3b39d6ce3b9dd132fa249fe899cbd855dd272d..b13b535eed27dbf54ca960361eac8a87c2a043d7 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/src/AnalyticalDerivCalcTool.cxx
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/AnalyticalDerivCalcTool.cxx
@@ -37,7 +37,6 @@ namespace Trk {
     , m_alignModuleTool("Trk::AlignModuleTool/AlignModuleTool")
     , m_idHelper(nullptr)
     , m_measTypeIdHelper(nullptr)
-    , m_firstEvent(true)
     , m_residualType(HitOnly)
     , m_residualTypeSet(false)
     , m_storeDerivatives(false)
@@ -141,7 +140,8 @@ namespace Trk {
   //________________________________________________________________________
   bool AnalyticalDerivCalcTool::setResidualCovMatrix(AlignTrack * alignTrack) const
   {
-    if (m_firstEvent) {
+    static std::once_flag flag;
+    std::call_once(flag, [&]() {
       if(m_logStream) {
         *m_logStream<<"*************************************************************"<<std::endl;
         *m_logStream<<"*************************************************************"<<std::endl;
@@ -164,8 +164,7 @@ namespace Trk {
         *m_logStream<<"***                                                     *****"<<std::endl;
         *m_logStream<<"*************************************************************"<<std::endl;
       }
-      m_firstEvent = false;
-    }
+    });
 
     // get inverse local error matrix of the track
     const Amg::MatrixX * Vinv = alignTrack->localErrorMatrixInv();
diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/ShiftingDerivCalcTool.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/ShiftingDerivCalcTool.cxx
index d89c62cb7607dded1dfaed12705c1319acadf978..221f143847b829f81e3f2ea781eddf1e49c7af13 100644
--- a/Tracking/TrkAlignment/TrkAlignGenTools/src/ShiftingDerivCalcTool.cxx
+++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/ShiftingDerivCalcTool.cxx
@@ -315,7 +315,7 @@ namespace Trk {
     }
     if (imeas!=NMEAS) {
       msg(MSG::ERROR)<<"problem with nmeas, imeas="<<imeas<<", NMEAS="<<NMEAS<<endmsg;
-      exit(3);
+      throw std::runtime_error("Error in ShiftingDerivCalcTool::setUnshiftedResiduals");
     }
     alignTrack->setResidualVector(m_unshiftedResiduals);