diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx
index 8d61b688f7cfc20289e6443b5e768b70c5e4c33a..0fe55efb7970f7e29b6fea25389ebdd306845311 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx
@@ -27,37 +27,12 @@ RpdSubtractCentroidTool::RpdSubtractCentroidTool(const std::string& name) :
   asg::AsgTool(name),
   m_name(name),
   m_init(false),
-  m_validInput(false),
-  m_runNumber(0),
-  m_lumiBlock(0),
   m_xCenter({0, 0}),
   m_yCenter({0, 0}),
   m_xyRotAngle({0, 0}),
   m_yzRotAngle({0, 0}),
   m_xCentAvg({0, 0}),
-  m_yCentAvg({0, 0}),
-  m_status({1 << ValidBit, 1 << ValidBit}), // calculation is valid by default
-  m_ampSum({0, 0}),
-  m_ampSumSub({0, 0}),
-  m_ampSub({
-    std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols)),
-    std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols))
-  }),
-  m_xCentUnsub({0, 0}),
-  m_yCentUnsub({0, 0}),
-  m_xCentUnsubCor({0, 0}),
-  m_yCentUnsubCor({0, 0}),
-  m_xCent({0, 0}),
-  m_yCent({0, 0}),
-  m_xCentCor({0, 0}),
-  m_yCentCor({0, 0}),
-  m_xCentRowUnsub({std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)}),
-  m_yCentColUnsub({std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)}),
-  m_xCentRow({std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)}),
-  m_yCentCol({std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)}),
-  m_xStdev({0, 0}),
-  m_yStdev({0, 0}),
-  m_xyCov({0, 0})
+  m_yCentAvg({0, 0})
 {
 #ifndef XAOD_STANDALONE
   declareInterface<IZdcAnalysisTool>(this);
@@ -168,8 +143,49 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
   SG::ReadDecorHandle<xAOD::ZdcModuleContainer, float> zdcFinalEnergyHandle(m_ZDCFinalEnergyKey);
   SG::ReadDecorHandle<xAOD::ZdcModuleContainer, unsigned int> zdcStatusHandle(m_ZDCStatusKey);
 
-  m_runNumber = eventInfo->runNumber();
-  m_lumiBlock = eventInfo->lumiBlock();
+  // unsigned int runNumber = eventInfo->runNumber();
+  unsigned int lumiBlock = eventInfo->lumiBlock();
+
+  // Analysis results
+  // ================
+  std::array<unsigned int, 2> status = {1 << ValidBit, 1 << ValidBit}; // calculation is valid by default
+  // the amplitude sum on the given side
+  std::array<float, 2> ampSum = {0, 0};
+  // the subtracted amplitude sum on the given side
+  std::array<float, 2> ampSumSub = {0, 0};
+  // the subtracted amplitude for each channel first index row, second column
+  std::array<std::vector<std::vector<float> >, 2> ampSub = {
+    std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols, 0)),
+    std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols, 0))
+  };
+  // x centroid, average not subtracted
+  std::array<float, 2> xCentUnsub = {0, 0}; 
+  // y centroid, average not subtracted
+  std::array<float, 2> yCentUnsub = {0, 0}; 
+  // x centroid, average not subtracted, with geometry corrections
+  std::array<float, 2> xCentUnsubCor = {0, 0}; 
+  // y centroid, average not subtracted, with geometry corrections
+  std::array<float, 2> yCentUnsubCor = {0, 0}; 
+  // x centroid, subtracted
+  std::array<float, 2> xCent = {0, 0}; 
+  // y centroid, subtracted
+  std::array<float, 2> yCent = {0, 0}; 
+  // x centroid, subtracted, with geometry corrections
+  std::array<float, 2> xCentCor = {0, 0}; 
+  // y centroid, subtracted, with geometry corrections
+  std::array<float, 2> yCentCor = {0, 0}; 
+  // the x centroid for each row, using unsubtracted amplitudes (diagnostic)
+  std::array<std::vector<float>, 2> xCentRowUnsub = {std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)};
+  // the y centroid for each column, using unsubtracted amplitudes (diagnostic)
+  std::array<std::vector<float>, 2> yCentColUnsub = {std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)};
+  // the x centroid for each row (diagnostic)
+  std::array<std::vector<float>, 2> xCentRow = {std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)};
+  // the y centroid for each column (diagnostic)
+  std::array<std::vector<float>, 2> yCentCol = {std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)};
+  // x standard deviation
+  std::array<float, 2> xStdev = {0, 0};
+  // y standard deviation
+  std::array<float, 2> yStdev = {0, 0};
   
   std::array<std::vector<std::vector<RpdChannelData>>, 2> rpdChannelData = {
     std::vector<std::vector<RpdChannelData>>(4, std::vector<RpdChannelData>(4)),
@@ -180,10 +196,10 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
   std::array<float, 2> zdcFinalEnergy;
 
   ATH_MSG_DEBUG("Starting event processing");
-  ATH_MSG_DEBUG("LB=" << m_lumiBlock);
+  ATH_MSG_DEBUG("LB=" << lumiBlock);
   
   ATH_MSG_DEBUG("Processing modules");
-  for (const auto zdcModule : moduleContainer) {
+  for (const auto &zdcModule : moduleContainer) {
     if (zdcModule->zdcType() == 1) {
       //  This is RPD data in Run 3
       //
@@ -196,14 +212,11 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
       } else if (zdcModule->zdcSide() == 1) {
         side = 1;
       } else {
-        ATH_MSG_WARNING("Invalid side value found for module number: " << zdcModule->zdcModule() << ", side value = " << side);
         continue;
       }
       
       const unsigned int &rpdChannel = zdcModule->zdcChannel();
 
-      ATH_MSG_DEBUG("RPD side " << side << " chan " << rpdChannel);
-
       if (rpdChannel > 15) {
         //
         //  The data is somehow corrupt, spit out an error
@@ -226,58 +239,56 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
     }
   }
 
-  for (const auto zdcSum: moduleSumContainer) {
+  for (const auto &zdcSum: moduleSumContainer) {
     int side = -1;
     if (zdcSum->zdcSide() == -1) {
       side = 0;
     } else if (zdcSum->zdcSide() == 1) {
       side = 1;
     } else {
-      ATH_MSG_WARNING("Invalid side value found for module number: " << zdcSum->zdcModule() << ", side value = " << side);
       continue;
     }
     rpdSideStatus.at(side) = rpdSideStatusHandle(*zdcSum);
     zdcSideStatus.at(side) = zdcStatusHandle(*zdcSum);
     zdcFinalEnergy.at(side) = zdcFinalEnergyHandle(*zdcSum);
-
   }
 
   // check values and set status bits accordingly
   for (int side : {0, 1}) {
     if (zdcSideStatus.at(side)) {
-      m_status.at(side) |= 1 << ZDCValidBit;
+      status.at(side) |= 1 << ZDCValidBit;
     } else {
       // => centroid calculation is invalid
-      m_status.at(side) &= ~(1 << ValidBit);
+      status.at(side) &= ~(1 << ValidBit);
     }
     if (zdcFinalEnergy.at(side) > m_maxZDCEnergy.at(side)) {
-      m_status.at(side) |= 1 << ExcessiveZDCEnergyBit;
+      status.at(side) |= 1 << ExcessiveZDCEnergyBit;
       // => centroid calculation is invalid
-      m_status.at(side) &= ~(1 << ValidBit);
+      status.at(side) &= ~(1 << ValidBit);
     }
     if (zdcFinalEnergy.at(side) < m_minZDCEnergy.at(side)) {
-      m_status.at(side) |= 1 << MinimumZDCEnergyBit;
+      status.at(side) |= 1 << MinimumZDCEnergyBit;
       // => centroid calculation is invalid
-      m_status.at(side) &= ~(1 << ValidBit);
+      status.at(side) &= ~(1 << ValidBit);
     }
     bool rpdPileup = rpdSideStatus.at(side) & (1 << RPDDataAnalyzer::SideOutOfTimePileupBit);
     if (rpdPileup) {
-      m_status.at(side) |= 1 << PileupBit;
+      status.at(side) |= 1 << PileupBit;
     }
     bool rpdAnaValid = rpdSideStatus.at(side) & (1 << RPDDataAnalyzer::SideValidBit);
     if (rpdAnaValid) {
-      m_status.at(side) |= 1 << RPDValidBit;
+      status.at(side) |= 1 << RPDValidBit;
     } else {
       // => centroid calculation is invalid
-      m_status.at(side) &= ~(1 << ValidBit);
+      status.at(side) &= ~(1 << ValidBit);
     }
     // check channels of RPD
     for (int row = 0; row < m_nRows; row++) {
       for (int col = 0; col < m_nCols; col++) {
         if (rpdChannelData.at(side).at(row).at(col).pileupFrac > m_pileupMaxFrac.at(side)) {
-          m_status.at(side) |= 1 << ExcessivePileupBit;
+          status.at(side) |= 1 << ExcessivePileupBit;
           // => centroid calculation is invalid
-          m_status.at(side) &= ~(1 << ValidBit);
+          status.at(side) &= ~(1 << ValidBit);
         }
       }
     }
@@ -291,12 +302,12 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
           // top row -> nothing to subtract
           float amplitudeSubtr = rpdChannelData.at(side).at(row).at(col).amplitude;
           rpdChannelData.at(side).at(row).at(col).amplitudeSubtr = amplitudeSubtr;
-          m_ampSub.at(side).at(row).at(col) = amplitudeSubtr;
+          ampSub.at(side).at(row).at(col) = amplitudeSubtr;
         } else {
           // other rows -> subtract the tile above this one
           float amplitudeSubtr = rpdChannelData.at(side).at(row).at(col).amplitude - rpdChannelData.at(side).at(row + 1).at(col).amplitude;
           rpdChannelData.at(side).at(row).at(col).amplitudeSubtr = amplitudeSubtr;
-          m_ampSub.at(side).at(row).at(col) = amplitudeSubtr;
+          ampSub.at(side).at(row).at(col) = amplitudeSubtr;
         }
       }
     }
@@ -325,38 +336,38 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
         rowSums.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr;
         colSumsUnsub.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitude;
         colSums.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr;
-        m_ampSum.at(side) += rpdChannelData.at(side).at(row).at(col).amplitude;
-        m_ampSumSub.at(side) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr;
+        ampSum.at(side) += rpdChannelData.at(side).at(row).at(col).amplitude;
+        ampSumSub.at(side) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr;
       }
     }
   }
 
   // check for any zero values in sum -> avoid dividing by zero; negative total sum is also bad
   for (int side : {0, 1}) {
-    if (m_ampSum.at(side) <= 0) {
-      m_status.at(side) |= 1 << ZeroSumBit;
+    if (ampSum.at(side) <= 0) {
+      status.at(side) |= 1 << ZeroSumBit;
       // => unsub centroid calculation is invalid
-      m_status.at(side) &= ~(1 << ValidBit);
+      status.at(side) &= ~(1 << ValidBit);
     }
-    if (m_ampSumSub.at(side) <= 0) {
-      m_status.at(side) |= 1 << ZeroSumBit;
+    if (ampSumSub.at(side) <= 0) {
+      status.at(side) |= 1 << ZeroSumBit;
       // => centroid calculation is invalid
-      m_status.at(side) &= ~(1 << ValidBit);
+      status.at(side) &= ~(1 << ValidBit);
     }
     for (int row = 0; row < m_nRows; row++) {
       if (rowSumsUnsub.at(side).at(row) <= 0) {
-        m_status.at(side) |= 1 << (ZeroSumRow0Bit + row);
+        status.at(side) |= 1 << (ZeroSumRow0Bit + row);
       }
       if (rowSums.at(side).at(row) <= 0) {
-        m_status.at(side) |= 1 << (ZeroSumRow0Bit + row);
+        status.at(side) |= 1 << (ZeroSumRow0Bit + row);
       }
     }
     for (int col = 0; col < m_nCols; col++) {
       if (colSumsUnsub.at(side).at(col) <= 0) {
-        m_status.at(side) |= 1 << (ZeroSumCol0Bit + col);
+        status.at(side) |= 1 << (ZeroSumCol0Bit + col);
       }
       if (colSums.at(side).at(col) <= 0) {
-        m_status.at(side) |= 1 << (ZeroSumCol0Bit + col);
+        status.at(side) |= 1 << (ZeroSumCol0Bit + col);
       }
     }
   }
@@ -366,10 +377,10 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
     for (int row = 0; row < m_nRows; row++) {
       for (int col = 0; col < m_nCols; col++) {
         const float &amplitudeSubtr = rpdChannelData.at(side).at(row).at(col).amplitudeSubtr;
-        if (amplitudeSubtr < 0 && -amplitudeSubtr/m_ampSumSub.at(side) < m_subAmpUnderflowFrac.at(side)) {
-          m_status.at(side) |= 1 << ExcessivePileupBit;
+        if (amplitudeSubtr < 0 && -amplitudeSubtr/ampSumSub.at(side) < m_subAmpUnderflowFrac.at(side)) {
+          status.at(side) |= 1 << ExcessivePileupBit;
           // => centroid calculation is invalid
-          m_status.at(side) &= ~(1 << ValidBit);
+          status.at(side) &= ~(1 << ValidBit);
         }
       }
     }
@@ -378,21 +389,21 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
   // calculate centroid
   for (int side : {0, 1}) {
     for (int col = 0; col < m_nCols; col++) {
-      if (m_ampSum.at(side) > 0) {
-        m_xCentUnsub.at(side) += colSumsUnsub.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/m_ampSum.at(side);
+      if (ampSum.at(side) > 0) {
+        xCentUnsub.at(side) += colSumsUnsub.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/ampSum.at(side);
       }
-      if (m_ampSumSub.at(side) > 0) {
-        m_xCent.at(side) += colSums.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/m_ampSumSub.at(side);
+      if (ampSumSub.at(side) > 0) {
+        xCent.at(side) += colSums.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/ampSumSub.at(side);
       }
     }  
   }
   for (int side : {0, 1}) {
     for (int row = 0; row < m_nRows; row++) {
-      if (m_ampSum.at(side) > 0) {
-        m_yCentUnsub.at(side) += rowSumsUnsub.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/m_ampSum.at(side);
+      if (ampSum.at(side) > 0) {
+        yCentUnsub.at(side) += rowSumsUnsub.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/ampSum.at(side);
       }
-      if (m_ampSumSub.at(side) > 0) {
-        m_yCent.at(side) += rowSums.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/m_ampSumSub.at(side);
+      if (ampSumSub.at(side) > 0) {
+        yCent.at(side) += rowSums.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/ampSumSub.at(side);
       }
     }  
   }
@@ -402,16 +413,16 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
     for (int row = 0; row < m_nRows; row++) {
       for (int col = 0; col < m_nCols; col++) {
         if (rowSumsUnsub.at(side).at(row) > 0) {
-          m_xCentRowUnsub.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).xposRel/rowSumsUnsub.at(side).at(row);
+          xCentRowUnsub.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).xposRel/rowSumsUnsub.at(side).at(row);
         }
         if (rowSums.at(side).at(row) > 0) {
-          m_xCentRow.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).xposRel/rowSums.at(side).at(row);
+          xCentRow.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).xposRel/rowSums.at(side).at(row);
         }
         if (colSumsUnsub.at(side).at(col) > 0) {
-          m_yCentColUnsub.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).yposRel/colSumsUnsub.at(side).at(col);
+          yCentColUnsub.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).yposRel/colSumsUnsub.at(side).at(col);
         }
         if (colSums.at(side).at(col) > 0) {
-          m_yCentCol.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).yposRel/colSums.at(side).at(col);
+          yCentCol.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).yposRel/colSums.at(side).at(col);
         }
       }
     }
@@ -419,20 +430,20 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
   
   // calculate standard deviation of row x / col y centroids
   for (int side : {0, 1}) {
-    m_xStdev.at(side) = TMath::RMS(m_xCentRow.at(side).begin(), m_xCentRow.at(side).end());
-    m_yStdev.at(side) = TMath::RMS(m_yCentCol.at(side).begin(), m_yCentCol.at(side).end());
+    xStdev.at(side) = TMath::RMS(xCentRow.at(side).begin(), xCentRow.at(side).end());
+    yStdev.at(side) = TMath::RMS(yCentCol.at(side).begin(), yCentCol.at(side).end());
   }
 
   // use information from geometry (TODO: and calibration) to get centroid in beamline coordinates
   for (int side : {0, 1}) {
-    float x = m_xCentUnsubCor.at(side);
-    float y = m_yCentUnsubCor.at(side);
-    m_xCentUnsubCor.at(side) = geometryCorrectionX(x, y, side);
-    m_yCentUnsubCor.at(side) = geometryCorrectionY(x, y, side);
-    x = m_xCentCor.at(side);
-    y = m_yCentCor.at(side);
-    m_xCentCor.at(side) = geometryCorrectionX(x, y, side);
-    m_yCentCor.at(side) = geometryCorrectionY(x, y, side);
+    float x = xCentUnsubCor.at(side);
+    float y = yCentUnsubCor.at(side);
+    xCentUnsubCor.at(side) = geometryCorrectionX(x, y, side);
+    yCentUnsubCor.at(side) = geometryCorrectionY(x, y, side);
+    x = xCentCor.at(side);
+    y = yCentCor.at(side);
+    xCentCor.at(side) = geometryCorrectionX(x, y, side);
+    yCentCor.at(side) = geometryCorrectionY(x, y, side);
   }
 
   ATH_MSG_DEBUG("Finishing event processing");
@@ -456,29 +467,28 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine
   SG::WriteDecorHandle<xAOD::ZdcModuleContainer, float> yDetColCentroidStdevHandle(m_yDetColCentroidStdevKey);
   SG::WriteDecorHandle<xAOD::ZdcModuleContainer, unsigned int> centroidStatusHandle(m_centroidStatusKey);
   
-  for (const auto zdcSum: moduleSumContainer) {
+  for (const auto &zdcSum: moduleSumContainer) {
     int side = -1;
     if (zdcSum->zdcSide() == -1) {
       side = 0;
     } else if (zdcSum->zdcSide() == 1) {
       side = 1;
     } else {
-      ATH_MSG_WARNING("Invalid side value found for module number: " << zdcSum->zdcModule() << ", side value = " << side);
       continue;
     }
-    rpdSubAmp(*zdcSum) = m_ampSub.at(side);
-    rpdSubAmpSum(*zdcSum) = m_ampSumSub.at(side);
-    xCentroidHandle(*zdcSum) = m_xCentCor.at(side);
-    yCentroidHandle(*zdcSum) = m_yCentCor.at(side);
-    xDetCentroidHandle(*zdcSum) = m_xCent.at(side);
-    yDetCentroidHandle(*zdcSum) = m_yCent.at(side);
-    xDetCentroidUnsubHandle(*zdcSum) = m_xCentUnsub.at(side);
-    yDetCentroidUnsubHandle(*zdcSum) = m_yCentUnsub.at(side);
-    xDetRowCentroidHandle(*zdcSum) = m_xCentRow.at(side);
-    yDetColCentroidHandle(*zdcSum) = m_yCentCol.at(side);
-    xDetRowCentroidStdevHandle(*zdcSum) = m_xStdev.at(side);
-    yDetColCentroidStdevHandle(*zdcSum) = m_yStdev.at(side);
-    centroidStatusHandle(*zdcSum) = m_status.at(side);
+    rpdSubAmp(*zdcSum) = ampSub.at(side);
+    rpdSubAmpSum(*zdcSum) = ampSumSub.at(side);
+    xCentroidHandle(*zdcSum) = xCentCor.at(side);
+    yCentroidHandle(*zdcSum) = yCentCor.at(side);
+    xDetCentroidHandle(*zdcSum) = xCent.at(side);
+    yDetCentroidHandle(*zdcSum) = yCent.at(side);
+    xDetCentroidUnsubHandle(*zdcSum) = xCentUnsub.at(side);
+    yDetCentroidUnsubHandle(*zdcSum) = yCentUnsub.at(side);
+    xDetRowCentroidHandle(*zdcSum) = xCentRow.at(side);
+    yDetColCentroidHandle(*zdcSum) = yCentCol.at(side);
+    xDetRowCentroidStdevHandle(*zdcSum) = xStdev.at(side);
+    yDetColCentroidStdevHandle(*zdcSum) = yStdev.at(side);
+    centroidStatusHandle(*zdcSum) = status.at(side);
   }
 
   return StatusCode::SUCCESS;
@@ -504,7 +514,7 @@ StatusCode RpdSubtractCentroidTool::reprocessZdc()
   return StatusCode::SUCCESS;
 }
 
-float RpdSubtractCentroidTool::geometryCorrectionX(float x_rpd, float y_rpd, int side) {
+float RpdSubtractCentroidTool::geometryCorrectionX(float x_rpd, float y_rpd, int side) const {
   // correct for rotation of RPD about z axis (in xy plane)
   float x_beamline = x_rpd*TMath::Cos(m_xyRotAngle.at(side)) - y_rpd*TMath::Sin(m_xyRotAngle.at(side));
   // correct for offsest of RPD
@@ -512,7 +522,7 @@ float RpdSubtractCentroidTool::geometryCorrectionX(float x_rpd, float y_rpd, int
   return x_beamline;
 }
 
-float RpdSubtractCentroidTool::geometryCorrectionY(float x_rpd, float y_rpd, int side) {
+float RpdSubtractCentroidTool::geometryCorrectionY(float x_rpd, float y_rpd, int side) const {
   // correct for rotation of RPD about z axis (in xy plane)
   float y_beamline = x_rpd*TMath::Sin(m_xyRotAngle.at(side)) + y_rpd*TMath::Cos(m_xyRotAngle.at(side));
   // correct for rotation of RPD about x axis (in yz plane)
diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h
index 35f2ace2133d1ac176ea0be203eaf4c241052af4..e6c6363791630326679688e2b2272c63d8cd6126 100644
--- a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h
+++ b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h
@@ -22,7 +22,7 @@
 namespace ZDC
 {
 
-class ATLAS_NOT_THREAD_SAFE RpdSubtractCentroidTool : public virtual IZdcAnalysisTool, public asg::AsgTool
+class RpdSubtractCentroidTool : public virtual IZdcAnalysisTool, public asg::AsgTool
 {
   ASG_TOOL_CLASS(RpdSubtractCentroidTool, ZDC::IZdcAnalysisTool)
 
@@ -80,7 +80,7 @@ private:
    * @param side side of RPD (C = 0, A = 1)
    * @return float x position in beamline coordinates
    */
-  float geometryCorrectionX(float x_rpd, float y_rpd, int side);
+  float geometryCorrectionX(float x_rpd, float y_rpd, int side) const;
   /**
    * @brief Calculate the y position in beamline coordinates from a position in RPD detector
    * coordinates using the offset of the RPD center and the rotation of the RPD plane.
@@ -90,7 +90,7 @@ private:
    * @param side side of RPD (C = 0, A = 1)
    * @return float y position in beamline coordinates
    */
-  float geometryCorrectionY(float x_rpd, float y_rpd, int side);
+  float geometryCorrectionY(float x_rpd, float y_rpd, int side) const;
 
   // Data members
   //
@@ -116,11 +116,6 @@ private:
   std::string m_zdcModuleContainerName;
   std::string m_zdcSumContainerName;
 
-  bool m_validInput;
-  unsigned int m_runNumber;
-  unsigned int m_lumiBlock;
-
-
   // Information from geometry
   //   as in the ZDC, we use side C = 0, side A = 1 for indexing 
   /**
@@ -152,31 +147,6 @@ private:
   //
   std::array<float, 2> m_xCentAvg;
   std::array<float, 2> m_yCentAvg;
-
-  // Analysis results
-  // ================
-  std::array<unsigned int, 2> m_status;
-  std::array<float, 2> m_ampSum; // the amplitude sum on the given side
-  std::array<float, 2> m_ampSumSub; // the subtracted amplitude sum on the given side
-  std::array<std::vector<std::vector<float> >, 2> m_ampSub; // the subtracted amplitude for each channel first index row, second column
-
-  std::array<float, 2> m_xCentUnsub;  // x centroid, average not subtracted
-  std::array<float, 2> m_yCentUnsub;  // y centroid, average not subtracted
-  std::array<float, 2> m_xCentUnsubCor;  // x centroid, average not subtracted, with geometry corrections
-  std::array<float, 2> m_yCentUnsubCor;  // y centroid, average not subtracted, with geometry corrections
-  std::array<float, 2> m_xCent;  // x centroid, subtracted
-  std::array<float, 2> m_yCent;  // y centroid, subtracted
-  std::array<float, 2> m_xCentCor;  // x centroid, subtracted, with geometry corrections
-  std::array<float, 2> m_yCentCor;  // y centroid, subtracted, with geometry corrections
-
-  std::array<std::vector<float>, 2> m_xCentRowUnsub; // the x centroid for each row, using unsubtracted amplitudes (diagnostic)
-  std::array<std::vector<float>, 2> m_yCentColUnsub; // the y centroid for each column, using unsubtracted amplitudes (diagnostic)
-  std::array<std::vector<float>, 2> m_xCentRow; // the x centroid for each row (diagnostic)
-  std::array<std::vector<float>, 2> m_yCentCol; // the y centroid for each column (diagnostic)
-
-  std::array<float, 2> m_xStdev; // x standard deviation
-  std::array<float, 2> m_yStdev; // y standard deviation
-  std::array<float, 2> m_xyCov;  // x-y covariance
   
   // read handle keys
   SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey {
diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py
index c3fc792e864f0b76117fcdef00588edc85200dc8..2427d90121066f7464c679775366f9ab8cc0b1b6 100644
--- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py
+++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py
@@ -1,7 +1,6 @@
 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaConfiguration.Enums import Format
 from TrkConfig.TrackingPassFlags import printActiveConfig
 
@@ -188,7 +187,7 @@ def ITkTrackRecoCfg(flags):
                 flags_set[0],  # Use cuts from primary pass
                 TracksLocation=StatTrackCollections))
 
-    if flags.Tracking.writeExtendedPRDInfo:
+    if flags.Tracking.writeExtendedSi_PRDInfo:
         from InDetConfig.InDetPrepRawDataToxAODConfig import (
             ITkPixelPrepDataToxAODCfg, ITkStripPrepDataToxAODCfg)
         result.merge(ITkPixelPrepDataToxAODCfg(
@@ -198,22 +197,15 @@ def ITkTrackRecoCfg(flags):
         result.merge(ITkStripPrepDataToxAODCfg(flags))
 
         from DerivationFrameworkInDet.InDetToolsConfig import (
-            ITkTrackStateOnSurfaceDecoratorCfg)
-        TrackStateOnSurfaceDecorator = result.getPrimaryAndMerge(
-            ITkTrackStateOnSurfaceDecoratorCfg(
-                flags,
-                name="ITkTrackStateOnSurfaceDecorator"))
-
-        result.addEventAlgo(
-            CompFactory.DerivationFramework.CommonAugmentation(
-                "ITkCommonKernel",
-                AugmentationTools=[TrackStateOnSurfaceDecorator]))
+            ITkTSOS_CommonKernelCfg)
+        result.merge(ITkTSOS_CommonKernelCfg(flags))
 
         if flags.Tracking.doStoreSiSPSeededTracks:
             from DerivationFrameworkInDet.InDetToolsConfig import (
                 ITkSiSPTrackStateOnSurfaceDecoratorCfg)
             SiSPTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge(
                 ITkSiSPTrackStateOnSurfaceDecoratorCfg(flags))
+            from AthenaConfiguration.ComponentFactory import CompFactory
             result.addEventAlgo(
                 CompFactory.DerivationFramework.CommonAugmentation(
                     "SiSPITkCommonKernel",
@@ -272,7 +264,7 @@ def ITkTrackRecoOutputCfg(flags):
 
     # exclude IDTIDE/IDTRKVALID decorations
     excludedAuxData += '.-TrkBLX.-TrkBLY.-TrkBLZ.-TrkIBLX.-TrkIBLY.-TrkIBLZ.-TrkL1X.-TrkL1Y.-TrkL1Z.-TrkL2X.-TrkL2Y.-TrkL2Z'
-    if not flags.Tracking.writeExtendedPRDInfo:
+    if not flags.Tracking.writeExtendedSi_PRDInfo:
         excludedAuxData += '.-msosLink'
 
     # Save PRD
@@ -302,7 +294,7 @@ def ITkTrackRecoOutputCfg(flags):
     toAOD += [
         f"xAOD::TrackParticleAuxContainer#InDetTrackParticlesAux.{excludedAuxData}"]
 
-    if flags.Tracking.writeExtendedPRDInfo:
+    if flags.Tracking.writeExtendedSi_PRDInfo:
         toAOD += [
             "xAOD::TrackMeasurementValidationContainer#ITkPixelClusters",
             "xAOD::TrackMeasurementValidationAuxContainer#ITkPixelClustersAux.",
diff --git a/InnerDetector/InDetConfig/python/TrackRecoConfig.py b/InnerDetector/InDetConfig/python/TrackRecoConfig.py
index b0f983bac566808f848dd26345151260ce0da2d7..527d2fd74bb2a04f88b57966183b2ba2b71a2b1c 100644
--- a/InnerDetector/InDetConfig/python/TrackRecoConfig.py
+++ b/InnerDetector/InDetConfig/python/TrackRecoConfig.py
@@ -1,7 +1,6 @@
 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-from AthenaConfiguration.ComponentFactory import CompFactory
 from AthenaConfiguration.Enums import BeamType, Format
 from TrkConfig.TrackingPassFlags import printActiveConfig
 
@@ -662,93 +661,73 @@ def InDetTrackRecoCfg(flags):
     # --- Extra optional decorations
     # ---------------------------------------
 
-    if flags.Tracking.writeExtendedPRDInfo:
+    if (flags.Tracking.writeExtendedSi_PRDInfo or
+        flags.Tracking.writeExtendedTRT_PRDInfo):
 
         if (flags.Tracking.doTIDE_AmbiTrackMonitoring or
                 flags.Tracking.doPseudoTracking):
 
-            from InDetConfig.InDetPrepRawDataToxAODConfig import (
-                InDetPixelPrepDataToxAOD_ExtraTruthCfg,
-                InDetSCT_PrepDataToxAOD_ExtraTruthCfg,
-                InDetTRT_PrepDataToxAOD_ExtraTruthCfg)
-            result.merge(InDetPixelPrepDataToxAOD_ExtraTruthCfg(
-                flags,
-                ClusterSplitProbabilityName=(
-                    ClusterSplitProbabilityContainerName(flags))))
-            result.merge(InDetSCT_PrepDataToxAOD_ExtraTruthCfg(flags))
-            result.merge(InDetTRT_PrepDataToxAOD_ExtraTruthCfg(flags))
+            if flags.Tracking.writeExtendedSi_PRDInfo:
+                from InDetConfig.InDetPrepRawDataToxAODConfig import (
+                    InDetPixelPrepDataToxAOD_ExtraTruthCfg,
+                    InDetSCT_PrepDataToxAOD_ExtraTruthCfg)
+                result.merge(InDetPixelPrepDataToxAOD_ExtraTruthCfg(
+                    flags,
+                    ClusterSplitProbabilityName=(
+                        ClusterSplitProbabilityContainerName(flags))))
+                result.merge(InDetSCT_PrepDataToxAOD_ExtraTruthCfg(flags))
+
+            if flags.Tracking.writeExtendedTRT_PRDInfo:
+                from InDetConfig.InDetPrepRawDataToxAODConfig import (
+                    InDetTRT_PrepDataToxAOD_ExtraTruthCfg)
+                result.merge(InDetTRT_PrepDataToxAOD_ExtraTruthCfg(flags))
 
         else:
 
-            from InDetConfig.InDetPrepRawDataToxAODConfig import (
-                InDetPixelPrepDataToxAODCfg,
-                InDetSCT_PrepDataToxAODCfg,
-                InDetTRT_PrepDataToxAODCfg)
-            result.merge(InDetPixelPrepDataToxAODCfg(
-                flags,
-                ClusterSplitProbabilityName=(
-                    ClusterSplitProbabilityContainerName(flags))))
-            result.merge(InDetSCT_PrepDataToxAODCfg(flags))
-            result.merge(InDetTRT_PrepDataToxAODCfg(flags))
+            if flags.Tracking.writeExtendedSi_PRDInfo:
+                from InDetConfig.InDetPrepRawDataToxAODConfig import (
+                    InDetPixelPrepDataToxAODCfg,
+                    InDetSCT_PrepDataToxAODCfg)
+                result.merge(InDetPixelPrepDataToxAODCfg(
+                    flags,
+                    ClusterSplitProbabilityName=(
+                        ClusterSplitProbabilityContainerName(flags))))
+                result.merge(InDetSCT_PrepDataToxAODCfg(flags))
+
+            if flags.Tracking.writeExtendedTRT_PRDInfo:
+                from InDetConfig.InDetPrepRawDataToxAODConfig import (
+                    InDetTRT_PrepDataToxAODCfg)
+                result.merge(InDetTRT_PrepDataToxAODCfg(flags))
 
         from DerivationFrameworkInDet.InDetToolsConfig import (
-            TrackStateOnSurfaceDecoratorCfg)
+            TSOS_CommonKernelCfg)
         # Setup one algorithm for each output tracking container
-        listOfExtensionsRequesting = [ e for e in _extensions_list if (e == '') or (flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks and flags.Tracking.__getattr__(e+'Pass').storeSeparateContainer) ]
-        listOfAugmTools = []
-        for extension in listOfExtensionsRequesting:
-            TrackStateOnSurfaceDecorator = result.getPrimaryAndMerge(
-                TrackStateOnSurfaceDecoratorCfg(
-                    flags, name = f"{extension}TrackStateOnSurfaceDecorator",
-                    ContainerName = f"InDet{extension}TrackParticles",
-                    PixelMsosName = f"{extension}Pixel_MSOSs",
-                    SctMsosName = f"{extension}SCT_MSOSs",
-                    TrtMsosName = f"{extension}TRT_MSOSs"))
-            TrackStateOnSurfaceDecorator.DecorationPrefix = "Reco_"
-            listOfAugmTools.append(TrackStateOnSurfaceDecorator)
-        result.addEventAlgo(
-            CompFactory.DerivationFramework.CommonAugmentation(
-                "InDetCommonKernel",
-                AugmentationTools=listOfAugmTools))
+        listOfExtensionsRequesting = [
+            e for e in _extensions_list if (e == '') or
+            (flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks and
+             flags.Tracking.__getattr__(e+'Pass').storeSeparateContainer) ]
+        result.merge(TSOS_CommonKernelCfg(
+            flags, listOfExtensions = listOfExtensionsRequesting))
 
         if flags.Tracking.doTIDE_AmbiTrackMonitoring:
             from DerivationFrameworkInDet.InDetToolsConfig import (
-                ObserverTrackStateOnSurfaceDecoratorCfg)
-            ObserverTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge(
-                ObserverTrackStateOnSurfaceDecoratorCfg(flags))
-            result.addEventAlgo(
-                CompFactory.DerivationFramework.CommonAugmentation(
-                    "ObserverInDetCommonKernel",
-                    AugmentationTools=[ObserverTrackStateOnSurfaceDecorator]))
+                ObserverTSOS_CommonKernelCfg)
+            result.merge(ObserverTSOS_CommonKernelCfg(flags))
 
         if flags.Tracking.doPseudoTracking:
             from DerivationFrameworkInDet.InDetToolsConfig import (
-                PseudoTrackStateOnSurfaceDecoratorCfg)
-            PseudoTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge(
-                PseudoTrackStateOnSurfaceDecoratorCfg(flags))
-            result.addEventAlgo(
-                CompFactory.DerivationFramework.CommonAugmentation(
-                    "PseudoInDetCommonKernel",
-                    AugmentationTools=[PseudoTrackStateOnSurfaceDecorator]))
+                PseudoTSOS_CommonKernelCfg)
+            result.merge(PseudoTSOS_CommonKernelCfg(flags))
 
         if flags.Tracking.doStoreSiSPSeededTracks:
             from DerivationFrameworkInDet.InDetToolsConfig import (
-                SiSPTrackStateOnSurfaceDecoratorCfg)
+                SiSPTSOS_CommonKernelCfg)
             # Setup one algorithm for each output tracking container
-            listOfExtensionsRequesting = [ e for e in _extensions_list if (e == '' or flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks) ]
-            listOfAugmTools = []
-            for extension in listOfExtensionsRequesting:
-                SiSPTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge(
-                    SiSPTrackStateOnSurfaceDecoratorCfg(flags, name = f"SiSP{extension}TrackStateOnSurfaceDecorator",
-                        ContainerName = f"SiSPSeededTracks{extension}TrackParticles",
-                        PixelMsosName = f"SiSP{extension}_Pixel_MSOSs",
-                        SctMsosName = f"SiSP{extension}_SCT_MSOSs",
-                        TrtMsosName = f"SiSP{extension}_TRT_MSOSs"))
-                listOfAugmTools.append(SiSPTrackStateOnSurfaceDecorator)
-            result.addEventAlgo(
-                CompFactory.DerivationFramework.CommonAugmentation(
-                    "SiSPInDetCommonKernel",
-                    AugmentationTools=listOfAugmTools))
+            listOfExtensionsRequesting = [
+                e for e in _extensions_list if (e == '') or
+                flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks ]
+            result.merge(SiSPTSOS_CommonKernelCfg(
+                flags, listOfExtensions = listOfExtensionsRequesting))
 
         if flags.Input.isMC:
             #check if we want to add it for other passes
@@ -804,7 +783,8 @@ def InDetTrackRecoOutputCfg(flags):
 
     # exclude IDTIDE/IDTRKVALID decorations
     excludedAuxData += '.-TrkBLX.-TrkBLY.-TrkBLZ.-TrkIBLX.-TrkIBLY.-TrkIBLZ.-TrkL1X.-TrkL1Y.-TrkL1Z.-TrkL2X.-TrkL2Y.-TrkL2Z'
-    if not flags.Tracking.writeExtendedPRDInfo:
+    if not (flags.Tracking.writeExtendedSi_PRDInfo or
+            flags.Tracking.writeExtendedTRT_PRDInfo):
         excludedAuxData += '.-msosLink'
 
     # exclude IDTIDE decorations
@@ -989,7 +969,8 @@ def InDetTrackRecoOutputCfg(flags):
                 f"xAOD::TrackParticleContainer#SiSPSeedSegments{extension}TrackParticles",
                 f"xAOD::TrackParticleAuxContainer#SiSPSeedSegments{extension}TrackParticlesAux."
             ]
-    if flags.Tracking.writeExtendedPRDInfo:
+    if (flags.Tracking.writeExtendedSi_PRDInfo or
+        flags.Tracking.writeExtendedTRT_PRDInfo):
         toAOD += [
             "xAOD::TrackMeasurementValidationContainer#PixelClusters",
             "xAOD::TrackMeasurementValidationAuxContainer#PixelClustersAux.",
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py
index 1921102cbb376e27974d10354fa00c34862afe52..866c211ee519bd547e1fd873a8235f3878ab4a3f 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py
@@ -93,23 +93,17 @@ def IDTIDEKernelCfg(flags, name='IDTIDEKernel', **kwargs):
 
     from DerivationFrameworkInDet.InDetToolsConfig import (
         TrackStateOnSurfaceDecoratorCfg)
-    from InDetConfig.TRT_ElectronPidToolsConfig import TRT_dEdxToolCfg
-    InDetTRT_dEdxTool = acc.popToolsAndMerge(TRT_dEdxToolCfg(
-        flags, name="InDetTRT_dEdxTool"))
-    acc.addPublicTool(InDetTRT_dEdxTool)
     DFTSOS = acc.getPrimaryAndMerge(TrackStateOnSurfaceDecoratorCfg(
         flags,
         name="DFTrackStateOnSurfaceDecorator",
         ContainerName="InDetTrackParticles",
-        IsSimulation=flags.Input.isMC,
-        DecorationPrefix="",
+        StorePixel=flags.Detector.EnablePixel,
+        StoreSCT=flags.Detector.EnableSCT,
         StoreTRT=flags.Detector.EnableTRT,
         # never decorate EventInfo with TRTPhase, doubt this is useful for IDTIDE
         AddExtraEventInfo=False,
-        TRT_ToT_dEdx=InDetTRT_dEdxTool,
+        DecorationPrefix="",
         PRDtoTrackMap="",  # + InDetKeys.UnslimmedTracks() if  jobproperties.PrimaryDPDFlags.WriteDAOD_IDTRKVALIDStream.get_Value() else "",
-        StoreSCT=flags.Detector.EnableSCT,
-        StorePixel=flags.Detector.EnablePixel,
         OutputLevel=INFO)
     )
     tsos_augmentationTools.append(DFTSOS)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py
index 66635051968df07c7b90b77b4e5aad3edb553b48..265df773f3cf068a40fc8c4b293d4565ec9324d3 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py
@@ -7,6 +7,7 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.Enums import BeamType
 
 # Track collection merger
 
@@ -47,26 +48,41 @@ def HardScatterVertexDecoratorCfg(flags, name = "DFCommonHSDecorator", **kwargs)
 
 # TrackStateOnSurface decorator
 
-
 def TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs):
     """Configure the TSOS decorator"""
+    acc = ComponentAccumulator()
+
     # To produce SCT_DetectorElementCollection
     from SCT_GeoModel.SCT_GeoModelConfig import SCT_ReadoutGeometryCfg
-    acc = SCT_ReadoutGeometryCfg(flags)
+    acc.merge(SCT_ReadoutGeometryCfg(flags))
 
     kwargs.setdefault("DecorationPrefix", "notSet")
 
-    from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
-    AtlasExtrapolator = acc.popToolsAndMerge(AtlasExtrapolatorCfg(flags))
-    acc.addPublicTool(AtlasExtrapolator)
-    kwargs.setdefault("TrackExtrapolator", AtlasExtrapolator)
-
-    from InDetConfig.InDetTrackHoleSearchConfig import (
-        InDetTrackHoleSearchToolCfg)
-    InDetHoleSearchTool = acc.popToolsAndMerge(
-        InDetTrackHoleSearchToolCfg(flags))
-    acc.addPublicTool(InDetHoleSearchTool)
-    kwargs.setdefault("HoleSearch", InDetHoleSearchTool)
+    if "TrackExtrapolator" not in kwargs:
+        from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
+        AtlasExtrapolator = acc.popToolsAndMerge(AtlasExtrapolatorCfg(flags))
+        acc.addPublicTool(AtlasExtrapolator)
+        kwargs.setdefault("TrackExtrapolator", AtlasExtrapolator)
+
+    if "HoleSearch" not in kwargs:
+        from InDetConfig.InDetTrackHoleSearchConfig import (
+            InDetTrackHoleSearchToolCfg)
+        InDetHoleSearchTool = acc.popToolsAndMerge(
+            InDetTrackHoleSearchToolCfg(flags))
+        acc.addPublicTool(InDetHoleSearchTool)
+        kwargs.setdefault("HoleSearch", InDetHoleSearchTool)
+
+    kwargs.setdefault("IsSimulation", flags.Input.isMC)
+    kwargs.setdefault("StorePixel", flags.Tracking.writeExtendedSi_PRDInfo)
+    kwargs.setdefault("StoreSCT", flags.Tracking.writeExtendedSi_PRDInfo)
+    kwargs.setdefault("StoreTRT", flags.Tracking.writeExtendedTRT_PRDInfo)
+    kwargs.setdefault("AddExtraEventInfo", flags.Beam.Type is BeamType.Cosmics)
+
+    if kwargs["StoreTRT"] and "TRT_ToT_dEdx" not in kwargs:
+        from InDetConfig.TRT_ElectronPidToolsConfig import TRT_dEdxToolCfg
+        InDetTRT_dEdxTool = acc.popToolsAndMerge(TRT_dEdxToolCfg(flags))
+        acc.addPublicTool(InDetTRT_dEdxTool)
+        kwargs.setdefault("TRT_ToT_dEdx", InDetTRT_dEdxTool)
 
     kwargs.setdefault("DecorationPrefix", "")
     kwargs.setdefault("PRDtoTrackMap", "PRDtoTrackMapCombinedInDetTracks")
@@ -76,6 +92,25 @@ def TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs):
             name, **kwargs), primary=True)
     return acc
 
+def TSOS_CommonKernelCfg(flags, name="TSOS_CommonKernel",
+                         listOfExtensions=[]):
+    acc = ComponentAccumulator()
+
+    listOfAugmTools = []
+    for extension in listOfExtensions:
+        TrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge(
+            TrackStateOnSurfaceDecoratorCfg(
+                flags, name = f"{extension}TrackStateOnSurfaceDecorator",
+                ContainerName = f"InDet{extension}TrackParticles",
+                PixelMsosName = f"{extension}Pixel_MSOSs",
+                SctMsosName = f"{extension}SCT_MSOSs",
+                TrtMsosName = f"{extension}TRT_MSOSs"))
+        TrackStateOnSurfaceDecorator.DecorationPrefix = "Reco_"
+        listOfAugmTools.append(TrackStateOnSurfaceDecorator)
+
+    acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation(
+        name, AugmentationTools=listOfAugmTools))
+    return acc
 
 def ObserverTrackStateOnSurfaceDecoratorCfg(
         flags, name="ObserverTrackStateOnSurfaceDecorator", **kwargs):
@@ -88,6 +123,13 @@ def ObserverTrackStateOnSurfaceDecoratorCfg(
     kwargs.setdefault("StoreHoles", False)
     return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
 
+def ObserverTSOS_CommonKernelCfg(flags, name="ObserverTSOS_CommonKernel"):
+    acc = ComponentAccumulator()
+    ObserverTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge(
+        ObserverTrackStateOnSurfaceDecoratorCfg(flags))
+    acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation(
+        name, AugmentationTools=[ObserverTrackStateOnSurfaceDecorator]))
+    return acc
 
 def PseudoTrackStateOnSurfaceDecoratorCfg(
         flags, name="PseudoTrackStateOnSurfaceDecorator", **kwargs):
@@ -100,6 +142,13 @@ def PseudoTrackStateOnSurfaceDecoratorCfg(
     kwargs.setdefault("StoreHoles", False)
     return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
 
+def PseudoTSOS_CommonKernelCfg(flags, name="PseudoTSOS_CommonKernel"):
+    acc = ComponentAccumulator()
+    PseudoTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge(
+        PseudoTrackStateOnSurfaceDecoratorCfg(flags))
+    acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation(
+        name, AugmentationTools=[PseudoTrackStateOnSurfaceDecorator]))
+    return acc
 
 def SiSPTrackStateOnSurfaceDecoratorCfg(
         flags, name="SiSPTrackStateOnSurfaceDecorator", **kwargs):
@@ -112,6 +161,42 @@ def SiSPTrackStateOnSurfaceDecoratorCfg(
     kwargs.setdefault("StoreHoles", False)
     return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
 
+def SiSPTSOS_CommonKernelCfg(flags, name="SiSPTSOS_CommonKernel",
+                             listOfExtensions=[]):
+    acc = ComponentAccumulator()
+
+    listOfAugmTools = []
+    for extension in listOfExtensions:
+        SiSPTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge(
+            SiSPTrackStateOnSurfaceDecoratorCfg(
+                flags, name = f"SiSP{extension}TrackStateOnSurfaceDecorator",
+                ContainerName = f"SiSPSeededTracks{extension}TrackParticles",
+                PixelMsosName = f"SiSP{extension}_Pixel_MSOSs",
+                SctMsosName = f"SiSP{extension}_SCT_MSOSs",
+                TrtMsosName = f"SiSP{extension}_TRT_MSOSs"))
+        listOfAugmTools.append(SiSPTrackStateOnSurfaceDecorator)
+
+    acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation(
+        name, AugmentationTools=listOfAugmTools))
+    return acc
+
+def GSFTrackStateOnSurfaceDecoratorCfg(
+        flags, name="GSFTrackStateOnSurfaceDecorator", **kwargs):
+    kwargs.setdefault("ContainerName", "GSFTrackParticles")
+    kwargs.setdefault("DecorationPrefix", "GSF_")
+    kwargs.setdefault("PixelMsosName", "GSF_Pixel_MSOSs")
+    kwargs.setdefault("SctMsosName", "GSF_SCT_MSOSs")
+    kwargs.setdefault("TrtMsosName", "GSF_TRT_MSOSs")
+    kwargs.setdefault("PRDtoTrackMap", "")
+    return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
+
+def GSFTSOS_CommonKernelCfg(flags, name="GSFTSOS_CommonKernel"):
+    acc = ComponentAccumulator()
+    GSFTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge(
+        GSFTrackStateOnSurfaceDecoratorCfg(flags))
+    acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation(
+        name, AugmentationTools=[GSFTrackStateOnSurfaceDecorator]))
+    return acc
 
 def ITkTrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs):
     """Configure the TSOS decorator"""
@@ -157,6 +242,13 @@ def ITkSiSPTrackStateOnSurfaceDecoratorCfg(
     kwargs.setdefault("StoreHoles", False)
     return ITkTrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
 
+def ITkTSOS_CommonKernelCfg(flags, name="ITkTSOS_CommonKernel"):
+    acc = ComponentAccumulator()
+    ITkTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge(
+        ITkTrackStateOnSurfaceDecoratorCfg(flags))
+    acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation(
+        name, AugmentationTools=[ITkTrackStateOnSurfaceDecorator]))
+    return acc
 
 # Expression of Z0 at the primary vertex
 
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx
index 68f1a424c9998c881b0f078ec39ac8f505c62238..98380845f7055aa2276e22a0b2f90ab78bfd51bb 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx
@@ -179,7 +179,7 @@ namespace DerivationFramework {
     ATH_CHECK( m_sctMsosName.initialize(m_storeSCT && m_addPRD) );
     ATH_CHECK( m_trtMsosName.initialize(m_storeTRT && m_addPRD) );
 
-    {
+    if (m_storePixel){
        std::vector<std::string> names;
        names.resize(kNPixFloatDecor);
        names[kTrkIBLXDecor]="TrkIBLX";
@@ -196,6 +196,7 @@ namespace DerivationFramework {
        names[kTrkL2ZDecor]="TrkL2Z";
        createDecoratorKeys(*this,m_containerName, m_sgName, names, m_trackPixFloatDecorKeys);
     }
+
     m_trackTSOSMOSLinkDecorKey = m_containerName.key() + "." + m_sgName + "msosLink";
     ATH_CHECK( m_trackTSOSMOSLinkDecorKey.initialize() );
 
@@ -348,113 +349,123 @@ namespace DerivationFramework {
         trackTRTFloatDecorators[kTRTusedHits_noHT_divByLDecor] (*track) = m_TRTdEdxTool->usedHits(trkTrack, false);
       }
 
-      if ( trkTrack->perigeeParameters() ){
-
-        if(m_pixelLayerRadii.size() < 4) ATH_MSG_WARNING("Too few layer radii set! Should be at least 4!");  
-
-        Trk::CylinderSurface cylSurfIBL(m_pixelLayerRadii[0], 3000.0);
-        Trk::CylinderSurface cylSurfBL(m_pixelLayerRadii[1], 3000.0);
-        Trk::CylinderSurface cylSurfL1(m_pixelLayerRadii[2], 3000.0);
-        Trk::CylinderSurface cylSurfL2(m_pixelLayerRadii[3], 3000.0);
-
-        bool allExtrapolationsSucceded = true;
-        Trk::PropDirection whichDir = Trk::alongMomentum;
-        Trk::MaterialUpdateMode whichMode = Trk::removeNoise;
-        //check the radius of the start parameters, to see which direction we need to go to the target surface
-        float startRadius = trkTrack->perigeeParameters()->associatedSurface().center().perp();
-        ATH_MSG_VERBOSE("Start radius for extrapolating to layers: "<<startRadius);
-        //see if we go along or opposite momentum
-        if(startRadius>m_pixelLayerRadii[0]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;}
-        std::unique_ptr<const Trk::TrackParameters> outputParamsIBL(
-          m_extrapolator->extrapolate(ctx,
-                                      *(trkTrack->perigeeParameters()),
-                                      cylSurfIBL,
-                                      whichDir,
-                                      true,
-                                      Trk::pion,
-                                      whichMode));
-        if(startRadius>m_pixelLayerRadii[1]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;}                              
-        std::unique_ptr<const Trk::TrackParameters> outputParamsBL(
-          m_extrapolator->extrapolate(ctx,
-                                      *(trkTrack->perigeeParameters()),
-                                      cylSurfBL,
-                                      whichDir,
-                                      true,
-                                      Trk::pion,
-                                      whichMode));
-        if(startRadius>m_pixelLayerRadii[2]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;}                             
-        std::unique_ptr<const Trk::TrackParameters> outputParamsL1(
-          m_extrapolator->extrapolate(ctx,
-                                      *(trkTrack->perigeeParameters()),
-                                      cylSurfL1,
-                                      whichDir,
-                                      true,
-                                      Trk::pion,
-                                      whichMode));
-        if(startRadius>m_pixelLayerRadii[2]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;}                             
-        std::unique_ptr<const Trk::TrackParameters> outputParamsL2(
-          m_extrapolator->extrapolate(ctx,
-                                      *(trkTrack->perigeeParameters()),
-                                      cylSurfL2,
-                                      whichDir,
-                                      true,
-                                      Trk::pion,
-                                      whichMode));
-
-        if (outputParamsIBL.get()) {
-          trackPixFloatDecorators[kTrkIBLXDecor](*track) = outputParamsIBL->position().x();
-          trackPixFloatDecorators[kTrkIBLYDecor](*track) = outputParamsIBL->position().y();
-          trackPixFloatDecorators[kTrkIBLZDecor](*track) = outputParamsIBL->position().z();
-        }
-        else {
-          allExtrapolationsSucceded = false;
-          ATH_MSG_VERBOSE("Extrapolation to IBL failed...");
-          trackPixFloatDecorators[kTrkIBLXDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkIBLYDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkIBLZDecor](*track) = 0.0;
-        }
+      if(m_storePixel){
+	if ( trkTrack->perigeeParameters() ){
+
+	  if(m_pixelLayerRadii.size() < 4) ATH_MSG_WARNING("Too few layer radii set! Should be at least 4!");
+
+	  Trk::CylinderSurface cylSurfIBL(m_pixelLayerRadii[0], 3000.0);
+	  Trk::CylinderSurface cylSurfBL(m_pixelLayerRadii[1], 3000.0);
+	  Trk::CylinderSurface cylSurfL1(m_pixelLayerRadii[2], 3000.0);
+	  Trk::CylinderSurface cylSurfL2(m_pixelLayerRadii[3], 3000.0);
+
+	  bool allExtrapolationsSucceded = true;
+	  Trk::PropDirection whichDir = Trk::alongMomentum;
+	  Trk::MaterialUpdateMode whichMode = Trk::removeNoise;
+	  //check the radius of the start parameters, to see which direction we need to go to the target surface
+	  float startRadius = trkTrack->perigeeParameters()->associatedSurface().center().perp();
+	  ATH_MSG_VERBOSE("Start radius for extrapolating to layers: "<<startRadius);
+	  //see if we go along or opposite momentum
+	  if(startRadius>m_pixelLayerRadii[0]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;}
+	  std::unique_ptr<const Trk::TrackParameters> outputParamsIBL
+	    (m_extrapolator->extrapolate(ctx,
+					 *(trkTrack->perigeeParameters()),
+					 cylSurfIBL,
+					 whichDir,
+					 true,
+					 Trk::pion,
+					 whichMode));
+	  if(startRadius>m_pixelLayerRadii[1]){
+	    whichDir = Trk::oppositeMomentum;
+	    whichMode = Trk::addNoise;
+	  }
+	  std::unique_ptr<const Trk::TrackParameters> outputParamsBL
+	    (m_extrapolator->extrapolate(ctx,
+					 *(trkTrack->perigeeParameters()),
+					 cylSurfBL,
+					 whichDir,
+					 true,
+					 Trk::pion,
+					 whichMode));
+	  if(startRadius>m_pixelLayerRadii[2]){
+	    whichDir = Trk::oppositeMomentum;
+	    whichMode = Trk::addNoise;
+	  }
+	  std::unique_ptr<const Trk::TrackParameters> outputParamsL1
+	    (m_extrapolator->extrapolate(ctx,
+					 *(trkTrack->perigeeParameters()),
+					 cylSurfL1,
+					 whichDir,
+					 true,
+					 Trk::pion,
+					 whichMode));
+	  if(startRadius>m_pixelLayerRadii[2]){
+	    whichDir = Trk::oppositeMomentum;
+	    whichMode = Trk::addNoise;
+	  }
+	  std::unique_ptr<const Trk::TrackParameters> outputParamsL2
+	    (m_extrapolator->extrapolate(ctx,
+					 *(trkTrack->perigeeParameters()),
+					 cylSurfL2,
+					 whichDir,
+					 true,
+					 Trk::pion,
+					 whichMode));
+
+	  if (outputParamsIBL.get()) {
+	    trackPixFloatDecorators[kTrkIBLXDecor](*track) = outputParamsIBL->position().x();
+	    trackPixFloatDecorators[kTrkIBLYDecor](*track) = outputParamsIBL->position().y();
+	    trackPixFloatDecorators[kTrkIBLZDecor](*track) = outputParamsIBL->position().z();
+	  }
+	  else {
+	    allExtrapolationsSucceded = false;
+	    ATH_MSG_VERBOSE("Extrapolation to IBL failed...");
+	    trackPixFloatDecorators[kTrkIBLXDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkIBLYDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkIBLZDecor](*track) = 0.0;
+	  }
 
-        if (outputParamsBL.get()) {
-          trackPixFloatDecorators[kTrkBLXDecor](*track) = outputParamsBL->position().x();
-          trackPixFloatDecorators[kTrkBLYDecor](*track) = outputParamsBL->position().y();
-          trackPixFloatDecorators[kTrkBLZDecor](*track) = outputParamsBL->position().z();
-        }
-        else {
-          allExtrapolationsSucceded = false;
-          ATH_MSG_VERBOSE("Extrapolation to BLayer failed...");
-          trackPixFloatDecorators[kTrkBLXDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkBLYDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkBLZDecor](*track) = 0.0;
-        }
+	  if (outputParamsBL.get()) {
+	    trackPixFloatDecorators[kTrkBLXDecor](*track) = outputParamsBL->position().x();
+	    trackPixFloatDecorators[kTrkBLYDecor](*track) = outputParamsBL->position().y();
+	    trackPixFloatDecorators[kTrkBLZDecor](*track) = outputParamsBL->position().z();
+	  }
+	  else {
+	    allExtrapolationsSucceded = false;
+	    ATH_MSG_VERBOSE("Extrapolation to BLayer failed...");
+	    trackPixFloatDecorators[kTrkBLXDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkBLYDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkBLZDecor](*track) = 0.0;
+	  }
 
-        if (outputParamsL1.get()) {
-          trackPixFloatDecorators[kTrkL1XDecor](*track) = outputParamsL1->position().x();
-          trackPixFloatDecorators[kTrkL1YDecor](*track) = outputParamsL1->position().y();
-          trackPixFloatDecorators[kTrkL1ZDecor](*track) = outputParamsL1->position().z();
-        }
-        else {
-          allExtrapolationsSucceded = false;
-          ATH_MSG_VERBOSE("Extrapolation to L1 failed...");
-          trackPixFloatDecorators[kTrkL1XDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkL1YDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkL1ZDecor](*track) = 0.0;
-        }
+	  if (outputParamsL1.get()) {
+	    trackPixFloatDecorators[kTrkL1XDecor](*track) = outputParamsL1->position().x();
+	    trackPixFloatDecorators[kTrkL1YDecor](*track) = outputParamsL1->position().y();
+	    trackPixFloatDecorators[kTrkL1ZDecor](*track) = outputParamsL1->position().z();
+	  }
+	  else {
+	    allExtrapolationsSucceded = false;
+	    ATH_MSG_VERBOSE("Extrapolation to L1 failed...");
+	    trackPixFloatDecorators[kTrkL1XDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkL1YDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkL1ZDecor](*track) = 0.0;
+	  }
 
-        if (outputParamsL2.get()) {
-          trackPixFloatDecorators[kTrkL2XDecor](*track) = outputParamsL2->position().x();
-          trackPixFloatDecorators[kTrkL2YDecor](*track) = outputParamsL2->position().y();
-          trackPixFloatDecorators[kTrkL2ZDecor](*track) = outputParamsL2->position().z();
-        }
-        else {
-          allExtrapolationsSucceded = false;
-          ATH_MSG_VERBOSE("Extrapolation to L2 failed...");
-          trackPixFloatDecorators[kTrkL2XDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkL2YDecor](*track) = 0.0;
-          trackPixFloatDecorators[kTrkL2ZDecor](*track) = 0.0;
-        }
-      if(!allExtrapolationsSucceded) ATH_MSG_WARNING("At least one extrapolation to a Pixel layer failed!");
-      }
-      else{
+	  if (outputParamsL2.get()) {
+	    trackPixFloatDecorators[kTrkL2XDecor](*track) = outputParamsL2->position().x();
+	    trackPixFloatDecorators[kTrkL2YDecor](*track) = outputParamsL2->position().y();
+	    trackPixFloatDecorators[kTrkL2ZDecor](*track) = outputParamsL2->position().z();
+	  }
+	  else {
+	    allExtrapolationsSucceded = false;
+	    ATH_MSG_VERBOSE("Extrapolation to L2 failed...");
+	    trackPixFloatDecorators[kTrkL2XDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkL2YDecor](*track) = 0.0;
+	    trackPixFloatDecorators[kTrkL2ZDecor](*track) = 0.0;
+	  }
+	  if(!allExtrapolationsSucceded) ATH_MSG_WARNING("At least one extrapolation to a Pixel layer failed!");
+	}
+	else{
           ATH_MSG_WARNING("No perigee TrackParameters found - filling positions on layers to (0,0,0)!");
           //should decorate nonetheless, to make sure decorations are consistent across events
           trackPixFloatDecorators[kTrkIBLXDecor](*track) = 0.0;
@@ -469,7 +480,9 @@ namespace DerivationFramework {
           trackPixFloatDecorators[kTrkL2XDecor](*track) = 0.0;
           trackPixFloatDecorators[kTrkL2YDecor](*track) = 0.0;
           trackPixFloatDecorators[kTrkL2ZDecor](*track) = 0.0;
+	}
       }
+
       // -- Add Track states to the current track, filtering on their type
       std::vector<const Trk::TrackStateOnSurface*> tsoss;
       for (const auto *const trackState: *(trkTrack->trackStateOnSurfaces())){
diff --git a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py
index 25e7ef6d4a1981e9224dd0789bca810f69dc7241..9b710c005a60a4797fc3788d98812ad03b31e3c6 100644
--- a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py
+++ b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py
@@ -16,13 +16,13 @@ from AthenaCommon.Logging import logging
 __log = logging.getLogger('HIJetRecConfigCA')
 
 
-def HIClusterMakerCfg(flags, save=True, **kwargs):
+def HIClusterMakerCfg(flags, save=False, **kwargs):
     """Function to equip HI cluster builder from towers and cells, adds to output AOD stream."""
 
     acc = ComponentAccumulator()
 
     kwargs.setdefault("CaloCellContainerKey", "AllCalo")
-    kwargs.setdefault("OutputContainerKey", flags.HeavyIon.Jet.ClusterKey)
+    kwargs.setdefault("OutputContainerKey", flags.HeavyIon.Jet.Internal.ClusterKey)
 
     # get towers
     from CaloRec.CaloRecoConfig import CaloRecoCfg
@@ -48,8 +48,8 @@ def HIClusterMakerCfg(flags, save=True, **kwargs):
 def HICaloJetInputConstitSeq(flags, name="HICaloConstit", **kwargs):
     kwargs.setdefault("objtype", xAODType.CaloCluster)
     kwargs.setdefault("modifiers", [])
-    kwargs.setdefault("inputname", flags.HeavyIon.Jet.ClusterKey)
-    kwargs.setdefault("outputname", flags.HeavyIon.Jet.ClusterKey)
+    kwargs.setdefault("inputname", flags.HeavyIon.Jet.Internal.ClusterKey)
+    kwargs.setdefault("outputname", flags.HeavyIon.Jet.Internal.ClusterKey)
     kwargs.setdefault("label", "HI")
 
     jetConstit = JetInputConstitSeq(name, **kwargs)
@@ -103,9 +103,9 @@ def HIPseudoJetAlgCfg(flags, **kwargs):
     """Creates a pseudo jet algorithm"""
     acc = ComponentAccumulator()
 
-    kwargs.setdefault("name", "pjcs"+flags.HeavyIon.Jet.ClusterKey)
-    kwargs.setdefault("InputContainer", flags.HeavyIon.Jet.ClusterKey)
-    kwargs.setdefault("OutputContainer", "PseudoJet"+flags.HeavyIon.Jet.ClusterKey)
+    kwargs.setdefault("name", "pjcs"+flags.HeavyIon.Jet.Internal.ClusterKey)
+    kwargs.setdefault("InputContainer", flags.HeavyIon.Jet.Internal.ClusterKey)
+    kwargs.setdefault("OutputContainer", "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey)
     kwargs.setdefault("Label", "LCTopo")
     kwargs.setdefault("SkipNegativeEnergy", False)
     kwargs.setdefault("TreatNegativeEnergyAsGhost", True)
@@ -136,7 +136,7 @@ def HIJetClustererCfg(flags, name="builder", jetDef=None, **kwargs):
         kwargs.setdefault("JetRadius", jetDef.radius)
         kwargs.setdefault("PtMin", jetDef.ptmin)
     kwargs.setdefault("GhostArea", 0.01)
-    kwargs.setdefault("InputPseudoJets", "PseudoJet"+flags.HeavyIon.Jet.ClusterKey+"_GhostTracks")
+    kwargs.setdefault("InputPseudoJets", "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey+"_GhostTracks")
 
     acc.setPrivateTools(CompFactory.JetClusterer(name, **kwargs))
     return acc
@@ -205,9 +205,9 @@ def updateStdJetModifier(flags, name, **kwargs):
         stdJetModifiers.update(
             HIJetAssoc=JetModifier("HIJetDRAssociationTool",
                                    "HIJetDRAssociation",
-                                   ContainerKey=flags.HeavyIon.Jet.ClusterKey,
+                                   ContainerKey=flags.HeavyIon.Jet.Internal.ClusterKey,
                                    DeltaR=0.8,
-                                   AssociationName=flags.HeavyIon.Jet.ClusterKey+"_DR8Assoc"))
+                                   AssociationName=flags.HeavyIon.Jet.Internal.ClusterKey+"_DR8Assoc"))
         return
 
     if name == "HIJetMaxOverMean":
@@ -405,7 +405,7 @@ def HIEventShapeJetIterationCfg(flags, suffix=None, useClusters=True, **kwargs):
         map_tool = acc.popToolsAndMerge(HIEventShapeMapToolCfg(flags))
         kwargs.setdefault("EventShapeMapTool", map_tool)
     kwargs.setdefault("OutputEventShapeKey", out_shape_name)
-    kwargs.setdefault("AssociationKey", flags.HeavyIon.Jet.ClusterKey+"_DR8Assoc")
+    kwargs.setdefault("AssociationKey", flags.HeavyIon.Jet.Internal.ClusterKey+"_DR8Assoc")
     kwargs.setdefault("ModulationScheme", 1)
     kwargs.setdefault("RemodulateUE", True)
     kwargs.setdefault("ShallowCopy", False)
@@ -482,7 +482,7 @@ def HISubtractionToClustersCfg(flags, name="HIClusterSubtraction", useClusters=T
     acc = ComponentAccumulator()
 
     kwargs.setdefault('EventShapeKey', 'EventShapeKey')
-    kwargs.setdefault('ClusterKey', flags.HeavyIon.Jet.ClusterKey)
+    kwargs.setdefault('ClusterKey', flags.HeavyIon.Jet.Internal.ClusterKey)
     kwargs.setdefault('OutClusterKey', 'ClusterKey_deep')
     kwargs.setdefault('UpdateOnly', False)
     kwargs.setdefault('ApplyOriginCorrection', True)
@@ -517,7 +517,7 @@ def HIJetRecCfg(flags):
     acc.merge(HIEventShapeMakerCfg(flags,
                                    name="HIEventShapeMaker_Weighted",
                                    doWeighted=True,
-                                   InputTowerKey=flags.HeavyIon.Jet.ClusterKey,
+                                   InputTowerKey=flags.HeavyIon.Jet.Internal.ClusterKey,
                                    OutputContainerKey=eventshapeKey))
 
     # get jet definition
@@ -544,12 +544,12 @@ def HIJetRecCfg(flags):
 
     ## merge between PJHICluster and PJTracks
 
-    pjContNames = ["PseudoJet"+flags.HeavyIon.Jet.ClusterKey,pseudoGhostTrks]
+    pjContNames = ["PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey,pseudoGhostTrks]
 
     mergeAlg = CompFactory.PseudoJetMerger(
         "PJmerge_HIGhostTrack",
         InputPJContainers = pjContNames,
-        OutputContainer = "PseudoJet"+flags.HeavyIon.Jet.ClusterKey+"_GhostTracks"
+        OutputContainer = "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey+"_GhostTracks"
     )
     acc.addEventAlgo(mergeAlg)
 
@@ -625,7 +625,7 @@ def HIJetRecCfg(flags):
     acc.addEventAlgo(CompFactory.JetAlgorithm("jetalgHI_iter1_egamma", Tools=[iter1_eg]))
 
     # constituents subtraction for egamma, cell-level
-    cluster_key_eGamma_deep = flags.HeavyIon.Jet.ClusterKey+"_eGamma_deep"
+    cluster_key_eGamma_deep = flags.HeavyIon.Jet.Internal.ClusterKey+"_eGamma_deep"
     subtrToCelltool = acc.popToolsAndMerge(
         HISubtractionToCellsCfg(flags,
                                 name="HIClusterSubtraction_egamma",
@@ -642,13 +642,12 @@ def HIJetRecCfg(flags):
     updateStdJetModifier(flags, "subtr1", **jm_dict1)
 
     # constituents subtraction for jets, tower-level
-    cluster_key_final_deep = cluster_key_eGamma_deep+"_Cluster_deep"
     subtrToClusterTool = acc.popToolsAndMerge(
         HISubtractionToClustersCfg(flags,
                                    name="HIClusterSubtraction_final",
                                    EventShapeKey=jm_dict1["EventShapeKey"],
                                    ClusterKey=cluster_key_eGamma_deep,
-                                   OutClusterKey=cluster_key_final_deep,
+                                   OutClusterKey=flags.HeavyIon.Jet.ClusterKey,
                                    Modulator=jm_dict1["Modulator"],
                                    EventShapeMapTool=jm_dict1["EventShapeMapTool"],
                                    ApplyOriginCorrection=False)
@@ -658,9 +657,16 @@ def HIJetRecCfg(flags):
 
     # jet modifier from the tower-level subtraction
     updateStdJetModifier(flags, "consmod",
-                         ClusterKey=cluster_key_final_deep,
+                         ClusterKey=flags.HeavyIon.Jet.ClusterKey,
                          Subtractor=jm_dict1["Subtractor"])
 
+    # store final version of HIClusters
+    if flags.HeavyIon.Jet.WriteHIClusters:
+        output_hicluster = ["xAOD::CaloClusterContainer#"+flags.HeavyIon.Jet.ClusterKey,
+                            "xAOD::CaloClusterAuxContainer#"+flags.HeavyIon.Jet.ClusterKey+"Aux."]
+        acc.merge(addToESD(flags, output_hicluster))
+        acc.merge(addToAOD(flags, output_hicluster))
+
     # configure final jets and store them
     extramods = ["Sort","Width","CaloEnergies","LArHVCorr","CaloQuality","TrackMoments","JVF","JVT"]# adding modifiers to final jets
     for jd in jetDef:
diff --git a/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx b/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx
index 64a98cb888f6c5b9df95ae893f30dabce741a868..9a462f5955c561f75a07f5deca07c6a111b5d725 100644
--- a/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx
+++ b/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx
@@ -129,7 +129,7 @@ int HIClusterSubtraction::execute() const
 	const auto *originalCluster = readHandleClusters.cptr();
 	// Create the new container and its auxiliary store.
 	xAOD::CaloClusterContainer* copyClusters = new xAOD::CaloClusterContainer();
-  xAOD::AuxContainerBase* copyClustersAux = new xAOD::AuxContainerBase();
+  xAOD::CaloClusterAuxContainer* copyClustersAux = new xAOD::CaloClusterAuxContainer();
   copyClusters->setStore(copyClustersAux);
   copyClusters->reserve (originalCluster->size());
 
@@ -195,7 +195,7 @@ int HIClusterSubtraction::execute() const
 
   // Make sure that memory is managed safely
   std::unique_ptr<xAOD::CaloClusterContainer> outClusters(copyClusters);
-  std::unique_ptr<xAOD::AuxContainerBase> deepAux(copyClustersAux);
+  std::unique_ptr<xAOD::CaloClusterAuxContainer> deepAux(copyClustersAux);
 
 	if(writeHandleDeepCopyClusters.record ( std::move(outClusters), std::move(deepAux)).isFailure() ){
 			ATH_MSG_ERROR("Unable to write DeepCopy Copy containers for subtracted clusters with key: " << m_outClusterKey.key());
diff --git a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py
index 302a8e9a4e6f7ebf0971a7c4f87a2ae713809cd4..c9d7bb76fe1efd663b095b41190c10db8e0c5532 100644
--- a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py
+++ b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py
@@ -34,20 +34,9 @@ def HIPmode(flags):
     flags.HeavyIon.Jet.TrackJetPtMin=4000
 
 def UPCmode(flags):
-    flags.Reco.EnableHI=True
-    flags.Reco.EnableTau=True
-    flags.Reco.EnableJet=True
-    flags.Jet.WriteToAOD=True # this is to save "standard" jets and btagging to xAOD
-    flags.Reco.EnableMet=True
-    flags.MET.WritetoAOD=True
-    flags.Reco.EnableCaloRinger=False
-    flags.Reco.EnableBTagging=True
-    flags.Tracking.doUPC=True # only UPC
-    flags.Egamma.doLowMu=True # only UPC
-    flags.Tracking.doTrackSegmentsPixel=True #only UPC
-    flags.HeavyIon.Egamma.doSubtractedClusters=False
-    flags.HeavyIon.Jet.ApplyTowerEtaPhiCorrection=False
-    flags.HeavyIon.Jet.HarmonicsForSubtraction=[]
-    flags.HeavyIon.Jet.SeedPtMin=8000
-    flags.HeavyIon.Jet.RecoOutputPtMin=8000
-    flags.HeavyIon.Jet.TrackJetPtMin=4000
+    HIPmode(flags)
+    #UPC dedicated flags
+    flags.Tracking.doUPC=True
+    flags.Egamma.doLowMu=True
+    flags.Tracking.doTrackSegmentsPixel=True
+    flags.HeavyIon.Jet.WriteHIClusters = False
diff --git a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py
index 105a5047ce015a0bbd7c430584569628676c2dd7..f8c8a50ca0f7b63bedeb2a1f06fa1e996ccc941a 100644
--- a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py
+++ b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py
@@ -19,6 +19,8 @@ def createHIRecConfigFlags():
   flags.addFlag("HeavyIon.Jet.TrackJetPtMin", 7000)
   flags.addFlag("HeavyIon.Jet.HIClusterGeoWeightFile", "auto")
   flags.addFlag("HeavyIon.Jet.ClusterKey", "HIClusters")
+  flags.addFlag("HeavyIon.Jet.Internal.ClusterKey", "HIClusters_temp")
+  flags.addFlag("HeavyIon.Jet.WriteHIClusters", True)
 
   flags.addFlag("HeavyIon.Egamma.doSubtractedClusters", lambda prevFlags: prevFlags.Reco.EnableHI)
   flags.addFlag("HeavyIon.Egamma.EventShape", "HIEventShape_iter_egamma")
diff --git a/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py b/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py
index 53586f02ea08a3056ff92b63ba42dbc1dffedf26..47b7bfacb9bb955566c502aa4457ba5defd14d15 100644
--- a/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py
+++ b/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py
@@ -101,6 +101,18 @@ def egammaOutputCfg(flags, name="EGOutputList"):
             f"xAOD::TrackParticleAuxContainer#{outFlags.GSFTrackParticles}"
             f"Aux.{outFlags.GSFTrackParticlesSuppAOD}"]
 
+        if (flags.Tracking.writeExtendedSi_PRDInfo or
+            flags.Tracking.writeExtendedTRT_PRDInfo):
+            extension = "GSF_"
+            toAOD += [
+                f"xAOD::TrackStateValidationContainer#{extension}Pixel_MSOSs",
+                f"xAOD::TrackStateValidationAuxContainer#{extension}Pixel_MSOSsAux.",
+                f"xAOD::TrackStateValidationContainer#{extension}SCT_MSOSs",
+                f"xAOD::TrackStateValidationAuxContainer#{extension}SCT_MSOSsAux.",
+                f"xAOD::TrackStateValidationContainer#{extension}TRT_MSOSs",
+                f"xAOD::TrackStateValidationAuxContainer#{extension}TRT_MSOSsAux."
+            ]
+
     if flags.Egamma.doConversionBuilding:
         toESD += [
             f"xAOD::VertexContainer#{outFlags.ConversionVertices}",
diff --git a/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py b/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py
index cb573f6ab6f2db0d36b008ceec884b3d2bbdb114..2ca6c5ad700559d112ba750627cb9a2ab6a3e26c 100644
--- a/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py
+++ b/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py
@@ -30,7 +30,13 @@ def egammaReconstructionCfg(flags, name="egammaReconstruction"):
             EMBremCollectionBuilderCfg)
         acc.merge(EMBremCollectionBuilderCfg(flags))
 
-    # Add e/gamma conversion finding.
+        if (flags.Tracking.writeExtendedSi_PRDInfo or
+            flags.Tracking.writeExtendedTRT_PRDInfo):
+            from DerivationFrameworkInDet.InDetToolsConfig import (
+                GSFTSOS_CommonKernelCfg)
+            acc.merge(GSFTSOS_CommonKernelCfg(flags))
+
+    # Add e/gamma conversion finding
     if flags.Egamma.doConversionBuilding:
         from egammaAlgs.EMVertexBuilderConfig import (
             EMVertexBuilderCfg)
diff --git a/Tracking/TrkConfig/python/TrkConfigFlags.py b/Tracking/TrkConfig/python/TrkConfigFlags.py
index c6310d405c2feab3f73104f836079b41b7f9e5ef..db39047a5c379f2da732530745ed42be1fc9d86d 100644
--- a/Tracking/TrkConfig/python/TrkConfigFlags.py
+++ b/Tracking/TrkConfig/python/TrkConfigFlags.py
@@ -154,7 +154,8 @@ def createTrackingConfigFlags():
     # Turn writing of seed validation ntuple on and off
     icf.addFlag("Tracking.writeSeedValNtuple", False)
     # Save xAOD TrackMeasurementValidation + TrackStateValidation containers
-    icf.addFlag("Tracking.writeExtendedPRDInfo", False)
+    icf.addFlag("Tracking.writeExtendedSi_PRDInfo", False)
+    icf.addFlag("Tracking.writeExtendedTRT_PRDInfo", False)
 
     # Toggle track slimming
     icf.addFlag("Tracking.doSlimming", lambda prevFlags:
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx
index e81422ce7ab2a33b07aa331ef00f3577b1243c0c..13228aab1b1c2743df5b0261f36f1a4847e0b929 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx
@@ -180,7 +180,7 @@ void LVL1::jFEXmetAlgo::buildFWDmet()
             m_met[iphi]+=getTTowerET(m_FPGA_fcal[iphi][ieta]);
         }
         const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA_fcal[iphi][0]);
-        m_met_angle[iphi]=(tmpTower->iPhi()/4)*(M_PI/8) + M_PI/16;
+        m_met_angle[iphi]=(static_cast<int>(tmpTower->iPhi()/4))*(M_PI/8) + M_PI/16;
     }
     buildMetXComponent();
     buildMetYComponent();
diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h
index 68994f169dfc26d988dd62c1aa04fe161b59b90e..631692925f8fd4721a0f0ad0dc4e733dcacb5bd8 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h
+++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h
@@ -37,7 +37,7 @@ public:
   static const std::string xAODTriggerTowerRerunLocation;
   static const std::string CPMTowerLocation;
   static const std::string JetElementLocation;
-  static const std::string xAODZdcMoudleLocation;
+  static const std::string xAODZdcModuleLocation;
 
   static const std::string CPMCMXDataLocation;
   static const std::string JetCMXDataLocation;
diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx
index e1d0b139528f72cd89d7c60e18ea21991f16f46b..4b4ca4003d1105b3a694d3e94c3baee614514445 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx
@@ -32,7 +32,7 @@ const std::string TrigT1CaloDefs::xAODTriggerTowerLocation="xAODTriggerTowers";
 const std::string TrigT1CaloDefs::xAODTriggerTowerRerunLocation="xAODTriggerTowers_rerun";
 const std::string TrigT1CaloDefs::JetElementLocation="JetElements";
 const std::string TrigT1CaloDefs::CPMTowerLocation="CPMTowers";
-const std::string TrigT1CaloDefs::xAODZdcMoudleLocation="ZdcModules";
+const std::string TrigT1CaloDefs::xAODZdcModuleLocation="ZdcModules";
 
 const std::string TrigT1CaloDefs::CPMHitsLocation="CPMHits";
 const std::string TrigT1CaloDefs::JEMHitsLocation="JEMHits";
diff --git a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx
index a5aea4466f725222b24c01418df9f17d8f80871f..bfd66f36b113ff6652e8fb756dc2758f1d395429 100644
--- a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx
+++ b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx
@@ -25,7 +25,8 @@ namespace LVL1 {
  StatusCode TrigT1ZDC::initialize()
  {
    ATH_CHECK(m_zdcCTPLocation.initialize());
-   ATH_CHECK(m_zdcModuleDataLocation.initialize());
+   ATH_CHECK(m_zdcModuleKey.initialize());
+   ATH_CHECK(m_zdcModuleCalibEnergyKey.initialize());
    // Find the full path to filename:
    std::string file = PathResolverFindCalibFile(m_lutFile);
    ATH_MSG_INFO("Reading file " << file);
@@ -63,33 +64,35 @@ namespace LVL1 {
  StatusCode TrigT1ZDC::execute(const EventContext &ctx) const
  {
    // access ZDC modules
-   SG::ReadHandle<xAOD::ZdcModuleContainer> zdcModHandle = SG::makeHandle(m_zdcModuleDataLocation, ctx);
+   SG::ReadHandle<xAOD::ZdcModuleContainer> zdcModules(m_zdcModuleKey, ctx);
+   // access ZDC aux data 
+   SG::ReadDecorHandle<xAOD::ZdcModuleContainer, float> zdcModuleCalibEnergyHandle( m_zdcModuleCalibEnergyKey, ctx);
+   // create vector to store module CalibEnergy
    std::vector<float> moduleEnergy = {0., 0., 0., 0., 0., 0., 0., 0.};
 
    // Read Single Modules
-   if (zdcModHandle.isValid())
+   if (zdcModules.isValid())
    {
-     const xAOD::ZdcModuleContainer *zdcSingleModules = zdcModHandle.cptr();
-     for (const auto zdcSM : *zdcSingleModules)
+     for (const auto zdcModule : *zdcModules)
      {
-       if (zdcSM->zdcType() == 0)
+       if (zdcModule->zdcType() == 0)
        { // type = 0 are big modules, type = 1 the pixels
-       ATH_MSG_DEBUG("ZDC Side " << zdcSM->zdcSide() << ", Module: " << zdcSM->zdcModule() << " and Energy: " << zdcSM->auxdataConst<float>("CalibEnergy"));
+       ATH_MSG_DEBUG("ZDC Side " << zdcModule->zdcSide() << ", Module: " << zdcModule->zdcModule() << " and Energy: " << zdcModuleCalibEnergyHandle(*zdcModule));
        // Side A
-       if (zdcSM->zdcSide() > 0)
+       if (zdcModule->zdcSide() > 0)
         {
-         moduleEnergy.at(zdcSM->zdcModule()) = zdcSM->auxdataConst<float>("CalibEnergy");
+         moduleEnergy.at(zdcModule->zdcModule()) = zdcModuleCalibEnergyHandle(*zdcModule);
         }
 
        // Side C
-       if (zdcSM->zdcSide() < 0)
+       if (zdcModule->zdcSide() < 0)
         {
-         moduleEnergy.at(zdcSM->zdcModule() + 4) = zdcSM->auxdataConst<float>("CalibEnergy");
+         moduleEnergy.at(zdcModule->zdcModule() + 4) = zdcModuleCalibEnergyHandle(*zdcModule);
         }
        }
      }
    }
-
+   
    // Get Output as an integer (0-7)
    m_modInputs_p->setData(moduleEnergy);
 
@@ -111,7 +114,6 @@ namespace LVL1 {
    //record CTP object
    ATH_CHECK(zdcCTP.record(std::make_unique<ZdcCTP>(word0)));
    ATH_MSG_DEBUG("Stored ZDC CTP object with words " << std::hex << (zdcCTP->cableWord0()) << " from LUTOutput " << std::dec << wordOut);
-
    return StatusCode::SUCCESS;
   }
  }
diff --git a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h
index 49e1ce5cee8a05d4018db5ff82a9cdc467e1bbc6..4c7a96f08844a00cd294b370c75c9702b82c23b3 100644
--- a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h
+++ b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h
@@ -19,6 +19,8 @@
 #include "GaudiKernel/ToolHandle.h"
 #include "AthContainers/DataVector.h"
 #include "StoreGate/ReadHandleKey.h"
+#include "StoreGate/ReadDecorHandle.h"
+#include "StoreGate/ReadDecorHandleKey.h"
 #include "StoreGate/WriteHandleKey.h"
 #include "PathResolver/PathResolver.h"
 
@@ -47,9 +49,12 @@ namespace LVL1 {
 
   private :
    /* Input handles */
-   SG::ReadHandleKey<xAOD::ZdcModuleContainer> m_zdcModuleDataLocation{
-       this, "ZdcModuleLocation", TrigT1CaloDefs::xAODZdcMoudleLocation,
+   SG::ReadHandleKey<xAOD::ZdcModuleContainer> m_zdcModuleKey{
+       this, "ZdcModuleLocation", TrigT1CaloDefs::xAODZdcModuleLocation,
        "Read handle key for ZdcModuleContainer"};
+       
+   SG::ReadDecorHandleKey<xAOD::ZdcModuleContainer> m_zdcModuleCalibEnergyKey 
+   {this, "ZdcModuleCalibEnergyKey", "ZdcModules.CalibEnergy", "ReadHandleKey for Zdc CalibEnergy AuxData"};
 
    /* Output handles */
    SG::WriteHandleKey<ZdcCTP> m_zdcCTPLocation{
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py
index c3cd89b54024f61a10c04ef24c4e931dc2716261..0bc4812f3265de4b498bb995e933ffdd2ff7c4be 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py
@@ -107,13 +107,13 @@ def getLowMuPhysicsSignatures():
 
 
         #--------- legacy physics electron chains
-        ChainProp(name='HLT_e15_lhloose_L1EM12',  stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter_tag','egammaMon:shifter']),
-        ChainProp(name='HLT_e15_loose_L1EM12',    stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter_tag','egammaMon:shifter']),
+        ChainProp(name='HLT_e15_lhloose_L1EM12',  stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter']),
+        ChainProp(name='HLT_e15_loose_L1EM12',    stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter']),
         ChainProp(name='HLT_e15_lhmedium_L1EM12', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup),
         ChainProp(name='HLT_e15_medium_L1EM12',   stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup),
 
-        ChainProp(name='HLT_e18_lhloose_L1EM15',  stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter_tp','egammaMon:shifter' ]),
-        ChainProp(name='HLT_e18_loose_L1EM15',    stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter_tp','egammaMon:shifter']),
+        ChainProp(name='HLT_e18_lhloose_L1EM15',  stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter']),
+        ChainProp(name='HLT_e18_loose_L1EM15',    stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter']),
         ChainProp(name='HLT_e18_lhmedium_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup),
         ChainProp(name='HLT_e18_medium_L1EM15',   stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup),
 
@@ -131,8 +131,8 @@ def getLowMuPhysicsSignatures():
         ChainProp(name='HLT_e20_idperf_loose_L1eEM18', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+SupportPhIGroup, monGroups=['idMon:t0']),
 
         #--------- phase-1 physics electron chains
-        ChainProp(name='HLT_e15_lhloose_L1eEM15',  stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:t0_tp','egammaMon:shifter']),
-        ChainProp(name='HLT_e15_loose_L1eEM15',    stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:t0_tp','egammaMon:shifter']),
+        ChainProp(name='HLT_e15_lhloose_L1eEM15',  stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:shifter']),
+        ChainProp(name='HLT_e15_loose_L1eEM15',    stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:shifter']),
         ChainProp(name='HLT_e15_lhmedium_L1eEM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryPhIGroup),
         ChainProp(name='HLT_e15_medium_L1eEM15',   stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryPhIGroup),