diff --git a/src/bmtf_orbit_processor.cc b/src/bmtf_orbit_processor.cc
index 7a4974a7e7c0a9ab1938abb45a98c891457fbf93..c4406a90926871e5ba6cecfca3fb2d51820c5af0 100644
--- a/src/bmtf_orbit_processor.cc
+++ b/src/bmtf_orbit_processor.cc
@@ -4,8 +4,7 @@
 
 #include "log.h"
 
-int BmtfOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header,
-                                     WriteMemRegion &writer, MemRegion &reader) {
+int BmtfOrbitProcessor::ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) {
   using SourceDataType = blockBmtf;
   using SinkDataType = uint64_t;
   const uint32_t source_data_length = 8;
@@ -28,8 +27,8 @@ int BmtfOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_heade
 
   // header word of packed bmtf stub data contains count of stubs in bx
   // as well as the warning test enable flag.
-  uint32_t header = uint32_t{(static_cast<uint32_t>(has_header) << 8) + bx_data.count};
-  writer.Fill(BxMetadataType{header, bx, orbit});
+  md.header = uint32_t{(static_cast<uint32_t>(md.header) << 8) + bx_data.count};
+  writer.Fill(md);
   writer.Fill(bx_data.GetBuffer(), bx_data.GetSize());
 
   return bx_data.count;  // Original incremented counts by sCount
diff --git a/src/bmtf_orbit_processor.h b/src/bmtf_orbit_processor.h
index 766af6d9506207d5cd8fe691cde0d2bc18dab390..f5bbc6cb71ec414da20a0330c37a42edb3459296 100644
--- a/src/bmtf_orbit_processor.h
+++ b/src/bmtf_orbit_processor.h
@@ -7,8 +7,7 @@ class BmtfOrbitProcessor : public OrbitProcessor {
   using OrbitProcessor::OrbitProcessor;
 
  protected:
-  int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                   MemRegion &reader) override;
+  int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) override;
 
   inline uint32_t GetPacketSize() const {
     // size of bmtf stubs packet is 4bytes*(3headerWords + 2frames*8dataWords)=236
diff --git a/src/calo_obj_orbit_processor.cc b/src/calo_obj_orbit_processor.cc
index 1ad8fca88613f36694cff21858434bf76e219228..3fb950917bd61f360c0b905e343cbd3ae93383d6 100644
--- a/src/calo_obj_orbit_processor.cc
+++ b/src/calo_obj_orbit_processor.cc
@@ -5,8 +5,7 @@
 #include "log.h"
 
 // Returns the counts if valid or a negative error code
-int CaloObjOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header,
-                                        WriteMemRegion &writer, MemRegion &reader) {
+int CaloObjOrbitProcessor::ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) {
   using SourceDataType = blockCaloObj;
   using SinkDataType = uint32_t;
   const uint32_t source_data_length = 12;
@@ -29,8 +28,8 @@ int CaloObjOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_he
     return -1;
   }
 
-  auto header = uint32_t{(static_cast<uint32_t>(has_header) << 8) + bx_data.count};
-  writer.Fill(BxMetadataType{header, bx, orbit});
+  md.header = uint32_t{(static_cast<uint32_t>(md.header) << 8) + bx_data.count};
+  writer.Fill(md);
   writer.Fill(bx_data.GetBuffer(), bx_data.GetSize());
 
   return bx_data.count;  // Original increments counts for each oBlocksOn toggled.
diff --git a/src/calo_obj_orbit_processor.h b/src/calo_obj_orbit_processor.h
index 4df90016300fe1e3327ff46a4c1ee12420124aad..225afa635c00191fc18298e813557039959bde95 100644
--- a/src/calo_obj_orbit_processor.h
+++ b/src/calo_obj_orbit_processor.h
@@ -30,8 +30,7 @@ class CaloObjOrbitProcessor : public OrbitProcessor {
   }
 
  protected:
-  int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                   MemRegion &reader) override;
+  int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) override;
 
   inline uint32_t GetPacketSize() const {
     // size of calo object packet is 4bytes*(3headerWords + 2frames*8dataWords)=76
diff --git a/src/calo_orbit_processor.cc b/src/calo_orbit_processor.cc
index af62cb187584581009e15ce98d7bf216ac81e4ad..1a7606b2be12f432ff7421086c14999c5aafe53b 100644
--- a/src/calo_orbit_processor.cc
+++ b/src/calo_orbit_processor.cc
@@ -2,8 +2,7 @@
 
 #include <cassert>
 
-int CaloOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header,
-                                     WriteMemRegion &writer, MemRegion &reader) {
+int CaloOrbitProcessor::ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) {
   struct CaloLinkData {
     uint32_t id;
     uint32_t data[6];  // Contains inverse matrix `calo0..6[id]` from `blockCalo`
@@ -22,8 +21,7 @@ int CaloOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_heade
         {i, bl->calo0[i], bl->calo1[i], bl->calo2[i], bl->calo3[i], bl->calo4[i], bl->calo5[i]});
   }
 
-  auto header = uint32_t{has_header};  // header can be added to later
-  writer.Fill(BxMetadataType{header, bx, orbit});
+  writer.Fill(BxMetadata{md.header, md.bx, md.orbit});
   writer.Fill(bx_data.GetBuffer(), bx_data.GetSize());
 
   return 1;  // Returns one in the original
diff --git a/src/calo_orbit_processor.h b/src/calo_orbit_processor.h
index 01b2e9946982f7aee6bba962114d73d3946cf8b3..41f1e29beb30ac446e8a8b665a9d347e2fc38b6c 100644
--- a/src/calo_orbit_processor.h
+++ b/src/calo_orbit_processor.h
@@ -7,8 +7,7 @@ class CaloOrbitProcessor : public OrbitProcessor {
   using OrbitProcessor::OrbitProcessor;
 
  protected:
-  int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                   MemRegion &reader) override;
+  int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) override;
 
   inline uint32_t GetPacketSize() const {
     // size of calo packet is 4bytes*(8links*7dataWords + 3headerWords)=236 bytes.
diff --git a/src/calo_sum_orbit_processor.cc b/src/calo_sum_orbit_processor.cc
index 594e9ef8ba4862264b7734b9cde24d8c144065ec..c242ec3c2699aa0ec96c8430caeeb8ad78b632fc 100644
--- a/src/calo_sum_orbit_processor.cc
+++ b/src/calo_sum_orbit_processor.cc
@@ -2,8 +2,7 @@
 
 #include <cassert>
 
-int CaloSumOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool, WriteMemRegion &writer,
-                                        MemRegion &reader) {
+int CaloSumOrbitProcessor::ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) {
   struct BxMetadataType {
     uint32_t bx;
     uint32_t orbit;
@@ -14,9 +13,11 @@ int CaloSumOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool, Write
   //  const uint32_t source_data_length = 6;
 
   assert(reader.CheckBounds(sizeof(SourceDataType)));
+
   SourceDataType *bl = reader.Scan<SourceDataType>();
   //  BxData<SinkDataType, source_data_length> bx_data;
-  writer.Fill(BxMetadataType{bx, orbit});
+
+  writer.Fill(BxMetadataType{md.bx, md.orbit});
   writer.Fill(bl->calo_sum, sizeof(bl->calo_sum));
 
   return 6;  // Original left counts at zero
diff --git a/src/calo_sum_orbit_processor.h b/src/calo_sum_orbit_processor.h
index 8c7ba977e3ca072e2727d3eda44e234e3e13b003..4cdf2ff113fce9d92f7cb52690143e048b72f2b8 100644
--- a/src/calo_sum_orbit_processor.h
+++ b/src/calo_sum_orbit_processor.h
@@ -7,8 +7,7 @@ class CaloSumOrbitProcessor : public OrbitProcessor {
   using OrbitProcessor::OrbitProcessor;
 
  protected:
-  int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                   MemRegion &reader) override;
+  int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) override;
 
   inline uint32_t GetPacketSize() const {
     // size of calo sums packet is 4bytes*(2headerWords + 1frames*8dataWords)=40
diff --git a/src/muon_orbit_processor.cc b/src/muon_orbit_processor.cc
index b7b8c118a664f8ec69fb2a21229517eecbd0c85f..1d8423df57737cd0d580fc09da9a5895189e5f2f 100644
--- a/src/muon_orbit_processor.cc
+++ b/src/muon_orbit_processor.cc
@@ -4,8 +4,7 @@
 
 #include "log.h"
 
-int MuonOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header,
-                                     WriteMemRegion &writer, MemRegion &reader) {
+int MuonOrbitProcessor::ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) {
   struct MuonLinkData {
     uint32_t f;
     uint32_t s;
@@ -45,10 +44,10 @@ int MuonOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool has_heade
 
   // header word of packed muon data contains number of muons in words 3-4 and number of muons in
   // words 5-6, as well as the warning test enable flag.
-  auto header = uint32_t{(bx_data_1.count << 16) + ((static_cast<uint32_t>(has_header)) << 8) +
-                         bx_data_2.count};
+  md.header = uint32_t{(bx_data_1.count << 16) + ((static_cast<uint32_t>(md.header)) << 8) +
+                       bx_data_2.count};
 
-  writer.Fill(BxMetadataType{header, bx, orbit});
+  writer.Fill(BxMetadata{md.header, md.bx, md.orbit});
   writer.Fill(bx_data_1.GetBuffer(), bx_data_1.GetSize());
   writer.Fill(bx_data_2.GetBuffer(), bx_data_2.GetSize());
 
diff --git a/src/muon_orbit_processor.h b/src/muon_orbit_processor.h
index e1c4467cc3dcb0ab71c7757873ba3c593261dd13..fdf266ec9e03ab93787d911a0926ec9f271697e3 100644
--- a/src/muon_orbit_processor.h
+++ b/src/muon_orbit_processor.h
@@ -7,8 +7,7 @@ class MuonOrbitProcessor : public OrbitProcessor {
   using OrbitProcessor::OrbitProcessor;
 
  protected:
-  int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                   MemRegion &reader) override;
+  int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) override;
 
   inline uint32_t GetPacketSize() const { return (3 + 2 * 8 * 3) * 4; }
 
diff --git a/src/orbit_processor.cc b/src/orbit_processor.cc
index 2324b6de9f97be856de0e6652cb5645f35148e95..e8f6c9139d6bbb901b48c99933e032c1444dee61 100644
--- a/src/orbit_processor.cc
+++ b/src/orbit_processor.cc
@@ -154,7 +154,7 @@ OrbitProcessor::FillOrbitMetadata OrbitProcessor::FillOrbit(orbit_trailer *trail
     WriteMemRegion writer(&wr_ptr, wr_end_ptr);
     assert(writer.CheckBounds(GetPacketSize()));  // Max size a decoded block can use
 
-    if (int ret_counts = ProcessBlock(bx, orbit, orbit_header.second, writer, reader);
+    if (int ret_counts = ProcessBlock({orbit_header.second, bx, orbit}, writer, reader);
         ret_counts == -1) {
       continue;  // skip bunch crossing
     } else {
diff --git a/src/orbit_processor.h b/src/orbit_processor.h
index f7bf84bc7e922fdf5f5cd28d3e34a85357eb9d9d..fbedf90d096a03eb8fed50d77dbb9b1ce8e5d7fb 100644
--- a/src/orbit_processor.h
+++ b/src/orbit_processor.h
@@ -43,7 +43,7 @@ class OrbitProcessor : public Processor {
     uint32_t count = 0;
   };
 
-  struct BxMetadataType {
+  struct BxMetadata {
     uint32_t header;
     uint32_t bx;
     uint32_t orbit;
@@ -104,8 +104,7 @@ class OrbitProcessor : public Processor {
 
   void ProcessSliceImpl(Slice &input, Slice &out) override;
 
-  virtual int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                           MemRegion &reader) = 0;
+  virtual int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) = 0;
 
   virtual uint32_t GetPacketSize() const = 0;
 
diff --git a/src/ugt_orbit_processor.cc b/src/ugt_orbit_processor.cc
index 88147824300a5ba278fe6bb879955ef1408c8161..aacf829b4bdb7a6e12b0672bb13986de28831ea1 100644
--- a/src/ugt_orbit_processor.cc
+++ b/src/ugt_orbit_processor.cc
@@ -2,8 +2,7 @@
 
 #include <cassert>
 
-int UgtOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool, WriteMemRegion &writer,
-                                    MemRegion &reader) {
+int UgtOrbitProcessor::ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) {
   struct BxMetadataType {
     uint32_t bx;
     uint32_t orbit;
@@ -12,7 +11,7 @@ int UgtOrbitProcessor::ProcessBlock(uint32_t bx, uint32_t orbit, bool, WriteMemR
   using SourceDataType = blockUgt;
 
   assert(reader.CheckBounds(sizeof(SourceDataType)));
-  writer.Fill(BxMetadataType{bx, orbit});
+  writer.Fill(BxMetadataType{md.bx, md.orbit});
 
   memcpy(writer.Scan<SourceDataType>(), reader.Scan<SourceDataType>(), sizeof(SourceDataType));
 
diff --git a/src/ugt_orbit_processor.h b/src/ugt_orbit_processor.h
index 9616f868cba584150392456760cee44616b4cd01..b645da5faf3bf9e02d4c1ccc0883b6f1dce64a2d 100644
--- a/src/ugt_orbit_processor.h
+++ b/src/ugt_orbit_processor.h
@@ -7,8 +7,7 @@ class UgtOrbitProcessor : public OrbitProcessor {
   using OrbitProcessor::OrbitProcessor;
 
  protected:
-  int ProcessBlock(uint32_t bx, uint32_t orbit, bool has_header, WriteMemRegion &writer,
-                   MemRegion &reader) override;
+  int ProcessBlock(BxMetadata md, WriteMemRegion &writer, MemRegion &reader) override;
 
   inline uint32_t GetPacketSize() const {
     // size of ugt bits packet is 4bytes*(2headerWords + 2frames*8dataWords)