diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt b/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt
index b93a3aaa75019078ec894d6c41798ebb94dbc0c1..e20905e1ac95427c476e58cccdfbab44aeb679cf 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt
@@ -11,6 +11,7 @@ atlas_depends_on_subdirs( PRIVATE
                           Calorimeter/CaloTriggerTool
                           Control/AthenaBaseComps
                           Control/StoreGate
+                          Control/CxxUtils
                           DetectorDescription/Identifier
                           GaudiKernel
                           Trigger/TrigT1/TrigT1CaloToolInterfaces )
@@ -19,5 +20,5 @@ atlas_depends_on_subdirs( PRIVATE
 atlas_add_component( TrigT1CaloMappingTools
                      src/*.cxx
                      src/components/*.cxx
-                     LINK_LIBRARIES CaloIdentifier CaloTriggerToolLib AthenaBaseComps StoreGateLib SGtests Identifier GaudiKernel )
+                     LINK_LIBRARIES CxxUtils CaloIdentifier CaloTriggerToolLib AthenaBaseComps StoreGateLib SGtests Identifier GaudiKernel )
 
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx
index 38eefc95c06d6592d3249f8d56a01ad189c6736d..0a58ccc4e1a8d343d5f06ec9c446331d605f2d0e 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx
@@ -23,18 +23,6 @@ const int    CpmMappingTool::s_etaBinsPerRow;
 const double CpmMappingTool::s_etaGran = 0.1;
 const double CpmMappingTool::s_phiGran = M_PI/32.;
 
-CpmMappingTool::CpmMappingTool(const std::string& type,
-                               const std::string& name,
-			       const IInterface*  parent)
-			     : AthAlgTool(type, name, parent)
-{
-  declareInterface<IL1CaloMappingTool>(this);
-}
-
-CpmMappingTool::~CpmMappingTool()
-{
-}
-
 // Initialise the mappings
 
 #ifndef PACKAGE_VERSION
@@ -58,7 +46,7 @@ StatusCode CpmMappingTool::finalize()
 // Return eta, phi and layer mapping for given crate/module/channel
 
 bool CpmMappingTool::mapping(const int crate, const int module,
-               const int channel, double& eta, double& phi, int& layer)
+               const int channel, double& eta, double& phi, int& layer) const
 {
   if (crate < 0 || crate >= s_crates || module < 1 || module > s_modules ||
       channel < 0 || channel >= s_channels) return false;
@@ -99,7 +87,7 @@ bool CpmMappingTool::mapping(const int crate, const int module,
 // Return crate, module and channel mapping for given eta/phi/layer
 
 bool CpmMappingTool::mapping(const double /*eta*/, const double /*phi*/,
-                    const int /*layer*/, int& crate, int& module, int& channel)
+                    const int /*layer*/, int& crate, int& module, int& channel) const
 {
   // Not implemented
   crate   = 0;
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h
index d6fc878ffc59567dc80a66ff8979f155a6fe61f9..d300818a102c743960134dc0221f1c8715423007 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h
@@ -29,24 +29,21 @@ namespace LVL1 {
  *  @author Peter Faulkner
  */
 
-class CpmMappingTool : virtual public IL1CaloMappingTool,
-                               public AthAlgTool {
-
+class CpmMappingTool : public extends<AthAlgTool, IL1CaloMappingTool>
+{
  public:
+  
+   using base_class::base_class;
 
-   CpmMappingTool(const std::string& type, const std::string& name,
-                                           const IInterface* parent);
-   virtual ~CpmMappingTool();
-
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
+   virtual StatusCode finalize() override;
 
    /// Return eta, phi and layer mapping for given crate/module/channel
    virtual bool mapping(int crate, int module, int channel,
-                        double& eta, double& phi, int& layer);
+                        double& eta, double& phi, int& layer) const override;
    /// Return crate, module and channel mapping for given eta/phi/layer
    virtual bool mapping(double eta, double phi, int layer,
-                        int& crate, int& module, int& channel);
+                        int& crate, int& module, int& channel) const override;
 
  private:
 
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx
index 307270f96bd48351e6d61737a55110e6a37259d6..02cf7ebe08eed7f5632a03b0c70088a6b2c656e4 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx
@@ -27,18 +27,6 @@ const double JemMappingTool::s_etaGran = 0.2;
 const double JemMappingTool::s_phiGran = M_PI/16.;
 
 
-JemMappingTool::JemMappingTool(const std::string& type,
-                               const std::string& name,
-			       const IInterface*  parent)
-			     : AthAlgTool(type, name, parent)
-{
-  declareInterface<IL1CaloMappingTool>(this);
-}
-
-JemMappingTool::~JemMappingTool()
-{
-}
-
 // Initialise the mappings
 
 #ifndef PACKAGE_VERSION
@@ -84,7 +72,7 @@ StatusCode JemMappingTool::finalize()
 // Return eta, phi and layer mapping for given crate/module/channel
 
 bool JemMappingTool::mapping(const int crate, const int module,
-               const int channel, double& eta, double& phi, int& layer)
+               const int channel, double& eta, double& phi, int& layer) const
 {
   if (crate < 0 || crate >= s_crates || module < 0 || module >= s_modules ||
       channel < 0 || channel >= s_channels) return false;
@@ -132,7 +120,7 @@ bool JemMappingTool::mapping(const int crate, const int module,
 // Return crate, module and channel mapping for given eta/phi/layer
 
 bool JemMappingTool::mapping(const double /*eta*/, const double /*phi*/,
-                    const int /*layer*/, int& crate, int& module, int& channel)
+                    const int /*layer*/, int& crate, int& module, int& channel) const
 {
   // Not implemented
   crate   = 0;
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h
index b6466a239c1e1b4d32eb0f481c86c5fd09ab8ea1..5641ab7fe20e35b61ad2cf77913826903310a89d 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h
@@ -31,24 +31,22 @@ namespace LVL1 {
  *  @author Peter Faulkner
  */
 
-class JemMappingTool : virtual public IL1CaloMappingTool,
-                               public AthAlgTool {
+class JemMappingTool : public extends<AthAlgTool, IL1CaloMappingTool>
+{
 
  public:
 
-   JemMappingTool(const std::string& type, const std::string& name,
-                                           const IInterface* parent);
-   virtual ~JemMappingTool();
+   using base_class::base_class;
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
+   virtual StatusCode finalize() override;
 
    /// Return eta, phi and layer mapping for given crate/module/channel
    virtual bool mapping(int crate, int module, int channel,
-                        double& eta, double& phi, int& layer);
+                        double& eta, double& phi, int& layer) const override;
    /// Return crate, module and channel mapping for given eta/phi/layer
    virtual bool mapping(double eta, double phi, int layer,
-                        int& crate, int& module, int& channel);
+                        int& crate, int& module, int& channel) const override;
 
  private:
 
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx
index 182b296046d96eb6b59d0f94c34510c3723e941c..a81b48b24b709d8de415327b5f204115100d9f01 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx
@@ -13,7 +13,6 @@
 #include "CaloIdentifier/CaloID_Exception.h"
 #include "CaloIdentifier/CaloLVL1_ID.h"
 #include "CaloIdentifier/TTOnlineID.h"
-#include "CaloTriggerTool/CaloTriggerTowerService.h"
 #include "Identifier/Identifier.h"
 #include "Identifier/HWIdentifier.h"
 
@@ -24,22 +23,6 @@ namespace LVL1 {
 const int PpmCoolMappingTool::s_maxTableEntries;
 
 
-PpmCoolMappingTool::PpmCoolMappingTool(const std::string& type,
-            const std::string& name, const IInterface*  parent)
-          : AthAlgTool(type, name, parent),
-            m_ttSvc("CaloTriggerTowerService"),
-            m_lvl1Helper(0), m_l1ttonlineHelper(0)
-{
-  declareInterface<IL1CaloMappingTool>(this);
-
-  declareProperty("CaloTriggerTowerService", m_ttSvc);
-
-}
-
-PpmCoolMappingTool::~PpmCoolMappingTool()
-{
-}
-
 // Initialise the mappings
 
 #ifndef PACKAGE_VERSION
@@ -108,12 +91,55 @@ StatusCode PpmCoolMappingTool::finalize()
 
 void PpmCoolMappingTool::handle(const Incident& inc)
 {
+  // FIXME: not thread safe --- won't work if there's more than one run
+  // in the input.
   if (inc.type()=="BeginRun") {
     if (msgLvl(MSG::DEBUG)) {
       msg(MSG::DEBUG) << "Resetting mapping table at start of run" << endmsg;
     }
 
-    m_idTable.clear();
+    bool verbose = msgLvl(MSG::VERBOSE);
+    m_idTable.resize (s_maxTableEntries);
+    for (int index = 0; index < s_maxTableEntries; ++index) {
+      const int channel = index & 0x3f;
+      const int module = (index >> 6) & 0x0f;
+      const int crate = index >> 10;
+      const int slot = module + 5;
+      const int pin  = channel % 16;
+      const int asic = channel / 16;
+
+      Identifier ttId(0);
+      Identifier invalidId(0);
+      try {
+        if (verbose) {
+          msg(MSG::VERBOSE) << "crate/module/channel " << crate << "/"
+                            << module << "/" << channel
+                            << "  maps to crate/slot/pin/asic " << crate << "/"
+                            << slot << "/" << pin << "/" << asic << endmsg;
+        }
+        const HWIdentifier id = m_l1ttonlineHelper->channelId(crate, slot, pin,
+                                                              asic);
+        if (verbose) {
+          msg(MSG::VERBOSE) << "hardware_id: " << id << endmsg;
+        }
+        ttId = m_ttSvc->cnvToIdentifier(id, true);
+        if (verbose) {
+          msg(MSG::VERBOSE) << "tower_id: " << ttId << endmsg;
+        }
+      }
+      catch (const CaloID_Exception&) { ttId = invalidId; }
+      if (ttId == invalidId) {
+        m_idTable[index] = 0;
+      }
+      else {
+        const int side   = (m_lvl1Helper->pos_neg_z(ttId) == 1) ? 1 : 2;
+        const int sample = m_lvl1Helper->sampling(ttId);
+        const int region = m_lvl1Helper->region(ttId);
+        const int ieta   = m_lvl1Helper->eta(ttId);
+        const int iphi   = m_lvl1Helper->phi(ttId);
+        m_idTable[index] = (side<<14)+(sample<<13)+(region<<11)+(ieta<<6)+iphi;
+      }
+    }
   }
   return;
 } 
@@ -121,7 +147,7 @@ void PpmCoolMappingTool::handle(const Incident& inc)
 // Return eta, phi and layer mapping for given crate/module/channel
 
 bool PpmCoolMappingTool::mapping(const int crate, const int module,
-         const int channel, double& eta, double& phi, int& layer)
+         const int channel, double& eta, double& phi, int& layer) const
 {
   if (crate < 0 || crate >= 8 || module < 0 || module >= 16 ||
       channel < 0 || channel >= 64) return false;
@@ -131,43 +157,8 @@ bool PpmCoolMappingTool::mapping(const int crate, const int module,
   
   bool verbose = msgLvl(MSG::VERBOSE);
 
-  if (m_idTable.empty()) {
-    m_idTable.reserve(s_maxTableEntries);
-    m_idTable.assign(s_maxTableEntries, 0);
-  }
-  if (m_idTable[index] == 0) {
-    const int slot = module + 5;
-    const int pin  = channel % 16;
-    const int asic = channel / 16;
-
-    Identifier ttId(0);
-    Identifier invalidId(0);
-    try {
-      if (verbose) {
-        msg(MSG::VERBOSE) << "crate/module/channel " << crate << "/"
-                          << module << "/" << channel
-  			  << "  maps to crate/slot/pin/asic " << crate << "/"
-			  << slot << "/" << pin << "/" << asic << endmsg;
-      }
-      const HWIdentifier id = m_l1ttonlineHelper->channelId(crate, slot, pin,
-                                                                        asic);
-      if (verbose) {
-        msg(MSG::VERBOSE) << "hardware_id: " << id << endmsg;
-      }
-      ttId = m_ttSvc->cnvToIdentifier(id, true);
-      if (verbose) {
-        msg(MSG::VERBOSE) << "tower_id: " << ttId << endmsg;
-      }
-    }
-    catch (const CaloID_Exception&) { ttId = invalidId; }
-    if (ttId == invalidId) return false;
-
-    const int side   = (m_lvl1Helper->pos_neg_z(ttId) == 1) ? 1 : 2;
-    const int sample = m_lvl1Helper->sampling(ttId);
-    const int region = m_lvl1Helper->region(ttId);
-    const int ieta   = m_lvl1Helper->eta(ttId);
-    const int iphi   = m_lvl1Helper->phi(ttId);
-    m_idTable[index] = (side<<14)+(sample<<13)+(region<<11)+(ieta<<6)+iphi;
+  if (index >= static_cast<int>(m_idTable.size()) || m_idTable[index] == 0) {
+    return false;
   }
   const unsigned int entry = m_idTable[index];
   const int side   = ((entry>>14) == 1) ? 1 : -1;
@@ -194,7 +185,7 @@ bool PpmCoolMappingTool::mapping(const int crate, const int module,
 // Return crate, module and channel mapping for given eta/phi/layer
 
 bool PpmCoolMappingTool::mapping(const double eta, const double phi,
-                    const int layer, int& crate, int& module, int& channel)
+                    const int layer, int& crate, int& module, int& channel) const
 {
   if (eta <= -4.9 || eta >= 4.9 || phi <= 0. || phi >= 2.*M_PI) return false;
 
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h
index 6afbbfe036d923058e6894fe7ecaf4649671b9e2..686bfbd8ceff6374fa020396da044524e1aa5d3b 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h
@@ -12,10 +12,10 @@
 #include "GaudiKernel/Incident.h"
 #include "GaudiKernel/ToolHandle.h"
 
+#include "CaloTriggerTool/CaloTriggerTowerService.h"
 #include "TrigT1CaloToolInterfaces/IL1CaloMappingTool.h"
 
 class CaloLVL1_ID;
-class CaloTriggerTowerService;
 class IInterface;
 class StatusCode;
 class TTOnlineID;
@@ -30,33 +30,30 @@ namespace LVL1 {
  *  @author Peter Faulkner
  */
 
-class PpmCoolMappingTool : virtual public IL1CaloMappingTool,
-                                   public IIncidentListener,
-                                   public AthAlgTool {
-
+class PpmCoolMappingTool : public extends<AthAlgTool, IL1CaloMappingTool, IIncidentListener>
+{
  public:
 
-   PpmCoolMappingTool(const std::string& type, const std::string& name,
-                                               const IInterface* parent);
-   virtual ~PpmCoolMappingTool();
+   using base_class::base_class;
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
-   virtual void handle(const Incident&);
+   virtual StatusCode initialize() override;
+   virtual StatusCode finalize() override;
+   virtual void handle(const Incident&) override;
 
    /// Return eta, phi and layer mapping for given crate/module/channel
    virtual bool mapping(int crate, int module, int channel,
-                        double& eta, double& phi, int& layer);
+                        double& eta, double& phi, int& layer) const override;
    /// Return crate, module and channel mapping for given eta/phi/layer
    virtual bool mapping(double eta, double phi, int layer,
-                        int& crate, int& module, int& channel);
+                        int& crate, int& module, int& channel) const override;
 
  private:
 
    // Tools and helpers
-   ToolHandle<CaloTriggerTowerService> m_ttSvc;
-   const CaloLVL1_ID*                  m_lvl1Helper;
-   const TTOnlineID*                   m_l1ttonlineHelper;
+   ToolHandle<CaloTriggerTowerService> m_ttSvc
+   { this, "CaloTriggerTowerService", "CaloTriggerTowerService" };
+   const CaloLVL1_ID*                  m_lvl1Helper = nullptr;
+   const TTOnlineID*                   m_l1ttonlineHelper = nullptr;
 
    /// Mapping lookup table
    std::vector<unsigned int> m_idTable;
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx
index 2b02417fc6a0ead68af73e41dcd2533ca3f1c0b0..58a2187b891dfe1dd7985d2c831016b782b72cc8 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx
@@ -13,24 +13,6 @@
 namespace LVL1 {
 
 
-PpmCoolOrBuiltinMappingTool::PpmCoolOrBuiltinMappingTool(const std::string& type,
-            const std::string& name, const IInterface*  parent)
-          : AthAlgTool(type, name, parent),
-            m_coolTool("LVL1::PpmCoolMappingTool/PpmCoolMappingTool"),
-            m_builtinTool("LVL1::PpmMappingTool/PpmMappingTool"),
-	    m_coolCheckDone(false)
-{
-  declareInterface<IL1CaloMappingTool>(this);
-
-  declareProperty("CoolMappingTool", m_coolTool);
-  declareProperty("BuiltinMappingTool", m_builtinTool);
-
-}
-
-PpmCoolOrBuiltinMappingTool::~PpmCoolOrBuiltinMappingTool()
-{
-}
-
 // Initialise the mappings
 
 #ifndef PACKAGE_VERSION
@@ -68,7 +50,7 @@ StatusCode PpmCoolOrBuiltinMappingTool::finalize()
 // Return eta, phi and layer mapping for given crate/module/channel
 
 bool PpmCoolOrBuiltinMappingTool::mapping(const int crate, const int module,
-         const int channel, double& eta, double& phi, int& layer)
+         const int channel, double& eta, double& phi, int& layer) const
 {
   bool rc = false;
   if (coolWorks()) {
@@ -82,7 +64,7 @@ bool PpmCoolOrBuiltinMappingTool::mapping(const int crate, const int module,
 // Return crate, module and channel mapping for given eta/phi/layer
 
 bool PpmCoolOrBuiltinMappingTool::mapping(const double eta, const double phi,
-                    const int layer, int& crate, int& module, int& channel)
+                    const int layer, int& crate, int& module, int& channel) const
 {
   bool rc = false;
   if (coolWorks()) {
@@ -95,35 +77,37 @@ bool PpmCoolOrBuiltinMappingTool::mapping(const double eta, const double phi,
 
 // Check if COOL mappings are working
 
-bool PpmCoolOrBuiltinMappingTool::coolWorks()
+bool PpmCoolOrBuiltinMappingTool::coolWorks() const
 {
-  if ( !m_coolCheckDone ) {
+  // FIXME: This should be determined during initialization!
+
+  if (!m_coolCheck.isValid()) {
     const double testEta   = 3.8375;
     const double testPhi   = M_PI/16.;
     const int    testLayer = 1;
     int crate   = 0;
     int module  = 0;
     int channel = 0;
-    m_coolCheckResult = ((m_coolTool->mapping(testEta, testPhi, testLayer,
-                          crate, module, channel)) &&
-			 !(crate == 4 && module == 8 && channel == 48));
-    if (m_coolCheckResult) {
+    bool result = ((m_coolTool->mapping(testEta, testPhi, testLayer,
+                                        crate, module, channel)) &&
+                   !(crate == 4 && module == 8 && channel == 48));
+    if (result) {
       const double tolerance = 0.01;
       double eta   = 0.;
       double phi   = 0.;
       int    layer = 0;
-      m_coolCheckResult = ((m_coolTool->mapping(crate, module, channel,
-                            eta, phi, layer)) &&
-			   (fabs(eta-testEta) < tolerance) &&
-			   (fabs(phi-testPhi) < tolerance) &&
-			   (layer == testLayer));
+      result = ((m_coolTool->mapping(crate, module, channel,
+                                     eta, phi, layer)) &&
+                (fabs(eta-testEta) < tolerance) &&
+                (fabs(phi-testPhi) < tolerance) &&
+                (layer == testLayer));
     }
-    m_coolCheckDone = true;
-    if (m_coolCheckResult) {
+    if (result) {
       msg(MSG::INFO)      << "COOL mappings selected"     << endmsg;
     } else msg(MSG::INFO) << "Built-in mappings selected" << endmsg;
+    m_coolCheck.set (result);
   }
-  return m_coolCheckResult;
+  return *m_coolCheck.ptr();
 }
 
 } // end namespace
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h
index fc8cb0ba1e27940757f1b6f0e8a50b3c5606b491..1ddbc055b02c24aedfbe8233b7346e06ff723f61 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h
@@ -11,6 +11,7 @@
 #include "GaudiKernel/ToolHandle.h"
 
 #include "TrigT1CaloToolInterfaces/IL1CaloMappingTool.h"
+#include "CxxUtils/CachedValue.h"
 
 class IInterface;
 class StatusCode;
@@ -25,40 +26,36 @@ namespace LVL1 {
  *  @author Peter Faulkner
  */
 
-class PpmCoolOrBuiltinMappingTool : virtual public IL1CaloMappingTool,
-                                            public AthAlgTool {
-
+class PpmCoolOrBuiltinMappingTool : public extends<AthAlgTool, IL1CaloMappingTool>
+{
  public:
 
-   PpmCoolOrBuiltinMappingTool(const std::string& type, const std::string& name,
-                                                        const IInterface* parent);
-   virtual ~PpmCoolOrBuiltinMappingTool();
+   using base_class::base_class;
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
+   virtual StatusCode finalize() override;
 
    /// Return eta, phi and layer mapping for given crate/module/channel
    virtual bool mapping(int crate, int module, int channel,
-                        double& eta, double& phi, int& layer);
+                        double& eta, double& phi, int& layer) const override;
    /// Return crate, module and channel mapping for given eta/phi/layer
    virtual bool mapping(double eta, double phi, int layer,
-                        int& crate, int& module, int& channel);
+                        int& crate, int& module, int& channel) const override;
 
  private:
 
    /// Check if COOL mappings are working
-   bool coolWorks();
+   bool coolWorks() const;
 
    /// COOL mapping tool
-   ToolHandle<IL1CaloMappingTool> m_coolTool;
+   ToolHandle<IL1CaloMappingTool> m_coolTool
+   { this, "CoolMappingTool", "LVL1::PpmCoolMappingTool/PpmCoolMappingTool" };
    /// Built-in mapping tool
-   ToolHandle<IL1CaloMappingTool> m_builtinTool;
+   ToolHandle<IL1CaloMappingTool> m_builtinTool
+   { this, "BuiltinMappingTool", "LVL1::PpmMappingTool/PpmMappingTool" };
 
    /// COOL mapping check done flag
-   bool m_coolCheckDone;
-   /// COOL mapping check result
-   bool m_coolCheckResult;
-
+   mutable CxxUtils::CachedValue<bool> m_coolCheck;
 };
 
 } // end namespace
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx
index e4e7f3ea82c897975511781d87802ec907afada8..3715f4b63978064030439a0863905a1bc8c09fec 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #include <cmath>
@@ -18,20 +18,6 @@ const int PpmMappingTool::s_crates;
 const int PpmMappingTool::s_modules;
 const int PpmMappingTool::s_channels;
 
-PpmMappingTool::PpmMappingTool(const std::string& type,
-                               const std::string& name,
-			       const IInterface*  parent)
-			     : AthAlgTool(type, name, parent),
-			       m_crateInfo(0), m_currentMap(0),
-			       m_etaPhiMap(0)
-{
-  declareInterface<IL1CaloMappingTool>(this);
-}
-
-PpmMappingTool::~PpmMappingTool()
-{
-}
-
 #ifndef PACKAGE_VERSION
 #define PACKAGE_VERSION "unknown"
 #endif
@@ -40,57 +26,41 @@ StatusCode PpmMappingTool::initialize()
 {
   msg(MSG::INFO) << "Initializing " << name() << " - package version "
                  << PACKAGE_VERSION << endmsg;
+  setupMap();
+  setupInverseMap();
 
   return StatusCode::SUCCESS;
 }
 
 StatusCode PpmMappingTool::finalize()
 {
-  std::vector<CoordinateMap*>::iterator pos;
-  for (pos = m_coordMaps.begin(); pos != m_coordMaps.end(); ++pos) {
-    delete *pos;
-  }
-  delete m_crateInfo;
-  delete m_etaPhiMap;
-
   return StatusCode::SUCCESS;
 }
  
 // Return eta, phi and layer mapping for given crate/module/channel
 
 bool PpmMappingTool::mapping(const int crate, const int module,
-               const int channel, double& eta, double& phi, int& layer)
+               const int channel, double& eta, double& phi, int& layer) const
 {
   if (crate < 0 || crate >= s_crates || module < 0 || module >= s_modules ||
       channel < 0 || channel >= s_channels) return false;
 
-  if (!m_currentMap || crate != m_currentCrate || module != m_currentModule) {
-
-    // Find the relevant mapping
-
-    if ( !m_crateInfo ) setupMap();
-    CrateMap::const_iterator cpos = m_crateInfo->find(crate);
-    if (cpos == m_crateInfo->end()) return false;
-    const ModuleMap& modMap(cpos->second);
-    ModuleMap::const_iterator mpos = modMap.find(module);
-    if (mpos == modMap.end()) return false;
-    const ModuleInfo modInfo(mpos->second);
-    const Offsets etaPhiOff = modInfo.first;
-    m_currentMap    = modInfo.second;
-    m_etaOffset     = etaPhiOff.first;
-    m_phiOffset     = etaPhiOff.second;
-    m_currentCrate  = crate;
-    m_currentModule = module;
-  }
+  const ModuleMap& modMap = m_crateInfo[crate];
+  const ModuleInfo& modInfo = modMap[module];
+  const double etaOffset     = modInfo.first.first;
+  const double phiOffset     = modInfo.first.second;
+  const CoordinateMap* currentMap    = modInfo.second;
+
+  if (!currentMap) return false;
 
   // Set the output
 
-  CoordinateMap::const_iterator pos = m_currentMap->find(channel);
-  if (pos == m_currentMap->end()) return false;
-  ChannelCoordinate relCoord(pos->second);
-  relCoord.setEta(relCoord.eta() + m_etaOffset);
+  ChannelCoordinate relCoord = (*currentMap)[channel];
+  if (relCoord.layer() == ChannelCoordinate::NONE) return false;
+
+  relCoord.setEta(relCoord.eta() + etaOffset);
   eta   = etaSim(relCoord);
-  phi   = relCoord.phi() + m_phiOffset;
+  phi   = relCoord.phi() + phiOffset;
   layer = (relCoord.layer() == ChannelCoordinate::EM) ? 0 : 1;
   return true;
 }
@@ -98,14 +68,13 @@ bool PpmMappingTool::mapping(const int crate, const int module,
 // Return crate, module and channel mapping for given eta/phi/layer
 
 bool PpmMappingTool::mapping(const double eta, const double phi,
-                        const int layer, int& crate, int& module, int& channel)
+                        const int layer, int& crate, int& module, int& channel) const
 {
   const unsigned int invalidChanId = s_crates*s_modules*s_channels;
 
-  if ( !m_etaPhiMap ) setupInverseMap();
   const unsigned int key = etaPhiKey(eta, phi);
-  EtaPhiMap::iterator iter = m_etaPhiMap->find(key);
-  if (iter == m_etaPhiMap->end()) {
+  EtaPhiMap::const_iterator iter = m_etaPhiMap.find(key);
+  if (iter == m_etaPhiMap.end()) {
     msg(MSG::WARNING) << "Invalid eta/phi: " << eta
                       << "/" << phi << endmsg;
     return false;
@@ -126,8 +95,6 @@ bool PpmMappingTool::mapping(const double eta, const double phi,
 
 void PpmMappingTool::setupMap()
 {
-  m_crateInfo = new CrateMap;
-
   // Input to Output channel mappings.
   // Inputs are numbered 1-16 (x4) and outputs 0-63
   // There are four output sets obtained by adding 0,4,8,12 to out
@@ -265,155 +232,155 @@ void PpmMappingTool::setupMap()
   // Construct coordinate maps for each module type
   // Four blocks of each type make up the complete map
 
-  for (int i = 0; i < 12; ++i) m_coordMaps.push_back(new CoordinateMap);
+  for (int i = 0; i < 12; ++i) m_coordMaps.push_back(std::make_unique<CoordinateMap>());
   for (int block = 0; block < 4; ++block) {
     const int incr = block * 4;
-    std::vector<CoordinateMap*>::iterator pos = m_coordMaps.begin();
+    std::vector<std::unique_ptr<CoordinateMap> >::iterator pos = m_coordMaps.begin();
 
     // Map 0 : Type 1 EM
     addCoords(4,4,0.1,M_PI/32.,0.,block*M_PI/8.,in1,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     ++pos;
 
     // Map 1 : Type 1 Had
     addCoords(4,4,0.1,M_PI/32.,0.,block*M_PI/8.,in1,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     ++pos;
 
     // Map 2 : Type 2 EM
     addCoords(4,1,0.1,M_PI/32.,0.0,block*M_PI/8.,in2a,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     addCoords(2,2,0.2,M_PI/16.,0.1,block*M_PI/8.,in2b,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     ++pos;
 
     // Map 3 : Type 2 Had
     addCoords(4,1,0.1,M_PI/32.,0.0,block*M_PI/8.,in2a,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     addCoords(2,2,0.2,M_PI/16.,0.1,block*M_PI/8.,in2b,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     ++pos;
 
     // Map 4 : Type 3 EM
     addCoords(2,2,0.2,M_PI/16.,0.0,block*M_PI/8.,in3a,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     addCoords(4,1,0.1,M_PI/32.,0.4,block*M_PI/8.,in3b,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     ++pos;
 
     // Map 5 : Type 3 Had
     addCoords(2,2,0.2,M_PI/16.,0.0,block*M_PI/8.,in3a,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     addCoords(4,1,0.1,M_PI/32.,0.4,block*M_PI/8.,in3b,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     ++pos;
 
     // Map 6 : Type 4 EM positive eta
     addCoords(4,1,0.2,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     addCoords(4,1,0.1,M_PI/16.,0.2,block*M_PI/4.,in4b,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     ++pos;
 
     // Map 7 : Type 4 Had positive eta
     addCoords(4,1,0.2,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     addCoords(4,1,0.1,M_PI/16.,0.2,block*M_PI/4.,in4b,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     ++pos;
 
     // Map 8 : Type 4 EM negative eta
     addCoords(4,1,0.1,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     addCoords(4,1,0.2,M_PI/16.,0.1,block*M_PI/4.,in4b,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     ++pos;
 
     // Map 9 : Type 4 Had negative eta
     addCoords(4,1,0.1,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     addCoords(4,1,0.2,M_PI/16.,0.1,block*M_PI/4.,in4b,out,incr,
-              ChannelCoordinate::HAD, *pos);
+              ChannelCoordinate::HAD, **pos);
     ++pos;
 
     // Map 10 : Type 5 EM FCAL
     addCoords(4,4,0.425,M_PI/8.,0.0,block*M_PI/2.,in5,out,incr,
-              ChannelCoordinate::EM, *pos);
+              ChannelCoordinate::EM, **pos);
     ++pos;
 
     // Map 11 : Type 6 Had FCAL2 and FCAL3
     addCoords(4,2,0.85,M_PI/8.,0.0,block*M_PI/2.,in6a,out,incr,
-              ChannelCoordinate::FCAL2, *pos);
+              ChannelCoordinate::FCAL2, **pos);
     addCoords(4,2,0.85,M_PI/8.,0.0,block*M_PI/2.,in6b,out,incr,
-              ChannelCoordinate::FCAL3, *pos);
+              ChannelCoordinate::FCAL3, **pos);
   }
 
   // Fill crate map
 
-  std::vector<CoordinateMap*>::const_iterator pos = m_coordMaps.begin();
+  std::vector<std::unique_ptr<CoordinateMap> >::const_iterator pos = m_coordMaps.begin();
 
   // Map 0 : all of crates 0,1
   //         crate 2 modules 1,2,5,6,9,10,13,14
   //         crate 3 modules 2,3,6,7,10,11,14,15
-  addMods(0,0,4,4, 0.0,0.0,0.4,M_PI/2.,*pos);
-  addMods(1,0,4,4,-1.6,0.0,0.4,M_PI/2.,*pos);
-  addMods(2,1,4,2, 1.6,0.0,0.4,M_PI/2.,*pos);
-  addMods(3,2,4,2,-2.4,0.0,0.4,M_PI/2.,*pos);
+  addMods(0,0,4,4, 0.0,0.0,0.4,M_PI/2.,pos->get());
+  addMods(1,0,4,4,-1.6,0.0,0.4,M_PI/2.,pos->get());
+  addMods(2,1,4,2, 1.6,0.0,0.4,M_PI/2.,pos->get());
+  addMods(3,2,4,2,-2.4,0.0,0.4,M_PI/2.,pos->get());
   ++pos;
 
   // Map 1 : crate 4 modules 1,2,5,6,9,10,13,14
   //         crate 5 modules 2,3,6,7,10,11,14,15
   //         all of crates 6,7
-  addMods(4,1,4,2, 1.6,0.0,0.4,M_PI/2.,*pos);
-  addMods(5,2,4,2,-2.4,0.0,0.4,M_PI/2.,*pos);
-  addMods(6,0,4,4, 0.0,0.0,0.4,M_PI/2.,*pos);
-  addMods(7,0,4,4,-1.6,0.0,0.4,M_PI/2.,*pos);
+  addMods(4,1,4,2, 1.6,0.0,0.4,M_PI/2.,pos->get());
+  addMods(5,2,4,2,-2.4,0.0,0.4,M_PI/2.,pos->get());
+  addMods(6,0,4,4, 0.0,0.0,0.4,M_PI/2.,pos->get());
+  addMods(7,0,4,4,-1.6,0.0,0.4,M_PI/2.,pos->get());
   ++pos;
 
   // Map 2 : crate 2 modules 3,7,11,15
-  addMods(2,3,4,1, 2.4,0.0,0.5,M_PI/2.,*pos);
+  addMods(2,3,4,1, 2.4,0.0,0.5,M_PI/2.,pos->get());
   ++pos;
 
   // Map 3 : crate 4 modules 3,7,11,15
-  addMods(4,3,4,1, 2.4,0.0,0.5,M_PI/2.,*pos);
+  addMods(4,3,4,1, 2.4,0.0,0.5,M_PI/2.,pos->get());
   ++pos;
 
   // Map 4 : crate 3 modules 1,5,9,13
-  addMods(3,1,4,1,-2.9,0.0,0.5,M_PI/2.,*pos);
+  addMods(3,1,4,1,-2.9,0.0,0.5,M_PI/2.,pos->get());
   ++pos;
 
   // Map 5 : crate 5 modules 1,5,9,13
-  addMods(5,1,4,1,-2.9,0.0,0.5,M_PI/2.,*pos);
+  addMods(5,1,4,1,-2.9,0.0,0.5,M_PI/2.,pos->get());
   ++pos;
 
   // Map 6 : crate 2 modules 4,12
-  addMods(2, 4,1,1, 2.9,0.0,0.3,M_PI,*pos);
-  addMods(2,12,1,1, 2.9,M_PI,0.3,M_PI,*pos);
+  addMods(2, 4,1,1, 2.9,0.0,0.3,M_PI,pos->get());
+  addMods(2,12,1,1, 2.9,M_PI,0.3,M_PI,pos->get());
   ++pos;
 
   // Map 7 : crate 4 modules 4,12
-  addMods(4, 4,1,1, 2.9,0.0,0.3,M_PI,*pos);
-  addMods(4,12,1,1, 2.9,M_PI,0.3,M_PI,*pos);
+  addMods(4, 4,1,1, 2.9,0.0,0.3,M_PI,pos->get());
+  addMods(4,12,1,1, 2.9,M_PI,0.3,M_PI,pos->get());
   ++pos;
 
   // Map 8 : crate 3 modules 4,12
-  addMods(3, 4,1,1,-3.2,0.0,0.3,M_PI,*pos);
-  addMods(3,12,1,1,-3.2,M_PI,0.3,M_PI,*pos);
+  addMods(3, 4,1,1,-3.2,0.0,0.3,M_PI,pos->get());
+  addMods(3,12,1,1,-3.2,M_PI,0.3,M_PI,pos->get());
   ++pos;
 
   // Map 9 : crate 5 modules 4,12
-  addMods(5, 4,1,1,-3.2,0.0,0.3,M_PI,*pos);
-  addMods(5,12,1,1,-3.2,M_PI,0.3,M_PI,*pos);
+  addMods(5, 4,1,1,-3.2,0.0,0.3,M_PI,pos->get());
+  addMods(5,12,1,1,-3.2,M_PI,0.3,M_PI,pos->get());
   ++pos;
 
   // Map 10 : crate 4 module 0, crate 5 module 0
-  addMods(4,0,1,1, 3.2,0.0,1.7,2*M_PI,*pos);
-  addMods(5,0,1,1,-4.9,0.0,1.7,2*M_PI,*pos);
+  addMods(4,0,1,1, 3.2,0.0,1.7,2*M_PI,pos->get());
+  addMods(5,0,1,1,-4.9,0.0,1.7,2*M_PI,pos->get());
   ++pos;
 
   // Map 11 : crate 4 module 8, crate 5 module 8
-  addMods(4,8,1,1, 3.2,0.0,1.7,2*M_PI,*pos);
-  addMods(5,8,1,1,-4.9,0.0,1.7,2*M_PI,*pos);
+  addMods(4,8,1,1, 3.2,0.0,1.7,2*M_PI,pos->get());
+  addMods(5,8,1,1,-4.9,0.0,1.7,2*M_PI,pos->get());
 }
 
 // Set up eta/phi map
@@ -422,7 +389,6 @@ void PpmMappingTool::setupInverseMap()
 {
   const unsigned int invalidChanId = s_crates*s_modules*s_channels;
 
-  m_etaPhiMap = new EtaPhiMap;
   for (int cr = 0; cr < s_crates; ++cr) {
     for (int mod = 0; mod < s_modules; ++mod) {
       for (int chan = 0; chan < s_channels; ++chan) {
@@ -431,12 +397,12 @@ void PpmMappingTool::setupInverseMap()
 	if (mapping(cr, mod, chan, tmpEta, tmpPhi, tmpLayer)) {
 	  const unsigned int key    = etaPhiKey(tmpEta, tmpPhi);
 	  const unsigned int chanId = (cr * s_modules + mod) * s_channels + chan;
-	  EtaPhiMap::iterator iter = m_etaPhiMap->find(key);
-	  if (iter == m_etaPhiMap->end()) {
+	  EtaPhiMap::iterator iter = m_etaPhiMap.find(key);
+	  if (iter == m_etaPhiMap.end()) {
 	    ChannelIds ids(invalidChanId, invalidChanId);
 	    if (tmpLayer == 0) ids.first  = chanId;
             else               ids.second = chanId;
-	    m_etaPhiMap->insert(std::make_pair(key, ids));
+	    m_etaPhiMap.insert(std::make_pair(key, ids));
           } else {
 	    ChannelIds& ids(iter->second);
 	    if (tmpLayer == 0) ids.first  = chanId;
@@ -453,15 +419,15 @@ void PpmMappingTool::setupInverseMap()
 void PpmMappingTool::addCoords(const int nrows, const int ncols,
      const double etaGran, const double phiGran, const double etaOffset,
      const double phiOffset, const int* in, const int* out, const int incr,
-     const ChannelCoordinate::CaloLayer layer, CoordinateMap* coordMap)
+     const ChannelCoordinate::CaloLayer layer, CoordinateMap& coordMap)
 {
   for (int row = 0; row < nrows; ++row) {
     const double phi = (double(row) + 0.5) * phiGran + phiOffset;
     for (int col = 0; col < ncols; ++col) {
       const double eta = (double(col) + 0.5) * etaGran + etaOffset;
       const int channel = out[in[row*ncols+col]-1] + incr;
-      coordMap->insert(std::make_pair(channel, 
-                       ChannelCoordinate(layer, eta, phi, etaGran, phiGran)));
+      assert (channel < s_channels);
+      coordMap[channel] = ChannelCoordinate(layer, eta, phi, etaGran, phiGran);
     }
   }
 }
@@ -473,22 +439,15 @@ void PpmMappingTool::addMods(const int crate, const int modOffset,
      const double phiBase, const double etaRange, const double phiRange,
      const CoordinateMap* coordMap)
 {
+  assert (crate < static_cast<int>(m_crateInfo.size()));
+  ModuleMap& modMap = m_crateInfo[crate];
   for (int row = 0; row < nrows; ++row) {
     for (int col = 0; col < ncols; ++col) {
       const int module = row*4 + col + modOffset;
       const double etaOffset = etaRange * double(col) + etaBase;
       const double phiOffset = phiRange * double(row) + phiBase;
       Offsets off(etaOffset, phiOffset);
-      ModuleInfo modInfo(off, coordMap);
-      CrateMap::iterator cpos = m_crateInfo->find(crate);
-      if (cpos != m_crateInfo->end()) {
-        ModuleMap& modMap(cpos->second);
-        modMap.insert(std::make_pair(module, modInfo));
-      } else {
-        ModuleMap modMap;
-        modMap.insert(std::make_pair(module, modInfo));
-        m_crateInfo->insert(std::make_pair(crate, modMap));
-      }
+      modMap[module] = ModuleInfo (off, coordMap);
     }
   }
 }
diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h
index 0321ec2e05e25f08d79efa1b569d4b76a50c0acf..ce33e76c3caf39ee9f824b0cacc15ef5ece60b15 100644
--- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h
+++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <utility>
 #include <vector>
+#include <array>
 
 #include "AthenaBaseComps/AthAlgTool.h"
 
@@ -32,32 +33,33 @@ namespace LVL1 {
  *  @author Peter Faulkner
  */
 
-class PpmMappingTool : virtual public IL1CaloMappingTool,
-                               public AthAlgTool {
-
+class PpmMappingTool : public extends<AthAlgTool, IL1CaloMappingTool>
+{
  public:
 
-   PpmMappingTool(const std::string& type, const std::string& name,
-                                           const IInterface* parent);
-   virtual ~PpmMappingTool();
+   using base_class::base_class;
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
+   virtual StatusCode finalize() override;
 
    /// Return eta, phi and layer mapping for given crate/module/channel
    virtual bool mapping(int crate, int module, int channel,
-                        double& eta, double& phi, int& layer);
+                        double& eta, double& phi, int& layer) const override;
    /// Return crate, module and channel mapping for given eta/phi/layer
    virtual bool mapping(double eta, double phi, int layer,
-                        int& crate, int& module, int& channel);
+                        int& crate, int& module, int& channel) const override;
 
  private:
+   static const int s_crates   = 8;
+   static const int s_modules  = 16;
+   static const int s_channels = 64;
+
    //  Crate/module map constituents
    typedef std::pair< double, double >                Offsets;
-   typedef std::map< int, ChannelCoordinate >         CoordinateMap;
+   typedef std::array< ChannelCoordinate, s_channels> CoordinateMap;
    typedef std::pair< Offsets, const CoordinateMap* > ModuleInfo;
-   typedef std::map< int, ModuleInfo >                ModuleMap;
-   typedef std::map< int, ModuleMap >                 CrateMap;
+   typedef std::array< ModuleInfo, s_modules >        ModuleMap;
+   typedef std::array< ModuleMap, s_crates >          CrateMap;
    //  Inverse map constituents
    typedef std::pair< unsigned int, unsigned int >    ChannelIds;
    typedef std::map< unsigned int, ChannelIds >       EtaPhiMap;
@@ -70,7 +72,7 @@ class PpmMappingTool : virtual public IL1CaloMappingTool,
    void addCoords(int nrows, int ncols, double etaGran, double phiGran,
         double etaOffset, double phiOffset,
 	const int* in, const int* out, int incr,
-	ChannelCoordinate::CaloLayer layer, CoordinateMap* coordMap);
+	ChannelCoordinate::CaloLayer layer, CoordinateMap& coordMap);
    /// Add a block of similar modules to a crate
    void addMods(int crate, int modOffset, int nrows, int ncols,
         double etaBase, double phiBase, double etaRange, double phiRange,
@@ -81,26 +83,11 @@ class PpmMappingTool : virtual public IL1CaloMappingTool,
    unsigned int etaPhiKey(double eta, double phi) const;
 
    /// Pointer to crate/module map
-   CrateMap* m_crateInfo;
+   std::array<ModuleMap, s_crates> m_crateInfo;
    /// Vector of CoordinateMaps
-   std::vector<CoordinateMap*> m_coordMaps;
-   /// Current Coordinate map
-   mutable const CoordinateMap* m_currentMap;
-   /// Current module eta offset
-   mutable double m_etaOffset;
-   /// Current module phi offset
-   mutable double m_phiOffset;
-   /// Current crate
-   mutable int m_currentCrate;
-   /// Current module
-   mutable int m_currentModule;
+   std::vector<std::unique_ptr<CoordinateMap> > m_coordMaps;
    /// Pointer to inverse map
-   EtaPhiMap* m_etaPhiMap;
-
-   static const int s_crates   = 8;
-   static const int s_modules  = 16;
-   static const int s_channels = 64;
-
+   EtaPhiMap m_etaPhiMap;
 };
 
 } // end namespace
diff --git a/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h b/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h
index 3a744a208b007e77a1602a1b4ea82ca6c86a9dae..52851c5cfdaa2e97985c9494ab6334a773f777f7 100644
--- a/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h
+++ b/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h
@@ -10,25 +10,18 @@
 
 namespace LVL1 {
 
-static const InterfaceID IID_IL1CaloMappingTool("LVL1::IL1CaloMappingTool", 1, 0);
-
 class IL1CaloMappingTool : virtual public IAlgTool {
 
- public:
-   static const InterfaceID& interfaceID();
+public:
+   DeclareInterfaceID (IL1CaloMappingTool, 1, 0);
 
    virtual bool mapping(int crate, int module, int channel,
-                        double& eta, double& phi, int& layer) = 0;
+                        double& eta, double& phi, int& layer) const = 0;
    virtual bool mapping(double eta, double phi, int layer,
-                        int& crate, int& module, int& channel) = 0;
+                        int& crate, int& module, int& channel) const = 0;
       
 };
 
-inline const InterfaceID& IL1CaloMappingTool::interfaceID()
-{ 
-  return IID_IL1CaloMappingTool;
-}
-
 } // end of namespace
 
 #endif