diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h
index 2dccea7173127ca0b421e43685cae60ec087d9a8..9539b074c4350f32aa7016124dbf52eb08378b6b 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h
@@ -24,6 +24,8 @@ namespace FlavorTagDiscriminants {
     StatusCode initialize() override;
 
     virtual void decorate(const xAOD::Jet& jet) const override;
+
+    virtual std::set<std::string> getDecoratorKeys() const override;
   private:
     std::string m_flipTagConfig;
     std::unique_ptr<BTagJetAugmenter> m_aug; //!
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h
index fe60ee7d813211018d35ffe61c3e5a1e328185f5..e52024bf1aa8792813a219c451ff0989aaac73d2 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h
@@ -29,6 +29,7 @@ namespace FlavorTagDiscriminants {
     ~BTagMuonAugmenter();
     BTagMuonAugmenter(BTagMuonAugmenter&&);
     void augment(const xAOD::Jet& jet) const;
+    std::set<std::string> getDecoratorKeys() const;
   private:
     // You'll probably have to add some accessors here
     BTagTrackIpAccessor m_btag_track_aug;
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h
index 3ac936f4d8aa3154ced0010ff5d796afb610143c..b31a8a74c0e152a7ab7ca54229861c1cdc5f2ac7 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h
@@ -24,6 +24,8 @@ namespace FlavorTagDiscriminants {
 
     // returns 0 for success
     virtual void decorate(const xAOD::Jet& jet) const override;
+
+    virtual std::set<std::string> getDecoratorKeys() const override;
   private:
     std::unique_ptr<BTagMuonAugmenter> m_aug;
     std::string m_muonAssociationName;
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h
index ca12cdadd51cf86b455ecea725ed2714b5fdd472..cbf746fefa3b41bf692c2c1658956317a7a43f80 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h
@@ -29,6 +29,8 @@ namespace FlavorTagDiscriminants {
 
     // returns 0 for success
     virtual void decorate(const xAOD::Jet& jet) const override;
+
+    virtual std::set<std::string> getDecoratorKeys() const override;
   private:
     DL2Properties m_props; //!
     std::unique_ptr<DL2HighLevel> m_dl2; //!
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h
index 2d13b4b32b5879691320671db7f360c96f7f4097..a90885a9b44b976c38260e691007ef5eaaefd54e 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h
@@ -20,6 +20,8 @@ public:
   /// Method to decorate a jet.
   virtual void decorate(const xAOD::Jet& jet) const = 0;
 
+  // Names of the decorations being added
+  virtual std::set<std::string> getDecoratorKeys() const = 0;
 };
 
 
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx
index 5daf2dbcdadb3b93551f62f2baf6a794e6580353..ec0bea99966d8be9360caf6b165f0d065530bf6a 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx
@@ -27,4 +27,9 @@ namespace FlavorTagDiscriminants {
     m_aug->augment(jet);
   }
 
+  std::set<std::string> BTagAugmenterTool::getDecoratorKeys() const {
+    const auto keys{m_aug->getDecoratorKeys()};
+    return std::set<std::string>(keys.begin(), keys.end());
+  }
+
 }
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx
index 81a2fb6996361d57495203827d4dd0ff3e688e9c..1c20b56e6990bc6470f9a3f68f7287eddd583fe0 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx
@@ -163,4 +163,29 @@ namespace FlavorTagDiscriminants {
 
   }
 
+std::set<std::string> BTagMuonAugmenter::getDecoratorKeys() const {
+  const auto& type_registry = SG::AuxTypeRegistry::instance();
+  std::set<std::string> keys;
+  for (const auto& auxid: {
+    m_dec_muon_isDefaults.auxid(),
+    m_dec_muon_pt.auxid(),
+    m_dec_muon_dR.auxid(),
+    m_dec_muon_eta.auxid(),
+    m_dec_muon_phi.auxid(),
+    m_dec_muon_qOverPratio.auxid(),
+    m_dec_muon_mombalsignif.auxid(),
+    m_dec_muon_scatneighsignif.auxid(),
+    m_dec_muon_pTrel.auxid(),
+    m_dec_muon_ip3d_d0.auxid(),
+    m_dec_muon_ip3d_z0.auxid(),
+    m_dec_muon_ip3d_d0_significance.auxid(),
+    m_dec_muon_ip3d_z0_significance.auxid(),
+    m_dec_muon_ip3d_sigma_d0.auxid(),
+    m_dec_muon_ip3d_sigma_z0.auxid(),
+    m_dec_muon_link.auxid()}) {
+    keys.insert(type_registry.getName(auxid));
+  }
+  return keys;
+}
+
 }
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx
index 8616b719b49282a1af183e757f294a52266fd2eb..0b1926fd91969be7ea29533c5c458b9d5fd9421b 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx
@@ -31,4 +31,8 @@ namespace FlavorTagDiscriminants {
     m_aug->augment(jet);
   }
 
+  std::set<std::string> BTagMuonAugmenterTool::getDecoratorKeys() const {
+    return m_aug->getDecoratorKeys();
+  }
+
 }
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx
index 818ab6c1dc4696b681aaa123d93f7a27a7c872de..32f219f8a82d8329f4d9af1da34d1f97abb0fb20 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx
@@ -32,4 +32,8 @@ namespace FlavorTagDiscriminants {
     m_dl2->decorate(jet);
   }
 
+  std::set<std::string> DL2Tool::getDecoratorKeys() const {
+    return m_dl2->getDataDependencyNames().bTagOutputs;
+  }
+
 }
diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h
index eec3d81b75b7d135d56e7d353186496fed664d72..8c23a51e79b08d86408aa8497fb304b59bac92ef 100644
--- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h
+++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h
@@ -55,6 +55,7 @@ namespace Analysis
 
         SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_dec_track_pos {this, "trackDisplacement","trackDisplacement","trackDisplacement of tracks" };
         SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_dec_track_mom {this, "trackMomentum","trackMomentum","trackMomentum of tracks" };
+        std::vector<std::unique_ptr<SG::WriteDecorHandleKey<xAOD::BTaggingContainer>>> m_outputKeys;
 
   }; // End class
 
diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
index 0f88f4e5737182dfb6525c49194d7f9ce826962c..9aca1b66364752a76f85e1df2ea52d4522a6d4c3 100644
--- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
@@ -61,6 +61,14 @@ namespace Analysis {
     CHECK( m_dec_track_pos.initialize() );
     CHECK( m_dec_track_mom.initialize() );
 
+    // create and initialize write handles
+    for (const std::string key: m_jetDecorator->getDecoratorKeys()) {
+      std::string full_key = m_BTagCollectionName.key() + "." + key;
+      ATH_MSG_DEBUG("Adding " << full_key);
+      m_outputKeys.emplace_back(std::make_unique<SG::WriteDecorHandleKey<xAOD::BTaggingContainer>>(this, key, full_key, ""));
+      ATH_MSG_DEBUG("Initializing " << full_key);
+      ATH_CHECK(m_outputKeys.back()->initialize());
+    }
     return StatusCode::SUCCESS;
   }
 
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
index bffb1d02ae036c091f9724c89952a309e6c2f367..e1b1bd77bfdaa55119ccec78c57370ade43f5557 100755
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
@@ -80,6 +80,7 @@ JetTagMonitorAlgorithm::~JetTagMonitorAlgorithm() {}
 
 StatusCode JetTagMonitorAlgorithm::initialize() {
 
+  ATH_CHECK(AthMonitorAlgorithm::initialize());
   ATH_CHECK(m_jetContainerKey.initialize());
   ATH_CHECK(m_muonContainerKey.initialize());
   ATH_CHECK(m_electronContainerKey.initialize());
@@ -87,7 +88,24 @@ StatusCode JetTagMonitorAlgorithm::initialize() {
   ATH_CHECK(m_vertContainerKey.initialize());
   ATH_CHECK(m_trackContainerKey.initialize());
 
-  return AthMonitorAlgorithm::initialize();
+  if (m_btagLinkKey.empty()) {
+    m_btagLinkKey = m_jetContainerKey.key() + ".btaggingLink";
+  }
+  ATH_CHECK(m_btagLinkKey.initialize());
+
+  if (m_btagResultKey.empty()) {
+    if (m_mv_algorithmName=="DL1" || m_mv_algorithmName=="DL1r" || m_mv_algorithmName=="DL1rnn") {
+      std::string rawJetContainerName = m_jetContainerKey.key();
+      const size_t jetStringItr = rawJetContainerName.find("Jets");
+      if (jetStringItr != std::string::npos) {
+        rawJetContainerName = rawJetContainerName.replace(jetStringItr, std::string::npos, "");
+      }
+      m_btagResultKey = "BTagging_" + rawJetContainerName + "." + m_mv_algorithmName + "_pb";
+    }
+  }
+  ATH_CHECK(m_btagResultKey.initialize(SG::AllowEmpty));
+
+  return StatusCode::SUCCESS;
 }
 
 
@@ -745,7 +763,9 @@ double JetTagMonitorAlgorithm::getMVweight(const xAOD::Jet *jet) const {
     bTaggingObject->pc(m_mv_algorithmName,mv_pc);
     bTaggingObject->pb(m_mv_algorithmName,mv_pb);
     //DL1* formula (standard)
-    mv = log( mv_pb / ( mv_pu * ( 1 - m_mv_cFraction ) + mv_pc * m_mv_cFraction ) );
+    if ( mv_pb != 0 && (mv_pu != 0 || mv_pc || 0)) {
+      mv = log( mv_pb / ( mv_pu * ( 1 - m_mv_cFraction ) + mv_pc * m_mv_cFraction ) );
+    }
     //DL1*c formula (for DL1c)
     //mv = log( mv_pb / ( mv_pu * ( 1 - m_mv_bFraction ) + mv_pc * m_mv_bFraction ) );
   }
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
index 9864bd41640e808efadc06819c9a725696771be0..d8e8ea769698cce70411d3c085e1357b40bdf6fb 100755
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
@@ -42,6 +42,8 @@ class JetTagMonitorAlgorithm : public AthMonitorAlgorithm {
   SG::ReadHandleKey<xAOD::JetContainer> m_jetContainerKey;
   SG::ReadHandleKey<xAOD::MuonContainer> m_muonContainerKey;
   SG::ReadHandleKey<xAOD::ElectronContainer> m_electronContainerKey;
+  SG::ReadDecorHandleKey<xAOD::JetContainer> m_btagLinkKey{this,"BTagLinkKey","","RDHK for btag links"};
+  SG::ReadDecorHandleKey<xAOD::BTaggingContainer> m_btagResultKey{this,"BTagResultKey","","RDHK for monitored BTag variables"};
   
   bool m_skipJetFilter; //true for HI/HI-p collisions, false for pp collisions
   std::string m_trackParticleName;