diff --git a/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.cxx b/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.cxx
index 7a1868e648126fabc288f7a050d94b9d2071cdb1..b72d4a96f35d6b6446a8fec0b3e6ed358477de1d 100644
--- a/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.cxx
+++ b/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.cxx
@@ -187,7 +187,7 @@ LuminosityCondAlg::updateAvgLumi (const CondAttrListCollection& lumiData,
   lumi.setLbAverageInteractionsPerCrossing (LBAvEvtsPerBX);
 
   // Check validity of per-BCID luminosity (will issue warning in recalcPerBCIDLumi
-  int perBcidValid = (valid/10) % 10;
+  int perBcidValid = ((valid&0x3ff)/10) % 10;
   if ((perBcidValid > 0) && m_skipInvalid) {
     return StatusCode::SUCCESS;
   }
@@ -227,16 +227,20 @@ LuminosityCondAlg::updatePerBunchLumi (const EventContext& ctx,
                                        LuminosityCondData& lumi) const
 {
   if (lumi.lbAverageLuminosity() <= 0.) {
-    ATH_MSG_WARNING( "LBAvInstLumi is zero or negative in recalculatePerBCIDLumi():"
+    ATH_MSG_WARNING( "LBAvInstLumi is zero or negative in updatePerBunchLumi():"
                      << lumi.lbAverageLuminosity());
     return StatusCode::SUCCESS;
   }
 
-  ATH_CHECK( updateMuToLumi (ctx, calibChannel, range, lumi) );
+  bool isValid = true;
+  ATH_CHECK( updateMuToLumi (ctx, calibChannel, range, lumi, isValid) );
 
   // Check here if we want to do this the Run1 way (hard) or the Run2 way (easy)
 
-  if (bunchInstLumiBlob != nullptr) { // Run2 way, easy
+  if (!isValid) {
+    // Skip if not valid.
+  }
+  else if (bunchInstLumiBlob != nullptr) { // Run2 way, easy
     ATH_CHECK( updatePerBunchLumiRun2 (*bunchInstLumiBlob,
                                        preferredChannel,
                                        lumi) );
@@ -248,7 +252,7 @@ LuminosityCondAlg::updatePerBunchLumi (const EventContext& ctx,
                                        lumi) );
   }
 
-  ATH_MSG_DEBUG( "finished recalculatePerBCIDLumi() for alg: "
+  ATH_MSG_DEBUG( "finished updatePerBunchLumi() for alg: "
                  << preferredChannel );
   return StatusCode::SUCCESS;
 }
@@ -261,12 +265,14 @@ LuminosityCondAlg::updatePerBunchLumi (const EventContext& ctx,
  * @param range Validity range of the conditions data being filled.
  *              Updated if needed.
  * @param lumi Output luminosity data being filled.
+ * @param isValid Set to false if data are not valid.
  */
 StatusCode
 LuminosityCondAlg::updateMuToLumi (const EventContext& ctx,
                                    unsigned int calibChannel,
                                    EventIDRange& range,
-                                   LuminosityCondData& lumi) const
+                                   LuminosityCondData& lumi,
+                                   bool& isValid) const
 {
   SG::ReadCondHandle<OnlineLumiCalibrationCondData> onlineLumiCalibration
     ( m_onlineLumiCalibrationInputKey, ctx );
@@ -285,9 +291,11 @@ LuminosityCondAlg::updateMuToLumi (const EventContext& ctx,
     ATH_MSG_WARNING(" Found muToLumi = " << muToLumi << " for backup channel " << m_calibBackupChannel);
   }
 
+  lumi.setMuToLumi (muToLumi);
+
   // Check validity
-  bool isValid = true;
-  int perBcidValid = (lumi.lbAverageValid()/10) % 10;
+  isValid = true;
+  int perBcidValid = ((lumi.lbAverageValid()&0x3ff)/10) % 10;
   if ((lumi.lbAverageValid() & 0x03) || (perBcidValid > 0)) {  // Skip if either per-BCID or LBAv is invalid
     isValid = false;
     if (m_skipInvalid) {
@@ -311,13 +319,12 @@ LuminosityCondAlg::updateMuToLumi (const EventContext& ctx,
 
     // Don't keep negative values
     muToLumi = 0.;
+    lumi.setMuToLumi (muToLumi);
   }
 
   ATH_MSG_DEBUG(" Found muToLumi = " << muToLumi << " for channel "
                 << calibChannel );
 
-  lumi.setMuToLumi (muToLumi);
-
   return StatusCode::SUCCESS;
 }
 
@@ -333,7 +340,7 @@ LuminosityCondAlg::updatePerBunchLumiRun2 (const coral::Blob& bunchInstLumiBlob,
                                            unsigned int preferredChannel,
                                            LuminosityCondData& lumi) const
 {
-  ATH_MSG_DEBUG( "starting Run2 recalculatePerBCIDLumi() for alg: " << preferredChannel );
+  ATH_MSG_DEBUG( "starting updatePerBunchLumiRun2() for alg: " << preferredChannel );
 
   // Check that the length isn't zero
   if (bunchInstLumiBlob.size() == 0) {
@@ -402,7 +409,7 @@ LuminosityCondAlg::updatePerBunchLumiRun1 (const EventContext& ctx,
                                            EventIDRange& range,
                                            LuminosityCondData& lumi) const
 {
-  ATH_MSG_DEBUG( "starting Run1 recalculatePerBCIDLumi() for alg: " << preferredChannel );
+  ATH_MSG_DEBUG( "starting updatePerBunchLumiRun1() for alg: " << preferredChannel );
     
   if (preferredChannel == 0) {
     return StatusCode::SUCCESS;
@@ -447,6 +454,10 @@ LuminosityCondAlg::updatePerBunchLumiRun1 (const EventContext& ctx,
 
   // Get the raw data for the preferred channel
   const std::vector<float>& rawLumiVec = bunchLumis->rawLuminosity(preferredChannel);
+  if (rawLumiVec.empty()) {
+    ATH_MSG_DEBUG( "Empty raw luminosity vector" );
+    return StatusCode::SUCCESS;
+  }
 
   //
   // Calibration step
@@ -469,9 +480,9 @@ LuminosityCondAlg::updatePerBunchLumiRun1 (const EventContext& ctx,
   double lumiSum = 0.;
   for (unsigned int bcid : luminousBunches) {
     // Don't waste time on zero lumi 
-    if (rawLumiVec[bcid] <= 0.) {
+    if (rawLumiVec.at(bcid) <= 0.) {
       ATH_MSG_DEBUG( "Calibrate BCID " << bcid << " with raw "
-                     << rawLumiVec[bcid] << " -> skipping" );
+                     << rawLumiVec.at(bcid) << " -> skipping" );
       continue;
     }
 
diff --git a/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.h b/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.h
index b7c1b5fd7cfc765518f14dde3169062411ed44f3..affb126917feccad6f182d35111af78bccb84ecb 100644
--- a/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.h
+++ b/LumiBlock/LumiBlockComps/src/LuminosityCondAlg.h
@@ -95,12 +95,14 @@ private:
    * @param range Validity range of the conditions data being filled.
    *              Updated if needed.
    * @param lumi Output luminosity data being filled.
+   * @param isValid Set to false if data are not valid.
    */
   StatusCode
   updateMuToLumi (const EventContext& ctx,
                   unsigned int calibChannel,
                   EventIDRange& range,
-                  LuminosityCondData& lumi) const;
+                  LuminosityCondData& lumi,
+                  bool& isValid) const;
 
 
   /**
diff --git a/LumiBlock/LumiBlockComps/test/LuminosityCondAlg_test.cxx b/LumiBlock/LumiBlockComps/test/LuminosityCondAlg_test.cxx
index aaf9579c7d268b4ec3207982178078c00ca40ac2..d5ddb2760f932c083f63f1b2d17d1591c5f1fc6a 100644
--- a/LumiBlock/LumiBlockComps/test/LuminosityCondAlg_test.cxx
+++ b/LumiBlock/LumiBlockComps/test/LuminosityCondAlg_test.cxx
@@ -146,8 +146,6 @@ std::unique_ptr<CondAttrListCollection> make_run1_attrlist()
   al["LBAvInstLumi"].setValue (1.5f);
   al["LBAvEvtsPerBX"].setValue (10.5f);
   unsigned int valid = (42) << 22;
-  // Round up to next 100.
-  valid = ((valid+99)/100) * 100;
   al["Valid"].setValue (valid);
   attrs->add (0, al);
   return attrs;
@@ -348,7 +346,7 @@ void test2 (ISvcLocator* svcloc)
   assert( data->lbAverageLuminosity() == 1.5 );
   assert( data->lbAverageInteractionsPerCrossing() == 10.5 );
   assert( (data->lbAverageValid() >> 22) == 42 );
-  assert( (data->lbAverageValid() % 100) == 0 );
+  assert( ((data->lbAverageValid()&0x3ff) % 100) == 0 );
   assert( data->muToLumi() == 2.5 );
 
   std::vector<float> vec = data->lbLuminosityPerBCIDVector();