diff --git a/Reconstruction/tauRec/python/tauRecFlags.py b/Reconstruction/tauRec/python/tauRecFlags.py
index fef5f98b99b6b5e7fbf646d50b3c6b9a62cacc70..3e9f8fa0b4e9f312581eb5fc34d6903762a213bf 100644
--- a/Reconstruction/tauRec/python/tauRecFlags.py
+++ b/Reconstruction/tauRec/python/tauRecFlags.py
@@ -88,7 +88,7 @@ class tauRecRNNTrackClassificationConfig(JobProperty):
     """
     statusOn=True
     allowedTypes=['string']
-    StoredValue=["TauTrackRNN_offline_BLSTM_v1.json"]
+    StoredValue=["TauTrackRNN_LSTM_L40_Sum_v0.json"]
 
 class tauRecSeedMaxEta(JobProperty):
     """ max allowed abs_eta of jet seed
diff --git a/Reconstruction/tauRec/src/TauProcessorAlg.cxx b/Reconstruction/tauRec/src/TauProcessorAlg.cxx
index c14f633e7f5a762679ba449eeca0c7b868b20248..bcfd12998e958f5ad6e059db524cfaa643da23ca 100644
--- a/Reconstruction/tauRec/src/TauProcessorAlg.cxx
+++ b/Reconstruction/tauRec/src/TauProcessorAlg.cxx
@@ -173,9 +173,6 @@ StatusCode TauProcessorAlg::execute() {
       xAOD::TauJet* pTau = new xAOD::TauJet();
       pContainer->push_back( pTau );
       pTau->setJet(pSeedContainer, pSeed);
-
-      // This sets one track and link. Need to have at least 1 track linked to retrieve track container
-      setEmptyTauTrack(pTau, pTauTrackCont);
       
       //-----------------------------------------------------------------
       // Loop stops when Failure indicated by one of the tools
@@ -184,16 +181,22 @@ StatusCode TauProcessorAlg::execute() {
       for (ToolHandle<ITauToolBase>& tool : m_tools) {
 	ATH_MSG_DEBUG("ProcessorAlg Invoking tool " << tool->name());
 
-        if (tool->type() == "TauVertexFinder" ) { 
-          sc = tool->executeVertexFinder(*pTau);
-        }
-        else if ( tool->type() == "TauTrackFinder") { 
-          sc = tool->executeTrackFinder(*pTau);
-        }
-        else if ( tool->name().find("ShotFinder") != std::string::npos){
+	if (tool->type() == "TauVertexFinder" ) {
+	  sc = tool->executeVertexFinder(*pTau);
+	}
+	else if ( tool->type() == "TauTrackFinder") {
+	  sc = tool->executeTrackFinder(*pTau, *pTauTrackCont);
+	}
+	else if ( tool->type() == "tauRecTools::TauTrackClassifier") {
+	  sc = tool->executeTrackClassifier(*pTau, *pTauTrackCont);
+	}
+	else if ( tool->type() == "tauRecTools::TauTrackRNNClassifier") {
+	  sc = tool->executeRNNTrackClassifier(*pTau, *pTauTrackCont);
+	}
+	else if ( tool->type() == "TauShotFinder"){
 	  sc = tool->executeShotFinder(*pTau, *tauShotClusContainer, *tauShotPFOContainer);
 	}
-	else if ( tool->name().find("Pi0ClusterFinder") != std::string::npos){
+	else if ( tool->type() == "TauPi0CreateROI"){
 	  sc = tool->executePi0CreateROI(*pTau, *Pi0CellContainer, addedCellsMap);
 	}
 	else {
@@ -227,15 +230,3 @@ StatusCode TauProcessorAlg::execute() {
   return StatusCode::SUCCESS;
 }
 
-void TauProcessorAlg::setEmptyTauTrack(xAOD::TauJet* &pTau, 
-				       xAOD::TauTrackContainer* tauTrackContainer)
-{  
-  // Make a new tau track, add to container
-  xAOD::TauTrack* pTrack = new xAOD::TauTrack();
-  tauTrackContainer->push_back(pTrack);
-    
-  // Create an element link for that track
-  ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
-  linkToTauTrack.toContainedElement(*tauTrackContainer, pTrack);
-  pTau->addTauTrackLink(linkToTauTrack);
-}
diff --git a/Reconstruction/tauRec/src/TauRunnerAlg.cxx b/Reconstruction/tauRec/src/TauRunnerAlg.cxx
index eccf6f11699f8fab98d3d1fa0a26ee9d89da81b6..9932035bf7879987ae02b1e6007b680c2edc7699 100644
--- a/Reconstruction/tauRec/src/TauRunnerAlg.cxx
+++ b/Reconstruction/tauRec/src/TauRunnerAlg.cxx
@@ -175,22 +175,22 @@ StatusCode TauRunnerAlg::execute() {
     
       for (ToolHandle<ITauToolBase>& tool : m_tools) {
 	ATH_MSG_DEBUG("RunnerAlg Invoking tool " << tool->name());
-	if ( tool->name().find("Pi0ClusterCreator") != std::string::npos){
-          sc = tool->executePi0ClusterCreator(*pTau, *neutralPFOContainer, *hadronicClusterPFOContainer, *pi0CaloClusterContainer, *pPi0ClusterContainer);
-        }
-	else if ( tool->name().find("VertexVariables") != std::string::npos){
+	if ( tool->type() == "TauPi0ClusterCreator"){
+	  sc = tool->executePi0ClusterCreator(*pTau, *neutralPFOContainer, *hadronicClusterPFOContainer, *pi0CaloClusterContainer, *pPi0ClusterContainer);
+	}
+	else if ( tool->type() == "TauVertexVariables"){
 	  sc = tool->executeVertexVariables(*pTau, *pSecVtxContainer);
 	}
-	else if ( tool->name().find("Pi0ClusterScaler") != std::string::npos){
+	else if ( tool->type() == "TauPi0ClusterScaler"){
 	  sc = tool->executePi0ClusterScaler(*pTau, *neutralPFOContainer, *chargedPFOContainer);
 	}
-	else if ( tool->name().find("Pi0ScoreCalculator") != std::string::npos){
+	else if ( tool->type() == "TauPi0ScoreCalculator"){
 	  sc = tool->executePi0nPFO(*pTau, *neutralPFOContainer);
 	}
-	else if ( tool->name().find("Pi0Selector") != std::string::npos){
+	else if ( tool->type() == "TauPi0Selector"){
 	  sc = tool->executePi0nPFO(*pTau, *neutralPFOContainer);
 	}
-	else if ( tool->name().find("PanTau") != std::string::npos){
+	else if ( tool->type() == "PanTau::PanTauProcessor"){
 	  sc = tool->executePanTau(*pTau, *pi0Container);
 	}
 	else {
diff --git a/Reconstruction/tauRecTools/Root/TauRecToolBase.cxx b/Reconstruction/tauRecTools/Root/TauRecToolBase.cxx
index bb42ed93834101d2ea4bf72432c09d651f88554b..a04300b96c7d7051940ffcbaf02a9fb4c6fb7e9f 100644
--- a/Reconstruction/tauRecTools/Root/TauRecToolBase.cxx
+++ b/Reconstruction/tauRecTools/Root/TauRecToolBase.cxx
@@ -154,7 +154,17 @@ StatusCode TauRecToolBase::executeVertexFinder(xAOD::TauJet&, const xAOD::Vertex
   return StatusCode::FAILURE;
 }
 
-StatusCode TauRecToolBase::executeTrackFinder(xAOD::TauJet&, const xAOD::TrackParticleContainer*) {
+StatusCode TauRecToolBase::executeTrackFinder(xAOD::TauJet&, xAOD::TauTrackContainer&, const xAOD::TrackParticleContainer*) {
+  ATH_MSG_ERROR("function not implemented");
+  return StatusCode::FAILURE;
+}
+
+StatusCode TauRecToolBase::executeTrackClassifier(xAOD::TauJet&, xAOD::TauTrackContainer&) const{
+  ATH_MSG_ERROR("function not implemented");
+  return StatusCode::FAILURE;
+}
+
+StatusCode TauRecToolBase::executeRNNTrackClassifier(xAOD::TauJet&, xAOD::TauTrackContainer&){
   ATH_MSG_ERROR("function not implemented");
   return StatusCode::FAILURE;
 }
diff --git a/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx b/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx
index 04fd8719b09beabaacaed80e73be60f0466a8768..707628fa60318be4074d8b67033fcf45c0c9de9f 100644
--- a/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx
+++ b/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx
@@ -61,20 +61,11 @@ StatusCode TauTrackClassifier::finalize()
   return StatusCode::SUCCESS;
 }
 
-    
+
 //______________________________________________________________________________
-StatusCode TauTrackClassifier::execute(xAOD::TauJet& xTau) const
+StatusCode TauTrackClassifier::executeTrackClassifier(xAOD::TauJet& xTau, xAOD::TauTrackContainer& tauTrackCon) const
 {
-  // Get track container via link from tau - instead of using read handle (not written to store yet) 
-  // Check that size > 0
-  ElementLink< xAOD::TauTrackContainer > link;
-  xAOD::TauTrackContainer* tauTrackCon = 0;
-  if (xTau.allTauTrackLinks().size() > 0) {
-    link = xTau.allTauTrackLinks().at(0);//we don't care about this specific link, just the container
-    tauTrackCon = link.getDataNonConstPtr();
-  }  
-
-  std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, tauTrackCon);
+  std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, &tauTrackCon);
   for (xAOD::TauTrack* xTrack : vTracks)
   {
     // reset all track flags and set status to unclassified
diff --git a/Reconstruction/tauRecTools/Root/TauTrackRNNClassifier.cxx b/Reconstruction/tauRecTools/Root/TauTrackRNNClassifier.cxx
index 7845aec15cbc45b568b2f91b6d6e898536011cef..57c393848427a5c686151a7dcd1c0caf6e2a03ba 100644
--- a/Reconstruction/tauRecTools/Root/TauTrackRNNClassifier.cxx
+++ b/Reconstruction/tauRecTools/Root/TauTrackRNNClassifier.cxx
@@ -46,18 +46,9 @@ StatusCode TauTrackRNNClassifier::initialize()
 }
 
 //______________________________________________________________________________
-StatusCode TauTrackRNNClassifier::execute(xAOD::TauJet& xTau) const
-{
-  // Get track container via link from tau - instead of using read handle (not written to store yet) 
-  // Check that size > 0
-  ElementLink< xAOD::TauTrackContainer > link;
-  xAOD::TauTrackContainer* tauTrackCon = nullptr;
-  if (xTau.allTauTrackLinks().size() > 0) {
-    link = xTau.allTauTrackLinks().at(0); //we don't care about this specific link, just the container
-    tauTrackCon = link.getDataNonConstPtr();
-  }  
-
-  std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, tauTrackCon);
+StatusCode TauTrackRNNClassifier::executeRNNTrackClassifier(xAOD::TauJet& xTau, xAOD::TauTrackContainer& tauTrackCon){
+
+  std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, &tauTrackCon);
 
   for (xAOD::TauTrack* xTrack : vTracks)
   {
diff --git a/Reconstruction/tauRecTools/src/TauTrackFinder.cxx b/Reconstruction/tauRecTools/src/TauTrackFinder.cxx
index 587dbc7a97fb9a8490e074eed0a302e887543ef2..ef2c932447b497e2701a93f9a30f41fbad5db8ec 100644
--- a/Reconstruction/tauRecTools/src/TauTrackFinder.cxx
+++ b/Reconstruction/tauRecTools/src/TauTrackFinder.cxx
@@ -47,15 +47,7 @@ StatusCode TauTrackFinder::finalize() {
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::TrackParticleContainer* trackContainer) {
-
-  ElementLink< xAOD::TauTrackContainer > link = pTau.allTauTrackLinksNonConst().at(0);//we don't care about this specific link, just the container
-  xAOD::TauTrackContainer* tauTrackCon = link.getDataNonConstPtr();
-  
-  // Added an empty track and link in the processor alg, required so that the above will work for the very first tau
-  // Does that once per tau in the processor alg, so remove the last track and link once per tau here
-  (&(pTau.allTauTrackLinksNonConst()) )->pop_back();
-  tauTrackCon->pop_back();
+StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackCon, const xAOD::TrackParticleContainer* trackContainer) {
   
   std::vector<const xAOD::TrackParticle*> tauTracks;
   std::vector<const xAOD::TrackParticle*> wideTracks;
@@ -99,7 +91,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
       {
 	alreadyUsed = false;
 	//loop over all up-to-now core tracks	
-	for( const xAOD::TauTrack* tau_trk : (*tauTrackCon) ) {
+	for( const xAOD::TauTrack* tau_trk : (tauTrackCon) ) {
 	  if(! tau_trk->flagWithMask( (1<<xAOD::TauJetParameters::TauTrackFlag::coreTrack) | (1<<xAOD::TauJetParameters::TauTrackFlag::passTrkSelector))) continue; //originally it was coreTrack&passTrkSelector
 	  if( (*track_it) == tau_trk->track()) alreadyUsed = true;
 	}
@@ -123,7 +115,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
     charge += trackParticle->charge();
 
     xAOD::TauTrack* track = new xAOD::TauTrack();
-    tauTrackCon->push_back(track);
+    tauTrackCon.push_back(track);
 
     ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
     linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
@@ -137,7 +129,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
     track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true);
     
     ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
-    linkToTauTrack.toContainedElement(*tauTrackCon, track);
+    linkToTauTrack.toContainedElement(tauTrackCon, track);
     pTau.addTauTrackLink(linkToTauTrack);
 
     ATH_MSG_VERBOSE(name()     << " added core track nr: " << i
@@ -157,7 +149,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
 		    );
 
     xAOD::TauTrack* track = new xAOD::TauTrack();
-    tauTrackCon->push_back(track);
+    tauTrackCon.push_back(track);
 
     ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
     linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
@@ -172,7 +164,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
     track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true);
 
     ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
-    linkToTauTrack.toContainedElement(*tauTrackCon, track);
+    linkToTauTrack.toContainedElement(tauTrackCon, track);
     pTau.addTauTrackLink(linkToTauTrack);
 
   }
@@ -190,7 +182,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
 		    );
 
     xAOD::TauTrack* track = new xAOD::TauTrack();
-    tauTrackCon->push_back(track);
+    tauTrackCon.push_back(track);
 
     ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
     linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
@@ -203,7 +195,7 @@ StatusCode TauTrackFinder::executeTrackFinder(xAOD::TauJet& pTau, const xAOD::Tr
     track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true);
 
     ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
-    linkToTauTrack.toContainedElement(*tauTrackCon, track);
+    linkToTauTrack.toContainedElement(tauTrackCon, track);
     pTau.addTauTrackLink(linkToTauTrack);
 
   }
diff --git a/Reconstruction/tauRecTools/src/TauTrackFinder.h b/Reconstruction/tauRecTools/src/TauTrackFinder.h
index 1dc276a568e23410a2c3b999ff1af17b1def3531..bd84a382d880a9734510e43db40bf59dc8d11fff 100644
--- a/Reconstruction/tauRecTools/src/TauTrackFinder.h
+++ b/Reconstruction/tauRecTools/src/TauTrackFinder.h
@@ -58,7 +58,7 @@ public:
     //! Algorithm functions
     //-------------------------------------------------------------
     virtual StatusCode initialize() override;
-    virtual StatusCode executeTrackFinder(xAOD::TauJet& pTau, const xAOD::TrackParticleContainer* trackContainer = nullptr) override;
+    virtual StatusCode executeTrackFinder(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackCon, const xAOD::TrackParticleContainer* trackContainer = nullptr) override;
     virtual StatusCode finalize() override;
     
 private:
diff --git a/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h b/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h
index 93d406be781993efde06f33c97e2e8bf2531a2ab..56c467c91b88185359fb772f9aeb2b88a2423593 100644
--- a/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h
+++ b/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h
@@ -51,7 +51,9 @@ class ITauToolBase : virtual public asg::IAsgTool
   virtual StatusCode executeVertexFinder(xAOD::TauJet& pTau, 
                                          const xAOD::VertexContainer* vertexContainer = nullptr, 
                                          const xAOD::TrackParticleContainer* trackContainer = nullptr) = 0;
-  virtual StatusCode executeTrackFinder(xAOD::TauJet& pTau, const xAOD::TrackParticleContainer* trackContainer = nullptr) = 0;  
+  virtual StatusCode executeTrackFinder(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer, const xAOD::TrackParticleContainer* trackContainer = nullptr) = 0;
+  virtual StatusCode executeTrackClassifier(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer) const = 0;
+  virtual StatusCode executeRNNTrackClassifier(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer) = 0;
   virtual StatusCode executeShotFinder(xAOD::TauJet& pTau, xAOD::CaloClusterContainer& shotClusterContainer, xAOD::PFOContainer& PFOContainer ) = 0;
 #ifndef XAOD_ANALYSIS
   virtual StatusCode executePi0CreateROI(xAOD::TauJet& pTau, CaloCellContainer& caloCellContainer, std::vector<CaloCell*>& map ) = 0;
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauRecToolBase.h b/Reconstruction/tauRecTools/tauRecTools/TauRecToolBase.h
index 58a8b232ed77addec60a1467e594656d779a7f6e..f910f820fbead16e91e9372fa6daab7b822df669 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauRecToolBase.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauRecToolBase.h
@@ -43,7 +43,9 @@ class TauRecToolBase : public asg::AsgTool, virtual public ITauToolBase {
   virtual StatusCode executeVertexFinder(xAOD::TauJet& pTau, 
                                          const xAOD::VertexContainer* vertexContainer = nullptr, 
                                          const xAOD::TrackParticleContainer* trackContainer = nullptr) override;
-  virtual StatusCode executeTrackFinder(xAOD::TauJet& pTau, const xAOD::TrackParticleContainer* trackContainer = nullptr) override;  
+  virtual StatusCode executeTrackFinder(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer, const xAOD::TrackParticleContainer* trackContainer = nullptr) override;
+  virtual StatusCode executeTrackClassifier(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer) const override;
+  virtual StatusCode executeRNNTrackClassifier(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer) override;
   virtual StatusCode executeShotFinder(xAOD::TauJet& pTau, xAOD::CaloClusterContainer& shotClusterContainer, xAOD::PFOContainer& PFOContainer ) override;
 #ifndef XAOD_ANALYSIS
   virtual StatusCode executePi0CreateROI(xAOD::TauJet& pTau, CaloCellContainer& caloCellContainer, std::vector<CaloCell*>& map ) override;
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h b/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h
index 5d37f45e3230d507997d8fad191161eb118abe10..3c296e293165fcb5ce376b7e1803386166956476 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h
@@ -42,7 +42,7 @@ public:
   ~TauTrackClassifier();
 
   virtual StatusCode initialize() override;
-  virtual StatusCode execute(xAOD::TauJet& pTau) const override;
+  virtual StatusCode executeTrackClassifier(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer ) const override;
   virtual StatusCode finalize() override;
 
 private:
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauTrackRNNClassifier.h b/Reconstruction/tauRecTools/tauRecTools/TauTrackRNNClassifier.h
index 18bfa0c59cccf3d76f802dc407799298fa836234..79c6e4bcef8aaece328bd17909788374fc6f50fb 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauTrackRNNClassifier.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauTrackRNNClassifier.h
@@ -53,9 +53,9 @@ public:
   // retrieve all track classifier sub tools
   virtual StatusCode initialize() override;
  // pass all tracks in the tau cone to all track classifier sub tools
-  virtual StatusCode execute(xAOD::TauJet& pTau) const override;
+  virtual StatusCode executeRNNTrackClassifier(xAOD::TauJet& pTau, xAOD::TauTrackContainer& tauTrackContainer) override;
 
-private:
+ private:
   ToolHandleArray<TrackRNN> m_vClassifier {this, "Classifiers", {}};
 }; // class TauTrackRNNClassifier