diff --git a/AllenOnline/src/MEPProvider.cpp b/AllenOnline/src/MEPProvider.cpp
index 848b470aa17113608ba79ef367ce974b3adb4736..118b02db80d439edc459b860ed0da62c19fb0a71 100755
--- a/AllenOnline/src/MEPProvider.cpp
+++ b/AllenOnline/src/MEPProvider.cpp
@@ -1599,6 +1599,9 @@ void MEPProvider::transpose( int thread_id ) {
       }
     }
 
+    m_odin_error_bank += std::accumulate( event_mask.begin(), event_mask.end(), 0,
+                                          []( size_t s, const char entry ) { return s + ( entry == 0 ); } );
+
     // Look for an ODIN bank that is not an error bank and decode the first one we find
     auto        ib            = to_integral( BankTypes::ODIN );
     auto const& odin_slice    = m_slices[ib][*slice_index];
@@ -1606,6 +1609,7 @@ void MEPProvider::transpose( int thread_id ) {
     auto const* odin_offsets  = odin_slice.offsets.data();
     auto const  interval_size = std::get<1>( interval ) - std::get<0>( interval );
 
+    bool                    have_odin = false;
     LHCb::RawBank::BankType odin_type;
     for ( size_t i_event = 0; i_event < interval_size; ++i_event ) {
       odin_type =
@@ -1620,8 +1624,12 @@ void MEPProvider::transpose( int thread_id ) {
           offset = odin_offsets[MEP::offset_index( MEP::number_of_banks( odin_offsets ), i_event, 0 )];
           size   = MEP::bank_size( odin_block, odin_slice.sizes.data(), i_event, 0 );
         }
-        m_odins[*slice_index] = MEP::decode_odin( odin_block, offset, size, m_banks_version[ib] );
-        break;
+        auto odin = MEP::decode_odin( odin_block, offset, size, m_banks_version[ib] );
+        if ( odin.runNumber() != 0 ) {
+          m_odins[*slice_index] = std::move( odin );
+          have_odin             = true;
+          break;
+        }
       }
     }
 
@@ -1637,8 +1645,10 @@ void MEPProvider::transpose( int thread_id ) {
       std::scoped_lock lock{m_transpose_mut, m_buffer_mutex};
 
       // Update transposed status
-      transpose_it->slice_index  = *slice_index;
-      transpose_it->n_transposed = n_transposed;
+      if ( have_odin ) {
+        transpose_it->slice_index  = *slice_index;
+        transpose_it->n_transposed = n_transposed;
+      }
 
       if ( n_transposed != std::get<1>( interval ) - std::get<0>( interval ) ) {
         auto& status = m_buffer_status[i_buffer];
@@ -1651,7 +1661,7 @@ void MEPProvider::transpose( int thread_id ) {
 
     if ( m_transpose_done ) {
       m_transpose_cond.notify_all();
-    } else {
+    } else if ( have_odin ) {
       m_transposed_cond.notify_one();
     }
     slice_index.reset();
diff --git a/AllenOnline/src/MEPProvider.h b/AllenOnline/src/MEPProvider.h
index 30793b3c737bc2f20d50a070203be0cf053b93d0..54820557a203d25ff52c29b300596e6c8ebead0d 100644
--- a/AllenOnline/src/MEPProvider.h
+++ b/AllenOnline/src/MEPProvider.h
@@ -336,10 +336,11 @@ private:
   Gaudi::Property<bool>                       m_thread_per_buffer{this, "ThreadPerBuffer", true};
   Gaudi::Property<bool>                       m_mask_top5{this, "MaskSourceIDTop5", false};
 
-  Gaudi::Accumulators::Counter<> m_mep_null{this, "MEP is NULL"};
-  Gaudi::Accumulators::Counter<> m_mep_bad_magic{this, "MEP magic invalid"};
-  Gaudi::Accumulators::Counter<> m_mep_empty{this, "MEP has no MFPs"};
-  Gaudi::Accumulators::Counter<> m_mep_without_odin{this, "MEP without ODIN MFP"};
+  Gaudi::Accumulators::Counter<> m_mep_null{this, "MEP_is_NULL"};
+  Gaudi::Accumulators::Counter<> m_mep_bad_magic{this, "MEP_magic_invalid"};
+  Gaudi::Accumulators::Counter<> m_mep_empty{this, "MEP_no_MFPs"};
+  Gaudi::Accumulators::Counter<> m_mep_without_odin{this, "MEP_without_ODIN_MFP"};
+  Gaudi::Accumulators::Counter<> m_odin_error_bank{this, "ODIN_error_bank"};
 
   std::unordered_map<unsigned int, unsigned int> m_mfp_bin_mapping;
   using Histo1U = Gaudi::Accumulators::Histogram<1, Gaudi::Accumulators::atomicity::full, float>;
diff --git a/AllenOnline/src/TransposeMEP.cpp b/AllenOnline/src/TransposeMEP.cpp
index 527c5e6ffb60dfb1f009f5f87090931a40887d73..24a0ab9397b17036cfdd66427459a5a2192020e8 100644
--- a/AllenOnline/src/TransposeMEP.cpp
+++ b/AllenOnline/src/TransposeMEP.cpp
@@ -217,6 +217,10 @@ std::tuple<bool, bool, size_t> MEP::mep_offsets( Allen::Slices& slices, int cons
       unsigned fragment_offset = 0;
       for ( unsigned i_event = 0; i_event < event_end; ++i_event ) {
         if ( i_event >= event_start ) {
+
+          auto& [run_id, event_id]          = event_ids.emplace_back( 0, 0 );
+          event_mask[i_event - event_start] = 0;
+
           if ( bank_types[i_event] == LHCb::RawBank::ODIN ) {
             auto const odin =
                 decode_odin( block.payload, fragment_offset, bank_sizes[i_event], block.header->block_version );
@@ -224,17 +228,17 @@ std::tuple<bool, bool, size_t> MEP::mep_offsets( Allen::Slices& slices, int cons
             auto const     event_number    = odin.eventNumber();
 
             // if splitting by run, check all events have same run number
-            if ( !run_number ) {
-              run_number = odin_run_number;
-            } else if ( split_by_run && run_number && odin_run_number != *run_number ) {
-              event_end = i_event;
-              break;
+            if ( odin_run_number != 0 ) {
+              if ( !run_number ) {
+                run_number = odin_run_number;
+              } else if ( split_by_run && run_number && odin_run_number != *run_number ) {
+                event_end = i_event;
+                break;
+              }
+              run_id                            = odin_run_number;
+              event_id                          = event_number;
+              event_mask[i_event - event_start] = 1;
             }
-            event_ids.emplace_back( odin_run_number, event_number );
-            event_mask[i_event - event_start] = 1;
-          } else {
-            event_ids.emplace_back( 0, 0 );
-            event_mask[i_event - event_start] = 0;
           }
         }
         fragment_offset += bank_sizes[i_event] + EB::get_padding( bank_sizes[i_event], 1 << align );
@@ -341,14 +345,17 @@ bool MEP::transpose_mep( Allen::Slices& slices, int const slice_index,
     if ( allen_type == BankTypes::ODIN ) {
       // decode ODIN bank to obtain run and event numbers
       for ( uint16_t i_event = start_event; i_event < end_event; ++i_event ) {
-        if ( bank_types[i_event] != LHCb::RawBank::ODIN ) {
-          event_ids.emplace_back( 0, 0 );
-          event_mask[i_event - start_event] = 0;
-        } else {
+        auto& [odin_id, event_id]         = event_ids.emplace_back( 0, 0 );
+        event_mask[i_event - start_event] = 0;
+
+        if ( bank_types[i_event] == LHCb::RawBank::ODIN ) {
           auto const odin =
               decode_odin( block.payload, source_offsets[i_event], bank_sizes[i_event], block.header->block_version );
-          event_ids.emplace_back( odin.runNumber(), odin.eventNumber() );
-          event_mask[i_event - start_event] = 1;
+          if ( odin.runNumber() != 0 ) {
+            odin_id                           = odin.runNumber();
+            event_id                          = odin.eventNumber();
+            event_mask[i_event - start_event] = 1;
+          }
         }
       }
     }