diff --git a/Rich/RichFutureDAQ/src/component/RichRawBankDecoder.cpp b/Rich/RichFutureDAQ/src/component/RichRawBankDecoder.cpp
index 80b5e15e7988c4cf4e39dc02dd00790b938b7d3b..c4588c04108d0ac45eb1c99cd14c5454a6bc5d31 100644
--- a/Rich/RichFutureDAQ/src/component/RichRawBankDecoder.cpp
+++ b/Rich/RichFutureDAQ/src/component/RichRawBankDecoder.cpp
@@ -606,6 +606,20 @@ void RawBankDecoder::decodeToSmartIDs_StreamIDs( const LHCb::RawBank&    bank,
       id.setLargePMT( isLarge );
     }
 
+#ifdef USE_DD4HEP
+    // If built for DD4HEP apply correction to PMT module numbers to account
+    // for different numbering scheme between DD4HEP and DetDesc.
+    // We can do this because the encoding (Boole) when built for dd4hep
+    // uses the real data format
+    // https://gitlab.cern.ch/lhcb/Boole/-/merge_requests/382
+    // so we know if we get the Streaming format with DD4HEP it has to be
+    // using the DetDesc numbering scheme.
+    const Rich::DetectorArray<Rich::PanelArray<LHCb::RichSmartID::DataType>> mod_corr{{{0, 0}, {6, 18}}};
+    const auto pdMod      = id.pdMod() + mod_corr[id.rich()][id.panel()];
+    const auto pdNumInMod = id.pdNumInMod();
+    id.setPD( pdMod, pdNumInMod );
+#endif
+
     // Is ID OK ?
     if ( !id.isValid() ) {
       ++m_flatListReadWarn;