diff --git a/Calorimeter/CaloCondPhysAlgs/src/CaloCellCalcEnergyCorr.cxx b/Calorimeter/CaloCondPhysAlgs/src/CaloCellCalcEnergyCorr.cxx
index 2a4808cff36c86c11717b2361d7412487984bf31..e9f1227fc2c493b25c7c4a34d636bb2d77f3d0a9 100644
--- a/Calorimeter/CaloCondPhysAlgs/src/CaloCellCalcEnergyCorr.cxx
+++ b/Calorimeter/CaloCondPhysAlgs/src/CaloCellCalcEnergyCorr.cxx
@@ -1,7 +1,7 @@
 ///////////////////////// -*- C++ -*- /////////////////////////////
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // CaloCellCalcEnergyCorr.cxx 
@@ -16,7 +16,6 @@
 
 #include "CaloDetDescr/CaloDetectorElements.h"
 #include "LArReadoutGeometry/EMBCell.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
 #include "LArHV/EMBPresamplerHVModuleConstLink.h"
 #include "LArHV/EMBPresamplerHVModule.h"
@@ -205,8 +204,8 @@ std::vector<int> CaloCellCalcEnergyCorr::GetHVLines(const Identifier& id) {
       const EMBCellConstLink cell = embElement->getEMBCell();
       unsigned int nelec = cell->getNumElectrodes();
       for (unsigned int i=0;i<nelec;i++) {
-        const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
-        for (unsigned int igap=0;igap<2;igap++) hv.insert(electrode->hvLineNo(igap));
+        const EMBHVElectrode& electrode = cell->getElectrode(i);
+        for (unsigned int igap=0;igap<2;igap++) hv.insert(electrode.hvLineNo(igap));
       }
     } else { // LAr EMEC
       const EMECDetectorElement* emecElement = dynamic_cast<const EMECDetectorElement*>(m_calodetdescrmgr->get_element(id));
diff --git a/LArCalorimeter/LArCafJobs/src/LArNoiseBursts.cxx b/LArCalorimeter/LArCafJobs/src/LArNoiseBursts.cxx
index 078f9ff0439bc2bd6e455369991ca63970dc93b2..f273ce47731efe83ecdefb35d5715e015cd55d94 100644
--- a/LArCalorimeter/LArCafJobs/src/LArNoiseBursts.cxx
+++ b/LArCalorimeter/LArCafJobs/src/LArNoiseBursts.cxx
@@ -50,7 +50,6 @@
 #include "CaloDetDescr/CaloDetDescrManager.h"
 #include "CaloDetDescr/CaloDetectorElements.h"
 #include "LArReadoutGeometry/EMBCell.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
 #include "LArHV/EMBPresamplerHVModuleConstLink.h"
 #include "LArHV/EMBPresamplerHVModule.h"
@@ -1389,8 +1388,8 @@ std::vector<int>* LArNoiseBursts::GetHVLines(const Identifier& id)
       nelec = cell->getNumElectrodes();
       //ngap = 2*nelec;
       for(i=0;i<nelec;i++) {
-	      const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
-	      for(igap=0;igap<2;igap++) tmplines.push_back(electrode->hvLineNo(igap));
+	      const EMBHVElectrode& electrode = cell->getElectrode(i);
+	      for(igap=0;igap<2;igap++) tmplines.push_back(electrode.hvLineNo(igap));
       }        
     } else { // LAr EMEC
       ATH_MSG_DEBUG ( "LAr EMEC");
diff --git a/LArCalorimeter/LArCondUtils/src/LArHV2Ntuple.cxx b/LArCalorimeter/LArCondUtils/src/LArHV2Ntuple.cxx
index 542b5b4c5fd15199dbe0d02490ac0123dfff8129..5fa30e3ed5944bc1dca4ac1b71c3262125580677 100644
--- a/LArCalorimeter/LArCondUtils/src/LArHV2Ntuple.cxx
+++ b/LArCalorimeter/LArCondUtils/src/LArHV2Ntuple.cxx
@@ -9,9 +9,7 @@
 #include "LArHV/LArHVManager.h"
 #include "LArHV/EMBHVManager.h"
 #include "LArHV/EMBHVModule.h"
-#include "LArHV/EMBHVModuleConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMECHVManager.h"
 #include "LArHV/EMECHVModule.h"
 #include "LArHV/EMECHVModuleConstLink.h"
@@ -128,19 +126,19 @@
 
   const LArHVManager *manager = NULL;
   if (detStore()->retrieve(manager)==StatusCode::SUCCESS) {
-    const EMBHVManager* hvManager_EMB=manager->getEMBHVManager();
-    for (unsigned int iSide=hvManager_EMB->beginSideIndex();iSide<hvManager_EMB->endSideIndex();iSide++) { // loop over HV modules
-      for (unsigned int iPhi=hvManager_EMB->beginPhiIndex();iPhi<hvManager_EMB->endPhiIndex();iPhi++) {
-        for (unsigned int iSector=hvManager_EMB->beginSectorIndex();iSector<hvManager_EMB->endSectorIndex();iSector++) {
-          for (unsigned int iEta=hvManager_EMB->beginEtaIndex();iEta<hvManager_EMB->endEtaIndex();iEta++) { //0 to 7
-            EMBHVModuleConstLink hvMod = hvManager_EMB->getHVModule(iSide,iEta,iPhi,iSector);
-            float eta=0.5*(hvMod->getEtaMin()+hvMod->getEtaMax());
+    const EMBHVManager& hvManager_EMB=manager->getEMBHVManager();
+    for (unsigned int iSide=hvManager_EMB.beginSideIndex();iSide<hvManager_EMB.endSideIndex();iSide++) { // loop over HV modules
+      for (unsigned int iPhi=hvManager_EMB.beginPhiIndex();iPhi<hvManager_EMB.endPhiIndex();iPhi++) {
+        for (unsigned int iSector=hvManager_EMB.beginSectorIndex();iSector<hvManager_EMB.endSectorIndex();iSector++) {
+          for (unsigned int iEta=hvManager_EMB.beginEtaIndex();iEta<hvManager_EMB.endEtaIndex();iEta++) { //0 to 7
+            const EMBHVModule& hvMod = hvManager_EMB.getHVModule(iSide,iEta,iPhi,iSector);
+            float eta=0.5*(hvMod.getEtaMin()+hvMod.getEtaMax());
             for (unsigned int ielec=0;ielec<32;ielec++) { //use hvMod->getNumElectrodes when bug is corrected
-              EMBHVElectrodeConstLink electrode = hvMod->getElectrode(ielec);
+              const EMBHVElectrode& electrode = hvMod.getElectrode(ielec);
               for (unsigned int iGap=0;iGap<2;iGap++) { // EMB : 2, TRY TO FIND AUTOMATICALLY NB OF GAPS
-                float hv=electrode->voltage(iGap);
-                float current = electrode->current(iGap);
-                float phi = electrode->getPhi();
+                float hv=electrode.voltage(iGap);
+                float current = electrode.current(iGap);
+                float phi = electrode.getPhi();
 
                 m_bec=0;
                 m_isPresampler=0;
@@ -150,7 +148,7 @@
                 m_gap = iGap;
                 m_hv = hv;
                 m_current= current;
-                m_hvline = electrode->hvLineNo(iGap);
+                m_hvline = electrode.hvLineNo(iGap);
 
                 if(m_addcells) {
                   for(unsigned i=0; i<m_hvonlId_map[m_hvline].size(); ++i) {
@@ -442,8 +440,8 @@ std::vector<int> LArHV2Ntuple::GetHVLines(const Identifier& id) {
        const EMBCellConstLink cell = embElement->getEMBCell();
        unsigned int nelec = cell->getNumElectrodes();
        for (unsigned int i=0;i<nelec;i++) {
-         const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
-         for (unsigned int igap=0;igap<2;igap++) hv.insert(electrode->hvLineNo(igap));
+         const EMBHVElectrode& electrode = cell->getElectrode(i);
+         for (unsigned int igap=0;igap<2;igap++) hv.insert(electrode.hvLineNo(igap));
        }
      } else { // LAr EMEC
        const EMECDetectorElement* emecElement = dynamic_cast<const EMECDetectorElement*>(m_calodetdescrmgr->get_element(id));
diff --git a/LArCalorimeter/LArCondUtils/src/LArHVPathologyDbAlg.cxx b/LArCalorimeter/LArCondUtils/src/LArHVPathologyDbAlg.cxx
index c29feabc0535d994338d03aedb5248d6c7b387e2..1a7a9652e81aebee80f86f86d9800b46fe50c38c 100644
--- a/LArCalorimeter/LArCondUtils/src/LArHVPathologyDbAlg.cxx
+++ b/LArCalorimeter/LArCondUtils/src/LArHVPathologyDbAlg.cxx
@@ -19,7 +19,6 @@
 #include "CaloDetDescr/CaloDetectorElements.h"
 #include "LArReadoutGeometry/EMBCell.h"
 #include "LArHV/EMBHVElectrode.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMBPresamplerHVModuleConstLink.h"
 #include "LArHV/EMBPresamplerHVModule.h"
 #include "LArReadoutGeometry/EMECCell.h"
@@ -360,9 +359,9 @@ std::vector<unsigned int> LArHVPathologyDbAlg::getElectInd(const Identifier & id
          const EMBCellConstLink cell = embElement->getEMBCell();
          unsigned int nelec = cell->getNumElectrodes();
          for (unsigned int i=0;i<nelec;i++) {
-            const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
+            const EMBHVElectrode& electrode = cell->getElectrode(i);
             for (unsigned int igap=0;igap<2;igap++) {
-              if (electrode->hvLineNo(igap)==HVline) {
+              if (electrode.hvLineNo(igap)==HVline) {
                   list.push_back(2*i+igap);
               }
             } 
@@ -459,7 +458,7 @@ int LArHVPathologyDbAlg::getHVline(const Identifier & id, short unsigned int Ele
             msg(MSG::ERROR) << "Wrong electrode number " << ielec << " for cell "<< id.get_identifier32().get_compact() <<endmsg;
             return -1;
          } else { 
-            return cell->getElectrode(ielec)->hvLineNo(igap);
+            return cell->getElectrode(ielec).hvLineNo(igap);
          }
        }
      }
diff --git a/LArCalorimeter/LArCondUtils/src/LArHVToolDB.cxx b/LArCalorimeter/LArCondUtils/src/LArHVToolDB.cxx
index cd4a771a8105429e3dba0cbf2bf25f06885936bf..81ea7e8b4d692bdf8e8cc15020a90822ba6ca091 100755
--- a/LArCalorimeter/LArCondUtils/src/LArHVToolDB.cxx
+++ b/LArCalorimeter/LArCondUtils/src/LArHVToolDB.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArHVToolDB.h" 
@@ -14,7 +14,6 @@
 #include "CaloIdentifier/CaloIdManager.h"
 #include "CaloDetDescr/CaloDetDescrManager.h"
 #include "LArReadoutGeometry/EMBCell.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
 #include "LArHV/EMBPresamplerHVModuleConstLink.h"
 #include "LArHV/EMBPresamplerHVModule.h"
@@ -322,14 +321,14 @@ StatusCode LArHVToolDB::getPayload(const Identifier& id, std::vector< HV_t > & v
         unsigned int ngap = 2*nelec;
         double wt = 1./ngap;
         for (unsigned int i=0;i<nelec;i++) {
-            const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
+            const EMBHVElectrode&  electrode = cell->getElectrode(i);
             //std::cout << "electrode: endcap index, eta index , phi index, sector index , electrode index " << electrode->getModule()->getSideIndex() <<
             //   " " << electrode->getModule()->getEtaIndex() << " " << electrode->getModule()->getPhiIndex() << 
             //   " " << electrode->getModule()->getSectorIndex() << " " << electrode->getElectrodeIndex() << std::endl;
             for (unsigned int igap=0;igap<2;igap++) {
                 double hv;
                 double curr;
-                electrode->voltage_current(igap,hv,curr);
+                electrode.voltage_current(igap,hv,curr);
                 if (hasPathology) {
                    msg(MSG::DEBUG) << "Has pathology for id: "<< m_larem_id->print_to_string(id)<<" "<<m_hasPathologyEM[index]<<endmsg;
                    msg(MSG::DEBUG) << "Original hv: "<<hv<<" ";
diff --git a/LArCalorimeter/LArG4/LArG4Barrel/src/LArBarrelCalculator.cxx b/LArCalorimeter/LArG4/LArG4Barrel/src/LArBarrelCalculator.cxx
index 45f4bb0ccca9095e56100e22ae35878aaac294fd..80466c2a7dce9dd1c6fcdf742f92da67a100d0b2 100644
--- a/LArCalorimeter/LArG4/LArG4Barrel/src/LArBarrelCalculator.cxx
+++ b/LArCalorimeter/LArG4/LArG4Barrel/src/LArBarrelCalculator.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // The Cell Identifier for the EM Barrel readout cells
@@ -42,9 +42,7 @@
 #include "LArHV/LArHVManager.h"
 #include "LArHV/EMBHVManager.h"
 #include "LArHV/EMBHVModule.h"
-#include "LArHV/EMBHVModuleConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 
 namespace Units = Athena::Units;
 
@@ -701,19 +699,19 @@ void LArBarrelCalculator::InitHV()
     // get EMBHV Manager
     const LArHVManager *manager = nullptr;
     if (pDetStore->retrieve(manager)==StatusCode::SUCCESS) {
-      const EMBHVManager* hvManager=manager->getEMBHVManager();
+      const EMBHVManager& hvManager=manager->getEMBHVManager();
       ATH_MSG_INFO(" got HV Manager ");
       // loop over HV modules
       for (unsigned int iSide=0;iSide<2;iSide++) {
         for (unsigned int iPhi=0;iPhi<16;iPhi++) {
           for (unsigned int iSector=0;iSector<2;iSector++) {
             for (unsigned int iEta=0;iEta<7;iEta++) {
-              EMBHVModuleConstLink hvMod = hvManager->getHVModule(iSide,iEta+1,iPhi,iSector);
+              const EMBHVModule& hvMod = hvManager.getHVModule(iSide,iEta+1,iPhi,iSector);
               for (unsigned int ielec=0;ielec<32;ielec++) {
-                EMBHVElectrodeConstLink electrode = hvMod->getElectrode(ielec);
+                const EMBHVElectrode& electrode = hvMod.getElectrode(ielec);
                 unsigned jElec = ielec+32*iSector+64*iPhi;
                 for (unsigned int iGap=0;iGap<2;iGap++) {
-                  double hv = electrode->voltage(iGap);
+                  double hv = electrode.voltage(iGap);
                   ATH_MSG_DEBUG(" iSide,jElec,iEta,iGap,hv " << iSide << " " << jElec << " " << iEta << " " << iGap << " " << hv);
                   if (hv>-999.) m_hv[iSide][jElec][iEta][iGap] = hv;
                 }
diff --git a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.cxx b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.cxx
index cc101e02c612ffd8535a3dbd9d6ef639422bee08..6924f5d551c196efa808688e3f15ce1a441302a1 100755
--- a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.cxx
+++ b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArDetectorFactory.h"
@@ -53,15 +53,18 @@
 #include "LArReadoutGeometry/EMBDetectorRegion.h"
 #include "LArReadoutGeometry/EMBDetDescr.h"
 
-LArGeo::LArDetectorFactory::LArDetectorFactory(int testbeam,bool fullGeo)
-  : m_detectorManager(),
-    m_barrelSagging(false),
-    m_barrelVisLimit(-1),
-    m_fcalVisLimit(-1),
-    m_buildBarrel(true),
-    m_buildEndcap(true),
-    m_testbeam(testbeam),
-    m_fullGeo(fullGeo)
+#include "LArHV/LArHVManager.h"
+
+LArGeo::LArDetectorFactory::LArDetectorFactory(int testbeam,bool fullGeo, const LArHVManager* hvManager)
+  : m_detectorManager(nullptr)
+  , m_hvManager(hvManager)
+  , m_barrelSagging(false)
+  , m_barrelVisLimit(-1)
+  , m_fcalVisLimit(-1)
+  , m_buildBarrel(true)
+  , m_buildEndcap(true)
+  , m_testbeam(testbeam)
+  , m_fullGeo(fullGeo)
 {}
 
 
@@ -535,7 +538,7 @@ void LArGeo::LArDetectorFactory::create( GeoPhysVol* a_container )
 
   try
   { 
-    embDetectorManager  = new EMBDetectorManager();
+    embDetectorManager  = new EMBDetectorManager(m_hvManager->getEMBHVManager());
     int firstEndcap=m_testbeam==0 ? 0:1, endEndcap=2;
     for (int e= firstEndcap ;e<endEndcap;e++) {
 
diff --git a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.h b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.h
index 78f814b3bc419bbafb8337d5d58f63eb40e80a32..2bf603e08715092c3fdfc37c19fa48621c1ab393 100755
--- a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.h
+++ b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorFactory.h
@@ -1,11 +1,15 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 /**
  * @file LArDetectorFactory.h
  *
- * @brief Declaration of LArDetectorFactory class
+ * @class LArGeo::LArDetectorFactory
+ * 
+ * @brief LArDetectorFactory builds GeoModel description of LAr calorimeter by calling
+ * relevant 'Construction' classes (Barrel, Endcap). It also builds readout geometry
+ * description using LArReadoutGeometry objects.
  *
  * $Id: LArDetectorFactory.h,v 1.4 2009-02-10 16:43:17 tsulaia Exp $
  */
@@ -15,19 +19,16 @@
 #include "LArReadoutGeometry/LArDetectorManager.h"
 #include "GeoModelKernel/GeoVDetectorFactory.h"
 
+class LArHVManager;
+
 namespace LArGeo {
 
-  /** @class LArGeo::LArDetectorFactory
-      @brief LArDetectorFactory builds GeoModel description of LAr calorimeter by calling
-      relevant 'Construction' classes (Barrel, Endcap). It also builds readout geometry
-      description using LArReadoutGeometry objects.
-   */
   class LArDetectorFactory : public GeoVDetectorFactory  {
 
   public:
   
     // Constructor:
-    LArDetectorFactory(int testbeam, bool fullGeo);
+    LArDetectorFactory(int testbeam, bool fullGeo, const LArHVManager* hvManager);
   
     // Destructor:
     virtual ~LArDetectorFactory();
@@ -56,6 +57,7 @@ namespace LArGeo {
   
     // The manager:
     LArDetectorManager*       m_detectorManager;
+    const LArHVManager*       m_hvManager;
     bool                      m_barrelSagging;
     int                       m_barrelVisLimit;
     int                       m_fcalVisLimit;
diff --git a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorTool.cxx b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorTool.cxx
index 543e3dfce57e36a3403a2e5aee05852dc8dfa120..97b96c5cd0a19b722260c61a9ae7099f1cc2d8e5 100755
--- a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorTool.cxx
+++ b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/src/LArDetectorTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArReadoutGeometry/FCAL_ChannelMap.h"
@@ -28,7 +28,6 @@
 #include "GeoModelUtilities/StoredPhysVol.h"
 #include "GeoModelKernel/GeoFullPhysVol.h"
 #include "LArHV/LArHVManager.h"
-#include "LArHV/EMBHVManager.h"
 #include "LArHV/EMECHVManager.h"
 #include "LArHV/HECHVManager.h"
 #include "LArHV/FCALHVManager.h"
@@ -74,7 +73,6 @@ LArDetectorToolNV::~LArDetectorToolNV()
 StatusCode LArDetectorToolNV::create()
 { 
   // Initialize the HV System:
-  const EMBHVManager *embHV=new EMBHVManager();
   const EMECHVManager *emecHVI= new EMECHVManager(EMECHVModule::INNER);
   const EMECHVManager *emecHVO= new EMECHVManager(EMECHVModule::OUTER);
   const HECHVManager *hecHV   = new HECHVManager();
@@ -82,7 +80,7 @@ StatusCode LArDetectorToolNV::create()
   const EMBPresamplerHVManager *embPSHV = new EMBPresamplerHVManager();
   const EMECPresamplerHVManager *emecPSHV = new EMECPresamplerHVManager();
 
-  LArHVManager *hvManager= new LArHVManager(embHV,emecHVI, emecHVO, hecHV, fcalHV,embPSHV, emecPSHV);
+  LArHVManager *hvManager= new LArHVManager(emecHVI, emecHVO, hecHV, fcalHV,embPSHV, emecPSHV);
 
   ATH_CHECK(detStore()->record(hvManager,"LArHVManager"));  
 
@@ -158,7 +156,7 @@ StatusCode LArDetectorToolNV::create()
     geometryLayout = "G3";
   }
 
-  LArGeo::LArDetectorFactory theLArFactory(testbeam,m_geometryConfig=="FULL");
+  LArGeo::LArDetectorFactory theLArFactory(testbeam,m_geometryConfig=="FULL",hvManager);
 
   theLArFactory.setBarrelSagging       (m_barrelSaggingOn);
   theLArFactory.setBarrelCellVisLimit  (m_barrelVisLimit);
diff --git a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrode.h b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrode.h
index 38c3c31b0cf659ef14a66dd9ce1e2e73db75494d..843bf16901fd297fe67f8d856db400c40187f8b4 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrode.h
+++ b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrode.h
@@ -1,29 +1,27 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef EMBHVELECTRODE_H_HEADER_INCLUDED_D823FBB9
-#define EMBHVELECTRODE_H_HEADER_INCLUDED_D823FBB9
-#include "GeoModelKernel/RCBase.h"
-#include "LArHV/EMBHVModuleConstLink.h"
-//  
-//##ModelId=475696070335
-class EMBHVElectrode : public RCBase
+#ifndef LARHV_EMBHVELECTRODE_H
+#define LARHV_EMBHVELECTRODE_H
+
+class EMBHVModule;
+
+class EMBHVElectrode
 {
   public:
     // Constructor
-    //##ModelId=475697F20323
-    EMBHVElectrode(EMBHVModuleConstLink module, unsigned int iElectrode);
+    EMBHVElectrode(const EMBHVModule* module, unsigned int iElectrode);
+
+    // Destructor
+    virtual ~EMBHVElectrode();
 
     // Returns the index of this electrode.
-    //##ModelId=4756987F0395
     unsigned int getElectrodeIndex() const;
 
     // returns a pointer to the module that owns this electrode.
-    //##ModelId=479BCD0B039F
-    EMBHVModuleConstLink getModule() const;
+    const EMBHVModule& getModule() const;
 
-    //##ModelId=47AA6C740007
     double getPhi() const;
 
     // HV Status
@@ -43,22 +41,14 @@ class EMBHVElectrode : public RCBase
 
 
   private:
-    // Destructor
-    //##ModelId=475697F20382
-    virtual ~EMBHVElectrode();
-
     // Illegal operation
-    //##ModelId=475697F20337
     EMBHVElectrode(const EMBHVElectrode& right);
 
     // Illegal operation
-    //##ModelId=475697F203A5
     EMBHVElectrode& operator=(const EMBHVElectrode& right);
 
     class Clockwork;
     Clockwork *m_c;
 };
 
-
-
-#endif /* EMBHVELECTRODE_H_HEADER_INCLUDED_D823FBB9 */
+#endif 
diff --git a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrodeConstLink.h b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrodeConstLink.h
deleted file mode 100644
index bcb79b8f76f47551739e5052d2f931d3420ea31e..0000000000000000000000000000000000000000
--- a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVElectrodeConstLink.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#ifndef _EMBHVElectrodeConstLink_h_
-#define _EMBHVElectrodeConstLink_h_
-#include "GeoModelKernel/ConstLink.h"
-class EMBHVElectrode;
-typedef ConstLink<EMBHVElectrode> EMBHVElectrodeConstLink;
-#endif
diff --git a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVManager.h b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVManager.h
index d52f2b9f4874d1397e7121a79b0db962b50d33ed..ce53939e4ac7f008071bc8294863a2ef6e31f8b6 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVManager.h
+++ b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVManager.h
@@ -1,76 +1,64 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef EMBHVMANAGER_H_HEADER_INCLUDED_EA5D07D1
-#define EMBHVMANAGER_H_HEADER_INCLUDED_EA5D07D1
+#ifndef LARHV_EMBHVMANAGER_H
+#define LARHV_EMBHVMANAGER_H
 
-#include "GeoModelKernel/RCBase.h"
-#include "LArHV/EMBHVModuleConstLink.h"
 #include "LArHV/EMBHVModule.h"
-
-class EMBHVDescriptor;
-
-
-// This class provides direct access to information on the HV 
-// electrodes within the barrels.  The information may be accessed either
-// directly or iteratively.  Direct access is provided by the getHVModule()
-// method.  Iterative access
-// is by looping over valid side, eta, phi, and sector indices to
-// retrieve a HV module.  From the high voltage modules one
-// can obtain a list of electrodes (iteratively or directly).
-// 
-//##ModelId=475306FC0255
+#include "LArHV/EMBHVDescriptor.h"
 
 struct EMBHVPayload;
 
-class EMBHVManager : public RCBase
+/**
+ * @class EMBHVManager
+ *
+ * @brief  This class provides direct access to information on the HV 
+ * electrodes within the barrels.  The information may be accessed either
+ * directly or iteratively.  Direct access is provided by the getHVModule()
+ * method.  Iterative access
+ * is by looping over valid side, eta, phi, and sector indices to
+ * retrieve a HV module.  From the high voltage modules one
+ * can obtain a list of electrodes (iteratively or directly).
+ */ 
+
+class EMBHVManager
 {
   public:
-
     // Constructor
-    //##ModelId=475533F70142
     EMBHVManager();
 
-    // Gets the descriptor.  (Not generally for users but nothing to hide
-    // here).
-    //##ModelId=4755C0750375
-    const EMBHVDescriptor *getDescriptor() const;
+    // Destructor
+    virtual ~EMBHVManager();
+
+    // Gets the descriptor.  (Not generally for users but nothing to hide here).
+    const EMBHVDescriptor& getDescriptor() const;
 
     // Begin phi index
-    //##ModelId=4755C07E0225
     unsigned int beginPhiIndex() const;
 
     // End phi index
-    //##ModelId=4755C08F02F7
     unsigned int endPhiIndex() const;
 
     // Begin eta index
-    //##ModelId=4755C094026E
     unsigned int beginEtaIndex() const;
 
     // End eta index
-    //##ModelId=4755C09A015F
     unsigned int endEtaIndex() const;
 
     // Begin sector index
-    //##ModelId=479B66510283
     unsigned int beginSectorIndex() const;
 
     // End sector index
-    //##ModelId=479B66510295
     unsigned int endSectorIndex() const;
 
     // Returns a high voltage module
-    //##ModelId=4755C0A200A6
-    EMBHVModuleConstLink getHVModule(unsigned int iSide, unsigned int iEta, unsigned int iPhi, unsigned int iSector) const;
+    const EMBHVModule& getHVModule(unsigned int iSide, unsigned int iEta, unsigned int iPhi, unsigned int iSector) const;
 
     // Begin side index (0=negative and 1= positive)
-    //##ModelId=479BB7670398
     unsigned int beginSideIndex() const;
 
     // End side index (0=negative and 1= positive)
-    //##ModelId=479BB76703AB
     unsigned int endSideIndex() const;
 
     // Refresh from the database if needed
@@ -83,24 +71,15 @@ class EMBHVManager : public RCBase
     EMBHVPayload *getPayload(const EMBHVElectrode &) const;
 
   private:
-    // Destructor
-    //##ModelId=475533F7019B
-    virtual ~EMBHVManager();
-
     // Illegal operation
-    //##ModelId=475533F70154
     EMBHVManager(const EMBHVManager& right);
 
     // Illegal operation
-    //##ModelId=475533F701B8
     EMBHVManager& operator=(const EMBHVManager& right);
 
     friend class ImaginaryFriend;
     class Clockwork;
     Clockwork *m_c;
-
 };
 
-
-
-#endif /* EMBHVMANAGER_H_HEADER_INCLUDED_EA5D07D1 */
+#endif 
diff --git a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModule.h b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModule.h
index 861bb225352574d72c304b974e727cfe2a34a113..befa10cc07d897891ebc54a48f715c1e5c5124c2 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModule.h
+++ b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModule.h
@@ -1,71 +1,54 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef EMBHVMODULE_H_HEADER_INCLUDED_C40C54F8
-#define EMBHVMODULE_H_HEADER_INCLUDED_C40C54F8
-#include "GeoModelKernel/RCBase.h"
-#include "GeoModelKernel/ConstLink.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
+#ifndef LARHV_EMBHVMODULE_H
+#define LARHV_EMBHVMODULE_H
+
 class EMBHVManager;
+class EMBHVElectrode;
 
-//##ModelId=4753092700BA
-class EMBHVModule : public RCBase
+class EMBHVModule
 {
   public:
-    //##ModelId=475656A60228
-    EMBHVModule(const EMBHVManager *manager, unsigned int iSide, unsigned int iEta, unsigned int iPhi, unsigned int iSector);
+    EMBHVModule(const EMBHVManager *manager
+		, unsigned int iSide
+		, unsigned int iEta
+		, unsigned int iPhi
+		, unsigned int iSector);
+
+    // Destructor
+    virtual ~EMBHVModule();
 
     // Get eta Index
-    //##ModelId=475659560392
     unsigned int getEtaIndex() const;
 
     // Get phi index
-    //##ModelId=4756597E0324
     unsigned int getPhiIndex() const;
 
     // Get sector index
-    //##ModelId=479B9A7301DC
     unsigned int getSectorIndex() const;
 
     // Get num electrodes
-    //##ModelId=4756967601F7
     unsigned int getNumElectrodes() const
     {
       return 64;
     }
 
     // Gets an electrode
-    //##ModelId=475696D40106
-    EMBHVElectrodeConstLink getElectrode(unsigned int iElectrode) const;
+    const EMBHVElectrode& getElectrode(unsigned int iElectrode) const;
+
     // Side Index (0=Negative, 1=Positive)
-    //##ModelId=479BBABD034D
     unsigned int getSideIndex() const;
-    //##ModelId=47AA68EE020D
-    double getEtaMin() const;
-
 
-    //##ModelId=47AA68EE0223
+    double getEtaMin() const;
     double getEtaMax() const;
-
-
-    //##ModelId=47AA68EE0236
     double getPhiMin() const;
-
-  
-    //##ModelId=47AA68EE024B
     double getPhiMax() const;
 
-    //##ModelId=47AB6F3600D2
-    const EMBHVManager *getManager() const;
-  
+    const EMBHVManager& getManager() const;
 
   private:
-    // Destructor
-    //##ModelId=475656A60278
-    virtual ~EMBHVModule();
-
-
     // Illegal operation
     EMBHVModule& operator=(const EMBHVModule& right);
     // Illegal operation
@@ -75,8 +58,6 @@ class EMBHVModule : public RCBase
     Clockwork *m_c;
 
     friend class ImaginaryFriend;
-
-
 };
 
-#endif /* EMBHVMODULE_H_HEADER_INCLUDED_C40C54F8 */
+#endif
diff --git a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModuleConstLink.h b/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModuleConstLink.h
deleted file mode 100644
index 3c623bb0fb4256994af8fb29063690833884eab4..0000000000000000000000000000000000000000
--- a/LArCalorimeter/LArGeoModel/LArHV/LArHV/EMBHVModuleConstLink.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#ifndef _EMBHVModuleConstLink_h_
-#define _EMBHVModuleConstLink_h_
-#include "GeoModelKernel/ConstLink.h"
-class EMBHVModule;
-typedef ConstLink<EMBHVModule> EMBHVModuleConstLink;
-#endif
diff --git a/LArCalorimeter/LArGeoModel/LArHV/LArHV/LArHVManager.h b/LArCalorimeter/LArGeoModel/LArHV/LArHV/LArHVManager.h
index 92a2da7791edb2270073baca7be3473bdae8a3cb..1f6df12200041dca8dd14c51621e174ae83cf15b 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/LArHV/LArHVManager.h
+++ b/LArCalorimeter/LArGeoModel/LArHV/LArHV/LArHVManager.h
@@ -1,10 +1,10 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef LARHVMANAGER_H_HEADER_INCLUDED_E73E3A24
-#define LARHVMANAGER_H_HEADER_INCLUDED_E73E3A24
-class EMBHVManager;
+#ifndef LARHV_LARHVMANAGER_H
+#define LARHV_LARHVMANAGER_H
+
 class EMECHVManager;
 class HECHVManager;
 class FCALHVManager;
@@ -12,31 +12,34 @@ class EMBPresamplerHVManager;
 class EMECPresamplerHVManager;
 
 #include "LArHV/EMECHVManager.h"
+#include "LArHV/EMBHVManager.h"
 
 #include "IOVSvc/IOVSvc.h"
 #include "StoreGate/DataHandle.h"
  
-// This class provides access to the High Voltage throughout the LAr. 
-// High voltage conditions can also be accessed through the readout
-// Geometry, if appropriate.
-
+/**
+ * @class LArHVManager
+ *
+ * @brief This class provides access to the High Voltage throughout the LAr. 
+ * High voltage conditions can also be accessed through the readout
+ * Geometry, if appropriate.
+ */
 
 class LArHVManager
 {
   public:
-
   
     typedef EMECHVManager::IOType IOType;
   
     // Constructor
     // 
-    LArHVManager(const EMBHVManager  *embHv, const EMECHVManager *emecHvInner, const EMECHVManager *emecHvOuter, const HECHVManager *hecHv, const FCALHVManager *fcalHv, const EMBPresamplerHVManager *embPreManager, const EMECPresamplerHVManager *emecPreManager);
+    LArHVManager(const EMECHVManager *emecHvInner, const EMECHVManager *emecHvOuter, const HECHVManager *hecHv, const FCALHVManager *fcalHv, const EMBPresamplerHVManager *embPreManager, const EMECPresamplerHVManager *emecPreManager);
     
     //  Destructor
     virtual ~LArHVManager();
     
     // Returns the EMBHVManager
-    const EMBHVManager *getEMBHVManager() const;
+    const EMBHVManager& getEMBHVManager() const;
 
     // Returns the Barrel Presampler Manager:
     const EMBPresamplerHVManager *getEMBPresamplerHVManager() const;
@@ -64,7 +67,7 @@ class LArHVManager
   LArHVManager(const LArHVManager& right);
   
 
-  const EMBHVManager            *m_embHV;
+  EMBHVManager m_embHV;
   const EMECHVManager           *m_emecHVInner;
   const EMECHVManager           *m_emecHVOuter;
   const HECHVManager            *m_hecHV;
diff --git a/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVElectrode.cpp b/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVElectrode.cpp
index b3ee93a141e21621582d801d5e3322144e79311a..86968242fbd8b965042ea8c24734977fceacae3c 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVElectrode.cpp
+++ b/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVElectrode.cpp
@@ -1,78 +1,67 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArHV/EMBHVElectrode.h"
-#include "LArHV/EMBHVModuleConstLink.h"
-#include "LArHV/EMBHVModule.h"
 #include "LArHV/EMBHVManager.h"
+#include "LArHV/EMBHVModule.h"
 #include <cmath>
 
 #include "EMBHVPayload.h"
 
 class EMBHVElectrode::Clockwork {
-
 public:
-
-    const EMBHVModule *module;
-    unsigned int iElectrode;
-
+  Clockwork(const EMBHVModule* modulePtr, unsigned int electrode)
+    : module(modulePtr)
+    , iElectrode(electrode)
+  {}
+  const EMBHVModule* module;
+  unsigned int iElectrode;
 };
 
-//##ModelId=475697F20323
-EMBHVElectrode::EMBHVElectrode(EMBHVModuleConstLink module, unsigned int iElectrode) :m_c(new Clockwork) 
+EMBHVElectrode::EMBHVElectrode(const EMBHVModule* module, unsigned int iElectrode) 
+  : m_c(new Clockwork(module,iElectrode))
 {
-  m_c->module=&*module;
-  m_c->iElectrode=iElectrode;
 }
 
-
-//##ModelId=475697F20382
 EMBHVElectrode::~EMBHVElectrode()
 {
   delete m_c;
 }
 
-//##ModelId=479BCD0B039F
-EMBHVModuleConstLink EMBHVElectrode::getModule() const
+const EMBHVModule& EMBHVElectrode::getModule() const
 {
-  return m_c->module;
+  return *(m_c->module);
 }
 
-//##ModelId=47AA6C740007
 double EMBHVElectrode::getPhi() const
 {
   return m_c->module->getPhiMin()+m_c->iElectrode*2.0*M_PI/1024.0;
 }
 
-//##ModelId=47AB8993017C
 bool EMBHVElectrode::hvOn(int iGap) const
 {
-  EMBHVPayload *payload = m_c->module->getManager()->getPayload(*this);
-  if (payload->voltage[iGap]<-9999) return false;
-  else return true;
+  EMBHVPayload *payload = m_c->module->getManager().getPayload(*this);
+  return (payload->voltage[iGap]>=-9999);
 }
 
 double EMBHVElectrode::voltage(int iGap) const {
-  EMBHVPayload *payload = m_c->module->getManager()->getPayload(*this);
+  EMBHVPayload *payload = m_c->module->getManager().getPayload(*this);
   return payload->voltage[iGap];
 }
 
 double EMBHVElectrode::current(int iGap) const {
-  EMBHVPayload *payload = m_c->module->getManager()->getPayload(*this);
+  EMBHVPayload *payload = m_c->module->getManager().getPayload(*this);
   return payload->current[iGap];
 }
 
-
 int EMBHVElectrode::hvLineNo(int iGap) const {
-  EMBHVPayload *payload = m_c->module->getManager()->getPayload(*this);
+  EMBHVPayload *payload = m_c->module->getManager().getPayload(*this);
   return payload->hvLineNo[iGap];
 }
 
-
-
 void EMBHVElectrode::voltage_current(int iGap,double& voltage, double&current) const {
- EMBHVPayload *payload = m_c->module->getManager()->getPayload(*this);
+ EMBHVPayload *payload = m_c->module->getManager().getPayload(*this);
  voltage = payload->voltage[iGap];
  current = payload->current[iGap];
 }
diff --git a/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVManager.cpp b/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVManager.cpp
index d6faddbe9bb0da04651268b51496f18bc550e7f7..f30ee76a454c5e2e3251301a1d1cb4d1c096667a 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVManager.cpp
+++ b/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVManager.cpp
@@ -1,9 +1,9 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArHV/EMBHVManager.h"
-#include "LArHV/EMBHVDescriptor.h"
+#include "LArHV/EMBHVModule.h"
 #include "LArHV/EMBHVElectrode.h"
 #include "GeoModelKernel/CellBinning.h"
 #include <cmath>
@@ -29,62 +29,74 @@
 
 class EMBHVManager::Clockwork {
 public:
-  Clockwork() {};
+  Clockwork(const EMBHVManager* manager) {
+    for(int iSide=0; iSide<2; ++iSide) {
+      for(int iEta=0; iEta<8; ++iEta) {
+	for(int iPhi=0; iPhi<16; ++iPhi) {
+	  for(int iSector=0; iSector<2; ++iSector) {
+	    moduleArray[iSide][iEta][iPhi][iSector] = new EMBHVModule(manager,iSide,iEta,iPhi,iSector);
+	  }
+	}
+      }
+    }
+  }
   Clockwork(const Clockwork&) = delete;
-  EMBHVDescriptor      *descriptor;
-  EMBHVModuleConstLink  linkArray[2][8][16][2];
+  ~Clockwork() {
+    for(int iSide=0; iSide<2; ++iSide) {
+      for(int iEta=0; iEta<8; ++iEta) {
+	for(int iPhi=0; iPhi<16; ++iPhi) {
+	  for(int iSector=0; iSector<2; ++iSector) {
+	    delete moduleArray[iSide][iEta][iPhi][iSector];
+	  }
+	}
+      }
+    }
+  }
+  EMBHVDescriptor       descriptor{CellBinning(0.0, 1.4, 7, 1),CellBinning(0.0, 2*M_PI, 16)};
+  const EMBHVModule*    moduleArray[2][8][16][2];
   std::atomic<bool>     init{false};
   std::mutex            mtx;
   std::vector<EMBHVPayload> payloadArray;
 };
 
-
-
-
-
 EMBHVManager::EMBHVManager()
-:m_c(new Clockwork)
+  : m_c(new Clockwork(this))
 {
-  m_c->descriptor = new EMBHVDescriptor(CellBinning(0.0, 1.4, 7, 1),CellBinning(0.0, 2*M_PI, 16));	
-  m_c->init=false;
 }
 
-
 EMBHVManager::~EMBHVManager()
 {
-  delete m_c->descriptor;
   delete m_c;
 }
 
-const EMBHVDescriptor *EMBHVManager::getDescriptor() const
+const EMBHVDescriptor& EMBHVManager::getDescriptor() const
 {
   return m_c->descriptor;
 }
 
 unsigned int EMBHVManager::beginPhiIndex() const
 {
-  return m_c->descriptor->getPhiBinning().getFirstDivisionNumber();
+  return m_c->descriptor.getPhiBinning().getFirstDivisionNumber();
 }
 
 unsigned int EMBHVManager::endPhiIndex() const
 {
-  return m_c->descriptor->getPhiBinning().getFirstDivisionNumber() + m_c->descriptor->getPhiBinning().getNumDivisions();
+  return m_c->descriptor.getPhiBinning().getFirstDivisionNumber() + m_c->descriptor.getPhiBinning().getNumDivisions();
 }
 
 unsigned int EMBHVManager::beginEtaIndex() const
 {
-  return m_c->descriptor->getEtaBinning().getFirstDivisionNumber();
+  return m_c->descriptor.getEtaBinning().getFirstDivisionNumber();
 }
 
 unsigned int EMBHVManager::endEtaIndex() const
 {
-  return m_c->descriptor->getEtaBinning().getFirstDivisionNumber() + m_c->descriptor->getEtaBinning().getNumDivisions();
+  return m_c->descriptor.getEtaBinning().getFirstDivisionNumber() + m_c->descriptor.getEtaBinning().getNumDivisions();
 }
 
-EMBHVModuleConstLink EMBHVManager::getHVModule(unsigned int iSide, unsigned int iEta,unsigned int iPhi, unsigned int iSector) const
+const EMBHVModule& EMBHVManager::getHVModule(unsigned int iSide, unsigned int iEta,unsigned int iPhi, unsigned int iSector) const
 {
-  if (!m_c->linkArray[iSide][iEta][iPhi][iSector]) m_c->linkArray[iSide][iEta][iPhi][iSector] = EMBHVModuleConstLink(new EMBHVModule(this, iSide, iEta,iPhi,iSector));
-  return m_c->linkArray[iSide][iEta][iPhi][iSector];
+  return *(m_c->moduleArray[iSide][iEta][iPhi][iSector]);
 }
 
 unsigned int EMBHVManager::beginSectorIndex() const
@@ -254,12 +266,12 @@ void EMBHVManager::update() const {
 EMBHVPayload *EMBHVManager::getPayload(const EMBHVElectrode &electrode) const {
   update();
   unsigned int electrodeIndex    = electrode.getElectrodeIndex();
-  EMBHVModuleConstLink module = electrode.getModule();
-  unsigned int etaIndex          = module->getEtaIndex();
-  unsigned int phiIndex          = module->getPhiIndex();
-  unsigned int sectorIndex       = module->getSectorIndex();
-  unsigned int sideIndex         = module->getSideIndex();
-  unsigned int index             =  8192*sideIndex+1024*etaIndex+64*phiIndex+32*sectorIndex+electrodeIndex;
+  const EMBHVModule& module      = electrode.getModule();
+  unsigned int etaIndex          = module.getEtaIndex();
+  unsigned int phiIndex          = module.getPhiIndex();
+  unsigned int sectorIndex       = module.getSectorIndex();
+  unsigned int sideIndex         = module.getSideIndex();
+  unsigned int index             = 8192*sideIndex+1024*etaIndex+64*phiIndex+32*sectorIndex+electrodeIndex;
   return &m_c->payloadArray[index];
 }
 
diff --git a/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVModule.cpp b/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVModule.cpp
index d1d90ece59612cac6c871b46ac3b0a06fdf14c6c..b74e80bf7383f4a7edf7d14d10c4d41f7ef10fe9 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVModule.cpp
+++ b/LArCalorimeter/LArGeoModel/LArHV/src/EMBHVModule.cpp
@@ -1,122 +1,117 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-#include "LArHV/EMBHVElectrode.h"
 #include "LArHV/EMBHVModule.h"
 #include "LArHV/EMBHVManager.h"
 #include "LArHV/EMBHVDescriptor.h"
-class EMBHVModule::Clockwork {
+#include "LArHV/EMBHVElectrode.h"
 
+class EMBHVModule::Clockwork {
 public:
-
-  const EMBHVManager *       manager;
-  
+  Clockwork(const EMBHVManager* managerPtr
+	    , const EMBHVModule* modulePtr
+	    , unsigned int side
+	    , unsigned int eta
+	    , unsigned int phi
+	    , unsigned int sector) 
+    : manager(managerPtr)
+    , iSide(side)
+    , iEta(eta)
+    , iPhi(phi)
+    , iSector(sector) {
+    for(int i=0; i<64; ++i) {
+      electrodes[i] = new EMBHVElectrode(modulePtr,i);
+    }
+  }
+  ~Clockwork() {
+    for(int i=0; i<64; ++i) {
+      delete electrodes[i];
+    }    
+  }
+  const EMBHVManager* manager;
   unsigned int iSide;
-  
   unsigned int iEta;
-  
   unsigned int iPhi;
-
   unsigned int iSector;
-
-  EMBHVElectrodeConstLink links[64]; 
-  
+  const EMBHVElectrode* electrodes[64]; 
 };
 
-//##ModelId=475656A60228
-EMBHVModule::EMBHVModule(const EMBHVManager *manager, unsigned int iSide, unsigned int iEta, unsigned int iPhi, unsigned int iSector):m_c(new Clockwork)
+EMBHVModule::EMBHVModule(const EMBHVManager* manager
+			 , unsigned int iSide
+			 , unsigned int iEta
+			 , unsigned int iPhi
+			 , unsigned int iSector)
+  : m_c(new Clockwork(manager,this,iSide,iEta,iPhi,iSector))
 {
-  // Might need to ref the manager here.?? 
-  m_c->manager=manager;
-  m_c->iSide=iSide;
-  m_c->iEta=iEta;
-  m_c->iPhi=iPhi;
-  m_c->iSector=iSector;
-  for (int i=0;i<64;i++) m_c->links[i]=0;
 }
 
-
-//##ModelId=475659560392
 unsigned int EMBHVModule::getEtaIndex() const
 {
   return m_c->iEta;
 }
 
-//##ModelId=4756597E0324
 unsigned int EMBHVModule::getPhiIndex() const
 {
   return m_c->iPhi;
 }
 
-//##ModelId=479B9A7301DC
 unsigned int EMBHVModule::getSectorIndex() const
 {
   return m_c->iSector;
 }
 
-//##ModelId=475656A60278
 EMBHVModule::~EMBHVModule() 
 {
   delete m_c;
 }
 
-
-//##ModelId=475696D40106
-EMBHVElectrodeConstLink EMBHVModule::getElectrode(unsigned int iElectrode) const
+const EMBHVElectrode& EMBHVModule::getElectrode(unsigned int iElectrode) const
 {
-  if (!m_c->links[iElectrode]) m_c->links[iElectrode] = EMBHVElectrodeConstLink (new EMBHVElectrode(this,iElectrode));
-  return m_c->links[iElectrode];
+  return *(m_c->electrodes[iElectrode]);
 }
 
-//##ModelId=479BBABD034D
 unsigned int EMBHVModule::getSideIndex() const
 {
   return m_c->iSide;
 }
 
-//##ModelId=47AA68EE020D
 double EMBHVModule::getEtaMin() const
 {
   if (m_c->iSide==0) {
-    return -m_c->manager->getDescriptor()->getEtaBinning().binUpper(m_c->iEta);
+    return -m_c->manager->getDescriptor().getEtaBinning().binUpper(m_c->iEta);
   }
   else {
-    return m_c->manager->getDescriptor()->getEtaBinning().binLower(m_c->iEta);
+    return m_c->manager->getDescriptor().getEtaBinning().binLower(m_c->iEta);
   }
 }
 
-//##ModelId=47AA68EE0223
 double EMBHVModule::getEtaMax() const
 {
   if (m_c->iSide==0) {
-    return -m_c->manager->getDescriptor()->getEtaBinning().binLower(m_c->iEta);
+    return -m_c->manager->getDescriptor().getEtaBinning().binLower(m_c->iEta);
   }
   else {
-    return m_c->manager->getDescriptor()->getEtaBinning().binUpper(m_c->iEta);
+    return m_c->manager->getDescriptor().getEtaBinning().binUpper(m_c->iEta);
   }
 }
 
-//##ModelId=47AA68EE0236
 double EMBHVModule::getPhiMin() const
 {
   return 
-    m_c->manager->getDescriptor()->getPhiBinning().binLower(m_c->iPhi)+
-    m_c->iSector*m_c->manager->getDescriptor()->getPhiBinning().getDelta()/2.0;
+    m_c->manager->getDescriptor().getPhiBinning().binLower(m_c->iPhi)+
+    m_c->iSector*m_c->manager->getDescriptor().getPhiBinning().getDelta()/2.0;
 }
 
-//##ModelId=47AA68EE024B
 double EMBHVModule::getPhiMax() const
 {
   return 
-    m_c->manager->getDescriptor()->getPhiBinning().binLower(m_c->iPhi)+
-    (m_c->iSector+1)*m_c->manager->getDescriptor()->getPhiBinning().getDelta()/2.0;
+    m_c->manager->getDescriptor().getPhiBinning().binLower(m_c->iPhi)+
+    (m_c->iSector+1)*m_c->manager->getDescriptor().getPhiBinning().getDelta()/2.0;
 
 }
 
-
-
-const EMBHVManager *EMBHVModule::getManager() const {
-  return m_c->manager;
+const EMBHVManager& EMBHVModule::getManager() const {
+  return *(m_c->manager);
 }
 
diff --git a/LArCalorimeter/LArGeoModel/LArHV/src/LArHVManager.cpp b/LArCalorimeter/LArGeoModel/LArHV/src/LArHVManager.cpp
index a50cf6cb238f4388a810b024431ef037ad1e154b..6194b4429722695dfc7504afd09cbc4de5e65b8a 100644
--- a/LArCalorimeter/LArGeoModel/LArHV/src/LArHVManager.cpp
+++ b/LArCalorimeter/LArGeoModel/LArHV/src/LArHVManager.cpp
@@ -1,9 +1,8 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArHV/LArHVManager.h"
-#include "LArHV/EMBHVManager.h"
 #include "LArHV/EMECHVManager.h"
 #include "LArHV/HECHVManager.h"
 #include "LArHV/FCALHVManager.h"
@@ -11,10 +10,20 @@
 #include "LArHV/EMECPresamplerHVManager.h"
 #include "LArHV/LArHVManager.h"
 
-LArHVManager::LArHVManager(const EMBHVManager  *embHV, const EMECHVManager *emecHVInner, const EMECHVManager *emecHVOuter, const HECHVManager *hecHV, const FCALHVManager *fcalHV, const EMBPresamplerHVManager *embPreHV, const EMECPresamplerHVManager *emecPreHV): 
-  m_embHV(embHV),m_emecHVInner(emecHVInner),m_emecHVOuter(emecHVOuter),m_hecHV(hecHV),m_fcalHV(fcalHV),m_embPreHV(embPreHV), m_emecPreHV(emecPreHV)
+LArHVManager::LArHVManager(const EMECHVManager *emecHVInner
+			   , const EMECHVManager *emecHVOuter
+			   , const HECHVManager *hecHV
+			   , const FCALHVManager *fcalHV
+			   , const EMBPresamplerHVManager *embPreHV
+			   , const EMECPresamplerHVManager *emecPreHV)
+  : m_embHV()
+  , m_emecHVInner(emecHVInner)
+  , m_emecHVOuter(emecHVOuter)
+  , m_hecHV(hecHV)
+  , m_fcalHV(fcalHV)
+  , m_embPreHV(embPreHV)
+  , m_emecPreHV(emecPreHV)
 {
-  if (m_embHV)  m_embHV->ref();
   if (m_emecHVInner) m_emecHVInner->ref();
   if (m_emecHVOuter) m_emecHVOuter->ref();
   if (m_hecHV)  m_hecHV->ref();
@@ -26,7 +35,7 @@ LArHVManager::LArHVManager(const EMBHVManager  *embHV, const EMECHVManager *emec
 
 void LArHVManager::reset() const
 {
-  if (m_embHV) m_embHV->reset();
+  m_embHV.reset();
   if (m_emecHVInner) m_emecHVInner->reset();
   if (m_emecHVOuter) m_emecHVOuter->reset();
   if (m_hecHV)  m_hecHV->reset();
@@ -39,7 +48,6 @@ void LArHVManager::reset() const
 
 LArHVManager::~LArHVManager()
 {
-  if (m_embHV)  m_embHV->unref();
   if (m_emecHVInner) m_emecHVInner->unref();
   if (m_emecHVOuter) m_emecHVOuter->unref();
   if (m_hecHV)  m_hecHV->unref();
@@ -49,7 +57,7 @@ LArHVManager::~LArHVManager()
 
 }
 
-const EMBHVManager *LArHVManager::getEMBHVManager() const
+const EMBHVManager& LArHVManager::getEMBHVManager() const
 {
   return m_embHV;
 }
diff --git a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBCell.h b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBCell.h
index d0c206b15a5a96f39b7decdb45e0b04b7ea42f0d..23cacd99d43528cd4048f1ea6dd038d702c7d78e 100755
--- a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBCell.h
+++ b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBCell.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef LARREADOUTGEOMETRY_EMBCELL_H
@@ -9,17 +9,15 @@
 #include "LArReadoutGeometry/EMBHVPathologies.h"
 #include "LArHV/EMBPresamplerHVModuleConstLink.h"
 #include "LArHV/EMBPresamplerHVModule.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
 #include <cmath>
 #include "GeoModelKernel/RCBase.h"
 #include <vector>
-/**
- * @brief A cell of the electromagnetic barrel calorimeter readout
- * geometry
- */
 
-/** 
+/**
+ * @class EMBCell
+ *
+ * @brief A cell of the electromagnetic barrel calorimeter readout geometry
  *  This class gives dimensions and positions, and indices of an 
  *  electromagnetic barrel calorimeter readout cell.  Positions are
  *  in local coordinates (local to a "big piece", or in this case the
@@ -141,7 +139,7 @@ class EMBCell : public RCBase
       /**
        * @Get electrode
        */
-      const EMBHVElectrodeConstLink & getElectrode (unsigned int i) const;
+      const EMBHVElectrode & getElectrode (unsigned int i) const;
 
       /**
        * @Get num HVPathologies
@@ -175,7 +173,7 @@ class EMBCell : public RCBase
 
       const EMBDetDescr *m_embDetDescr;
 
-      mutable std::vector<EMBHVElectrodeConstLink> m_electrode;
+      mutable std::vector<const EMBHVElectrode*> m_electrode;
 
       mutable EMBPresamplerHVModuleConstLink m_presamplerModule;
 
diff --git a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBDetectorManager.h b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBDetectorManager.h
index 36d6281efbeb197de40dd76a65bda5a0c6295b9d..88ca94d6aca9ab1006d9726f348fa3edb4eebec6 100755
--- a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBDetectorManager.h
+++ b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/LArReadoutGeometry/EMBDetectorManager.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef LARREADOUTGEOMETRY_EMBDETECTORMANAGER_H
@@ -8,21 +8,22 @@
 #include <vector>
 #include "GeoModelKernel/GeoVDetectorManager.h"
 #include "LArReadoutGeometry/EMBAccordionDetails.h"
+#include "LArHV/EMBHVManager.h"
 class EMBDetDescr;
 class EMBDetectorRegion;
 class EMBBasicReadoutNumbers;
-class EMBHVManager;
 class EMBPresamplerHVManager;
-/**
- *     @brief A manager class providing access to readout geometry information
- *     for the electromagnetic barrel calorimeter.
- */
 
 /**
- *	The EMBDetectorManager provides access to EMB Regions,
- *	to Descriptors for EMB regions, to the physical volumes
- *	(tree tops) within the EMB, and to a number of important
- *	engineering numbers within the EMB.
+ * @class EMBDetectorManager
+ *
+ * @brief A manager class providing access to readout geometry information
+ * for the electromagnetic barrel calorimeter.
+ *
+ * The EMBDetectorManager provides access to EMB Regions,
+ * to Descriptors for EMB regions, to the physical volumes
+ * (tree tops) within the EMB, and to a number of important
+ * engineering numbers within the EMB.
  */
 
 class EMBDetectorManager : public GeoVDetectorManager  
@@ -37,7 +38,7 @@ class EMBDetectorManager : public GeoVDetectorManager
   /**
    * @brief Constructor
    */
-  EMBDetectorManager();
+  EMBDetectorManager(const EMBHVManager& hvManager);
   
   /**
    * @brief Destructor
@@ -99,7 +100,7 @@ class EMBDetectorManager : public GeoVDetectorManager
   /**
    * @brief       Get the HV Manager
    */
-  const EMBHVManager *getHVManager () const;
+  const EMBHVManager& getHVManager () const;
   
   /**
    * @brief       Get the HV Manager (Presampler)
@@ -129,7 +130,7 @@ class EMBDetectorManager : public GeoVDetectorManager
   EMBDetRegionArray m_DetRegionsRandom;
   const EMBBasicReadoutNumbers *m_basicReadoutNumbers;
   mutable EMBAccordionDetails *m_accordionDetails;
-  mutable const EMBHVManager           *m_hvManager;
+  const EMBHVManager&         m_hvManager;
   mutable const EMBPresamplerHVManager *m_presamplerHVManager;
 };
 
diff --git a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBCell.cxx b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBCell.cxx
index cde34057995f36a6d374a90e5be54b7894e914e3..25d87a3a29920de8b87d5d81ac44a30d46de6549 100755
--- a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBCell.cxx
+++ b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBCell.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArReadoutGeometry/EMBCell.h"
@@ -32,9 +32,9 @@ unsigned int EMBCell::getNumElectrodes() const {
   return m_electrode.size();
 }
 
-const EMBHVElectrodeConstLink & EMBCell::getElectrode (unsigned int i) const {
+const EMBHVElectrode & EMBCell::getElectrode (unsigned int i) const {
   if (m_electrode.size()==0 && !m_presamplerModule) initHV();
-  return m_electrode[i];
+  return *(m_electrode[i]);
 }
 
 const EMBPresamplerHVModuleConstLink & EMBCell::getPresamplerHVModule () const {
@@ -73,7 +73,7 @@ void EMBCell::initHV() const {
   else {
     // M_PI - phi for left side
     
-    const EMBHVManager *hvManager=getDescriptor()->getManager()->getHVManager();
+    const EMBHVManager& hvManager=getDescriptor()->getManager()->getHVManager();
     double phiUpper = getPhiMaxNominal();
     double phiLower = getPhiMinNominal();
     
@@ -81,8 +81,8 @@ void EMBCell::initHV() const {
     
     double eta=fabs(getEtaMax()+getEtaMin())/2.0;
     double phi=fabs(phiUpper+phiLower)/2.0;
-    const CellBinning & etaBinning=hvManager->getDescriptor()->getEtaBinning();
-    const CellBinning & phiBinning=hvManager->getDescriptor()->getPhiBinning();
+    const CellBinning & etaBinning=hvManager.getDescriptor().getEtaBinning();
+    const CellBinning & phiBinning=hvManager.getDescriptor().getPhiBinning();
     unsigned int iEta = int((eta - etaBinning.getStart())/etaBinning.getDelta()) + etaBinning.getFirstDivisionNumber();
     unsigned int iPhi = int((phi - phiBinning.getStart())/phiBinning.getDelta()) + phiBinning.getFirstDivisionNumber();
     unsigned int iSector = int(2.0*(phi - phiBinning.binLower(iPhi))/phiBinning.getDelta());
@@ -90,17 +90,17 @@ void EMBCell::initHV() const {
     
     if (iEta==8) iEta=7;
     
-    EMBHVModuleConstLink hvMod = hvManager->getHVModule(iSide,iEta,iPhi,iSector);
+    const EMBHVModule& hvMod = hvManager.getHVModule(iSide,iEta,iPhi,iSector);
     double dPhi = fabs((phiUpper-phiLower));
     double phi0 = (iSide==1) ? M_PI/1024 : -(M_PI)/1024;      // delta phi between first absorber and electrode at phi=0
-    double sPhi = phiLower-hvMod->getPhiMin() + phi0;    
+    double sPhi = phiLower-hvMod.getPhiMin() + phi0;    
     unsigned int iOffset=int(sPhi*(M_1_PI/2*1024.)+0.5);
     unsigned int N      =int(dPhi*(M_1_PI/2*1024.)+0.5);
     //  std::cout << " EMBCell   eta,phi1,phi2 cell, phiMinModule " << eta << " " << phiLower << " " << phiUpper << " " << hvMod->getPhiMin() << std::endl;
     
     for (unsigned int iElectrode=iOffset;iElectrode<iOffset+N;iElectrode++) {
-      EMBHVElectrodeConstLink hvElec = hvMod->getElectrode(iElectrode);
-      m_electrode.push_back(hvElec);
+      const EMBHVElectrode& hvElec = hvMod.getElectrode(iElectrode);
+      m_electrode.push_back(&hvElec);
     }
     
   }
diff --git a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBDetectorManager.cxx b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBDetectorManager.cxx
index 0004f3f289d80931aa571c6caad2bb3cb75efb2f..823af672498966e36f365a426445872808c0be81 100755
--- a/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBDetectorManager.cxx
+++ b/LArCalorimeter/LArGeoModel/LArReadoutGeometry/src/EMBDetectorManager.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "GaudiKernel/MsgStream.h"
@@ -28,7 +28,8 @@ public:
 
 };
 
-EMBDetectorManager::EMBDetectorManager()
+EMBDetectorManager::EMBDetectorManager(const EMBHVManager& hvManager)
+  : m_hvManager(hvManager)
 {
   setName("LArEMB");
 
@@ -44,7 +45,6 @@ EMBDetectorManager::EMBDetectorManager()
 
   m_basicReadoutNumbers = new EMBBasicReadoutNumbers();
   m_accordionDetails    = NULL;
-  m_hvManager           = NULL;
   m_presamplerHVManager = NULL;
 }
 
@@ -107,16 +107,8 @@ void EMBDetectorManager::addTreeTop (PVLink treeTop)
   treeTop->ref();
 }
 
-const EMBHVManager * EMBDetectorManager::getHVManager () const
+const EMBHVManager& EMBDetectorManager::getHVManager () const
 {
-
-  if (!m_hvManager) {
-    StoreGateSvc *detStore = StoreGate::pointer("DetectorStore");
-    const LArHVManager *manager = NULL;
-    if (detStore->retrieve(manager)==StatusCode::SUCCESS) {
-      m_hvManager=manager->getEMBHVManager();
-    }
-  } 
   return m_hvManager;
 }
 
diff --git a/LArCalorimeter/LArRecUtils/src/LArHVCondAlg.cxx b/LArCalorimeter/LArRecUtils/src/LArHVCondAlg.cxx
index 5c45c9d1954356224cdc7c28c18190748fa96e81..065c82006c8199141f481dfff0be948a801e0070 100755
--- a/LArCalorimeter/LArRecUtils/src/LArHVCondAlg.cxx
+++ b/LArCalorimeter/LArRecUtils/src/LArHVCondAlg.cxx
@@ -19,7 +19,6 @@
 #include "LArHV/EMBHVManager.h"
 #include "LArHV/EMECHVModule.h"
 #include "LArHV/EMECHVModuleConstLink.h"
-#include "LArHV/EMBHVElectrodeConstLink.h"
 #include "LArHV/EMBHVElectrode.h"
 #include "LArHV/EMBPresamplerHVManager.h"
 #include "LArHV/EMBPresamplerHVModuleConstLink.h"
@@ -391,14 +390,14 @@ StatusCode LArHVCondAlg::fillPayload(LArHVData* hvdata, const LArHVData* hvdataO
          double wt = 1./ngap;
          v.clear(); ihv.clear();
          for (unsigned int i=0;i<nelec;i++) {
-             const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
+             const EMBHVElectrode& electrode = cell->getElectrode(i);
              //std::cout << "electrode: endcap index, eta index , phi index, sector index , electrode index " << electrode->getModule()->getSideIndex() <<
              //   " " << electrode->getModule()->getEtaIndex() << " " << electrode->getModule()->getPhiIndex() << 
              //   " " << electrode->getModule()->getSectorIndex() << " " << electrode->getElectrodeIndex() << std::endl;
              for (unsigned int igap=0;igap<2;igap++) {
-                 const std::vector<unsigned int>::const_iterator itrLine=std::find(hvlineidx.begin(), hvlineidx.end(), electrode->hvLineNo(igap));
+                 const std::vector<unsigned int>::const_iterator itrLine=std::find(hvlineidx.begin(), hvlineidx.end(), electrode.hvLineNo(igap));
                  if(itrLine == hvlineidx.end()) { // error, could not find HVline index
-                    ATH_MSG_ERROR("Do not have hvline: "<<electrode->hvLineNo(igap)<<" in LArHVData mapping !!!");
+                    ATH_MSG_ERROR("Do not have hvline: "<<electrode.hvLineNo(igap)<<" in LArHVData mapping !!!");
                     return StatusCode::FAILURE;
                  }
                  unsigned idx = itrLine - hvlineidx.begin(); 
@@ -788,16 +787,16 @@ StatusCode LArHVCondAlg::searchNonNominalHV_EMB(CaloAffectedRegionInfoVec *vAffe
     
     // accordion calorimeter
     float HVnominal = HV_nominal("EMB",0.);
-    const EMBHVManager* hvManager_EMB=manager->getEMBHVManager();
+    const EMBHVManager& hvManager_EMB=manager->getEMBHVManager();
     
-    for (unsigned int iSide=hvManager_EMB->beginSideIndex();iSide<hvManager_EMB->endSideIndex();iSide++) { // loop over HV modules
-      for (unsigned int iPhi=hvManager_EMB->beginPhiIndex();iPhi<hvManager_EMB->endPhiIndex();iPhi++) {
-	for (unsigned int iSector=hvManager_EMB->beginSectorIndex();iSector<hvManager_EMB->endSectorIndex();iSector++) {
-	  for (unsigned int iEta=hvManager_EMB->beginEtaIndex();iEta<hvManager_EMB->endEtaIndex();iEta++) { //0 to 7
-	    EMBHVModuleConstLink hvMod = hvManager_EMB->getHVModule(iSide,iEta,iPhi,iSector);
+    for (unsigned int iSide=hvManager_EMB.beginSideIndex();iSide<hvManager_EMB.endSideIndex();iSide++) { // loop over HV modules
+      for (unsigned int iPhi=hvManager_EMB.beginPhiIndex();iPhi<hvManager_EMB.endPhiIndex();iPhi++) {
+	for (unsigned int iSector=hvManager_EMB.beginSectorIndex();iSector<hvManager_EMB.endSectorIndex();iSector++) {
+	  for (unsigned int iEta=hvManager_EMB.beginEtaIndex();iEta<hvManager_EMB.endEtaIndex();iEta++) { //0 to 7
+	    const EMBHVModule& hvMod = hvManager_EMB.getHVModule(iSide,iEta,iPhi,iSector);
 
-            float eta_min=hvMod->getEtaMin();
-            float eta_max=hvMod->getEtaMax();
+            float eta_min=hvMod.getEtaMin();
+            float eta_max=hvMod.getEtaMax();
 
             ATH_MSG_DEBUG("iSide,iPhi,iSector,iEta " << iSide << " " << iPhi << " " << iSector << " " << iEta);
 	    float phi_min=+30.,phi_max=-30.;
@@ -805,20 +804,20 @@ StatusCode LArHVCondAlg::searchNonNominalHV_EMB(CaloAffectedRegionInfoVec *vAffe
 	    bool are_previous_HV_affected=false;
             bool are_previous_HV_dead=false;
 	    for (unsigned int ielec=0;ielec<32;ielec++) { //use hvMod->getNumElectrodes when bug is corrected
-	      EMBHVElectrodeConstLink electrode = hvMod->getElectrode(ielec);
+	      const EMBHVElectrode& electrode = hvMod.getElectrode(ielec);
 
 	      double hv[2];
 	      for (unsigned int iGap=0;iGap<2;iGap++) { // EMB : 2, TRY TO FIND AUTOMATICALLY NB OF GAPS
-                const std::vector<unsigned int>::const_iterator itrLine=std::find(hvlineidx.begin(), hvlineidx.end(), electrode->hvLineNo(iGap));
+                const std::vector<unsigned int>::const_iterator itrLine=std::find(hvlineidx.begin(), hvlineidx.end(), electrode.hvLineNo(iGap));
                 if(itrLine == hvlineidx.end()) { // error, could not find HVline index
-                  ATH_MSG_ERROR("Do not have hvline: "<<electrode->hvLineNo(iGap)<<" in LArHVData !!!");
+                  ATH_MSG_ERROR("Do not have hvline: "<<electrode.hvLineNo(iGap)<<" in LArHVData !!!");
                   return StatusCode::FAILURE;
                 }
                 //unsigned idx = itrLine - hvlineidx.begin(); 
 		hv[iGap]=voltage[itrLine - hvlineidx.begin()];
 	      } //end for iGap
 
-              ATH_MSG_DEBUG(" electrode HV " << ielec << " " << electrode->getPhi() << " "<< hv[0] << " " << hv[1] );
+              ATH_MSG_DEBUG(" electrode HV " << ielec << " " << electrode.getPhi() << " "<< hv[0] << " " << hv[1] );
 
 	      //take decisions according to all the gaps HV :
               bool isDead=false;
@@ -845,26 +844,26 @@ StatusCode LArHVCondAlg::searchNonNominalHV_EMB(CaloAffectedRegionInfoVec *vAffe
 
               if (isDead) {
                  if (!are_previous_HV_dead) {
-                  phi_min=CaloPhiRange::fix(electrode->getPhi()-1e-4);
-                  phi_max=CaloPhiRange::fix(electrode->getPhi()+1e-4);
+                  phi_min=CaloPhiRange::fix(electrode.getPhi()-1e-4);
+                  phi_max=CaloPhiRange::fix(electrode.getPhi()+1e-4);
                   ATH_MSG_DEBUG(" -- start dead region " << eta_min << " " << eta_max << " " << phi_min << " " <<phi_max);
                   are_previous_HV_dead = true;
                  }
                  else {
-                  extendPhiRegion(electrode->getPhi(),phi_min,phi_max);
+                  extendPhiRegion(electrode.getPhi(),phi_min,phi_max);
                   ATH_MSG_DEBUG(" extend dead region " << phi_min << " " << phi_max);
                  }
               }
 
               if (isAffected) {
                  if (!are_previous_HV_affected) {
-                  phi_min=CaloPhiRange::fix(electrode->getPhi()-1e-4);
-                  phi_max=CaloPhiRange::fix(electrode->getPhi()+1e-4);
+                  phi_min=CaloPhiRange::fix(electrode.getPhi()-1e-4);
+                  phi_max=CaloPhiRange::fix(electrode.getPhi()+1e-4);
                   ATH_MSG_DEBUG(" -- start affected region " << eta_min << " " << eta_max << " " << phi_min << " " <<phi_max);
                   are_previous_HV_affected = true;
                  }
                  else {
-                  extendPhiRegion(electrode->getPhi(),phi_min,phi_max);
+                  extendPhiRegion(electrode.getPhi(),phi_min,phi_max);
                   ATH_MSG_DEBUG(" extend affected region " << phi_min << " " << phi_max);
                  }
               }
diff --git a/LArCalorimeter/LArRecUtils/src/LArHVPathologyDbCondAlg.cxx b/LArCalorimeter/LArRecUtils/src/LArHVPathologyDbCondAlg.cxx
index d3eb7dedd5f033cfceef1f1899eece0d93c39e03..7368e7d484484c579c706c55dcdd30c29a6ee567 100755
--- a/LArCalorimeter/LArRecUtils/src/LArHVPathologyDbCondAlg.cxx
+++ b/LArCalorimeter/LArRecUtils/src/LArHVPathologyDbCondAlg.cxx
@@ -186,9 +186,9 @@ void LArHVPathologyDbCondAlg::fillElectMap(LArHVPathology* hvpath) const {
            list.clear();
            HVline = m_hvlineHelper->hv_line(hwid);
            for (unsigned int i=0;i<nelec;i++) {
-             const EMBHVElectrodeConstLink electrode = cell->getElectrode(i);
+             const EMBHVElectrode& electrode = cell->getElectrode(i);
              for (unsigned int igap=0;igap<2;igap++) {
-               if ((unsigned)electrode->hvLineNo(igap)==HVline) {
+               if ((unsigned)electrode.hvLineNo(igap)==HVline) {
                   list.push_back(2*i+igap);
                }
              } 
diff --git a/graphics/VP1/VP1Systems/VP1CaloReadoutSystems/src/VP1CaloReadoutSystem.cxx b/graphics/VP1/VP1Systems/VP1CaloReadoutSystems/src/VP1CaloReadoutSystem.cxx
index f9010d5760f6a7c449b2a3dd2a03be1da40071c7..0fca96226444c303fb808e72fab79bb9b101049e 100755
--- a/graphics/VP1/VP1Systems/VP1CaloReadoutSystems/src/VP1CaloReadoutSystem.cxx
+++ b/graphics/VP1/VP1Systems/VP1CaloReadoutSystems/src/VP1CaloReadoutSystem.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "VP1CaloReadoutSystems/VP1CaloReadoutSystem.h"
@@ -187,7 +187,7 @@ public:
   std::map < SoNode *, EMECCellConstLink>  EMECMap;
   std::map < SoNode *, EMBCellConstLink>   EMBMap;
 
-  std::map < SoNode *, EMBHVElectrodeConstLink>  EMBHVMap;
+  std::map < SoNode *, const EMBHVElectrode*>  EMBHVMap;
   std::map < SoNode *, EMECHVElectrodeConstLink> EMECHVMap;
   std::map < SoNode *, FCALHVLineConstLink>      FCALHVMap;
   std::map < SoNode *, HECHVSubgapConstLink>     HECHVMap;
@@ -773,12 +773,12 @@ void VP1CaloReadoutSystem::createHV() {
   }
 
 
-  const EMBHVManager *  embHVManager  = larHVManager->getEMBHVManager();
-  for (unsigned int e=embHVManager->beginSideIndex();e!=embHVManager->endSideIndex();e++) {
-    for (unsigned int s=embHVManager->beginSectorIndex();s!=embHVManager->endSectorIndex();s++) {
-      for (unsigned int y=embHVManager->beginEtaIndex();y!=embHVManager->endEtaIndex();y++) {
-	for (unsigned int p=embHVManager->beginPhiIndex();p!=embHVManager->endPhiIndex();p++) {
-	  EMBHVModuleConstLink embMod=embHVManager->getHVModule(e,y,p,s);
+  const EMBHVManager&  embHVManager  = larHVManager->getEMBHVManager();
+  for (unsigned int e=embHVManager.beginSideIndex();e!=embHVManager.endSideIndex();e++) {
+    for (unsigned int s=embHVManager.beginSectorIndex();s!=embHVManager.endSectorIndex();s++) {
+      for (unsigned int y=embHVManager.beginEtaIndex();y!=embHVManager.endEtaIndex();y++) {
+	for (unsigned int p=embHVManager.beginPhiIndex();p!=embHVManager.endPhiIndex();p++) {
+	  const EMBHVModule& embMod=embHVManager.getHVModule(e,y,p,s);
 
 	  double r=1970; // Radius to draw stuff at for barrel HV.
 
@@ -786,10 +786,10 @@ void VP1CaloReadoutSystem::createHV() {
 
 	  {
 	    int cc=0;
-	    double etaMin=embMod->getEtaMin();
-	    double etaMax=embMod->getEtaMax();
-	    double phiMin=embMod->getPhiMin();
-	    double phiMax=embMod->getPhiMax();
+	    double etaMin=embMod.getEtaMin();
+	    double etaMax=embMod.getEtaMax();
+	    double phiMin=embMod.getPhiMin();
+	    double phiMax=embMod.getPhiMax();
 	    SoVertexProperty *vtxProperty = new SoVertexProperty();
 	    vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(phiMin),r*sin(phiMin)  ,r*sinh(etaMin)));
 	    vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(phiMax),r*sin(phiMax)  ,r*sinh(etaMin)));
@@ -804,19 +804,19 @@ void VP1CaloReadoutSystem::createHV() {
 	  }
 
 
-	  for (unsigned int i=0;i<embMod->getNumElectrodes();i++) {
-	    EMBHVElectrodeConstLink electrode = embMod->getElectrode(i);
+	  for (unsigned int i=0;i<embMod.getNumElectrodes();i++) {
+	    const EMBHVElectrode& electrode = embMod.getElectrode(i);
 
-	    double voltage0 = electrode->voltage(0);
-	    double voltage1 = electrode->voltage(1);
+	    double voltage0 = electrode.voltage(0);
+	    double voltage1 = electrode.voltage(1);
 	    double nominalVoltage = m_clockwork->ui.embNominalSpinBox->value();
 	    bool outOfTolerance = (fabs(voltage0-nominalVoltage) > double (tolerance))  || (fabs(voltage1-nominalVoltage) > double (tolerance))  ;
 	    bool missing        = voltage0 == -99999 || voltage1 == -99999;
 	    {
 	      int cc=0;
 	      SoVertexProperty *vtxProperty = new SoVertexProperty();
-	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(electrode->getPhi()),r*sin(electrode->getPhi())  ,r*sinh(electrode->getModule()->getEtaMin())));
-	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(electrode->getPhi()),r*sin(electrode->getPhi())  ,r*sinh(electrode->getModule()->getEtaMax())));
+	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(electrode.getPhi()),r*sin(electrode.getPhi())  ,r*sinh(electrode.getModule().getEtaMin())));
+	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(electrode.getPhi()),r*sin(electrode.getPhi())  ,r*sinh(electrode.getModule().getEtaMax())));
 
 	      SoLineSet *ls = new SoLineSet();
 	      ls->numVertices=2;
@@ -831,7 +831,7 @@ void VP1CaloReadoutSystem::createHV() {
 	      else {
 		m_clockwork->embNormalSep->addChild(ls);
 	      }
-	      m_clockwork->EMBHVMap[ls]=electrode;
+	      m_clockwork->EMBHVMap[ls]=&electrode;
 	    }
 	  }
 	}
@@ -1681,12 +1681,12 @@ void VP1CaloReadoutSystem::userPickedNode(SoNode* mySelectedNode, SoPath */*pick
 
   // EMB HV
   {
-    std::map < SoNode *, EMBHVElectrodeConstLink>::const_iterator p = m_clockwork->EMBHVMap.find(mySelectedNode);
+    std::map < SoNode *, const EMBHVElectrode*>::const_iterator p = m_clockwork->EMBHVMap.find(mySelectedNode);
     if (p!=m_clockwork->EMBHVMap.end()) {
 
-      EMBHVElectrodeConstLink electrode  = (*p).second;
+      const EMBHVElectrode* electrode  = (*p).second;
       std::ostringstream outstream;
-      outstream << "Side: " << electrode->getModule()->getSideIndex() <<" Eta: " << electrode->getModule()->getEtaIndex() << " Phi: " << electrode->getModule()->getPhiIndex() << " Sector: " << electrode->getModule()->getSectorIndex() << " Electrode " << electrode->getElectrodeIndex() << " Voltages: " << electrode->voltage(0) << "/" << electrode->voltage(1) << "; currents: " << electrode->current(0) << "/" << electrode->current(1);
+      outstream << "Side: " << electrode->getModule().getSideIndex() <<" Eta: " << electrode->getModule().getEtaIndex() << " Phi: " << electrode->getModule().getPhiIndex() << " Sector: " << electrode->getModule().getSectorIndex() << " Electrode " << electrode->getElectrodeIndex() << " Voltages: " << electrode->voltage(0) << "/" << electrode->voltage(1) << "; currents: " << electrode->current(0) << "/" << electrode->current(1);
       message (outstream.str().c_str());
     }
   }
@@ -2180,16 +2180,16 @@ void VP1CaloReadoutSystem::userPickedNode(SoNode* mySelectedNode, SoPath */*pick
 	  std::ostringstream highVoltageStream;
 	  highVoltageStream << "There are " << element->getNumElectrodes() << " electrodes. Status: " << '\n';
 	  message(highVoltageStream.str().c_str());
-	  std::set<EMBHVModuleConstLink> modSet;
+	  std::set<const EMBHVModule*> modSet;
 	  for (unsigned int i=0;i<element->getNumElectrodes();i++) {
-	    highVoltageStream << i << "Status: "   << element->getElectrode(i)->getElectrodeIndex() << ' ' << element->getElectrode(i)->hvOn(0) << ' ' << element->getElectrode(i)->hvOn(1) <<  '\n';
-	    highVoltageStream << i << "Current: "  << element->getElectrode(i)->getElectrodeIndex() << ' ' << element->getElectrode(i)->current(0) << ' ' << element->getElectrode(i)->current(1) <<  '\n';
-	    highVoltageStream << i << "Voltage: "  << element->getElectrode(i)->getElectrodeIndex() << ' ' << element->getElectrode(i)->voltage(0) << ' ' << element->getElectrode(i)->voltage(1) <<  '\n';
+	    highVoltageStream << i << "Status: "   << element->getElectrode(i).getElectrodeIndex() << ' ' << element->getElectrode(i).hvOn(0) << ' ' << element->getElectrode(i).hvOn(1) <<  '\n';
+	    highVoltageStream << i << "Current: "  << element->getElectrode(i).getElectrodeIndex() << ' ' << element->getElectrode(i).current(0) << ' ' << element->getElectrode(i).current(1) <<  '\n';
+	    highVoltageStream << i << "Voltage: "  << element->getElectrode(i).getElectrodeIndex() << ' ' << element->getElectrode(i).voltage(0) << ' ' << element->getElectrode(i).voltage(1) <<  '\n';
 	    message(highVoltageStream.str().c_str());
 	    //
 	    // Now let's show the module, and where she is:
 	    //
-	    EMBHVModuleConstLink module = element->getElectrode(i)->getModule();
+	    const EMBHVModule& module = element->getElectrode(i).getModule();
 	    
 	    if (!m_clockwork->ui.highVoltageCheckBox->isChecked()) continue;
 	    
@@ -2212,16 +2212,16 @@ void VP1CaloReadoutSystem::userPickedNode(SoNode* mySelectedNode, SoPath */*pick
 	    
 	    
 	    double r      = element->getRLocal(pos);
-	    double phiMin = module->getPhiMin();
-	    double phiMax = module->getPhiMax();
-	    double etaMin = module->getEtaMin();
-	    double etaMax = module->getEtaMax();
+	    double phiMin = module.getPhiMin();
+	    double phiMax = module.getPhiMax();
+	    double etaMin = module.getEtaMin();
+	    double etaMax = module.getEtaMax();
 	    sep->addChild(white);
 	    sep->addChild(drawStyle);
 	    sep->addChild(lm);
 	    
-	    if (modSet.find(module)==modSet.end()) {
-	      modSet.insert(module);
+	    if (modSet.find(&module)==modSet.end()) {
+	      modSet.insert(&module);
 	      
 	      
 	      
@@ -2242,8 +2242,8 @@ void VP1CaloReadoutSystem::userPickedNode(SoNode* mySelectedNode, SoPath */*pick
 	    {
 	      int cc=0;
 	      SoVertexProperty *vtxProperty = new SoVertexProperty();
-	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(element->getElectrode(i)->getPhi()),r*sin(element->getElectrode(i)->getPhi())  ,r*sinh(etaMin)));
-	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(element->getElectrode(i)->getPhi()),r*sin(element->getElectrode(i)->getPhi())  ,r*sinh(etaMax)));
+	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(element->getElectrode(i).getPhi()),r*sin(element->getElectrode(i).getPhi())  ,r*sinh(etaMin)));
+	      vtxProperty->vertex.set1Value(cc++,  SbVec3f(r*cos(element->getElectrode(i).getPhi()),r*sin(element->getElectrode(i).getPhi())  ,r*sinh(etaMax)));
 	      
 	      SoLineSet *ls = new SoLineSet();
 	      ls->numVertices=2;