diff --git a/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx b/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx
index 497adf858ed18738a5bfdee2cde43b628fde5956..21222d01a92968c3e4380cd8c99999ecd36d921c 100644
--- a/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx
+++ b/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx
@@ -27,8 +27,8 @@ void CbmSimEventHeaderConverter::Init()
   auto* ioman = FairRootManager::Instance();
   assert(ioman != nullptr);
 
-  cbm_mc_manager_ = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
-  cbm_header_obj_ = cbm_mc_manager_->GetObject("MCEventHeader.");
+  cbm_mc_manager_    = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
+  cbm_header_obj_    = cbm_mc_manager_->GetObject("MCEventHeader.");
   cbm_mc_event_list_ = (CbmMCEventList*) ioman->GetObject("MCEventList.");
   if (!cbm_mc_event_list_) { throw std::runtime_error("CbmSimEventHeaderConverter::Init - ERROR! No fMCEventList!"); }
 
diff --git a/analysis/common/analysis_tree_converter/CbmStsTracksConverter.cxx b/analysis/common/analysis_tree_converter/CbmStsTracksConverter.cxx
index 580d08a72230f563aa83d4c4702016427b25bb70..f6454d037c9f3499840b9b6f8c453016154b3bc2 100644
--- a/analysis/common/analysis_tree_converter/CbmStsTracksConverter.cxx
+++ b/analysis/common/analysis_tree_converter/CbmStsTracksConverter.cxx
@@ -30,7 +30,7 @@ ClassImp(CbmStsTracksConverter);
 
 void CbmStsTracksConverter::ProcessData(CbmEvent* event)
 {
-  assert(cbm_sts_tracks_ != nullptr && cbm_mc_tracks_new_ != nullptr);
+  assert(cbm_sts_tracks_ != nullptr);
 
   vtx_tracks_2_sim_->Clear();
   out_indexes_map_.clear();
@@ -51,11 +51,9 @@ void CbmStsTracksConverter::InitInput()
 
   cbm_prim_vertex_ = (CbmVertex*) ioman->GetObject("PrimaryVertex.");
   cbm_sts_tracks_  = (TClonesArray*) ioman->GetObject("StsTrack");
-  //  cbm_mc_tracks_   = (TClonesArray*) ioman->GetObject("MCTrack");
-  cbm_sts_match_ = (TClonesArray*) ioman->GetObject("StsTrackMatch");
+  cbm_sts_match_   = (TClonesArray*) ioman->GetObject("StsTrackMatch");
 
-  cbm_mc_manager_    = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
-  cbm_mc_tracks_new_ = cbm_mc_manager_->InitBranch("MCTrack");
+  cbm_mc_manager_ = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
 }
 
 void CbmStsTracksConverter::Init()
@@ -93,13 +91,11 @@ void CbmStsTracksConverter::Init()
                                        "covarience matrix");
 
     vtx_tracks_config.AddField<int>("mother_pdg", "PDG code of mother particle");
-    vtx_tracks_config.AddField<int>("mc_pdg", "MC-true PDG code");
     vtx_tracks_config.AddField<bool>("pass_cuts", "ask Oleksii");
 
     ipar_        = vtx_tracks_config.GetFieldId("x");
     imf_         = vtx_tracks_config.GetFieldId("cx0");
     icov_        = vtx_tracks_config.GetFieldId("cov1");
-    imc_pdg_     = vtx_tracks_config.GetFieldId("mc_pdg");
     imother_pdg_ = vtx_tracks_config.GetFieldId("mother_pdg");
     ipasscuts_   = vtx_tracks_config.GetFieldId("pass_cuts");
   }
@@ -282,48 +278,3 @@ void CbmStsTracksConverter::MapTracks(CbmEvent* event)
     }
   }
 }
-
-//int CbmStsTracksConverter::GetMcPid(const CbmTrackMatchNew* match, AnalysisTree::Track& track) const
-//{
-//
-//  if (!is_write_kfinfo_) { return -2; }
-//  //-----------PID as in MZ's
-//  //CbmKFPF----------------------------------------------------------
-//  Int_t nMCTracks = cbm_mc_tracks_->GetEntriesFast();
-//
-//  int pdgCode = -2;
-//  if (match->GetNofLinks() > 0) {  // there is at least one matched MC-track
-//    Float_t bestWeight  = 0.f;
-//    Float_t totalWeight = 0.f;
-//    Int_t mcTrackId     = -1;
-//
-//    for (int iLink = 0; iLink < match->GetNofLinks(); iLink++) {
-//      totalWeight += match->GetLink(iLink).GetWeight();
-//      if (match->GetLink(iLink).GetWeight() > bestWeight) {
-//        bestWeight = match->GetLink(iLink).GetWeight();
-//        mcTrackId  = match->GetLink(iLink).GetIndex();
-//      }
-//    }
-//
-//    if (!((bestWeight / totalWeight < 0.7) || (mcTrackId >= nMCTracks || mcTrackId < 0))) {
-//      auto* mctrack = static_cast<CbmMCTrack*>(cbm_mc_tracks_->At(mcTrackId));
-//
-//      if (!(TMath::Abs(mctrack->GetPdgCode()) == 11 || TMath::Abs(mctrack->GetPdgCode()) == 13
-//      || TMath::Abs(mctrack->GetPdgCode()) == 211 || TMath::Abs(mctrack->GetPdgCode()) == 321
-//      || TMath::Abs(mctrack->GetPdgCode()) == 2212 || TMath::Abs(mctrack->GetPdgCode()) == 1000010020
-//      || TMath::Abs(mctrack->GetPdgCode()) == 1000010030 || TMath::Abs(mctrack->GetPdgCode()) == 1000020030
-//      || TMath::Abs(mctrack->GetPdgCode()) == 1000020040)) {
-//        pdgCode = -1;
-//      }
-//      else {
-//        pdgCode = mctrack->GetPdgCode();
-//      }
-//      if (mctrack->GetMotherId() > -1) {
-//        track.SetField(int(((CbmMCTrack*) cbm_mc_tracks_->At(mctrack->GetMotherId()))->GetPdgCode()), imother_pdg_);
-//      }
-//    }
-//  }
-//  track.SetField(pdgCode, imc_pdg_);
-//
-//  return pdgCode;
-//}
diff --git a/analysis/common/analysis_tree_converter/CbmStsTracksConverter.h b/analysis/common/analysis_tree_converter/CbmStsTracksConverter.h
index 9370a9479807a4929103243a79026183ed2f5e39..58673f763fb7d31fbd23e9daa9088f8f9497d1b1 100644
--- a/analysis/common/analysis_tree_converter/CbmStsTracksConverter.h
+++ b/analysis/common/analysis_tree_converter/CbmStsTracksConverter.h
@@ -53,12 +53,10 @@ private:
   AnalysisTree::Matching* vtx_tracks_2_sim_ {nullptr};  ///< raw pointers are needed for TTree::Branch
 
   CbmVertex* cbm_prim_vertex_ {nullptr};    ///< non-owning pointer
-                                            //  TClonesArray* cbm_mc_tracks_ {nullptr};   ///< non-owning pointer
   TClonesArray* cbm_sts_tracks_ {nullptr};  ///< non-owning pointer
   TClonesArray* cbm_sts_match_ {nullptr};   ///< non-owning pointer
 
   CbmMCDataManager* cbm_mc_manager_ {nullptr};
-  CbmMCDataArray* cbm_mc_tracks_new_ {nullptr};
 
   bool is_write_kfinfo_ {true};
   bool is_reproduce_cbmkfpf_ {true};
@@ -76,7 +74,6 @@ private:
   int ipar_ {AnalysisTree::UndefValueInt};
   int imf_ {AnalysisTree::UndefValueInt};
   int icov_ {AnalysisTree::UndefValueInt};
-  int imc_pdg_ {AnalysisTree::UndefValueInt};
   int imother_pdg_ {AnalysisTree::UndefValueInt};
   int ipasscuts_ {AnalysisTree::UndefValueInt};
 
diff --git a/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx b/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx
index d91e3babe73dc85949dc7b3e5caa4b9e0f6fd960..94b4db1a0e0f6349cd6cba055a3d114f30274281 100644
--- a/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx
+++ b/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx
@@ -4,6 +4,7 @@
 
 #include "ATKFParticleFinder.h"
 
+#include "AnalysisTree/Matching.hpp"
 #include "KFParticleTopoReconstructor.h"
 
 void ATKFParticleFinder::InitInput(const std::string& file_name, const std::string& tree_name)
@@ -22,6 +23,19 @@ void ATKFParticleFinder::InitInput(const std::string& file_name, const std::stri
   else if (in_chain_->CheckBranchExistence("RecEventHeader") == 2) {
     in_chain_->SetBranchAddress("RecEventHeader.", &rec_event_header_);
   }
+  if (in_chain_->CheckBranchExistence("SimParticles") == 1) {
+    in_chain_->SetBranchAddress("SimParticles", &sim_particles_);
+  }
+  else if (in_chain_->CheckBranchExistence("SimParticles") == 2) {
+    in_chain_->SetBranchAddress("SimParticles.", &sim_particles_);
+  }
+  std::string kf2sim_tracks_name = in_chain_->GetConfiguration()->GetMatchName("VtxTracks", "SimParticles");
+  if (in_chain_->CheckBranchExistence(kf2sim_tracks_name) == 1) {
+    in_chain_->SetBranchAddress(kf2sim_tracks_name.c_str(), &kf2sim_tracks_);
+  }
+  else if (in_chain_->CheckBranchExistence(kf2sim_tracks_name) == 2) {
+    in_chain_->SetBranchAddress((kf2sim_tracks_name + ".").c_str(), &kf2sim_tracks_);
+  }
 
   auto branch_conf_kftr = in_chain_->GetConfiguration()->GetBranchConfig("VtxTracks");
   q_field_id_           = branch_conf_kftr.GetFieldId("q");
@@ -31,7 +45,6 @@ void ATKFParticleFinder::InitInput(const std::string& file_name, const std::stri
   cov_field_id_ = branch_conf_kftr.GetFieldId("cov1");  // cov matrix 0
 
   passcuts_field_id_  = branch_conf_kftr.GetFieldId("pass_cuts");
-  pdg_field_id_       = branch_conf_kftr.GetFieldId("mc_pdg");
   nhits_field_id_     = branch_conf_kftr.GetFieldId("nhits");
   nhits_mvd_field_id_ = branch_conf_kftr.GetFieldId("nhits_mvd");
   vtx_chi2_field_id_  = branch_conf_kftr.GetFieldId("vtx_chi2");
@@ -116,7 +129,6 @@ void ATKFParticleFinder::InitTopoReconstructor()
   for (unsigned int i_track = 0; i_track < kf_tracks_->GetNumberOfChannels(); i_track++) {
     const AnalysisTree::Track& rec_track = kf_tracks_->GetChannel(i_track);
     if (rec_track.GetField<bool>(passcuts_field_id_) == 0) continue;
-    if (rec_track.GetField<int>(pdg_field_id_) == -2 && pid_mode_ == 1) continue;
     n_good_tracks++;
   }
 
@@ -129,7 +141,6 @@ void ATKFParticleFinder::InitTopoReconstructor()
     const AnalysisTree::Track& rec_track = kf_tracks_->GetChannel(i_track);
 
     if (rec_track.GetField<bool>(passcuts_field_id_) == 0) continue;
-    if (rec_track.GetField<int>(pdg_field_id_) == -2 && pid_mode_ == 1) continue;
 
     for (Int_t iP = 0; iP < 3; iP++)
       track_vector1.SetParameter(rec_track.GetField<float>(par_field_id_ + iP), iP, j_track);
@@ -142,8 +153,12 @@ void ATKFParticleFinder::InitTopoReconstructor()
     for (Int_t iF = 0; iF < 10; iF++)
       track_vector1.SetFieldCoefficient(rec_track.GetField<float>(mf_field_id_ + iF), iF, j_track);
     if (pid_mode_ == 0) track_vector1.SetPDG(-1, j_track);
-    else if (pid_mode_ == 1)
-      track_vector1.SetPDG(rec_track.GetField<int>(pdg_field_id_), j_track);
+    else if (pid_mode_ == 1) {
+      int pdg {-999};
+      const int sim_id = kf2sim_tracks_->GetMatch(rec_track.GetId());
+      if (sim_id > 0) pdg = sim_particles_->GetChannel(sim_id).GetPid();
+      track_vector1.SetPDG(pdg, j_track);
+    }
     track_vector1.SetQ(rec_track.GetField<int>(q_field_id_), j_track);
     if (rec_track.GetField<float>(vtx_chi2_field_id_) < 3.) track_vector1.SetPVIndex(0, j_track);
     else
diff --git a/analysis/common/at_kfpf_interface/ATKFParticleFinder.h b/analysis/common/at_kfpf_interface/ATKFParticleFinder.h
index 697aa727e957c8612ee9ae55c0a19a0740e027d3..b01bb2cfba83a94b42e64e5ffc9b2f795e4a7639 100644
--- a/analysis/common/at_kfpf_interface/ATKFParticleFinder.h
+++ b/analysis/common/at_kfpf_interface/ATKFParticleFinder.h
@@ -18,6 +18,7 @@
 #include "CutsContainer.h"
 
 class KFParticleTopoReconstructor;
+class Matching;
 
 class ATKFParticleFinder {
 public:
@@ -38,6 +39,8 @@ private:
   AnalysisTree::Chain* in_chain_ {nullptr};
   AnalysisTree::EventHeader* rec_event_header_ {nullptr};
   AnalysisTree::TrackDetector* kf_tracks_ {nullptr};
+  AnalysisTree::Particles* sim_particles_ {nullptr};
+  AnalysisTree::Matching* kf2sim_tracks_ {nullptr};
 
   TFile* out_file_ {nullptr};
   TTree* out_tree_ {nullptr};
@@ -49,7 +52,6 @@ private:
   int mf_field_id_ {-999};
   int cov_field_id_ {-999};
   int passcuts_field_id_ {-999};
-  int pdg_field_id_ {-999};
   int vtx_chi2_field_id_ {-999};
   int nhits_field_id_ {-999};
   int nhits_mvd_field_id_ {-999};