diff --git a/LArCalorimeter/LArCellRec/LArCellRec/LArCellMerger.h b/LArCalorimeter/LArCellRec/LArCellRec/LArCellMerger.h
index aaa21c78f9c314b7eac24500bcfa7a5a500602b1..7d32acffc4fcf73b712d232140e33a7f6355de22 100755
--- a/LArCalorimeter/LArCellRec/LArCellRec/LArCellMerger.h
+++ b/LArCalorimeter/LArCellRec/LArCellRec/LArCellMerger.h
@@ -1,3 +1,4 @@
+//Dear emacs, this is -*-c++-*-
 /*
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
@@ -20,12 +21,13 @@
 
 #include "GaudiKernel/ToolHandle.h"
 #include "CaloInterface/ICaloCellMakerTool.h"
-#include "AthenaKernel/IOVSvcDefs.h"
 #include "AthenaBaseComps/AthAlgTool.h"
+#include "StoreGate/ReadHandleKey.h"
+#include "StoreGate/ReadCondHandleKey.h"
 
-class LArCablingService;
-class StoreGateSvc;
+class LArOnOffIdMapping;
 class CaloCell_ID;
+class LArRawChannelContainer;
 
 class LArCellMerger: public AthAlgTool,
 	             virtual public ICaloCellMakerTool 
@@ -41,40 +43,30 @@ public:
 
   /** initialize the tool
   */
-  virtual StatusCode initialize() ; 
+  virtual StatusCode initialize() override; 
 
-  /** finalize   the tool
+  /** finalize the tool
   */
-  virtual StatusCode finalize() ; 
+  virtual StatusCode finalize() override; 
 
   /** update theCellContainer
   */
-  virtual StatusCode process( CaloCellContainer * theCellContainer) ;
+  virtual StatusCode process( CaloCellContainer * theCellContainer) override; //could be const if the abstract base-class were const
 
 
 
  private:
 
-  /** handle to LAr cabling service
-  */
-  ToolHandle<LArCablingService> m_cablingService;
-  /** flags to select which errors to mask
+  /** handle to LAr cabling
   */
+  SG::ReadCondHandleKey<LArOnOffIdMapping> m_cablingKey;
+
 
   /** key for raw channel container to merge to cells
-  */
-  std::string m_rawChannelContainerName;
+  */  
+  SG::ReadHandleKey<LArRawChannelContainer>  m_rawChannelContainerName; 
 
   const CaloCell_ID* m_calo_id;
-
-  /** Number of events processed
-  */
-  int m_evt;
-
-  /** Number of cells read from new container
-  */
-  int m_ncell;
-
 };
 
 #endif
diff --git a/LArCalorimeter/LArCellRec/src/LArCellMerger.cxx b/LArCalorimeter/LArCellRec/src/LArCellMerger.cxx
index f87ab6f3f5f7de08b7beb2665b69742fc1edac47..0f5278b4ced62d18ab3fa44a67ab6d251bb45b68 100755
--- a/LArCalorimeter/LArCellRec/src/LArCellMerger.cxx
+++ b/LArCalorimeter/LArCellRec/src/LArCellMerger.cxx
@@ -20,10 +20,8 @@ PURPOSE:
 #include "CaloEvent/CaloCellContainer.h"
 #include "Identifier/Identifier.h"
 #include "Identifier/IdentifierHash.h"
-#include "CaloIdentifier/CaloIdManager.h"
 #include "CaloIdentifier/CaloCell_ID.h"
-#include "LArCabling/LArCablingService.h"
-
+#include "LArCabling/LArOnOffIdMapping.h"
 
 /////////////////////////////////////////////////////////////////////
 // CONSTRUCTOR:
@@ -34,11 +32,9 @@ LArCellMerger::LArCellMerger(
 			     const std::string& name, 
 			     const IInterface* parent)
   :AthAlgTool(type, name, parent),
-   m_cablingService("LArCablingService"),
+   m_cablingKey("LArOnOffIdMap"),
    m_rawChannelContainerName("LArRawChannels_digits"),
-   m_calo_id(nullptr),
-   m_evt(0),
-   m_ncell(0)
+   m_calo_id(nullptr)
 { 
   declareInterface<ICaloCellMakerTool>(this); 
 
@@ -51,41 +47,36 @@ LArCellMerger::LArCellMerger(
 // The initialize method will create all the required algorithm objects
 /////////////////////////////////////////////////////////////////////
 
-StatusCode LArCellMerger::initialize()
-{
-  m_evt=0;
-  m_ncell=0;
+StatusCode LArCellMerger::initialize() {
+
+  ATH_CHECK(detStore()->retrieve(m_calo_id,"CaloCell_ID"));
+  ATH_CHECK( m_cablingKey.initialize() );
+
+  ATH_CHECK(m_rawChannelContainerName.initialize());
 
-  const  CaloIdManager* caloIdMgr;
-  ATH_CHECK( detStore()->retrieve( caloIdMgr ) );
-  m_calo_id = caloIdMgr->getCaloCell_ID();
-  ATH_CHECK( m_cablingService.retrieve() );
   return StatusCode::SUCCESS;
 }
 
-StatusCode LArCellMerger::finalize()
-{
-   ATH_MSG_INFO( "  ---- Summary from LArCellMerger "  );
-   ATH_MSG_INFO( "   Number of events processed                           " << m_evt  );
-   ATH_MSG_INFO( "   Number of cells from merged raw channel container    " << m_ncell  );
-   float ratio=0.;
-   if (m_evt>0) ratio=((float)(m_ncell))/((float)(m_evt));
-   ATH_MSG_INFO( "   Average number of cells per event                    " << ratio  );
-
+StatusCode LArCellMerger::finalize(){
    return StatusCode::SUCCESS;
 }
 
-StatusCode LArCellMerger::process(CaloCellContainer * theCont )
-{
+StatusCode LArCellMerger::process(CaloCellContainer * theCont ) {
 	
-  m_evt++;
-
-  unsigned int nwarnings=0;
-
   ATH_MSG_DEBUG("in  LArCellMerger::process");
   
-  const LArRawChannelContainer* rawColl;
-  ATH_CHECK( evtStore()->retrieve(rawColl,m_rawChannelContainerName) );
+  
+  SG::ReadHandle<LArRawChannelContainer> rawColl(m_rawChannelContainerName);
+  if (!rawColl.isValid()) {
+    ATH_MSG_ERROR("Failed to retrieve LArRawChannelContainer with key " << 
+		  rawColl.name());
+    return StatusCode::FAILURE;
+  }
+
+  SG::ReadCondHandle<LArOnOffIdMapping> larCablingHdl(m_cablingKey);
+  const LArOnOffIdMapping* cabling=*larCablingHdl;
+
+  unsigned nReplaced=0;
 
   // loop over raw channel container
   //   as this new container is supposed to contain only few cells, we do a simple loop and the basics onlineId to offlineId conversion
@@ -98,33 +89,32 @@ StatusCode LArCellMerger::process(CaloCellContainer * theCont )
       const LArRawChannel& theRawChannel = (*itrRawChannel);
 
       const HWIdentifier hwid=theRawChannel.channelID();
-      if (m_cablingService->isOnlineConnected(hwid)) {
-          Identifier id = m_cablingService->cnvToIdentifier( hwid);
+      if (cabling->isOnlineConnected(hwid)) {
+          Identifier id = cabling->cnvToIdentifier( hwid);
           IdentifierHash theCellHashID = m_calo_id->calo_cell_hash(id);
           int index = theCont->findIndex(theCellHashID);
           if (index<0) {
-               if (nwarnings<100) {
-                  ATH_MSG_WARNING( " cell " << hwid.get_compact() << " " << id.get_compact() << " is not in the container "  );
-                  nwarnings++;
-                  if (nwarnings==100) ATH_MSG_WARNING( "  will not print anymore warnings for this event... "  );
-               } 
-               continue;
+	    ATH_MSG_WARNING( " cell " << hwid.get_compact() << " " << id.get_compact() << " is not in the container "  );
+	    continue;
           }
           CaloCell* aCell = theCont->at(index);
 
           if (aCell) {
-	    ATH_MSG_DEBUG(" replace energies in cell hwid= " << hwid.get_compact() << " offlineid = " << id.get_compact()
-			  << " " << aCell->ID().get_compact() << " old energy " << aCell->e() << " new energy " << theRawChannel.energy());
+	    ATH_MSG_DEBUG(" replace energies in cell hwid= " << hwid.get_identifier32().get_compact() 
+			  << " offlineid = " << id.get_identifier32().get_compact()
+			  << " old energy " << aCell->e() << " new energy " << theRawChannel.energy());
+	    nReplaced++;
 	    aCell->setEnergy((float)(theRawChannel.energy()));
 	    aCell->setTime((float)(theRawChannel.time())*0.001);    // convert from ps int in raw channel to ns float in calocell
 	    aCell->setQuality(theRawChannel.quality());
 	    aCell->setProvenance(theRawChannel.provenance());
-	    m_ncell++;
           }
 
       }  // isConnected
   }       // loop over raw channel container
 
-
+  if (nReplaced*5>theCont->size()) {
+    ATH_MSG_WARNING("Replaced more than 20% of channels reco'ed online by channels reco'ed offline");
+  }
   return StatusCode::SUCCESS;
 }