diff --git a/Simulation/TruthJiveXML/TruthJiveXML/TruthMuonTrackRetriever.h b/Simulation/TruthJiveXML/TruthJiveXML/TruthMuonTrackRetriever.h
new file mode 100755
index 0000000000000000000000000000000000000000..d26c42c70af1e121402eb46435a95fbff284db6f
--- /dev/null
+++ b/Simulation/TruthJiveXML/TruthJiveXML/TruthMuonTrackRetriever.h
@@ -0,0 +1,65 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JIVEXML_TRUTHMUONTRACKRETRIEVER_H
+#define JIVEXML_TRUTHMUONTRACKRETRIEVER_H
+
+#include <string>
+
+#include "JiveXML/IDataRetriever.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+namespace HepPDT{
+  class ParticleDataTable;
+}
+
+
+namespace JiveXML{
+
+  /**
+   * @class TruthMuonTrackRetriever
+   * @brief Retrieves the muons information from the @c TrackRecordCollection
+   *
+   *  - @b Properties
+   *    - <em>TrackRecCollNames</em><tt> = ["MuonEntryLayer","MuonEntryRecord"]</tt> : @copydoc TrackRecCollNames
+   * 
+   *  - @b Retrieved @b Data
+   *    - <em>code</em> : the PDG ID of the particle
+   *    - <em>id</em> : the particle barcode
+   *    - <em>pt</em> : transverse momentum
+   *    - <em>eta, phi</em> : @f$\eta@f$ and @f$\phi@f$ of the momentum vector
+   *    - <em>rhoVertex,phiVertex,zVertex</em> : position of the production vertex in @f$\rho@f$, @f$\phi@f$ and @f$z@f$
+   *    .
+   *
+   */
+
+  class TruthMuonTrackRetriever : virtual public IDataRetriever, public AthAlgTool {
+
+  public:
+  
+    /// Standard Constructor
+    TruthMuonTrackRetriever(const std::string& type ,const std::string& name,const IInterface* parent);
+
+    /// Retrieve all the data
+    virtual StatusCode retrieve(ToolHandle<IFormatTool> FormatTool);
+
+    /// Return the name of the data type
+    virtual std::string dataTypeName() const { return typeName; };
+
+    ///Default AthAlgTool methods
+    StatusCode initialize();
+
+  private:
+    ///The data type that is generated by this retriever
+    const std::string typeName;
+
+    /// A list of StoreGate names to probe in this order for the muon record collecton.
+    std::vector<std::string> TrackRecCollNames;
+
+  };
+
+}
+#endif
+
diff --git a/Simulation/TruthJiveXML/TruthJiveXML/TruthTrackRetriever.h b/Simulation/TruthJiveXML/TruthJiveXML/TruthTrackRetriever.h
new file mode 100755
index 0000000000000000000000000000000000000000..a96237c05fe94fcb8189fcb2c18ffe23d11a40ff
--- /dev/null
+++ b/Simulation/TruthJiveXML/TruthJiveXML/TruthTrackRetriever.h
@@ -0,0 +1,70 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JIVEXML_TRUTHTRACKRETRIEVER_H
+#define JIVEXML_TRUTHTRACKRETRIEVER_H
+
+#include "JiveXML/IDataRetriever.h"
+#include "GaudiKernel/IPartPropSvc.h"
+
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+//Forward declarations
+namespace Trk{ class IExtrapolator; }
+namespace HepPDT{ class ParticleDataTable; }
+
+namespace JiveXML{
+
+  /**
+   * @class TruthTrackRetriever
+   * @brief Retrieves the @c McEventCollection or the @c TrackRecordCollection in simulated cosmics
+   *
+   *  - @b Properties
+   *    - <em> StoreGateKey </em><tt> = TruthEvent </tt>: @copydoc m_McEvtCollName
+   *    - <em> UnstableMinPtCut </em><tt> = 100*MeV </tt> @copydoc m_MinPtCut
+   *    - <em> UnstableMinRhoCut </em><tt> = 40*mm </tt> @copydoc m_MinRhoCut
+   *
+   *  - @b Retrieved @b Data
+   *    - <em>code</em> : the PDG ID of the particle
+   *    - <em>id</em> : the particle barcode
+   *    - <em>pt</em> : transverse momentum
+   *    - <em>eta, phi</em> : @f$\eta@f$ and @f$\phi@f$ of the momentum vector
+   *    - <em>rhoVertex,phiVertex,zVertex</em> : position of the production vertex in @f$\rho@f$, @f$\phi@f$ and @f$z@f$
+   *    - <em>rhoEndVertex,phiEndVertex,zEndVertex</em> : position of the end-vertex in @f$\rho@f$, @f$\phi@f$ and @f$z@f$
+   *    .
+   */
+
+  class TruthTrackRetriever : virtual public IDataRetriever, public AthAlgTool {
+
+  public:
+  
+    /// Standard Constructor
+    TruthTrackRetriever(const std::string& type, const std::string& name, const IInterface* parent);
+  
+    /// Retrieve all the data
+    virtual StatusCode retrieve(ToolHandle<IFormatTool> FormatTool);
+
+    /// Return the name of the data type
+    virtual std::string dataTypeName() const { return typeName; };
+
+    ///Default AthAlgTool methods
+    StatusCode initialize();
+
+  private:
+    ///The data type that is generated by this retriever
+    const std::string typeName;
+
+    /// Storegate key for the McEventCollection (different between RDO/ESD and AOD)
+    std::string m_McEvtCollName;
+    /// Minimum pT for a particle to get accepted
+    double m_MinPtCut;
+    /// Minium radius of the end-vertex for the particle to get accepted
+    double m_MinRhoCut;
+  };
+
+}
+#endif
diff --git a/Simulation/TruthJiveXML/cmt/requirements b/Simulation/TruthJiveXML/cmt/requirements
new file mode 100755
index 0000000000000000000000000000000000000000..664163158d831c3f6963a82cbada10ae8ac74ef8
--- /dev/null
+++ b/Simulation/TruthJiveXML/cmt/requirements
@@ -0,0 +1,29 @@
+package TruthJiveXML
+
+public
+
+use AtlasPolicy           AtlasPolicy-*
+use AthenaBaseComps       AthenaBaseComps-*       Control
+
+use JiveXML               JiveXML-*               graphics
+use GaudiInterface        GaudiInterface-*        External
+
+private
+
+use HepPDT	              v*		              	  LCG_Interfaces
+
+use StoreGate             StoreGate-*             Control 
+use AtlasHepMC            AtlasHepMC-*            External
+use AtlasCLHEP 	      	  AtlasCLHEP-* 	          External
+use GeneratorObjects      GeneratorObjects-*      Generators
+
+use TrackRecord		        TrackRecord-*	          Simulation/G4Sim
+use EventPrimitives      EventPrimitives-*    Event
+
+public
+
+apply_pattern declare_joboptions files="*.py"
+apply_pattern component_library
+library TruthJiveXML *.cxx components/*.cxx
+
+
diff --git a/Simulation/TruthJiveXML/doc/mainpage.h b/Simulation/TruthJiveXML/doc/mainpage.h
new file mode 100755
index 0000000000000000000000000000000000000000..e76c6a6eafa01511055eee58e5bb6563a0c60fca
--- /dev/null
+++ b/Simulation/TruthJiveXML/doc/mainpage.h
@@ -0,0 +1,37 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+
+@mainpage TruthJiveXML
+@author Nikos.Konstantinidis -at- cern.ch, Juergen.Thomas -at- cern.ch, Sebastian.Boeser -at- cern.ch
+
+@section TruthJiveXMLIntro Introduction
+
+This package contains the @c AthAlgTools that retrieve truth information ( @c McEventCollection and @c TrackRecordCollection ) from @c StoreGate and 
+forward them to the formatting tool. Each tool implements the IDataRetriever interface, through which it is called from the @c AlgoJiveXML.
+
+@section TruthJiveXMLTools Retrievers
+
+- JiveXML::TruthTrackRetriever @copydoc JiveXML::TruthTrackRetriever
+
+- JiveXML::TruthMuonTrackRetriever @copydoc JiveXML::TruthMuonTrackRetriever
+
+- JiveXML::TruthCosmicsTrackRetriever @copydoc JiveXML::TruthCosmicsTrackRetriever
+
+@section TruthJiveXMLEnv Environment
+ - @ref used_TruthJiveXML
+ - @ref requirements_TruthJiveXML
+
+*/
+
+/**
+@page used_TruthJiveXML Used Packages
+@htmlinclude used_packages.html
+*/
+
+/**
+@page requirements_TruthJiveXML Requirements
+@include requirements
+*/
diff --git a/Simulation/TruthJiveXML/share/TruthJiveXML_DataTypes.py b/Simulation/TruthJiveXML/share/TruthJiveXML_DataTypes.py
new file mode 100644
index 0000000000000000000000000000000000000000..72a3742abda9f9618643cdd78888f26418784e8f
--- /dev/null
+++ b/Simulation/TruthJiveXML/share/TruthJiveXML_DataTypes.py
@@ -0,0 +1,22 @@
+#Avoid multiple includes
+include.block("TruthJiveXML/TruthJiveXML_DataTypes.py")
+
+if not "AtlasExtrapolator" in dir():
+    from TrkExTools.AtlasExtrapolator import AtlasExtrapolator
+    AtlasExtrapolator = AtlasExtrapolator('AtlasExtrapolator')
+    ToolSvc+=AtlasExtrapolator
+
+# Include the base options if the user didn't already do that
+if not "theEventData2XML" in dir():
+    include ("JiveXML/JiveXML_jobOptionBase.py")
+
+if not "JiveXML::TruthTrackRetriever/TruthTrackRetriever" in theEventData2XML.DataTypes:
+    theEventData2XML.DataTypes += ["JiveXML::TruthTrackRetriever/TruthTrackRetriever"]
+
+theEventData2XML.DataTypes += ["JiveXML::TruthMuonTrackRetriever/TruthMuonTrackRetriever"]
+
+# Configuration of the data retrievers can be done as follows:
+from TruthJiveXML.TruthJiveXMLConf import JiveXML__TruthTrackRetriever
+theTruthTrackRetriever = JiveXML__TruthTrackRetriever (name = "TruthTrackRetriever")
+#theTruthTrackRetriever.StoreGateKey = "TruthEvent"
+ToolSvc += theTruthTrackRetriever
diff --git a/Simulation/TruthJiveXML/src/TruthMuonTrackRetriever.cxx b/Simulation/TruthJiveXML/src/TruthMuonTrackRetriever.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..30ccff33420afc816480dcf8c5fe0443f29fcf70
--- /dev/null
+++ b/Simulation/TruthJiveXML/src/TruthMuonTrackRetriever.cxx
@@ -0,0 +1,142 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "TruthJiveXML/TruthMuonTrackRetriever.h"
+
+//#include "GaudiKernel/Bootstrap.h"
+//#include "GaudiKernel/ISvcLocator.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "StoreGate/StoreGateSvc.h"
+
+#include "HepMC/GenParticle.h"
+#include "TrackRecord/TrackRecord.h"
+#include "TrackRecord/TrackRecordCollection.h"
+#include "HepPDT/ParticleData.hh"
+#include "HepPDT/ParticleDataTable.hh"
+#include "CLHEP/Geometry/Point3D.h"
+#include "CLHEP/Geometry/Vector3D.h"
+#include "CLHEP/Units/SystemOfUnits.h"
+
+
+namespace JiveXML {
+
+  /**
+   * This is the standard AthAlgTool constructor
+   * @param type   AlgTool type name
+   * @param name   AlgTool instance name
+   * @param parent AlgTools parent owning this tool
+   **/
+   TruthMuonTrackRetriever::TruthMuonTrackRetriever(const std::string& type ,const std::string& name,const IInterface* parent):
+     AthAlgTool(type, name, parent),
+     typeName("SMTr") {
+     
+     //Declare the interface
+     declareInterface<IDataRetriever>(this);
+
+     //Fill the list with the names of track record collections to try
+     TrackRecCollNames.push_back("MuonEntryLayer");
+     TrackRecCollNames.push_back("MuonEntryRecord");
+
+     //Declare the properties
+     declareProperty("TrackRecCollNames",TrackRecCollNames,"List of track records collections to try in this order - only one is retrieved");
+
+   }
+
+
+  /**
+   * Initialize before event loop
+   */
+  StatusCode TruthMuonTrackRetriever::initialize(){
+    
+    //Nothing to be done here
+    return StatusCode::SUCCESS;
+  }
+  
+  /**
+   * Loop over all true particles, find the muons and get their basic parameters
+   * @param FormatTool the tool that will create formated output from the DataMap
+   */
+  StatusCode TruthMuonTrackRetriever::retrieve(ToolHandle<IFormatTool> FormatTool) {
+
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieving " << dataTypeName() << endreq; 
+
+    //Try to retrieve the track record collection
+    const TrackRecordCollection* TrackRecordColl = NULL ;
+    //Loop over all the collections and try a retrieve (more efficenct than
+    //contain-retrieve combination)
+    std::vector<std::string>::const_iterator CollNameItr = TrackRecCollNames.begin();
+    for ( ; CollNameItr != TrackRecCollNames.end(); ++CollNameItr) { 
+      //be verbose
+      if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << (*CollNameItr) << endreq;
+      //try to retrive
+      if ( !evtStore()->contains<TrackRecordCollection>( (*CollNameItr) )){ continue; } // skip if not in SG
+      if (evtStore()->retrieve(TrackRecordColl, (*CollNameItr)).isSuccess()) break ;
+    }
+
+    //If we didnt' get any, return
+    if (TrackRecordColl == NULL ) {
+      if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve any track collection from " << TrackRecCollNames << endreq;
+      return StatusCode::RECOVERABLE;
+    }
+
+    //Reserve space for the output
+    DataVect pt; pt.reserve(TrackRecordColl->size());
+    DataVect phi; phi.reserve(TrackRecordColl->size());
+    DataVect eta; eta.reserve(TrackRecordColl->size());
+    DataVect rhoVertex; rhoVertex.reserve(TrackRecordColl->size());
+    DataVect phiVertex; phiVertex.reserve(TrackRecordColl->size());
+    DataVect zVertex; zVertex.reserve(TrackRecordColl->size());
+    DataVect code; code.reserve(TrackRecordColl->size());
+    DataVect id; id.reserve(TrackRecordColl->size()); 
+
+    //Now loop over the collection and retrieve data
+    TrackRecordCollection::const_iterator record;
+    for (record=TrackRecordColl->begin(); record!=TrackRecordColl->end(); record++) {
+
+      //Get the pdg code
+      int pdgCode = (*record)->GetPDGCode();
+
+      //Only accept muons
+      if (abs(pdgCode) != 13) {
+        if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Reject non-muon track with PDG ID " << pdgCode << endreq;
+        continue;
+      }
+
+      //Get vertex and momentum
+      HepGeom::Point3D<double> vertex = (*record)->GetPosition();
+      HepGeom::Vector3D<double> momentum = (*record)->GetMomentum();
+
+      //And store output
+      pt.push_back(DataType( momentum.perp()/CLHEP::GeV ));
+      phi.push_back(DataType( momentum.phi() < 0 ? momentum.phi() + 2*M_PI : momentum.phi() ));
+      eta.push_back(DataType( momentum.pseudoRapidity() ));
+      rhoVertex.push_back(DataType( vertex.perp()*CLHEP::mm/CLHEP::cm ));
+      phiVertex.push_back(DataType( vertex.phi() < 0 ? vertex.phi() + 2*M_PI : vertex.phi() ));
+      zVertex.push_back(DataType( vertex.z()*CLHEP::mm/CLHEP::cm ));
+      code.push_back(DataType( pdgCode ));
+      id.push_back(DataType( (*record)->GetBarCode() ));
+    }
+    
+    //Finall add everything to the datamap
+    DataMap dataMap;
+    dataMap["pt"] = pt;
+    dataMap["phi"] = phi;
+    dataMap["eta"] = eta;
+    dataMap["rhoVertex"] = rhoVertex;
+    dataMap["phiVertex"] = phiVertex;
+    dataMap["zVertex"] = zVertex;
+    dataMap["code"] = code;
+    dataMap["id"] = id;
+    
+    //some summary
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << ": "<< pt.size() << endreq;
+
+    //forward data to formating tool
+    //return FormatTool->AddToEvent(dataTypeName(), (*CollNameItr), &dataMap);
+    //// Atlantis can't deal with sgkey in xml output in SMTr (freezes)
+    //// So no sgkey printed for now. jpt 20Aug09
+    std::string emptyStr="";
+    return FormatTool->AddToEvent(dataTypeName(), emptyStr, &dataMap);
+  }
+}
diff --git a/Simulation/TruthJiveXML/src/TruthTrackRetriever.cxx b/Simulation/TruthJiveXML/src/TruthTrackRetriever.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..05df5b8232fa59de6c03e8130ed266545268deee
--- /dev/null
+++ b/Simulation/TruthJiveXML/src/TruthTrackRetriever.cxx
@@ -0,0 +1,162 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "TruthJiveXML/TruthTrackRetriever.h"
+
+#include "HepPDT/ParticleData.hh"
+#include "HepPDT/ParticleDataTable.hh"
+#include "GaudiKernel/SystemOfUnits.h" 
+#include "EventPrimitives/EventPrimitives.h"
+
+#include "GeneratorObjects/McEventCollection.h"
+#include "TrackRecord/TrackRecord.h"
+#include "TrackRecord/TrackRecordCollection.h"
+
+namespace JiveXML {
+
+
+  /**
+   * This is the standard AthAlgTool constructor
+   * @param type   AlgTool type name
+   * @param name   AlgTool instance name
+   * @param parent AlgTools parent owning this tool
+   **/
+  TruthTrackRetriever::TruthTrackRetriever(const std::string& type,const std::string& name,const IInterface* parent):
+    AthAlgTool(type,name,parent),
+    typeName("STr")
+  {
+    
+    declareInterface<IDataRetriever>(this);
+    
+    declareProperty("StoreGateKey", m_McEvtCollName = "TruthEvent", "Name of the McEventCollection");
+    declareProperty("UnstableMinPtCut",     m_MinPtCut = 100*Gaudi::Units::MeV, "Minimum pT for an unstable particle to get accepted");
+    declareProperty("UnstableMinRhoCut",    m_MinRhoCut = 40*Gaudi::Units::mm, "Minium radius of the end-vertex for unstable particle to get accepted");
+
+  }
+  
+  /**
+   * Initialize before event loop
+   */
+  StatusCode TruthTrackRetriever::initialize(){
+    //Nothing to do here
+    return StatusCode::SUCCESS;
+  }
+
+  /**
+   * Loop over all true particles and get their basic parameters
+   * @param FormatTool the tool that will create formated output from the DataMap
+   */
+  StatusCode TruthTrackRetriever::retrieve(ToolHandle<IFormatTool> FormatTool) {
+
+    //be verbose
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieving " << dataTypeName() << endreq; 
+
+    //Retrieve the collection
+    const McEventCollection* McEvtColl = NULL;
+    if ( !evtStore()->contains<McEventCollection>( m_McEvtCollName )){ 
+      if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Could not find McEventCollection " << m_McEvtCollName << endreq;
+      return StatusCode::SUCCESS;
+    }
+    if( evtStore()->retrieve(McEvtColl, m_McEvtCollName).isFailure() ){
+      if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Could not retrieve McEventCollection " << m_McEvtCollName << endreq;
+      return StatusCode::SUCCESS;
+    }
+    
+    // Calculate the size
+    long NParticles=0;
+    McEventCollection::const_iterator McEvtCollItr = McEvtColl->begin(); 
+    for ( ; McEvtCollItr != McEvtColl->end(); ++McEvtCollItr)
+      NParticles +=  (*McEvtCollItr)->particles_size();
+
+    //Show in verbose mode
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) <<  "Total number of particles in McEventCollection \""
+                                            << m_McEvtCollName << "\" is " << NParticles << endreq;
+
+    //Reserve space for the output data
+    DataVect pt; pt.reserve(NParticles);
+    DataVect phi; phi.reserve(NParticles);
+    DataVect eta; eta.reserve(NParticles);
+    DataVect rhoVertex; rhoVertex.reserve(NParticles);
+    DataVect phiVertex; phiVertex.reserve(NParticles);
+    DataVect zVertex; zVertex.reserve(NParticles);
+    DataVect code; code.reserve(NParticles);
+    DataVect id; id.reserve(NParticles);
+    DataVect rhoEndVertex; rhoEndVertex.reserve(NParticles);
+    DataVect phiEndVertex; phiEndVertex.reserve(NParticles);
+    DataVect zEndVertex; zEndVertex.reserve(NParticles);
+
+      
+    //Now loop events and retrieve
+    for ( McEvtCollItr = McEvtColl->begin(); McEvtCollItr != McEvtColl->end(); ++McEvtCollItr){
+
+      //Loop over particles in the event
+      HepMC::GenEvent::particle_const_iterator ParticleItr = (*McEvtCollItr)->particles_begin();
+      for ( ; ParticleItr!=(*McEvtCollItr)->particles_end(); ++ParticleItr ) {
+
+        //Get the particle
+        HepMC::GenParticle* particle = (*ParticleItr);
+        
+        //Additional cuts for decaying particles
+        if ( particle->end_vertex() ) {
+          //Reject particles that fail the pt cut
+          if ( particle->momentum().perp() < m_MinPtCut) continue ; 
+          //Reject particles that fail the minimum end-vertex cut
+          if (particle->end_vertex()->point3d().perp() < m_MinRhoCut ) continue ;
+        }
+
+        //Get basic parameters (eta, phi, pt, ...)
+        pt.push_back(DataType(particle->momentum().perp()/Gaudi::Units::GeV));
+        float thePhi = particle->momentum().phi();
+        phi.push_back(DataType( (thePhi<0) ? thePhi+=2*M_PI : thePhi ));
+        eta.push_back(DataType( particle->momentum().pseudoRapidity() ));
+        code.push_back(DataType( particle->pdg_id() ));
+        id.push_back(DataType( particle->barcode() ));
+
+        // Get the vertex information
+        HepMC::GenVertex* vertex =  particle->production_vertex();
+        if (vertex) {
+          rhoVertex.push_back(DataType( vertex->point3d().r()*Gaudi::Units::mm/Gaudi::Units::cm ));
+          float vtxPhi = vertex->point3d().phi();
+          phiVertex.push_back(DataType( (vtxPhi<0)? vtxPhi+=2*M_PI : vtxPhi ));
+          zVertex.push_back(DataType( vertex->point3d().z()*Gaudi::Units::mm/Gaudi::Units::cm )); 
+        } else {
+          rhoVertex.push_back(DataType( 0. ));
+          phiVertex.push_back(DataType( 0. ));
+          zVertex.push_back(DataType( 0. )); 
+        }
+        //Do the same for the end vertex
+        vertex =  particle->end_vertex();
+        if ( vertex ) {
+         rhoEndVertex.push_back(DataType(vertex->point3d().r()*Gaudi::Units::mm/Gaudi::Units::cm));
+         float vtxPhi = vertex->point3d().phi();
+         phiEndVertex.push_back(DataType( (vtxPhi<0)? vtxPhi+=2*M_PI : vtxPhi ));
+         zEndVertex.push_back(DataType(vertex->point3d().z()*Gaudi::Units::mm/Gaudi::Units::cm)); 
+        } else {
+         rhoEndVertex.push_back(DataType( 0. ));
+         phiEndVertex.push_back(DataType( 0. ));
+         zEndVertex.push_back(DataType( 0. )); 
+        }
+      }
+    }
+
+    DataMap myDataMap;
+    myDataMap["pt"] = pt;
+    myDataMap["phi"] = phi;
+    myDataMap["eta"] = eta;
+    myDataMap["code"] = code;
+    myDataMap["id"] = id;
+    myDataMap["rhoVertex"] = rhoVertex;
+    myDataMap["phiVertex"] = phiVertex;
+    myDataMap["zVertex"] = zVertex;
+    myDataMap["rhoEndVertex"] = rhoEndVertex;
+    myDataMap["phiEndVertex"] = phiEndVertex;
+    myDataMap["zEndVertex"] = zEndVertex;
+
+    //Be verbose
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << ": "<< pt.size() << endreq;
+
+    //forward data to formating tool
+    return FormatTool->AddToEvent(dataTypeName(), m_McEvtCollName, &myDataMap);
+  }
+}
diff --git a/Simulation/TruthJiveXML/src/components/TruthJiveXML_entries.cxx b/Simulation/TruthJiveXML/src/components/TruthJiveXML_entries.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..c877be3092614693c1cefc97deabbe0058dcfb3f
--- /dev/null
+++ b/Simulation/TruthJiveXML/src/components/TruthJiveXML_entries.cxx
@@ -0,0 +1,13 @@
+#include "TruthJiveXML/TruthTrackRetriever.h"
+#include "TruthJiveXML/TruthMuonTrackRetriever.h"
+#include "GaudiKernel/DeclareFactoryEntries.h"
+
+using namespace JiveXML;
+
+DECLARE_TOOL_FACTORY(TruthTrackRetriever)
+DECLARE_TOOL_FACTORY(TruthMuonTrackRetriever)
+
+DECLARE_FACTORY_ENTRIES(TruthJiveXML) {
+  DECLARE_ALGTOOL(TruthTrackRetriever)
+  DECLARE_ALGTOOL(TruthMuonTrackRetriever)
+}
diff --git a/Simulation/TruthJiveXML/src/components/TruthJiveXML_load.cxx b/Simulation/TruthJiveXML/src/components/TruthJiveXML_load.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..855cb65e9071a628d7f3d6b58a1f52a8f1406b6b
--- /dev/null
+++ b/Simulation/TruthJiveXML/src/components/TruthJiveXML_load.cxx
@@ -0,0 +1,3 @@
+#include "GaudiKernel/LoadFactoryEntries.h"
+
+LOAD_FACTORY_ENTRIES(TruthJiveXML)