diff --git a/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxJetFitterVertexInfo.h b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxJetFitterVertexInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..c98e3eb2dfb42edb2441fc44b66c3da7a3b89985
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxJetFitterVertexInfo.h
@@ -0,0 +1,105 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/****************************************
+
+    VxJetFitterVertexInfo.h - Description
+           -------------------
+
+    begin: January 2008
+    author: Giacinto Piacquadio (University of Freiburg)
+    e-mail: giacinto.piacquadio@physik.uni-freiburg.de
+    changes: new!
+
+Class which inherits from VxSecVertexInfo and contains the additional 
+information JetFitter vs. 2 is able to provide:
+1) TwoTrackVerticesInJet
+2) SelectedTracksInJet
+(Material interactions will be provided in the near future...
+if convenient)
+
+    April 2014:  Trk::VxCandidate is replaced by xAOD::Vertex
+********************************************/
+
+#ifndef VXSECVERTEX_VxJetFitterVertexInfo_H
+#define VXSECVERTEX_VxJetFitterVertexInfo_H
+
+#include "DataModel/ElementLink.h"
+#include "VxSecVertex/VxSecVertexInfo.h"
+#include <vector>
+
+
+namespace Trk {
+
+  class TwoTrackVerticesInJet;
+  class SelectedTracksInJet;
+  class VxCandidate;  
+
+  class VxJetFitterVertexInfo : public VxSecVertexInfo {
+
+  public:
+
+    /* default constructor for persistency */
+    VxJetFitterVertexInfo();
+
+    /* constructor with everything */
+    VxJetFitterVertexInfo(const std::vector<Trk::VxCandidate*> & vertices,
+                          const Trk::TwoTrackVerticesInJet * twoTrackVertices,
+                          const Trk::SelectedTracksInJet* selectedTracksInJet);
+    
+    /* copy constructor */
+    VxJetFitterVertexInfo(const VxJetFitterVertexInfo &);
+    
+    /* clone method */
+    virtual VxJetFitterVertexInfo* clone() const;
+	
+    /* assignment operator */
+    VxJetFitterVertexInfo operator= (const VxJetFitterVertexInfo &);
+    
+    /* destructor */
+    virtual ~VxJetFitterVertexInfo();
+
+    /* get twoTrackVerticesInJet */
+    const Trk::TwoTrackVerticesInJet* getTwoTrackVerticesInJet() const;
+
+    /* get selectedTracksInJet */
+    const Trk::SelectedTracksInJet* getSelectedTracksInJet() const;
+
+    /* get the list of Vertices */
+    const std::vector<Trk::VxCandidate*> & verticesJF() const;
+    
+  private:
+
+    const Trk::TwoTrackVerticesInJet* m_twoTrackVerticesInJet;
+    const Trk::SelectedTracksInJet* m_selectedTracksInJet;
+    std::vector<Trk::VxCandidate*> m_verticesJF;
+    
+  };
+
+  /* get twoTrackVerticesInJet */
+  inline const Trk::TwoTrackVerticesInJet* VxJetFitterVertexInfo::getTwoTrackVerticesInJet() const
+  {
+    return m_twoTrackVerticesInJet;
+  }
+  
+
+    /* get selectedTracksInJet */
+  inline const Trk::SelectedTracksInJet* VxJetFitterVertexInfo::getSelectedTracksInJet() const
+  {
+    return m_selectedTracksInJet;
+  }
+
+  const std::vector<Trk::VxCandidate*> & VxJetFitterVertexInfo::verticesJF() const {
+    return m_verticesJF;
+  }
+
+  /* clone method */
+  inline VxJetFitterVertexInfo* VxJetFitterVertexInfo::clone() const {
+    return new VxJetFitterVertexInfo(*this);
+  }
+
+
+}//end namespace Trk
+
+#endif
diff --git a/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVKalVertexInfo.h b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVKalVertexInfo.h
new file mode 100755
index 0000000000000000000000000000000000000000..43ae66cec7ac345dfd90238273dfe5d9c2b7bd3f
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVKalVertexInfo.h
@@ -0,0 +1,132 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/****************************************
+
+    VxSecVKalVertexInfo.h - Description
+           -------------------
+
+    begin: March 2007
+    authors: CSC vertexing note group members :-)
+    work started by: Giacinto Piacquadio (University of Freiburg)
+    e-mail: giacinto.piacquadio@physik.uni-freiburg.de
+    changes: new!
+
+Class which inherits from VxSecVertexInfo and contains the additional 
+information VKalVrt is able to provide:
+1) mass
+2) energyFraction
+3) two track vertices used for seeding
+4) list of "bad" tracks
+5) list of tracks from V0s
+6) Jet track energy - needed for multivertex fit
+
+
+    April 2014:  Migration to xAOD::Vertex and xAOD::IParticle
+********************************************/
+
+#ifndef VXSECVERTEX_VXSECVKALVERTEXINFO_H
+#define VXSECVERTEX_VXSECVKALVERTEXINFO_H
+
+#include "DataModel/ElementLink.h"
+#include "TrkParticleBase/TrackParticleBaseCollection.h"
+#include "xAODBase/IParticleContainer.h"
+#include "VxSecVertex/VxSecVertexInfo.h"
+#include <vector>
+
+
+
+namespace Trk {
+
+  class VxSecVKalVertexInfo : public VxSecVertexInfo {
+
+  public:
+
+    /* default constructor for persistency */
+    VxSecVKalVertexInfo();
+
+   /* constructor with everything for Trk::TrackParticleBase + jet energy */
+    VxSecVKalVertexInfo(const std::vector<xAOD::Vertex*> & vertices,
+			double mass,double energyFraction,int n2trackvertices, double energyTrkInJet,
+			const std::vector<const Trk::TrackParticleBase*> & badTracks);
+
+    /* constructor with everything for xAOD::IParticle + jet energy */
+    VxSecVKalVertexInfo(const std::vector<xAOD::Vertex*> & vertices,
+			double mass,double energyFraction,int n2trackvertices, double energyTrkInJet,
+			const std::vector<const xAOD::IParticle*> & badTracks);
+
+    /* copy constructor */
+    VxSecVKalVertexInfo(const VxSecVKalVertexInfo &);
+
+    /* clone method */
+    virtual VxSecVKalVertexInfo* clone() const;
+	
+    /* assignment operator */
+    VxSecVKalVertexInfo operator= (const VxSecVKalVertexInfo &);
+    
+    /* destructor */
+    virtual ~VxSecVKalVertexInfo();
+
+    /* get mass */
+    double mass() const;
+
+    /* get energyFraction */
+    double energyFraction() const;
+
+    /* get energy of all tracks in jet */
+    double energyTrkInJet() const;
+
+    /* get n2trackvertices */
+    int n2trackvertices() const;
+
+    /* get list of bad TP */
+    const std::vector<const Trk::TrackParticleBase*> badTracksTP() const;
+
+    /* get list of bad Tracks */
+    const std::vector<const xAOD::IParticle*> badTracksIP() const;
+
+    /* set origin collection for IParticle */
+    void setIParticleOrigin(const xAOD::IParticleContainer* iparticleTES);
+
+    /* set origin collectino for TrackParticle */
+    void setTrackParticleOrigin(const Trk::TrackParticleBaseCollection* trkpartTES);
+
+
+  private:
+
+    double m_mass;
+    double m_energyFraction;
+    double m_energyTrkInJet;
+    int m_n2trackvertices;
+    std::vector<ElementLink<Trk::TrackParticleBaseCollection> > m_badTracksTP;
+    std::vector<ElementLink<xAOD::IParticleContainer> >         m_badTracksIP;
+    
+  };
+
+
+  inline double VxSecVKalVertexInfo::mass() const {
+    return m_mass;
+  }
+  
+  inline double VxSecVKalVertexInfo::energyFraction() const {
+    return m_energyFraction;
+  }
+
+  inline double VxSecVKalVertexInfo::energyTrkInJet() const {
+    return m_energyTrkInJet;
+  }
+  
+  inline int VxSecVKalVertexInfo::n2trackvertices() const {
+    return m_n2trackvertices;
+  }
+
+  /* clone method */
+  inline VxSecVKalVertexInfo* VxSecVKalVertexInfo::clone() const {
+    return new VxSecVKalVertexInfo(*this);
+  }
+
+
+}//end namespace Trk
+
+#endif
diff --git a/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVertexDict.h b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVertexDict.h
new file mode 100755
index 0000000000000000000000000000000000000000..0f4da1d653f5fa423ae47ad51c5bf835e4f04d8a
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVertexDict.h
@@ -0,0 +1,12 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef VXSECVERTEX_VXSECVERTEXDICT_H
+#define VXSECVERTEX_VXSECVERTEXDICT_H
+
+#include "VxSecVertex/VxSecVertexInfo.h"
+#include "VxSecVertex/VxSecVKalVertexInfo.h"
+#include "VxSecVertex/VxJetFitterVertexInfo.h"
+
+#endif
diff --git a/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVertexInfo.h b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVertexInfo.h
new file mode 100755
index 0000000000000000000000000000000000000000..92dfaa80c05302d60a0e23bc3e9ebeb8fa2f3bce
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/VxSecVertexInfo.h
@@ -0,0 +1,100 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/****************************************
+
+    VxSecVertexInfo.h - Description
+           -------------------
+
+    begin: March 2007
+    authors: CSC vertexing note group members :-)
+    work started by: Giacinto Piacquadio (University of Freiburg)
+    e-mail: giacinto.piacquadio@physik.uni-freiburg.de
+    changes: new!
+
+This class represents the base information about secondary vertices, which is 
+given by a vector of VxCandidate*. The class OWNS the VxCandidate. Pointers
+ are used to allow inheritance of the extended classes from the VxCandidate.
+
+
+    April 2014: Trk::VxCandidate is replaced by xAOD::Vertex
+
+    May 2014:  VxSecVertexInfo doesn't own the corresponding secondary vertices anymore by default.
+               Beware - this leads to a strong memory leak if SV are not explictly deleted before VxSecVertexInfo destructor.
+	       VxSecVertexInfo gets back the SV ownership if getSVOwnership(true) is called.  
+
+*****************************************/
+
+#ifndef VXSECVERTEX_VXSECVERTEXINFO_H
+#define VXSECVERTEX_VXSECVERTEXINFO_H
+
+#include "DataModel/DataVector.h"
+#include "CLIDSvc/CLASS_DEF.h"
+#include "xAODTracking/Vertex.h"
+#include <vector>
+
+
+namespace Trk {
+
+  class VxSecVertexInfo 
+  {
+
+  public:
+
+    /* default constructor for persistency */
+    VxSecVertexInfo();
+
+    /* constructor with list of VxCandidate. The VxSecVertexInfo takes 
+       care of the ownership of the VxCandidate*. Don't delete them 
+       afterwards */
+    VxSecVertexInfo(const std::vector<xAOD::Vertex*> &);
+
+    /* clone method */
+    virtual VxSecVertexInfo* clone() const;
+
+    /* Destructor */
+    virtual ~VxSecVertexInfo();
+    
+    /* Copy constructor */
+    VxSecVertexInfo(const VxSecVertexInfo &);
+    
+    /* Assignment operator */
+    VxSecVertexInfo& operator= (const VxSecVertexInfo &);
+
+    /* get the list of Vertices */
+    const std::vector<xAOD::Vertex*> & vertices() const;
+
+    /* set the list of Vertices */
+    void setVertices(const std::vector<xAOD::Vertex*> &);
+
+    void getSVOwnership(bool Ownership){ m_SVOwnership=Ownership; }
+
+  protected:
+
+    std::vector<xAOD::Vertex*> m_vertices;
+    bool m_SVOwnership;
+
+  };
+
+
+
+  inline VxSecVertexInfo* VxSecVertexInfo::clone() const {
+    return new VxSecVertexInfo(*this);
+  }
+
+
+}//end namespace
+
+namespace Trk
+{
+  typedef DataVector<Trk::VxSecVertexInfo> VxSecVertexInfoContainer;
+}
+
+
+CLASS_DEF( Trk::VxSecVertexInfo , 170608128 , 1 )
+CLASS_DEF( Trk::VxSecVertexInfoContainer , 1284088780 , 1 )
+
+
+
+#endif
diff --git a/Tracking/TrkEvent/VxSecVertex/VxSecVertex/selection.xml b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/selection.xml
new file mode 100755
index 0000000000000000000000000000000000000000..4b09c4de3f86e682ce507696721301c2cde40a91
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/VxSecVertex/selection.xml
@@ -0,0 +1,13 @@
+<lcgdict>
+   <class name="Trk::VxSecVertexInfo">
+     <field name="m_vertices" transient="true" />
+   </class>
+   <class name="Trk::VxJetFitterVertexInfo">
+     <field name="m_twoTrackVerticesInJet" transient="true" />
+     <field name="m_selectedTracksInJet" transient="true" />
+   </class>
+   <class name="Trk::VxSecVKalVertexInfo">
+     <field name="m_badTracksIP" transient="true" />
+     <field name="m_badTracksTP" transient="true" />
+   </class>
+</lcgdict>
diff --git a/Tracking/TrkEvent/VxSecVertex/cmt/requirements b/Tracking/TrkEvent/VxSecVertex/cmt/requirements
new file mode 100755
index 0000000000000000000000000000000000000000..25c7a2747e86d6ea8e469e6a1d4f1988fc91cfde
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/cmt/requirements
@@ -0,0 +1,37 @@
+package VxSecVertex
+
+author Giacinto Piacquadio <giacinto.piacquadio@physik.uni-freiburg.de>
+author Christian Weiser
+author Vadim Kostyukhin
+author Kirill Prokofiev
+author Andreas Wildauer
+
+
+use AtlasPolicy AtlasPolicy-*
+use DataModel DataModel-* Control
+
+use CLIDSvc CLIDSvc-* Control
+#use TrkTrack             TrkTrack-*        Tracking/TrkEvent
+use TrkParticleBase      TrkParticleBase-*    Tracking/TrkEvent
+use xAODTracking         xAODTracking-*       Event/xAOD
+use xAODBase             xAODBase-*           Event/xAOD
+
+private 
+
+use VxVertex             VxVertex-*           Tracking/TrkEvent
+use VxJetVertex          VxJetVertex-*        Tracking/TrkEvent
+use TrkParticleBase      TrkParticleBase-*    Tracking/TrkEvent
+
+public
+
+library VxSecVertex *.cxx
+apply_pattern installed_library
+
+private
+# persistency
+use AtlasReflex   AtlasReflex-*   External -no_auto_imports
+apply_pattern lcgdict dict=VxSecVertex selectionfile=selection.xml headerfiles="../VxSecVertex/VxSecVertexDict.h"
+
+#macro cppdebugflags '$(cppdebugflags_s)'
+#macro_remove componentshr_linkopts "-Wl,-s"
+
diff --git a/Tracking/TrkEvent/VxSecVertex/src/VxJetFitterVertexInfo.cxx b/Tracking/TrkEvent/VxSecVertex/src/VxJetFitterVertexInfo.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..5759973d14bcb7d91cec75a53e79a603fa382300
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/src/VxJetFitterVertexInfo.cxx
@@ -0,0 +1,106 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/****************************************
+
+    VxSecVertexInfo.h - Description
+           -------------------
+
+    begin: January 2008
+    author: Giacinto Piacquadio (University of Freiburg)
+    e-mail: giacinto.piacquadio@physik.uni-freiburg.de
+    changes: new!
+
+    April 2014:  Trk::VxCandidate is replaced by xAOD::Vertex
+
+********************************************/
+
+#include "VxSecVertex/VxJetFitterVertexInfo.h"
+#include "VxJetVertex/TwoTrackVerticesInJet.h"
+#include "VxJetVertex/SelectedTracksInJet.h"
+#include "VxVertex/VxCandidate.h"
+
+namespace Trk {
+
+  VxJetFitterVertexInfo::VxJetFitterVertexInfo() :
+          VxSecVertexInfo(),
+          m_twoTrackVerticesInJet(0),
+          m_selectedTracksInJet(0) {}
+
+  VxJetFitterVertexInfo::VxJetFitterVertexInfo(const std::vector<Trk::VxCandidate*> & vertices,
+                                               const Trk::TwoTrackVerticesInJet * twoTrackVertices,
+                                               const Trk::SelectedTracksInJet* selectedTracksInJet) :
+          VxSecVertexInfo(),
+          m_twoTrackVerticesInJet(twoTrackVertices),
+          m_selectedTracksInJet(selectedTracksInJet),
+          m_verticesJF(vertices)
+  {}
+  
+
+  VxJetFitterVertexInfo::VxJetFitterVertexInfo(const VxJetFitterVertexInfo & rhs):
+    VxSecVertexInfo(rhs),
+    m_twoTrackVerticesInJet(rhs.m_twoTrackVerticesInJet?new Trk::TwoTrackVerticesInJet(*rhs.m_twoTrackVerticesInJet):0),    
+    m_selectedTracksInJet(rhs.m_selectedTracksInJet?new Trk::SelectedTracksInJet(*rhs.m_selectedTracksInJet):0)
+  {
+    std::vector<Trk::VxCandidate*>::const_iterator verticesBegin=rhs.m_verticesJF.begin();
+    std::vector<Trk::VxCandidate*>::const_iterator verticesEnd=rhs.m_verticesJF.end();
+    
+    for (std::vector<Trk::VxCandidate*>::const_iterator verticesIter=verticesBegin;
+	 verticesIter!=verticesEnd;++verticesIter) {
+      Trk::VxCandidate* myCandidate=*verticesIter;
+      if (myCandidate!=0) {
+	m_verticesJF.push_back(new Trk::VxCandidate(*myCandidate));
+      } else {
+	std::cout << " Warning in VxSecVertexInfo: tried in copy constructor to copy over a zero pointer Vertex " << std::endl;
+      }
+    }
+    m_SVOwnership=true;    
+  }
+  
+
+  VxJetFitterVertexInfo VxJetFitterVertexInfo::operator= (const VxJetFitterVertexInfo & rhs) {
+    if (this!=&rhs) {
+
+      m_verticesJF.clear();
+      delete m_twoTrackVerticesInJet;
+      delete m_selectedTracksInJet;
+      this->operator=(rhs);
+      std::vector<Trk::VxCandidate*>::const_iterator verticesBegin=rhs.m_verticesJF.begin();
+      std::vector<Trk::VxCandidate*>::const_iterator verticesEnd=rhs.m_verticesJF.end();
+      
+      for (std::vector<Trk::VxCandidate*>::const_iterator verticesIter=verticesBegin;
+	   verticesIter!=verticesEnd;++verticesIter) {
+	Trk::VxCandidate* myCandidate=*verticesIter;
+	if (myCandidate!=0) {
+	  m_verticesJF.push_back(new Trk::VxCandidate(*myCandidate));
+	} else {
+	  std::cout << " Warning in VxSecVertexInfo: tried in copy constructor to copy over a zero pointer Vertex " << std::endl;
+	}
+      }   
+      m_twoTrackVerticesInJet=rhs.m_twoTrackVerticesInJet?new Trk::TwoTrackVerticesInJet(*rhs.m_twoTrackVerticesInJet):0;
+      m_selectedTracksInJet=rhs.m_selectedTracksInJet?new Trk::SelectedTracksInJet(*rhs.m_selectedTracksInJet):0;
+    }
+    m_SVOwnership=true;    
+    return *this;
+  }
+  
+  VxJetFitterVertexInfo::~VxJetFitterVertexInfo() {
+    if(m_SVOwnership){  // Delete vertices only if ownership is set explicitly
+      delete m_twoTrackVerticesInJet;
+      delete m_selectedTracksInJet;
+      std::vector<Trk::VxCandidate*>::const_iterator verticesBegin=m_verticesJF.begin();
+      std::vector<Trk::VxCandidate*>::const_iterator verticesEnd=m_verticesJF.end();
+      for (std::vector<Trk::VxCandidate*>::const_iterator verticesIter=verticesBegin;
+	   verticesIter!=verticesEnd;++verticesIter) {
+        Trk::VxCandidate* myCandidate=*verticesIter;
+        if (myCandidate!=0) {
+	  delete myCandidate;
+        } else {
+	  std::cout << " Warning in VxSecVertexInfo: tried to delete a zero pointer --> Inconsistency found. " << std::endl;
+        }
+      }
+    }
+  }
+
+}//end namespace
diff --git a/Tracking/TrkEvent/VxSecVertex/src/VxSecVKalVertexInfo.cxx b/Tracking/TrkEvent/VxSecVertex/src/VxSecVKalVertexInfo.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..bd0588a978617a2acbe3836ce6dc0605df11bfc8
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/src/VxSecVKalVertexInfo.cxx
@@ -0,0 +1,161 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/****************************************
+
+    VxSecVertexInfo.h - Description
+           -------------------
+
+    begin: March 2007
+    authors: CSC vertexing note group members :-)
+    work started by: Giacinto Piacquadio (University of Freiburg)
+    e-mail: giacinto.piacquadio@physik.uni-freiburg.de
+    changes: new!
+
+    April 2014:  Trk::VxCandidate is replaced by xAOD::Vertex
+                 xAOD::IParticle is added to interface
+
+********************************************/
+
+#include "VxSecVertex/VxSecVKalVertexInfo.h"
+
+namespace Trk {
+
+  VxSecVKalVertexInfo::VxSecVKalVertexInfo() :
+    VxSecVertexInfo() {}
+
+  VxSecVKalVertexInfo::VxSecVKalVertexInfo(const std::vector<xAOD::Vertex*> & vertices,
+					   double mass,double energyFraction,int n2trackvertices,double energyTrkInJet,
+					   const std::vector<const Trk::TrackParticleBase*> & badTracks):
+    VxSecVertexInfo(vertices),
+    m_mass(mass),
+    m_energyFraction(energyFraction),
+    m_energyTrkInJet(energyTrkInJet),
+    m_n2trackvertices(n2trackvertices)
+  {
+    std::vector<const Trk::TrackParticleBase*>::const_iterator badTracksBegin=badTracks.begin();
+    std::vector<const Trk::TrackParticleBase*>::const_iterator badTracksEnd=badTracks.end();
+
+    for (std::vector<const Trk::TrackParticleBase*>::const_iterator badTracksIter=badTracksBegin;
+	 badTracksIter!=badTracksEnd;++badTracksIter) {
+      ElementLink<Trk::TrackParticleBaseCollection> link;
+      link.setElement(*badTracksIter);
+      m_badTracksTP.push_back(link);
+    }
+  }
+
+
+  VxSecVKalVertexInfo::VxSecVKalVertexInfo(const std::vector<xAOD::Vertex*> & vertices,
+					   double mass,double energyFraction,int n2trackvertices,double energyTrkInJet,
+					   const std::vector<const xAOD::IParticle*> & badTracks):
+    VxSecVertexInfo(vertices),
+    m_mass(mass),
+    m_energyFraction(energyFraction),
+    m_energyTrkInJet(energyTrkInJet),
+    m_n2trackvertices(n2trackvertices)
+  {
+    std::vector<const xAOD::IParticle*>::const_iterator badTracksBegin=badTracks.begin();
+    std::vector<const xAOD::IParticle*>::const_iterator badTracksEnd=badTracks.end();
+
+    for (std::vector<const xAOD::IParticle*>::const_iterator badTracksIter=badTracksBegin;
+	 badTracksIter!=badTracksEnd;++badTracksIter) {
+      ElementLink<xAOD::IParticleContainer> link;
+      link.setElement(*badTracksIter);
+      m_badTracksIP.push_back(link);
+    }
+    
+  }
+
+
+  VxSecVKalVertexInfo::VxSecVKalVertexInfo(const VxSecVKalVertexInfo & rhs):
+    VxSecVertexInfo(rhs),
+    m_mass(rhs.m_mass),
+    m_energyFraction(rhs.m_energyFraction),
+    m_energyTrkInJet(rhs.m_energyTrkInJet),
+    m_n2trackvertices(rhs.m_n2trackvertices),
+    m_badTracksTP(rhs.m_badTracksTP),
+    m_badTracksIP(rhs.m_badTracksIP)
+  {}
+
+  VxSecVKalVertexInfo VxSecVKalVertexInfo::operator= (const VxSecVKalVertexInfo & rhs) {
+    
+    if (this!=&rhs) {
+      this->operator=(rhs);
+      m_mass=rhs.m_mass;
+      m_energyFraction=rhs.m_energyFraction;
+      m_energyTrkInJet=rhs.m_energyTrkInJet;
+      m_n2trackvertices=rhs.m_n2trackvertices;
+      m_badTracksTP=rhs.m_badTracksTP;
+      m_badTracksIP=rhs.m_badTracksIP;
+    }
+    return *this;
+  }
+  
+  VxSecVKalVertexInfo::~VxSecVKalVertexInfo() {}
+
+  const std::vector<const Trk::TrackParticleBase*> VxSecVKalVertexInfo::badTracksTP() const {
+
+    std::vector<const Trk::TrackParticleBase*> vectorOfTP;
+    
+    std::vector<ElementLink<Trk::TrackParticleBaseCollection> >::const_iterator badTracksBegin=m_badTracksTP.begin();
+    std::vector<ElementLink<Trk::TrackParticleBaseCollection> >::const_iterator badTracksEnd=m_badTracksTP.end();
+
+    for (std::vector<ElementLink<Trk::TrackParticleBaseCollection> >::const_iterator badTracksIter=badTracksBegin;
+	 badTracksIter!=badTracksEnd;++badTracksIter) {
+      if ((*badTracksIter).isValid()) {
+	if (**badTracksIter!=0) {
+	  vectorOfTP.push_back(**badTracksIter);
+	}
+      }
+    }
+    
+    return vectorOfTP;
+  }
+
+  const std::vector<const xAOD::IParticle*> VxSecVKalVertexInfo::badTracksIP() const {
+
+    std::vector<const xAOD::IParticle*> vectorOfIP;
+    
+    std::vector<ElementLink<xAOD::IParticleContainer> >::const_iterator badTracksBegin=m_badTracksIP.begin();
+    std::vector<ElementLink<xAOD::IParticleContainer> >::const_iterator badTracksEnd=m_badTracksIP.end();
+
+    for (std::vector<ElementLink<xAOD::IParticleContainer> >::const_iterator badTracksIter=badTracksBegin;
+	 badTracksIter!=badTracksEnd;++badTracksIter) {
+      if ((*badTracksIter).isValid()) {
+	if (**badTracksIter!=0) {
+	  vectorOfIP.push_back(**badTracksIter);
+	}
+      }
+    }
+    
+    return vectorOfIP;
+  }
+
+  void VxSecVKalVertexInfo::setTrackParticleOrigin(const Trk::TrackParticleBaseCollection* trkpartTES) {
+
+
+    std::vector<ElementLink<Trk::TrackParticleBaseCollection> >::iterator badTracksBegin=m_badTracksTP.begin();
+    std::vector<ElementLink<Trk::TrackParticleBaseCollection> >::iterator badTracksEnd=m_badTracksTP.end();
+
+    for (std::vector<ElementLink<Trk::TrackParticleBaseCollection> >::iterator badTracksIter=badTracksBegin;
+	 badTracksIter!=badTracksEnd;++badTracksIter) {
+      (*badTracksIter).setStorableObject(*trkpartTES);
+    }
+  }
+
+  void VxSecVKalVertexInfo::setIParticleOrigin(const xAOD::IParticleContainer* ipartTES) {
+
+
+    std::vector<ElementLink<xAOD::IParticleContainer> >::iterator badTracksBegin=m_badTracksIP.begin();
+    std::vector<ElementLink<xAOD::IParticleContainer> >::iterator badTracksEnd=m_badTracksIP.end();
+
+    for (std::vector<ElementLink<xAOD::IParticleContainer> >::iterator badTracksIter=badTracksBegin;
+	 badTracksIter!=badTracksEnd;++badTracksIter) {
+      (*badTracksIter).setStorableObject(*ipartTES);
+    }
+
+  }
+    
+
+}//end namespace
diff --git a/Tracking/TrkEvent/VxSecVertex/src/VxSecVertexInfo.cxx b/Tracking/TrkEvent/VxSecVertex/src/VxSecVertexInfo.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..102208e8b93b2de6f014e3058b18666091eed6a8
--- /dev/null
+++ b/Tracking/TrkEvent/VxSecVertex/src/VxSecVertexInfo.cxx
@@ -0,0 +1,96 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/****************************************
+
+    VxSecVertexInfo.h - Description
+           -------------------
+
+    begin: March 2007
+    authors: CSC vertexing note group members :-)
+    work started by: Giacinto Piacquadio (University of Freiburg)
+    e-mail: giacinto.piacquadio@physik.uni-freiburg.de
+    changes: new!
+
+    April 2014:  Replace Trk::VxCandidate by xAOD::Vertex
+********************************************/
+
+#include "VxSecVertex/VxSecVertexInfo.h"
+#include <ostream>
+
+namespace Trk {
+  
+  VxSecVertexInfo::VxSecVertexInfo(): m_SVOwnership(false) {}
+
+  VxSecVertexInfo::VxSecVertexInfo(const std::vector<xAOD::Vertex*> & vertices): m_SVOwnership(false) {
+    m_vertices=vertices;//ownership is taken over by the VxSecVertexInfo class!
+  }
+  
+  VxSecVertexInfo::~VxSecVertexInfo() {
+    std::vector<xAOD::Vertex*>::const_iterator verticesBegin=m_vertices.begin();
+    std::vector<xAOD::Vertex*>::const_iterator verticesEnd=m_vertices.end();
+
+    if(m_SVOwnership){  // Delete vertices only if ownership is set explicitly
+      for (std::vector<xAOD::Vertex*>::const_iterator verticesIter=verticesBegin;
+	   verticesIter!=verticesEnd;++verticesIter) {
+        xAOD::Vertex* myCandidate=*verticesIter;
+        if (myCandidate!=0) {
+	  delete myCandidate;
+        } else {
+	  std::cout << " Warning in VxSecVertexInfo: tried to delete a zero pointer --> Inconsistency found. " << std::endl;
+        }
+      }
+    }
+  }
+
+  VxSecVertexInfo::VxSecVertexInfo(const VxSecVertexInfo & rhs) {
+
+    std::vector<xAOD::Vertex*>::const_iterator verticesBegin=rhs.m_vertices.begin();
+    std::vector<xAOD::Vertex*>::const_iterator verticesEnd=rhs.m_vertices.end();
+    
+    for (std::vector<xAOD::Vertex*>::const_iterator verticesIter=verticesBegin;
+	 verticesIter!=verticesEnd;++verticesIter) {
+      xAOD::Vertex* myCandidate=*verticesIter;
+      if (myCandidate!=0) {
+	m_vertices.push_back(new xAOD::Vertex(*myCandidate));
+      } else {
+	std::cout << " Warning in VxSecVertexInfo: tried in copy constructor to copy over a zero pointer Vertex " << std::endl;
+      }
+    }
+    m_SVOwnership=false;
+  }
+
+  VxSecVertexInfo& VxSecVertexInfo::operator= (const VxSecVertexInfo & rhs) {
+
+    if (this!=&rhs) {
+
+      m_vertices.clear();
+      
+      std::vector<xAOD::Vertex*>::const_iterator verticesBegin=rhs.m_vertices.begin();
+      std::vector<xAOD::Vertex*>::const_iterator verticesEnd=rhs.m_vertices.end();
+      
+      for (std::vector<xAOD::Vertex*>::const_iterator verticesIter=verticesBegin;
+	   verticesIter!=verticesEnd;++verticesIter) {
+	xAOD::Vertex* myCandidate=*verticesIter;
+	if (myCandidate!=0) {
+	  m_vertices.push_back(new xAOD::Vertex(*myCandidate));
+	} else {
+	  std::cout << " Warning in VxSecVertexInfo: tried in copy constructor to copy over a zero pointer Vertex " << std::endl;
+	}
+      }   
+    }
+    m_SVOwnership=false;
+    return *this;
+  }
+  
+
+  const std::vector<xAOD::Vertex*> & VxSecVertexInfo::vertices() const {
+    return m_vertices;
+  }
+
+  void VxSecVertexInfo::setVertices(const std::vector<xAOD::Vertex*> & vertices) {
+    m_vertices=vertices;
+  }
+    
+}//end namespace Trk