diff --git a/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt b/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt
index 569240cce5aa8836fd892c86f5361fb478082dce..aac85312bba21471f2fc0bc85a91adcf71e1a4d9 100644
--- a/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt
+++ b/Event/xAOD/xAODTauAthenaPool/CMakeLists.txt
@@ -9,8 +9,10 @@ atlas_subdir( xAODTauAthenaPool )
 atlas_depends_on_subdirs( PRIVATE
                           Control/AthContainers
                           Control/AthenaKernel
+			  Control/StoreGate
                           Database/AthenaPOOL/AthenaPoolCnvSvc
                           Database/AthenaPOOL/AthenaPoolUtilities
+			  Event/xAOD/xAODTracking
                           Event/xAOD/xAODTau
                           GaudiKernel )
 
@@ -20,5 +22,5 @@ atlas_add_poolcnv_library( xAODTauAthenaPoolPoolCnv
                            FILES xAODTau/TauJetContainer.h xAODTau/TauJetAuxContainer.h xAODTau/DiTauJetContainer.h xAODTau/DiTauJetAuxContainer.h xAODTau/TauTrackContainer.h xAODTau/TauTrackAuxContainer.h
                            TYPES_WITH_NAMESPACE xAOD::TauJetContainer xAOD::TauJetAuxContainer xAOD::DiTauJetContainer xAOD::DiTauJetAuxContainer xAOD::TauTrackContainer xAOD::TauTrackAuxContainer
                            CNV_PFX xAOD
-                           LINK_LIBRARIES AthContainers AthenaKernel AthenaPoolCnvSvcLib AthenaPoolUtilities xAODTau GaudiKernel )
+                           LINK_LIBRARIES AthContainers AthenaKernel StoreGateLib AthenaPoolCnvSvcLib AthenaPoolUtilities xAODTracking xAODTau GaudiKernel )
 
diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx
index a608f2996e143444d774f4e0b2e4fabdaf0e213b..6b46da9a0d0d3ea1467dde778392d19350cbc50f 100644
--- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx
+++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.cxx
@@ -2,7 +2,7 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-// $Id: xAODTauJetAuxContainerCnv.cxx 749546 2016-05-25 01:31:32Z griffith $
+// $Id: xAODTauJetAuxContainerCnv.cxx 800296 2017-03-10 18:16:40Z griffith $
 
 // System include(s):
 #include <exception>
@@ -32,6 +32,17 @@ createPersistent( xAOD::TauJetAuxContainer* trans ) {
    return SG::copyThinned (*trans, IThinningSvc::instance());
 }
 
+StatusCode xAODTauJetAuxContainerCnv::
+createObj( IOpaqueAddress* pAddr, DataObject*& pObj ){
+
+   // Get the key of the container that we'll be creating:
+   m_key = *( pAddr->par() + 1 );
+   ATH_MSG_VERBOSE( "Key of xAOD::TauJetAuxContainer: " << m_key );
+
+  // Let the base class do its thing now:
+  return AthenaPoolConverter::createObj( pAddr, pObj );  
+}
+
 xAOD::TauJetAuxContainer* xAODTauJetAuxContainerCnv::createTransient() {
 
    // The known ID(s) for this container:
@@ -48,7 +59,7 @@ xAOD::TauJetAuxContainer* xAODTauJetAuxContainerCnv::createTransient() {
    } else if(compareClassGuid( v2_guid )) {
       // The v2 converter:
      static xAODTauJetAuxContainerCnv_v2 converter;
-
+     converter.setKey(m_key);
      //      std::cout << "Converting TauJet_v2 --> v3 not fully supported" << std::endl;
 
       // Read in the v2 object:
diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h
index ad27a2d4f1b6d188c08961f44558901cb52f4407..82128790dc799a85b6eed50c98347228d36bf83b 100644
--- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h
+++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv.h
@@ -4,10 +4,13 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-// $Id: xAODTauJetAuxContainerCnv.h 581660 2014-02-05 15:52:29Z janus $
+// $Id: xAODTauJetAuxContainerCnv.h 800296 2017-03-10 18:16:40Z griffith $
 #ifndef XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_H
 #define XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_H
 
+// stystem includes
+#include <string>
+
 // Gaudi/Athena include(s):
 #include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h"
 
@@ -31,8 +34,8 @@ typedef T_AthenaPoolCustomCnv< xAOD::TauJetAuxContainer,
  * @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
  * @author Michel Janus <janus@cern.ch>
  *
- * $Revision: 581660 $
- * $Date: 2014-02-05 16:52:29 +0100 (Wed, 05 Feb 2014) $
+ * $Revision: 800296 $
+ * $Date: 2017-03-10 19:16:40 +0100 (Fri, 10 Mar 2017) $
  */
 class xAODTauJetAuxContainerCnv :
    public xAODTauJetAuxContainerCnvBase {
@@ -50,6 +53,13 @@ protected:
    /// Function reading in the object from the input file
    virtual xAOD::TauJetAuxContainer* createTransient();
 
+   /// Re-implemented function in order to get access to the SG key
+   virtual StatusCode createObj( IOpaqueAddress* pAddr, DataObject*& pObj );
+
+private:
+  std::string m_key;
+
+
 }; // class xAODTauJetAuxContainerCnv
 
 #endif // XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_H
diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx
index 1fad3277b516457febc4bb899a7a4651aff064dc..0bfe5f87bbe1171bc24711bc2f531fa20d9a247d 100644
--- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx
+++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.cxx
@@ -14,10 +14,16 @@
 #include "xAODTau/versions/TauJetContainer_v2.h"
 #include "xAODTau/TauJetContainer.h"
 #include "xAODTau/TauTrackContainer.h"
+#include "xAODTau/TauTrackAuxContainer.h"
+#include "xAODTracking/TrackParticleContainer.h"
 
 // Local include(s):
 #include "xAODTauJetAuxContainerCnv_v2.h"
 
+// StoreGateSvc
+#include "StoreGate/StoreGateSvc.h"
+#include "GaudiKernel/ServiceHandle.h"
+
 /// Convenience macro for setting the level of output messages
 #define MSGLVL MSG::DEBUG
 
@@ -35,14 +41,35 @@ xAODTauJetAuxContainerCnv_v2::xAODTauJetAuxContainerCnv_v2()
 
 }
 
+
+ServiceHandle<StoreGateSvc> evtStore ("StoreGateSvc", "tauJetCnv_v2");
+
+
 void xAODTauJetAuxContainerCnv_v2::
 persToTrans( const xAOD::TauJetAuxContainer_v2* oldObj,
              xAOD::TauJetAuxContainer* newObj,
              MsgStream& log ) {
 
+  if (evtStore.retrieve().isFailure()) {
+    ATH_MSG("Cannot get StoreGateHandle");
+    return;
+  }
+
+
    // Greet the user:
    ATH_MSG( "Converting xAOD::TauJetAuxContainer_v2 to current version..." );
 
+   xAOD::TauTrackContainer* pTracks = nullptr; 
+   xAOD::TauTrackAuxContainer* pAuxTracks = nullptr; 
+   if(m_key.length()){
+     //m_key is set in xAODTauJetAuxContainerCnv.cxx
+     //if reading data, then trigger calls T/P converter directly
+     //and the key is not set.  In this case, forget about TauTracks
+     pTracks = new xAOD::TauTrackContainer();
+     pAuxTracks = new xAOD::TauTrackAuxContainer();
+     pTracks->setStore(pAuxTracks);
+   }
+
    // Clear the transient object:
    newObj->resize( 0 );
 
@@ -55,12 +82,7 @@ persToTrans( const xAOD::TauJetAuxContainer_v2* oldObj,
    xAOD::TauJetContainer newInt;
    newInt.setStore( newObj );
 
-   // xAOD::TauTrackContainer* pTracks = new xAOD::TauTrackContainer();
-   // ATH_CHECK( evtStore()->record( pTracks, "TauTracks") );
-   // xAOD::TauTrackAuxContainer* pAuxTracks = new xAOD::TauTrackAuxContainer();
-   // ATH_CHECK( evtStore()->record( pAuxTracks, "TauTracksAux." ));
-   // pTracks->setStore( pAuxTracks );
-   
+  
    // Loop over the interface objects, and do the conversion with their help:
    for( const xAOD::TauJet_v2* oldTau : oldInt ) {
 
@@ -243,33 +265,96 @@ persToTrans( const xAOD::TauJetAuxContainer_v2* oldObj,
       newTau->setProtoNeutralPFOLinks( oldTau->protoNeutralPFOLinks() );
       newTau->setProtoChargedPFOLinks( oldTau->protoChargedPFOLinks() );
       newTau->setProtoPi0PFOLinks( oldTau->protoPi0PFOLinks() );
-     
-
-      // //
-      // //set per track track variables
-      // //
-      // for (unsigned int i = 0; i < oldTau->nTracks(); ++i) 
-      // 	{
-      // 	  //set track filter info
-      // 	  newTau->setTrackFlag(oldTau->track(i), xAOD::TauJetParameters::failTrackFilter, oldTau->trackFilterPass(i)  );
-      // 	  //set extrapolated track position
-      // 	  newTau->setTrackEtaStrip( i ,  oldTau->trackEtaStrip(i) );
-      // 	  newTau->setTrackPhiStrip( i ,  oldTau->trackPhiStrip(i) );
-      // 	}
-
-      // for (unsigned int i = 0; i < oldTau->nConversionTracks(); ++i) 
-      // 	{
-      // 	  //set conversion track flags
-      // 	  newTau->setTrackFlag(oldTau->conversionTrack(i), xAOD::TauJetParameters::isConversion, true  );
-      // 	}
 
+      if(m_key.length()==0) continue;
+      
+      for(unsigned int i = 0; i < oldTau->nTracks(); ++i){
+	ElementLink< xAOD::TrackParticleContainer > linkToTrackParticle = oldTau->trackLinks()[i];
+	if(!linkToTrackParticle.isValid()) continue;
+	xAOD::TauTrack* track = new xAOD::TauTrack();
+	pTracks->push_back(track);
+	const xAOD::TrackParticle* trackParticle=oldTau->track(i);
+        track->addTrackLink(linkToTrackParticle);
+        track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
+	track->setFlag(xAOD::TauJetParameters::TauTrackFlag::coreTrack, true);
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelector, true);
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged, true); 
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); 
+        ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
+        linkToTauTrack.toContainedElement(*pTracks, track);
+        newTau->addTauTrackLink(linkToTauTrack);
+      }
+
+      for(unsigned int i = 0; i < oldTau->nWideTracks(); ++i){
+	ElementLink< xAOD::TrackParticleContainer > linkToTrackParticle = oldTau->wideTrackLinks()[i];
+	if(!linkToTrackParticle.isValid()) continue;
+	xAOD::TauTrack* track = new xAOD::TauTrack();
+	pTracks->push_back(track);
+	const xAOD::TrackParticle* trackParticle=oldTau->wideTrack(i);
+        track->addTrackLink(linkToTrackParticle);
+        track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
+	track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true);
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelector, true);
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedIsolation, true); 
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::modifiedIsolationTrack, true); 
+        track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); 
+        ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
+        linkToTauTrack.toContainedElement(*pTracks, track);
+        newTau->addTauTrackLink(linkToTauTrack);
+      }
+
+      for(unsigned int i = 0; i < oldTau->nOtherTracks(); ++i){
+	ElementLink< xAOD::TrackParticleContainer > linkToTrackParticle = oldTau->otherTrackLinks()[i];
+	if(!linkToTrackParticle.isValid()) continue;
+	xAOD::TauTrack* track = new xAOD::TauTrack();
+	pTracks->push_back(track);
+	const xAOD::TrackParticle* trackParticle=oldTau->otherTrack(i);
+        track->addTrackLink(linkToTrackParticle);
+        track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
+	float dR=oldTau->p4(xAOD::TauJetParameters::IntermediateAxis).DeltaR(trackParticle->p4());
+	if(dR<=0.2) track->setFlag(xAOD::TauJetParameters::TauTrackFlag::coreTrack, true);
+	else track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true);
+	track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); 
+        ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
+        linkToTauTrack.toContainedElement(*pTracks, track);
+        newTau->addTauTrackLink(linkToTauTrack);
+      }
+
+      
+      newTau->setDetail(xAOD::TauJetParameters::nChargedTracks, (int) oldTau->nTracks());
+      newTau->setDetail(xAOD::TauJetParameters::nIsolatedTracks, (int) oldTau->nWideTracks());
 
    }
+   
+   if(m_key.length()){
+     std::string tauTrackContName=m_key;
+     tauTrackContName.replace(tauTrackContName.find("Aux."),4,"");
+     //example names:
+     //TauJets : Jets --> Tracks
+     //HLT_xAOD__TauJetContainer_TrigTauRecMerged Jet --> Track; +=Tracks
+     //HLT_xAOD__TauJetContainer_TrigTauRecPreselection ""
+     if(tauTrackContName.find("Jet") != std::string::npos){
+       tauTrackContName.replace( tauTrackContName.find("Jet"), 3, "Track" );
+       if(tauTrackContName.find("HLT") != std::string::npos) tauTrackContName+="Tracks";
+     }
+     else {
+       ATH_MSG("Cannot decipher name TauTrackConatiner should have");
+       return;
+     }
+   
+     std::string tauTrackAuxContName=tauTrackContName+"Aux.";
+
+     if(evtStore->record(pTracks, tauTrackContName).isFailure() ||
+	evtStore->record(pAuxTracks, tauTrackAuxContName)){
+       ATH_MSG("Couldn't Record TauTracks");
+       return;
+     }
+   }
 
    // Print what happened:
    ATH_MSG( "Converting xAOD::TauJetAuxContainer_v2 to current version "
 	    "[OK]" );
-   
+
    return;
 }
 
diff --git a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h
index b44ffe97d81cac49a77df618a07c8f4572a22765..d14faa65a9aae13112c2a129a66ba08aafdca13a 100644
--- a/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h
+++ b/Event/xAOD/xAODTauAthenaPool/src/xAODTauJetAuxContainerCnv_v2.h
@@ -44,6 +44,10 @@ public:
                              xAOD::TauJetAuxContainer_v2*,
                              MsgStream& log );
 
+  inline void setKey(const std::string& k){ m_key=k;}
+
+private:
+  std::string m_key;
 }; // class xAODTauJetAuxContainer_v2
 
 #endif // XAODTAUATHENAPOOL_XAODTAUJETAUXCONTAINERCNV_V2_H