diff --git a/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/MuonAlignment.py b/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/MuonAlignment.py
index f0bc736841f4e5db0a4fe5700db9b57aac0537b8..feb9fb19de0ba274f9c650eb3fc5213bfb4d07be 100644
--- a/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/MuonAlignment.py
+++ b/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/MuonAlignment.py
@@ -39,10 +39,12 @@ if 'errorScaleDb' in dir() and errorScaleDb!='':
     MdtDriftCircleOnTrackCreator.OutputLevel = align.OutputLevel()
     MdtDriftCircleOnTrackCreator.ErrorScalingTool=muonErrorScalingTool
     
-    CscClusterOnTrackCreator = MuonRecTools.getPublicTool("CscClusterOnTrackCreator")
-    CscClusterOnTrackCreator.DoErrorScaling = True
-    CscClusterOnTrackCreator.OutputLevel = align.OutputLevel()
-    CscClusterOnTrackCreator.ErrorScalingTool=muonErrorScalingTool
+    from AtlasGeoModel.MuonGMJobProperties import MuonGeometryFlags
+    if MuonGeometryFlags.hasCSC():
+        CscClusterOnTrackCreator = MuonRecTools.getPublicTool("CscClusterOnTrackCreator")
+        CscClusterOnTrackCreator.DoErrorScaling = True
+        CscClusterOnTrackCreator.OutputLevel = align.OutputLevel()
+        CscClusterOnTrackCreator.ErrorScalingTool=muonErrorScalingTool
     
     MuonClusterOnTrackCreator = MuonRecTools.getPublicTool("MuonClusterOnTrackCreator")
     MuonClusterOnTrackCreator.DoErrorScaling = True
diff --git a/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/muonErrorScaling.py b/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/muonErrorScaling.py
index f54e1283031b84a3ed51ad09a6a1723a8710894c..22ec5a120649cff9d1afb5867574a9f1425d8019 100644
--- a/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/muonErrorScaling.py
+++ b/MuonSpectrometer/MuonAlignment/MuonAlignExample/share/muonErrorScaling.py
@@ -20,13 +20,15 @@ MdtDriftCircleOnTrackCreator.DoErrorScaling = True
 MdtDriftCircleOnTrackCreator.ScaleErrorsManually=False
 MdtDriftCircleOnTrackCreator.OutputLevel = outputLevel
 MdtDriftCircleOnTrackCreator.ErrorScalingTool=muonErrorScalingTool
-    
-CscClusterOnTrackCreator = MuonRecTools.getPrivateTool("CscClusterOnTrackCreator")
-CscClusterOnTrackCreator.DoRpcErrorScaling = True
-CscClusterOnTrackCreator.DoTgcErrorScaling = True
-CscClusterOnTrackCreator.DoCscErrorScaling = True
-CscClusterOnTrackCreator.OutputLevel = outputLevel
-CscClusterOnTrackCreator.ErrorScalingTool=muonErrorScalingTool
+
+from AtlasGeoModel.MuonGMJobProperties import MuonGeometryFlags
+if MuonGeometryFlags.hasCSC():
+    CscClusterOnTrackCreator = MuonRecTools.getPrivateTool("CscClusterOnTrackCreator")
+    CscClusterOnTrackCreator.DoRpcErrorScaling = True
+    CscClusterOnTrackCreator.DoTgcErrorScaling = True
+    CscClusterOnTrackCreator.DoCscErrorScaling = True
+    CscClusterOnTrackCreator.OutputLevel = outputLevel
+    CscClusterOnTrackCreator.ErrorScalingTool=muonErrorScalingTool
     
 MuonClusterOnTrackCreator = MuonRecTools.getPublicTool("MuonClusterOnTrackCreator")
 MuonClusterOnTrackCreator.DoRpcErrorScaling = True
diff --git a/MuonSpectrometer/MuonCalib/MuonCalibAlgs/MuonCalibAlgs/MuonCalibAlg.h b/MuonSpectrometer/MuonCalib/MuonCalibAlgs/MuonCalibAlgs/MuonCalibAlg.h
index 74b55b4254d764c44d257fa6f379c931476dcf15..ef5f364e3380d051080d92626aea884bae214adc 100644
--- a/MuonSpectrometer/MuonCalib/MuonCalibAlgs/MuonCalibAlgs/MuonCalibAlg.h
+++ b/MuonSpectrometer/MuonCalib/MuonCalibAlgs/MuonCalibAlgs/MuonCalibAlg.h
@@ -2,18 +2,16 @@
   Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-
 #ifndef MUONCALIB_MUONCALIBALG_H
 #define MUONCALIB_MUONCALIBALG_H
 
 #include "AthenaBaseComps/AthAlgorithm.h"
 #include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
 
 #include "MuonCalibEventBase/MuonCalibEvent.h"
 #include "MuonPrdSelector/MuonIdCutTool.h"
-#include "MuonIdHelpers/MuonIdHelperTool.h"
-
-class MdtIdHelper;
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 
 class ICscStripFitter;
 
@@ -116,13 +114,10 @@ namespace MuonCalib {
     // time samples and extract strip charge
     ToolHandle<ICscStripFitter> m_stripFitter;
 
-
     // Tool to cut on identifiers
     ToolHandle<IMuonIdCutTool> m_muonIdCutTool;
    
-    /* Tool for Identifier Helpers */
-    ToolHandle<Muon::MuonIdHelperTool> m_muonIdHelperTool{this, "idHelper", 
-      "Muon::MuonIdHelperTool/MuonIdHelperTool", "Handle to the MuonIdHelperTool"};
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
 
     std::vector <const MuonCalibEvent*> m_events;         //!< vector holding pointers to events, for deletion at finalize
 
diff --git a/MuonSpectrometer/MuonCalib/MuonCalibAlgs/src/MuonCalibAlg.cxx b/MuonSpectrometer/MuonCalib/MuonCalibAlgs/src/MuonCalibAlg.cxx
index 103a59a357647b52fc3e1fcb250a928cd90b5fe0..e39d5f532f7bf7ca9ae266820b9f11f4306490ae 100644
--- a/MuonSpectrometer/MuonCalib/MuonCalibAlgs/src/MuonCalibAlg.cxx
+++ b/MuonSpectrometer/MuonCalib/MuonCalibAlgs/src/MuonCalibAlg.cxx
@@ -122,7 +122,7 @@ namespace MuonCalib {
     declareProperty("doMDTs", m_doMDTs = true );
     
     declareProperty("doCSCs", m_doCSCs = true );
-    //declareProperty("CSCStripFitter", m_stripFitter);
+    declareProperty("CSCStripFitter", m_stripFitter);
 
     declareProperty("doRPCs", m_doRPCs = true );
     declareProperty("doTGCs", m_doTGCs = true );
@@ -138,8 +138,6 @@ namespace MuonCalib {
   }
   
   MuonCalibAlg::~MuonCalibAlg() {
-    // close root file 
-//    if( m_createRootFile ) RootFileManager::getInstance()->closeFile();
   }
 
   StatusCode MuonCalibAlg::initialize()
@@ -162,32 +160,22 @@ namespace MuonCalib {
 
     log << MSG::INFO << "================================" << endmsg;
 
-    StatusCode sc = m_stripFitter.retrieve();
-    if ( sc.isFailure() ) {
-      log << MSG::FATAL <<  "MuonCalibAlg: Unable to retrieve strip fitter" << endmsg;
-      return sc;
-    } else {
-      log << MSG::INFO << "CSCStripFitter      : " << "Using Fitter with name \"" << m_stripFitter->name() << "\"" << endmsg;
-    }
+    ATH_CHECK(m_idHelperSvc.retrieve());
 
+    if (!m_stripFitter.empty()) {
+      if (!m_idHelperSvc->hasCSC()) ATH_MSG_WARNING("The current layout does not have any CSC chamber but you gave a CSCStripFitter, ignoring it, but double-check configuration");
+      else ATH_CHECK( m_stripFitter.retrieve() );
+    }
+    if (m_doCSCs && !m_idHelperSvc->hasCSC()) {
+      ATH_MSG_WARNING("The current layout does not have any CSC chamber but you have set doCSCs to true, setting it to false, but double-check configuration");
+      m_doCSCs = false;
+    }
 
     m_eventNumber = 0;
 
-    sc = m_idToFixedIdTool.retrieve();
-    if (sc.isFailure()) {
-      log << MSG::FATAL << "Could not find tool " << m_idToFixedIdTool << endmsg;
-      return sc;
-    } else {
-      log << MSG::INFO << "Retrieved tool " << m_idToFixedIdTool << endmsg;
-    }
+    ATH_CHECK( m_idToFixedIdTool.retrieve() );
 
-    sc = m_muonIdCutTool.retrieve();
-    if (sc.isFailure()) {
-      log << MSG::FATAL << "Could not find tool " << m_muonIdCutTool << endmsg;
-      return sc;
-    } else {
-      log << MSG::INFO << "Retrieved tool " << m_muonIdCutTool << endmsg;
-    }    
+    ATH_CHECK( m_muonIdCutTool.retrieve() );
 
     // retrieve TileTBID helper 
     // (The MBTS was added to the Test Beam (TB) list.)
@@ -198,16 +186,11 @@ namespace MuonCalib {
     
     // retrieve MuonDetectorManager
     std::string managerName="Muon";
-    sc=detStore()->retrieve(m_detMgr);
-    if (sc.isFailure()) {
+    if (detStore()->retrieve(m_detMgr).isFailure()) {
       log << MSG::INFO << "Could not find the MuonGeoModel Manager: "
 	  << managerName << " ! " << endmsg;
     } 
-  
-    // initialize MuonIdHelperTool
-    ATH_CHECK( m_muonIdHelperTool.retrieve() );
 
-    
     log << MSG::INFO << "Initialization ended     " << endmsg;
     return StatusCode::SUCCESS;
   }
@@ -817,7 +800,7 @@ namespace MuonCalib {
 		  const MuonGM::CscReadoutElement* detEl = m_detMgr->getCscReadoutElement(id);
 		  if( !detEl ){
 		    log << MSG::WARNING << "Found CSC Identifier which seems to have no readout element " 
-			<< m_muonIdHelperTool->mdtIdHelper().print_to_string(id) << endmsg;
+			<< m_idHelperSvc->mdtIdHelper().print_to_string(id) << endmsg;
 		    continue;
 		  }
 		  MuonFixedId mfi = m_idToFixedIdTool->idToFixedId(id);
@@ -1261,8 +1244,8 @@ namespace MuonCalib {
         // time of first sample is not very useful. we need fitted time
         // invoke fitter first and then set the time
 	    //rawCscHit->setT( (*csc_it)->timeOfFirstSample() );
-	    int measuresPhi    = m_muonIdHelperTool->cscIdHelper().measuresPhi((*csc_it)->identify());
-	    int chamberLayer   = m_muonIdHelperTool->cscIdHelper().chamberLayer((*csc_it)->identify());
+	    int measuresPhi    = m_idHelperSvc->cscIdHelper().measuresPhi((*csc_it)->identify());
+	    int chamberLayer   = m_idHelperSvc->cscIdHelper().chamberLayer((*csc_it)->identify());
 	    float stripWidth   = (*csc_it)->detectorElement()->cathodeReadoutPitch( chamberLayer, measuresPhi );
 	    rawCscHit->setWidth( stripWidth );
         // invoke the strip fitter to fit the time samples (which is a vector of 4 elements)
@@ -1323,9 +1306,9 @@ namespace MuonCalib {
 	    for( ; tgc_it!=tgc_it_end; ++ tgc_it){
 	      MuonCalibRawTgcHit* rawTgcHit = new MuonCalibRawTgcHit();      
 	      MuonFixedId fID = m_idToFixedIdTool->idToFixedId( (*tgc_it)->identify() ) ; 
-	      bool measuresPhi = (bool) m_muonIdHelperTool->tgcIdHelper().isStrip((*tgc_it)->identify());
-	      int gasGap = m_muonIdHelperTool->tgcIdHelper().gasGap((*tgc_it)->identify());
-	      int channel = m_muonIdHelperTool->tgcIdHelper().channel((*tgc_it)->identify());
+	      bool measuresPhi = (bool) m_idHelperSvc->tgcIdHelper().isStrip((*tgc_it)->identify());
+	      int gasGap = m_idHelperSvc->tgcIdHelper().gasGap((*tgc_it)->identify());
+	      int channel = m_idHelperSvc->tgcIdHelper().channel((*tgc_it)->identify());
 	      
 	      const MuonGM::TgcReadoutElement* detEl = (*tgc_it)->detectorElement();
 	      double width       = -999.;
@@ -1346,9 +1329,9 @@ namespace MuonCalib {
 	      
 	      rawTgcHit->setId( fID );
 	      rawTgcHit->setGlobalPosition( (*tgc_it)->globalPosition() );
-	      rawTgcHit->setStation( m_muonIdHelperTool->tgcIdHelper().stationName((*tgc_it)->identify()) );
-	      rawTgcHit->setEta( m_muonIdHelperTool->tgcIdHelper().stationEta((*tgc_it)->identify()) );
-	      rawTgcHit->setPhi( m_muonIdHelperTool->tgcIdHelper().stationPhi((*tgc_it)->identify()) );
+	      rawTgcHit->setStation( m_idHelperSvc->tgcIdHelper().stationName((*tgc_it)->identify()) );
+	      rawTgcHit->setEta( m_idHelperSvc->tgcIdHelper().stationEta((*tgc_it)->identify()) );
+	      rawTgcHit->setPhi( m_idHelperSvc->tgcIdHelper().stationPhi((*tgc_it)->identify()) );
 	      rawTgcHit->setGasGap( gasGap );
 	      rawTgcHit->setIsStrip( static_cast<int>(measuresPhi) ); 
 	      rawTgcHit->setChannel( channel );
@@ -1429,7 +1412,7 @@ namespace MuonCalib {
 		rawTgcCoin->setGlobalPositionIn((*tgcCoin_it)->globalposIn());
 		rawTgcCoin->setGlobalPositionOut((*tgcCoin_it)->globalposOut());
 		rawTgcCoin->setType(0);
-		rawTgcCoin->setEta(m_muonIdHelperTool->tgcIdHelper().stationEta((*tgcCoin_it)->identify()));
+		rawTgcCoin->setEta(m_idHelperSvc->tgcIdHelper().stationEta((*tgcCoin_it)->identify()));
 		rawTgcCoin->setPhi((*tgcCoin_it)->phi());
 		rawTgcCoin->setSector(sector);
 		rawTgcCoin->setIsForward(static_cast<int>((*tgcCoin_it)->isForward()));
@@ -1450,7 +1433,7 @@ namespace MuonCalib {
 		rawTgcCoin->setGlobalPositionIn((*tgcCoin_it)->globalposIn());
 		rawTgcCoin->setGlobalPositionOut((*tgcCoin_it)->globalposOut());
 		rawTgcCoin->setType(1);
-		rawTgcCoin->setEta(m_muonIdHelperTool->tgcIdHelper().stationEta((*tgcCoin_it)->identify()));
+		rawTgcCoin->setEta(m_idHelperSvc->tgcIdHelper().stationEta((*tgcCoin_it)->identify()));
 		rawTgcCoin->setPhi((*tgcCoin_it)->phi());
 		rawTgcCoin->setSector(sector);
 		rawTgcCoin->setIsForward(static_cast<int>((*tgcCoin_it)->isForward()));
@@ -1472,7 +1455,7 @@ namespace MuonCalib {
 		rawTgcCoin->setGlobalPositionIn(tmp);
 		rawTgcCoin->setGlobalPositionOut((*tgcCoin_it)->globalposOut());
 		rawTgcCoin->setType(2);
-		rawTgcCoin->setEta(m_muonIdHelperTool->tgcIdHelper().stationEta((*tgcCoin_it)->identify()));
+		rawTgcCoin->setEta(m_idHelperSvc->tgcIdHelper().stationEta((*tgcCoin_it)->identify()));
 		rawTgcCoin->setPhi((*tgcCoin_it)->phi());
 		rawTgcCoin->setSector(sector);
 		rawTgcCoin->setIsForward(static_cast<int>((*tgcCoin_it)->isForward()));
@@ -1684,8 +1667,8 @@ namespace MuonCalib {
     rawRpcHit->setT( prd.time() );
     // get detector element
     const MuonGM::RpcReadoutElement* detEl = prd.detectorElement();
-    rawRpcHit->setWidth( detEl->StripWidth( m_muonIdHelperTool->rpcIdHelper().measuresPhi(prd.identify()) ) );
-    rawRpcHit->setLength( detEl->StripLength(m_muonIdHelperTool->rpcIdHelper().measuresPhi(prd.identify())));
+    rawRpcHit->setWidth( detEl->StripWidth( m_idHelperSvc->rpcIdHelper().measuresPhi(prd.identify()) ) );
+    rawRpcHit->setLength( detEl->StripLength(m_idHelperSvc->rpcIdHelper().measuresPhi(prd.identify())));
     return rawRpcHit;
   }
   
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.cxx b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.cxx
index 5021d3cfbeabdb394dd7f134752aa3f8b71c343e..ae2974c2b95f83bfbd046b2214379beb9e1ae7b8 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.cxx
@@ -1,18 +1,10 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-
-
-///////////////////////////////////////////////////////////////////
-//   Implementation file for class CscClusterOnTrackCreator
-///////////////////////////////////////////////////////////////////
-// (c) ATLAS Detector software
 ///////////////////////////////////////////////////////////////////
 // AlgTool used for MuonClusterOnTrack object production
 ///////////////////////////////////////////////////////////////////
-// Version 1.0 20/07/2004
-///////////////////////////////////////////////////////////////////
 
 #include "CscClusterOnTrackCreator.h"
 #include "TrkEventPrimitives/LocalParameters.h"
@@ -35,9 +27,6 @@
 
 #include "TrkRIO_OnTrack/check_cast.h"
 
-using std::vector;
-using std::setw;
-using std::atan2;
 using Muon::CscStripPrepDataContainer;
 using Muon::CscStripPrepDataCollection;
 using Muon::CscStripPrepData;
@@ -90,9 +79,12 @@ namespace Muon {
 	return StatusCode::FAILURE;
     }
 
-    ATH_CHECK( m_muonIdHelperTool.retrieve() );
+    ATH_CHECK( m_idHelperSvc.retrieve() );
 
-    // -- check this, maybe the helpers are not necessary after all.
+    if (!m_idHelperSvc->hasCSC()) {
+      ATH_MSG_ERROR("The given detector layout does not contain any CSC chamber, there must be something wrong in the configuration, since the CscClusterOnTrackCreator cannot be needed.");
+      return StatusCode::FAILURE;
+    }
 
     // get error scaling tool
     //
@@ -189,28 +181,28 @@ namespace Muon {
     Amg::MatrixX  loce = RIO.localCovariance();
 
     if ( m_doCsc
-         && m_muonIdHelperTool->cscIdHelper().is_csc(RIO.identify())
+         && m_idHelperSvc->cscIdHelper().is_csc(RIO.identify())
          && !m_cscErrorScalingKey.key().empty()) {
       SG::ReadCondHandle<RIO_OnTrackErrorScaling> error_scaling( m_cscErrorScalingKey );
       loce = check_cast<MuonEtaPhiRIO_OnTrackErrorScaling>(*error_scaling)->getScaledCovariance( loce, Trk::distPhi);
       ATH_MSG_VERBOSE ( "CSC: new cov(0,0) is " << loce(0,0) );
     }
     if ( m_doRpc
-	 && m_muonIdHelperTool->rpcIdHelper().is_rpc(RIO.identify())
+	 && m_idHelperSvc->rpcIdHelper().is_rpc(RIO.identify())
 	 && !m_rpcErrorScalingKey.key().empty()) {
       SG::ReadCondHandle<RIO_OnTrackErrorScaling> error_scaling( m_rpcErrorScalingKey );
       loce = check_cast<MuonEtaPhiRIO_OnTrackErrorScaling>(*error_scaling)->getScaledCovariance( loce, Trk::distPhi);
       ATH_MSG_VERBOSE ( "RPC: new cov(0,0) is " << loce(0,0) );
     }
     if ( m_doTgc
-	 && m_muonIdHelperTool->tgcIdHelper().is_tgc(RIO.identify())
+	 && m_idHelperSvc->tgcIdHelper().is_tgc(RIO.identify())
 	 && !m_tgcErrorScalingKey.key().empty() ) {
       SG::ReadCondHandle<RIO_OnTrackErrorScaling> error_scaling( m_tgcErrorScalingKey );
       loce = check_cast<MuonEtaPhiRIO_OnTrackErrorScaling>(*error_scaling)->getScaledCovariance( loce, Trk::distPhi);
       ATH_MSG_VERBOSE ( "TGC: new cov(1,1) is " << loce(0,0) );
     }
 
-    if(  m_doRpc && m_muonIdHelperTool->rpcIdHelper().is_rpc(RIO.identify()) ){
+    if(  m_doRpc && m_idHelperSvc->rpcIdHelper().is_rpc(RIO.identify()) ){
       // cast to RpcPrepData
       const RpcPrepData* MClus   = dynamic_cast<const RpcPrepData*> (&RIO);
       if (!MClus) {
@@ -219,7 +211,7 @@ namespace Muon {
       }
       MClT = new RpcClusterOnTrack(MClus,locpar,loce,positionAlongStrip);
 
-    }else if( m_doTgc && m_muonIdHelperTool->tgcIdHelper().is_tgc(RIO.identify()) ){
+    }else if( m_doTgc && m_idHelperSvc->tgcIdHelper().is_tgc(RIO.identify()) ){
       
       // cast to TgcPrepData
       const TgcPrepData* MClus   = dynamic_cast<const TgcPrepData*> (&RIO);
@@ -229,11 +221,11 @@ namespace Muon {
       }
 
       // calculation of 2D error matrix for TGC phi strips
-      if ( m_muonIdHelperTool->tgcIdHelper().isStrip(RIO.identify())){
+      if ( m_idHelperSvc->tgcIdHelper().isStrip(RIO.identify())){
 
-	int stationeta=m_muonIdHelperTool->tgcIdHelper().stationEta(RIO.identify());
-	int stripNo = m_muonIdHelperTool->tgcIdHelper().channel(RIO.identify());
-	int gasGap = m_muonIdHelperTool->tgcIdHelper().gasGap(RIO.identify());
+	int stationeta=m_idHelperSvc->tgcIdHelper().stationEta(RIO.identify());
+	int stripNo = m_idHelperSvc->tgcIdHelper().channel(RIO.identify());
+	int gasGap = m_idHelperSvc->tgcIdHelper().gasGap(RIO.identify());
 
 	const MuonGM::TgcReadoutElement *ele= MClus->detectorElement();
 
@@ -248,22 +240,22 @@ namespace Muon {
 	}
 	Amg::MatrixX mat = Amg::MatrixX(2,2);
 	
-	double phistereo=atan2(localX2-localX1,stripLength); 
-	double Sn      = sin(phistereo); 
+	double phistereo=std::atan2(localX2-localX1,stripLength); 
+	double Sn      = std::sin(phistereo); 
 	double Sn2     = Sn*Sn;
 	double Cs2     = 1.-Sn2;
 	
 	double V0      = stripWidth*stripWidth/12;
 	double V1      = stripLength*stripLength/12;
 	mat(0,0) = (Cs2*V0+Sn2*V1);
-	mat.fillSymmetric(1,0,(Sn*sqrt(Cs2)*(V0-V1)));
+	mat.fillSymmetric(1,0,(Sn*std::sqrt(Cs2)*(V0-V1)));
 	mat(1,1) = (Sn2*V0+Cs2*V1);
 	loce=mat;
       }
           
       MClT = new TgcClusterOnTrack(MClus,locpar,loce,positionAlongStrip);
 
-    } else if ( m_doCsc && m_muonIdHelperTool->cscIdHelper().is_csc(RIO.identify()) ){
+    } else if ( m_doCsc && m_idHelperSvc->cscIdHelper().is_csc(RIO.identify()) ){
       
       // cast to CscPrepData
       const CscPrepData* MClus   = dynamic_cast<const CscPrepData*> (&RIO);
@@ -286,7 +278,7 @@ namespace Muon {
   createRIO_OnTrack(const Trk::PrepRawData& RIO, const Amg::Vector3D& GP,
                     const Amg::Vector3D& GD) const {
 
-    if ( ! ( m_doCsc && m_muonIdHelperTool->cscIdHelper().is_csc(RIO.identify()) ) ) {
+    if ( ! ( m_doCsc && m_idHelperSvc->cscIdHelper().is_csc(RIO.identify()) ) ) {
       ATH_MSG_WARNING ( "CscClusterOnTrackCreator::createRIO_OnTrack is called by the other muon tech" );
       return 0;
     }
@@ -310,7 +302,7 @@ namespace Muon {
     // in RIO_OnTrack the local param and cov should have the same dimension
     Trk::LocalParameters locpar = Trk::LocalParameters (RIO.localPosition ());
     if (RIO.localCovariance().cols() > 1 || 
-	(m_muonIdHelperTool->tgcIdHelper().is_tgc(RIO.identify()) && m_muonIdHelperTool->tgcIdHelper().isStrip(RIO.identify()))) {
+	(m_idHelperSvc->tgcIdHelper().is_tgc(RIO.identify()) && m_idHelperSvc->tgcIdHelper().isStrip(RIO.identify()))) {
       ATH_MSG_VERBOSE ( "Making 2-dim local parameters" );
     } else {
       Trk::DefinedParameter  radiusPar(RIO.localPosition().x(),Trk::locX);
@@ -334,7 +326,7 @@ namespace Muon {
     Amg::MatrixX  loce = RIO.localCovariance();
     
     if ( m_doCsc 
-	 && m_muonIdHelperTool->cscIdHelper().is_csc(RIO.identify())
+	 && m_idHelperSvc->cscIdHelper().is_csc(RIO.identify())
          && !m_cscErrorScalingKey.key().empty()) {
       SG::ReadCondHandle<RIO_OnTrackErrorScaling> error_scaling( m_cscErrorScalingKey );
       loce = check_cast<MuonEtaPhiRIO_OnTrackErrorScaling>(*error_scaling)->getScaledCovariance( loce, Trk::distPhi);
@@ -384,7 +376,7 @@ namespace Muon {
       //                                   + m_errorScaler*m_errorScaler*res0.dposition*res0.dposition); 
       // v1 scaling up total uncertainty and add up misalignment term....like sqrt( sigma_nominal^2 * alpha^2 + beta^2)
       double nominal_error = res.dposition;
-      double errorCorrected = sqrt( nominal_error*nominal_error*m_errorScaler*m_errorScaler + m_errorScalerBeta*m_errorScalerBeta);
+      double errorCorrected = std::sqrt( nominal_error*nominal_error*m_errorScaler*m_errorScaler + m_errorScalerBeta*m_errorScalerBeta);
       if( errorCorrected < m_minimumError ) errorCorrected = m_minimumError;
 
       Amg::MatrixX newloce( Amg::MatrixX(1,1) );
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.h b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.h
index 49d7c787efd0368e587d68e52f7476e252efa6fe..2b447caf07e05750180115eafd2748efa2254502 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/CscClusterOnTrackCreator.h
@@ -1,16 +1,10 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-///////////////////////////////////////////////////////////////////
-//  Header file for class  CscClusterOnTrackCreator
-///////////////////////////////////////////////////////////////////
-// (c) ATLAS Detector software
 ///////////////////////////////////////////////////////////////////
 // Interface for CscClusterOnTrack production
 ///////////////////////////////////////////////////////////////////
-// Version 1.0 20/07/2004 
-///////////////////////////////////////////////////////////////////
 
 #ifndef CscClusterOnTrackCreator_H
 #define CscClusterOnTrackCreator_H
@@ -18,6 +12,7 @@
 
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
 #include "MuonRecToolInterfaces/ICscClusterOnTrackCreator.h"
 #include "MuonRIO_OnTrack/MuonClusterOnTrack.h"
 
@@ -28,7 +23,7 @@
 
 #include "MuonPrepRawData/CscStripPrepDataContainer.h"
 
-#include "MuonIdHelpers/MuonIdHelperTool.h"
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 
 
 namespace Muon {
@@ -101,8 +96,8 @@ namespace Muon {
 
   private:
     const MuonGM::MuonDetectorManager*   m_muonMgr;          // Muon GeoModel
-    ToolHandle<Muon::MuonIdHelperTool> m_muonIdHelperTool{this, "idHelper", 
-      "Muon::MuonIdHelperTool/MuonIdHelperTool", "Handle to the MuonIdHelperTool"};
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
+
     ToolHandle<ICscStripFitter>          m_stripFitter;
     ToolHandle<ICscClusterFitter>        m_clusterFitter;
     ToolHandle<ICscClusterUtilTool>      m_clusterUtilTool;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.cxx b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.cxx
index 589ddebdc46d310f4163b94d37ff7e3fd341a29c..685917e4873b4d844a0003d98b28ec8703530a1a 100755
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.cxx
@@ -1,23 +1,14 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-///////////////////////////////////////////////////////////////////
-//   Implementation file for class MuonClusterOnTrackCreator
-///////////////////////////////////////////////////////////////////
-// (c) ATLAS Detector software
 ///////////////////////////////////////////////////////////////////
 // AlgTool used for MuonClusterOnTrack object production
 ///////////////////////////////////////////////////////////////////
-// Version 1.0 20/07/2004
-///////////////////////////////////////////////////////////////////
 
 #include "MuonClusterOnTrackCreator.h"
 #include "TrkEventPrimitives/LocalParameters.h"
 #include "TrkSurfaces/Surface.h"
-#include "MuonIdHelpers/CscIdHelper.h"
-#include "MuonIdHelpers/RpcIdHelper.h"
-#include "MuonIdHelpers/TgcIdHelper.h"
 
 #include "MuonPrepRawData/RpcPrepData.h"
 #include "MuonPrepRawData/TgcPrepData.h"
@@ -32,8 +23,6 @@
 #include "MuonRIO_OnTrack/MMClusterOnTrack.h"
 #include <sstream>
 
-using std::atan2;
-
 #define SIG_VEL 4.80000  // ns/m
 #define C_VEL   3.33564  // ns/m
 
@@ -41,17 +30,12 @@ namespace Muon {
 
   MuonClusterOnTrackCreator::MuonClusterOnTrackCreator
   (const std::string& ty,const std::string& na,const IInterface* pa)
-    : AthAlgTool(ty,na,pa),
-      m_idHelper("Muon::MuonIdHelperTool/MuonIdHelperTool")
+    : AthAlgTool(ty,na,pa)
   {
     // algtool interface - necessary!
     declareInterface<IMuonClusterOnTrackCreator>(this);
     declareInterface<IRIO_OnTrackCreator>(this);
 
-    // --- some job options here.
-    declareProperty("doCSC",  m_doCsc = true);
-    declareProperty("doRPC",  m_doRpc = true);
-    declareProperty("doTGC",  m_doTgc = true);
     declareProperty("DoFixedErrorTgcEta", m_doFixedErrorTgcEta = false );
     declareProperty("DoFixedErrorRpcEta", m_doFixedErrorRpcEta = false );
     declareProperty("DoFixedErrorCscEta", m_doFixedErrorCscEta = false );
@@ -78,12 +62,7 @@ namespace Muon {
       return StatusCode::FAILURE;
     } 
     
-    // Get DetectorStore service
-    //
-    if ( m_idHelper.retrieve().isFailure() ) {
-      ATH_MSG_ERROR ( " Cannot retrieve  " << m_idHelper );
-      return StatusCode::FAILURE;
-    }
+    ATH_CHECK(m_idHelperSvc.retrieve());
 
     return StatusCode::SUCCESS;
   }
@@ -115,7 +94,7 @@ namespace Muon {
 
     if (RIO.localCovariance().cols()!=RIO.localCovariance().rows()){
       ATH_MSG_WARNING ( "Rows and colums not equal!");
-      if (m_idHelper->isRpc(RIO.identify())){
+      if (m_idHelperSvc->isRpc(RIO.identify())){
         std::stringstream ss;
         ss << "RPC hit with (r,c)="<<RIO.localCovariance().rows()<<","<<RIO.localCovariance().cols();
         ATH_MSG_WARNING(ss.str().c_str() );
@@ -123,12 +102,12 @@ namespace Muon {
     }
 
     if (RIO.localCovariance().cols() > 1 || 
-	(m_idHelper->isTgc(RIO.identify()) && m_idHelper->measuresPhi(RIO.identify()))) {
-      ATH_MSG_VERBOSE ( "Making 2-dim local parameters: " << m_idHelper->toString(RIO.identify()) );
+	(m_idHelperSvc->isTgc(RIO.identify()) && m_idHelperSvc->measuresPhi(RIO.identify()))) {
+      ATH_MSG_VERBOSE ( "Making 2-dim local parameters: " << m_idHelperSvc->toString(RIO.identify()) );
     } else {
       Trk::DefinedParameter  radiusPar(RIO.localPosition().x(),Trk::locX);
       locpar = Trk::LocalParameters(radiusPar);
-      ATH_MSG_VERBOSE ( "Making 1-dim local parameters: "  << m_idHelper->toString(RIO.identify()) );
+      ATH_MSG_VERBOSE ( "Making 1-dim local parameters: "  << m_idHelperSvc->toString(RIO.identify()) );
     }
 
     
@@ -149,7 +128,7 @@ namespace Muon {
     Amg::MatrixX loce = RIO.localCovariance();
     ATH_MSG_DEBUG ( "All: new err matrix is " << loce );
   
-    if(  m_idHelper->isRpc(RIO.identify()) ){
+    if(  m_idHelperSvc->isRpc(RIO.identify()) ){
       
       // cast to RpcPrepData
       const RpcPrepData* MClus   = dynamic_cast<const RpcPrepData*> (&RIO);
@@ -158,7 +137,7 @@ namespace Muon {
 	return 0;
       }
         
-      bool measphi = m_idHelper->measuresPhi(RIO.identify());
+      bool measphi = m_idHelperSvc->measuresPhi(RIO.identify());
       
       double fixedError = 1.;
       bool scale = false;
@@ -203,7 +182,7 @@ namespace Muon {
       ATH_MSG_DEBUG (" correct_time_along_strip " << correct_time_along_strip<<" av_correct_time_along_strip " << av_correct_time_along_strip<<" real_TOF_onRPCgap " << real_TOF_onRPCgap<<" nominal_TOF_onRPCgap " << nominal_TOF_onRPCgap<<" MClus->time() " << MClus->time()<<" correct_time_tot " <<correct_time_tot );
 
 
-    }else if( m_idHelper->isTgc(RIO.identify()) ){
+    }else if( m_idHelperSvc->isTgc(RIO.identify()) ){
 
       // cast to TgcPrepData
       const TgcPrepData* MClus   = dynamic_cast<const TgcPrepData*> (&RIO);
@@ -213,11 +192,11 @@ namespace Muon {
       }
 
       // calculation of 2D error matrix for TGC phi strips
-      if ( m_idHelper->measuresPhi(RIO.identify()) ){
+      if ( m_idHelperSvc->measuresPhi(RIO.identify()) ){
 
-	int stationeta=m_idHelper->stationEta(RIO.identify());
-	int stripNo = m_idHelper->tgcIdHelper().channel(RIO.identify());
-	int gasGap = m_idHelper->tgcIdHelper().gasGap(RIO.identify());
+	int stationeta=m_idHelperSvc->stationEta(RIO.identify());
+	int stripNo = m_idHelperSvc->tgcIdHelper().channel(RIO.identify());
+	int gasGap = m_idHelperSvc->tgcIdHelper().gasGap(RIO.identify());
 
 	const MuonGM::TgcReadoutElement *ele= MClus->detectorElement();
 
@@ -232,8 +211,8 @@ namespace Muon {
 	}
 	Amg::MatrixX mat(2,2);
 	
-	double phistereo=atan2(localX2-localX1,stripLength); 
-	double Sn      = sin(phistereo); 
+	double phistereo=std::atan2(localX2-localX1,stripLength); 
+	double Sn      = std::sin(phistereo); 
 	double Sn2     = Sn*Sn;
 	double Cs2     = 1.-Sn2;
 	
@@ -241,7 +220,7 @@ namespace Muon {
 	if( m_doFixedErrorTgcPhi ) V0 = m_fixedErrorTgcPhi*m_fixedErrorTgcPhi;
 	double V1      = stripLength*stripLength/12;
 	mat(0,0)  = (Cs2*V0+Sn2*V1);
-	mat.fillSymmetric(1,0,(Sn*sqrt(Cs2)*(V0-V1)));
+	mat.fillSymmetric(1,0,(Sn*std::sqrt(Cs2)*(V0-V1)));
 	mat(1,1)  = (Sn2*V0+Cs2*V1);
 	loce=mat;
       }else{
@@ -254,16 +233,15 @@ namespace Muon {
           
       MClT = new TgcClusterOnTrack(MClus,locpar,loce,positionAlongStrip);
 
-    }else if( m_idHelper->isCsc(RIO.identify()) ){
+    }else if( m_idHelperSvc->isCsc(RIO.identify()) ){
 
-      // cast to CscPrepData
       const CscPrepData* MClus   = dynamic_cast<const CscPrepData*> (&RIO);
       if (!MClus) {
 	ATH_MSG_WARNING ( "RIO not of type CscPrepData, cannot create ROT" );
 	return 0;
       }
 
-      bool measphi = m_idHelper->measuresPhi(RIO.identify());
+      bool measphi = m_idHelperSvc->measuresPhi(RIO.identify());
       double fixedError = 1.;
       bool scale = false;
       // check whether to scale eta/phi hit
@@ -282,7 +260,7 @@ namespace Muon {
       // current not changing CscClusterStatus but passing status of RIO
       MClT = new CscClusterOnTrack(MClus,locpar,loce,positionAlongStrip,MClus->status(),MClus->timeStatus());
 
-    }else if( m_idHelper->isMM(RIO.identify()) ){
+    }else if( m_idHelperSvc->isMM(RIO.identify()) ){
       // cast to MMPrepData
       const MMPrepData* MClus   = dynamic_cast<const MMPrepData*> (&RIO);
       if (!MClus) {
@@ -331,9 +309,8 @@ namespace Muon {
 
       MClT = new MMClusterOnTrack(MClus,locpar,loce,positionAlongStrip);
 
-    }else if( m_idHelper->issTgc(RIO.identify()) ){
+    }else if( m_idHelperSvc->issTgc(RIO.identify()) ){
 
-      // cast to CscPrepData
       const sTgcPrepData* MClus   = dynamic_cast<const sTgcPrepData*> (&RIO);
       if (!MClus) {
 	ATH_MSG_WARNING ( "RIO not of type MMPrepData, cannot create ROT" );
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.h b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.h
index 403b8f421b1b679271523cba3f9bab36b82f8c8c..086d25e1f8d49e84ff9ef3fd6f30b4a599ab07ec 100755
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MuonClusterOnTrackCreator/src/MuonClusterOnTrackCreator.h
@@ -1,35 +1,25 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-///////////////////////////////////////////////////////////////////
-//  Header file for class  MuonClusterOnTrackCreator
-///////////////////////////////////////////////////////////////////
-// (c) ATLAS Detector software
 ///////////////////////////////////////////////////////////////////
 // Interface for MuonClusterOnTrack production
 // (for CSC and RPC technologies)
 ///////////////////////////////////////////////////////////////////
-// Version 1.0 20/07/2004 
-///////////////////////////////////////////////////////////////////
 
 #ifndef MuonClusterOnTrackCreator_H
 #define MuonClusterOnTrackCreator_H
 
 #include "AthenaBaseComps/AthAlgTool.h"
-#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
 #include "MuonRecToolInterfaces/IMuonClusterOnTrackCreator.h"
 #include "MuonRIO_OnTrack/MuonClusterOnTrack.h"
-#include "MuonIdHelpers/MuonIdHelperTool.h"
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 
 #include "MuonReadoutGeometry/MuonDetectorManager.h"
 #include "TrkPrepRawData/PrepRawDataCLASS_DEF.h"
 #include "TrkParameters/TrackParameters.h"
 
-class CscIdHelper;
-class RpcIdHelper;
-class TgcIdHelper;
-
 /** @class MuonClusterOnTrackCreator
     This tool creates MuonClusterOnTrack objects using a given
     global postion prediction.
@@ -81,15 +71,7 @@ namespace Muon {
   
   private:
 
-    // /////////////////////////////////////////////////////////////////
-    // Private data:
-    // /////////////////////////////////////////////////////////////////
-
-    ToolHandle<Muon::MuonIdHelperTool>   m_idHelper;
-
-    bool                                 m_doCsc;
-    bool                                 m_doRpc;
-    bool                                 m_doTgc;
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
 
     bool                                 m_doFixedErrorTgcEta;
     bool                                 m_doFixedErrorRpcEta;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx
index 735f5a25cd54e5aa9d896d0ba42ae0dfa8f4d8a3..888406e81299a870f51355aaf83a9fb4663763a4 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.cxx
@@ -9,7 +9,6 @@
 #include "MuonTrackMakerUtils/MuonTSOSHelper.h"
 
 #include "GaudiKernel/MsgStream.h"
-#include "MuonIdHelpers/MuonIdHelperTool.h"
 #include "MuonRecHelperTools/IMuonEDMHelperSvc.h"
 #include "MuonRecHelperTools/MuonEDMPrinterTool.h"
 #include "MuonIdHelpers/MuonStationIndex.h"
@@ -44,15 +43,6 @@
 #include "TrkEventPrimitives/ResidualPull.h"
 #include "TrkParameters/TrackParameters.h"
 
-#include "MuonIdHelpers/MdtIdHelper.h"
-#include "MuonIdHelpers/RpcIdHelper.h"
-#include "MuonIdHelpers/CscIdHelper.h"
-#include "MuonIdHelpers/TgcIdHelper.h"
-// New Small Wheel
-#include "MuonIdHelpers/sTgcIdHelper.h"
-#include "MuonIdHelpers/MmIdHelper.h"
-
-
 #include "EventPrimitives/EventPrimitivesHelpers.h"
 #include "GeoPrimitives/GeoPrimitivesToStringConverter.h"
 
@@ -70,21 +60,17 @@ namespace Muon {
       m_cscRotCreator("Muon::CscClusterOnTrackCreator/CscClusterOnTrackCreator", this),
       m_clusRotCreator("Muon::MuonClusterOnTrackCreator/MuonClusterOnTrackCreator"),
       m_pullCalculator("Trk::ResidualPullCalculator/ResidualPullCalculator"),
-      m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool"), 
       m_printer("Muon::MuonEDMPrinterTool/MuonEDMPrinterTool")
   {
     declareInterface<IMuonHoleRecoveryTool>(this);
     declareInterface<MuonChamberHoleRecoveryTool>(this);
 
-
-
     declareProperty("MuonStationIntersectSvc", m_intersectSvc);
     declareProperty("Extrapolator",            m_extrapolator);
     declareProperty("MdtRotCreator",           m_mdtRotCreator);
     declareProperty("CscRotCreator",           m_cscRotCreator);
-    declareProperty("ClusterRotCreator",          m_clusRotCreator);
+    declareProperty("ClusterRotCreator",       m_clusRotCreator);
     declareProperty("PullCalculator",          m_pullCalculator);
-    declareProperty("IdHelper",                m_idHelperTool);
     declareProperty("EDMPrinter",              m_printer);
 
     declareProperty("AddMeasurements",       m_addMeasurements = true);
@@ -103,19 +89,20 @@ namespace Muon {
 
     ATH_CHECK( detStore()->retrieve( m_detMgr ) );
     ATH_CHECK( m_edmHelperSvc.retrieve() );
+    ATH_CHECK( m_idHelperSvc.retrieve() );
     ATH_CHECK( m_printer.retrieve() );
     ATH_CHECK( m_extrapolator.retrieve() );
     ATH_CHECK( m_mdtRotCreator.retrieve() );
     
     if ( !m_cscRotCreator.empty() ) {
-      ATH_CHECK( m_cscRotCreator.retrieve() );
+      if (!m_idHelperSvc->hasCSC()) ATH_MSG_WARNING("The current layout does not have any CSC chamber but you gave a CscRotCreator, ignoring it, but double-check configuration");
+      else ATH_CHECK( m_cscRotCreator.retrieve() );
     } else {
       ATH_MSG_INFO("CSC rot creation disabled" );
     }
     
     ATH_CHECK( m_clusRotCreator.retrieve() );
     ATH_CHECK( m_pullCalculator.retrieve() );
-    ATH_CHECK( m_idHelperTool.retrieve() );
     ATH_CHECK( m_intersectSvc.retrieve() );
     
     ATH_CHECK(m_key_mdt.initialize());
@@ -205,25 +192,25 @@ namespace Muon {
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
       
       // Not a ROT, else it would have had an identifier. Keep the TSOS.
-      if ( !id.is_valid() || !m_idHelperTool->mdtIdHelper().is_muon(id) ) {
+      if ( !id.is_valid() || !m_idHelperSvc->mdtIdHelper().is_muon(id) ) {
 	if ( msgLvl(MSG::VERBOSE)) {
 	  if (!id.is_valid() ) ATH_MSG_VERBOSE(" new TSOS without valid identifier, copying " );
-	  else if ( !m_idHelperTool->mdtIdHelper().is_muon(id) ) ATH_MSG_VERBOSE(" new TSOS with none muon identifier, copying " );
+	  else if ( !m_idHelperSvc->mdtIdHelper().is_muon(id) ) ATH_MSG_VERBOSE(" new TSOS with none muon identifier, copying " );
 	}
 	newStates.push_back( std::make_pair(false, *tsit) );
 	continue;
       }
       
-      if ( m_idHelperTool->isMdt(id) ) {
+      if ( m_idHelperSvc->isMdt(id) ) {
 	// get station index
-	Identifier chId = m_idHelperTool->chamberId(id);
-	MuonStationIndex::StIndex stIndex = m_idHelperTool->stationIndex(chId);
+	Identifier chId = m_idHelperSvc->chamberId(id);
+	MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(chId);
 	stations.insert(stIndex);
 	
 	// MDT case: Run hole search in chamber.
 	tsit = insertMdtsWithHoleSearch( tsit, tsit_end, newStates, chamberLayersOnTrack );
 	continue;
-      } else if ( m_idHelperTool->isTrigger(id) || m_idHelperTool->isCsc(id) || m_idHelperTool->isMM(id) || m_idHelperTool->issTgc(id) ) {
+      } else if ( m_idHelperSvc->isTrigger(id) || m_idHelperSvc->isCsc(id) || m_idHelperSvc->isMM(id) || m_idHelperSvc->issTgc(id) ) {
 	// Non-MDT case: Look for missing layers in chamber, add them to track
 	tsit = insertClustersWithHoleSearch( tsit, tsit_end, newStates );
 	continue;
@@ -302,16 +289,16 @@ namespace Muon {
       }
       
       // get chamber Id
-      Identifier detElId =  m_idHelperTool->detElId(id);
+      Identifier detElId =  m_idHelperSvc->detElId(id);
       if ( !detectorElId ) detectorElId = new Identifier( detElId );
       
       // check whether we are still in the same chamber, stop loop if not
       if ( detElId != *detectorElId ) break;
       
       // sanity check, this SHOULD be a RPC, TGC, MM, STGC or CSC measurement
-      if ( !( m_idHelperTool->isTrigger(id) || m_idHelperTool->isCsc(id) || m_idHelperTool->isMM(id) || m_idHelperTool->issTgc(id) ) ) {
+      if ( !( m_idHelperSvc->isTrigger(id) || m_idHelperSvc->isCsc(id) || m_idHelperSvc->isMM(id) || m_idHelperSvc->issTgc(id) ) ) {
 	newStates.push_back( std::make_pair(false, *tsit) );
-	ATH_MSG_WARNING(" Identifier should be TGC/RPC/CSC/MM/STGC: " << m_idHelperTool->toString(id) );
+	ATH_MSG_WARNING(" Identifier should be TGC/RPC/CSC/MM/STGC: " << m_idHelperSvc->toString(id) );
 	continue;
       }
       
@@ -320,20 +307,20 @@ namespace Muon {
       const CompetingMuonClustersOnTrack* comp = dynamic_cast<const CompetingMuonClustersOnTrack*>(meas);
       if ( comp ) {
 	
-	std::vector<const MuonClusterOnTrack*>::const_iterator clit = comp->containedROTs().begin();
-	std::vector<const MuonClusterOnTrack*>::const_iterator clit_end = comp->containedROTs().end();
-	for ( ; clit != clit_end; ++clit ) {
+	std::vector<const MuonClusterOnTrack*>::const_iterator cl_it = comp->containedROTs().begin();
+	std::vector<const MuonClusterOnTrack*>::const_iterator cl_it_end = comp->containedROTs().end();
+	for ( ; cl_it != cl_it_end; ++cl_it ) {
 	  // get layer Identifier and insert it into set
-	  Identifier layId =  m_idHelperTool->layerId( (*clit)->identify() );
+	  Identifier layId =  m_idHelperSvc->layerId( (*cl_it)->identify() );
 	  layIds.insert(layId);
 	}
       } else {
 	// get layer Identifier and insert it into set
-	Identifier layId =  m_idHelperTool->layerId(id);
+	Identifier layId =  m_idHelperSvc->layerId(id);
 	layIds.insert(layId);
       }
       if ( msgLvl(MSG::VERBOSE) ) {
-	msg(MSG::VERBOSE) << " new hit " << m_idHelperTool->toString(id);
+	msg(MSG::VERBOSE) << " new hit " << m_idHelperSvc->toString(id);
 	if ( comp ) msg(MSG::VERBOSE) << " competing, layers: " << layIds.size();
 	msg(MSG::VERBOSE) << endmsg;
       }
@@ -380,14 +367,14 @@ namespace Muon {
     // this should be a MDT
     const MdtDriftCircleOnTrack* mdtFirst = dynamic_cast<const MdtDriftCircleOnTrack*>(meas);
     if ( !mdtFirst ) {
-      ATH_MSG_WARNING("Bad hit: not a MDT " << m_idHelperTool->toString(m_edmHelperSvc->getIdentifier(*meas)) );
+      ATH_MSG_WARNING("Bad hit: not a MDT " << m_idHelperSvc->toString(m_edmHelperSvc->getIdentifier(*meas)) );
       if ( tsit + 1 == tsit_end ) --tsit;
       return tsit;
     }
     
     // get chamber identifier
-    MuonStationIndex::ChIndex currentChIndex = m_idHelperTool->chamberIndex(mdtFirst->identify());
-    Identifier chId = m_idHelperTool->chamberId(mdtFirst->identify());
+    MuonStationIndex::ChIndex currentChIndex = m_idHelperSvc->chamberIndex(mdtFirst->identify());
+    Identifier chId = m_idHelperSvc->chamberId(mdtFirst->identify());
     
     // to correctly handle low pt tracks average the direction of the track in the chamber
     const Trk::TrackParameters* parsLast = 0;
@@ -424,7 +411,7 @@ namespace Muon {
       const Identifier& id = mdt->identify();
       
       // check whether we are still in the same chamber layer
-      if ( currentChIndex != m_idHelperTool->chamberIndex(id) ) break;
+      if ( currentChIndex != m_idHelperSvc->chamberIndex(id) ) break;
       
       ids.insert(id); // insert identifier
       newStates.push_back( std::make_pair(false, *tsit) );
@@ -451,7 +438,7 @@ namespace Muon {
       // create holes
       createHoleTSOSsForMdtChamber( chId, *pars, parsLast, ids, newStates );
       
-      ATH_MSG_DEBUG(" Chamber " << m_idHelperTool->toStringChamber(chId)
+      ATH_MSG_DEBUG(" Chamber " << m_idHelperSvc->toStringChamber(chId)
 		    << " has hits " << ids.size() << " new states " << newStates.size() - ids.size() );
       
       // sort all states in this chamber
@@ -469,14 +456,13 @@ namespace Muon {
 								      std::set<Identifier>& layIds,
 								      std::vector< std::pair<bool, const Trk::TrackStateOnSurface* > >& states ) const {
     
-    ATH_MSG_VERBOSE(" performing holes search in chamber " << m_idHelperTool->toString(detElId) );
+    ATH_MSG_VERBOSE(" performing holes search in chamber " << m_idHelperSvc->toString(detElId) );
     
-    if ( m_idHelperTool->isCsc(detElId) )      createHoleTSOSsForCscChamber(detElId, pars, layIds, states);
-    else if ( m_idHelperTool->isTgc(detElId) ) createHoleTSOSsForTgcChamber(detElId, pars, layIds, states);
-    else if ( m_idHelperTool->isRpc(detElId) ) createHoleTSOSsForRpcChamber(detElId, pars, layIds, states);
-    else if ( m_idHelperTool->isMM(detElId) )  createHoleTSOSsForMmChamber(detElId, pars, layIds, states);
-    else if ( m_idHelperTool->issTgc(detElId) ) createHoleTSOSsForStgcChamber(detElId, pars, layIds, states);
-    // else if( m_idHelperTool->isMM(detElId) || m_idHelperTool->issTgc(detElId) ) ATH_MSG_DEBUG(" NSW hole recovery not implemented yet");
+    if ( m_idHelperSvc->isCsc(detElId) )      createHoleTSOSsForCscChamber(detElId, pars, layIds, states);
+    else if ( m_idHelperSvc->isTgc(detElId) ) createHoleTSOSsForTgcChamber(detElId, pars, layIds, states);
+    else if ( m_idHelperSvc->isRpc(detElId) ) createHoleTSOSsForRpcChamber(detElId, pars, layIds, states);
+    else if ( m_idHelperSvc->isMM(detElId) )  createHoleTSOSsForMmChamber(detElId, pars, layIds, states);
+    else if ( m_idHelperSvc->issTgc(detElId) ) createHoleTSOSsForStgcChamber(detElId, pars, layIds, states);
     else ATH_MSG_WARNING(" unexpected Identifier, cannot perform holes search" );
   }
 
@@ -487,13 +473,13 @@ namespace Muon {
     // get detector element
     const MuonGM::sTgcReadoutElement* detEl = m_detMgr->getsTgcReadoutElement(detElId);
     if ( !detEl ) {
-      ATH_MSG_WARNING(" No detector element found for " << m_idHelperTool->toStringChamber(detElId) );
+      ATH_MSG_WARNING(" No detector element found for " << m_idHelperSvc->toStringChamber(detElId) );
       return;
     }
     
     // get list of layers with a hole
     unsigned int nGasGaps = detEl->numberOfLayers(false);
-    int multilayer = m_idHelperTool->stgcIdHelper().multilayer(detElId);
+    int multilayer = m_idHelperSvc->stgcIdHelper().multilayer(detElId);
     LayerHoleVec holeVec = holesInClusterChamber( pars, detElId, layIds, nGasGaps );
     if ( holeVec.empty() ) return;
     
@@ -502,12 +488,12 @@ namespace Muon {
     LayerHoleVec::iterator it = holeVec.begin();
     LayerHoleVec::iterator it_end = holeVec.end();
     
-    Identifier layId = m_idHelperTool->stgcIdHelper().channelID(detElId, multilayer, it->first, 1, 1);
-    bool measuresPhi1 = m_idHelperTool->measuresPhi(layId);
-    layId = m_idHelperTool->stgcIdHelper().channelID(detElId, multilayer, it->first, 0, 1);
-    bool measuresPhi0 = m_idHelperTool->measuresPhi(layId);
-    layId = m_idHelperTool->stgcIdHelper().channelID(detElId, multilayer, it->first, 2, 1);
-    bool measuresPhi2 = m_idHelperTool->measuresPhi(layId);
+    Identifier layId = m_idHelperSvc->stgcIdHelper().channelID(detElId, multilayer, it->first, 1, 1);
+    bool measuresPhi1 = m_idHelperSvc->measuresPhi(layId);
+    layId = m_idHelperSvc->stgcIdHelper().channelID(detElId, multilayer, it->first, 0, 1);
+    bool measuresPhi0 = m_idHelperSvc->measuresPhi(layId);
+    layId = m_idHelperSvc->stgcIdHelper().channelID(detElId, multilayer, it->first, 2, 1);
+    bool measuresPhi2 = m_idHelperSvc->measuresPhi(layId);
     
     ATH_MSG_DEBUG(" createHoleTSOSsFor StgcChamber measuresPhi type 0" << (int) measuresPhi0 << " measuresPhi type 1 " << (int) measuresPhi1 << " measuresPhi type 2 " << (int) measuresPhi2 );
     for ( ; it != it_end; ++it ) {
@@ -516,14 +502,14 @@ namespace Muon {
       // Identifier id = m_idHelper->channelID(parentId, m_idHelper->multilayer(layid), m_idHelper->gasGap(layid),type,1,m_checkIds);
       if (it->second == 0) {
 	// eta strip
-	chHoles.insert( m_idHelperTool->stgcIdHelper().channelID(detElId, multilayer, it->first, 1, 1) );
+	chHoles.insert( m_idHelperSvc->stgcIdHelper().channelID(detElId, multilayer, it->first, 1, 1) );
       } else {
-	if (abs(m_idHelperTool->stationEta(detElId)) > 2) {
+	if (abs(m_idHelperSvc->stationEta(detElId)) > 2) {
         // wires
-	  chHoles.insert( m_idHelperTool->stgcIdHelper().channelID(detElId, multilayer, it->first, 2, 1) );
+	  chHoles.insert( m_idHelperSvc->stgcIdHelper().channelID(detElId, multilayer, it->first, 2, 1) );
 	} else {
 	  // pads
-	  chHoles.insert( m_idHelperTool->stgcIdHelper().channelID(detElId, multilayer, it->first, 0, 1) );
+	  chHoles.insert( m_idHelperSvc->stgcIdHelper().channelID(detElId, multilayer, it->first, 0, 1) );
 	}
       }
     }
@@ -543,7 +529,7 @@ namespace Muon {
     sTgcPrepDataCollection::const_iterator hit = prdCol->begin();
     sTgcPrepDataCollection::const_iterator hit_end = prdCol->end();
     for ( ; hit != hit_end; ++hit ) {
-      if ( detElId == m_idHelperTool->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
+      if ( detElId == m_idHelperSvc->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
     }
     
     createHoleTSOSsForClusterChamber( detElId, pars, layIds, chHoles, prds, states );
@@ -557,13 +543,13 @@ namespace Muon {
     // get detector element
     const MuonGM::MMReadoutElement* detEl = m_detMgr->getMMReadoutElement(detElId);
     if ( !detEl ) {
-      ATH_MSG_WARNING(" No detector element found for " << m_idHelperTool->toStringChamber(detElId) );
+      ATH_MSG_WARNING(" No detector element found for " << m_idHelperSvc->toStringChamber(detElId) );
       return;
     }
     
     // get list of layers with a hole
     unsigned int nGasGaps = detEl->numberOfLayers(false);
-    int multilayer = m_idHelperTool->mmIdHelper().multilayer(detElId);
+    int multilayer = m_idHelperSvc->mmIdHelper().multilayer(detElId);
     LayerHoleVec holeVec = holesInClusterChamber( pars, detElId, layIds, nGasGaps );
     if ( holeVec.empty() ) return;
     
@@ -573,7 +559,7 @@ namespace Muon {
     LayerHoleVec::iterator it_end = holeVec.end();
     for ( ; it != it_end; ++it ) {
       // eta strip
-      if (it->second == 0) chHoles.insert( m_idHelperTool->mmIdHelper().channelID(detElId, multilayer, it->first, 1) );
+      if (it->second == 0) chHoles.insert( m_idHelperSvc->mmIdHelper().channelID(detElId, multilayer, it->first, 1) );
     }
     
     if ( chHoles.empty() ) return;
@@ -591,7 +577,7 @@ namespace Muon {
     MMPrepDataCollection::const_iterator hit = prdCol->begin();
     MMPrepDataCollection::const_iterator hit_end = prdCol->end();
     for ( ; hit != hit_end; ++hit ) {
-      if ( detElId == m_idHelperTool->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
+      if ( detElId == m_idHelperSvc->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
     }
     
     createHoleTSOSsForClusterChamber( detElId, pars, layIds, chHoles, prds, states );
@@ -612,15 +598,15 @@ namespace Muon {
     LayerHoleVec::iterator it = holeVec.begin();
     LayerHoleVec::iterator it_end = holeVec.end();
     for ( ; it != it_end; ++it ) {
-      Identifier parentId = m_idHelperTool->cscIdHelper().parentID(detElId);
-      Identifier layId = m_idHelperTool->cscIdHelper().channelID(parentId, 2, it->first, it->second, 1);
-      bool measuresPhi = m_idHelperTool->measuresPhi(layId);
+      Identifier parentId = m_idHelperSvc->cscIdHelper().parentID(detElId);
+      Identifier layId = m_idHelperSvc->cscIdHelper().channelID(parentId, 2, it->first, it->second, 1);
+      bool measuresPhi = m_idHelperSvc->measuresPhi(layId);
       // sanity check this should always be true!!!
       if ( measuresPhi != (bool)it->second ) {
 	ATH_MSG_WARNING(" Problem spotted creating CSC identifier, measures Phi not correctly set " );
 	continue;
       }
-      ATH_MSG_VERBOSE(" adding hole layer " << m_idHelperTool->toString(layId)
+      ATH_MSG_VERBOSE(" adding hole layer " << m_idHelperSvc->toString(layId)
 		      << "     layer " << it->first << " measPhi " << it->second );
       chHoles.insert( layId );
     }
@@ -650,7 +636,7 @@ namespace Muon {
     // get detector element
     const MuonGM::TgcReadoutElement* detEl = m_detMgr->getTgcReadoutElement(detElId);
     if ( !detEl ) {
-      ATH_MSG_WARNING(" No detector element found for " << m_idHelperTool->toStringChamber(detElId) );
+      ATH_MSG_WARNING(" No detector element found for " << m_idHelperSvc->toStringChamber(detElId) );
       return;
   }
     
@@ -667,7 +653,7 @@ namespace Muon {
       // the second gas gap of the three layer stations does not have a phi measurement
       if ( nGasGaps == 3 && it->first == 2 && it->second ) continue;
     
-      chHoles.insert( m_idHelperTool->tgcIdHelper().channelID(detElId, it->first, it->second, 1) );
+      chHoles.insert( m_idHelperSvc->tgcIdHelper().channelID(detElId, it->first, it->second, 1) );
     }
 
     if ( chHoles.empty() ) return;
@@ -685,7 +671,7 @@ namespace Muon {
     TgcPrepDataCollection::const_iterator hit = prdCol->begin();
     TgcPrepDataCollection::const_iterator hit_end = prdCol->end();
     for ( ; hit != hit_end; ++hit ) {
-      if ( detElId == m_idHelperTool->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
+      if ( detElId == m_idHelperSvc->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
     }
     //prds.insert(prds.begin(),prdCol->begin(),prdCol->end());
     
@@ -702,7 +688,7 @@ namespace Muon {
     if ( holeVec.empty() ) return;
     const MuonGM::RpcReadoutElement* detEl = m_detMgr->getRpcReadoutElement(detElId);
     if ( !detEl ) {
-      ATH_MSG_WARNING("Could not find ReadoutElement for " << m_idHelperTool->toString(detElId) );
+      ATH_MSG_WARNING("Could not find ReadoutElement for " << m_idHelperSvc->toString(detElId) );
       return;
     }
     int dbZ   = detEl->getDoubletZ();
@@ -716,10 +702,10 @@ namespace Muon {
     LayerHoleVec::iterator it = holeVec.begin();
     LayerHoleVec::iterator it_end = holeVec.end();
     for ( ; it != it_end; ++it ) {
-      Identifier clusId = m_idHelperTool->rpcIdHelper().channelID(detElId, dbZ, dbPhi, it->first, it->second, 1);
+      Identifier clusId = m_idHelperSvc->rpcIdHelper().channelID(detElId, dbZ, dbPhi, it->first, it->second, 1);
       chHoles.insert( clusId );
       
-      ATH_MSG_VERBOSE("Adding hole " << m_idHelperTool->toString(clusId) );
+      ATH_MSG_VERBOSE("Adding hole " << m_idHelperSvc->toString(clusId) );
       
     }
 
@@ -736,7 +722,7 @@ namespace Muon {
     RpcPrepDataCollection::const_iterator hit = prdCol->begin();
     RpcPrepDataCollection::const_iterator hit_end = prdCol->end();
     for ( ; hit != hit_end; ++hit ) {
-      if ( detElId == m_idHelperTool->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
+      if ( detElId == m_idHelperSvc->detElId( (*hit)->identify() ) ) prds.push_back(*hit);
     }
     //prds.insert(prds.begin(),prdCol->begin(),prdCol->end());
     
@@ -757,7 +743,7 @@ namespace Muon {
     
 
     if ( msgLvl(MSG::DEBUG) ) {
-      msg() << " chamber " << m_idHelperTool->toString(detElId)
+      msg() << " chamber " << m_idHelperSvc->toString(detElId)
 	    << " PRDs in chamber  " << prds.size() << "  holes " << chHoles.size();
       if ( msgLvl(MSG::VERBOSE) ) {
 	if ( pars.covariance() ) msg() << MSG::VERBOSE << " extrapolation error " << Amg::error(*pars.covariance(), Trk::locX);
@@ -771,12 +757,12 @@ namespace Muon {
     ClusterLayerMap clusterLayerMap;
     
     const Trk::TrkDetElementBase* detEl = 0;
-    if ( m_idHelperTool->isTgc(detElId) )         detEl = m_detMgr->getTgcReadoutElement(detElId);
-    else if ( m_idHelperTool->isRpc(detElId) )    detEl = m_detMgr->getRpcReadoutElement(detElId);
-    else if ( m_idHelperTool->isCsc(detElId) )    detEl = m_detMgr->getCscReadoutElement(detElId);
+    if ( m_idHelperSvc->isTgc(detElId) )         detEl = m_detMgr->getTgcReadoutElement(detElId);
+    else if ( m_idHelperSvc->isRpc(detElId) )    detEl = m_detMgr->getRpcReadoutElement(detElId);
+    else if ( m_idHelperSvc->isCsc(detElId) )    detEl = m_detMgr->getCscReadoutElement(detElId);
     // New Small Wheel
-    else if ( m_idHelperTool->issTgc(detElId) )   detEl = m_detMgr->getsTgcReadoutElement(detElId);
-    else if ( m_idHelperTool->isMM(detElId) )     detEl = m_detMgr->getMMReadoutElement(detElId);
+    else if ( m_idHelperSvc->issTgc(detElId) )   detEl = m_detMgr->getsTgcReadoutElement(detElId);
+    else if ( m_idHelperSvc->isMM(detElId) )     detEl = m_detMgr->getMMReadoutElement(detElId);
     
     unsigned int nNewHits = 0;
     // loop over prds
@@ -788,7 +774,7 @@ namespace Muon {
       const MuonCluster& clus = **it;
       if ( !detEl ) detEl = clus.detectorElement();
       const Identifier& id = clus.identify();
-      Identifier layId = m_idHelperTool->layerId(id);
+      Identifier layId = m_idHelperSvc->layerId(id);
       
       // do not add hits in layers that are already on track
       if ( layIds.count(layId) ) {
@@ -809,13 +795,13 @@ namespace Muon {
 	//parsToBeDeleted.push_back(exPars);
       }
       if ( msgLvl(MSG::VERBOSE) ) {
-	msg() << MSG::VERBOSE << "  --- " << m_idHelperTool->toString(id) << " error " << Amg::error(clus.localCovariance(), Trk::locX);
+	msg() << MSG::VERBOSE << "  --- " << m_idHelperSvc->toString(id) << " error " << Amg::error(clus.localCovariance(), Trk::locX);
 	if ( exPars->covariance() ) msg() << MSG::VERBOSE << " measured parameters, error " << Amg::error(*exPars->covariance(), Trk::locX);
 	msg() << endmsg;
       }
       
       const MuonClusterOnTrack* clusterOnTrack = 0;
-      if ( m_idHelperTool->isTrigger(clus.identify()) ||  m_idHelperTool->isMM(clus.identify()) || m_idHelperTool->issTgc(clus.identify()) ) {
+      if ( m_idHelperSvc->isTrigger(clus.identify()) ||  m_idHelperSvc->isMM(clus.identify()) || m_idHelperSvc->issTgc(clus.identify()) ) {
 	clusterOnTrack = m_clusRotCreator->createRIO_OnTrack( clus, exPars->position(), exPars->momentum().unit()  );
       } else {
 	if ( m_cscRotCreator.empty() ) {
@@ -842,7 +828,7 @@ namespace Muon {
 	continue;
       }
       
-      double pullCut = m_idHelperTool->measuresPhi(id) ? m_associationPullCutPhi : m_associationPullCutEta;
+      double pullCut = m_idHelperSvc->measuresPhi(id) ? m_associationPullCutPhi : m_associationPullCutEta;
       double pull = fabs(resPull->pull().front());
       Amg::Vector2D locExPos(exPars->parameters()[Trk::locX], exPars->parameters()[Trk::locY]);
       bool inbounds = surf.insideBounds(locExPos, 10., 10.);
@@ -850,7 +836,7 @@ namespace Muon {
       if ( msgLvl(MSG::VERBOSE) ) {
 	std::string boundStr = inbounds ? " inside bounds " : " outside bounds ";
 	double residual = resPull->residual().front();
-	ATH_MSG_VERBOSE(" found prd: " << m_idHelperTool->toString(id)
+	ATH_MSG_VERBOSE(" found prd: " << m_idHelperSvc->toString(id)
 			<< " res " << residual << " pull " << pull << boundStr);
       }
       delete resPull;
@@ -859,14 +845,14 @@ namespace Muon {
       if ( pull < pullCut && inbounds ) {
 	
 	// check whether there are other hits in the same layer with smaller residual, if not add
-	ClusterLayerMap::iterator clit = clusterLayerMap.find(layId);
-	if ( clit != clusterLayerMap.end() ) {
-	  if ( pull < clit->second.pull ) {
-	    clit->second.pull = pull;
-	    if ( &pars != clit->second.pars ) delete clit->second.pars;
-	    delete clit->second.clus;
-	    clit->second.pars = exPars;
-	    clit->second.clus = clusterOnTrack;
+	ClusterLayerMap::iterator cl_it = clusterLayerMap.find(layId);
+	if ( cl_it != clusterLayerMap.end() ) {
+	  if ( pull < cl_it->second.pull ) {
+	    cl_it->second.pull = pull;
+	    if ( &pars != cl_it->second.pars ) delete cl_it->second.pars;
+	    delete cl_it->second.clus;
+	    cl_it->second.pars = exPars;
+	    cl_it->second.clus = clusterOnTrack;
 	  } else {
 	    if ( &pars != exPars ) delete exPars;
 	    delete clusterOnTrack;
@@ -885,16 +871,16 @@ namespace Muon {
     }
     
     // loop over cluster layer map and add the clusters to the state vector
-    ClusterLayerMap::iterator clit = clusterLayerMap.begin();
-    ClusterLayerMap::iterator clit_end = clusterLayerMap.end();
-    for ( ; clit != clit_end; ++clit ) {
+    ClusterLayerMap::iterator cl_it = clusterLayerMap.begin();
+    ClusterLayerMap::iterator cl_it_end = clusterLayerMap.end();
+    for ( ; cl_it != cl_it_end; ++cl_it ) {
       
       // bool addMeasurements = true;
-      Trk::TrackStateOnSurface* tsos = MuonTSOSHelper::createMeasTSOS( clit->second.clus, clit->second.pars != &pars ? clit->second.pars : clit->second.pars->clone() ,
+      Trk::TrackStateOnSurface* tsos = MuonTSOSHelper::createMeasTSOS( cl_it->second.clus, cl_it->second.pars != &pars ? cl_it->second.pars : cl_it->second.pars->clone() ,
 								       Trk::TrackStateOnSurface::Measurement );
       // addMeasurements ? Trk::TrackStateOnSurface::Measurement : Trk::TrackStateOnSurface::Outlier );
       states.push_back( std::make_pair(true, tsos) );
-      ATH_MSG_VERBOSE(" added hit " << m_idHelperTool->toString(clit->second.clus->identify()));
+      ATH_MSG_VERBOSE(" added hit " << m_idHelperSvc->toString(cl_it->second.clus->identify()));
       ++nNewHits;
     }
     
@@ -908,16 +894,16 @@ namespace Muon {
       
       // if no detEl yet try retrieving if from the detMgr
       if ( !detEl ) {
-	if ( m_idHelperTool->isTgc(id) )      detEl = m_detMgr->getTgcReadoutElement(id);
-	else if ( m_idHelperTool->isRpc(id) ) detEl = m_detMgr->getRpcReadoutElement(id);
-	else if ( m_idHelperTool->isCsc(id) ) detEl = m_detMgr->getCscReadoutElement(id);
+	if ( m_idHelperSvc->isTgc(id) )      detEl = m_detMgr->getTgcReadoutElement(id);
+	else if ( m_idHelperSvc->isRpc(id) ) detEl = m_detMgr->getRpcReadoutElement(id);
+	else if ( m_idHelperSvc->isCsc(id) ) detEl = m_detMgr->getCscReadoutElement(id);
 	// New Small Wheel
-	else if ( m_idHelperTool->issTgc(id) ) detEl = m_detMgr->getsTgcReadoutElement(id);
-	else if ( m_idHelperTool->isMM(id) ) detEl = m_detMgr->getMMReadoutElement(id);
+	else if ( m_idHelperSvc->issTgc(id) ) detEl = m_detMgr->getsTgcReadoutElement(id);
+	else if ( m_idHelperSvc->isMM(id) ) detEl = m_detMgr->getMMReadoutElement(id);
 	
 	
 	if ( !detEl ) {
-	  ATH_MSG_DEBUG("No detector element found for " << m_idHelperTool->toString(id) );
+	  ATH_MSG_DEBUG("No detector element found for " << m_idHelperSvc->toString(id) );
 	  continue;
 	}
       }
@@ -943,7 +929,7 @@ namespace Muon {
       }
       if ( msgLvl(MSG::VERBOSE) ) {
 	std::string boundStr = inBounds ? " inside bounds " : " outside bounds ";
-	ATH_MSG_VERBOSE(" new hole " << m_idHelperTool->toString(id) << " position "
+	ATH_MSG_VERBOSE(" new hole " << m_idHelperSvc->toString(id) << " position "
 			<< exPars->parameters()[Trk::locR] << boundStr);
       }
       
@@ -951,7 +937,7 @@ namespace Muon {
 	continue;
       }
       
-      if ( msgLvl(MSG::VERBOSE) )  if (m_idHelperTool->issTgc(id)) ATH_MSG_VERBOSE(" new hole sTgc measuresPhi " << (int)  m_idHelperTool->measuresPhi(id));
+      if ( msgLvl(MSG::VERBOSE) )  if (m_idHelperSvc->issTgc(id)) ATH_MSG_VERBOSE(" new hole sTgc measuresPhi " << (int)  m_idHelperSvc->measuresPhi(id));
       Trk::TrackStateOnSurface* tsos = MuonTSOSHelper::createHoleTSOS(exPars->clone());
       states.push_back( std::make_pair(true, tsos) );
       ++nholes;
@@ -959,7 +945,7 @@ namespace Muon {
       //break; // only add one hole per det el
     }
     
-    ATH_MSG_DEBUG(" chamber " << m_idHelperTool->toStringChamber(detElId) << " added hits " << nNewHits << " found holes " << nholes  );
+    ATH_MSG_DEBUG(" chamber " << m_idHelperSvc->toStringChamber(detElId) << " added hits " << nNewHits << " found holes " << nholes  );
     
     // clean up parameters
     std::for_each( parsToBeDeleted.begin(), parsToBeDeleted.end(), MuonDeleteObject<const Trk::TrackParameters>() );
@@ -976,7 +962,7 @@ namespace Muon {
     // check whether we need to average the parameters
     if ( parsLast ) direction = (parsLast->position() - pars.position()).unit();
     std::set<Identifier> chHoles = holesInMdtChamber( pars.position(), direction, chId, ids );
-    ATH_MSG_VERBOSE(" chamber " << m_idHelperTool->toStringChamber(chId) << " has holes " << chHoles.size() );
+    ATH_MSG_VERBOSE(" chamber " << m_idHelperSvc->toStringChamber(chId) << " has holes " << chHoles.size() );
     if ( chHoles.empty() ) return;
     
     
@@ -995,7 +981,7 @@ namespace Muon {
     for ( ; hit != hit_end; ++hit ) {
       
       // only handle chamers once
-      Identifier chIdentifier = m_idHelperTool->chamberId(*hit);
+      Identifier chIdentifier = m_idHelperSvc->chamberId(*hit);
       if ( chIds.count(chIdentifier) ) continue;
       chIds.insert(chIdentifier);
       
@@ -1038,7 +1024,7 @@ namespace Muon {
         MdtDriftCircleOnTrack* mdtROT = m_mdtRotCreator->createRIO_OnTrack(mdtPrd, exPars->position(), &(exPars->momentum()));
 	// sanity check
 	if ( !mdtROT ) {
-	  ATH_MSG_DEBUG(" failed to calibrate MdtPrepData " << m_idHelperTool->toString(id) );
+	  ATH_MSG_DEBUG(" failed to calibrate MdtPrepData " << m_idHelperSvc->toString(id) );
 	  continue;
 	}
 	
@@ -1102,7 +1088,7 @@ namespace Muon {
 	  inBounds = mdtROT->associatedSurface().insideBounds(locPos);
 	}
 	if ( msgLvl(MSG::VERBOSE) ) {
-	  std::string idString   = m_idHelperTool->toString( id );
+	  std::string idString   = m_idHelperSvc->toString( id );
 	  std::string boundCheck =  inBounds ? "inBounds" : "outBounds";
 	  msg(MSG::VERBOSE) << m_printer->print( *resPull ) << " "  << idString << " " << boundCheck;
 	  std::string hitType = " delta";
@@ -1139,7 +1125,7 @@ namespace Muon {
       for ( ; hit != hit_end; ++hit ) {
 	if ( associatedHoles.count(*hit) ) continue;
 	// only create holes in the current chamber
-	Identifier ch = m_idHelperTool->chamberId(*hit);
+	Identifier ch = m_idHelperSvc->chamberId(*hit);
 	if ( ch != chIdentifier ) continue;
 
 	const MuonGM::MdtReadoutElement* detEl = m_detMgr->getMdtReadoutElement(*hit);
@@ -1167,11 +1153,11 @@ namespace Muon {
 	  }
 	}
 	if ( !inBounds ) {
-	  ATH_MSG_VERBOSE(" discarding hole " << m_idHelperTool->toString(*hit) << " dist wire "
+	  ATH_MSG_VERBOSE(" discarding hole " << m_idHelperSvc->toString(*hit) << " dist wire "
 			  << exPars->parameters()[Trk::locR] << " outside bounds " );
 	  continue;
 	}
-	ATH_MSG_VERBOSE(" new hole " << m_idHelperTool->toString(*hit) << " dist wire "
+	ATH_MSG_VERBOSE(" new hole " << m_idHelperSvc->toString(*hit) << " dist wire "
 			<< exPars->parameters()[Trk::locR] );
 	Trk::TrackStateOnSurface* tsos = MuonTSOSHelper::createHoleTSOS(exPars->clone());
 	states.push_back( std::make_pair(true, tsos) );
@@ -1202,11 +1188,11 @@ namespace Muon {
     std::set<Identifier>::const_iterator it = layIds.begin();
     std::set<Identifier>::const_iterator it_end = layIds.end();
     for ( ; it != it_end; ++it ) {
-      int gasGap       = m_idHelperTool->gasGap(*it);
-      bool measuresPhi = m_idHelperTool->measuresPhi(*it);
+      int gasGap       = m_idHelperSvc->gasGap(*it);
+      bool measuresPhi = m_idHelperSvc->measuresPhi(*it);
       // sanity check
       if ( gasGap < 0 && gasGap >= (int)nGasGaps ) {
-	ATH_MSG_WARNING(" gas gap index out of range " << m_idHelperTool->toString(*it) );
+	ATH_MSG_WARNING(" gas gap index out of range " << m_idHelperSvc->toString(*it) );
 	continue;
       }
 
@@ -1254,7 +1240,7 @@ namespace Muon {
 	continue;
       }
       if ( msgLvl(MSG::VERBOSE) ) {
-	msg(MSG::VERBOSE) << " intersect " << m_idHelperTool->toString(tint.tubeId)
+	msg(MSG::VERBOSE) << " intersect " << m_idHelperSvc->toString(tint.tubeId)
 			  << "  dist wire " << tint.rIntersect << "  dist to tube end " << tint.xIntersect;
       }
       if ( fabs( tint.rIntersect ) > 14.4 || tint.xIntersect > -10. ) {
@@ -1285,11 +1271,11 @@ namespace Muon {
     }
     if(mdtPrdContainer->size()==0) return 0;
     IdentifierHash hash_id;
-    m_idHelperTool->mdtIdHelper().get_module_hash(chId,hash_id );
+    m_idHelperSvc->mdtIdHelper().get_module_hash(chId,hash_id );
     
     MdtPrepDataContainer::const_iterator colIt = mdtPrdContainer->indexFind(hash_id);
     if( colIt == mdtPrdContainer->end() ){
-      ATH_MSG_DEBUG(" MdtPrepDataCollection for:   " << m_idHelperTool->toStringChamber(chId)
+      ATH_MSG_DEBUG(" MdtPrepDataCollection for:   " << m_idHelperSvc->toStringChamber(chId)
 		    << "  not found in container " );
       return 0;
     }
@@ -1309,11 +1295,11 @@ namespace Muon {
     }
     if(cscPrdContainer->size()==0) return 0;
     IdentifierHash hash_id;
-    m_idHelperTool->cscIdHelper().get_geo_module_hash(detElId,hash_id );
+    m_idHelperSvc->cscIdHelper().get_geo_module_hash(detElId,hash_id );
     
     CscPrepDataContainer::const_iterator colIt = cscPrdContainer->indexFind(hash_id);
     if( colIt == cscPrdContainer->end() ){
-      ATH_MSG_DEBUG(" CscPrepDataCollection for:   " << m_idHelperTool->toStringChamber(detElId)
+      ATH_MSG_DEBUG(" CscPrepDataCollection for:   " << m_idHelperSvc->toStringChamber(detElId)
 		    << "  not found in container " );
       return 0;
     }
@@ -1333,11 +1319,11 @@ namespace Muon {
     }
     if(tgcPrdContainer->size()==0) return 0;
     IdentifierHash hash_id;
-    m_idHelperTool->tgcIdHelper().get_module_hash(detElId,hash_id );
+    m_idHelperSvc->tgcIdHelper().get_module_hash(detElId,hash_id );
 
     TgcPrepDataContainer::const_iterator colIt = tgcPrdContainer->indexFind(hash_id);
     if( colIt == tgcPrdContainer->end() ){
-      ATH_MSG_DEBUG(" TgcPrepDataCollection for:   " << m_idHelperTool->toStringChamber(detElId)
+      ATH_MSG_DEBUG(" TgcPrepDataCollection for:   " << m_idHelperSvc->toStringChamber(detElId)
 		    << "  not found in container " );
       return 0;
     }
@@ -1357,10 +1343,10 @@ namespace Muon {
     }
     if(rpcPrdContainer->size()==0) return 0;
     IdentifierHash hash_id;
-    m_idHelperTool->rpcIdHelper().get_module_hash(detElId,hash_id );
+    m_idHelperSvc->rpcIdHelper().get_module_hash(detElId,hash_id );
     RpcPrepDataContainer::const_iterator colIt = rpcPrdContainer->indexFind(hash_id);
     if( colIt == rpcPrdContainer->end() ){
-      ATH_MSG_DEBUG(" RpcPrepDataCollection for:   " << m_idHelperTool->toStringChamber(detElId) << "  not found in container " );
+      ATH_MSG_DEBUG(" RpcPrepDataCollection for:   " << m_idHelperSvc->toStringChamber(detElId) << "  not found in container " );
       return 0;
     }
     return *colIt;
@@ -1379,11 +1365,11 @@ namespace Muon {
     }
     if(stgcPrdContainer->size()==0) return 0;
     IdentifierHash hash_id;
-    m_idHelperTool->stgcIdHelper().get_module_hash(detElId, hash_id );
+    m_idHelperSvc->stgcIdHelper().get_module_hash(detElId, hash_id );
     
     sTgcPrepDataContainer::const_iterator colIt = stgcPrdContainer->indexFind(hash_id);
     if ( colIt == stgcPrdContainer->end() ) {
-      ATH_MSG_DEBUG(" StgcPrepDataCollection for:   " << m_idHelperTool->toStringChamber(detElId)
+      ATH_MSG_DEBUG(" StgcPrepDataCollection for:   " << m_idHelperSvc->toStringChamber(detElId)
 		    << "  not found in container " );
       return 0;
     }
@@ -1404,11 +1390,11 @@ namespace Muon {
     if(mmPrdContainer->size()==0) return 0;
     
     IdentifierHash hash_id;
-    m_idHelperTool->mmIdHelper().get_module_hash(detElId, hash_id );
+    m_idHelperSvc->mmIdHelper().get_module_hash(detElId, hash_id );
     
     MMPrepDataContainer::const_iterator colIt = mmPrdContainer->indexFind(hash_id);
     if ( colIt == mmPrdContainer->end() ) {
-      ATH_MSG_DEBUG(" MmPrepDataCollection for:   " << m_idHelperTool->toStringChamber(detElId)
+      ATH_MSG_DEBUG(" MmPrepDataCollection for:   " << m_idHelperSvc->toStringChamber(detElId)
 		    << "  not found in container " );
       return 0;
     }
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.h
index 0147d526635ed0752f4a737e4be872595d860241..8d48723831cd88e492fa205183aeea1e0d3541a7 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonChamberHoleRecoveryTool.h
@@ -8,12 +8,11 @@
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/ToolHandle.h"
-#include "Identifier/Identifier.h"
 #include "TrkParameters/TrackParameters.h"
 #include "TrkToolInterfaces/ITrackSelectorTool.h"
 #include "MuonRecHelperTools/IMuonEDMHelperSvc.h"
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 #include "MuonRecToolInterfaces/IMuonHoleRecoveryTool.h"
-#include "MuonIdHelpers/MuonStationIndex.h"
 #include "MuonCondData/MdtCondDbData.h"
 #include "TrkTrack/Track.h"
 
@@ -30,13 +29,6 @@ class StoreGateSvc;
 
 class MdtCondDbData;
 class MuonStationIntersectSvc;
-class RpcIdHelper;
-class MdtIdHelper;
-class CscIdHelper;
-class TgcIdHelper;
-// New Small Wheel
-class sTgcIdHelper;
-class MmIdHelper;
 
 namespace MuonGM {
   class MuonDetectorManager;
@@ -45,7 +37,6 @@ namespace MuonGM {
 namespace Muon {
   class IMdtDriftCircleOnTrackCreator;
   class IMuonClusterOnTrackCreator;
-  class MuonIdHelperTool;
   class MuonEDMPrinterTool;
 }
 
@@ -190,7 +181,7 @@ namespace Muon {
     ToolHandle<Muon::IMuonClusterOnTrackCreator>     m_clusRotCreator;    //!< IMuonClusterOnTrackCreator for trigger hits
 
     ToolHandle<Trk::IResidualPullCalculator>         m_pullCalculator;     //!< residual pull calculator
-    ToolHandle<Muon::MuonIdHelperTool>               m_idHelperTool;       //!< IdHelper tool
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
     ServiceHandle<Muon::IMuonEDMHelperSvc>           m_edmHelperSvc {this, "edmHelper", 
       "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc", 
       "Handle to the service providing the IMuonEDMHelperSvc interface" };         //!< EDM Helper tool
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.cxx
index a30733bb9077d09bd24b1d01f4eb12cc6c1908dd..257b1d743f3d3a599863c047f16ac1f2518b3270 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.cxx
@@ -7,7 +7,6 @@
 #include <iostream>
 
 // FrameWork includes
-//#include "CLHEP/Units/SystemOfUnits.h"
 #include "AthenaKernel/errorcheck.h"
 
 //Collections 
@@ -28,8 +27,6 @@
 
 
 #include "MuonRecHelperTools/MuonEDMPrinterTool.h"
-#include "MuonRecHelperTools/IMuonEDMHelperSvc.h"
-#include "MuonIdHelpers/MuonIdHelperTool.h"
 #include "MuonRecToolInterfaces/IMuonTrackExtrapolationTool.h"
 #include "MuonRecToolInterfaces/IMdtDriftCircleOnTrackCreator.h"
 #include "MuonRecToolInterfaces/IMuonClusterOnTrackCreator.h"
@@ -56,7 +53,6 @@ namespace Muon {
   MuonRefitTool::MuonRefitTool( const std::string& ty,const std::string& na,const IInterface* pa) : 
     AthAlgTool(ty,na,pa),
     m_printer("Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"),
-    m_idHelper("Muon::MuonIdHelperTool/MuonIdHelperTool"),
     m_alignErrorTool("MuonAlign::AlignmentErrorTool"),
     m_trackFitter("Trk::GlobalChi2Fitter/MCTBFitterMaterialFromTrack"),
     m_extrapolator("Trk::Extrapolator/AtlasExtrapolator"),
@@ -111,7 +107,6 @@ namespace Muon {
     declareProperty("UsedFixedError",m_fixedError = 1. );
     declareProperty("FlagT0FitRange",m_flagT0FitRange = 0.00005 );
     declareProperty("Printer", m_printer );
-    declareProperty("IdHelper", m_idHelper );
     declareProperty("AlignmentErrorTool", m_alignErrorTool);
     declareProperty("Extrapolator", m_extrapolator );
     declareProperty("MuonExtrapolator", m_muonExtrapolator );
@@ -150,7 +145,7 @@ namespace Muon {
 
     ATH_CHECK( m_printer.retrieve() );
     ATH_CHECK( m_edmHelperSvc.retrieve() );
-    ATH_CHECK( m_idHelper.retrieve() );
+    ATH_CHECK( m_idHelperSvc.retrieve() );
     if( !m_alignErrorTool.empty() ) ATH_CHECK(m_alignErrorTool.retrieve());
     ATH_CHECK( m_extrapolator.retrieve() );
     ATH_CHECK( m_muonExtrapolator.retrieve() );
@@ -159,9 +154,12 @@ namespace Muon {
     ATH_MSG_INFO("Retrieved " << m_trackFitter );
 
     ATH_CHECK( m_mdtRotCreator.retrieve() );
-    if( ! m_cscRotCreator.empty() ) ATH_CHECK( m_cscRotCreator.retrieve() );
-    if( ! m_triggerRotCreator.empty() ) ATH_CHECK( m_triggerRotCreator.retrieve() );
-    if( !m_compClusterCreator.empty() ) ATH_CHECK( m_compClusterCreator.retrieve() );
+    if(!m_cscRotCreator.empty()) {
+      if (!m_idHelperSvc->hasCSC()) ATH_MSG_WARNING("The current layout does not have any CSC chamber but you gave a CscRotCreator, ignoring it, but double-check configuration");
+      else ATH_CHECK( m_cscRotCreator.retrieve() );
+    }
+    if(!m_triggerRotCreator.empty()) ATH_CHECK( m_triggerRotCreator.retrieve() );
+    if(!m_compClusterCreator.empty()) ATH_CHECK( m_compClusterCreator.retrieve() );
 
     if( !m_t0Fitter.empty() ){
       ATH_CHECK( m_t0Fitter.retrieve() );
@@ -413,18 +411,18 @@ namespace Muon {
            // bool to decide if deviation should be skipped (if it's for more than 1 station)
            for(auto riowithdev : vec_riowithdev){
               Identifier id_riowithdev = riowithdev->identify();
-              if(m_idHelper->isEndcap(id_riowithdev)) {
+              if(m_idHelperSvc->isEndcap(id_riowithdev)) {
                  isEndcap = true;
               } else {
                  isBarrel = true;
               }
-              if(m_idHelper->isSmallChamber(id_riowithdev)) {
+              if(m_idHelperSvc->isSmallChamber(id_riowithdev)) {
                 isSmallChamber = true;
               } else {
                 isLargeChamber = true;
               }
               hitids.push_back(id_riowithdev);
-              if( hitids.size()>1 &&  m_idHelper->chamberId(id_riowithdev) !=  m_idHelper->chamberId(hitids[0]) ) {
+              if( hitids.size()>1 &&  m_idHelperSvc->chamberId(id_riowithdev) !=  m_idHelperSvc->chamberId(hitids[0]) ) {
                 differentChambers = true;
                 jdifferent = hitids.size()-1; 
               } 
@@ -444,18 +442,6 @@ namespace Muon {
                  } else {
                    ATH_MSG_ERROR("One of the alignment deviations has an invalid hash created from the hits.");
                  }
-                 /* std::vector<Identifier> hitidsRot;
-                 itRot->getListOfHits(vec_riowithdev);
-                 for(auto riowithdev : vec_riowithdev){
-                   Identifier id_riowithdev = riowithdev->identify();
-                   hitidsRot.push_back(id_riowithdev);
-                   if(id_riowithdev==hitids[0]) {
-                     angleError = sqrt(itRot->getCovariance(0,0));
-                     matchFound = true;
-                     break;
-                   }
-                 }
-                 if(matchFound) usedRotations.push_back(iRot); */
                }
                if(matchFound) break; 
              }
@@ -466,13 +452,13 @@ namespace Muon {
            iok++;  
            alignerrmap.insert( std::pair < std::vector<Identifier>, std::pair < double, double > > ( hitids, std::pair < double, double > (translationError,angleError) ) );
 
-           if(matchFound) ATH_MSG_DEBUG(" AlignmentMap entry " <<  iok  << " filled with nr hitids " << hitids.size() << " " << m_idHelper->toString(hitids[0]) <<  " translationError " << translationError << " angleError " << angleError );
-           if(!matchFound) ATH_MSG_DEBUG(" AlignmentMap entry No angleError" <<  iok  << " filled with nr hitids " << hitids.size() << " " << m_idHelper->toString(hitids[0]) <<  " translationError " << translationError << " angleError " << angleError );
+           if(matchFound) ATH_MSG_DEBUG(" AlignmentMap entry " <<  iok  << " filled with nr hitids " << hitids.size() << " " << m_idHelperSvc->toString(hitids[0]) <<  " translationError " << translationError << " angleError " << angleError );
+           if(!matchFound) ATH_MSG_DEBUG(" AlignmentMap entry No angleError" <<  iok  << " filled with nr hitids " << hitids.size() << " " << m_idHelperSvc->toString(hitids[0]) <<  " translationError " << translationError << " angleError " << angleError );
            if(isEndcap) ATH_MSG_DEBUG(" AlignmentMap Endcap Chamber "); 
            if(isBarrel) ATH_MSG_DEBUG(" AlignmentMap Barrel Chamber "); 
            if(isSmallChamber) ATH_MSG_DEBUG(" AlignmentMap Small Chamber ");
            if(isLargeChamber) ATH_MSG_DEBUG(" AlignmentMap Large Chamber ");
-           if(differentChambers) ATH_MSG_DEBUG(" AlignmentMap entry " <<  iok  << " for different Chamber " <<  m_idHelper->toString(hitids[jdifferent]) );
+           if(differentChambers) ATH_MSG_DEBUG(" AlignmentMap entry " <<  iok  << " for different Chamber " <<  m_idHelperSvc->toString(hitids[jdifferent]) );
         }
       }
 
@@ -499,12 +485,12 @@ namespace Muon {
            // bool to decide if deviation should be skipped (if it's for more than 1 station)
            for(auto riowithdev : vec_riowithdev){
               Identifier id_riowithdev = riowithdev->identify();
-              if(m_idHelper->isEndcap(id_riowithdev)) {
+              if(m_idHelperSvc->isEndcap(id_riowithdev)) {
                  isEndcap = true;
               } else {
                  isBarrel = true;
               }
-              if(m_idHelper->isSmallChamber(id_riowithdev)) {
+              if(m_idHelperSvc->isSmallChamber(id_riowithdev)) {
                 isSmallChamber = true;
               } else {
                 isLargeChamber = true;
@@ -517,7 +503,7 @@ namespace Muon {
 
            iok++;  
            alignerrmap.insert( std::pair < std::vector<Identifier>, std::pair < double, double > > ( hitids, std::pair < double, double > (translationError,angleError) ) );
-           ATH_MSG_DEBUG(" AlignmentMap entry No Translation Error " <<  iok  << " filled with nr hitids " << hitids.size() << " " << m_idHelper->toString(hitids[0]) <<  " translationError " << translationError << " angleError " << angleError );
+           ATH_MSG_DEBUG(" AlignmentMap entry No Translation Error " <<  iok  << " filled with nr hitids " << hitids.size() << " " << m_idHelperSvc->toString(hitids[0]) <<  " translationError " << translationError << " angleError " << angleError );
           if(isEndcap) ATH_MSG_DEBUG(" AlignmentMap Endcap Chamber"); 
           if(isBarrel) ATH_MSG_DEBUG(" AlignmentMap Barrel Chamber"); 
           if(isSmallChamber) ATH_MSG_DEBUG(" AlignmentMap Small Chamber ");
@@ -560,10 +546,9 @@ namespace Muon {
         if( !meas ) {
           continue;
         }
-//        if( (*tsit)->type(Trk::TrackStateOnSurface::Outlier) ) continue;
         Identifier id = m_edmHelperSvc->getIdentifier(*meas);
 
-        if( m_idHelper->isMdt(id) ) stationIds.insert( m_idHelper->chamberIndex(id) );
+        if( m_idHelperSvc->isMdt(id) ) stationIds.insert( m_idHelperSvc->chamberIndex(id) );
 
 // make Alignment Effect using the surface of the TSOS 
 
@@ -682,20 +667,19 @@ namespace Muon {
       } 
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
       // Not a ROT, else it would have had an identifier. Keep the TSOS.
-      if( !id.is_valid() || !m_idHelper->isMuon(id) ) continue;
-      MuonStationIndex::StIndex stIndex = m_idHelper->stationIndex(id);
+      if( !id.is_valid() || !m_idHelperSvc->isMuon(id) ) continue;
+      MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(id);
 // skip phi measurements  
-      if( (m_idHelper->isTrigger(id)&&m_idHelper->measuresPhi(id)) || (m_idHelper->isCsc(id)&&m_idHelper->measuresPhi(id) ) ) continue;
+      if( (m_idHelperSvc->isTrigger(id)&&m_idHelperSvc->measuresPhi(id)) || (m_idHelperSvc->isCsc(id)&&m_idHelperSvc->measuresPhi(id) ) ) continue;
       if(m_addAll) {
 // skip RPC and TGC eta (to avoid code crashes) 
-        if( m_idHelper->isTrigger(id)) continue;
-//        if( m_idHelper->isTrigger(id) && (stIndex == MuonStationIndex::BM || stIndex == MuonStationIndex::BO) ) continue;
+        if( m_idHelperSvc->isTrigger(id)) continue;
         if(indexFirst==-1) indexFirst = index;
         indicesOfAffectedTSOS.push_back(*tsit);  
         indicesOfAffectedIds.push_back(id);  
       } else {
 // skip trigger hits and CSC phi measurements  and select precision hits
-        if( m_idHelper->isTrigger(id)) continue;
+        if( m_idHelperSvc->isTrigger(id)) continue;
         if( stIndex == MuonStationIndex::BM || stIndex == MuonStationIndex::EM) {
           if(indexFirst==-1) indexFirst = index;
           indicesOfAffectedTSOS.push_back(*tsit);  
@@ -838,10 +822,10 @@ namespace Muon {
       
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
       // Not a ROT, else it would have had an identifier. Keep the TSOS.
-      if( !id.is_valid() || !m_idHelper->isMuon(id) ) continue;
-      if( m_idHelper->isTrigger(id) || (m_idHelper->isCsc(id)&&m_idHelper->measuresPhi(id) ) ) continue;
-      MuonStationIndex::StIndex stIndex = m_idHelper->stationIndex(id);
-      int sector = m_idHelper->sector(id);
+      if( !id.is_valid() || !m_idHelperSvc->isMuon(id) ) continue;
+      if( m_idHelperSvc->isTrigger(id) || (m_idHelperSvc->isCsc(id)&&m_idHelperSvc->measuresPhi(id) ) ) continue;
+      MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(id);
+      int sector = m_idHelperSvc->sector(id);
       stationsPerSector[sector].insert(stIndex);
     }
   
@@ -984,7 +968,7 @@ namespace Muon {
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
       
       // Not a ROT, else it would have had an identifier. Keep the TSOS.
-      if( !id.is_valid() || !m_idHelper->isMuon(id) ){
+      if( !id.is_valid() || !m_idHelperSvc->isMuon(id) ){
 	newStates.push_back( std::make_pair(false,*tsit) );	
 	continue;
       }
@@ -993,9 +977,9 @@ namespace Muon {
 	newStates.push_back( std::make_pair(false,*tsit) );	
       }else{
 
-	Identifier chId = m_idHelper->chamberId(id);
-	MuonStationIndex::StIndex stIndex = m_idHelper->stationIndex(id);
-	if( m_idHelper->isMdt(id)  ) {
+	Identifier chId = m_idHelperSvc->chamberId(id);
+	MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(id);
+	if( m_idHelperSvc->isMdt(id)  ) {
 
 	  const MdtDriftCircleOnTrack* mdt = dynamic_cast<const MdtDriftCircleOnTrack*>(meas);
 	  if( !mdt ){
@@ -1012,16 +996,16 @@ namespace Muon {
 	  }
       
 	  const Trk::RIO_OnTrack* rot = 0;
-	  int sector = m_idHelper->sector(id);
+	  int sector = m_idHelperSvc->sector(id);
 	  Trk::TrackStateOnSurface::TrackStateOnSurfaceType type = (*tsit)->type(Trk::TrackStateOnSurface::Outlier) ? 
 	    Trk::TrackStateOnSurface::Outlier : Trk::TrackStateOnSurface::Measurement;
 	  
-	  stIndex = m_idHelper->stationIndex(id);
+	  stIndex = m_idHelperSvc->stationIndex(id);
 
 	  // error update for three stations with barrel-endcap and shared sectors
 	  if( !m_deweightTwoStationTracks || nmaxStations > 2 ){
-	    if( m_deweightEEL1C05 && stIndex == MuonStationIndex::EE && m_idHelper->chamberIndex(id) == MuonStationIndex::EEL &&
-		m_idHelper->stationEta(id) < 0 && m_idHelper->stationPhi(id) == 3){
+	    if( m_deweightEEL1C05 && stIndex == MuonStationIndex::EE && m_idHelperSvc->chamberIndex(id) == MuonStationIndex::EEL &&
+		m_idHelperSvc->stationEta(id) < 0 && m_idHelperSvc->stationPhi(id) == 3){
 	      //for this chamber the errors are enormous (for a period of time)
 	      rot = m_mdtRotCreator->updateError( *mdt, pars, &m_errorStrategyEEL1C05 ); 
 
@@ -1050,32 +1034,27 @@ namespace Muon {
 	      //std::cout << " MUONREFIT deweightEE " << std::endl;
 	      rot = m_mdtRotCreator->updateError( *mdt, pars, &m_errorStrategyEE );
 
-	    }else if( m_deweightBIS78 && stIndex == MuonStationIndex::BI && m_idHelper->chamberIndex(id) == MuonStationIndex::BIS &&
-		      abs(m_idHelper->stationEta(id)) > 6 ){
+	    }else if( m_deweightBIS78 && stIndex == MuonStationIndex::BI && m_idHelperSvc->chamberIndex(id) == MuonStationIndex::BIS &&
+		      abs(m_idHelperSvc->stationEta(id)) > 6 ){
 
 	      rot = m_mdtRotCreator->updateError( *mdt, pars, &m_errorStrategyBIS78 ); 
 
-	    }else if( m_deweightBME && stIndex == MuonStationIndex::BM && m_idHelper->stationPhi(id) == 7 && 
-		      (m_idHelper->mdtIdHelper()).stationName(id) == 53 ){
+	    }else if( m_deweightBME && stIndex == MuonStationIndex::BM && m_idHelperSvc->stationPhi(id) == 7 && 
+		      (m_idHelperSvc->mdtIdHelper()).stationName(id) == 53 ){
 
 	      rot = m_mdtRotCreator->updateError( *mdt, pars, &m_errorStrategyBXE ); 
 
-	    }else if( m_deweightBOE && stIndex == MuonStationIndex::BO && m_idHelper->chamberIndex(id) == MuonStationIndex::BOL &&
-		      abs(m_idHelper->stationEta(id)) == 7 && m_idHelper->stationPhi(id) == 7){
+	    }else if( m_deweightBOE && stIndex == MuonStationIndex::BO && m_idHelperSvc->chamberIndex(id) == MuonStationIndex::BOL &&
+		      abs(m_idHelperSvc->stationEta(id)) == 7 && m_idHelperSvc->stationPhi(id) == 7){
 
 	      rot = m_mdtRotCreator->updateError( *mdt, pars, &m_errorStrategyBXE ); 
 
 	    }else{
 	      /** default strategy */
-	      //std::cout << " MUONREFIT updateError " << std::endl;
-//	      if( !m_alignErrorTool.empty() && !alignerrmap.empty() ) {
-//	        rot = m_mdtRotCreator->updateErrorExternal( *mdt, pars, &alignerrmap);
-//	      } else {
 	        MuonDriftCircleErrorStrategy strat(m_errorStrategy);
 	        if( hasT0Fit )       strat.setParameter(MuonDriftCircleErrorStrategy::T0Refit,true);
 	        if( settings.broad ) strat.setParameter(MuonDriftCircleErrorStrategy::BroadError,true);
 	        rot =  m_mdtRotCreator->updateError( *mdt, pars, &strat );
-//	      }
 	    }
 	  }else{
 	    rot = m_mdtRotCreator->updateError( *mdt, pars, &m_errorStrategyTwoStations );
@@ -1098,7 +1077,7 @@ namespace Muon {
 	    
 
 	  if( msgLvl(MSG::DEBUG) ){
-	    msg() << m_idHelper->toString(newMdt->identify()) << " radius " << newMdt->driftRadius() 
+	    msg() << m_idHelperSvc->toString(newMdt->identify()) << " radius " << newMdt->driftRadius() 
 		  << " new err " << Amg::error(newMdt->localCovariance(),Trk::locR) 
 		  << " old err " << Amg::error(mdt->localCovariance(),Trk::locR);
 	    if( hasT0Fit ) msg() << " HasT0";
@@ -1110,7 +1089,7 @@ namespace Muon {
 
 	  Trk::TrackStateOnSurface* tsos = MuonTSOSHelper::createMeasTSOSWithUpdate( **tsit, newMdt, pars->clone(), type );
 	  newStates.push_back( std::make_pair(true,tsos) );	
-	}else if( m_idHelper->isCsc(id) ) {
+	}else if( m_idHelperSvc->isCsc(id) ) {
 	  
 	  if( settings.chambersToBeremoved.count(chId) || settings.precisionLayersToBeremoved.count(stIndex) ){
 
@@ -1122,11 +1101,11 @@ namespace Muon {
 	    newStates.push_back( std::make_pair(false,*tsit) );	
 
 	  }
-	}else if(  m_idHelper->isTrigger(id) ){
+	}else if(  m_idHelperSvc->isTrigger(id) ){
 
-	  if( m_idHelper->measuresPhi(id) ){
+	  if( m_idHelperSvc->measuresPhi(id) ){
 
-	    MuonStationIndex::PhiIndex phiIndex = m_idHelper->phiIndex(id);
+	    MuonStationIndex::PhiIndex phiIndex = m_idHelperSvc->phiIndex(id);
 
 	    if( settings.chambersToBeremoved.count(chId) || settings.phiLayersToBeremoved.count(phiIndex) ){
 
@@ -1151,11 +1130,11 @@ namespace Muon {
 	      
 	    }
 	  }
-	}else if( m_idHelper->isMM(id) || m_idHelper->issTgc(id) ){
+	}else if( m_idHelperSvc->isMM(id) || m_idHelperSvc->issTgc(id) ){
 	  newStates.push_back( std::make_pair(false,*tsit) );	
 
 	}else{
-	  ATH_MSG_WARNING(" unknown Identifier " << m_idHelper->mdtIdHelper().print_to_string(id) ); 
+	  ATH_MSG_WARNING(" unknown Identifier " << m_idHelperSvc->mdtIdHelper().print_to_string(id) ); 
 	}
       }
     }
@@ -1233,8 +1212,8 @@ namespace Muon {
       
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
       // Not a ROT, else it would have had an identifier. Keep the TSOS.
-      if( !id.is_valid() || !m_idHelper->isMuon(id) ) continue;
-      if( m_idHelper->isTrigger(id) || (m_idHelper->isCsc(id)&&m_idHelper->measuresPhi(id) ) ) continue;
+      if( !id.is_valid() || !m_idHelperSvc->isMuon(id) ) continue;
+      if( m_idHelperSvc->isTrigger(id) || (m_idHelperSvc->isCsc(id)&&m_idHelperSvc->measuresPhi(id) ) ) continue;
     }
   
     if( !startPars ){
@@ -1308,7 +1287,7 @@ namespace Muon {
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
       
       // Not a ROT, else it would have had an identifier. Keep the TSOS.
-      if( !id.is_valid() || !m_idHelper->isMuon(id) ){
+      if( !id.is_valid() || !m_idHelperSvc->isMuon(id) ){
 	newStates.push_back( std::make_pair(false,*tsit) );	
 	continue;
       }
@@ -1317,9 +1296,9 @@ namespace Muon {
 	newStates.push_back( std::make_pair(false,*tsit) );	
       }else{
 
-	Identifier chId = m_idHelper->chamberId(id);
-	MuonStationIndex::StIndex stIndex = m_idHelper->stationIndex(id);
-	if( m_idHelper->isMdt(id)  ) {
+	Identifier chId = m_idHelperSvc->chamberId(id);
+	MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(id);
+	if( m_idHelperSvc->isMdt(id)  ) {
 
 	  const MdtDriftCircleOnTrack* mdt = dynamic_cast<const MdtDriftCircleOnTrack*>(meas);
 	  if( !mdt ){
@@ -1336,11 +1315,10 @@ namespace Muon {
 	  }
       
 	  const Trk::RIO_OnTrack* rot = 0;
-//	  int sector = m_idHelper->sector(id);
 	  Trk::TrackStateOnSurface::TrackStateOnSurfaceType type = (*tsit)->type(Trk::TrackStateOnSurface::Outlier) ? 
 	    Trk::TrackStateOnSurface::Outlier : Trk::TrackStateOnSurface::Measurement;
 	  
-	  stIndex = m_idHelper->stationIndex(id);
+	  stIndex = m_idHelperSvc->stationIndex(id);
 
 // use the muonErrorStrategy
 	  MuonDriftCircleErrorStrategy strat(m_muonErrorStrategy);
@@ -1353,19 +1331,13 @@ namespace Muon {
 	    newMdt = mdt->clone();
 	    type = Trk::TrackStateOnSurface::Outlier;
 	  }
-	  if( settings.removeOtherSectors ) {
-//	    if( sector != selectedSector ){
-//	      ++removedSectorHits;
-//	      type = Trk::TrackStateOnSurface::Outlier;
-//	    }
-	  }
 	  if( settings.chambersToBeremoved.count(chId) || settings.precisionLayersToBeremoved.count(stIndex) ){
 	    type = Trk::TrackStateOnSurface::Outlier;
 	  }
 	    
 
 	  if( msgLvl(MSG::DEBUG) ){
-	    msg() << " updateMdtErrors " << m_idHelper->toString(newMdt->identify()) << " radius " << newMdt->driftRadius() 
+	    msg() << " updateMdtErrors " << m_idHelperSvc->toString(newMdt->identify()) << " radius " << newMdt->driftRadius() 
 		  << " new err " << Amg::error(newMdt->localCovariance(),Trk::locR) 
 		  << " old err " << Amg::error(mdt->localCovariance(),Trk::locR);
 	    if( hasT0Fit ) msg() << " HasT0";
@@ -1377,7 +1349,7 @@ namespace Muon {
 
 	  Trk::TrackStateOnSurface* tsos = MuonTSOSHelper::createMeasTSOSWithUpdate( **tsit, newMdt, pars->clone(), type );
 	  newStates.push_back( std::make_pair(true,tsos) );	
-	}else if( m_idHelper->isCsc(id) ) {
+	}else if( m_idHelperSvc->isCsc(id) ) {
 	  
 	  if( settings.chambersToBeremoved.count(chId) || settings.precisionLayersToBeremoved.count(stIndex) ){
 
@@ -1389,11 +1361,11 @@ namespace Muon {
 	    newStates.push_back( std::make_pair(false,*tsit) );	
 
 	  }
-	}else if(  m_idHelper->isTrigger(id) ){
+	}else if(  m_idHelperSvc->isTrigger(id) ){
 
-	  if( m_idHelper->measuresPhi(id) ){
+	  if( m_idHelperSvc->measuresPhi(id) ){
 
-	    MuonStationIndex::PhiIndex phiIndex = m_idHelper->phiIndex(id);
+	    MuonStationIndex::PhiIndex phiIndex = m_idHelperSvc->phiIndex(id);
 
 	    if( settings.chambersToBeremoved.count(chId) || settings.phiLayersToBeremoved.count(phiIndex) ){
 
@@ -1418,11 +1390,11 @@ namespace Muon {
 	      
 	    }
 	  }
-	}else if( m_idHelper->isMM(id) || m_idHelper->issTgc(id) ){
+	}else if( m_idHelperSvc->isMM(id) || m_idHelperSvc->issTgc(id) ){
 	  newStates.push_back( std::make_pair(false,*tsit) );	
 
 	}else{
-	  ATH_MSG_WARNING(" unknown Identifier " << m_idHelper->mdtIdHelper().print_to_string(id) ); 
+	  ATH_MSG_WARNING(" unknown Identifier " << m_idHelperSvc->mdtIdHelper().print_to_string(id) ); 
 	}
       }
     }
@@ -1489,7 +1461,7 @@ namespace Muon {
 	continue;
       }
 
-      if( m_idHelper->isMdt(id) ) {
+      if( m_idHelperSvc->isMdt(id) ) {
       
 	const MdtDriftCircleOnTrack* mdt = dynamic_cast<const MdtDriftCircleOnTrack*>(meas);
 	if( !mdt ){
@@ -1497,7 +1469,7 @@ namespace Muon {
 	  continue;
 	}
 	// get ch ID
-	Identifier chId = m_idHelper->chamberId(id);
+	Identifier chId = m_idHelperSvc->chamberId(id);
 
 	// if we have a new chambers
 	if( chId != currentMdtChId ){
@@ -1505,7 +1477,7 @@ namespace Muon {
 	  // check that there are pars (not the case for the first mdt), if so we collected all hits for this chamber so call cleaning
 	  if( chamberPars ){
 	    if( !removeMdtOutliers(*chamberPars,mdts,removedIdentifiers,settings) ){
-	      if( mdts.size() > 4 ) ATH_MSG_WARNING("Problem removing outliers in chamber " << m_idHelper->toStringChamber(currentMdtChId) << " hits " << mdts.size());
+	      if( mdts.size() > 4 ) ATH_MSG_WARNING("Problem removing outliers in chamber " << m_idHelperSvc->toStringChamber(currentMdtChId) << " hits " << mdts.size());
 	      if( settings.discardNotCleanedTracks ) return 0;
 	    }
 	  }
@@ -1522,7 +1494,7 @@ namespace Muon {
     // clean the last chamber on the track
     if( chamberPars ){
       if( !removeMdtOutliers(*chamberPars,mdts,removedIdentifiers,settings) ){
-	if( mdts.size() > 4 ) ATH_MSG_WARNING("Problem removing outliers in chamber " << m_idHelper->toStringChamber(currentMdtChId) << " hits " << mdts.size());
+	if( mdts.size() > 4 ) ATH_MSG_WARNING("Problem removing outliers in chamber " << m_idHelperSvc->toStringChamber(currentMdtChId) << " hits " << mdts.size());
 	if( settings.discardNotCleanedTracks ) return 0;
       }
     }
@@ -1601,7 +1573,6 @@ namespace Muon {
 	continue;
       }
       Identifier id = mdt->identify();
-      //Identifier elId = m_idHelper->mdtIdHelper().elementID( id );
 
       if( !detEl ){
 	detEl = mdt->prepRawData()->detectorElement();
@@ -1617,12 +1588,12 @@ namespace Muon {
 
       double r  = fabs(mdt->localParameters()[Trk::locR]);
       double dr = Amg::error(mdt->localCovariance(),Trk::locR);
-      ATH_MSG_VERBOSE("New MDT " << m_idHelper->toString(id) << "  r " << mdt->localParameters()[Trk::locR] 
+      ATH_MSG_VERBOSE("New MDT " << m_idHelperSvc->toString(id) << "  r " << mdt->localParameters()[Trk::locR] 
 		      << " dr  " << dr << "  (original) " << Amg::error(mdt->localCovariance(),Trk::locR) );
 
       // create identifier
-      TrkDriftCircleMath::MdtId mdtid( m_idHelper->mdtIdHelper().isBarrel(id),m_idHelper->mdtIdHelper().multilayer(id)-1, 
-				       m_idHelper->mdtIdHelper().tubeLayer(id)-1, m_idHelper->mdtIdHelper().tube(id)-1 );
+      TrkDriftCircleMath::MdtId mdtid( m_idHelperSvc->mdtIdHelper().isBarrel(id),m_idHelperSvc->mdtIdHelper().multilayer(id)-1, 
+				       m_idHelperSvc->mdtIdHelper().tubeLayer(id)-1, m_idHelperSvc->mdtIdHelper().tube(id)-1 );
 
       // create new DriftCircle
       TrkDriftCircleMath::DriftCircle dc( lpos, r, 1., dr, TrkDriftCircleMath::DriftCircle::InTime, mdtid, index, mdt );
@@ -1781,7 +1752,7 @@ namespace Muon {
     std::vector< std::pair<Identifier,bool> >::iterator iit_end = indexIdMap.end();
     for( ;iit!=iit_end;++iit ){
       if(iit->second){
-	ATH_MSG_VERBOSE(" removing hit " << m_idHelper->toString( iit->first ) );
+	ATH_MSG_VERBOSE(" removing hit " << m_idHelperSvc->toString( iit->first ) );
 	removedIdentifiers.insert( iit->first );
       }
     }
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.h
index 9a1f297fb82650caa999082fbe7724d43cb7d381..d3de2d1869e7619b5e7ed63ee4f7f412a7536db9 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonRefitTool.h
@@ -19,13 +19,12 @@
 
 #include "TrkDriftCircleMath/DCSLFitter.h"
 #include "TrkDriftCircleMath/SegmentFinder.h"
-#include "Identifier/Identifier.h"
 #include "TrkParameters/TrackParameters.h"
 #include "MuonRIO_OnTrack/MuonDriftCircleErrorStrategy.h"
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 
 namespace Muon {
   class MuonEDMPrinterTool;
-  class MuonIdHelperTool;
   class IMdtDriftCircleOnTrackCreator;
   class IMuonClusterOnTrackCreator;
   class IMuonCompetingClustersOnTrackCreator;
@@ -86,7 +85,7 @@ namespace Muon {
     ServiceHandle<IMuonEDMHelperSvc> m_edmHelperSvc {this, "edmHelper", 
       "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc", 
       "Handle to the service providing the IMuonEDMHelperSvc interface" }; //<! muon EDM helper
-    ToolHandle<MuonIdHelperTool>    m_idHelper; //<! muon id helper
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
     ToolHandle<Trk::ITrkAlignmentDeviationTool>  m_alignErrorTool; //<! alignment error tool
 
     struct State {
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
index 111825c782676267ae459f863caa8424aa968b9a..43866f76465e40431f3869770732f8999704ede9 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
@@ -45,11 +45,13 @@ namespace Muon {
   }
         
   StatusCode MuPatCandidateTool::initialize(){
-
+    ATH_CHECK( m_idHelperSvc.retrieve() );
     ATH_CHECK( m_mdtRotCreator.retrieve() );
-    if ( ! m_cscRotCreator.empty() ) ATH_CHECK( m_cscRotCreator.retrieve() );
+    if (!m_cscRotCreator.empty()) {
+      if (!m_idHelperSvc->hasCSC()) ATH_MSG_WARNING("The current layout does not have any CSC chamber but you gave a CscRotCreator, ignoring it, but double-check configuration");
+      else ATH_CHECK( m_cscRotCreator.retrieve() );
+    }
     ATH_CHECK( m_compClusterCreator.retrieve() );
-    ATH_CHECK( m_idHelperTool.retrieve() );
     ATH_CHECK( m_hitHandler.retrieve() );
     ATH_CHECK( m_edmHelperSvc.retrieve() );
     ATH_CHECK( m_printer.retrieve() );
@@ -65,31 +67,31 @@ namespace Muon {
   MuPatSegment* MuPatCandidateTool::createSegInfo( const MuonSegment& segment ) const
   {
     Identifier chid = m_edmHelperSvc->chamberId(segment);
-    if( m_idHelperTool->isTrigger(chid) ){
-      ATH_MSG_WARNING("Trigger hit only segments not supported " << m_idHelperTool->toStringChamber(chid) );
+    if( m_idHelperSvc->isTrigger(chid) ){
+      ATH_MSG_WARNING("Trigger hit only segments not supported " << m_idHelperSvc->toStringChamber(chid) );
       return 0;
     }
     MuPatSegment* info = new MuPatSegment();
     info->segment = &segment;
     info->chid = chid;
-    info->chIndex = m_idHelperTool->chamberIndex(info->chid);
+    info->chIndex = m_idHelperSvc->chamberIndex(info->chid);
     std::set<Identifier> chIds = m_edmHelperSvc->chamberIds(segment);
     std::set<Identifier>::iterator chit = chIds.begin();
     std::set<Identifier>::iterator chit_end = chIds.end();
     for( ;chit!=chit_end;++chit ){
-      MuonStationIndex::ChIndex chIdx = m_idHelperTool->chamberIndex(*chit);
+      MuonStationIndex::ChIndex chIdx = m_idHelperSvc->chamberIndex(*chit);
       info->addChamber(chIdx);
       // set default name
       if ( !info->name.empty() ) info->name += "+";
       // stationname_eta_phi
       std::ostringstream oss;
       oss << MuonStationIndex::chName(chIdx)
-          << "_" << m_idHelperTool->stationEta(*chit) << "_" << m_idHelperTool->stationPhi(*chit);
+          << "_" << m_idHelperSvc->stationEta(*chit) << "_" << m_idHelperSvc->stationPhi(*chit);
       info->name += oss.str();
     }
-    info->stIndex = m_idHelperTool->stationIndex(info->chid);
-    info->isEndcap = m_idHelperTool->isEndcap(info->chid);
-    info->isMdt = m_idHelperTool->isMdt(info->chid);
+    info->stIndex = m_idHelperSvc->stationIndex(info->chid);
+    info->isEndcap = m_idHelperSvc->isEndcap(info->chid);
+    info->isMdt = m_idHelperSvc->isMdt(info->chid);
     info->usedInFit = 0;
     info->quality = m_segmentSelector->quality( segment );
     info->segQuality = dynamic_cast<const MuonSegmentQuality*>(segment.fitQuality());
@@ -260,18 +262,18 @@ namespace Muon {
       }
 
       // skip ID hits
-      if( !m_idHelperTool->isMuon(id) ) continue;
+      if( !m_idHelperSvc->isMuon(id) ) continue;
 
-      Identifier chId = m_idHelperTool->chamberId(id);
-      MuonStationIndex::ChIndex chIndex = m_idHelperTool->chamberIndex(chId);
-      MuonStationIndex::StIndex stIndex = m_idHelperTool->stationIndex(chId);      
-      if( !hasEndcap ) hasEndcap = m_idHelperTool->isEndcap(id);
+      Identifier chId = m_idHelperSvc->chamberId(id);
+      MuonStationIndex::ChIndex chIndex = m_idHelperSvc->chamberIndex(chId);
+      MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(chId);      
+      if( !hasEndcap ) hasEndcap = m_idHelperSvc->isEndcap(id);
 
       bool measuresPhi = false;
       
-      bool isMdt =  m_idHelperTool->isMdt(id);
-      bool isCsc = m_idHelperTool->isCsc(id); 
-      bool isNSW = m_idHelperTool->isMM(id) || m_idHelperTool->issTgc(id); 
+      bool isMdt =  m_idHelperSvc->isMdt(id);
+      bool isCsc = m_idHelperSvc->isCsc(id); 
+      bool isNSW = m_idHelperSvc->isMM(id) || m_idHelperSvc->issTgc(id); 
       // only add precision hits 
       if( isMdt || isCsc || isNSW ) { 
 	entry.addChamber(chIndex); // will also add stationIndex 
@@ -287,7 +289,7 @@ namespace Muon {
 	  }else{	
 	    const MdtDriftCircleOnTrack* mdt = dynamic_cast<const MdtDriftCircleOnTrack*>(meas);
 	    if( !mdt ){
-	      ATH_MSG_WARNING(" found MdtDriftCircleOnTrack without MDT identifier " << m_idHelperTool->toString(id) );
+	      ATH_MSG_WARNING(" found MdtDriftCircleOnTrack without MDT identifier " << m_idHelperSvc->toString(id) );
 	      continue;
 	    }
 	    ATH_MSG_DEBUG(" recreating MdtDriftCircleOnTrack " );
@@ -298,7 +300,7 @@ namespace Muon {
 	}
       
 
-	bool isSmall = m_idHelperTool->isSmallChamber(id);
+	bool isSmall = m_idHelperSvc->isSmallChamber(id);
 	if( isSmall ) hasSmall = true;
 	else          hasLarge = true;
 
@@ -306,20 +308,20 @@ namespace Muon {
         previssmall=isSmall;
         prevstIndex=stIndex;
  
-	unsigned int ml = m_idHelperTool->mdtIdHelper().multilayer(id);
+	unsigned int ml = m_idHelperSvc->mdtIdHelper().multilayer(id);
 	if( ml == 1 ) ++nmdtHitsMl1;
 	else          ++nmdtHitsMl2;
       }else{
 
-	measuresPhi = m_idHelperTool->measuresPhi(id);
+	measuresPhi = m_idHelperSvc->measuresPhi(id);
 	
-	bool isRpc = m_idHelperTool->isRpc(id);
+	bool isRpc = m_idHelperSvc->isRpc(id);
 	if( isRpc ){
 	  if( measuresPhi ) ++nrpcHitsPhi;
 	  else              ++nrpcHitsEta;
 	}
 
-	bool isTgc = m_idHelperTool->isTgc(id);
+	bool isTgc = m_idHelperSvc->isTgc(id);
 	if( isTgc ){
 	  if( measuresPhi ) ++ntgcHitsPhi;
 	  else              ++ntgcHitsEta;
@@ -330,7 +332,7 @@ namespace Muon {
 	  if( recreateCSC ) {
 	    const CscClusterOnTrack* csc = dynamic_cast<const CscClusterOnTrack*>(meas);
 	    if( !csc ){
-	      ATH_MSG_WARNING(" found CscClusterOnTrack without CSC identifier " << m_idHelperTool->toString(id) );
+	      ATH_MSG_WARNING(" found CscClusterOnTrack without CSC identifier " << m_idHelperSvc->toString(id) );
 	      continue;
 	    }
 	    ATH_MSG_DEBUG(" recreating CscClusterOnTrack " );
@@ -398,7 +400,7 @@ namespace Muon {
       }else{
 	Identifier id = m_edmHelperSvc->getIdentifier(meas);
 	ATH_MSG_WARNING(" Trigger Measurement is not a MuonClusterOnTrack or CompetingMuonClustersOnTrack!!  " 
-	       << m_idHelperTool->toString(id) );	    
+	       << m_idHelperSvc->toString(id) );	    
       }
     }
   }
@@ -420,7 +422,7 @@ namespace Muon {
       const MuonClusterOnTrack* clus = *it;
       
       Identifier id = clus->identify();
-      Identifier detId = m_idHelperTool->detElId(id);
+      Identifier detId = m_idHelperSvc->detElId(id);
       idClusters[detId].push_back(clus);
     }
 
@@ -430,23 +432,23 @@ namespace Muon {
     IdClusIt chit_end = idClusters.end();
     for( ;chit!=chit_end;++chit ){
       if( msgLvl(MSG::VERBOSE) ) {
-        msg(MSG::VERBOSE) << " in " << m_idHelperTool->toStringDetEl(chit->first)
+        msg(MSG::VERBOSE) << " in " << m_idHelperSvc->toStringDetEl(chit->first)
           << "  clusters: " << chit->second.size() << std::endl;
 
-        std::vector<const MuonClusterOnTrack*>::iterator clit = chit->second.begin();
-        std::vector<const MuonClusterOnTrack*>::iterator clit_end = chit->second.end();
-        for( ;clit!=clit_end;++clit){
-          msg(MSG::VERBOSE) << "   " << m_idHelperTool->toString((*clit)->identify());
+        std::vector<const MuonClusterOnTrack*>::iterator cl_it = chit->second.begin();
+        std::vector<const MuonClusterOnTrack*>::iterator cl_it_end = chit->second.end();
+        for( ;cl_it!=cl_it_end;++cl_it){
+          msg(MSG::VERBOSE) << "   " << m_idHelperSvc->toString((*cl_it)->identify());
 	  
           // hack to get correct print-out
-          if( clit+1 == clit_end ) msg(MSG::VERBOSE) << endmsg;
+          if( cl_it+1 == cl_it_end ) msg(MSG::VERBOSE) << endmsg;
           else                     msg(MSG::VERBOSE) << std::endl;
         }
       }
 
       if( chit->second.empty() ){
         ATH_MSG_WARNING(" empty list, could not create CompetingMuonClustersOnTrack in chamber   "
-          << m_idHelperTool->toString(chit->first) );
+          << m_idHelperSvc->toString(chit->first) );
         continue;
       }
 
@@ -459,10 +461,10 @@ namespace Muon {
 
       // create list of PRDs 
       std::list<const Trk::PrepRawData*> prds;
-      std::vector<const MuonClusterOnTrack*>::iterator clit = chit->second.begin();
-      std::vector<const MuonClusterOnTrack*>::iterator clit_end = chit->second.end();
-      for( ;clit!=clit_end;++clit){
-        const Trk::PrepRawData* prd = (*clit)->prepRawData();
+      std::vector<const MuonClusterOnTrack*>::iterator cl_it = chit->second.begin();
+      std::vector<const MuonClusterOnTrack*>::iterator cl_it_end = chit->second.end();
+      for( ;cl_it!=cl_it_end;++cl_it){
+        const Trk::PrepRawData* prd = (*cl_it)->prepRawData();
         if (prd){ 
           prds.push_back( prd );
         } else {
@@ -472,7 +474,7 @@ namespace Muon {
 
       const CompetingMuonClustersOnTrack* comprot = m_compClusterCreator->createBroadCluster(prds,0);
       if( !comprot ){
-        ATH_MSG_WARNING(" could not create CompetingMuonClustersOnTrack in chamber   " << m_idHelperTool->toString(chit->first));
+        ATH_MSG_WARNING(" could not create CompetingMuonClustersOnTrack in chamber   " << m_idHelperSvc->toString(chit->first));
         continue;
       }
       hits.push_back(comprot);
@@ -506,15 +508,15 @@ namespace Muon {
 
       // get chamber index
       Identifier id = m_edmHelperSvc->getIdentifier(*meas);
-      if( !id.is_valid() || !m_idHelperTool->isMuon(id) ) continue;
+      if( !id.is_valid() || !m_idHelperSvc->isMuon(id) ) continue;
       
       // don't include trigger hits
-      if( m_idHelperTool->isTrigger(id) ) continue;
+      if( m_idHelperSvc->isTrigger(id) ) continue;
 
-      chambers.insert(m_idHelperTool->chamberIndex(id));
+      chambers.insert(m_idHelperSvc->chamberIndex(id));
       
       if( msgLvl(MSG::VERBOSE) ) {
-	msg(MSG::VERBOSE) << " in recal " << m_idHelperTool->toString(id) << endmsg;
+	msg(MSG::VERBOSE) << " in recal " << m_idHelperSvc->toString(id) << endmsg;
       }
 
     }
@@ -556,7 +558,7 @@ namespace Muon {
     for(  ; it!=it_end; ++it ){
       if( !(*it)->info().id.is_valid() ) continue;
       // only want MDT or CSC detEls
-      if ( !m_idHelperTool->isMdt( (*it)->info().id ) && !m_idHelperTool->isCsc( (*it)->info().id ) ) continue;
+      if ( !m_idHelperSvc->isMdt( (*it)->info().id ) && !m_idHelperSvc->isCsc( (*it)->info().id ) ) continue;
 
       const Trk::MeasurementBase& meas = (*it)->measurement();
       const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(&meas);
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
index 310f8752112139faf1eccbe442438325cd147909..51d735f92f12adda5d26834f9a30acf82f672e39 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
@@ -21,7 +21,7 @@
 
 #include "MuPatHitTool.h" // Needed to enfornce build order for reflex dict
 #include "MuonRecHelperTools/IMuonEDMHelperSvc.h"
-#include "MuonIdHelpers/MuonIdHelperTool.h"
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 #include "MuonRecHelperTools/MuonEDMPrinterTool.h"
 #include "MuonRecToolInterfaces/IMdtDriftCircleOnTrackCreator.h"
 #include "MuonRecToolInterfaces/IMuonClusterOnTrackCreator.h"
@@ -32,8 +32,6 @@
 
 class MsgStream;
 
-class MdtIdHelper;
-
 namespace Trk {
   class Track;
   class MeasurementBase;
@@ -180,8 +178,7 @@ namespace Muon {
       {this, "CscRotCreator", "Muon::CscClusterOnTrackCreator/CscClusterOnTrackCreator"};      //<! tool to calibrate CSC hits
     ToolHandle<IMuonCompetingClustersOnTrackCreator>  m_compClusterCreator 
       {this, "CompetingClustersCreator", "Muon::TriggerChamberClusterOnTrackCreator/TriggerChamberClusterOnTrackCreator"}; //<! tool to create competing clusters on track
-    ToolHandle<MuonIdHelperTool>                      m_idHelperTool 
-      {this, "IdHelper", "Muon::MuonIdHelperTool/MuonIdHelperTool"};       //<! tool to assist with Identifiers
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
     ServiceHandle<IMuonEDMHelperSvc>                  m_edmHelperSvc 
       {this, "edmHelper", 
       "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc", 
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx
index 41fb2101b29c50fb639b309b5ca8b0d57cc6b74f..78268fd1d159a96d9d6b7d843e8073dc38c786d7 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx
@@ -7,7 +7,6 @@
 #include "MuonTrackMakerUtils/MuonTrackMakerStlTools.h"
 
 #include "MuonRecHelperTools/IMuonEDMHelperSvc.h"
-#include "MuonIdHelpers/MuonIdHelperTool.h"
 #include "MuonRecHelperTools/MuonEDMPrinterTool.h"
 #include "MuonRecToolInterfaces/IMdtDriftCircleOnTrackCreator.h"
 #include "MuonRecToolInterfaces/IMuonClusterOnTrackCreator.h"
@@ -44,7 +43,6 @@ namespace Muon {
       m_cscRotCreator("Muon::CscClusterOnTrackCreator/CscClusterOnTrackCreator",this),
       m_compClusterCreator("Muon::TriggerChamberClusterOnTrackCreator/TriggerChamberClusterOnTrackCreator"),
       m_pullCalculator("Trk::ResidualPullCalculator/ResidualPullCalculator"),
-      m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool"),
       m_printer("Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"),
       m_incidentSvc("IncidentSvc",n),
       m_magFieldProperties(Trk::NoField)
@@ -57,11 +55,13 @@ namespace Muon {
   MuPatHitTool::~MuPatHitTool() { }
     
   StatusCode MuPatHitTool::initialize(){
-
+    ATH_CHECK( m_idHelperSvc.retrieve() );
     ATH_CHECK( m_mdtRotCreator.retrieve() );
-    if ( ! m_cscRotCreator.empty() ) ATH_CHECK( m_cscRotCreator.retrieve() );
+    if (!m_cscRotCreator.empty()) {
+      if (!m_idHelperSvc->hasCSC()) ATH_MSG_WARNING("The current layout does not have any CSC chamber but you gave a CscRotCreator, ignoring it, but double-check configuration");
+      else ATH_CHECK( m_cscRotCreator.retrieve() );
+    }
     ATH_CHECK( m_compClusterCreator.retrieve() );
-    ATH_CHECK( m_idHelperTool.retrieve() );
     ATH_CHECK( m_edmHelperSvc.retrieve() );
     ATH_CHECK( m_printer.retrieve() );
     ATH_CHECK( m_pullCalculator.retrieve() );
@@ -143,14 +143,14 @@ namespace Muon {
 
       const Identifier& id = hitInfo.id;
       if( hitInfo.type == MuPatHit::UnknownType ) {
-	ATH_MSG_WARNING(" unknown hit type " << m_idHelperTool->toString(id) );
+	ATH_MSG_WARNING(" unknown hit type " << m_idHelperSvc->toString(id) );
 	continue;
       }
 
       // create broad measurement
       const Trk::MeasurementBase* broadMeas = createBroadMeasurement(**sit, hitInfo);
       if( !broadMeas ){
-	ATH_MSG_WARNING(" could not create broad measurement " << m_idHelperTool->toString(id) );	
+	ATH_MSG_WARNING(" could not create broad measurement " << m_idHelperSvc->toString(id) );	
 	continue;
       }
 
@@ -179,7 +179,7 @@ namespace Muon {
       // create hit and insert it into list
       MuPatHit* hit = new MuPatHit(exPars,*sit,broadMeas,hitInfo);
       m_hitsToBeDeleted.push_back(hit);
-      ATH_MSG_VERBOSE(" inserting hit " << m_idHelperTool->toString(id) << " " << m_printer->print(*exPars) );
+      ATH_MSG_VERBOSE(" inserting hit " << m_idHelperSvc->toString(id) << " " << m_printer->print(*exPars) );
       currentHitIt = insert(hitList,currentHitIt, hit);
 
  
@@ -220,17 +220,17 @@ namespace Muon {
 
       const Identifier& id = hitInfo.id;
       
-      if( !m_idHelperTool->isMuon(id) ) continue;
+      if( !m_idHelperSvc->isMuon(id) ) continue;
 
       if( hitInfo.type == MuPatHit::UnknownType ) {
-	ATH_MSG_WARNING(" unknown hit type " << m_idHelperTool->toString(id) );
+	ATH_MSG_WARNING(" unknown hit type " << m_idHelperSvc->toString(id) );
 	continue;
       }
 
       // create broad measurement
       const Trk::MeasurementBase* broadMeas = createBroadMeasurement(*meas, hitInfo);
       if( !broadMeas ){
-	ATH_MSG_WARNING(" could not create broad measurement " << m_idHelperTool->toString(id) );	
+	ATH_MSG_WARNING(" could not create broad measurement " << m_idHelperSvc->toString(id) );	
 	continue;
       }
 
@@ -273,13 +273,13 @@ namespace Muon {
     MuPatHitCit it = hitList2.begin(), it_end = hitList2.end();
     for( ;it!=it_end;++it ){
       if( !(*it)->info().id.is_valid() ) continue;
-      MuonStationIndex::StIndex stIndex = m_idHelperTool->stationIndex( (*it)->info().id );
+      MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex( (*it)->info().id );
       
       // add hits in first list
       idList.insert((*it)->info().id);
 
       if( stationParsMap.find(stIndex) == stationParsMap.end() ) {
-	ATH_MSG_VERBOSE(" reference hit " << *it << "  " << m_idHelperTool->toString((*it)->info().id) 
+	ATH_MSG_VERBOSE(" reference hit " << *it << "  " << m_idHelperSvc->toString((*it)->info().id) 
 			       << " " << m_printer->print((*it)->parameters()) );
 
 	stationParsMap[stIndex] = &(*it)->parameters();
@@ -301,7 +301,7 @@ namespace Muon {
        if( idList.count((*it)->info().id) ) continue;
        idList.insert((*it)->info().id);
 
-	MuonStationIndex::StIndex stIndex = m_idHelperTool->stationIndex( (*it)->info().id );
+	MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex( (*it)->info().id );
 
 	// check whether there were also hits in this station in the second list
 	std::map<MuonStationIndex::StIndex,const Trk::TrackParameters*>::iterator stationPos = stationParsMap.find(stIndex);
@@ -395,13 +395,13 @@ namespace Muon {
 
   
   MuPatHit::Type MuPatHitTool::getHitType( const Identifier& id ) const {
-    if( m_idHelperTool->isMdt(id) ) return MuPatHit::MDT;
-    else if( m_idHelperTool->isTgc(id) ) return MuPatHit::TGC;
-    else if( m_idHelperTool->isCsc(id) ) return MuPatHit::CSC;
-    else if( m_idHelperTool->isRpc(id) ) return MuPatHit::RPC;
-    else if( m_idHelperTool->isMM(id) ) return MuPatHit::MM;
-    else if( m_idHelperTool->issTgc(id) ) return MuPatHit::sTGC;
-    else if( m_idHelperTool->isMuon(id) ) return MuPatHit::PREC;
+    if( m_idHelperSvc->isMdt(id) ) return MuPatHit::MDT;
+    else if( m_idHelperSvc->isTgc(id) ) return MuPatHit::TGC;
+    else if( m_idHelperSvc->isCsc(id) ) return MuPatHit::CSC;
+    else if( m_idHelperSvc->isRpc(id) ) return MuPatHit::RPC;
+    else if( m_idHelperSvc->isMM(id) ) return MuPatHit::MM;
+    else if( m_idHelperSvc->issTgc(id) ) return MuPatHit::sTGC;
+    else if( m_idHelperSvc->isMuon(id) ) return MuPatHit::PREC;
     return MuPatHit::UnknownType;
   }
 
@@ -412,10 +412,10 @@ namespace Muon {
     hitInfo.measuresPhi = true; // assume that all PseudoMeasurements measure phi!!
     hitInfo.type = MuPatHit::Pseudo;
     hitInfo.status = MuPatHit::OnTrack;
-    if( hitInfo.id.is_valid() && m_idHelperTool->isMuon(hitInfo.id) ) {
+    if( hitInfo.id.is_valid() && m_idHelperSvc->isMuon(hitInfo.id) ) {
       hitInfo.type = getHitType(hitInfo.id);
-      hitInfo.measuresPhi = m_idHelperTool->measuresPhi(hitInfo.id);
-      if( hitInfo.type != MuPatHit::MDT && hitInfo.type != MuPatHit::MM ) hitInfo.id = m_idHelperTool->layerId(hitInfo.id);
+      hitInfo.measuresPhi = m_idHelperSvc->measuresPhi(hitInfo.id);
+      if( hitInfo.type != MuPatHit::MDT && hitInfo.type != MuPatHit::MM ) hitInfo.id = m_idHelperSvc->layerId(hitInfo.id);
     }
   }
 
@@ -427,7 +427,7 @@ namespace Muon {
       const MdtDriftCircleOnTrack* mdt = dynamic_cast<const MdtDriftCircleOnTrack*>(&meas);
       if( !mdt ){
 	ATH_MSG_WARNING(" found hit with a MDT Identifier that is not a MdtDriftCircleOnTrack " 
-	       << m_idHelperTool->toString(hitInfo.id) );
+	       << m_idHelperSvc->toString(hitInfo.id) );
 	return 0;
       }
       ATH_MSG_DEBUG(" creating broad MdtDriftCircleOnTrack " );
@@ -442,7 +442,7 @@ namespace Muon {
       const CscClusterOnTrack* csc = dynamic_cast<const CscClusterOnTrack*>(&meas);
       if( !csc ){
 	ATH_MSG_WARNING(" found hit with CSC identifier that is not a CscClusterOnTrack "
-	       << m_idHelperTool->toString(hitInfo.id) );
+	       << m_idHelperSvc->toString(hitInfo.id) );
 	return 0;
       }
       ATH_MSG_DEBUG(" creating broad CscClusterOnTrack " );
@@ -458,7 +458,7 @@ namespace Muon {
 
     // first check whether list is empty, if so insert
     if( list.empty() ) {
-       ATH_MSG_VERBOSE(" inserting first hit  " << m_idHelperTool->toString(hit->info().id) 
+       ATH_MSG_VERBOSE(" inserting first hit  " << m_idHelperSvc->toString(hit->info().id) 
 			      << " " << m_printer->print(hit->parameters()) );
        list.push_back(hit);
       return list.begin();
@@ -481,13 +481,13 @@ namespace Muon {
 	if( pos == list.end() ) {
 	  // check whether hit duplicate of last hit in list
 	  if( isLargerCal(list.back(),hit) != isLargerCal(hit,list.back()) || (hit->info().type == MuPatHit::MM && hit->info().id != list.back()->info().id) ){
-	    ATH_MSG_VERBOSE(" inserting hit at back   " << m_idHelperTool->toString(hit->info().id) 
+	    ATH_MSG_VERBOSE(" inserting hit at back   " << m_idHelperSvc->toString(hit->info().id) 
 				   << " " << m_printer->print(hit->parameters()) );
   	    list.push_back(hit);
 	    pos = list.end();
 	  }else{
 	    // hit is a duplicate
-	    ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperTool->toString(hit->info().id) 
+	    ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperSvc->toString(hit->info().id) 
 				   << " " << m_printer->print(hit->parameters()) );
 	  }
 	  return --pos;
@@ -504,13 +504,13 @@ namespace Muon {
       if( pos == list.begin() && !isLarger  ){
 	// check whether hit duplicate of last hit in list
 	if( isLargerCal(list.front(),hit) != isLargerCal(hit,list.front()) || (hit->info().type == MuPatHit::MM && hit->info().id != list.front()->info().id) ){
-	  ATH_MSG_VERBOSE(" inserting hit at front  " << m_idHelperTool->toString(hit->info().id) 
+	  ATH_MSG_VERBOSE(" inserting hit at front  " << m_idHelperSvc->toString(hit->info().id) 
 				 << " " << m_printer->print(hit->parameters()) );
  
  	  list.push_front(hit);
 	}else{
 	  // hit is a duplicate
-	  ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperTool->toString(hit->info().id) 
+	  ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperSvc->toString(hit->info().id) 
 				 << " " << m_printer->print(hit->parameters()) );
 	}
 	return list.begin();
@@ -523,13 +523,13 @@ namespace Muon {
       if( pos == list.end() ) {
 	// check whether hit duplicate of last hit in list
 	if( isLargerCal(list.back(),hit) != isLargerCal(hit,list.back()) || (hit->info().type == MuPatHit::MM && hit->info().id != list.back()->info().id) ){
-	  ATH_MSG_VERBOSE(" inserting hit at back   " << m_idHelperTool->toString(hit->info().id) 
+	  ATH_MSG_VERBOSE(" inserting hit at back   " << m_idHelperSvc->toString(hit->info().id) 
 				 << " " << m_printer->print(hit->parameters()) ); 
  	  list.push_back(hit);
 	  pos = list.end();
 	}else{
 	  // hit is a duplicate
-	  ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperTool->toString(hit->info().id) 
+	  ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperSvc->toString(hit->info().id) 
 				 << " " << m_printer->print(hit->parameters()) );
 	}
 	return --pos;
@@ -542,7 +542,7 @@ namespace Muon {
     // check whether hit and entry at pos are a duplicate
     if( isLarger == isLargerCal(*pos,hit) && (hit->info().type != MuPatHit::MM || hit->info().id == (*pos)->info().id) ){
       // hit is a duplicate
-      ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperTool->toString(hit->info().id) 
+      ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperSvc->toString(hit->info().id) 
 			     << " " << m_printer->print(hit->parameters()) );
       return pos;
     }
@@ -555,7 +555,7 @@ namespace Muon {
       if( isLargerCal(hit,*pos) == isLargerCal(*pos,hit) && (hit->info().type != MuPatHit::MM || hit->info().id == (*pos)->info().id) ){
 	++pos; // move forward to insert position for pos
 	// hit is a duplicate
-	ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperTool->toString(hit->info().id) 
+	ATH_MSG_VERBOSE(" NOT inserting duplicate hit  " << m_idHelperSvc->toString(hit->info().id) 
 			       << " " << m_printer->print(hit->parameters()) );
 	return pos;
       }
@@ -564,7 +564,7 @@ namespace Muon {
     }
 
     // the hit will be inserted before pos
-    ATH_MSG_VERBOSE(" inserting hit in middle " << m_idHelperTool->toString(hit->info().id) 
+    ATH_MSG_VERBOSE(" inserting hit in middle " << m_idHelperSvc->toString(hit->info().id) 
 			   << " " << m_printer->print(hit->parameters()) );
     return list.insert(pos,hit);
   } 
@@ -582,7 +582,7 @@ namespace Muon {
       Identifier id = m_edmHelperSvc->getIdentifier(**mit);
       if( !id.is_valid() ) continue;
       
-      if( !m_idHelperTool->isMdt(id) ) id = m_idHelperTool->layerId(id);
+      if( !m_idHelperSvc->isMdt(id) ) id = m_idHelperSvc->layerId(id);
 
       ids.insert(id);
     }
@@ -620,7 +620,7 @@ namespace Muon {
     if( itNext != it_end ) ++itNext;
     for( ; it!=it_end; ++it,++itNext ){
       Identifier id = m_edmHelperSvc->getIdentifier( (*it)->measurement() );
-      std::string idStr = id.is_valid() ? m_idHelperTool->toString( id ) : "pseudo-measurement";
+      std::string idStr = id.is_valid() ? m_idHelperSvc->toString( id ) : "pseudo-measurement";
       idStrings.push_back(idStr);
       if (idStr.length() > idWidth) idWidth = idStr.length();
       const Trk::TrackParameters& pars = (*it)->parameters();
@@ -671,10 +671,10 @@ namespace Muon {
       const Trk::PseudoMeasurementOnTrack* pseudo = dynamic_cast<const Trk::PseudoMeasurementOnTrack*>(&measurement);
       if( pseudo ) idStr = "pseudo measurement";
       else idStr = "no Identifier";
-    }else if( !m_idHelperTool->mdtIdHelper().is_muon(id) ) {
+    }else if( !m_idHelperSvc->mdtIdHelper().is_muon(id) ) {
       idStr = "Id hit"; 
     }else{
-      idStr = m_idHelperTool->toString( id );
+      idStr = m_idHelperSvc->toString( id );
     }
 
     return idStr;
@@ -725,7 +725,7 @@ namespace Muon {
 	rpcTimes.reserve(nhits);
 	std::vector<const MuonClusterOnTrack*>::const_iterator itR = rots.begin(), itR_end = rots.end();
 	for ( ; itR != itR_end; ++itR ) {
-	  Identifier layerId = m_idHelperTool->layerId((*itR)->identify());
+	  Identifier layerId = m_idHelperSvc->layerId((*itR)->identify());
 	  layers.insert(layerId);
 	  const RpcClusterOnTrack* rpc = dynamic_cast<const RpcClusterOnTrack*>(*itR);
 	  const RpcPrepData* rpcPRD = rpc ? rpc->prepRawData() : 0;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h
index b51c513e35f6a05b4615d625ce3b2c166d32a139..fe3a92a42d71a48bea897d643ffbe2d3a4a7aecd 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h
@@ -12,6 +12,7 @@
 #include "GaudiKernel/IIncidentListener.h"
 #include "TrkGeometry/MagneticFieldProperties.h"
 #include "MuonRecHelperTools/IMuonEDMHelperSvc.h"
+#include "MuonIdHelpers/IMuonIdHelperSvc.h"
 
 #include <vector>
 
@@ -30,12 +31,9 @@ namespace Muon {
   class IMdtDriftCircleOnTrackCreator;
   class IMuonClusterOnTrackCreator;
   class IMuonCompetingClustersOnTrackCreator;
-  class MuonIdHelperTool;
   class MuonEDMPrinterTool;
-
   class MuonSegment;
 
-
   static const InterfaceID IID_MuPatHitTool("Muon::MuPatHitTool",1,0);
   
   class MuPatHitTool : public AthAlgTool, virtual public IIncidentListener {
@@ -172,7 +170,7 @@ namespace Muon {
     ToolHandle<IMuonClusterOnTrackCreator>            m_cscRotCreator;      //<! tool to calibrate CSC hits
     ToolHandle<IMuonCompetingClustersOnTrackCreator>  m_compClusterCreator; //<! tool to create competing clusters on track
     ToolHandle<Trk::IResidualPullCalculator>          m_pullCalculator;     //<! tool to calculate residuals and pulls
-    ToolHandle<MuonIdHelperTool>                      m_idHelperTool;       //<! tool to assist with Identifiers
+    ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
     ServiceHandle<IMuonEDMHelperSvc>                  m_edmHelperSvc {this, "edmHelper", 
       "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc", 
       "Handle to the service providing the IMuonEDMHelperSvc interface" };         //<! multipurpose helper tool