diff --git a/Utilities/DataHelper/CMakeLists.txt b/Utilities/DataHelper/CMakeLists.txt
index b8cfb6ee765b2b4a24a79b7011f4252f1021e6d9..7bdae2b719df8dbcd9c327fce6c299cd57196e44 100644
--- a/Utilities/DataHelper/CMakeLists.txt
+++ b/Utilities/DataHelper/CMakeLists.txt
@@ -4,7 +4,7 @@ find_package(EDM4HEP REQUIRED)
 
 gaudi_depends_on_subdirs()
 
-set(DataHelperLib_srcs src/*.cc)
+set(DataHelperLib_srcs src/*.cc src/*.cpp)
 
 #gaudi_install_headers(DataHelper)
 
diff --git a/Utilities/DataHelper/DataHelper/Navagation.h b/Utilities/DataHelper/DataHelper/Navagation.h
new file mode 100644
index 0000000000000000000000000000000000000000..5598dda122ce292356c19499d62f58d285045978
--- /dev/null
+++ b/Utilities/DataHelper/DataHelper/Navagation.h
@@ -0,0 +1,34 @@
+#ifndef Navagation_h
+#define Navagation_h
+
+//#include "FWCore/DataHandle.h"
+//#include "podio/CollectionBase.h"
+#include "edm4hep/MCRecoTrackerAssociationCollection.h"
+#include "edm4hep/TrackerHitCollection.h"
+#include <map>
+
+class Navagation{
+ public:
+  static Navagation* Instance();
+
+  Navagation();
+  ~Navagation();
+  
+  void Initialize();
+  //void AddDataHandle(DataHandle* hdl){if(hdl)m_hdlVec.push_back(hdl);};
+  void AddTrackerHitCollection(const edm4hep::TrackerHitCollection* col){m_hitColVec.push_back(col);};
+  void AddTrackerAssociationCollection(const edm4hep::MCRecoTrackerAssociationCollection* col){m_assColVec.push_back(col);};
+
+  edm4hep::TrackerHit* GetTrackerHit(const edm4hep::ObjectID& id, bool delete_by_caller=true);
+  std::vector<edm4hep::ConstSimTrackerHit> GetRelatedTrackerHit(const edm4hep::ObjectID& id);
+  std::vector<edm4hep::ConstSimTrackerHit> GetRelatedTrackerHit(const edm4hep::TrackerHit& hit);
+  
+  //static Navagation* m_fNavagation;
+ private:
+  static Navagation* m_fNavagation;
+  //DataHandle<edm4hep::MCRecoTrackerAssociationCollection> _inHitAssColHdl{"FTDStripTrackerHitsAssociation", Gaudi::DataHandle::Reader, this};
+  std::vector<const edm4hep::TrackerHitCollection*> m_hitColVec;
+  std::vector<const edm4hep::MCRecoTrackerAssociationCollection*> m_assColVec;
+  std::map<int, edm4hep::TrackerHit*> m_trkHits;
+};
+#endif 
diff --git a/Utilities/DataHelper/src/Navagation.cpp b/Utilities/DataHelper/src/Navagation.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ff265a53b3f32a9b777b6d8776bcd83206c94cac
--- /dev/null
+++ b/Utilities/DataHelper/src/Navagation.cpp
@@ -0,0 +1,81 @@
+#include "DataHelper/Navagation.h"
+
+#include "edm4hep/SimTrackerHit.h"
+#include "edm4hep/TrackerHit.h"
+
+Navagation* Navagation::m_fNavagation = nullptr;
+
+Navagation* Navagation::Instance(){
+  if(!m_fNavagation) m_fNavagation = new Navagation();
+  return m_fNavagation;
+}
+
+Navagation::Navagation(){
+}
+
+Navagation::~Navagation(){
+}
+
+void Navagation::Initialize(){
+  m_hitColVec.clear();
+  m_assColVec.clear();
+  for(std::map<int, edm4hep::TrackerHit*>::iterator it=m_trkHits.begin();it!=m_trkHits.end();it++){
+    delete it->second;
+  }
+  m_trkHits.clear();
+}
+
+edm4hep::TrackerHit* Navagation::GetTrackerHit(const edm4hep::ObjectID& obj_id, bool delete_by_caller){
+  int id = obj_id.collectionID * 10000000 + obj_id.index;
+  if(!delete_by_caller){
+    if(m_trkHits.find(id)!=m_trkHits.end()) return m_trkHits[id];
+  }
+  /*
+  for(int i=0;i<m_assColVec.size();i++){
+    for(auto ass : *m_assColVec[i]){
+      edm4hep::ObjectID rec_id = ass.getRec().getObjectID();
+      if(rec_id.collectionID!=id.collectionID)break;
+      else if(rec_id.index==id.index){
+	m_trkHits.push_back(ass.getRec());
+	return &(m_trkHits.back());
+      }
+    }
+  }
+  */
+  for(int i=0;i<m_hitColVec.size();i++){
+    for(auto hit : *m_hitColVec[i]){
+      edm4hep::ObjectID this_id = hit.getObjectID();
+      if(this_id.collectionID!=obj_id.collectionID)break;
+      else if(this_id.index==obj_id.index){
+	edm4hep::TrackerHit* hit_copy = new edm4hep::TrackerHit(hit);
+	if(!delete_by_caller) m_trkHits[id] = hit_copy;
+	return hit_copy;//&(m_trkHits[id]);
+      }
+    }
+  }
+  
+  throw std::runtime_error("Not found TrackerHit");
+}
+
+std::vector<edm4hep::ConstSimTrackerHit> Navagation::GetRelatedTrackerHit(const edm4hep::ObjectID& id){
+  std::vector<edm4hep::ConstSimTrackerHit> hits;
+  for(int i=0;i<m_assColVec.size();i++){
+    for(auto ass : *m_assColVec[i]){
+      edm4hep::ObjectID this_id = ass.getRec().getObjectID();
+      if(this_id.collectionID!=id.collectionID)break;
+      else if(this_id.index==id.index) hits.push_back(ass.getSim()); 
+    }
+  }
+  return hits;
+}
+
+std::vector<edm4hep::ConstSimTrackerHit> Navagation::GetRelatedTrackerHit(const edm4hep::TrackerHit& hit){
+  std::vector<edm4hep::ConstSimTrackerHit> hits;
+  for(int i=0;i<m_assColVec.size();i++){
+    for(auto ass : *m_assColVec[i]){
+      if(ass.getRec().getObjectID().collectionID != hit.getObjectID().collectionID) break;
+      else if(ass.getRec()==hit) hits.push_back(ass.getSim());
+    }
+  }
+  return hits;
+}