diff --git a/Tracking/TrkTools/TrkTruthToTrack/TrkTruthToTrack/TruthTrackRecordToTrack.h b/Tracking/TrkTools/TrkTruthToTrack/TrkTruthToTrack/TruthTrackRecordToTrack.h
index 877e50de410a2d8b35afc6c7fcbe8aa39d318211..7390c0e7640c1af5ee3d46cc14e185c2e9172365 100755
--- a/Tracking/TrkTools/TrkTruthToTrack/TrkTruthToTrack/TruthTrackRecordToTrack.h
+++ b/Tracking/TrkTools/TrkTruthToTrack/TrkTruthToTrack/TruthTrackRecordToTrack.h
@@ -49,7 +49,7 @@ namespace Trk {
      *  ownership!)
      */
     using ITruthToTrack::makeProdVertexParameters;
-    virtual const Trk::TrackParameters* makeProdVertexParameters(const HepMC::GenParticle* part) const;
+    virtual const Trk::TrackParameters* makeProdVertexParameters(HepMC::ConstGenParticlePtr part) const;
     virtual const Trk::TrackParameters* makeProdVertexParameters(const xAOD::TruthParticle* part) const;
 
     /** This function produces Trk::TrackParameters corresponding to
@@ -59,7 +59,7 @@ namespace Trk {
        of deleting the returned parameters object.
      */
     using ITruthToTrack::makePerigeeParameters;
-    virtual const Trk::TrackParameters* makePerigeeParameters(const HepMC::GenParticle* part) const;
+    virtual const Trk::TrackParameters* makePerigeeParameters(HepMC::ConstGenParticlePtr part) const;
     virtual const Trk::TrackParameters* makePerigeeParameters(const xAOD::TruthParticle* part) const;
 
   private:
diff --git a/Tracking/TrkTools/TrkTruthToTrack/src/TruthTrackRecordToTrack.cxx b/Tracking/TrkTools/TrkTruthToTrack/src/TruthTrackRecordToTrack.cxx
index d1e8e7209f594771efd3ba05160e20915471c05a..bf977e3d2207bc31c944bd7bea70856f2a3a093d 100755
--- a/Tracking/TrkTools/TrkTruthToTrack/src/TruthTrackRecordToTrack.cxx
+++ b/Tracking/TrkTools/TrkTruthToTrack/src/TruthTrackRecordToTrack.cxx
@@ -65,7 +65,7 @@ StatusCode Trk::TruthTrackRecordToTrack::initialize() {
 }
 
 //================================================================
-const Trk::TrackParameters* Trk::TruthTrackRecordToTrack::makeProdVertexParameters(const HepMC::GenParticle* part) const {
+const Trk::TrackParameters* Trk::TruthTrackRecordToTrack::makeProdVertexParameters(HepMC::ConstGenParticlePtr part) const {
 
   if (part == nullptr || m_particleDataTable==nullptr) return nullptr;
 
@@ -207,7 +207,7 @@ const Trk::TrackParameters* Trk::TruthTrackRecordToTrack::makeProdVertexParamete
 
 
 //================================================================
-const Trk::TrackParameters* Trk::TruthTrackRecordToTrack::makePerigeeParameters(const HepMC::GenParticle* part) const {
+const Trk::TrackParameters* Trk::TruthTrackRecordToTrack::makePerigeeParameters(HepMC::ConstGenParticlePtr part) const {
   const Trk::TrackParameters* generatedTrackPerigee = nullptr;
 
   if(part && part->production_vertex() && m_particleDataTable && m_extrapolator) {
diff --git a/Tracking/TrkTruthTracks/TrkTruthTrackAlgs/src/TruthTrackCreation.cxx b/Tracking/TrkTruthTracks/TrkTruthTrackAlgs/src/TruthTrackCreation.cxx
index ad70752b16db18aa81ad9a4d254ac51de12a3e0c..37ad7e7a1c3f0e02ad6cebafbc734924310db28c 100644
--- a/Tracking/TrkTruthTracks/TrkTruthTrackAlgs/src/TruthTrackCreation.cxx
+++ b/Tracking/TrkTruthTracks/TrkTruthTrackAlgs/src/TruthTrackCreation.cxx
@@ -110,7 +110,7 @@ StatusCode Trk::TruthTrackCreation::execute()
 
     // ----------------------------------- main loop ------------------------------------------------------------------
     // get the PRD truth trajectories
-    const std::map< const HepMC::GenParticle*, PRD_TruthTrajectory >& truthTraj =
+    const std::map< HepMC::ConstGenParticlePtr, PRD_TruthTrajectory >& truthTraj =
         m_prdTruthTrajectoryBuilder->truthTrajectories();
     // some screen output
     ATH_MSG_VERBOSE("PRD_TruthTrajectoryBuilder delivered " << truthTraj.size() << " PRD truth trajectories, starting track creation.");
diff --git a/Tracking/TrkValidation/TrkVertexFitterValidationTools/src/McEventNtupleTool.cxx b/Tracking/TrkValidation/TrkVertexFitterValidationTools/src/McEventNtupleTool.cxx
index 5b27ed4b5f887a769d102f68f1682a86ee655160..faa703e2502be9a7f6c30f74c72a589a7cd6cfae 100755
--- a/Tracking/TrkValidation/TrkVertexFitterValidationTools/src/McEventNtupleTool.cxx
+++ b/Tracking/TrkValidation/TrkVertexFitterValidationTools/src/McEventNtupleTool.cxx
@@ -123,8 +123,13 @@ StatusCode Trk::McEventNtupleTool::finalize() {
 
 StatusCode Trk::McEventNtupleTool::fillMcEventData(const HepMC::GenEvent& myEvent) const {
 
+#ifdef HEPMC3
+    auto Vert = myEvent.vertices().begin();
+    auto Vert_end = myEvent.vertices().end();
+#else
     HepMC::GenEvent::vertex_const_iterator Vert = myEvent.vertices_begin();
     HepMC::GenEvent::vertex_const_iterator Vert_end = myEvent.vertices_end();
+#endif
      //store primary vertex
      CLHEP::HepLorentzVector pv_pos((*Vert)->position().x(),
 			     (*Vert)->position().y(),
@@ -132,16 +137,23 @@ StatusCode Trk::McEventNtupleTool::fillMcEventData(const HepMC::GenEvent& myEven
 			     (*Vert)->position().t());
      double pv_r = pv_pos.perp();
      double pv_z = pv_pos.z();
-     std::map<int,HepMC::GenVertex *> pv_vtx_ids;
-     std::vector<std::map<int,HepMC::GenVertex *> > sec_vtx_ids_vec;
+     std::map<int,HepMC::ConstGenVertexPtr> pv_vtx_ids;
+     std::vector<std::map<int,HepMC::ConstGenVertexPtr> > sec_vtx_ids_vec;
+#ifdef HEPMC3
+     auto  Part = myEvent.particles().begin();
+     auto  Part_end = myEvent.particles().end();
+#else
      HepMC::GenEvent::particle_const_iterator  Part = myEvent.particles_begin();
-     for (;Part!=myEvent.particles_end(); ++Part){
+     HepMC::GenEvent::particle_const_iterator  Part_end = myEvent.particles_end();
+#endif
+
+     for (;Part!=Part_end; ++Part){
           //information about incomming and outgoing particles
           CLHEP::HepLorentzVector par_mom((*Part)->momentum().px(),
 				   (*Part)->momentum().py(),
 				   (*Part)->momentum().pz(),
 				   (*Part)->momentum().e());
-          HepMC::GenVertex* par_vert = (*Part)->production_vertex();
+          auto par_vert = (*Part)->production_vertex();
 	  if (par_vert)
           {
            CLHEP::HepLorentzVector lv_pos(par_vert->position().x(),
@@ -149,7 +161,7 @@ StatusCode Trk::McEventNtupleTool::fillMcEventData(const HepMC::GenEvent& myEven
 				   par_vert->position().z(),
 				   par_vert->position().t());
 
-           if (par_mom.perp() > m_ptCut && fabs(par_mom.eta()) <= m_etaCut && fabs(lv_pos.perp()) <= m_radiusCut &&  fabs(lv_pos.z()) <= m_zPosCut){
+           if (par_mom.perp() > m_ptCut && fabs(par_mom.eta()) <= m_etaCut && std::fabs(lv_pos.perp()) <= m_radiusCut &&  std::fabs(lv_pos.z()) <= m_zPosCut){
 
              if(fabs(lv_pos.perp() - pv_r)<m_radiusRes  && fabs(lv_pos.z() - pv_z)<m_zPosRes)
              {
@@ -159,8 +171,8 @@ StatusCode Trk::McEventNtupleTool::fillMcEventData(const HepMC::GenEvent& myEven
                 //loop over all entries in sec_vtx_ids_vec = vector of sec_vtx_map's
                 for (unsigned int sec_vec_itr = 0; sec_vec_itr < sec_vtx_ids_vec.size(); ++sec_vec_itr)
                 {
-                  std::map<int,HepMC::GenVertex *> sec_vtx_map = sec_vtx_ids_vec[sec_vec_itr];
-                  std::map<int,HepMC::GenVertex *>::iterator map_itr = sec_vtx_map.begin();
+                  std::map<int,HepMC::ConstGenVertexPtr> sec_vtx_map = sec_vtx_ids_vec[sec_vec_itr];
+                  std::map<int,HepMC::ConstGenVertexPtr>::iterator map_itr = sec_vtx_map.begin();
                   for (; map_itr!= sec_vtx_map.end(); ++map_itr)
                   {
                     CLHEP::HepLorentzVector sec_pos((*map_itr).second->position().x(),
@@ -180,22 +192,22 @@ StatusCode Trk::McEventNtupleTool::fillMcEventData(const HepMC::GenEvent& myEven
                 }
                 if(new_sec_vtx) //store new entry in sec_vtx_ids_vec
                 {
-                  std::map<int,HepMC::GenVertex *> new_map;
-                  new_map.insert(std::make_pair(par_vert->barcode(),par_vert));
+                  std::map<int,HepMC::ConstGenVertexPtr> new_map;
+                  new_map.insert(std::make_pair(HepMC::barcode(par_vert),par_vert));
                   sec_vtx_ids_vec.push_back(new_map);
                 }
              }//if not primary
            }//eta && mom cut
           }//if production vertex
       }//end loop over particles
-      std::map<int,HepMC::GenVertex *>::iterator pv_map_itr = pv_vtx_ids.begin();
+      std::map<int,HepMC::ConstGenVertexPtr>::iterator pv_map_itr = pv_vtx_ids.begin();
       m_true_pri_x = (*pv_map_itr).second->position().x();
       m_true_pri_y = (*pv_map_itr).second->position().y();
       m_true_pri_z = (*pv_map_itr).second->position().z();
       for (unsigned int sec_vtx_itr = 0; sec_vtx_itr < sec_vtx_ids_vec.size(); ++sec_vtx_itr)
       {
-           std::map<int,HepMC::GenVertex *> sec_map =  sec_vtx_ids_vec[sec_vtx_itr];
-           std::map<int,HepMC::GenVertex *>::iterator map_itr = sec_map.begin();
+           std::map<int,HepMC::ConstGenVertexPtr> sec_map =  sec_vtx_ids_vec[sec_vtx_itr];
+           std::map<int,HepMC::ConstGenVertexPtr>::iterator map_itr = sec_map.begin();
            CLHEP::HepLorentzVector sec_vtx_pos;
            for (; map_itr != sec_map.end(); ++map_itr){
                 sec_vtx_pos.setX(sec_vtx_pos.x() + (*map_itr).second->position().x());
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfigMT_Ntuple.cxx b/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfigMT_Ntuple.cxx
index 01f4bf4d7d72a30a56977dbf4a507a2fb426d0db..6def4017a1b3e99bf5d3fadff7021202df6cd384 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfigMT_Ntuple.cxx
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfigMT_Ntuple.cxx
@@ -23,7 +23,7 @@ std::string date();
 
 
 //function to find true taus
-const HepMC::GenParticle* fromParent( int pdg_id, const HepMC::GenParticle* p, bool printout=false );
+HepMC::ConstGenParticlePtr fromParent( int pdg_id, HepMC::ConstGenParticlePtr p, bool printout=false );
   
 
 
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfig_Ntuple.cxx b/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfig_Ntuple.cxx
index 062f385fd6ec8899788a00485e73440b276b6d4d..38fc80268bb9db5f3be2278b47fcda368a828b18 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfig_Ntuple.cxx
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisExample/src/AnalysisConfig_Ntuple.cxx
@@ -78,7 +78,7 @@ std::string date() {
 
 
 //function to find true taus
-const HepMC::GenParticle* fromParent( int pdg_id, const HepMC::GenParticle* p, bool printout=false ) { 
+HepMC::ConstGenParticlePtr fromParent( int pdg_id, HepMC::ConstGenParticlePtr p, bool printout=false ) { 
 
   if ( p==0 ) return 0;
   if (std::abs(p->pdg_id())==11 || std::abs(p->pdg_id())==13 ) return 0; //don't want light leptons from tau decays
@@ -733,34 +733,20 @@ void AnalysisConfig_Ntuple::loop() {
 		while ( evitr!=evend ) { 
 
 			int _ip = 0; /// count of particles in this interaction 
+			int pid = HepMC::signal_process_id((*evitr));
 
-			int pid = (*evitr)->signal_process_id();
 
-			//      if ( (*evitr)->particles_size()>0 ) std::cout << "process " << "\tpid " << pid << std::endl;  
+			if ( pid!=0 ) { /// hooray! actually found a sensible event
 
-			if ( pid!=0 && (*evitr)->particles_size()>0 ) { /// hooray! actually found a sensible event
 
-				/// go through the particles
-				HepMC::GenEvent::particle_const_iterator pitr((*evitr)->particles_begin());
-				HepMC::GenEvent::particle_const_iterator pend((*evitr)->particles_end());
-
-				while ( pitr!=pend ) { 
-				  
-				  //	int pdg_id = (*pitr)->pdg_id();
-				  //	std::cout << ip++ << "\tparticle " << pdg_id << "\t" << "(*pitr)->pT()" << std::endl; 
-				  
+				for (auto pitr: **evitr ) { 
 				  //if tau job, only select if have a tau somewhere along chain, otherwise just add
-				  if ( (m_TruthPdgId==15 && fromParent(m_TruthPdgId, *pitr)!=0) || m_TruthPdgId!=15 ) {
+				  if ( (m_TruthPdgId==15 && fromParent(m_TruthPdgId, pitr)!=0) || m_TruthPdgId!=15 ) {
 				    				      
 				    /// select the ones of interest 
-				    selectorTruth.selectTrack( *pitr );
-				  }
-
-				  
+				    selectorTruth.selectTrack( pitr );
+				  }	  
 				  ++_ip;
-				  
-				  ++pitr; 
-				  
 				}