diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h
index 5fe01c03c811571992e636738ac2b25c65cc3f57..e7ddd2c229b541acd69fc5f7293ead15949327af 100644
--- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h
+++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h
@@ -6,12 +6,29 @@
 
 #include "GaudiKernel/IAlgTool.h"
 #include "GeoPrimitives/GeoPrimitives.h"
+#include "Identifier/Identifier.h"
 
 #include <cmath>
 #include <vector>
 
 static const InterfaceID IID_INSWCalibTool("Muon::INSWCalibTool",1,0);
 
+namespace NSWCalib { 
+
+  struct CalibratedStrip {
+    double charge;
+    double time;
+    double resTime;
+    double distDrift;
+    double resTransDistDrift;
+    double resLongDistDrift;
+    double dx;
+    Identifier identifier;
+  };
+
+}
+
+
 namespace Muon {
 
   class MM_RawData;
@@ -23,8 +40,8 @@ namespace Muon {
     static const InterfaceID& interfaceID()  {return IID_INSWCalibTool;}
 
   public:  // interface methods
-
-    virtual StatusCode calibrate(const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, double& dist_drift, double& distRes_drift, double& calib_charge) = 0;
+    
+    virtual StatusCode calibrate(const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const = 0;
 
   };
   
diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx
index b61b4f74dc8e09c77a56b27fc409ae85da96574d..9479d6368c77f2d250cf7d20d4b21db50347bf82 100644
--- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx
+++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx
@@ -1,8 +1,11 @@
 #include "NSWCalibTool.h"
 #include "GaudiKernel/SystemOfUnits.h"
+#include "GaudiKernel/PhysicalConstants.h"
 
 namespace {
   static constexpr double const& toRad = M_PI/180;
+  static constexpr double const& pitchErr = 0.425 * 0.425 / 12;
+  static constexpr double const& reciprocalSpeedOfLight = Gaudi::Units::c_light * 1e-6; // mm/ns
 }
 
 Muon::NSWCalibTool::NSWCalibTool(const std::string& t,
@@ -15,10 +18,13 @@ Muon::NSWCalibTool::NSWCalibTool(const std::string& t,
   declareInterface<INSWCalibTool>(this);
 
   declareProperty("MagFieldSvc",   m_magFieldSvc, "Magnetic Field Service");
-  declareProperty("DriftVelocity", m_vDrift = 47., "Drift Velocity");
+  declareProperty("DriftVelocity", m_vDrift = 0.047, "Drift Velocity");
   declareProperty("TimeResolution", m_timeRes = 25., "Time Resolution");
+  declareProperty("longDiff",m_longDiff=0.019); //mm/mm
+  declareProperty("transDiff",m_transDiff=0.036); //mm/mm
+  declareProperty("ionUncertainty",m_ionUncertainty=4.0); //ns
+  declareProperty("timeOffset", m_timeOffset = 100); //ns                       
   declareProperty("MuonIdHelperTool", m_idHelperTool);
-
 }
 
 
@@ -41,29 +47,27 @@ StatusCode Muon::NSWCalibTool::initialize()
 
 }
 
-StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, double& dist_drift, double& distRes_drift, double& calib_charge)
+StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const
 {
-  double charge, time, vDriftCorrected;
-  charge = mmRawData->charge();
-  time = mmRawData->time();
+  double  vDriftCorrected;
+  calibStrip.charge = mmRawData->charge();
+  calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight + m_timeOffset;
+
+  calibStrip.identifier = mmRawData->identify();
 
   Amg::Vector3D magneticField;
-  calib_charge = charge;
 
   m_magFieldSvc->getField(&globalPos,&magneticField);
-  m_mmBFieldX = magneticField.x();
-  m_mmBFieldY = magneticField.y();
-  m_mmBFieldZ = magneticField.z();
   
   double lorentzAngle = m_lorentzAngleFunction->Eval((magneticField.y() > 0. ? 1. : -1.) * std::fabs (magneticField.y()) ) * toRad; // in radians;
 
   vDriftCorrected = m_vDrift * std::cos(lorentzAngle);
-  dist_drift = vDriftCorrected * time;
-  dist_drift =  dist_drift * Gaudi::Units::perThousand;
-  distRes_drift = vDriftCorrected * m_timeRes;
-  distRes_drift = distRes_drift * Gaudi::Units::perThousand;
+  calibStrip.distDrift = vDriftCorrected * calibStrip.time;
+  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;  
+  return StatusCode::SUCCESS;
 }
 
 
diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h
index a43d369346482d5a40a5015f23a4a727b7b4c9b5..074c2af829181affa7e47464d7004d599e8ee320 100644
--- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h
+++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h
@@ -34,7 +34,8 @@ namespace Muon {
 
     virtual ~NSWCalibTool() = default;
     
-    StatusCode calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, double& dist_drift, double& distRes_drift, double& calib_charge);
+    StatusCode calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const;
+
     virtual StatusCode initialize();
     virtual StatusCode finalize();
 
@@ -46,13 +47,13 @@ namespace Muon {
    
 
     TF1* m_lorentzAngleFunction;
- 
-    float m_mmBFieldX;
-    float m_mmBFieldY;
-    float m_mmBFieldZ;
-    
+     
     float m_vDrift;
     float m_timeRes;
+    float m_longDiff;
+    float m_transDiff;
+    float m_ionUncertainty;
+    double m_timeOffset;
   };
   
 }
diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx
index 4ee5b29f81bb30b63ff7196e032a38422c9e1235..df073ac4d0d5779c44405b49f50f068b5680a863 100644
--- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx
+++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx
@@ -184,11 +184,8 @@ StatusCode Muon::MmRdoToPrepDataTool::processCollection( const MM_RawDataCollect
       ATH_MSG_WARNING("Could not get the global strip position for MM");
       continue;
     }
-    double dist_drift, distRes_drift, charge_calib;
-    ATH_CHECK (m_calibTool->calibrate(rdo, globalPos, dist_drift, distRes_drift, charge_calib));
-
-    const int time = rdo->time();
-    const int charge = charge_calib;
+    NSWCalib::CalibratedStrip calibStrip;
+    ATH_CHECK (m_calibTool->calibrate(rdo, globalPos, calibStrip));
 
 //    const Trk::Surface& surf = detEl->surface(rdoId);
 //    const Amg::Vector3D* globalPos = surf.localToGlobal(localPos);
@@ -221,14 +218,16 @@ StatusCode Muon::MmRdoToPrepDataTool::processCollection( const MM_RawDataCollect
 // add strip width to error
     resolution = sqrt(resolution*resolution+errX*errX);
 
-    Amg::MatrixX* cov = new Amg::MatrixX(1,1);
+    Amg::MatrixX* cov = new Amg::MatrixX(2,2);
     cov->setIdentity();
-    (*cov)(0,0) = resolution*resolution;  
+    (*cov)(0,0) = calibStrip.resTransDistDrift;  
+    (*cov)(1,1) = calibStrip.resLongDistDrift;
+    localPos.x() =+ calibStrip.dx;
 
     if(!merge) {
-      prdColl->push_back(new MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, time, charge, dist_drift));
+      prdColl->push_back(new MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, calibStrip.time, calibStrip.charge, calibStrip.distDrift));
     } else {
-      MMPrepData mpd = MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, time, charge, dist_drift);
+      MMPrepData mpd = MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, calibStrip.time, calibStrip.charge, calibStrip.distDrift);
        // set the hash of the MMPrepData such that it contains the correct value in case it gets used in SimpleMMClusterBuilderTool::getClusters
        mpd.setHashAndIndex(hash,0);
        MMprds.push_back(mpd);