diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx
index ff59ee21dc3097dcb67922a5c0230edca628b7d5..7297444bd3bccb5ca97de14a8ff616225a8194e7 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx
@@ -3356,8 +3356,8 @@ namespace top {
 	 m_mu_true_type[i] = 0;
 	 m_mu_true_origin[i] = 0;
 	 m_mu_true_isPrompt[i] = 0;
-         m_mu_prodVtx_z[i] = 0;
-         m_mu_prodVtx_perp[i] = 0;
+         m_mu_prodVtx_z[i] = -999;
+         m_mu_prodVtx_perp[i] = -999;
 	 if (muPtr->isAvailable<unsigned int>("particleType")) {
 	     m_mu_true_type[i] = muPtr->auxdata<unsigned int>("particleType");
 	 } else if (muPtr->isAvailable<unsigned int>("classifierParticleType")) {
diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx
index f275f6a6f1566982269f966752d84a8914c980d9..7d758e5c932891bae250c799516cfde3638eab09 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopHLUpgrade/Root/UpgradeObjectLoader.cxx
@@ -127,6 +127,10 @@ ParticleLevelEvent UpgradeObjectLoader::load() {
   const xAOD::TruthParticleContainer * origmuons(0);
   top::check( evtStore()->retrieve( origmuons, m_config->sgKeyTruthMuons() ),
       "xAOD::TEvent::retrieve failed for Truth Muons" );
+  // get truth particles
+  const xAOD::TruthParticleContainer * truthpart(0);
+  top::check( evtStore()->retrieve( truthpart, m_config->sgKeyMCParticle() ),
+      "xAOD::TEvent::retrieve failed for Truth Particles" );
 
   // Shallow copy 
   auto muons_shallowCopy = xAOD::shallowCopyContainer( *origmuons );
@@ -151,15 +155,27 @@ ParticleLevelEvent UpgradeObjectLoader::load() {
     else muon->auxdata<int>("passReco") = 0;
 
     // apply all cuts
-    if( m_objectSelector_Muon->apply( *muon ) ) m_selectedMuons->push_back( muon );
-
-    //add production vertex info
-    const ElementLink<xAOD::TruthVertexContainer> prodVtxLink =
-      muon->auxdata<ElementLink< xAOD::TruthVertexContainer > >("prodVtxLink");
-    if(prodVtxLink.isValid()) {
-      const xAOD::TruthVertex *tvtx = *prodVtxLink;
-      muon->auxdata<float>("prodVtx_z") = tvtx->z();
-      muon->auxdata<float>("prodVtx_perp") = tvtx->perp();
+    if( m_objectSelector_Muon->apply( *muon ) ) {
+
+      //find matching truth particle by barcode
+      //this is done after selection to spend less time looping all TPs
+      for (const auto tp : *truthpart) {
+        if (muon->barcode() == tp->barcode()) {
+          //Add production vertex info- only truthparticle has a working
+          //prodVtxLink
+          const ElementLink<xAOD::TruthVertexContainer> prodVtxLink =
+            tp->auxdata<ElementLink< xAOD::TruthVertexContainer > >
+            ("prodVtxLink");
+          if(prodVtxLink.isValid()) {
+            const xAOD::TruthVertex *tvtx = *prodVtxLink;
+            muon->auxdata<float>("prodVtx_z") = tvtx->z();
+            muon->auxdata<float>("prodVtx_perp") = tvtx->perp();
+          }
+          break;
+        }
+      }
+
+      m_selectedMuons->push_back( muon );
     }
   }