diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h
index b570ce5a58a2163ec45aedfebec19539d20cc843..e4bec41e8632c6af32b0c1e9a3cfe101a2aa78c3 100644
--- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h
+++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h
@@ -30,11 +30,11 @@ namespace NSWCalib {
   };
 
 }
-
-
+ 
 namespace Muon {
 
   class MM_RawData;
+  class MMPrepData;
 
   class INSWCalibTool : virtual public IAlgTool {
     
@@ -44,8 +44,9 @@ namespace Muon {
 
   public:  // interface methods
     
-    virtual StatusCode calibrate(const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const = 0;
-
+    virtual StatusCode calibrateClus(const Muon::MMPrepData* prepData, const Amg::Vector3D& globalPos, std::vector<NSWCalib::CalibratedStrip>& calibClus) const = 0;
+    virtual StatusCode calibrateStrip(const Muon::MM_RawData* mmRawData, NSWCalib::CalibratedStrip& calibStrip) const = 0;
+    virtual StatusCode calibrateStrip(const double time,  const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip&calibStrip) const = 0;
     virtual StatusCode mmGasProperties(float &vDrift, float &longDiff, float &transDiff, float &interactionDensityMean, float &interactionDensitySigma, TF1* &lorentzAngleFunction) const = 0;
   };
   
diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx
index 69b1eb1176af2657ab54b6a245f8d59499a25e04..e062ad50ba94e0c86e717aa0fca9488b1e07ffd2 100644
--- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx
+++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx
@@ -5,7 +5,7 @@
 #include "NSWCalibTool.h"
 #include "GaudiKernel/SystemOfUnits.h"
 #include "GaudiKernel/PhysicalConstants.h"
-
+#include "MuonReadoutGeometry/MMReadoutElement.h"
 
 namespace {
   static constexpr double const& toRad = M_PI/180;
@@ -35,9 +35,7 @@ namespace {
 
 }
 
-Muon::NSWCalibTool::NSWCalibTool(const std::string& t,
-				  const std::string& n, 
-				  const IInterface* p ) :
+Muon::NSWCalibTool::NSWCalibTool(const std::string& t, const std::string& n, const IInterface* p) :
   AthAlgTool(t,n,p)
 {
   declareInterface<INSWCalibTool>(this);
@@ -54,7 +52,6 @@ Muon::NSWCalibTool::NSWCalibTool(const std::string& t,
 
 StatusCode Muon::NSWCalibTool::initialize()
 {
-
   ATH_MSG_DEBUG("In initialize()");
   ATH_CHECK(m_idHelperSvc.retrieve());
   if ( !(m_idHelperSvc->hasMM() && m_idHelperSvc->hasSTgc() ) ) {
@@ -62,6 +59,7 @@ StatusCode Muon::NSWCalibTool::initialize()
     return StatusCode::FAILURE;
   }
   ATH_CHECK(m_fieldCondObjInputKey.initialize());
+  ATH_CHECK(m_muDetMgrKey.initialize());
   ATH_CHECK(initializeGasProperties());
   return StatusCode::SUCCESS;
 }
@@ -86,14 +84,7 @@ StatusCode Muon::NSWCalibTool::initializeGasProperties() {
   return StatusCode::SUCCESS;
 }
 
-StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const
-{
-
-  double  vDriftCorrected;
-  calibStrip.charge = mmRawData->charge();
-  calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight + m_timeOffset;
-
-  calibStrip.identifier = mmRawData->identify();
+StatusCode Muon::NSWCalibTool::calibrateClus(const Muon::MMPrepData* prepData, const Amg::Vector3D& globalPos, std::vector<NSWCalib::CalibratedStrip>& calibClus) const {
 
   /// magnetic field
   MagField::AtlasFieldCache fieldCache;
@@ -104,7 +95,6 @@ StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, con
     return StatusCode::FAILURE;
   }
   fieldCondObj->getInitializedCache(fieldCache);
-
   Amg::Vector3D magneticField;
   fieldCache.getField(globalPos.data(), magneticField.data());
 
@@ -113,26 +103,66 @@ StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, con
   double bfield = (magneticField.x()*std::sin(phi)-magneticField.y()*std::cos(phi))*1000.;
 
   /// swap sign depending on the readout side
-  int gasGap = m_idHelperSvc->mmIdHelper().gasGap(mmRawData->identify());
+  int gasGap = m_idHelperSvc->mmIdHelper().gasGap(prepData->identify());
   bool changeSign = ( globalPos.z() > 0. ? (gasGap==1 || gasGap==3) : (gasGap==2 || gasGap==4) );
   if (changeSign) bfield = -bfield;
 
-  /// sign of the lorentz angle matches digitization - angle is in radians
+  //// sign of the lorentz angle matches digitization - angle is in radians
   double lorentzAngle = (bfield>0. ? 1. : -1.)*m_lorentzAngleFunction->Eval(std::abs(bfield)) * toRad;
 
-  vDriftCorrected = m_vDrift * std::cos(lorentzAngle);
+  /// loop over prepData strips
+  for (unsigned int i = 0; i < prepData->stripNumbers().size(); i++){
+    double time = prepData->stripTimes().at(i);
+    double charge = prepData->stripCharges().at(i);
+    NSWCalib::CalibratedStrip calibStrip;
+    ATH_CHECK(calibrateStrip(time, charge, lorentzAngle, calibStrip));
+    calibClus.push_back(calibStrip);
+  }
+  return StatusCode::SUCCESS;
+}
+
+StatusCode Muon::NSWCalibTool::calibrateStrip(const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip& calibStrip) const {
+  calibStrip.charge = charge;
+  calibStrip.time = time;
+
+  double vDriftCorrected = m_vDrift * std::cos(lorentzAngle);
   calibStrip.distDrift = vDriftCorrected * calibStrip.time;
 
   /// transversal and longitudinal components of the resolution
-  calibStrip.resTransDistDrift = pitchErr + std::pow(m_transDiff * calibStrip.distDrift, 2); 
-  calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * vDriftCorrected, 2) 
+  calibStrip.resTransDistDrift = pitchErr + std::pow(m_transDiff * calibStrip.distDrift, 2);
+  calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * vDriftCorrected, 2)
     + std::pow(m_longDiff * calibStrip.distDrift, 2);
-  
   calibStrip.dx = std::sin(lorentzAngle) * calibStrip.time * m_vDrift;
-
   return StatusCode::SUCCESS;
 }
 
+StatusCode Muon::NSWCalibTool::calibrateStrip(const Muon::MM_RawData* mmRawData, NSWCalib::CalibratedStrip& calibStrip) const
+{
+  Identifier rdoId = mmRawData->identify();
+
+  // @TODO: for the shifter: this code will be used as soon as the NSW is built in the MuonDetectorCondAlg
+  // for now, we will need to use the nominal manager from the detectorStore to run
+  // SG::ReadCondHandle<MuonGM::MuonDetectorManager> muDetMgrHandle{m_muDetMgrKey};
+  // const MuonGM::MuonDetectorManager* muDetMgr = muDetMgrHandle.cptr();
+  const MuonGM::MuonDetectorManager* muDetMgr=nullptr;
+  ATH_CHECK(detStore()->retrieve(muDetMgr));
+
+  //get globalPos
+  Amg::Vector3D globalPos;
+  const MuonGM::MMReadoutElement* detEl = muDetMgr->getMMReadoutElement(rdoId);
+  detEl->stripGlobalPosition(rdoId,globalPos);
+
+  calibStrip.charge = mmRawData->charge();
+  calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight + m_timeOffset;
+  calibStrip.identifier = mmRawData->identify();
+
+  calibStrip.distDrift = m_vDrift * calibStrip.time;
+  calibStrip.resTransDistDrift = pitchErr + std::pow(m_transDiff * calibStrip.distDrift, 2);
+  calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * m_vDrift, 2)
+    + std::pow(m_longDiff * calibStrip.distDrift, 2);
+
+  return StatusCode::SUCCESS;
+}
 
 StatusCode Muon::NSWCalibTool::finalize()
 {
@@ -150,4 +180,4 @@ StatusCode Muon::NSWCalibTool::mmGasProperties(float &vDrift, float &longDiff, f
   interactionDensitySigma = m_interactionDensitySigma;
   lorentzAngleFunction = m_lorentzAngleFunction;
   return StatusCode::SUCCESS;
-}
\ No newline at end of file
+}
diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h
index 6abecefb29e8e36b94c3d8a52b6c5aaffa571eb0..8dfae42011729524a23dbb88fc7f4e285638c9c5 100644
--- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h
+++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h
@@ -16,6 +16,7 @@
 #include "MuonPrepRawData/MMPrepData.h"
 #include "MuonRDO/MM_RawData.h"
 #include "StoreGate/ReadCondHandleKey.h"
+#include "MuonReadoutGeometry/MuonDetectorManager.h"
 #include "MagFieldConditions/AtlasFieldCacheCondObj.h"
 
 #include "TRandom3.h"
@@ -31,7 +32,9 @@ namespace Muon {
 
     virtual ~NSWCalibTool() = default;
     
-    virtual StatusCode calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const override;
+    StatusCode calibrateClus(const Muon::MMPrepData* prepData, const Amg::Vector3D& globalPos, std::vector<NSWCalib::CalibratedStrip>& calibClus) const;
+    StatusCode calibrateStrip(const double time,  const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip& calibStrip) const;
+    StatusCode calibrateStrip(const Muon::MM_RawData* mmRawData, NSWCalib::CalibratedStrip& calibStrip) const;
 
     virtual StatusCode initialize() override;
     virtual StatusCode finalize() override;
@@ -41,6 +44,8 @@ namespace Muon {
 
     ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
     SG::ReadCondHandleKey<AtlasFieldCacheCondObj> m_fieldCondObjInputKey {this, "AtlasFieldCacheCondObj", "fieldCondObj"};
+    SG::ReadCondHandleKey<MuonGM::MuonDetectorManager> m_muDetMgrKey {this, "DetectorManagerKey", "MuonDetectorManager", "Key of input MuonDetectorManager condition data"}; 
+
     StatusCode initializeGasProperties();
 
     TF1* m_lorentzAngleFunction;
diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx
index 9c714838d2aa30dd06319b5acae8cd4ca2b620d6..b385a199b2b567ed2deb92e43db00dbc2a47e679 100644
--- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx
+++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx
@@ -143,7 +143,7 @@ StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(const MM_RawDataColl
       continue;
     }
     NSWCalib::CalibratedStrip calibStrip;
-    ATH_CHECK (m_calibTool->calibrate(rdo, globalPos, calibStrip));
+    ATH_CHECK (m_calibTool->calibrateStrip(rdo, calibStrip));
 
     const Amg::Vector3D globalDir(globalPos.x(), globalPos.y(), globalPos.z());
     Trk::LocalDirection localDir;