diff --git a/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/CMakeLists.txt b/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/CMakeLists.txt
index b785f0cdca0a83e4820b16a7842b82ec255555cc..84db5bd6776e7eee2f49f4a8571e1457480f8a20 100644
--- a/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/CMakeLists.txt
+++ b/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/CMakeLists.txt
@@ -10,6 +10,7 @@ atlas_depends_on_subdirs( PUBLIC
                           GaudiKernel
                           PRIVATE
                           Control/AthenaBaseComps
+                          Control/CxxUtils
                           Control/StoreGate
                           Event/EventInfo
                           MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondData
@@ -23,7 +24,7 @@ atlas_add_component( CscCalibTools
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel AthenaBaseComps StoreGateLib SGtests EventInfo MuonCondData MuonCondInterface )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel AthenaBaseComps CxxUtils StoreGateLib SGtests EventInfo MuonCondData MuonCondInterface )
 
 # Install files from the package:
 atlas_install_headers( CscCalibTools )
diff --git a/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.cxx b/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.cxx
index 9caf26b6e67dd82e6c75079d31a997290b27e573..4c06aedf2eae47297ee3e3373aaec40829192b93 100644
--- a/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.cxx
+++ b/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.cxx
@@ -101,13 +101,13 @@ StatusCode CscCalibTool::initialize() {
     return StatusCode::FAILURE;
   }
 
+  m_messageCnt_t0base=0;
+  m_messageCnt_t0phase=0;
 
+  std::lock_guard<std::mutex> lock(m_mutex);
   m_addedfunc   =new TF1("addedfunc", dualbipfunc, 0,500,10);
   m_bipolarFunc =new TF1("bipolarFunc",   bipfunc, -500,500,5);
 
-  m_messageCnt_t0base=0;
-  m_messageCnt_t0phase=0;
-
   return StatusCode::SUCCESS;
 }
 
@@ -635,7 +635,8 @@ std::vector<float> CscCalibTool::getSamplesFromBipolarFunc(const double driftTim
     result.push_back(0.0);
     return result;
   }
-  
+
+  std::lock_guard<std::mutex> lock(m_mutex);
   m_bipolarFunc->SetParameters(stripCharge0, driftTime0,
                                m_integrationNumber,m_integrationNumber2,m_signalWidth);
 
@@ -670,16 +671,16 @@ std::pair<double,double> CscCalibTool::addBipfunc(const double driftTime0,
     return result;
   }
   
+  std::lock_guard<std::mutex> lock(m_mutex);
   m_addedfunc->SetParameters(stripCharge0, driftTime0,
-                           m_integrationNumber,m_integrationNumber2,m_signalWidth,
-                           stripCharge1, driftTime1,
-                           m_integrationNumber,m_integrationNumber2,m_signalWidth);
+                             m_integrationNumber,m_integrationNumber2,m_signalWidth,
+                             stripCharge1, driftTime1,
+                             m_integrationNumber,m_integrationNumber2,m_signalWidth);
   result.second =m_addedfunc->GetMaximum(); // ==>stripCharges of added bipolars
   float tmax =m_addedfunc->GetX(result.second);
   result.first = tmax - getZ0()*m_signalWidth;
 
-  if (stripCharge0>0.0 && stripCharge1>0.0)
-    return result;
+  if (stripCharge0>0.0 && stripCharge1>0.0) return result;
 
   float bipmin = m_addedfunc->GetMinimum(); // ==>stripCharges of added bipolars
   float tmin = m_addedfunc->GetX(bipmin);
@@ -687,8 +688,6 @@ std::pair<double,double> CscCalibTool::addBipfunc(const double driftTime0,
     result.first = tmin-getZ0()*m_signalWidth;
     result.second = bipmin;
   }
-    
-
   
   //  To check out conversion is correct...
   ATH_MSG_VERBOSE ( "(" << driftTime0 << ":" << int(stripCharge0) << ")"
diff --git a/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.h b/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.h
index 11ef86a45d4f927f5697150d1ce51fb2da67546f..2807228c164f99b45f8b12989c7f31774a06178d 100644
--- a/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.h
+++ b/MuonSpectrometer/MuonCalib/CscCalib/CscCalibTools/src/CscCalibTool.h
@@ -22,14 +22,16 @@
 #include "MuonCondData/CscCondDataContainer.h"
 #include "MuonCondInterface/CscICoolStrSvc.h"
 #include "CscCalibTools/ICscCalibTool.h"
+#include "CxxUtils/checker_macros.h"
 
-#include <atomic>
-#include <inttypes.h>
-#include <vector>
 #include "TMath.h"
 #include "TF1.h"
 #include "TH1.h"
 
+#include <atomic>
+#include <inttypes.h>
+#include <mutex>
+#include <vector>
 
 class CscCalibTool : public extends<AthAlgTool, ICscCalibTool> {
 
@@ -167,8 +169,9 @@ protected:
   float m_latencyInDigitization; // new in 12/2010 for New Digitization package...
 
   unsigned int m_nSamples;
-  mutable TF1* m_addedfunc;
-  mutable TF1* m_bipolarFunc;
+  mutable TF1* m_addedfunc ATLAS_THREAD_SAFE; // Guarded by m_mutex
+  mutable TF1* m_bipolarFunc ATLAS_THREAD_SAFE; // Guarded by m_mutex
+  mutable std::mutex m_mutex;
 
   bool m_onlineHLT;
   bool m_use2Samples; // for the use of only 2 samples for strip charge