diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx
index 2ab9fd571828b86b8b8bf2211df82f35cf2a2593..a23c4cd0718885888a65663419afed08295837b3 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.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
 */
 
 
@@ -17,7 +17,6 @@
 
 #include "CpmRoiSubBlock.h"
 #include "L1CaloErrorByteStreamTool.h"
-#include "L1CaloSrcIdMap.h"
 #include "L1CaloUserHeader.h"
 
 #include "CpmRoiByteStreamTool.h"
@@ -41,8 +40,8 @@ CpmRoiByteStreamTool::CpmRoiByteStreamTool(const std::string& type,
                                            const IInterface*  parent)
   : AthAlgTool(type, name, parent),
     m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
-    m_crates(4), m_modules(14), m_srcIdMap(0), m_subBlock(0), m_rodStatus(0),
-    m_fea(0)
+    m_crates(4), m_modules(14),
+    m_subDetector (eformat::TDAQ_CALO_CLUSTER_PROC_ROI)
 {
   declareInterface<CpmRoiByteStreamTool>(this);
 
@@ -52,9 +51,9 @@ CpmRoiByteStreamTool::CpmRoiByteStreamTool(const std::string& type,
                   "Offset of CP crate numbers in RDOs");
 
   // Properties for reading bytestream only
-  declareProperty("ROBSourceIDs",       m_sourceIDs,
+  declareProperty("ROBSourceIDs",       m_sourceIDsProp,
                   "ROB fragment source identifiers");
-  declareProperty("ROBSourceIDsRoIB",   m_sourceIDsRoIB,
+  declareProperty("ROBSourceIDsRoIB",   m_sourceIDsRoIBProp,
                   "ROB fragment source identifiers for RoIBs");
 
   // Properties for writing bytestream only
@@ -78,31 +77,11 @@ CpmRoiByteStreamTool::~CpmRoiByteStreamTool()
 
 StatusCode CpmRoiByteStreamTool::initialize()
 {
-  msg(MSG::INFO) << "Initializing " << name() << " - package version "
-                 << PACKAGE_VERSION << endmsg;
-
-  StatusCode sc = m_errorTool.retrieve();
-  if (sc.isFailure()) {
-    msg(MSG::ERROR) << "Failed to retrieve tool " << m_errorTool << endmsg;
-    return sc;
-  } else msg(MSG::INFO) << "Retrieved tool " << m_errorTool << endmsg;
-
-  m_subDetector = eformat::TDAQ_CALO_CLUSTER_PROC_ROI;
-  m_srcIdMap    = new L1CaloSrcIdMap();
-  m_rodStatus   = new std::vector<uint32_t>(2);
-  m_subBlock    = new CpmRoiSubBlock();
-  m_fea         = new FullEventAssembler<L1CaloSrcIdMap>();
-  return StatusCode::SUCCESS;
-}
+  ATH_MSG_INFO ("Initializing " << name() << " - package version "
+                << PACKAGE_VERSION);
 
-// Finalize
+  ATH_CHECK( m_errorTool.retrieve() );
 
-StatusCode CpmRoiByteStreamTool::finalize()
-{
-  delete m_fea;
-  delete m_subBlock;
-  delete m_rodStatus;
-  delete m_srcIdMap;
   return StatusCode::SUCCESS;
 }
 
@@ -110,11 +89,14 @@ StatusCode CpmRoiByteStreamTool::finalize()
 
 StatusCode CpmRoiByteStreamTool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
-                            DataVector<LVL1::CPMRoI>* const roiCollection)
+                            DataVector<LVL1::CPMRoI>* const roiCollection) const
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
 
+  // Sub-block for neutral format
+  CpmRoiSubBlock subBlock;
+
   // Loop over ROB fragments
 
   int robCount = 0;
@@ -165,12 +147,12 @@ StatusCode CpmRoiByteStreamTool::convert(
 
     // Check identifier
     const uint32_t sourceID = (*rob)->rod_source_id();
-    if (m_srcIdMap->getRobID(sourceID) != robid           ||
-        m_srcIdMap->subDet(sourceID)   != m_subDetector   ||
-        m_srcIdMap->daqOrRoi(sourceID) != 1               ||
-       (m_srcIdMap->slink(sourceID) != 0 && m_srcIdMap->slink(sourceID) != 2) ||
-	m_srcIdMap->crate(sourceID)    <  m_crateOffsetHw ||
-	m_srcIdMap->crate(sourceID)    >= m_crateOffsetHw + m_crates) {
+    if (m_srcIdMap.getRobID(sourceID) != robid           ||
+        m_srcIdMap.subDet(sourceID)   != m_subDetector   ||
+        m_srcIdMap.daqOrRoi(sourceID) != 1               ||
+       (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) ||
+	m_srcIdMap.crate(sourceID)    <  m_crateOffsetHw ||
+	m_srcIdMap.crate(sourceID)    >= m_crateOffsetHw + m_crates) {
       m_errorTool->rodError(robid, L1CaloSubBlock::ERROR_ROD_ID);
       if (debug) {
         msg() << "Wrong source identifier in data: "
@@ -178,10 +160,10 @@ StatusCode CpmRoiByteStreamTool::convert(
       }
       continue;
     }
-    const int rodCrate = m_srcIdMap->crate(sourceID);
+    const int rodCrate = m_srcIdMap.crate(sourceID);
     if (debug) {
       msg() << "Treating crate " << rodCrate 
-            << " slink " << m_srcIdMap->slink(sourceID) << endmsg;
+            << " slink " << m_srcIdMap.slink(sourceID) << endmsg;
     }
 
     // First word may be User Header
@@ -205,26 +187,26 @@ StatusCode CpmRoiByteStreamTool::convert(
     while (payload != payloadEnd) {
       
       if (L1CaloSubBlock::wordType(*payload) == L1CaloSubBlock::HEADER) {
-        m_subBlock->clear();
-        payload = m_subBlock->read(payload, payloadEnd);
+        subBlock.clear();
+        payload = subBlock.read(payload, payloadEnd);
         if (debug) {
-          msg() << "CPM RoI sub-block: Crate " << m_subBlock->crate()
-                << "  Module " << m_subBlock->module() << endmsg;
+          msg() << "CPM RoI sub-block: Crate " << subBlock.crate()
+                << "  Module " << subBlock.module() << endmsg;
         }
         // Unpack sub-block
-        if (m_subBlock->dataWords() && !m_subBlock->unpack()) {
+        if (subBlock.dataWords() && !subBlock.unpack()) {
           if (debug) {
-            std::string errMsg(m_subBlock->unpackErrorMsg());
+            std::string errMsg(subBlock.unpackErrorMsg());
 	    msg() << "CPM RoI sub-block unpacking failed: " << errMsg << endmsg;
 	  }
-	  rodErr = m_subBlock->unpackErrorCode();
+	  rodErr = subBlock.unpackErrorCode();
 	  break;
         }
 	const int numChips = 8;
 	const int numLocs  = 2;
 	for (int chip = 0; chip < numChips; ++chip) {
 	  for (int loc = 0; loc < numLocs; ++loc) {
-	    const LVL1::CPMRoI roi = m_subBlock->roi(chip, loc);
+	    const LVL1::CPMRoI roi = subBlock.roi(chip, loc);
             if (roi.hits() || roi.error()) {
               roiCollection->push_back(new LVL1::CPMRoI(roi));
             }
@@ -277,27 +259,31 @@ StatusCode CpmRoiByteStreamTool::convert(
 
 StatusCode CpmRoiByteStreamTool::convert(
            const DataVector<LVL1::CPMRoI>* const roiCollection,
-	   RawEventWrite* const re)
+	   RawEventWrite* const re) const
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
 
   // Clear the event assembler
 
-  m_fea->clear();
-  const uint16_t minorVersion = m_srcIdMap->minorVersion();
-  m_fea->setRodMinorVersion(minorVersion);
-  m_rodStatusMap.clear();
+  FullEventAssembler<L1CaloSrcIdMap> fea;
+  const uint16_t minorVersion = m_srcIdMap.minorVersion();
+  fea.setRodMinorVersion(minorVersion);
 
   // Pointer to ROD data vector
 
   FullEventAssembler<L1CaloSrcIdMap>::RODDATA* theROD = 0;
 
+  // Sub-block for neutral format
+  CpmRoiSubBlock subBlock;
+
   // Set up the container map
 
-  setupCpmRoiMap(roiCollection);
-  CpmRoiMap::const_iterator mapIter    = m_roiMap.begin();
-  CpmRoiMap::const_iterator mapIterEnd = m_roiMap.end();
+  // CPM RoI map
+  CpmRoiMap roiMap;
+  setupCpmRoiMap(roiCollection, roiMap);
+  CpmRoiMap::const_iterator mapIter    = roiMap.begin();
+  CpmRoiMap::const_iterator mapIterEnd = roiMap.end();
 
   // Loop over data
 
@@ -322,22 +308,21 @@ StatusCode CpmRoiByteStreamTool::convert(
 	        << "Data Version/Format: " << m_version
 	        << " " << m_dataFormat << endmsg;
         }
-	const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi,
+	const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
 	                                                        m_subDetector);
-	theROD = m_fea->getRodData(rodIdCpm);
+	theROD = fea.getRodData(rodIdCpm);
 	if (neutralFormat) {
           const L1CaloUserHeader userHeader;
 	  theROD->push_back(userHeader.header());
         }
-	m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus));
       }
       if (debug) msg() << "Module " << module << endmsg;
 
       // Create a sub-block (Neutral format only)
 
       if (neutralFormat) {
-        m_subBlock->clear();
-	m_subBlock->setRoiHeader(m_version, hwCrate, module);
+        subBlock.clear();
+	subBlock.setRoiHeader(m_version, hwCrate, module);
       }
 
       // Find CPM RoIs for this module
@@ -349,7 +334,7 @@ StatusCode CpmRoiByteStreamTool::convert(
 	if (roi->cpm()   < module) continue;
 	if (roi->cpm()   > module) break;
 	if (roi->hits() || roi->error()) {
-	  if (neutralFormat) m_subBlock->fillRoi(*roi);
+	  if (neutralFormat) subBlock.fillRoi(*roi);
           else theROD->push_back(roi->roiWord());
         }
       }
@@ -357,71 +342,94 @@ StatusCode CpmRoiByteStreamTool::convert(
       // Pack and write the sub-block
 
       if (neutralFormat) {
-        if ( !m_subBlock->pack()) {
+        if ( !subBlock.pack()) {
           msg(MSG::ERROR) << "CPMRoI sub-block packing failed" << endmsg;
  	  return StatusCode::FAILURE;
         }
 	if (debug) {
 	  msg() << "CPMRoI sub-block data words: "
-	        << m_subBlock->dataWords() << endmsg;
+	        << subBlock.dataWords() << endmsg;
         }
-        m_subBlock->write(theROD);
+        subBlock.write(theROD);
       }
     }
   }
 
   // Fill the raw event
 
-  m_fea->fill(re, msg());
-
-  // Set ROD status words
-
-  //L1CaloRodStatus::setStatus(re, m_rodStatusMap, m_srcIdMap);
+  fea.fill(re, msg());
 
   return StatusCode::SUCCESS;
 }
 
 // Return reference to vector with all possible Source Identifiers
 
+std::vector<uint32_t> CpmRoiByteStreamTool::makeSourceIDs (bool roiDaq) const
+{
+  std::vector<uint32_t> sourceIDs;
+
+  if (roiDaq) {
+    sourceIDs = m_sourceIDsProp;
+  }
+  else {
+    sourceIDs = m_sourceIDsRoIBProp;
+  }
+
+  if (sourceIDs.empty()) {
+        const int maxCrates = m_crates + m_crateOffsetHw;
+        const int maxSlinks = m_srcIdMap.maxSlinks();
+        for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate)
+        {
+            for (int slink = 0; slink < maxSlinks; ++slink)
+            {
+                const int daqOrRoi = 1;
+                const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
+                                       m_subDetector);
+                const uint32_t robId = m_srcIdMap.getRobID(rodId);
+                if (roiDaq)
+                {
+                    if (slink < 2) sourceIDs.push_back(robId);
+                }
+                else if (slink >= 2) sourceIDs.push_back(robId);
+            }
+        }
+
+  }
+  return sourceIDs;
+}
+
 const std::vector<uint32_t>& CpmRoiByteStreamTool::sourceIDs(
-                                                      const std::string& sgKey)
+                                                      const std::string& sgKey) const
 {
   const std::string flag("RoIB");
   const std::string::size_type pos = sgKey.find(flag);
   const bool roiDaq =
            (pos == std::string::npos || pos != sgKey.length() - flag.length());
-  const bool empty  = (roiDaq) ? m_sourceIDs.empty() : m_sourceIDsRoIB.empty();
-  if (empty) {
-    const int maxCrates = m_crates + m_crateOffsetHw;
-    const int maxSlinks = m_srcIdMap->maxSlinks();
-    for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) {
-      for (int slink = 0; slink < maxSlinks; ++slink) {
-        const int daqOrRoi = 1;
-        const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi,
-                                                             m_subDetector);
-        const uint32_t robId = m_srcIdMap->getRobID(rodId);
-	if (roiDaq) {
-	  if (slink < 2) m_sourceIDs.push_back(robId);
-	} else if (slink >= 2) m_sourceIDsRoIB.push_back(robId);
-      }
-    }
+
+  if (roiDaq) {
+    static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq);
+    return sourceIDs;
+  }
+  else {
+    static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq);
+    return sourceIDsRoIB;
   }
-  return (roiDaq) ? m_sourceIDs : m_sourceIDsRoIB;
 }
 
 // Set up CPM RoI map
 
 void CpmRoiByteStreamTool::setupCpmRoiMap(const CpmRoiCollection*
-                                                          const roiCollection)
+                                                          const roiCollection,
+                                            CpmRoiMap& roiMap) const
 {
-  m_roiMap.clear();
+  roiMap.clear();
   if (roiCollection) {
     CpmRoiCollection::const_iterator pos  = roiCollection->begin();
     CpmRoiCollection::const_iterator pose = roiCollection->end();
     for (; pos != pose; ++pos) {
       const LVL1::CPMRoI* const roi = *pos;
       const uint32_t key = roi->roiWord();
-      m_roiMap.insert(std::make_pair(key, roi));
+      roiMap.insert(std::make_pair(key, roi));
     }
   }
 }
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h
index 659ad2b1c08adc2ff00613ab4b7bb074fae9ab10..e2d38a4e3fa3c4a706d8c9e7c8b8e3812f306a85 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h
@@ -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
 */
 
 #ifndef TRIGT1CALOBYTESTREAM_CPMROIBYTESTREAMTOOL_H
@@ -11,6 +11,7 @@
 #include <string>
 #include <vector>
 
+#include "L1CaloSrcIdMap.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
 #include "ByteStreamData/RawEvent.h"
@@ -52,19 +53,18 @@ class CpmRoiByteStreamTool : public AthAlgTool {
    /// AlgTool InterfaceID
    static const InterfaceID& interfaceID();
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
 
    /// Convert ROB fragments to CPM RoIs
    StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                      DataVector<LVL1::CPMRoI>* roiCollection);
+                      DataVector<LVL1::CPMRoI>* roiCollection) const;
 
    /// Convert CPM RoI to bytestream
    StatusCode convert(const DataVector<LVL1::CPMRoI>* roiCollection,
-                      RawEventWrite* re);
+                      RawEventWrite* re) const;
 
    /// Return reference to vector with all possible Source Identifiers
-   const std::vector<uint32_t>& sourceIDs(const std::string& sgKey);
+   const std::vector<uint32_t>& sourceIDs(const std::string& sgKey) const;
 
  private:
 
@@ -74,45 +74,37 @@ class CpmRoiByteStreamTool : public AthAlgTool {
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   std::vector<uint32_t> makeSourceIDs (bool roiDaq) const;
+
    /// Set up CPM RoI map
-   void setupCpmRoiMap(const CpmRoiCollection* roiCollection);
+   void setupCpmRoiMap(const CpmRoiCollection* roiCollection,
+                       CpmRoiMap& roiMap) const;
 
    /// Error collection tool
    ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool;
 
-   /// Hardware crate number offset
+   /// Property: Hardware crate number offset
    int m_crateOffsetHw;
-   /// Software crate number offset
+   /// Property: Software crate number offset
    int m_crateOffsetSw;
-   /// Sub_block header version
+   /// Property: Sub_block header version
    int m_version;
-   /// Data compression format
+   /// Property: Data compression format
    int m_dataFormat;
    /// Number of crates
-   int m_crates;
+   const int m_crates;
    /// Number of CPM modules per crate
-   int m_modules;
-   /// Number of slinks per crate when writing out bytestream
+   const int m_modules;
+   /// Property: Number of slinks per crate when writing out bytestream
    int m_slinks;
-   /// ROB source IDs
-   std::vector<uint32_t> m_sourceIDs;
-   /// ROB source IDs for RoIB
-   std::vector<uint32_t> m_sourceIDsRoIB;
+   /// Property: ROB source IDs
+   std::vector<uint32_t> m_sourceIDsProp;
+   /// Property: ROB source IDs for RoIB
+   std::vector<uint32_t> m_sourceIDsRoIBProp;
    /// Sub-detector type
-   eformat::SubDetector m_subDetector;
+   const eformat::SubDetector m_subDetector;
    /// Source ID converter
-   L1CaloSrcIdMap* m_srcIdMap;
-   /// Sub-block for neutral format
-   CpmRoiSubBlock* m_subBlock;
-   /// CPM RoI map
-   CpmRoiMap m_roiMap;
-   /// ROD Status words
-   std::vector<uint32_t>* m_rodStatus;
-   /// ROD status map
-   std::map<uint32_t, std::vector<uint32_t>* > m_rodStatusMap;
-   /// Event assembler
-   FullEventAssembler<L1CaloSrcIdMap>* m_fea;
-
+   const L1CaloSrcIdMap m_srcIdMap;
 };
 
 } // end namespace
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx
index 5778110f761ed0852b7030eb60d8e82ccd052540..c441b6957d02dcc5d63bcacfb2c35ad6c9a3389e 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.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
 */
 
 
@@ -17,7 +17,6 @@
 
 #include "CpmRoiSubBlockV1.h"
 #include "L1CaloErrorByteStreamTool.h"
-#include "L1CaloSrcIdMap.h"
 #include "L1CaloUserHeader.h"
 
 #include "CpmRoiByteStreamV1Tool.h"
@@ -41,8 +40,8 @@ CpmRoiByteStreamV1Tool::CpmRoiByteStreamV1Tool(const std::string& type,
                                                const IInterface*  parent)
   : AthAlgTool(type, name, parent),
     m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
-    m_crates(4), m_modules(14), m_srcIdMap(0), m_subBlock(0), m_rodStatus(0),
-    m_fea(0)
+    m_crates(4), m_modules(14),
+    m_subDetector (eformat::TDAQ_CALO_CLUSTER_PROC_ROI)
 {
   declareInterface<CpmRoiByteStreamV1Tool>(this);
 
@@ -54,9 +53,9 @@ CpmRoiByteStreamV1Tool::CpmRoiByteStreamV1Tool(const std::string& type,
                   "Offset of CP crate numbers in RDOs");
 
   // Properties for reading bytestream only
-  declareProperty("ROBSourceIDs",       m_sourceIDs,
+  declareProperty("ROBSourceIDs",       m_sourceIDsProp,
                   "ROB fragment source identifiers");
-  declareProperty("ROBSourceIDsRoIB",   m_sourceIDsRoIB,
+  declareProperty("ROBSourceIDsRoIB",   m_sourceIDsRoIBProp,
                   "ROB fragment source identifiers for RoIBs");
 
   // Properties for writing bytestream only
@@ -84,31 +83,11 @@ CpmRoiByteStreamV1Tool::~CpmRoiByteStreamV1Tool()
 
 StatusCode CpmRoiByteStreamV1Tool::initialize()
 {
-  msg(MSG::INFO) << "Initializing " << name() << " - package version "
-                 << PACKAGE_VERSION << endmsg;
-
-  StatusCode sc = m_errorTool.retrieve();
-  if (sc.isFailure()) {
-    msg(MSG::ERROR) << "Failed to retrieve tool " << m_errorTool << endmsg;
-    return sc;
-  } else msg(MSG::INFO) << "Retrieved tool " << m_errorTool << endmsg;
-
-  m_subDetector = eformat::TDAQ_CALO_CLUSTER_PROC_ROI;
-  m_srcIdMap    = new L1CaloSrcIdMap();
-  m_rodStatus   = new std::vector<uint32_t>(2);
-  m_subBlock    = new CpmRoiSubBlockV1();
-  m_fea         = new FullEventAssembler<L1CaloSrcIdMap>();
-  return StatusCode::SUCCESS;
-}
+  ATH_MSG_INFO ("Initializing " << name() << " - package version "
+                << PACKAGE_VERSION);
 
-// Finalize
+  ATH_CHECK( m_errorTool.retrieve() );
 
-StatusCode CpmRoiByteStreamV1Tool::finalize()
-{
-  delete m_fea;
-  delete m_subBlock;
-  delete m_rodStatus;
-  delete m_srcIdMap;
   return StatusCode::SUCCESS;
 }
 
@@ -116,11 +95,14 @@ StatusCode CpmRoiByteStreamV1Tool::finalize()
 
 StatusCode CpmRoiByteStreamV1Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
-                            DataVector<LVL1::CPMRoI>* const roiCollection)
+                            DataVector<LVL1::CPMRoI>* const roiCollection) const
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
 
+  // Sub-block for neutral format
+  CpmRoiSubBlockV1 subBlock;
+
   // Loop over ROB fragments
 
   int robCount = 0;
@@ -171,12 +153,12 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
 
     // Check identifier
     const uint32_t sourceID = (*rob)->rod_source_id();
-    if (m_srcIdMap->getRobID(sourceID) != robid           ||
-        m_srcIdMap->subDet(sourceID)   != m_subDetector   ||
-        m_srcIdMap->daqOrRoi(sourceID) != 1               ||
-       (m_srcIdMap->slink(sourceID) != 0 && m_srcIdMap->slink(sourceID) != 2) ||
-	m_srcIdMap->crate(sourceID)    <  m_crateOffsetHw ||
-	m_srcIdMap->crate(sourceID)    >= m_crateOffsetHw + m_crates) {
+    if (m_srcIdMap.getRobID(sourceID) != robid           ||
+        m_srcIdMap.subDet(sourceID)   != m_subDetector   ||
+        m_srcIdMap.daqOrRoi(sourceID) != 1               ||
+       (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) ||
+	m_srcIdMap.crate(sourceID)    <  m_crateOffsetHw ||
+	m_srcIdMap.crate(sourceID)    >= m_crateOffsetHw + m_crates) {
       m_errorTool->rodError(robid, L1CaloSubBlock::ERROR_ROD_ID);
       if (debug) {
         msg() << "Wrong source identifier in data: "
@@ -187,14 +169,14 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
 
     // Check minor version
     const int minorVersion = (*rob)->rod_version() & 0xffff;
-    if (minorVersion > m_srcIdMap->minorVersionPreLS1()) {
+    if (minorVersion > m_srcIdMap.minorVersionPreLS1()) {
       if (debug) msg() << "Skipping post-LS1 data" << endmsg;
       continue;
     }
-    const int rodCrate = m_srcIdMap->crate(sourceID);
+    const int rodCrate = m_srcIdMap.crate(sourceID);
     if (debug) {
       msg() << "Treating crate " << rodCrate 
-            << " slink " << m_srcIdMap->slink(sourceID) << endmsg;
+            << " slink " << m_srcIdMap.slink(sourceID) << endmsg;
     }
 
     // First word may be User Header
@@ -217,26 +199,26 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
     while (payload != payloadEnd) {
       
       if (L1CaloSubBlock::wordType(*payload) == L1CaloSubBlock::HEADER) {
-        m_subBlock->clear();
-        payload = m_subBlock->read(payload, payloadEnd);
+        subBlock.clear();
+        payload = subBlock.read(payload, payloadEnd);
         if (debug) {
-          msg() << "CPM RoI sub-block: Crate " << m_subBlock->crate()
-                << "  Module " << m_subBlock->module() << endmsg;
+          msg() << "CPM RoI sub-block: Crate " << subBlock.crate()
+                << "  Module " << subBlock.module() << endmsg;
         }
         // Unpack sub-block
-        if (m_subBlock->dataWords() && !m_subBlock->unpack()) {
+        if (subBlock.dataWords() && !subBlock.unpack()) {
           if (debug) {
-            std::string errMsg(m_subBlock->unpackErrorMsg());
+            std::string errMsg(subBlock.unpackErrorMsg());
 	    msg() << "CPM RoI sub-block unpacking failed: " << errMsg << endmsg;
 	  }
-	  rodErr = m_subBlock->unpackErrorCode();
+	  rodErr = subBlock.unpackErrorCode();
 	  break;
         }
 	const int numChips = 8;
 	const int numLocs  = 2;
 	for (int chip = 0; chip < numChips; ++chip) {
 	  for (int loc = 0; loc < numLocs; ++loc) {
-	    const LVL1::CPMRoI roi = m_subBlock->roi(chip, loc);
+	    const LVL1::CPMRoI roi = subBlock.roi(chip, loc);
             if (roi.hits() || roi.error()) {
               roiCollection->push_back(new LVL1::CPMRoI(roi));
             }
@@ -289,27 +271,31 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
 
 StatusCode CpmRoiByteStreamV1Tool::convert(
            const DataVector<LVL1::CPMRoI>* const roiCollection,
-	   RawEventWrite* const re)
+	   RawEventWrite* const re) const
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
 
   // Clear the event assembler
 
-  m_fea->clear();
-  uint16_t minorVersion = m_srcIdMap->minorVersionPreLS1();
-  m_fea->setRodMinorVersion(minorVersion);
-  m_rodStatusMap.clear();
+  FullEventAssembler<L1CaloSrcIdMap> fea;
+  uint16_t minorVersion = m_srcIdMap.minorVersionPreLS1();
+  fea.setRodMinorVersion(minorVersion);
 
   // Pointer to ROD data vector
 
   FullEventAssembler<L1CaloSrcIdMap>::RODDATA* theROD = 0;
 
+  // Sub-block for neutral format
+  CpmRoiSubBlockV1 subBlock;
+
   // Set up the container map
 
-  setupCpmRoiMap(roiCollection);
-  CpmRoiMap::const_iterator mapIter    = m_roiMap.begin();
-  CpmRoiMap::const_iterator mapIterEnd = m_roiMap.end();
+  // CPM RoI map
+  CpmRoiMap roiMap;
+  setupCpmRoiMap(roiCollection, roiMap);
+  CpmRoiMap::const_iterator mapIter    = roiMap.begin();
+  CpmRoiMap::const_iterator mapIterEnd = roiMap.end();
 
   // Loop over data
 
@@ -334,22 +320,21 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
 	        << "Data Version/Format: " << m_version
 	        << " " << m_dataFormat << endmsg;
         }
-	const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi,
+	const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
 	                                                        m_subDetector);
-	theROD = m_fea->getRodData(rodIdCpm);
+	theROD = fea.getRodData(rodIdCpm);
 	if (neutralFormat) {
           const L1CaloUserHeader userHeader;
 	  theROD->push_back(userHeader.header());
         }
-	m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus));
       }
       if (debug) msg() << "Module " << module << endmsg;
 
       // Create a sub-block (Neutral format only)
 
       if (neutralFormat) {
-        m_subBlock->clear();
-	m_subBlock->setRoiHeader(m_version, hwCrate, module);
+        subBlock.clear();
+	subBlock.setRoiHeader(m_version, hwCrate, module);
       }
 
       // Find CPM RoIs for this module
@@ -361,7 +346,7 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
 	if (roi->cpm()   < module) continue;
 	if (roi->cpm()   > module) break;
 	if (roi->hits() || roi->error()) {
-	  if (neutralFormat) m_subBlock->fillRoi(*roi);
+	  if (neutralFormat) subBlock.fillRoi(*roi);
           else theROD->push_back(roi->roiWord());
         }
       }
@@ -369,71 +354,94 @@ StatusCode CpmRoiByteStreamV1Tool::convert(
       // Pack and write the sub-block
 
       if (neutralFormat) {
-        if ( !m_subBlock->pack()) {
+        if ( !subBlock.pack()) {
           msg(MSG::ERROR) << "CPMRoI sub-block packing failed" << endmsg;
  	  return StatusCode::FAILURE;
         }
 	if (debug) {
 	  msg() << "CPMRoI sub-block data words: "
-	        << m_subBlock->dataWords() << endmsg;
+	        << subBlock.dataWords() << endmsg;
         }
-        m_subBlock->write(theROD);
+        subBlock.write(theROD);
       }
     }
   }
 
   // Fill the raw event
 
-  m_fea->fill(re, msg());
-
-  // Set ROD status words
-
-  //L1CaloRodStatus::setStatus(re, m_rodStatusMap, m_srcIdMap);
+  fea.fill(re, msg());
 
   return StatusCode::SUCCESS;
 }
 
 // Return reference to vector with all possible Source Identifiers
 
+std::vector<uint32_t> CpmRoiByteStreamV1Tool::makeSourceIDs (bool roiDaq) const
+{
+  std::vector<uint32_t> sourceIDs;
+
+  if (roiDaq) {
+    sourceIDs = m_sourceIDsProp;
+  }
+  else {
+    sourceIDs = m_sourceIDsRoIBProp;
+  }
+
+  if (sourceIDs.empty()) {
+        const int maxCrates = m_crates + m_crateOffsetHw;
+        const int maxSlinks = m_srcIdMap.maxSlinks();
+        for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate)
+        {
+            for (int slink = 0; slink < maxSlinks; ++slink)
+            {
+                const int daqOrRoi = 1;
+                const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
+                                       m_subDetector);
+                const uint32_t robId = m_srcIdMap.getRobID(rodId);
+                if (roiDaq)
+                {
+                    if (slink < 2) sourceIDs.push_back(robId);
+                }
+                else if (slink >= 2) sourceIDs.push_back(robId);
+            }
+        }
+
+  }
+  return sourceIDs;
+}
+
 const std::vector<uint32_t>& CpmRoiByteStreamV1Tool::sourceIDs(
-                                                      const std::string& sgKey)
+                                                      const std::string& sgKey) const
 {
   const std::string flag("RoIB");
   const std::string::size_type pos = sgKey.find(flag);
   const bool roiDaq =
            (pos == std::string::npos || pos != sgKey.length() - flag.length());
-  const bool empty  = (roiDaq) ? m_sourceIDs.empty() : m_sourceIDsRoIB.empty();
-  if (empty) {
-    const int maxCrates = m_crates + m_crateOffsetHw;
-    const int maxSlinks = m_srcIdMap->maxSlinks();
-    for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) {
-      for (int slink = 0; slink < maxSlinks; ++slink) {
-        const int daqOrRoi = 1;
-        const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi,
-                                                             m_subDetector);
-        const uint32_t robId = m_srcIdMap->getRobID(rodId);
-	if (roiDaq) {
-	  if (slink < 2) m_sourceIDs.push_back(robId);
-	} else if (slink >= 2) m_sourceIDsRoIB.push_back(robId);
-      }
-    }
+
+  if (roiDaq) {
+    static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq);
+    return sourceIDs;
+  }
+  else {
+    static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq);
+    return sourceIDsRoIB;
   }
-  return (roiDaq) ? m_sourceIDs : m_sourceIDsRoIB;
 }
 
 // Set up CPM RoI map
 
 void CpmRoiByteStreamV1Tool::setupCpmRoiMap(const CpmRoiCollection*
-                                                          const roiCollection)
+                                                          const roiCollection,
+                                            CpmRoiMap& roiMap) const
 {
-  m_roiMap.clear();
+  roiMap.clear();
   if (roiCollection) {
     CpmRoiCollection::const_iterator pos  = roiCollection->begin();
     CpmRoiCollection::const_iterator pose = roiCollection->end();
     for (; pos != pose; ++pos) {
       const LVL1::CPMRoI* const roi = *pos;
       const uint32_t key = roi->roiWord();
-      m_roiMap.insert(std::make_pair(key, roi));
+      roiMap.insert(std::make_pair(key, roi));
     }
   }
 }
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h
index ba9165d0e58d234892f1fb7152f2a69ebaef61cf..d80b57497febd67dd8861bd7f9f195eda4ee9569 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h
@@ -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
 */
 
 #ifndef TRIGT1CALOBYTESTREAM_CPMROIBYTESTREAMV1TOOL_H
@@ -11,6 +11,7 @@
 #include <string>
 #include <vector>
 
+#include "L1CaloSrcIdMap.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
 #include "ByteStreamData/RawEvent.h"
@@ -52,19 +53,18 @@ class CpmRoiByteStreamV1Tool : public AthAlgTool {
    /// AlgTool InterfaceID
    static const InterfaceID& interfaceID();
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
 
    /// Convert ROB fragments to CPM RoIs
    StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                      DataVector<LVL1::CPMRoI>* roiCollection);
+                      DataVector<LVL1::CPMRoI>* roiCollection) const;
 
    /// Convert CPM RoI to bytestream
    StatusCode convert(const DataVector<LVL1::CPMRoI>* roiCollection,
-                      RawEventWrite* re);
+                      RawEventWrite* re) const;
 
    /// Return reference to vector with all possible Source Identifiers
-   const std::vector<uint32_t>& sourceIDs(const std::string& sgKey);
+   const std::vector<uint32_t>& sourceIDs(const std::string& sgKey) const;
 
  private:
 
@@ -74,49 +74,41 @@ class CpmRoiByteStreamV1Tool : public AthAlgTool {
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   std::vector<uint32_t> makeSourceIDs (bool roiDaq) const;
+
    /// Set up CPM RoI map
-   void setupCpmRoiMap(const CpmRoiCollection* roiCollection);
+   void setupCpmRoiMap(const CpmRoiCollection* roiCollection,
+                       CpmRoiMap& roiMap) const;
 
-   /// Error collection tool
+   /// Property: Error collection tool
    ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool;
 
-   /// Hardware crate number offset
+   /// Property: Hardware crate number offset
    int m_crateOffsetHw;
-   /// Software crate number offset
+   /// Property: Software crate number offset
    int m_crateOffsetSw;
-   /// Sub_block header version
+   /// Property: Sub_block header version
    int m_version;
-   /// Data compression format
+   /// Property: Data compression format
    int m_dataFormat;
    /// Number of crates
-   int m_crates;
+   const int m_crates;
    /// Number of CPM modules per crate
-   int m_modules;
-   /// Number of slinks per crate when writing out bytestream
+   const int m_modules;
+   /// Property: Number of slinks per crate when writing out bytestream
    int m_slinks;
-   /// Minimum crate number when writing out bytestream
+   /// Property: Minimum crate number when writing out bytestream
    int m_crateMin;
-   /// Maximum crate number when writing out bytestream
+   /// Property: Maximum crate number when writing out bytestream
    int m_crateMax;
-   /// ROB source IDs
-   std::vector<uint32_t> m_sourceIDs;
-   /// ROB source IDs for RoIB
-   std::vector<uint32_t> m_sourceIDsRoIB;
+   /// Property: ROB source IDs
+   std::vector<uint32_t> m_sourceIDsProp;
+   /// Property: ROB source IDs for RoIB
+   std::vector<uint32_t> m_sourceIDsRoIBProp;
    /// Sub-detector type
-   eformat::SubDetector m_subDetector;
+   const eformat::SubDetector m_subDetector;
    /// Source ID converter
-   L1CaloSrcIdMap* m_srcIdMap;
-   /// Sub-block for neutral format
-   CpmRoiSubBlockV1* m_subBlock;
-   /// CPM RoI map
-   CpmRoiMap m_roiMap;
-   /// ROD Status words
-   std::vector<uint32_t>* m_rodStatus;
-   /// ROD status map
-   std::map<uint32_t, std::vector<uint32_t>* > m_rodStatusMap;
-   /// Event assembler
-   FullEventAssembler<L1CaloSrcIdMap>* m_fea;
-
+   const L1CaloSrcIdMap m_srcIdMap;
 };
 
 } // end namespace
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx
index 270c25c0818764ad40e0c783c15a892c8b1a91cf..da54e63937f58485f4f023ec22dda22b260ff310 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.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
 */
 
 
@@ -43,8 +43,8 @@ CpmRoiByteStreamV2Tool::CpmRoiByteStreamV2Tool(const std::string &type,
     : AthAlgTool(type, name, parent),
       m_robDataProvider("ROBDataProviderSvc", name),
       m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
-      m_crates(4), m_modules(14), m_srcIdMap(0), m_subBlock(0), m_rodStatus(0),
-      m_fea(0)
+      m_crates(4), m_modules(14),
+      m_subDetector (eformat::TDAQ_CALO_CLUSTER_PROC_ROI)
 {
     declareInterface<CpmRoiByteStreamV2Tool>(this);
 
@@ -56,9 +56,9 @@ CpmRoiByteStreamV2Tool::CpmRoiByteStreamV2Tool(const std::string &type,
                     "Offset of CP crate numbers in RDOs");
 
     // Properties for reading bytestream only
-    declareProperty("ROBSourceIDs",       m_sourceIDs,
+    declareProperty("ROBSourceIDs",       m_sourceIDsProp,
                     "ROB fragment source identifiers");
-    declareProperty("ROBSourceIDsRoIB",   m_sourceIDsRoIB,
+    declareProperty("ROBSourceIDsRoIB",   m_sourceIDsRoIBProp,
                     "ROB fragment source identifiers for RoIBs");
 
     // Properties for writing bytestream only
@@ -89,33 +89,11 @@ CpmRoiByteStreamV2Tool::~CpmRoiByteStreamV2Tool()
 
 StatusCode CpmRoiByteStreamV2Tool::initialize()
 {
-    msg(MSG::INFO) << "Initializing " << name() << " - package version "
-                   << PACKAGE_VERSION << endmsg;
+    ATH_MSG_INFO ("Initializing " << name() << " - package version "
+                  << PACKAGE_VERSION);
 
-    StatusCode sc = m_errorTool.retrieve();
-    if (sc.isFailure())
-    {
-        msg(MSG::ERROR) << "Failed to retrieve tool " << m_errorTool << endmsg;
-        return sc;
-    }
-    else msg(MSG::INFO) << "Retrieved tool " << m_errorTool << endmsg;
-
-    m_subDetector = eformat::TDAQ_CALO_CLUSTER_PROC_ROI;
-    m_srcIdMap    = new L1CaloSrcIdMap();
-    m_rodStatus   = new std::vector<uint32_t>(2);
-    m_subBlock    = new CpmRoiSubBlockV2();
-    m_fea         = new FullEventAssembler<L1CaloSrcIdMap>();
-    return StatusCode::SUCCESS;
-}
-
-// Finalize
+    ATH_CHECK( m_errorTool.retrieve() );
 
-StatusCode CpmRoiByteStreamV2Tool::finalize()
-{
-    delete m_fea;
-    delete m_subBlock;
-    delete m_rodStatus;
-    delete m_srcIdMap;
     return StatusCode::SUCCESS;
 }
 
@@ -123,7 +101,7 @@ StatusCode CpmRoiByteStreamV2Tool::finalize()
 
 StatusCode CpmRoiByteStreamV2Tool::convert(
     const std::string& sgKey,
-    DataVector<LVL1::CPMTobRoI> *const collection)
+    DataVector<LVL1::CPMTobRoI> *const collection) const
 {
  const std::vector<uint32_t>& vID(sourceIDs(sgKey));
   // // get ROB fragments
@@ -135,11 +113,14 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
 StatusCode CpmRoiByteStreamV2Tool::convert(
     const IROBDataProviderSvc::VROBFRAG &robFrags,
-    DataVector<LVL1::CPMTobRoI> *const roiCollection)
+    DataVector<LVL1::CPMTobRoI> *const roiCollection) const
 {
     const bool debug = msgLvl(MSG::DEBUG);
     if (debug) msg(MSG::DEBUG);
 
+    // Sub-block for neutral format
+    CpmRoiSubBlockV2 subBlock;
+
     // Loop over ROB fragments
 
     int robCount = 0;
@@ -196,12 +177,12 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
         // Check identifier
         const uint32_t sourceID = (*rob)->rod_source_id();
-        if (m_srcIdMap->getRobID(sourceID) != robid           ||
-                m_srcIdMap->subDet(sourceID)   != m_subDetector   ||
-                m_srcIdMap->daqOrRoi(sourceID) != 1               ||
-                (m_srcIdMap->slink(sourceID) != 0 && m_srcIdMap->slink(sourceID) != 2) ||
-                m_srcIdMap->crate(sourceID)    <  m_crateOffsetHw ||
-                m_srcIdMap->crate(sourceID)    >= m_crateOffsetHw + m_crates)
+        if (m_srcIdMap.getRobID(sourceID) != robid           ||
+                m_srcIdMap.subDet(sourceID)   != m_subDetector   ||
+                m_srcIdMap.daqOrRoi(sourceID) != 1               ||
+                (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) ||
+                m_srcIdMap.crate(sourceID)    <  m_crateOffsetHw ||
+                m_srcIdMap.crate(sourceID)    >= m_crateOffsetHw + m_crates)
         {
             m_errorTool->rodError(robid, L1CaloSubBlock::ERROR_ROD_ID);
             if (debug)
@@ -214,16 +195,16 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
         // Check minor version
         const int minorVersion = (*rob)->rod_version() & 0xffff;
-        if (minorVersion <= m_srcIdMap->minorVersionPreLS1())
+        if (minorVersion <= m_srcIdMap.minorVersionPreLS1())
         {
             if (debug) msg() << "Skipping pre-LS1 data" << endmsg;
             continue;
         }
-        const int rodCrate = m_srcIdMap->crate(sourceID);
+        const int rodCrate = m_srcIdMap.crate(sourceID);
         if (debug)
         {
             msg() << "Treating crate " << rodCrate
-                  << " slink " << m_srcIdMap->slink(sourceID) << endmsg;
+                  << " slink " << m_srcIdMap.slink(sourceID) << endmsg;
         }
 
         // First word may be User Header
@@ -250,22 +231,22 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
             if (L1CaloSubBlock::wordType(*payload) == L1CaloSubBlock::HEADER)
             {
-                m_subBlock->clear();
-                payload = m_subBlock->read(payload, payloadEnd);
+                subBlock.clear();
+                payload = subBlock.read(payload, payloadEnd);
                 if (debug)
                 {
-                    msg() << "CPM RoI sub-block: Crate " << m_subBlock->crate()
-                          << "  Module " << m_subBlock->module() << endmsg;
+                    msg() << "CPM RoI sub-block: Crate " << subBlock.crate()
+                          << "  Module " << subBlock.module() << endmsg;
                 }
                 // Unpack sub-block
-                if (m_subBlock->dataWords() && !m_subBlock->unpack())
+                if (subBlock.dataWords() && !subBlock.unpack())
                 {
                     if (debug)
                     {
-                        std::string errMsg(m_subBlock->unpackErrorMsg());
+                        std::string errMsg(subBlock.unpackErrorMsg());
                         msg() << "CPM RoI sub-block unpacking failed: " << errMsg << endmsg;
                     }
-                    rodErr = m_subBlock->unpackErrorCode();
+                    rodErr = subBlock.unpackErrorCode();
                     break;
                 }
                 const int numChips = 8;
@@ -277,7 +258,7 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
                     {
                         for (int type = 0; type < numTypes; ++type)
                         {
-                            const LVL1::CPMTobRoI roi = m_subBlock->roi(chip, loc, type);
+                            const LVL1::CPMTobRoI roi = subBlock.roi(chip, loc, type);
                             if (roi.energy() || roi.isolation())
                             {
                                 roiCollection->push_back(new LVL1::CPMTobRoI(roi));
@@ -351,34 +332,38 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
 StatusCode CpmRoiByteStreamV2Tool::convert(
     const DataVector<LVL1::CPMTobRoI> *const roiCollection,
-    RawEventWrite *const re)
+    RawEventWrite *const re) const
 {
     const bool debug = msgLvl(MSG::DEBUG);
     if (debug) msg(MSG::DEBUG);
 
     // Clear the event assembler
-
-    m_fea->clear();
-    const uint16_t minorVersion = m_srcIdMap->minorVersion();
-    m_fea->setRodMinorVersion(minorVersion);
-    m_rodStatusMap.clear();
+    FullEventAssembler<L1CaloSrcIdMap> fea;
+    const uint16_t minorVersion = m_srcIdMap.minorVersion();
+    fea.setRodMinorVersion(minorVersion);
 
     // Pointer to ROD data vector
 
     FullEventAssembler<L1CaloSrcIdMap>::RODDATA *theROD = 0;
 
+    // Sub-block for neutral format
+    CpmRoiSubBlockV2 subBlock;
+
     // Set up the container map
 
-    setupCpmRoiMap(roiCollection);
+    // CPM RoI map
+    CpmRoiMap roiMap;
+    setupCpmRoiMap(roiCollection, roiMap);
+
     if (debug)
     {
         msg() << "Number of RoIs to be written = " << roiCollection->size()
-              << " (collection), " << m_roiMap.size() << " (map)"
+              << " (collection), " << roiMap.size() << " (map)"
               << endmsg;
     }
     int count = 0;
-    CpmRoiMap::const_iterator mapIter    = m_roiMap.begin();
-    CpmRoiMap::const_iterator mapIterEnd = m_roiMap.end();
+    CpmRoiMap::const_iterator mapIter    = roiMap.begin();
+    CpmRoiMap::const_iterator mapIterEnd = roiMap.end();
 
     // Loop over data
 
@@ -407,15 +392,14 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
                           << "Data Version/Format: " << m_version
                           << " " << m_dataFormat << endmsg;
                 }
-                const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi,
+                const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
                                           m_subDetector);
-                theROD = m_fea->getRodData(rodIdCpm);
+                theROD = fea.getRodData(rodIdCpm);
                 if (neutralFormat)
                 {
                     const L1CaloUserHeader userHeader;
                     theROD->push_back(userHeader.header());
                 }
-                m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus));
             }
             if (debug) msg() << "Module " << module << endmsg;
 
@@ -423,8 +407,8 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
             if (neutralFormat)
             {
-                m_subBlock->clear();
-                m_subBlock->setRoiHeader(m_version, hwCrate, module);
+                subBlock.clear();
+                subBlock.setRoiHeader(m_version, hwCrate, module);
             }
 
             // Find CPM RoIs for this module
@@ -438,7 +422,7 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
                 if (roi->cpm()   > module) break;
                 if (roi->energy() || roi->isolation())
                 {
-                    if (neutralFormat) m_subBlock->fillRoi(*roi);
+                    if (neutralFormat) subBlock.fillRoi(*roi);
                     else theROD->push_back(roi->roiWord());
                     ++count;
                 }
@@ -448,7 +432,7 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
             if (neutralFormat)
             {
-                if ( !m_subBlock->pack())
+                if ( !subBlock.pack())
                 {
                     msg(MSG::ERROR) << "CPMTobRoI sub-block packing failed" << endmsg;
                     return StatusCode::FAILURE;
@@ -456,9 +440,9 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
                 if (debug)
                 {
                     msg() << "CPMTobRoI sub-block data words: "
-                          << m_subBlock->dataWords() << endmsg;
+                          << subBlock.dataWords() << endmsg;
                 }
-                m_subBlock->write(theROD);
+                subBlock.write(theROD);
             }
         }
     }
@@ -469,55 +453,73 @@ StatusCode CpmRoiByteStreamV2Tool::convert(
 
     // Fill the raw event
 
-    m_fea->fill(re, msg());
+    fea.fill(re, msg());
     if (debug) msg() << MSG::dec; // fill seems to leave it in hex
 
-    // Set ROD status words
-
-    //L1CaloRodStatus::setStatus(re, m_rodStatusMap, m_srcIdMap);
-
     return StatusCode::SUCCESS;
 }
 
 // Return reference to vector with all possible Source Identifiers
 
-const std::vector<uint32_t> &CpmRoiByteStreamV2Tool::sourceIDs(
-    const std::string &sgKey)
+std::vector<uint32_t> CpmRoiByteStreamV2Tool::makeSourceIDs (bool roiDaq) const
 {
-    const std::string flag("RoIB");
-    const std::string::size_type pos = sgKey.find(flag);
-    const bool roiDaq =
-        (pos == std::string::npos || pos != sgKey.length() - flag.length());
-    const bool empty  = (roiDaq) ? m_sourceIDs.empty() : m_sourceIDsRoIB.empty();
-    if (empty)
-    {
+  std::vector<uint32_t> sourceIDs;
+
+  if (roiDaq) {
+    sourceIDs = m_sourceIDsProp;
+  }
+  else {
+    sourceIDs = m_sourceIDsRoIBProp;
+  }
+
+  if (sourceIDs.empty()) {
         const int maxCrates = m_crates + m_crateOffsetHw;
-        const int maxSlinks = m_srcIdMap->maxSlinks();
+        const int maxSlinks = m_srcIdMap.maxSlinks();
         for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate)
         {
             for (int slink = 0; slink < maxSlinks; ++slink)
             {
                 const int daqOrRoi = 1;
-                const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi,
+                const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
                                        m_subDetector);
-                const uint32_t robId = m_srcIdMap->getRobID(rodId);
+                const uint32_t robId = m_srcIdMap.getRobID(rodId);
                 if (roiDaq)
                 {
-                    if (slink < 2) m_sourceIDs.push_back(robId);
+                    if (slink < 2) sourceIDs.push_back(robId);
                 }
-                else if (slink >= 2) m_sourceIDsRoIB.push_back(robId);
+                else if (slink >= 2) sourceIDs.push_back(robId);
             }
         }
+
+  }
+  return sourceIDs;
+}
+
+const std::vector<uint32_t> &CpmRoiByteStreamV2Tool::sourceIDs(
+    const std::string &sgKey) const
+{
+    const std::string flag("RoIB");
+    const std::string::size_type pos = sgKey.find(flag);
+    const bool roiDaq =
+        (pos == std::string::npos || pos != sgKey.length() - flag.length());
+
+    if (roiDaq) {
+      static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq);
+      return sourceIDs;
+    }
+    else {
+      static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq);
+      return sourceIDsRoIB;
     }
-    return (roiDaq) ? m_sourceIDs : m_sourceIDsRoIB;
 }
 
 // Set up CPM RoI map
 
 void CpmRoiByteStreamV2Tool::setupCpmRoiMap(const CpmRoiCollection *
-        const roiCollection)
+        const roiCollection,
+        CpmRoiMap& roiMap) const
 {
-    m_roiMap.clear();
+    roiMap.clear();
     if (roiCollection)
     {
         CpmRoiCollection::const_iterator pos  = roiCollection->begin();
@@ -531,7 +533,7 @@ void CpmRoiByteStreamV2Tool::setupCpmRoiMap(const CpmRoiCollection *
             const int chip = roi->chip();
             const int loc = roi->location() >> 2;
             const uint32_t key = (((((((crate << 4) | cpm) << 3) | chip) << 1) | loc) << 1) | type;
-            m_roiMap.insert(std::make_pair(key, roi));
+            roiMap.insert(std::make_pair(key, roi));
         }
     }
 }
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h
index 21c816f972ddd951978f6fe2829a1f8ac7b65a66..fc56c0a6a8b317d8c8d46cd1f74c728eb6e17bac 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h
@@ -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
 */
 
 #ifndef TRIGT1CALOBYTESTREAM_CPMROIBYTESTREAMV2TOOL_H
@@ -11,6 +11,7 @@
 #include <string>
 #include <vector>
 
+#include "L1CaloSrcIdMap.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
 #include "ByteStreamData/RawEvent.h"
@@ -52,21 +53,20 @@ class CpmRoiByteStreamV2Tool : public AthAlgTool {
    /// AlgTool InterfaceID
    static const InterfaceID& interfaceID();
 
-   virtual StatusCode initialize();
-   virtual StatusCode finalize();
+   virtual StatusCode initialize() override;
 
    /// Convert ROB fragments to CPM RoIs
    StatusCode convert(const std::string& robFrags,
-                      DataVector<LVL1::CPMTobRoI>* roiCollection);
+                      DataVector<LVL1::CPMTobRoI>* roiCollection) const;
    StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                      DataVector<LVL1::CPMTobRoI>* roiCollection);
+                      DataVector<LVL1::CPMTobRoI>* roiCollection) const;
 
    /// Convert CPM RoI to bytestream
    StatusCode convert(const DataVector<LVL1::CPMTobRoI>* roiCollection,
-                      RawEventWrite* re);
+                      RawEventWrite* re) const;
 
    /// Return reference to vector with all possible Source Identifiers
-   const std::vector<uint32_t>& sourceIDs(const std::string& sgKey);
+   const std::vector<uint32_t>& sourceIDs(const std::string& sgKey) const;
 
  private:
 
@@ -76,54 +76,46 @@ class CpmRoiByteStreamV2Tool : public AthAlgTool {
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   std::vector<uint32_t> makeSourceIDs (bool roiDaq) const;
+
    /// Set up CPM RoI map
-   void setupCpmRoiMap(const CpmRoiCollection* roiCollection);
+   void setupCpmRoiMap(const CpmRoiCollection* roiCollection,
+                       CpmRoiMap& roiMap) const;
 
    ServiceHandle<IROBDataProviderSvc> m_robDataProvider;
-   /// Error collection tool
+   /// Property: Error collection tool
    ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool;
 
-   /// Hardware crate number offset
+   /// Property: Hardware crate number offset
    int m_crateOffsetHw;
-   /// Software crate number offset
+   /// Property: Software crate number offset
    int m_crateOffsetSw;
-   /// Sub_block header version
+   /// Property: Sub_block header version
    int m_version;
-   /// Data compression format
+   /// Property: Data compression format
    int m_dataFormat;
    /// Number of crates
-   int m_crates;
+   const int m_crates;
    /// Number of CPM modules per crate
-   int m_modules;
-   /// Number of slinks per crate when writing out bytestream
+   const int m_modules;
+   /// Property: Number of slinks per crate when writing out bytestream
    int m_slinks;
-   /// Minimum crate number when writing out bytestream
+   /// Property: Minimum crate number when writing out bytestream
    int m_crateMin;
-   /// Maximum crate number when writing out bytestream
+   /// Property: Maximum crate number when writing out bytestream
    int m_crateMax;
-   /// ROB source IDs
-   std::vector<uint32_t> m_sourceIDs;
-   /// ROB source IDs for RoIB
-   std::vector<uint32_t> m_sourceIDsRoIB;
+   /// Property: ROB source IDs
+   std::vector<uint32_t> m_sourceIDsProp;
+   /// Property: ROB source IDs for RoIB
+   std::vector<uint32_t> m_sourceIDsRoIBProp;
    /// Sub-detector type
-   eformat::SubDetector m_subDetector;
+   const eformat::SubDetector m_subDetector;
    /// Source ID converter
-   L1CaloSrcIdMap* m_srcIdMap;
-   /// Sub-block for neutral format
-   CpmRoiSubBlockV2* m_subBlock;
-   /// CPM RoI map
-   CpmRoiMap m_roiMap;
-   /// ROD Status words
-   std::vector<uint32_t>* m_rodStatus;
-   /// ROD status map
-   std::map<uint32_t, std::vector<uint32_t>* > m_rodStatusMap;
-   /// Event assembler
-   FullEventAssembler<L1CaloSrcIdMap>* m_fea;
-
-   // M7 format follows old specification, so we have two zeros 
+   const L1CaloSrcIdMap m_srcIdMap;
+
+   // Property: M7 format follows old specification, so we have two zeros 
    // as most significant bits instead of 0xa
    bool m_isM7Format;
-
 };
 
 } // end namespace