diff --git a/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx b/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx
index 42c6c0bd2a5bc1669458bc7e9e2b0dcb5b3c785a..65d54aed6a266c0bd3a46d380dde12b7c23855fc 100644
--- a/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx
+++ b/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx
@@ -20,6 +20,7 @@
 //C++ includes
 #include <math.h>
 #include <string.h>
+#include <CxxUtils/make_unique.h>
 
 //_____________________________________________________________________________
 CombinedP4FromRecoTaus::CombinedP4FromRecoTaus(const std::string& name) : 
diff --git a/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx b/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx
index 5a1351f769efe6932e71081cc7c31f54fdb38f0c..f729d0026240fc7e78c11385ce4ae1aaf749cec0 100644
--- a/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx
+++ b/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx
@@ -222,107 +222,129 @@ StatusCode TauProcessorTool::execute(){
 #ifdef XAOD_ANALYSIS //perhaps this should be ROOTCORE
 
   typedef std::vector< ElementLink< xAOD::PFOContainer > >  PFOLinks_t;
+  typedef std::vector< ElementLink< xAOD::TauTrackContainer > >  TauTrackLinks_t;
   const xAOD::PFOContainer* hadronicPFOs(0);
   const xAOD::PFOContainer* chargedPFOs(0);
   const xAOD::PFOContainer* neutralPFOs(0);
-  //  const xAOD::PFOContainer* shotPFOs(0);
+  const xAOD::PFOContainer* shotPFOs(0);
+  const xAOD::TauTrackContainer* tauTracks(0);
 
   if(evtStore()->contains<xAOD::PFOContainer>("TauHadronicParticleFlowObjectsFix"))
     ATH_CHECK(evtStore()->retrieve(hadronicPFOs, "TauHadronicParticleFlowObjectsFix"));
-  else
-    ATH_CHECK(evtStore()->retrieve(hadronicPFOs, "TauHadronicParticleFlowObjects"));
 
   if(evtStore()->contains<xAOD::PFOContainer>("TauChargedParticleFlowObjectsFix"))
     ATH_CHECK(evtStore()->retrieve(chargedPFOs, "TauChargedParticleFlowObjectsFix"));
-  else
-    ATH_CHECK(evtStore()->retrieve(chargedPFOs, "TauChargedParticleFlowObjects"));
 
   if(evtStore()->contains<xAOD::PFOContainer>("TauNeutralParticleFlowObjectsFix"))
     ATH_CHECK(evtStore()->retrieve(neutralPFOs, "TauNeutralParticleFlowObjectsFix"));
-  else
-    ATH_CHECK(evtStore()->retrieve(neutralPFOs, "TauNeutralParticleFlowObjects"));
 
-  // if(evtStore()->contains<xAOD::PFOContainer>("TauShotParticleFlowObjectsFix"))
-  //   ATH_CHECK(evtStore()->retrieve(shotPFOs, "TauShotParticleFlowObjectsFix"));
-  // else
-  //   ATH_CHECK(evtStore()->retrieve(neutralPFOs, "TauShotParticleFlowObjects"));
+  if(evtStore()->contains<xAOD::PFOContainer>("TauShotParticleFlowObjectsFix"))
+    ATH_CHECK(evtStore()->retrieve(shotPFOs, "TauShotParticleFlowObjectsFix"));
+
+  if(evtStore()->contains<xAOD::TauTrackContainer>("TauTracksFix"))
+    ATH_CHECK(evtStore()->retrieve(tauTracks, "TauTracksFix"));
 
 
   for(xAOD::TauJet* tau : *pContainer ) {    
 
-    const PFOLinks_t hadronicPFOLinks=tau->hadronicPFOLinks();
-    PFOLinks_t new_hadronicPFOLinks;
-    for( auto link : hadronicPFOLinks ){
-      ElementLink< xAOD::PFOContainer > new_link;
-      new_link.toContainedElement( *hadronicPFOs, hadronicPFOs->at(link.index()) );
-      new_hadronicPFOLinks.push_back(new_link);
+    if (hadronicPFOs) {
+      const PFOLinks_t hadronicPFOLinks=tau->hadronicPFOLinks();
+      PFOLinks_t new_hadronicPFOLinks;
+      for( const auto& link : hadronicPFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *hadronicPFOs, hadronicPFOs->at(link.index()) );
+        new_hadronicPFOLinks.push_back(new_link);
+      }
+      tau->setHadronicPFOLinks(new_hadronicPFOLinks);    
     }
-    tau->setHadronicPFOLinks(new_hadronicPFOLinks);    
-
-    const PFOLinks_t chargedPFOLinks=tau->chargedPFOLinks();
-    PFOLinks_t new_chargedPFOLinks;
-    for( auto link : chargedPFOLinks ){
-      ElementLink< xAOD::PFOContainer > new_link;
-      new_link.toContainedElement( *chargedPFOs, chargedPFOs->at(link.index()) );
-      new_chargedPFOLinks.push_back(new_link);
+    
+    if (chargedPFOs){
+      const PFOLinks_t chargedPFOLinks=tau->chargedPFOLinks();
+      PFOLinks_t new_chargedPFOLinks;
+      for( const auto& link : chargedPFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *chargedPFOs, chargedPFOs->at(link.index()) );
+        new_chargedPFOLinks.push_back(new_link);
+      }
+      tau->setChargedPFOLinks(new_chargedPFOLinks);    
     }
-    tau->setChargedPFOLinks(new_chargedPFOLinks);    
-
+    
+  if (neutralPFOs){
     const PFOLinks_t neutralPFOLinks=tau->neutralPFOLinks();
     PFOLinks_t new_neutralPFOLinks;
-    for( auto link : neutralPFOLinks ){
+    for( const auto& link : neutralPFOLinks ){
       ElementLink< xAOD::PFOContainer > new_link;
       new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
       new_neutralPFOLinks.push_back(new_link);
     }
     tau->setNeutralPFOLinks(new_neutralPFOLinks);    
-
-    const PFOLinks_t pi0PFOLinks=tau->pi0PFOLinks();
-    PFOLinks_t new_pi0PFOLinks;
-    for( auto link : pi0PFOLinks ){
-      ElementLink< xAOD::PFOContainer > new_link;
-      new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
-      new_pi0PFOLinks.push_back(new_link);
+  }
+    
+    if (neutralPFOs){
+      const PFOLinks_t pi0PFOLinks=tau->pi0PFOLinks();
+      PFOLinks_t new_pi0PFOLinks;
+      for( const auto& link : pi0PFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
+        new_pi0PFOLinks.push_back(new_link);
+      }
+      tau->setPi0PFOLinks(new_pi0PFOLinks);    
     }
-    tau->setPi0PFOLinks(new_pi0PFOLinks);    
-
-    const PFOLinks_t protoChargedPFOLinks=tau->protoChargedPFOLinks();
-    PFOLinks_t new_protoChargedPFOLinks;
-    for( auto link : protoChargedPFOLinks ){
-      ElementLink< xAOD::PFOContainer > new_link;
-      new_link.toContainedElement( *chargedPFOs, chargedPFOs->at(link.index()) );
-      new_protoChargedPFOLinks.push_back(new_link);
+    
+    if (chargedPFOs){
+      const PFOLinks_t protoChargedPFOLinks=tau->protoChargedPFOLinks();
+      PFOLinks_t new_protoChargedPFOLinks;
+      for( const auto& link : protoChargedPFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *chargedPFOs, chargedPFOs->at(link.index()) );
+        new_protoChargedPFOLinks.push_back(new_link);
+      }
+      tau->setProtoChargedPFOLinks(new_protoChargedPFOLinks);    
     }
-    tau->setProtoChargedPFOLinks(new_protoChargedPFOLinks);    
-
-    const PFOLinks_t protoNeutralPFOLinks=tau->protoNeutralPFOLinks();
-    PFOLinks_t new_protoNeutralPFOLinks;
-    for( auto link : protoNeutralPFOLinks ){
-      ElementLink< xAOD::PFOContainer > new_link;
-      new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
-      new_protoNeutralPFOLinks.push_back(new_link);
+    
+    if (neutralPFOs){
+      const PFOLinks_t protoNeutralPFOLinks=tau->protoNeutralPFOLinks();
+      PFOLinks_t new_protoNeutralPFOLinks;
+      for( const auto& link : protoNeutralPFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
+        new_protoNeutralPFOLinks.push_back(new_link);
+      }
+      tau->setProtoNeutralPFOLinks(new_protoNeutralPFOLinks);    
     }
-    tau->setProtoNeutralPFOLinks(new_protoNeutralPFOLinks);    
-
-    const PFOLinks_t protoPi0PFOLinks=tau->protoPi0PFOLinks();
-    PFOLinks_t new_protoPi0PFOLinks;
-    for( auto link : protoPi0PFOLinks ){
-      ElementLink< xAOD::PFOContainer > new_link;
-      new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
-      new_protoPi0PFOLinks.push_back(new_link);
+    
+    if (neutralPFOs){
+      const PFOLinks_t protoPi0PFOLinks=tau->protoPi0PFOLinks();
+      PFOLinks_t new_protoPi0PFOLinks;
+      for( const auto& link : protoPi0PFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *neutralPFOs, neutralPFOs->at(link.index()) );
+        new_protoPi0PFOLinks.push_back(new_link);
+      }
+      tau->setProtoPi0PFOLinks(new_protoPi0PFOLinks);    
+    }
+    
+    if (shotPFOs){
+      const PFOLinks_t shotPFOLinks=tau->shotPFOLinks();
+      PFOLinks_t new_shotPFOLinks;
+      for( const auto& link : shotPFOLinks ){
+        ElementLink< xAOD::PFOContainer > new_link;
+        new_link.toContainedElement( *shotPFOs, shotPFOs->at(link.index()) );
+        new_shotPFOLinks.push_back(new_link);
+      }
+      tau->setShotPFOLinks(new_shotPFOLinks);    
     }
-    tau->setProtoPi0PFOLinks(new_protoPi0PFOLinks);    
-
-    // const PFOLinks_t shotPFOLinks=tau->shotPFOLinks();
-    // PFOLinks_t new_shotPFOLinks;
-    // for( auto link : shotPFOLinks ){
-    //   ElementLink< xAOD::PFOContainer > new_link;
-    //   new_link.toContainedElement( *shotPFOs, shotPFOs->at(link.index()) );
-    //   new_shotPFOLinks.push_back(new_link);
-    // }
-    // tau->setShotPFOLinks(new_shotPFOLinks);    
-
 
+    if (tauTracks){
+      const TauTrackLinks_t tauTrackLinks=tau->allTauTrackLinks();
+      TauTrackLinks_t new_tauTrackLinks;
+      for( const auto& link : tauTrackLinks ){
+        ElementLink< xAOD::TauTrackContainer > new_link;
+        new_link.toContainedElement( *tauTracks, tauTracks->at(link.index()) );
+        new_tauTrackLinks.push_back(new_link);
+      }
+      tau->setAllTauTrackLinks(new_tauTrackLinks);    
+    }
   }
 
 #endif
diff --git a/Reconstruction/tauRecTools/tauRecTools/ToolsDef.h b/Reconstruction/tauRecTools/tauRecTools/ToolsDef.h
index 8bfacb614297dca7f3366e64b28e4fb8fa0224e8..2c490598947d3512b910aad7e228032026e4d618 100644
--- a/Reconstruction/tauRecTools/tauRecTools/ToolsDef.h
+++ b/Reconstruction/tauRecTools/tauRecTools/ToolsDef.h
@@ -18,6 +18,7 @@
 #include "tauRecTools/TauJetBDTEvaluator.h"
 #include "tauRecTools/TauIDVarCalculator.h"
 #include "tauRecTools/TauEleOLRDecorator.h"
+#include "tauRecTools/TauProcessorTool.h"
 
 REGISTER_TOOL(TauCalibrateLC)
 REGISTER_TOOL(TauCommonCalcVars)
@@ -35,3 +36,4 @@ REGISTER_TOOL(TauWPDecorator)
 REGISTER_TOOL(TauJetBDTEvaluator)
 REGISTER_TOOL(TauEleOLRDecorator)
 REGISTER_TOOL(TauIDVarCalculator)
+REGISTER_TOOL(TauProcessorTool)