diff --git a/LumiBlock/LumiBlockComps/CMakeLists.txt b/LumiBlock/LumiBlockComps/CMakeLists.txt
index 9da1ecb9e5bf843bae13bc0161b28c82de23f4ad..b820de377fbc592aa7b7d766e0eb42e1761f63a8 100644
--- a/LumiBlock/LumiBlockComps/CMakeLists.txt
+++ b/LumiBlock/LumiBlockComps/CMakeLists.txt
@@ -75,6 +75,10 @@ atlas_add_test( TrigLiveFractionCondAlgConfig_test
                 SCRIPT python -m LumiBlockComps.TrigLiveFractionCondAlgConfig
                 LOG_SELECT_PATTERN "ComponentAccumulator|^---|^IOVDbSvc" )
 
+atlas_add_test( LumiBlockMuWriterConfig_test
+                SCRIPT python -m LumiBlockComps.LumiBlockMuWriterConfig
+                LOG_SELECT_PATTERN "ComponentAccumulator|^---|^IOVDbSvc" )
+
 
 atlas_add_test( BunchCrossingCondAlg 
                 SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/python/BunchCrossingCondAlgTest.py
diff --git a/LumiBlock/LumiBlockComps/python/LumiBlockMuWriterConfig.py b/LumiBlock/LumiBlockComps/python/LumiBlockMuWriterConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..d11045f8bc4e7b7ec641a0560d87e9e95c62bd70
--- /dev/null
+++ b/LumiBlock/LumiBlockComps/python/LumiBlockMuWriterConfig.py
@@ -0,0 +1,50 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+#
+# File: LumiBlockComps/python/LumiBlockMuWriterConfig.py
+# Created: May 2020, sss
+# Purpose: Configure LumiBlockMuWriter.
+#
+
+
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+
+
+def LumiBlockMuWriterCfg (configFlags, name = 'LumiBlockMuWriter'):
+    result = ComponentAccumulator()
+
+    if configFlags.Beam.Type == 'cosmics':
+        condkey = ''
+    else:
+        from LumiBlockComps.LuminosityCondAlgConfig import LuminosityCondAlgCfg
+        result.merge (LuminosityCondAlgCfg (configFlags))
+        condkey = result.getCondAlgo ('LuminosityCondAlg').LuminosityOutputKey
+
+    LumiBlockMuWriter = CompFactory.LumiBlockMuWriter # LumiBlockComps
+    alg = LumiBlockMuWriter (name, LumiDataKey = condkey)
+    result.addCondAlgo (alg)
+    return result
+
+
+if __name__ == "__main__":
+    from AthenaCommon.Configurable import Configurable
+    Configurable.configurableRun3Behavior=1
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
+    ConfigFlags.loadAllDynamicFlags()
+
+    print ('--- collisions')
+    flags1 = ConfigFlags.clone()
+    flags1.Input.Files = defaultTestFiles.RAW
+    flags1.lock()
+    acc1 = LumiBlockMuWriterCfg (flags1)
+    acc1.printCondAlgs (summariseProps=True)
+    acc1.wasMerged()
+
+    print ('--- cosmics')
+    flags2 = ConfigFlags.clone()
+    flags2.Beam.Type = 'cosmics'
+    flags2.lock()
+    acc2 = LumiBlockMuWriterCfg (flags2)
+    acc2.printCondAlgs (summariseProps=True)
+    acc2.wasMerged()
diff --git a/LumiBlock/LumiBlockComps/python/LumiBlockMuWriterDefault.py b/LumiBlock/LumiBlockComps/python/LumiBlockMuWriterDefault.py
new file mode 100644
index 0000000000000000000000000000000000000000..2dc94cbb4084be178ca2541608236490c045203e
--- /dev/null
+++ b/LumiBlock/LumiBlockComps/python/LumiBlockMuWriterDefault.py
@@ -0,0 +1,60 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+#
+# File: LumiBlockComps/python/LumiBlockMuWriterDefault.py
+# Created: May 2020, sss
+# Purpose: Configure LumiBlockMuWriter.
+#
+
+
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaCommon.BeamFlags import jobproperties
+
+
+def LumiBlockMuWriterDefault (name = 'LumiBlockMuWriter'):
+    from AthenaCommon.AlgSequence import AthSequencer
+    from AthenaCommon.AlgSequence import AlgSequence
+
+    condSeq = AthSequencer ('AthCondSeq')
+    topSequence = AlgSequence()
+    if hasattr (condSeq, name) or hasattr (topSequence, name):
+        return
+
+    LumiBlockMuWriter = CompFactory.LumiBlockMuWriter # LumiBlockComps
+    if jobproperties.Beam.beamType() == 'cosmics':
+        condkey = ''
+    else:
+        from LumiBlockComps.LuminosityCondAlgDefault import LuminosityCondAlgDefault
+        condalg = LuminosityCondAlgDefault()
+        condkey = condalg.LuminosityOutputKey
+        
+    alg = LumiBlockMuWriter (name, LumiDataKey = condkey)
+
+    cnvseq = None
+    cnvalg = getattr (condSeq, 'xAODMaker::EventInfoCnvAlg', None)
+    if cnvalg:
+        cnvseq = condSeq
+    else:
+        cnvalg = getattr (topSequence, 'xAODMaker::EventInfoCnvAlg', None)
+        if cnvalg:
+            cnvseq = topSequence
+
+    # FIXME: If EventInfoCnvAlg is in topSequence, then this needs to come
+    # after it.  Otherwise, schedule to condSeq so we'll be run early.
+    if cnvalg and cnvseq is topSequence:
+        topSequence += alg
+    else:
+        condSeq += alg
+
+    from AthenaCommon.GlobalFlags  import globalflags
+    from RecExConfig.ObjKeyStore import objKeyStore
+
+    if (cnvalg  and
+        not globalflags.InputFormat.is_bytestream() and
+        not objKeyStore.isInInput ("xAOD::EventInfo")):
+        sgil = getattr (topSequence, 'SGInputLoader', None)
+        if sgil:
+            for k in sgil.Load[:]:
+                if k[1].find ('EventInfo') >= 0:
+                    sgil.Load.remove (k)
+    return
+
diff --git a/LumiBlock/LumiBlockComps/python/LuminosityCondAlgDefault.py b/LumiBlock/LumiBlockComps/python/LuminosityCondAlgDefault.py
index 34efdbb5bcea863e8ca1ec46321171c5a83ea640..c7c87b4684bcd84a19e744f1bc5c061eb8a170aa 100644
--- a/LumiBlock/LumiBlockComps/python/LuminosityCondAlgDefault.py
+++ b/LumiBlock/LumiBlockComps/python/LuminosityCondAlgDefault.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 #
 # File: LumiBlockComps/python/LuminosityCondAlgDefault.py
 # Created: May 2019, sss, from existing LuminosityToolDefault.
@@ -38,13 +38,13 @@ def LuminosityCondAlgDefault (name = 'LuminosityCondAlg',
     kwargs = {}
 
     from IOVDbSvc.CondDB import conddb
-    if isOnline:
-        kwargs = configureOnlineLuminosityCondAlg (name)
-
-    elif conddb.isMC:
+    if conddb.isMC:
         mlog.info("LuminosityCondAlgDefault called for MC!")
         kwargs = configureLuminosityCondAlgMC (name)
 
+    elif isOnline:
+        kwargs = configureOnlineLuminosityCondAlg (name)
+
     elif conddb.dbdata == "COMP200":
         kwargs = configureLuminosityCondAlgRun1 (name)
 
diff --git a/LumiBlock/LumiBlockComps/share/LumiBlockMuWriterConfig_test.ref b/LumiBlock/LumiBlockComps/share/LumiBlockMuWriterConfig_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..91beb8b7506454af7fdd7659166a8c3fb5d8b928
--- /dev/null
+++ b/LumiBlock/LumiBlockComps/share/LumiBlockMuWriterConfig_test.ref
@@ -0,0 +1,26 @@
+Py:Athena            INFO using release [WorkDir-22.0.14] [x86_64-centos7-gcc8-opt] [atlas-work3/85ffba7a6ec] -- built on [2020-05-15T0253]
+--- collisions
+Py:AutoConfigFlags    INFO Obtaining metadata of auto-configuration by peeking into /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1
+Py:MetaReader        INFO Current mode used: peeker
+Py:MetaReader        INFO Current filenames: ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1']
+Py:LuminosityCondAlg    INFO luminosityCondAlgRun2Config requested /TRIGGER/OFLLUMI/OflPrefLumi
+Py:LuminosityCondAlg    INFO Created Run2 LuminosityCondAlg using folder /TRIGGER/OFLLUMI/OflPrefLumi
+Py:ComponentAccumulator    INFO Condition Algorithms
+Py:ComponentAccumulator    INFO  \__ CondInputLoader (cond alg)
+Py:ComponentAccumulator    INFO      * Load: [['CondAttrListCollection', '/TRIGGER/OFLLUMI/OflPrefLumi'], ['CondAttrListCollection', '/TDAQ/OLC/CALIBRATIONS']]
+Py:ComponentAccumulator    INFO  \__ OnlineLumiCalibrationCondAlg (cond alg)
+Py:ComponentAccumulator    INFO      * CalibrationFolderInputKey: /TDAQ/OLC/CALIBRATIONS
+Py:ComponentAccumulator    INFO      * LumiCalibOutputKey: OnlineLumiCalibrationCondData
+Py:ComponentAccumulator    INFO  \__ LuminosityCondAlg (cond alg)
+Py:ComponentAccumulator    INFO      * BunchGroupInputKey: 
+Py:ComponentAccumulator    INFO      * BunchLumisInputKey: 
+Py:ComponentAccumulator    INFO      * FillParamsInputKey: 
+Py:ComponentAccumulator    INFO      * LuminosityFolderInputKey: /TRIGGER/OFLLUMI/OflPrefLumi
+Py:ComponentAccumulator    INFO      * LuminosityOutputKey: LuminosityCondData
+Py:ComponentAccumulator    INFO      * OnlineLumiCalibrationInputKey: OnlineLumiCalibrationCondData
+Py:ComponentAccumulator    INFO  \__ LumiBlockMuWriter (cond alg)
+Py:ComponentAccumulator    INFO      * LumiDataKey: LuminosityCondData
+--- cosmics
+Py:ComponentAccumulator    INFO Condition Algorithms
+Py:ComponentAccumulator    INFO  \__ LumiBlockMuWriter (cond alg)
+Py:ComponentAccumulator    INFO      * LumiDataKey: 
diff --git a/LumiBlock/LumiBlockComps/share/LumiBlockMuWriter_jobOptions.py b/LumiBlock/LumiBlockComps/share/LumiBlockMuWriter_jobOptions.py
index 440c6bfa1a3df46d7abb914108d5639a71e8db1c..814024cd8a2eb4a4f279075585e412e4d1b8692c 100644
--- a/LumiBlock/LumiBlockComps/share/LumiBlockMuWriter_jobOptions.py
+++ b/LumiBlock/LumiBlockComps/share/LumiBlockMuWriter_jobOptions.py
@@ -1,12 +1,5 @@
 """ Configuration for LumiBlockMuWriter to write mu into xAOD::EventInfo
 """
 
-from LumiBlockComps.LuminosityCondAlgDefault import LuminosityCondAlgDefault
-condalg = LuminosityCondAlgDefault()
-
-from LumiBlockComps.LumiBlockCompsConf import LumiBlockMuWriter
-muWriter = LumiBlockMuWriter("LumiBlockMuWriter",LumiDataKey=condalg.LuminosityOutputKey)
-
-from AthenaCommon.AlgSequence import AthSequencer
-condSeq = AthSequencer("AthCondSeq")
-condSeq += muWriter
+from LumiBlockComps.LumiBlockMuWriterDefault import LumiBlockMuWriterDefault
+LumiBlockMuWriterDefault()
diff --git a/LumiBlock/LumiBlockComps/src/LumiBlockMuWriter.cxx b/LumiBlock/LumiBlockComps/src/LumiBlockMuWriter.cxx
index 3f6decf3f3bd9cadf2202664e7a805de9383a9c7..99854b1abb697114400af524d91a59faf4817422 100644
--- a/LumiBlock/LumiBlockComps/src/LumiBlockMuWriter.cxx
+++ b/LumiBlock/LumiBlockComps/src/LumiBlockMuWriter.cxx
@@ -15,7 +15,7 @@ StatusCode LumiBlockMuWriter::initialize()
 {
   ATH_MSG_INFO("LumiBlockMuWriter::initialize()");
 
-  ATH_CHECK(m_lumiDataKey.initialize());
+  ATH_CHECK(m_lumiDataKey.initialize(SG::AllowEmpty));
   ATH_CHECK(m_actIntPerXKey.initialize());
   ATH_CHECK(m_aveIntPerXKey.initialize());
 
@@ -28,14 +28,18 @@ StatusCode LumiBlockMuWriter::execute(const EventContext& ctx)  const
 
   float actualMu = 0.0;
   float muToLumi = 0.0;
-  SG::ReadCondHandle<LuminosityCondData> lumiData (m_lumiDataKey, ctx);
-  if (lumiData->lbAverageLuminosity() != 0 ||
-      lumiData->lbAverageInteractionsPerCrossing() != 0) {
-    muToLumi = lumiData->muToLumi();
-    if( std::abs( muToLumi ) > 0.00001 ) {
-      unsigned int bcid = ctx.eventID().bunch_crossing_id();
-      actualMu = lumiData->lbLuminosityPerBCIDVector().at(bcid) / muToLumi;
+  float aveIntPerX = 0.0;
+  if (!m_lumiDataKey.empty()) {
+    SG::ReadCondHandle<LuminosityCondData> lumiData (m_lumiDataKey, ctx);
+    if (lumiData->lbAverageLuminosity() != 0 ||
+        lumiData->lbAverageInteractionsPerCrossing() != 0) {
+      muToLumi = lumiData->muToLumi();
+      if( std::abs( muToLumi ) > 0.00001 ) {
+        unsigned int bcid = ctx.eventID().bunch_crossing_id();
+        actualMu = lumiData->lbLuminosityPerBCIDVector().at(bcid) / muToLumi;
+      }
     }
+    aveIntPerX = lumiData->lbAverageInteractionsPerCrossing();
   }
 
   SG::WriteDecorHandle<xAOD::EventInfo,float> actIntPerXDecor(m_actIntPerXKey,ctx);
@@ -43,14 +47,18 @@ StatusCode LumiBlockMuWriter::execute(const EventContext& ctx)  const
     ATH_MSG_ERROR( "actIntPerXDecor.isPresent check fails" );
     return StatusCode::FAILURE;
   }
-  actIntPerXDecor(0) = actualMu;
+  if (!actIntPerXDecor.isAvailable()) {
+    actIntPerXDecor(0) = actualMu;
+  }
     
   SG::WriteDecorHandle<xAOD::EventInfo,float> aveIntPerXDecor(m_aveIntPerXKey,ctx);
   if (!aveIntPerXDecor.isPresent()) {
     ATH_MSG_ERROR( "aveIntPerXDecor.isPresent check fails" );
     return StatusCode::FAILURE;
   }
-  aveIntPerXDecor(0) = lumiData->lbAverageInteractionsPerCrossing();
+  if (!aveIntPerXDecor.isAvailable()) {
+    aveIntPerXDecor(0) = aveIntPerX;
+  }
 
   return StatusCode::SUCCESS;
 }
diff --git a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
index d2b6b134d25fe685f72906d0bb6a214293240fc4..071ecb68d6d36144fea86ddd11287580d0654ae9 100644
--- a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
+++ b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
@@ -599,7 +599,7 @@ if rec.doESD() and rec.readRDO():
     if globalflags.DataSource()=='geant4':
         include_muwriter = hasattr( condSeq, "xAODMaker::EventInfoCnvAlg" )
     else:
-        include_muwriter = jobproperties.Beam.beamType()=="collisions" and not athenaCommonFlags.isOnline()
+        include_muwriter = not athenaCommonFlags.isOnline()
 
     if include_muwriter:
         try:
diff --git a/Trigger/TrigValidation/TriggerTest/share/testLVL1CTPAthenaTrigRDO.py b/Trigger/TrigValidation/TriggerTest/share/testLVL1CTPAthenaTrigRDO.py
index fa219cefafd1ca2e91f772d75c007acfb5454004..75190797d1a6db70251484e2dda79e097a5e484b 100644
--- a/Trigger/TrigValidation/TriggerTest/share/testLVL1CTPAthenaTrigRDO.py
+++ b/Trigger/TrigValidation/TriggerTest/share/testLVL1CTPAthenaTrigRDO.py
@@ -65,6 +65,9 @@ GenerateMenu.overwriteSignaturesWith(L1Only)
 include("RecExCommon/RecExCommon_topOptions.py")
 #-----------------------------------------------------------
 
+from LumiBlockComps.LumiBlockMuWriterDefault import LumiBlockMuWriterDefault
+LumiBlockMuWriterDefault()
+
 #------------------------------------------------------------
 include("TriggerTest/TriggerTestCommon.py")
 #------------------------------------------------------------